summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJesus Macias Portela <jesus.macias.portela@gmail.com>2015-12-03 12:35:49 +0100
committerJesus Macias Portela <jesus.macias.portela@gmail.com>2015-12-03 12:35:49 +0100
commitdcfbbe4737e9939b6c038f8e48b49957c66a52e8 (patch)
tree8163f2d7537708d7d5486a093bb3dab9cc63f9d2 /apps
parenta79ae4ae086c08c75a6d974966458251e2167347 (diff)
parente62b6c1617886b2cdd7553ea9b119c431e4eb363 (diff)
downloadnextcloud-server-dcfbbe4737e9939b6c038f8e48b49957c66a52e8.tar.gz
nextcloud-server-dcfbbe4737e9939b6c038f8e48b49957c66a52e8.zip
Merge branch 'master' into issue_20427
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/appinfo/database.xml438
-rw-r--r--apps/dav/appinfo/info.xml2
-rw-r--r--apps/dav/appinfo/register_command.php9
-rw-r--r--apps/dav/appinfo/v1/publicwebdav.php3
-rw-r--r--apps/dav/appinfo/v1/webdav.php3
-rw-r--r--apps/dav/command/createaddressbook.php33
-rw-r--r--apps/dav/command/createcalendar.php52
-rw-r--r--apps/dav/command/syncsystemaddressbook.php107
-rw-r--r--apps/dav/lib/caldav/caldavbackend.php1174
-rw-r--r--apps/dav/lib/carddav/addressbook.php90
-rw-r--r--apps/dav/lib/carddav/addressbookroot.php33
-rw-r--r--apps/dav/lib/carddav/card.php39
-rw-r--r--apps/dav/lib/carddav/carddavbackend.php183
-rw-r--r--apps/dav/lib/carddav/converter.php158
-rw-r--r--apps/dav/lib/carddav/plugin.php47
-rw-r--r--apps/dav/lib/carddav/sharing/ishareableaddressbook.php46
-rw-r--r--apps/dav/lib/carddav/sharing/plugin.php218
-rw-r--r--apps/dav/lib/carddav/useraddressbooks.php49
-rw-r--r--apps/dav/lib/connector/sabre/auth.php43
-rw-r--r--apps/dav/lib/connector/sabre/directory.php8
-rw-r--r--apps/dav/lib/connector/sabre/exception/forbidden.php64
-rw-r--r--apps/dav/lib/connector/sabre/fakelockerplugin.php155
-rw-r--r--apps/dav/lib/connector/sabre/file.php26
-rw-r--r--apps/dav/lib/connector/sabre/filesplugin.php47
-rw-r--r--apps/dav/lib/connector/sabre/lockplugin.php17
-rw-r--r--apps/dav/lib/connector/sabre/node.php15
-rw-r--r--apps/dav/lib/connector/sabre/objecttree.php6
-rw-r--r--apps/dav/lib/connector/sabre/principal.php70
-rw-r--r--apps/dav/lib/connector/sabre/serverfactory.php45
-rw-r--r--apps/dav/lib/connector/sabre/taglist.php158
-rw-r--r--apps/dav/lib/dav/systemprincipalbackend.php183
-rw-r--r--apps/dav/lib/rootcollection.php43
-rw-r--r--apps/dav/lib/server.php33
-rw-r--r--apps/dav/tests/misc/sharing.xml7
-rw-r--r--apps/dav/tests/travis/caldavtest/config/serverinfo.xml4
-rw-r--r--apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml1602
-rw-r--r--apps/dav/tests/travis/carddavtester.sh9
-rw-r--r--apps/dav/tests/unit/bootstrap.php4
-rw-r--r--apps/dav/tests/unit/caldav/caldavbackendtest.php348
-rw-r--r--apps/dav/tests/unit/carddav/carddavbackendtest.php47
-rw-r--r--apps/dav/tests/unit/carddav/convertertest.php136
-rw-r--r--apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php173
-rw-r--r--apps/dav/tests/unit/connector/sabre/auth.php94
-rw-r--r--apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php8
-rw-r--r--apps/dav/tests/unit/connector/sabre/directory.php21
-rw-r--r--apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php44
-rw-r--r--apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php10
-rw-r--r--apps/dav/tests/unit/connector/sabre/file.php58
-rw-r--r--apps/dav/tests/unit/connector/sabre/filesplugin.php65
-rw-r--r--apps/dav/tests/unit/connector/sabre/objecttree.php7
-rw-r--r--apps/dav/tests/unit/connector/sabre/principal.php104
-rw-r--r--apps/dav/tests/unit/connector/sabre/requesttest/auth.php62
-rw-r--r--apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php7
-rw-r--r--apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php7
-rw-r--r--apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php4
-rw-r--r--apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php7
-rw-r--r--apps/encryption/hooks/userhooks.php6
-rw-r--r--apps/encryption/l10n/es_AR.js1
-rw-r--r--apps/encryption/l10n/es_AR.json1
-rw-r--r--apps/encryption/l10n/tr.js2
-rw-r--r--apps/encryption/l10n/tr.json2
-rw-r--r--apps/encryption/lib/crypto/crypt.php27
-rw-r--r--apps/encryption/lib/crypto/encryptall.php14
-rw-r--r--apps/encryption/lib/crypto/encryption.php4
-rw-r--r--apps/encryption/lib/keymanager.php15
-rw-r--r--apps/encryption/lib/migration.php4
-rw-r--r--apps/encryption/lib/recovery.php6
-rw-r--r--apps/encryption/tests/lib/MigrationTest.php26
-rw-r--r--apps/federation/api/ocsauthapi.php145
-rw-r--r--apps/federation/appinfo/app.php26
-rw-r--r--apps/federation/appinfo/application.php148
-rw-r--r--apps/federation/appinfo/database.xml63
-rw-r--r--apps/federation/appinfo/info.xml14
-rw-r--r--apps/federation/appinfo/routes.php47
-rw-r--r--apps/federation/backgroundjob/getsharedsecret.php185
-rw-r--r--apps/federation/backgroundjob/requestsharedsecret.php164
-rw-r--r--apps/federation/controller/settingscontroller.php123
-rw-r--r--apps/federation/css/settings-admin.css26
-rw-r--r--apps/federation/img/app.svg4
-rw-r--r--apps/federation/js/settings-admin.js82
-rw-r--r--apps/federation/lib/dbhandler.php270
-rw-r--r--apps/federation/lib/hooks.php50
-rw-r--r--apps/federation/lib/trustedservers.php254
-rw-r--r--apps/federation/middleware/addservermiddleware.php71
-rw-r--r--apps/federation/settings/settings-admin.php43
-rw-r--r--apps/federation/templates/settings-admin.php40
-rw-r--r--apps/federation/tests/api/ocsauthapitest.php184
-rw-r--r--apps/federation/tests/backgroundjob/getsharedsecrettest.php197
-rw-r--r--apps/federation/tests/backgroundjob/requestsharedsecrettest.php169
-rw-r--r--apps/federation/tests/controller/settingscontrollertest.php166
-rw-r--r--apps/federation/tests/lib/dbhandlertest.php259
-rw-r--r--apps/federation/tests/lib/hookstest.php79
-rw-r--r--apps/federation/tests/lib/trustedserverstest.php344
-rw-r--r--apps/federation/tests/middleware/addservermiddlewaretest.php100
-rw-r--r--apps/files/ajax/delete.php81
-rw-r--r--apps/files/ajax/move.php59
-rw-r--r--apps/files/ajax/newfile.php103
-rw-r--r--apps/files/ajax/newfolder.php99
-rw-r--r--apps/files/ajax/rename.php58
-rw-r--r--apps/files/ajax/scan.php10
-rw-r--r--apps/files/ajax/upload.php7
-rw-r--r--apps/files/appinfo/app.php5
-rw-r--r--apps/files/appinfo/info.xml2
-rw-r--r--apps/files/appinfo/routes.php7
-rw-r--r--apps/files/command/scan.php6
-rw-r--r--apps/files/controller/apicontroller.php2
-rw-r--r--apps/files/controller/viewcontroller.php230
-rw-r--r--apps/files/index.php161
-rw-r--r--apps/files/js/app.js3
-rw-r--r--apps/files/js/favoritesplugin.js2
-rw-r--r--apps/files/js/fileactions.js8
-rw-r--r--apps/files/js/filelist.js591
-rw-r--r--apps/files/js/files.js32
-rw-r--r--apps/files/js/newfilemenu.js20
-rw-r--r--apps/files/js/tagsplugin.js32
-rw-r--r--apps/files/l10n/af_ZA.js1
-rw-r--r--apps/files/l10n/af_ZA.json1
-rw-r--r--apps/files/l10n/ar.js32
-rw-r--r--apps/files/l10n/ar.json32
-rw-r--r--apps/files/l10n/ast.js26
-rw-r--r--apps/files/l10n/ast.json26
-rw-r--r--apps/files/l10n/az.js32
-rw-r--r--apps/files/l10n/az.json32
-rw-r--r--apps/files/l10n/be.js1
-rw-r--r--apps/files/l10n/be.json1
-rw-r--r--apps/files/l10n/bg_BG.js27
-rw-r--r--apps/files/l10n/bg_BG.json27
-rw-r--r--apps/files/l10n/bn_BD.js16
-rw-r--r--apps/files/l10n/bn_BD.json16
-rw-r--r--apps/files/l10n/bn_IN.js3
-rw-r--r--apps/files/l10n/bn_IN.json3
-rw-r--r--apps/files/l10n/bs.js26
-rw-r--r--apps/files/l10n/bs.json26
-rw-r--r--apps/files/l10n/ca.js27
-rw-r--r--apps/files/l10n/ca.json27
-rw-r--r--apps/files/l10n/cs_CZ.js45
-rw-r--r--apps/files/l10n/cs_CZ.json45
-rw-r--r--apps/files/l10n/cy_GB.js10
-rw-r--r--apps/files/l10n/cy_GB.json10
-rw-r--r--apps/files/l10n/da.js26
-rw-r--r--apps/files/l10n/da.json26
-rw-r--r--apps/files/l10n/de.js32
-rw-r--r--apps/files/l10n/de.json32
-rw-r--r--apps/files/l10n/de_AT.js3
-rw-r--r--apps/files/l10n/de_AT.json3
-rw-r--r--apps/files/l10n/de_DE.js43
-rw-r--r--apps/files/l10n/de_DE.json43
-rw-r--r--apps/files/l10n/el.js35
-rw-r--r--apps/files/l10n/el.json35
-rw-r--r--apps/files/l10n/en_GB.js27
-rw-r--r--apps/files/l10n/en_GB.json27
-rw-r--r--apps/files/l10n/eo.js21
-rw-r--r--apps/files/l10n/eo.json21
-rw-r--r--apps/files/l10n/es.js32
-rw-r--r--apps/files/l10n/es.json32
-rw-r--r--apps/files/l10n/es_AR.js28
-rw-r--r--apps/files/l10n/es_AR.json28
-rw-r--r--apps/files/l10n/es_CL.js3
-rw-r--r--apps/files/l10n/es_CL.json3
-rw-r--r--apps/files/l10n/es_MX.js21
-rw-r--r--apps/files/l10n/es_MX.json21
-rw-r--r--apps/files/l10n/et_EE.js28
-rw-r--r--apps/files/l10n/et_EE.json28
-rw-r--r--apps/files/l10n/eu.js26
-rw-r--r--apps/files/l10n/eu.json26
-rw-r--r--apps/files/l10n/fa.js29
-rw-r--r--apps/files/l10n/fa.json29
-rw-r--r--apps/files/l10n/fi_FI.js45
-rw-r--r--apps/files/l10n/fi_FI.json45
-rw-r--r--apps/files/l10n/fr.js45
-rw-r--r--apps/files/l10n/fr.json45
-rw-r--r--apps/files/l10n/gl.js27
-rw-r--r--apps/files/l10n/gl.json27
-rw-r--r--apps/files/l10n/he.js10
-rw-r--r--apps/files/l10n/he.json10
-rw-r--r--apps/files/l10n/hi.js3
-rw-r--r--apps/files/l10n/hi.json3
-rw-r--r--apps/files/l10n/hr.js26
-rw-r--r--apps/files/l10n/hr.json26
-rw-r--r--apps/files/l10n/hu_HU.js34
-rw-r--r--apps/files/l10n/hu_HU.json34
-rw-r--r--apps/files/l10n/hy.js10
-rw-r--r--apps/files/l10n/hy.json10
-rw-r--r--apps/files/l10n/ia.js7
-rw-r--r--apps/files/l10n/ia.json7
-rw-r--r--apps/files/l10n/id.js32
-rw-r--r--apps/files/l10n/id.json32
-rw-r--r--apps/files/l10n/is.js10
-rw-r--r--apps/files/l10n/is.json10
-rw-r--r--apps/files/l10n/it.js45
-rw-r--r--apps/files/l10n/it.json45
-rw-r--r--apps/files/l10n/ja.js43
-rw-r--r--apps/files/l10n/ja.json43
-rw-r--r--apps/files/l10n/ka_GE.js10
-rw-r--r--apps/files/l10n/ka_GE.json10
-rw-r--r--apps/files/l10n/km.js10
-rw-r--r--apps/files/l10n/km.json10
-rw-r--r--apps/files/l10n/kn.js22
-rw-r--r--apps/files/l10n/kn.json22
-rw-r--r--apps/files/l10n/ko.js30
-rw-r--r--apps/files/l10n/ko.json30
-rw-r--r--apps/files/l10n/ku_IQ.js3
-rw-r--r--apps/files/l10n/ku_IQ.json3
-rw-r--r--apps/files/l10n/lb.js7
-rw-r--r--apps/files/l10n/lb.json7
-rw-r--r--apps/files/l10n/lo.js3
-rw-r--r--apps/files/l10n/lo.json3
-rw-r--r--apps/files/l10n/lt_LT.js28
-rw-r--r--apps/files/l10n/lt_LT.json28
-rw-r--r--apps/files/l10n/lv.js24
-rw-r--r--apps/files/l10n/lv.json24
-rw-r--r--apps/files/l10n/mk.js17
-rw-r--r--apps/files/l10n/mk.json17
-rw-r--r--apps/files/l10n/ms_MY.js7
-rw-r--r--apps/files/l10n/ms_MY.json7
-rw-r--r--apps/files/l10n/nb_NO.js30
-rw-r--r--apps/files/l10n/nb_NO.json30
-rw-r--r--apps/files/l10n/nds.js3
-rw-r--r--apps/files/l10n/nds.json3
-rw-r--r--apps/files/l10n/nl.js45
-rw-r--r--apps/files/l10n/nl.json45
-rw-r--r--apps/files/l10n/nn_NO.js14
-rw-r--r--apps/files/l10n/nn_NO.json14
-rw-r--r--apps/files/l10n/oc.js43
-rw-r--r--apps/files/l10n/oc.json43
-rw-r--r--apps/files/l10n/pa.js1
-rw-r--r--apps/files/l10n/pa.json1
-rw-r--r--apps/files/l10n/pl.js26
-rw-r--r--apps/files/l10n/pl.json26
-rw-r--r--apps/files/l10n/pt_BR.js34
-rw-r--r--apps/files/l10n/pt_BR.json34
-rw-r--r--apps/files/l10n/pt_PT.js26
-rw-r--r--apps/files/l10n/pt_PT.json26
-rw-r--r--apps/files/l10n/ro.js26
-rw-r--r--apps/files/l10n/ro.json26
-rw-r--r--apps/files/l10n/ru.js42
-rw-r--r--apps/files/l10n/ru.json42
-rw-r--r--apps/files/l10n/si_LK.js7
-rw-r--r--apps/files/l10n/si_LK.json7
-rw-r--r--apps/files/l10n/sk_SK.js32
-rw-r--r--apps/files/l10n/sk_SK.json32
-rw-r--r--apps/files/l10n/sl.js27
-rw-r--r--apps/files/l10n/sl.json27
-rw-r--r--apps/files/l10n/sq.js44
-rw-r--r--apps/files/l10n/sq.json44
-rw-r--r--apps/files/l10n/sr.js32
-rw-r--r--apps/files/l10n/sr.json32
-rw-r--r--apps/files/l10n/sr@latin.js27
-rw-r--r--apps/files/l10n/sr@latin.json27
-rw-r--r--apps/files/l10n/sv.js30
-rw-r--r--apps/files/l10n/sv.json30
-rw-r--r--apps/files/l10n/ta_IN.js2
-rw-r--r--apps/files/l10n/ta_IN.json2
-rw-r--r--apps/files/l10n/ta_LK.js8
-rw-r--r--apps/files/l10n/ta_LK.json8
-rw-r--r--apps/files/l10n/te.js1
-rw-r--r--apps/files/l10n/te.json1
-rw-r--r--apps/files/l10n/th_TH.js45
-rw-r--r--apps/files/l10n/th_TH.json45
-rw-r--r--apps/files/l10n/tr.js34
-rw-r--r--apps/files/l10n/tr.json34
-rw-r--r--apps/files/l10n/ug.js9
-rw-r--r--apps/files/l10n/ug.json9
-rw-r--r--apps/files/l10n/uk.js27
-rw-r--r--apps/files/l10n/uk.json27
-rw-r--r--apps/files/l10n/ur_PK.js1
-rw-r--r--apps/files/l10n/ur_PK.json1
-rw-r--r--apps/files/l10n/vi.js21
-rw-r--r--apps/files/l10n/vi.json21
-rw-r--r--apps/files/l10n/zh_CN.js45
-rw-r--r--apps/files/l10n/zh_CN.json45
-rw-r--r--apps/files/l10n/zh_HK.js3
-rw-r--r--apps/files/l10n/zh_HK.json3
-rw-r--r--apps/files/l10n/zh_TW.js38
-rw-r--r--apps/files/l10n/zh_TW.json38
-rw-r--r--apps/files/lib/activity.php29
-rw-r--r--apps/files/lib/app.php88
-rw-r--r--apps/files/lib/helper.php3
-rw-r--r--apps/files/service/tagservice.php2
-rw-r--r--apps/files/templates/admin.php6
-rw-r--r--apps/files/templates/appnavigation.php4
-rw-r--r--apps/files/templates/list.php11
-rw-r--r--apps/files/tests/activitytest.php42
-rw-r--r--apps/files/tests/ajax_rename.php232
-rw-r--r--apps/files/tests/command/deleteorphanedfilestest.php7
-rw-r--r--apps/files/tests/controller/ViewControllerTest.php253
-rw-r--r--apps/files/tests/js/favoritesfilelistspec.js3
-rw-r--r--apps/files/tests/js/fileUploadSpec.js2
-rw-r--r--apps/files/tests/js/fileactionsSpec.js2
-rw-r--r--apps/files/tests/js/fileactionsmenuSpec.js7
-rw-r--r--apps/files/tests/js/filelistSpec.js843
-rw-r--r--apps/files/tests/js/filesSpec.js6
-rw-r--r--apps/files/tests/js/newfilemenuSpec.js73
-rw-r--r--apps/files/tests/service/tagservice.php7
-rw-r--r--apps/files_external/appinfo/app.php3
-rw-r--r--apps/files_external/appinfo/register_command.php38
-rw-r--r--apps/files_external/appinfo/routes.php1
-rw-r--r--apps/files_external/command/config.php112
-rw-r--r--apps/files_external/command/listcommand.php231
-rw-r--r--apps/files_external/command/option.php85
-rw-r--r--apps/files_external/controller/storagescontroller.php22
-rw-r--r--apps/files_external/controller/userglobalstoragescontroller.php121
-rw-r--r--apps/files_external/css/settings.css8
-rw-r--r--apps/files_external/js/app.js2
-rw-r--r--apps/files_external/js/public_key.js14
-rw-r--r--apps/files_external/js/settings.js279
-rw-r--r--apps/files_external/l10n/ast.js2
-rw-r--r--apps/files_external/l10n/ast.json2
-rw-r--r--apps/files_external/l10n/az.js2
-rw-r--r--apps/files_external/l10n/az.json2
-rw-r--r--apps/files_external/l10n/bg_BG.js2
-rw-r--r--apps/files_external/l10n/bg_BG.json2
-rw-r--r--apps/files_external/l10n/ca.js2
-rw-r--r--apps/files_external/l10n/ca.json2
-rw-r--r--apps/files_external/l10n/cs_CZ.js3
-rw-r--r--apps/files_external/l10n/cs_CZ.json3
-rw-r--r--apps/files_external/l10n/da.js2
-rw-r--r--apps/files_external/l10n/da.json2
-rw-r--r--apps/files_external/l10n/de.js6
-rw-r--r--apps/files_external/l10n/de.json6
-rw-r--r--apps/files_external/l10n/de_DE.js14
-rw-r--r--apps/files_external/l10n/de_DE.json14
-rw-r--r--apps/files_external/l10n/el.js2
-rw-r--r--apps/files_external/l10n/el.json2
-rw-r--r--apps/files_external/l10n/en_GB.js2
-rw-r--r--apps/files_external/l10n/en_GB.json2
-rw-r--r--apps/files_external/l10n/eo.js2
-rw-r--r--apps/files_external/l10n/eo.json2
-rw-r--r--apps/files_external/l10n/es.js2
-rw-r--r--apps/files_external/l10n/es.json2
-rw-r--r--apps/files_external/l10n/es_AR.js4
-rw-r--r--apps/files_external/l10n/es_AR.json4
-rw-r--r--apps/files_external/l10n/es_MX.js4
-rw-r--r--apps/files_external/l10n/es_MX.json4
-rw-r--r--apps/files_external/l10n/et_EE.js2
-rw-r--r--apps/files_external/l10n/et_EE.json2
-rw-r--r--apps/files_external/l10n/eu.js2
-rw-r--r--apps/files_external/l10n/eu.json2
-rw-r--r--apps/files_external/l10n/fa.js4
-rw-r--r--apps/files_external/l10n/fa.json4
-rw-r--r--apps/files_external/l10n/fi_FI.js2
-rw-r--r--apps/files_external/l10n/fi_FI.json2
-rw-r--r--apps/files_external/l10n/fr.js3
-rw-r--r--apps/files_external/l10n/fr.json3
-rw-r--r--apps/files_external/l10n/gl.js2
-rw-r--r--apps/files_external/l10n/gl.json2
-rw-r--r--apps/files_external/l10n/hr.js2
-rw-r--r--apps/files_external/l10n/hr.json2
-rw-r--r--apps/files_external/l10n/hu_HU.js4
-rw-r--r--apps/files_external/l10n/hu_HU.json4
-rw-r--r--apps/files_external/l10n/hy.js3
-rw-r--r--apps/files_external/l10n/hy.json3
-rw-r--r--apps/files_external/l10n/id.js2
-rw-r--r--apps/files_external/l10n/id.json2
-rw-r--r--apps/files_external/l10n/it.js3
-rw-r--r--apps/files_external/l10n/it.json3
-rw-r--r--apps/files_external/l10n/ja.js5
-rw-r--r--apps/files_external/l10n/ja.json5
-rw-r--r--apps/files_external/l10n/ka_GE.js4
-rw-r--r--apps/files_external/l10n/ka_GE.json4
-rw-r--r--apps/files_external/l10n/km.js4
-rw-r--r--apps/files_external/l10n/km.json4
-rw-r--r--apps/files_external/l10n/ko.js2
-rw-r--r--apps/files_external/l10n/ko.json2
-rw-r--r--apps/files_external/l10n/lt_LT.js5
-rw-r--r--apps/files_external/l10n/lt_LT.json5
-rw-r--r--apps/files_external/l10n/lv.js4
-rw-r--r--apps/files_external/l10n/lv.json4
-rw-r--r--apps/files_external/l10n/nb_NO.js2
-rw-r--r--apps/files_external/l10n/nb_NO.json2
-rw-r--r--apps/files_external/l10n/nds.js2
-rw-r--r--apps/files_external/l10n/nds.json2
-rw-r--r--apps/files_external/l10n/nl.js3
-rw-r--r--apps/files_external/l10n/nl.json3
-rw-r--r--apps/files_external/l10n/oc.js2
-rw-r--r--apps/files_external/l10n/oc.json2
-rw-r--r--apps/files_external/l10n/pl.js2
-rw-r--r--apps/files_external/l10n/pl.json2
-rw-r--r--apps/files_external/l10n/pt_BR.js3
-rw-r--r--apps/files_external/l10n/pt_BR.json3
-rw-r--r--apps/files_external/l10n/pt_PT.js2
-rw-r--r--apps/files_external/l10n/pt_PT.json2
-rw-r--r--apps/files_external/l10n/ro.js2
-rw-r--r--apps/files_external/l10n/ro.json2
-rw-r--r--apps/files_external/l10n/ru.js4
-rw-r--r--apps/files_external/l10n/ru.json4
-rw-r--r--apps/files_external/l10n/sk_SK.js2
-rw-r--r--apps/files_external/l10n/sk_SK.json2
-rw-r--r--apps/files_external/l10n/sl.js2
-rw-r--r--apps/files_external/l10n/sl.json2
-rw-r--r--apps/files_external/l10n/sq.js4
-rw-r--r--apps/files_external/l10n/sq.json4
-rw-r--r--apps/files_external/l10n/sr.js2
-rw-r--r--apps/files_external/l10n/sr.json2
-rw-r--r--apps/files_external/l10n/sr@latin.js2
-rw-r--r--apps/files_external/l10n/sr@latin.json2
-rw-r--r--apps/files_external/l10n/sv.js2
-rw-r--r--apps/files_external/l10n/sv.json2
-rw-r--r--apps/files_external/l10n/th_TH.js3
-rw-r--r--apps/files_external/l10n/th_TH.json3
-rw-r--r--apps/files_external/l10n/tr.js4
-rw-r--r--apps/files_external/l10n/tr.json4
-rw-r--r--apps/files_external/l10n/uk.js2
-rw-r--r--apps/files_external/l10n/uk.json2
-rw-r--r--apps/files_external/l10n/vi.js4
-rw-r--r--apps/files_external/l10n/vi.json4
-rw-r--r--apps/files_external/l10n/zh_CN.js2
-rw-r--r--apps/files_external/l10n/zh_CN.json2
-rw-r--r--apps/files_external/l10n/zh_TW.js2
-rw-r--r--apps/files_external/l10n/zh_TW.json2
-rw-r--r--apps/files_external/lib/config.php56
-rw-r--r--apps/files_external/lib/config/configadapter.php1
-rw-r--r--apps/files_external/lib/etagpropagator.php141
-rw-r--r--apps/files_external/lib/sftp.php40
-rw-r--r--apps/files_external/lib/storageconfig.php19
-rw-r--r--apps/files_external/personal.php26
-rw-r--r--apps/files_external/service/storagesservice.php32
-rw-r--r--apps/files_external/settings.php31
-rw-r--r--apps/files_external/templates/settings.php101
-rw-r--r--apps/files_external/tests/amazons3migration.php7
-rw-r--r--apps/files_external/tests/backends/amazons3.php7
-rw-r--r--apps/files_external/tests/backends/dropbox.php7
-rw-r--r--apps/files_external/tests/backends/ftp.php7
-rw-r--r--apps/files_external/tests/backends/google.php7
-rw-r--r--apps/files_external/tests/backends/owncloud.php7
-rw-r--r--apps/files_external/tests/backends/sftp.php45
-rw-r--r--apps/files_external/tests/backends/sftp_key.php7
-rw-r--r--apps/files_external/tests/backends/smb.php7
-rw-r--r--apps/files_external/tests/backends/swift.php38
-rw-r--r--apps/files_external/tests/backends/webdav.php7
-rwxr-xr-xapps/files_external/tests/env/start-amazons3-ceph.sh9
-rwxr-xr-xapps/files_external/tests/env/start-ftp-morrisjobke.sh10
-rwxr-xr-xapps/files_external/tests/env/start-sftp-atmoz.sh11
-rwxr-xr-xapps/files_external/tests/env/start-smb-silvershell.sh10
-rwxr-xr-xapps/files_external/tests/env/start-smb-windows.sh5
-rwxr-xr-xapps/files_external/tests/env/start-swift-ceph.sh85
-rwxr-xr-xapps/files_external/tests/env/start-webdav-ownCloud.sh15
-rwxr-xr-xapps/files_external/tests/env/stop-swift-ceph.sh36
-rwxr-xr-xapps/files_external/tests/env/wait-for-connection45
-rw-r--r--apps/files_external/tests/etagpropagator.php343
-rw-r--r--apps/files_external/tests/js/settingsSpec.js7
-rw-r--r--apps/files_external/tests/owncloudfunctions.php7
-rw-r--r--apps/files_sharing/ajax/list.php96
-rw-r--r--apps/files_sharing/api/local.php1
-rw-r--r--apps/files_sharing/api/ocssharewrapper.php40
-rw-r--r--apps/files_sharing/api/remote.php2
-rw-r--r--apps/files_sharing/api/share20ocs.php164
-rw-r--r--apps/files_sharing/api/sharees.php25
-rw-r--r--apps/files_sharing/appinfo/app.php5
-rw-r--r--apps/files_sharing/appinfo/application.php31
-rw-r--r--apps/files_sharing/css/sharetabview.css2
-rw-r--r--apps/files_sharing/js/app.js2
-rw-r--r--apps/files_sharing/js/public.js31
-rw-r--r--apps/files_sharing/js/share.js22
-rw-r--r--apps/files_sharing/js/sharedfilelist.js4
-rw-r--r--apps/files_sharing/l10n/de.js2
-rw-r--r--apps/files_sharing/l10n/de.json2
-rw-r--r--apps/files_sharing/l10n/de_DE.js12
-rw-r--r--apps/files_sharing/l10n/de_DE.json12
-rw-r--r--apps/files_sharing/l10n/es_AR.js1
-rw-r--r--apps/files_sharing/l10n/es_AR.json1
-rw-r--r--apps/files_sharing/l10n/ja.js6
-rw-r--r--apps/files_sharing/l10n/ja.json6
-rw-r--r--apps/files_sharing/lib/external/manager.php2
-rw-r--r--apps/files_sharing/lib/external/storage.php7
-rw-r--r--apps/files_sharing/lib/helper.php16
-rw-r--r--apps/files_sharing/lib/mountprovider.php16
-rw-r--r--apps/files_sharing/lib/propagation/changewatcher.php110
-rw-r--r--apps/files_sharing/lib/propagation/grouppropagationmanager.php133
-rw-r--r--apps/files_sharing/lib/propagation/propagationmanager.php144
-rw-r--r--apps/files_sharing/lib/propagation/recipientpropagator.php164
-rw-r--r--apps/files_sharing/lib/sharedmount.php14
-rw-r--r--apps/files_sharing/lib/sharedpropagator.php43
-rw-r--r--apps/files_sharing/lib/sharedstorage.php16
-rw-r--r--apps/files_sharing/settings-personal.php4
-rw-r--r--apps/files_sharing/tests/activity.php11
-rw-r--r--apps/files_sharing/tests/api.php2
-rw-r--r--apps/files_sharing/tests/api/share20ocstest.php329
-rw-r--r--apps/files_sharing/tests/api/shareestest.php35
-rw-r--r--apps/files_sharing/tests/backend.php2
-rw-r--r--apps/files_sharing/tests/cache.php6
-rw-r--r--apps/files_sharing/tests/capabilities.php2
-rw-r--r--apps/files_sharing/tests/controller/sharecontroller.php2
-rw-r--r--apps/files_sharing/tests/deleteorphanedsharesjobtest.php7
-rw-r--r--apps/files_sharing/tests/etagpropagation.php10
-rw-r--r--apps/files_sharing/tests/expiresharesjobtest.php7
-rw-r--r--apps/files_sharing/tests/external/cache.php19
-rw-r--r--apps/files_sharing/tests/external/managertest.php7
-rw-r--r--apps/files_sharing/tests/externalstorage.php2
-rw-r--r--apps/files_sharing/tests/grouppropagationmanager.php173
-rw-r--r--apps/files_sharing/tests/helper.php20
-rw-r--r--apps/files_sharing/tests/js/publicAppSpec.js26
-rw-r--r--apps/files_sharing/tests/js/sharedfilelistSpec.js26
-rw-r--r--apps/files_sharing/tests/locking.php7
-rw-r--r--apps/files_sharing/tests/migrationtest.php5
-rw-r--r--apps/files_sharing/tests/permissions.php6
-rw-r--r--apps/files_sharing/tests/server2server.php2
-rw-r--r--apps/files_sharing/tests/share.php2
-rw-r--r--apps/files_sharing/tests/sharedmount.php2
-rw-r--r--apps/files_sharing/tests/sharedstorage.php2
-rw-r--r--apps/files_sharing/tests/sizepropagation.php7
-rw-r--r--apps/files_sharing/tests/testcase.php3
-rw-r--r--apps/files_sharing/tests/unsharechildren.php7
-rw-r--r--apps/files_sharing/tests/updater.php2
-rw-r--r--apps/files_sharing/tests/watcher.php5
-rw-r--r--apps/files_trashbin/command/expire.php11
-rw-r--r--apps/files_trashbin/js/app.js5
-rw-r--r--apps/files_trashbin/js/filelist.js72
-rw-r--r--apps/files_trashbin/l10n/ar.js1
-rw-r--r--apps/files_trashbin/l10n/ar.json1
-rw-r--r--apps/files_trashbin/l10n/ast.js4
-rw-r--r--apps/files_trashbin/l10n/ast.json4
-rw-r--r--apps/files_trashbin/l10n/az.js6
-rw-r--r--apps/files_trashbin/l10n/az.json6
-rw-r--r--apps/files_trashbin/l10n/bg_BG.js4
-rw-r--r--apps/files_trashbin/l10n/bg_BG.json4
-rw-r--r--apps/files_trashbin/l10n/bn_BD.js4
-rw-r--r--apps/files_trashbin/l10n/bn_BD.json4
-rw-r--r--apps/files_trashbin/l10n/bn_IN.js4
-rw-r--r--apps/files_trashbin/l10n/bn_IN.json4
-rw-r--r--apps/files_trashbin/l10n/bs.js4
-rw-r--r--apps/files_trashbin/l10n/bs.json4
-rw-r--r--apps/files_trashbin/l10n/ca.js4
-rw-r--r--apps/files_trashbin/l10n/ca.json4
-rw-r--r--apps/files_trashbin/l10n/cs_CZ.js6
-rw-r--r--apps/files_trashbin/l10n/cs_CZ.json6
-rw-r--r--apps/files_trashbin/l10n/cy_GB.js4
-rw-r--r--apps/files_trashbin/l10n/cy_GB.json4
-rw-r--r--apps/files_trashbin/l10n/da.js6
-rw-r--r--apps/files_trashbin/l10n/da.json6
-rw-r--r--apps/files_trashbin/l10n/de.js6
-rw-r--r--apps/files_trashbin/l10n/de.json6
-rw-r--r--apps/files_trashbin/l10n/de_AT.js4
-rw-r--r--apps/files_trashbin/l10n/de_AT.json4
-rw-r--r--apps/files_trashbin/l10n/de_DE.js6
-rw-r--r--apps/files_trashbin/l10n/de_DE.json6
-rw-r--r--apps/files_trashbin/l10n/el.js6
-rw-r--r--apps/files_trashbin/l10n/el.json6
-rw-r--r--apps/files_trashbin/l10n/en_GB.js4
-rw-r--r--apps/files_trashbin/l10n/en_GB.json4
-rw-r--r--apps/files_trashbin/l10n/eo.js4
-rw-r--r--apps/files_trashbin/l10n/eo.json4
-rw-r--r--apps/files_trashbin/l10n/es.js6
-rw-r--r--apps/files_trashbin/l10n/es.json6
-rw-r--r--apps/files_trashbin/l10n/es_AR.js4
-rw-r--r--apps/files_trashbin/l10n/es_AR.json4
-rw-r--r--apps/files_trashbin/l10n/es_MX.js4
-rw-r--r--apps/files_trashbin/l10n/es_MX.json4
-rw-r--r--apps/files_trashbin/l10n/et_EE.js6
-rw-r--r--apps/files_trashbin/l10n/et_EE.json6
-rw-r--r--apps/files_trashbin/l10n/eu.js4
-rw-r--r--apps/files_trashbin/l10n/eu.json4
-rw-r--r--apps/files_trashbin/l10n/fa.js2
-rw-r--r--apps/files_trashbin/l10n/fa.json2
-rw-r--r--apps/files_trashbin/l10n/fi_FI.js6
-rw-r--r--apps/files_trashbin/l10n/fi_FI.json6
-rw-r--r--apps/files_trashbin/l10n/fr.js6
-rw-r--r--apps/files_trashbin/l10n/fr.json6
-rw-r--r--apps/files_trashbin/l10n/gl.js6
-rw-r--r--apps/files_trashbin/l10n/gl.json6
-rw-r--r--apps/files_trashbin/l10n/he.js4
-rw-r--r--apps/files_trashbin/l10n/he.json4
-rw-r--r--apps/files_trashbin/l10n/hr.js4
-rw-r--r--apps/files_trashbin/l10n/hr.json4
-rw-r--r--apps/files_trashbin/l10n/hu_HU.js6
-rw-r--r--apps/files_trashbin/l10n/hu_HU.json6
-rw-r--r--apps/files_trashbin/l10n/hy.js4
-rw-r--r--apps/files_trashbin/l10n/hy.json4
-rw-r--r--apps/files_trashbin/l10n/ia.js4
-rw-r--r--apps/files_trashbin/l10n/ia.json4
-rw-r--r--apps/files_trashbin/l10n/id.js6
-rw-r--r--apps/files_trashbin/l10n/id.json6
-rw-r--r--apps/files_trashbin/l10n/is.js4
-rw-r--r--apps/files_trashbin/l10n/is.json4
-rw-r--r--apps/files_trashbin/l10n/it.js6
-rw-r--r--apps/files_trashbin/l10n/it.json6
-rw-r--r--apps/files_trashbin/l10n/ja.js6
-rw-r--r--apps/files_trashbin/l10n/ja.json6
-rw-r--r--apps/files_trashbin/l10n/ka_GE.js4
-rw-r--r--apps/files_trashbin/l10n/ka_GE.json4
-rw-r--r--apps/files_trashbin/l10n/km.js4
-rw-r--r--apps/files_trashbin/l10n/km.json4
-rw-r--r--apps/files_trashbin/l10n/kn.js4
-rw-r--r--apps/files_trashbin/l10n/kn.json4
-rw-r--r--apps/files_trashbin/l10n/ko.js6
-rw-r--r--apps/files_trashbin/l10n/ko.json6
-rw-r--r--apps/files_trashbin/l10n/lb.js4
-rw-r--r--apps/files_trashbin/l10n/lb.json4
-rw-r--r--apps/files_trashbin/l10n/lt_LT.js6
-rw-r--r--apps/files_trashbin/l10n/lt_LT.json6
-rw-r--r--apps/files_trashbin/l10n/lv.js4
-rw-r--r--apps/files_trashbin/l10n/lv.json4
-rw-r--r--apps/files_trashbin/l10n/mk.js4
-rw-r--r--apps/files_trashbin/l10n/mk.json4
-rw-r--r--apps/files_trashbin/l10n/ms_MY.js4
-rw-r--r--apps/files_trashbin/l10n/ms_MY.json4
-rw-r--r--apps/files_trashbin/l10n/nb_NO.js6
-rw-r--r--apps/files_trashbin/l10n/nb_NO.json6
-rw-r--r--apps/files_trashbin/l10n/nds.js1
-rw-r--r--apps/files_trashbin/l10n/nds.json1
-rw-r--r--apps/files_trashbin/l10n/nl.js6
-rw-r--r--apps/files_trashbin/l10n/nl.json6
-rw-r--r--apps/files_trashbin/l10n/nn_NO.js4
-rw-r--r--apps/files_trashbin/l10n/nn_NO.json4
-rw-r--r--apps/files_trashbin/l10n/oc.js2
-rw-r--r--apps/files_trashbin/l10n/oc.json2
-rw-r--r--apps/files_trashbin/l10n/pa.js4
-rw-r--r--apps/files_trashbin/l10n/pa.json4
-rw-r--r--apps/files_trashbin/l10n/pl.js4
-rw-r--r--apps/files_trashbin/l10n/pl.json4
-rw-r--r--apps/files_trashbin/l10n/pt_BR.js6
-rw-r--r--apps/files_trashbin/l10n/pt_BR.json6
-rw-r--r--apps/files_trashbin/l10n/pt_PT.js6
-rw-r--r--apps/files_trashbin/l10n/pt_PT.json6
-rw-r--r--apps/files_trashbin/l10n/ro.js4
-rw-r--r--apps/files_trashbin/l10n/ro.json4
-rw-r--r--apps/files_trashbin/l10n/ru.js6
-rw-r--r--apps/files_trashbin/l10n/ru.json6
-rw-r--r--apps/files_trashbin/l10n/si_LK.js4
-rw-r--r--apps/files_trashbin/l10n/si_LK.json4
-rw-r--r--apps/files_trashbin/l10n/sk_SK.js6
-rw-r--r--apps/files_trashbin/l10n/sk_SK.json6
-rw-r--r--apps/files_trashbin/l10n/sl.js4
-rw-r--r--apps/files_trashbin/l10n/sl.json4
-rw-r--r--apps/files_trashbin/l10n/sq.js2
-rw-r--r--apps/files_trashbin/l10n/sq.json2
-rw-r--r--apps/files_trashbin/l10n/sr.js6
-rw-r--r--apps/files_trashbin/l10n/sr.json6
-rw-r--r--apps/files_trashbin/l10n/sr@latin.js4
-rw-r--r--apps/files_trashbin/l10n/sr@latin.json4
-rw-r--r--apps/files_trashbin/l10n/sv.js2
-rw-r--r--apps/files_trashbin/l10n/sv.json2
-rw-r--r--apps/files_trashbin/l10n/ta_LK.js4
-rw-r--r--apps/files_trashbin/l10n/ta_LK.json4
-rw-r--r--apps/files_trashbin/l10n/te.js4
-rw-r--r--apps/files_trashbin/l10n/te.json4
-rw-r--r--apps/files_trashbin/l10n/th_TH.js6
-rw-r--r--apps/files_trashbin/l10n/th_TH.json6
-rw-r--r--apps/files_trashbin/l10n/tr.js6
-rw-r--r--apps/files_trashbin/l10n/tr.json6
-rw-r--r--apps/files_trashbin/l10n/ug.js4
-rw-r--r--apps/files_trashbin/l10n/ug.json4
-rw-r--r--apps/files_trashbin/l10n/uk.js5
-rw-r--r--apps/files_trashbin/l10n/uk.json5
-rw-r--r--apps/files_trashbin/l10n/ur_PK.js4
-rw-r--r--apps/files_trashbin/l10n/ur_PK.json4
-rw-r--r--apps/files_trashbin/l10n/vi.js4
-rw-r--r--apps/files_trashbin/l10n/vi.json4
-rw-r--r--apps/files_trashbin/l10n/zh_CN.js6
-rw-r--r--apps/files_trashbin/l10n/zh_CN.json6
-rw-r--r--apps/files_trashbin/l10n/zh_HK.js4
-rw-r--r--apps/files_trashbin/l10n/zh_HK.json4
-rw-r--r--apps/files_trashbin/l10n/zh_TW.js2
-rw-r--r--apps/files_trashbin/l10n/zh_TW.json2
-rw-r--r--apps/files_trashbin/lib/trashbin.php31
-rw-r--r--apps/files_trashbin/tests/command/cleanuptest.php7
-rw-r--r--apps/files_trashbin/tests/command/expiretest.php9
-rw-r--r--apps/files_trashbin/tests/storage.php7
-rw-r--r--apps/files_trashbin/tests/trashbin.php10
-rw-r--r--apps/files_versions/l10n/hy.js3
-rw-r--r--apps/files_versions/l10n/hy.json3
-rw-r--r--apps/files_versions/tests/command/cleanuptest.php7
-rw-r--r--apps/files_versions/tests/command/expiretest.php7
-rw-r--r--apps/files_versions/tests/versions.php3
-rw-r--r--apps/provisioning_api/appinfo/routes.php5
-rw-r--r--apps/provisioning_api/lib/groups.php43
-rw-r--r--apps/provisioning_api/lib/users.php47
-rw-r--r--apps/provisioning_api/tests/appstest.php26
-rw-r--r--apps/provisioning_api/tests/groupstest.php377
-rw-r--r--apps/provisioning_api/tests/testcase.php5
-rw-r--r--apps/provisioning_api/tests/userstest.php434
-rw-r--r--apps/user_ldap/js/wizard/wizardTabElementary.js2
-rw-r--r--apps/user_ldap/l10n/cs_CZ.js2
-rw-r--r--apps/user_ldap/l10n/cs_CZ.json2
-rw-r--r--apps/user_ldap/l10n/da.js1
-rw-r--r--apps/user_ldap/l10n/da.json1
-rw-r--r--apps/user_ldap/l10n/de.js1
-rw-r--r--apps/user_ldap/l10n/de.json1
-rw-r--r--apps/user_ldap/l10n/de_DE.js2
-rw-r--r--apps/user_ldap/l10n/de_DE.json2
-rw-r--r--apps/user_ldap/l10n/el.js2
-rw-r--r--apps/user_ldap/l10n/el.json2
-rw-r--r--apps/user_ldap/l10n/en_GB.js1
-rw-r--r--apps/user_ldap/l10n/en_GB.json1
-rw-r--r--apps/user_ldap/l10n/es.js2
-rw-r--r--apps/user_ldap/l10n/es.json2
-rw-r--r--apps/user_ldap/l10n/et_EE.js1
-rw-r--r--apps/user_ldap/l10n/et_EE.json1
-rw-r--r--apps/user_ldap/l10n/fi_FI.js3
-rw-r--r--apps/user_ldap/l10n/fi_FI.json3
-rw-r--r--apps/user_ldap/l10n/fr.js2
-rw-r--r--apps/user_ldap/l10n/fr.json2
-rw-r--r--apps/user_ldap/l10n/gl.js1
-rw-r--r--apps/user_ldap/l10n/gl.json1
-rw-r--r--apps/user_ldap/l10n/id.js1
-rw-r--r--apps/user_ldap/l10n/id.json1
-rw-r--r--apps/user_ldap/l10n/it.js2
-rw-r--r--apps/user_ldap/l10n/it.json2
-rw-r--r--apps/user_ldap/l10n/ja.js2
-rw-r--r--apps/user_ldap/l10n/ja.json2
-rw-r--r--apps/user_ldap/l10n/ko.js1
-rw-r--r--apps/user_ldap/l10n/ko.json1
-rw-r--r--apps/user_ldap/l10n/lt_LT.js4
-rw-r--r--apps/user_ldap/l10n/lt_LT.json4
-rw-r--r--apps/user_ldap/l10n/nb_NO.js1
-rw-r--r--apps/user_ldap/l10n/nb_NO.json1
-rw-r--r--apps/user_ldap/l10n/nl.js2
-rw-r--r--apps/user_ldap/l10n/nl.json2
-rw-r--r--apps/user_ldap/l10n/oc.js2
-rw-r--r--apps/user_ldap/l10n/oc.json2
-rw-r--r--apps/user_ldap/l10n/pt_BR.js2
-rw-r--r--apps/user_ldap/l10n/pt_BR.json2
-rw-r--r--apps/user_ldap/l10n/pt_PT.js1
-rw-r--r--apps/user_ldap/l10n/pt_PT.json1
-rw-r--r--apps/user_ldap/l10n/ru.js1
-rw-r--r--apps/user_ldap/l10n/ru.json1
-rw-r--r--apps/user_ldap/l10n/sk_SK.js1
-rw-r--r--apps/user_ldap/l10n/sk_SK.json1
-rw-r--r--apps/user_ldap/l10n/sl.js1
-rw-r--r--apps/user_ldap/l10n/sl.json1
-rw-r--r--apps/user_ldap/l10n/sq.js2
-rw-r--r--apps/user_ldap/l10n/sq.json2
-rw-r--r--apps/user_ldap/l10n/sr.js1
-rw-r--r--apps/user_ldap/l10n/sr.json1
-rw-r--r--apps/user_ldap/l10n/th_TH.js2
-rw-r--r--apps/user_ldap/l10n/th_TH.json2
-rw-r--r--apps/user_ldap/l10n/tr.js2
-rw-r--r--apps/user_ldap/l10n/tr.json2
-rw-r--r--apps/user_ldap/l10n/zh_TW.js1
-rw-r--r--apps/user_ldap/l10n/zh_TW.json1
-rw-r--r--apps/user_ldap/lib/access.php106
-rw-r--r--apps/user_ldap/tests/access.php7
-rw-r--r--apps/user_ldap/tests/connection.php9
-rw-r--r--apps/user_ldap/tests/group_ldap.php7
-rw-r--r--apps/user_ldap/tests/mapping/groupmapping.php7
-rw-r--r--apps/user_ldap/tests/mapping/usermapping.php7
-rw-r--r--apps/user_ldap/tests/user/manager.php7
-rw-r--r--apps/user_ldap/tests/user/user.php7
-rw-r--r--apps/user_ldap/tests/user_ldap.php7
-rw-r--r--apps/user_ldap/tests/wizard.php7
740 files changed, 15695 insertions, 7186 deletions
diff --git a/apps/dav/appinfo/database.xml b/apps/dav/appinfo/database.xml
index f3fd5079949..48641c2be6f 100644
--- a/apps/dav/appinfo/database.xml
+++ b/apps/dav/appinfo/database.xml
@@ -183,4 +183,442 @@ CREATE TABLE addressbookchanges (
</declaration>
</table>
+
+<!--
+CREATE TABLE calendarobjects (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendardata MEDIUMBLOB,
+ uri VARBINARY(200),
+ calendarid INTEGER UNSIGNED NOT NULL,
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL,
+ componenttype VARBINARY(8),
+ firstoccurence INT(11) UNSIGNED,
+ lastoccurence INT(11) UNSIGNED,
+ uid VARBINARY(200),
+ UNIQUE(calendarid, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+-->
+<table>
+ <name>*dbprefix*calendarobjects</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>calendardata</name>
+ <type>blob</type>
+ </field>
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>calendarid</name>
+ <type>integer</type>
+ <unsigned>true</unsigned>
+ <notnull>true</notnull>
+ </field>
+ <field>
+ <name>lastmodified</name>
+ <type>integer</type>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>etag</name>
+ <type>text</type>
+ <length>32</length>
+ </field>
+ <field>
+ <name>size</name>
+ <type>integer</type>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>componenttype</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>firstoccurence</name>
+ <type>integer</type>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>lastoccurence</name>
+ <type>integer</type>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>uid</name>
+ <type>text</type>
+ </field>
+ <index>
+ <name>calobjects_index</name>
+ <unique>true</unique>
+ <field>
+ <name>calendarid</name>
+ </field>
+ <field>
+ <name>uri</name>
+ </field>
+ </index>
+ </declaration>
+</table>
+ <!--
+ CREATE TABLE calendars (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARBINARY(100),
+ displayname VARCHAR(100),
+ uri VARBINARY(200),
+ synctoken INTEGER UNSIGNED NOT NULL DEFAULT '1',
+ description TEXT,
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ timezone TEXT,
+ components VARBINARY(20),
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ UNIQUE(principaluri, uri)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+ -->
+<table>
+ <name>*dbprefix*calendars</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>principaluri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>displayname</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>synctoken</name>
+ <type>integer</type>
+ <default>1</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>description</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>calendarorder</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>calendarcolor</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>timezone</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>components</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>transparent</name>
+ <type>integer</type>
+ <length>1</length>
+ <notnull>true</notnull>
+ <default>0</default>
+ </field>
+ <index>
+ <name>calendars_index</name>
+ <unique>true</unique>
+ <field>
+ <name>principaluri</name>
+ </field>
+ <field>
+ <name>uri</name>
+ </field>
+ </index>
+ </declaration>
+</table>
+ <!--
+ CREATE TABLE calendarchanges (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ synctoken INT(11) UNSIGNED NOT NULL,
+ calendarid INT(11) UNSIGNED NOT NULL,
+ operation TINYINT(1) NOT NULL,
+ INDEX calendarid_synctoken (calendarid, synctoken)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+ -->
+ <table>
+ <name>*dbprefix*calendarchanges</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>synctoken</name>
+ <type>integer</type>
+ <default>1</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>calendarid</name>
+ <type>integer</type>
+ <notnull>true</notnull>
+ </field>
+ <field>
+ <name>operation</name>
+ <type>integer</type>
+ <notnull>true</notnull>
+ <length>1</length>
+ </field>
+
+ <index>
+ <name>calendarid_synctoken</name>
+ <field>
+ <name>calendarid</name>
+ </field>
+ <field>
+ <name>synctoken</name>
+ </field>
+ </index>
+
+ </declaration>
+ </table>
+
+ <!--
+ CREATE TABLE calendarsubscriptions (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ principaluri VARBINARY(100) NOT NULL,
+ source TEXT,
+ displayname VARCHAR(100),
+ refreshrate VARCHAR(10),
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ striptodos TINYINT(1) NULL,
+ stripalarms TINYINT(1) NULL,
+ stripattachments TINYINT(1) NULL,
+ lastmodified INT(11) UNSIGNED,
+ UNIQUE(principaluri, uri)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+ -->
+<table>
+ <name>*dbprefix*calendarsubscriptions</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>principaluri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>source</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>displayname</name>
+ <type>text</type>
+ <length>100</length>
+ </field>
+ <field>
+ <name>refreshrate</name>
+ <type>text</type>
+ <length>10</length>
+ </field>
+ <field>
+ <name>calendarorder</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>calendarcolor</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>striptodos</name>
+ <type>integer</type>
+ <length>1</length>
+ </field>
+ <field>
+ <name>stripalarms</name>
+ <type>integer</type>
+ <length>1</length>
+ </field>
+ <field>
+ <name>stripattachments</name>
+ <type>integer</type>
+ <length>1</length>
+ </field>
+ <field>
+ <name>lastmodified</name>
+ <type>integer</type>
+ <unsigned>true</unsigned>
+ </field>
+ <index>
+ <name>calsub_index</name>
+ <unique>true</unique>
+ <field>
+ <name>principaluri</name>
+ </field>
+ <field>
+ <name>uri</name>
+ </field>
+ </index>
+ </declaration>
+</table>
+ <!--
+ CREATE TABLE schedulingobjects (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARBINARY(255),
+ calendardata MEDIUMBLOB,
+ uri VARBINARY(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+ -->
+
+ <table>
+ <name>*dbprefix*schedulingobjects</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>principaluri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>calendardata</name>
+ <type>blob</type>
+ </field>
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>lastmodified</name>
+ <type>integer</type>
+ <unsigned>true</unsigned>
+ </field>
+ <field>
+ <name>etag</name>
+ <type>text</type>
+ <length>32</length>
+ </field>
+ <field>
+ <name>size</name>
+ <type>integer</type>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+
+ </declaration>
+ </table>
+
+ <table>
+ <name>*dbprefix*dav_shares</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>11</length>
+ </field>
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>principaluri</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>type</name>
+ <type>text</type>
+ </field>
+ <field>
+ <name>access</name>
+ <type>integer</type>
+ <length>1</length>
+ </field>
+ <field>
+ <name>resourceid</name>
+ <type>integer</type>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ </field>
+ <index>
+ <name>dav_shares_index</name>
+ <unique>true</unique>
+ <field>
+ <name>principaluri</name>
+ </field>
+ <field>
+ <name>uri</name>
+ </field>
+ <field>
+ <name>type</name>
+ </field>
+ </index>
+ </declaration>
+ </table>
</database>
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index 11025115691..5f681e784fc 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -5,7 +5,7 @@
<description>ownCloud WebDAV endpoint</description>
<licence>AGPL</licence>
<author>owncloud.org</author>
- <version>0.1.2</version>
+ <version>0.1.3</version>
<requiremin>9.0</requiremin>
<shipped>true</shipped>
<standalone/>
diff --git a/apps/dav/appinfo/register_command.php b/apps/dav/appinfo/register_command.php
index c996dd44063..af41036cddc 100644
--- a/apps/dav/appinfo/register_command.php
+++ b/apps/dav/appinfo/register_command.php
@@ -1,8 +1,15 @@
<?php
use OCA\DAV\Command\CreateAddressBook;
+use OCA\DAV\Command\CreateCalendar;
+use OCA\DAV\Command\SyncSystemAddressBook;
+$config = \OC::$server->getConfig();
$dbConnection = \OC::$server->getDatabaseConnection();
$userManager = OC::$server->getUserManager();
+$config = \OC::$server->getConfig();
+
/** @var Symfony\Component\Console\Application $application */
-$application->add(new CreateAddressBook($userManager, $dbConnection));
+$application->add(new CreateAddressBook($userManager, $dbConnection, $config));
+$application->add(new CreateCalendar($userManager, $dbConnection));
+$application->add(new SyncSystemAddressBook($userManager, $dbConnection, $config));
diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php
index 5bdfd94e658..cf0488038d3 100644
--- a/apps/dav/appinfo/v1/publicwebdav.php
+++ b/apps/dav/appinfo/v1/publicwebdav.php
@@ -39,7 +39,8 @@ $serverFactory = new OCA\DAV\Connector\Sabre\ServerFactory(
\OC::$server->getUserSession(),
\OC::$server->getMountManager(),
\OC::$server->getTagManager(),
- \OC::$server->getEventDispatcher()
+ \OC::$server->getEventDispatcher(),
+ \OC::$server->getRequest()
);
$requestUri = \OC::$server->getRequest()->getRequestUri();
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index f28736f1f01..8324f962b8e 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -40,7 +40,8 @@ $serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory(
\OC::$server->getUserSession(),
\OC::$server->getMountManager(),
\OC::$server->getTagManager(),
- \OC::$server->getEventDispatcher()
+ \OC::$server->getEventDispatcher(),
+ \OC::$server->getRequest()
);
// Backends
diff --git a/apps/dav/command/createaddressbook.php b/apps/dav/command/createaddressbook.php
index 286871b39e2..ea89e7aa0a8 100644
--- a/apps/dav/command/createaddressbook.php
+++ b/apps/dav/command/createaddressbook.php
@@ -3,6 +3,8 @@
namespace OCA\DAV\Command;
use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\Connector\Sabre\Principal;
+use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IUserManager;
use Symfony\Component\Console\Command\Command;
@@ -18,26 +20,30 @@ class CreateAddressBook extends Command {
/** @var \OCP\IDBConnection */
protected $dbConnection;
+ /** @var IConfig */
+ private $config;
+
/**
* @param IUserManager $userManager
* @param IDBConnection $dbConnection
*/
- function __construct(IUserManager $userManager, IDBConnection $dbConnection) {
+ function __construct(IUserManager $userManager, IDBConnection $dbConnection, IConfig $config) {
parent::__construct();
$this->userManager = $userManager;
$this->dbConnection = $dbConnection;
+ $this->config = $config;
}
protected function configure() {
$this
- ->setName('dav:create-addressbook')
- ->setDescription('Create a dav addressbook')
- ->addArgument('user',
- InputArgument::REQUIRED,
- 'User for whom the addressbook will be created')
- ->addArgument('name',
- InputArgument::REQUIRED,
- 'Name of the addressbook');
+ ->setName('dav:create-addressbook')
+ ->setDescription('Create a dav addressbook')
+ ->addArgument('user',
+ InputArgument::REQUIRED,
+ 'User for whom the addressbook will be created')
+ ->addArgument('name',
+ InputArgument::REQUIRED,
+ 'Name of the addressbook');
}
protected function execute(InputInterface $input, OutputInterface $output) {
@@ -45,8 +51,13 @@ class CreateAddressBook extends Command {
if (!$this->userManager->userExists($user)) {
throw new \InvalidArgumentException("User <$user> in unknown.");
}
+ $principalBackend = new Principal(
+ $this->config,
+ $this->userManager
+ );
+
$name = $input->getArgument('name');
- $carddav = new CardDavBackend($this->dbConnection);
- $carddav->createAddressBook("principals/$user", $name, []);
+ $carddav = new CardDavBackend($this->dbConnection, $principalBackend);
+ $carddav->createAddressBook("principals/users/$user", $name, []);
}
}
diff --git a/apps/dav/command/createcalendar.php b/apps/dav/command/createcalendar.php
new file mode 100644
index 00000000000..5e7b17dae66
--- /dev/null
+++ b/apps/dav/command/createcalendar.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace OCA\DAV\Command;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCP\IDBConnection;
+use OCP\IUserManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CreateCalendar extends Command {
+
+ /** @var IUserManager */
+ protected $userManager;
+
+ /** @var \OCP\IDBConnection */
+ protected $dbConnection;
+
+ /**
+ * @param IUserManager $userManager
+ * @param IDBConnection $dbConnection
+ */
+ function __construct(IUserManager $userManager, IDBConnection $dbConnection) {
+ parent::__construct();
+ $this->userManager = $userManager;
+ $this->dbConnection = $dbConnection;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('dav:create-calendar')
+ ->setDescription('Create a dav calendar')
+ ->addArgument('user',
+ InputArgument::REQUIRED,
+ 'User for whom the calendar will be created')
+ ->addArgument('name',
+ InputArgument::REQUIRED,
+ 'Name of the calendar');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $user = $input->getArgument('user');
+ if (!$this->userManager->userExists($user)) {
+ throw new \InvalidArgumentException("User <$user> in unknown.");
+ }
+ $name = $input->getArgument('name');
+ $caldav = new CalDavBackend($this->dbConnection);
+ $caldav->createCalendar("principals/users/$user", $name, []);
+ }
+}
diff --git a/apps/dav/command/syncsystemaddressbook.php b/apps/dav/command/syncsystemaddressbook.php
new file mode 100644
index 00000000000..bb2896abc60
--- /dev/null
+++ b/apps/dav/command/syncsystemaddressbook.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace OCA\DAV\Command;
+
+use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\CardDAV\Converter;
+use OCA\DAV\Connector\Sabre\Principal;
+use OCP\IConfig;
+use OCP\IDBConnection;
+use OCP\IUser;
+use OCP\IUserManager;
+use Sabre\CardDAV\Plugin;
+use Sabre\VObject\Component\VCard;
+use Sabre\VObject\Property\Text;
+use Sabre\VObject\Reader;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\ProgressBar;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class SyncSystemAddressBook extends Command {
+
+ /** @var IUserManager */
+ protected $userManager;
+
+ /** @var \OCP\IDBConnection */
+ protected $dbConnection;
+
+ /** @var IConfig */
+ protected $config;
+
+ /** @var CardDavBackend */
+ private $backend;
+
+ /**
+ * @param IUserManager $userManager
+ * @param IDBConnection $dbConnection
+ * @param IConfig $config
+ */
+ function __construct(IUserManager $userManager, IDBConnection $dbConnection, IConfig $config) {
+ parent::__construct();
+ $this->userManager = $userManager;
+ $this->dbConnection = $dbConnection;
+ $this->config = $config;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('dav:sync-system-addressbook')
+ ->setDescription('Synchronizes users to the system addressbook');
+ }
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $principalBackend = new Principal(
+ $this->config,
+ $this->userManager
+ );
+
+ $this->backend = new CardDavBackend($this->dbConnection, $principalBackend);
+
+ // ensure system addressbook exists
+ $systemAddressBook = $this->ensureSystemAddressBookExists();
+ $converter = new Converter();
+
+ $output->writeln('Syncing users ...');
+ $progress = new ProgressBar($output);
+ $progress->start();
+ $this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $converter, $progress) {
+ /** @var IUser $user */
+ $name = $user->getBackendClassName();
+ $userId = $user->getUID();
+
+ $cardId = "$name:$userId.vcf";
+ $card = $this->backend->getCard($systemAddressBook['id'], $cardId);
+ if ($card === false) {
+ $vCard = $converter->createCardFromUser($user);
+ $this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize());
+ } else {
+ $vCard = Reader::read($card['carddata']);
+ if ($converter->updateCard($vCard, $user)) {
+ $this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize());
+ }
+ }
+ $progress->advance();
+ });
+ $progress->finish();
+ $output->writeln('');
+ }
+
+ protected function ensureSystemAddressBookExists() {
+ $book = $this->backend->getAddressBooksByUri('system');
+ if (!is_null($book)) {
+ return $book;
+ }
+ $systemPrincipal = "principals/system/system";
+ $this->backend->createAddressBook($systemPrincipal, 'system', [
+ '{' . Plugin::NS_CARDDAV . '}addressbook-description' => 'System addressbook which holds all users of this instance'
+ ]);
+
+ return $this->backend->getAddressBooksByUri('system');
+ }
+}
diff --git a/apps/dav/lib/caldav/caldavbackend.php b/apps/dav/lib/caldav/caldavbackend.php
new file mode 100644
index 00000000000..d912f209d46
--- /dev/null
+++ b/apps/dav/lib/caldav/caldavbackend.php
@@ -0,0 +1,1174 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\CalDAV;
+
+use Sabre\CalDAV\Backend\AbstractBackend;
+use Sabre\CalDAV\Backend\SchedulingSupport;
+use Sabre\CalDAV\Backend\SubscriptionSupport;
+use Sabre\CalDAV\Backend\SyncSupport;
+use Sabre\CalDAV\Plugin;
+use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp;
+use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
+use Sabre\DAV;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\Reader;
+use Sabre\VObject\RecurrenceIterator;
+
+/**
+ * Class CalDavBackend
+ *
+ * Code is heavily inspired by https://github.com/fruux/sabre-dav/blob/master/lib/CalDAV/Backend/PDO.php
+ *
+ * @package OCA\DAV\CalDAV
+ */
+class CalDavBackend extends AbstractBackend implements SyncSupport, SubscriptionSupport, SchedulingSupport {
+
+ /**
+ * We need to specify a max date, because we need to stop *somewhere*
+ *
+ * On 32 bit system the maximum for a signed integer is 2147483647, so
+ * MAX_DATE cannot be higher than date('Y-m-d', 2147483647) which results
+ * in 2038-01-19 to avoid problems when the date is converted
+ * to a unix timestamp.
+ */
+ const MAX_DATE = '2038-01-01';
+
+ /**
+ * List of CalDAV properties, and how they map to database fieldnames
+ * Add your own properties by simply adding on to this array.
+ *
+ * Note that only string-based properties are supported here.
+ *
+ * @var array
+ */
+ public $propertyMap = [
+ '{DAV:}displayname' => 'displayname',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone',
+ '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder',
+ '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor',
+ ];
+
+ /**
+ * List of subscription properties, and how they map to database fieldnames.
+ *
+ * @var array
+ */
+ public $subscriptionPropertyMap = [
+ '{DAV:}displayname' => 'displayname',
+ '{http://apple.com/ns/ical/}refreshrate' => 'refreshrate',
+ '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder',
+ '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor',
+ '{http://calendarserver.org/ns/}subscribed-strip-todos' => 'striptodos',
+ '{http://calendarserver.org/ns/}subscribed-strip-alarms' => 'stripalarms',
+ '{http://calendarserver.org/ns/}subscribed-strip-attachments' => 'stripattachments',
+ ];
+
+ public function __construct(\OCP\IDBConnection $db) {
+ $this->db = $db;
+ }
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principaluri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * Many clients also require:
+ * {urn:ietf:params:xml:ns:caldav}supported-calendar-component-set
+ * For this property, you can just return an instance of
+ * Sabre\CalDAV\Property\SupportedCalendarComponentSet.
+ *
+ * If you return {http://sabredav.org/ns}read-only and set the value to 1,
+ * ACL will automatically be put in read-only mode.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ function getCalendarsForUser($principalUri) {
+ $fields = array_values($this->propertyMap);
+ $fields[] = 'id';
+ $fields[] = 'uri';
+ $fields[] = 'synctoken';
+ $fields[] = 'components';
+ $fields[] = 'principaluri';
+ $fields[] = 'transparent';
+
+ // Making fields a comma-delimited list
+ $query = $this->db->getQueryBuilder();
+ $query->select($fields)->from('calendars')
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)))
+ ->orderBy('calendarorder', 'ASC');
+ $stmt = $query->execute();
+
+ $calendars = [];
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ $components = [];
+ if ($row['components']) {
+ $components = explode(',',$row['components']);
+ }
+
+ $calendar = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{' . Plugin::NS_CALENDARSERVER . '}getctag' => 'http://sabre.io/ns/sync/' . ($row['synctoken']?$row['synctoken']:'0'),
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components),
+ '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
+ ];
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ $calendar[$xmlName] = $row[$dbName];
+ }
+
+ $calendars[] = $calendar;
+ }
+
+ return $calendars;
+ }
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar.
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return void
+ */
+ function createCalendar($principalUri, $calendarUri, array $properties) {
+ $values = [
+ 'principaluri' => $principalUri,
+ 'uri' => $calendarUri,
+ 'synctoken' => 1,
+ 'transparent' => 0,
+ 'components' => 'VEVENT,VTODO',
+ 'displayname' => $calendarUri
+ ];
+
+ // Default value
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ if (isset($properties[$sccs])) {
+ if (!($properties[$sccs] instanceof SupportedCalendarComponentSet)) {
+ throw new DAV\Exception('The ' . $sccs . ' property must be of type: \Sabre\CalDAV\Property\SupportedCalendarComponentSet');
+ }
+ $values['components'] = implode(',',$properties[$sccs]->getValue());
+ }
+ $transp = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp';
+ if (isset($properties[$transp])) {
+ $values['transparent'] = $properties[$transp]->getValue()==='transparent';
+ }
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ if (isset($properties[$xmlName])) {
+ $values[$dbName] = $properties[$xmlName];
+ }
+ }
+
+ $query = $this->db->getQueryBuilder();
+ $query->insert('calendars');
+ foreach($values as $column => $value) {
+ $query->setValue($column, $query->createNamedParameter($value));
+ }
+ $query->execute();
+ }
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The list of mutations is stored in a Sabre\DAV\PropPatch object.
+ * To do the actual updates, you must tell this object which properties
+ * you're going to process with the handle() method.
+ *
+ * Calling the handle method is like telling the PropPatch object "I
+ * promise I can handle updating this property".
+ *
+ * Read the PropPatch documentation for more info and examples.
+ *
+ * @param \Sabre\DAV\PropPatch $propPatch
+ * @return void
+ */
+ function updateCalendar($calendarId, \Sabre\DAV\PropPatch $propPatch) {
+ $supportedProperties = array_keys($this->propertyMap);
+ $supportedProperties[] = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp';
+
+ $propPatch->handle($supportedProperties, function($mutations) use ($calendarId) {
+ $newValues = [];
+ foreach ($mutations as $propertyName => $propertyValue) {
+
+ switch ($propertyName) {
+ case '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' :
+ $fieldName = 'transparent';
+ $newValues[$fieldName] = $propertyValue->getValue() === 'transparent';
+ break;
+ default :
+ $fieldName = $this->propertyMap[$propertyName];
+ $newValues[$fieldName] = $propertyValue;
+ break;
+ }
+
+ }
+ $query = $this->db->getQueryBuilder();
+ $query->update('calendars');
+ foreach ($newValues as $fieldName => $value) {
+ $query->set($fieldName, $query->createNamedParameter($value));
+ }
+ $query->where($query->expr()->eq('id', $query->createNamedParameter($calendarId)));
+ $query->execute();
+
+ $this->addChange($calendarId, "", 2);
+
+ return true;
+ });
+ }
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param mixed $calendarId
+ * @return void
+ */
+ function deleteCalendar($calendarId) {
+ $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ?');
+ $stmt->execute([$calendarId]);
+
+ $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendars` WHERE `id` = ?');
+ $stmt->execute([$calendarId]);
+
+ $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarchanges` WHERE `calendarid` = ?');
+ $stmt->execute([$calendarId]);
+ }
+
+ /**
+ * Returns all calendar objects within a calendar.
+ *
+ * Every item contains an array with the following keys:
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can
+ * be any arbitrary string, but making sure it ends with '.ics' is a
+ * good idea. This is only the basename, or filename, not the full
+ * path.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * '"abcdef"')
+ * * size - The size of the calendar objects, in bytes.
+ * * component - optional, a string containing the type of object, such
+ * as 'vevent' or 'vtodo'. If specified, this will be used to populate
+ * the Content-Type header.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * If neither etag or size are specified, the calendardata will be
+ * used/fetched to determine these numbers. If both are specified the
+ * amount of times this is needed is reduced by a great degree.
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ function getCalendarObjects($calendarId) {
+ $query = $this->db->getQueryBuilder();
+ $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'componenttype'])
+ ->from('calendarobjects')
+ ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)));
+ $stmt = $query->execute();
+
+ $result = [];
+ foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
+ $result[] = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ 'component' => strtolower($row['componenttype']),
+ ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The object uri is only the basename, or filename and not a full path.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * This method must return null if the object did not exist.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @return array|null
+ */
+ function getCalendarObject($calendarId, $objectUri) {
+
+ $query = $this->db->getQueryBuilder();
+ $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype'])
+ ->from('calendarobjects')
+ ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
+ ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)));
+ $stmt = $query->execute();
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ if(!$row) return null;
+
+ return [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ 'calendardata' => $this->readBlob($row['calendardata']),
+ 'component' => strtolower($row['componenttype']),
+ ];
+ }
+
+ /**
+ * Returns a list of calendar objects.
+ *
+ * This method should work identical to getCalendarObject, but instead
+ * return all the calendar objects in the list as an array.
+ *
+ * If the backend supports this, it may allow for some speed-ups.
+ *
+ * @param mixed $calendarId
+ * @param string[] $uris
+ * @return array
+ */
+ function getMultipleCalendarObjects($calendarId, array $uris) {
+ $query = $this->db->getQueryBuilder();
+ $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype'])
+ ->from('calendarobjects')
+ ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
+ ->andWhere($query->expr()->in('uri', $query->createParameter('uri')))
+ ->setParameter('uri', $uris, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
+
+ $stmt = $query->execute();
+
+ $result = [];
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ $result[] = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ 'calendardata' => $this->readBlob($row['calendardata']),
+ 'component' => strtolower($row['componenttype']),
+ ];
+
+ }
+ return $result;
+ }
+
+ /**
+ * Creates a new calendar object.
+ *
+ * The object uri is only the basename, or filename and not a full path.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string
+ */
+ function createCalendarObject($calendarId, $objectUri, $calendarData) {
+ $extraData = $this->getDenormalizedData($calendarData);
+
+ $query = $this->db->getQueryBuilder();
+ $query->insert('calendarobjects')
+ ->values([
+ 'calendarid' => $query->createNamedParameter($calendarId),
+ 'uri' => $query->createNamedParameter($objectUri),
+ 'calendardata' => $query->createNamedParameter($calendarData, \PDO::PARAM_LOB),
+ 'lastmodified' => $query->createNamedParameter(time()),
+ 'etag' => $query->createNamedParameter($extraData['etag']),
+ 'size' => $query->createNamedParameter($extraData['size']),
+ 'componenttype' => $query->createNamedParameter($extraData['componentType']),
+ 'firstoccurence' => $query->createNamedParameter($extraData['firstOccurence']),
+ 'lastoccurence' => $query->createNamedParameter($extraData['lastOccurence']),
+ 'uid' => $query->createNamedParameter($extraData['uid']),
+ ])
+ ->execute();
+
+ $this->addChange($calendarId, $objectUri, 1);
+
+ return '"' . $extraData['etag'] . '"';
+ }
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * The object uri is only the basename, or filename and not a full path.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string
+ */
+ function updateCalendarObject($calendarId, $objectUri, $calendarData) {
+ $extraData = $this->getDenormalizedData($calendarData);
+
+ $query = $this->db->getQueryBuilder();
+ $query->update('calendarobjects')
+ ->set('calendardata', $query->createNamedParameter($calendarData, \PDO::PARAM_LOB))
+ ->set('lastmodified', $query->createNamedParameter(time()))
+ ->set('etag', $query->createNamedParameter($extraData['etag']))
+ ->set('size', $query->createNamedParameter($extraData['size']))
+ ->set('componenttype', $query->createNamedParameter($extraData['componentType']))
+ ->set('firstoccurence', $query->createNamedParameter($extraData['firstOccurence']))
+ ->set('lastoccurence', $query->createNamedParameter($extraData['lastOccurence']))
+ ->set('uid', $query->createNamedParameter($extraData['uid']))
+ ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
+ ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
+ ->execute();
+
+ $this->addChange($calendarId, $objectUri, 2);
+
+ return '"' . $extraData['etag'] . '"';
+ }
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * The object uri is only the basename, or filename and not a full path.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ function deleteCalendarObject($calendarId, $objectUri) {
+ $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ? AND `uri` = ?');
+ $stmt->execute([$calendarId, $objectUri]);
+
+ $this->addChange($calendarId, $objectUri, 3);
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on either VEVENT or VTODO.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * @param mixed $calendarId
+ * @param array $filters
+ * @return array
+ */
+ function calendarQuery($calendarId, array $filters) {
+ $componentType = null;
+ $requirePostFilter = true;
+ $timeRange = null;
+
+ // if no filters were specified, we don't need to filter after a query
+ if (!$filters['prop-filters'] && !$filters['comp-filters']) {
+ $requirePostFilter = false;
+ }
+
+ // Figuring out if there's a component filter
+ if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) {
+ $componentType = $filters['comp-filters'][0]['name'];
+
+ // Checking if we need post-filters
+ if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) {
+ $requirePostFilter = false;
+ }
+ // There was a time-range filter
+ if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) {
+ $timeRange = $filters['comp-filters'][0]['time-range'];
+
+ // If start time OR the end time is not specified, we can do a
+ // 100% accurate mysql query.
+ if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) {
+ $requirePostFilter = false;
+ }
+ }
+
+ }
+ $columns = ['uri'];
+ if ($requirePostFilter) {
+ $columns = ['uri', 'calendardata'];
+ }
+ $query = $this->db->getQueryBuilder();
+ $query->select($columns)
+ ->from('calendarobjects')
+ ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)));
+
+ if ($componentType) {
+ $query->andWhere($query->expr()->eq('componenttype', $query->createNamedParameter($componentType)));
+ }
+
+ if ($timeRange && $timeRange['start']) {
+ $query->andWhere($query->expr()->gt('lastoccurence', $query->createNamedParameter($timeRange['start']->getTimeStamp())));
+ }
+ if ($timeRange && $timeRange['end']) {
+ $query->andWhere($query->expr()->lt('firstoccurence', $query->createNamedParameter($timeRange['end']->getTimeStamp())));
+ }
+
+ $stmt = $query->execute();
+
+ $result = [];
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ if ($requirePostFilter) {
+ if (!$this->validateFilterForObject($row, $filters)) {
+ continue;
+ }
+ }
+ $result[] = $row['uri'];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Searches through all of a users calendars and calendar objects to find
+ * an object with a specific UID.
+ *
+ * This method should return the path to this object, relative to the
+ * calendar home, so this path usually only contains two parts:
+ *
+ * calendarpath/objectpath.ics
+ *
+ * If the uid is not found, return null.
+ *
+ * This method should only consider * objects that the principal owns, so
+ * any calendars owned by other principals that also appear in this
+ * collection should be ignored.
+ *
+ * @param string $principalUri
+ * @param string $uid
+ * @return string|null
+ */
+ function getCalendarObjectByUID($principalUri, $uid) {
+
+ $query = $this->db->getQueryBuilder();
+ $query->select([$query->createFunction('c.`uri` AS `calendaruri`'), $query->createFunction('co.`uri` AS `objecturi`')])
+ ->from('calendarobjects', 'co')
+ ->leftJoin('co', 'calendars', 'c', 'co.`calendarid` = c.`id`')
+ ->where($query->expr()->eq('c.principaluri', $query->createNamedParameter($principalUri)))
+ ->andWhere($query->expr()->eq('co.uid', $query->createNamedParameter($uid)));
+
+ $stmt = $query->execute();
+
+ if ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $row['calendaruri'] . '/' . $row['objecturi'];
+ }
+
+ return null;
+ }
+
+ /**
+ * The getChanges method returns all the changes that have happened, since
+ * the specified syncToken in the specified calendar.
+ *
+ * This function should return an array, such as the following:
+ *
+ * [
+ * 'syncToken' => 'The current synctoken',
+ * 'added' => [
+ * 'new.txt',
+ * ],
+ * 'modified' => [
+ * 'modified.txt',
+ * ],
+ * 'deleted' => [
+ * 'foo.php.bak',
+ * 'old.txt'
+ * ]
+ * );
+ *
+ * The returned syncToken property should reflect the *current* syncToken
+ * of the calendar, as reported in the {http://sabredav.org/ns}sync-token
+ * property This is * needed here too, to ensure the operation is atomic.
+ *
+ * If the $syncToken argument is specified as null, this is an initial
+ * sync, and all members should be reported.
+ *
+ * The modified property is an array of nodenames that have changed since
+ * the last token.
+ *
+ * The deleted property is an array with nodenames, that have been deleted
+ * from collection.
+ *
+ * The $syncLevel argument is basically the 'depth' of the report. If it's
+ * 1, you only have to report changes that happened only directly in
+ * immediate descendants. If it's 2, it should also include changes from
+ * the nodes below the child collections. (grandchildren)
+ *
+ * The $limit argument allows a client to specify how many results should
+ * be returned at most. If the limit is not specified, it should be treated
+ * as infinite.
+ *
+ * If the limit (infinite or not) is higher than you're willing to return,
+ * you should throw a Sabre\DAV\Exception\TooMuchMatches() exception.
+ *
+ * If the syncToken is expired (due to data cleanup) or unknown, you must
+ * return null.
+ *
+ * The limit is 'suggestive'. You are free to ignore it.
+ *
+ * @param string $calendarId
+ * @param string $syncToken
+ * @param int $syncLevel
+ * @param int $limit
+ * @return array
+ */
+ function getChangesForCalendar($calendarId, $syncToken, $syncLevel, $limit = null) {
+ // Current synctoken
+ $stmt = $this->db->prepare('SELECT `synctoken` FROM `*PREFIX*calendars` WHERE `id` = ?');
+ $stmt->execute([ $calendarId ]);
+ $currentToken = $stmt->fetchColumn(0);
+
+ if (is_null($currentToken)) {
+ return null;
+ }
+
+ $result = [
+ 'syncToken' => $currentToken,
+ 'added' => [],
+ 'modified' => [],
+ 'deleted' => [],
+ ];
+
+ if ($syncToken) {
+
+ $query = "SELECT `uri`, `operation` FROM `*PREFIX*calendarchanges` WHERE `synctoken` >= ? AND `synctoken` < ? AND `calendarid` = ? ORDER BY `synctoken`";
+ if ($limit>0) {
+ $query.= " `LIMIT` " . (int)$limit;
+ }
+
+ // Fetching all changes
+ $stmt = $this->db->prepare($query);
+ $stmt->execute([$syncToken, $currentToken, $calendarId]);
+
+ $changes = [];
+
+ // This loop ensures that any duplicates are overwritten, only the
+ // last change on a node is relevant.
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ $changes[$row['uri']] = $row['operation'];
+
+ }
+
+ foreach($changes as $uri => $operation) {
+
+ switch($operation) {
+ case 1 :
+ $result['added'][] = $uri;
+ break;
+ case 2 :
+ $result['modified'][] = $uri;
+ break;
+ case 3 :
+ $result['deleted'][] = $uri;
+ break;
+ }
+
+ }
+ } else {
+ // No synctoken supplied, this is the initial sync.
+ $query = "SELECT `uri` FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ?";
+ $stmt = $this->db->prepare($query);
+ $stmt->execute([$calendarId]);
+
+ $result['added'] = $stmt->fetchAll(\PDO::FETCH_COLUMN);
+ }
+ return $result;
+
+ }
+
+ /**
+ * Returns a list of subscriptions for a principal.
+ *
+ * Every subscription is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * subscription. This can be the same as the uri or a database key.
+ * * uri. This is just the 'base uri' or 'filename' of the subscription.
+ * * principaluri. The owner of the subscription. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore, all the subscription info must be returned too:
+ *
+ * 1. {DAV:}displayname
+ * 2. {http://apple.com/ns/ical/}refreshrate
+ * 3. {http://calendarserver.org/ns/}subscribed-strip-todos (omit if todos
+ * should not be stripped).
+ * 4. {http://calendarserver.org/ns/}subscribed-strip-alarms (omit if alarms
+ * should not be stripped).
+ * 5. {http://calendarserver.org/ns/}subscribed-strip-attachments (omit if
+ * attachments should not be stripped).
+ * 6. {http://calendarserver.org/ns/}source (Must be a
+ * Sabre\DAV\Property\Href).
+ * 7. {http://apple.com/ns/ical/}calendar-color
+ * 8. {http://apple.com/ns/ical/}calendar-order
+ * 9. {urn:ietf:params:xml:ns:caldav}supported-calendar-component-set
+ * (should just be an instance of
+ * Sabre\CalDAV\Property\SupportedCalendarComponentSet, with a bunch of
+ * default components).
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ function getSubscriptionsForUser($principalUri) {
+ $fields = array_values($this->subscriptionPropertyMap);
+ $fields[] = 'id';
+ $fields[] = 'uri';
+ $fields[] = 'source';
+ $fields[] = 'principaluri';
+ $fields[] = 'lastmodified';
+
+ $query = $this->db->getQueryBuilder();
+ $query->select($fields)
+ ->from('calendarsubscriptions')
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)))
+ ->orderBy('calendarorder', 'asc');
+ $stmt =$query->execute();
+
+ $subscriptions = [];
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ $subscription = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ 'source' => $row['source'],
+ 'lastmodified' => $row['lastmodified'],
+
+ '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet(['VTODO', 'VEVENT']),
+ ];
+
+ foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) {
+ if (!is_null($row[$dbName])) {
+ $subscription[$xmlName] = $row[$dbName];
+ }
+ }
+
+ $subscriptions[] = $subscription;
+
+ }
+
+ return $subscriptions;
+ }
+
+ /**
+ * Creates a new subscription for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this subscription in other methods, such as updateSubscription.
+ *
+ * @param string $principalUri
+ * @param string $uri
+ * @param array $properties
+ * @return mixed
+ */
+ function createSubscription($principalUri, $uri, array $properties) {
+
+ if (!isset($properties['{http://calendarserver.org/ns/}source'])) {
+ throw new Forbidden('The {http://calendarserver.org/ns/}source property is required when creating subscriptions');
+ }
+
+ $values = [
+ 'principaluri' => $principalUri,
+ 'uri' => $uri,
+ 'source' => $properties['{http://calendarserver.org/ns/}source']->getHref(),
+ 'lastmodified' => time(),
+ ];
+
+ foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) {
+ if (isset($properties[$xmlName])) {
+
+ $values[$dbName] = $properties[$xmlName];
+ $fieldNames[] = $dbName;
+ }
+ }
+
+ $query = $this->db->getQueryBuilder();
+ $query->insert('calendarsubscriptions')
+ ->values([
+ 'principaluri' => $query->createNamedParameter($values['principaluri']),
+ 'uri' => $query->createNamedParameter($values['uri']),
+ 'source' => $query->createNamedParameter($values['source']),
+ 'lastmodified' => $query->createNamedParameter($values['lastmodified']),
+ ])
+ ->execute();
+
+ return $this->db->lastInsertId('*PREFIX*calendarsubscriptions');
+ }
+
+ /**
+ * Updates a subscription
+ *
+ * The list of mutations is stored in a Sabre\DAV\PropPatch object.
+ * To do the actual updates, you must tell this object which properties
+ * you're going to process with the handle() method.
+ *
+ * Calling the handle method is like telling the PropPatch object "I
+ * promise I can handle updating this property".
+ *
+ * Read the PropPatch documentation for more info and examples.
+ *
+ * @param mixed $subscriptionId
+ * @param \Sabre\DAV\PropPatch $propPatch
+ * @return void
+ */
+ function updateSubscription($subscriptionId, DAV\PropPatch $propPatch) {
+ $supportedProperties = array_keys($this->subscriptionPropertyMap);
+ $supportedProperties[] = '{http://calendarserver.org/ns/}source';
+
+ $propPatch->handle($supportedProperties, function($mutations) use ($subscriptionId) {
+
+ $newValues = [];
+
+ foreach($mutations as $propertyName=>$propertyValue) {
+ if ($propertyName === '{http://calendarserver.org/ns/}source') {
+ $newValues['source'] = $propertyValue->getHref();
+ } else {
+ $fieldName = $this->subscriptionPropertyMap[$propertyName];
+ $newValues[$fieldName] = $propertyValue;
+ }
+ }
+
+ $query = $this->db->getQueryBuilder();
+ $query->update('calendarsubscriptions')
+ ->set('lastmodified', $query->createNamedParameter(time()));
+ foreach($newValues as $fieldName=>$value) {
+ $query->set($fieldName, $query->createNamedParameter($value));
+ }
+ $query->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId)))
+ ->execute();
+
+ return true;
+
+ });
+ }
+
+ /**
+ * Deletes a subscription.
+ *
+ * @param mixed $subscriptionId
+ * @return void
+ */
+ function deleteSubscription($subscriptionId) {
+ $query = $this->db->getQueryBuilder();
+ $query->delete('calendarsubscriptions')
+ ->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId)))
+ ->execute();
+ }
+
+ /**
+ * Returns a single scheduling object for the inbox collection.
+ *
+ * The returned array should contain the following elements:
+ * * uri - A unique basename for the object. This will be used to
+ * construct a full uri.
+ * * calendardata - The iCalendar object
+ * * lastmodified - The last modification date. Can be an int for a unix
+ * timestamp, or a PHP DateTime object.
+ * * etag - A unique token that must change if the object changed.
+ * * size - The size of the object, in bytes.
+ *
+ * @param string $principalUri
+ * @param string $objectUri
+ * @return array
+ */
+ function getSchedulingObject($principalUri, $objectUri) {
+ $query = $this->db->getQueryBuilder();
+ $stmt = $query->select(['uri', 'calendardata', 'lastmodified', 'etag', 'size'])
+ ->from('schedulingobjects')
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)))
+ ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
+ ->execute();
+
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ if(!$row) {
+ return null;
+ }
+
+ return [
+ 'uri' => $row['uri'],
+ 'calendardata' => $row['calendardata'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'size' => (int)$row['size'],
+ ];
+ }
+
+ /**
+ * Returns all scheduling objects for the inbox collection.
+ *
+ * These objects should be returned as an array. Every item in the array
+ * should follow the same structure as returned from getSchedulingObject.
+ *
+ * The main difference is that 'calendardata' is optional.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ function getSchedulingObjects($principalUri) {
+ $query = $this->db->getQueryBuilder();
+ $stmt = $query->select(['uri', 'calendardata', 'lastmodified', 'etag', 'size'])
+ ->from('schedulingobjects')
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)))
+ ->execute();
+
+ $result = [];
+ foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
+ $result[] = [
+ 'calendardata' => $row['calendardata'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'size' => (int)$row['size'],
+ ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Deletes a scheduling object from the inbox collection.
+ *
+ * @param string $principalUri
+ * @param string $objectUri
+ * @return void
+ */
+ function deleteSchedulingObject($principalUri, $objectUri) {
+ $query = $this->db->getQueryBuilder();
+ $query->delete('schedulingobjects')
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)))
+ ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
+ ->execute();
+ }
+
+ /**
+ * Creates a new scheduling object. This should land in a users' inbox.
+ *
+ * @param string $principalUri
+ * @param string $objectUri
+ * @param string $objectData
+ * @return void
+ */
+ function createSchedulingObject($principalUri, $objectUri, $objectData) {
+ $query = $this->db->getQueryBuilder();
+ $query->insert('schedulingobjects')
+ ->values([
+ 'principaluri' => $query->createNamedParameter($principalUri),
+ 'calendardata' => $query->createNamedParameter($objectData),
+ 'uri' => $query->createNamedParameter($objectUri),
+ 'lastmodified' => $query->createNamedParameter(time()),
+ 'etag' => $query->createNamedParameter(md5($objectData)),
+ 'size' => $query->createNamedParameter(strlen($objectData))
+ ])
+ ->execute();
+ }
+
+ /**
+ * Adds a change record to the calendarchanges table.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param int $operation 1 = add, 2 = modify, 3 = delete.
+ * @return void
+ */
+ protected function addChange($calendarId, $objectUri, $operation) {
+
+ $stmt = $this->db->prepare('INSERT INTO `*PREFIX*calendarchanges` (`uri`, `synctoken`, `calendarid`, `operation`) SELECT ?, `synctoken`, ?, ? FROM `*PREFIX*calendars` WHERE `id` = ?');
+ $stmt->execute([
+ $objectUri,
+ $calendarId,
+ $operation,
+ $calendarId
+ ]);
+ $stmt = $this->db->prepare('UPDATE `*PREFIX*calendars` SET `synctoken` = `synctoken` + 1 WHERE `id` = ?');
+ $stmt->execute([
+ $calendarId
+ ]);
+
+ }
+
+ /**
+ * Parses some information from calendar objects, used for optimized
+ * calendar-queries.
+ *
+ * Returns an array with the following keys:
+ * * etag - An md5 checksum of the object without the quotes.
+ * * size - Size of the object in bytes
+ * * componentType - VEVENT, VTODO or VJOURNAL
+ * * firstOccurence
+ * * lastOccurence
+ * * uid - value of the UID property
+ *
+ * @param string $calendarData
+ * @return array
+ */
+ protected function getDenormalizedData($calendarData) {
+
+ $vObject = Reader::read($calendarData);
+ $componentType = null;
+ $component = null;
+ $firstOccurence = null;
+ $lastOccurence = null;
+ $uid = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name!=='VTIMEZONE') {
+ $componentType = $component->name;
+ $uid = (string)$component->UID;
+ break;
+ }
+ }
+ if (!$componentType) {
+ throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
+ }
+ if ($componentType === 'VEVENT') {
+ $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
+ // Finding the last occurence is a bit harder
+ if (!isset($component->RRULE)) {
+ if (isset($component->DTEND)) {
+ $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
+ } elseif (isset($component->DURATION)) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->add(DateTimeParser::parse($component->DURATION->getValue()));
+ $lastOccurence = $endDate->getTimeStamp();
+ } elseif (!$component->DTSTART->hasTime()) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->modify('+1 day');
+ $lastOccurence = $endDate->getTimeStamp();
+ } else {
+ $lastOccurence = $firstOccurence;
+ }
+ } else {
+ $it = new RecurrenceIterator($vObject, (string)$component->UID);
+ $maxDate = new \DateTime(self::MAX_DATE);
+ if ($it->isInfinite()) {
+ $lastOccurence = $maxDate->getTimeStamp();
+ } else {
+ $end = $it->getDtEnd();
+ while($it->valid() && $end < $maxDate) {
+ $end = $it->getDtEnd();
+ $it->next();
+
+ }
+ $lastOccurence = $end->getTimeStamp();
+ }
+
+ }
+ }
+
+ return [
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
+ 'firstOccurence' => $firstOccurence,
+ 'lastOccurence' => $lastOccurence,
+ 'uid' => $uid,
+ ];
+
+ }
+
+ private function readBlob($cardData) {
+ if (is_resource($cardData)) {
+ return stream_get_contents($cardData);
+ }
+
+ return $cardData;
+ }
+}
diff --git a/apps/dav/lib/carddav/addressbook.php b/apps/dav/lib/carddav/addressbook.php
new file mode 100644
index 00000000000..507657e9682
--- /dev/null
+++ b/apps/dav/lib/carddav/addressbook.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace OCA\DAV\CardDAV;
+
+use OCA\DAV\CardDAV\Sharing\IShareableAddressBook;
+use Sabre\DAV\Exception\NotFound;
+
+class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddressBook {
+
+ public function __construct(CardDavBackend $carddavBackend, array $addressBookInfo) {
+ parent::__construct($carddavBackend, $addressBookInfo);
+ }
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * addressbook.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ function updateShares(array $add, array $remove) {
+ /** @var CardDavBackend $carddavBackend */
+ $carddavBackend = $this->carddavBackend;
+ $carddavBackend->updateShares($this->getName(), $add, $remove);
+ }
+
+ /**
+ * Returns the list of people whom this addressbook is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ function getShares() {
+ /** @var CardDavBackend $carddavBackend */
+ $carddavBackend = $this->carddavBackend;
+ $carddavBackend->getShares($this->getName());
+ }
+
+ function getACL() {
+ $acl = parent::getACL();
+ if ($this->getOwner() === 'principals/system/system') {
+ $acl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ];
+ }
+
+ return $acl;
+ }
+
+ function getChildACL() {
+ $acl = parent::getChildACL();
+ if ($this->getOwner() === 'principals/system/system') {
+ $acl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ];
+ }
+
+ return $acl;
+ }
+
+ function getChild($name) {
+ $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name);
+ if (!$obj) {
+ throw new NotFound('Card not found');
+ }
+ return new Card($this->carddavBackend, $this->addressBookInfo, $obj);
+ }
+
+}
diff --git a/apps/dav/lib/carddav/addressbookroot.php b/apps/dav/lib/carddav/addressbookroot.php
new file mode 100644
index 00000000000..8c78d024556
--- /dev/null
+++ b/apps/dav/lib/carddav/addressbookroot.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace OCA\DAV\CardDAV;
+
+class AddressBookRoot extends \Sabre\CardDAV\AddressBookRoot {
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ function getChildForPrincipal(array $principal) {
+
+ return new UserAddressBooks($this->carddavBackend, $principal['uri']);
+
+ }
+
+ function getName() {
+
+ // Grabbing all the components of the principal path.
+ $parts = explode('/', $this->principalPrefix);
+
+ // We are only interested in the second part.
+ return $parts[1];
+
+ }
+
+}
diff --git a/apps/dav/lib/carddav/card.php b/apps/dav/lib/carddav/card.php
new file mode 100644
index 00000000000..cea0b1e41c7
--- /dev/null
+++ b/apps/dav/lib/carddav/card.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\CardDAV;
+
+class Card extends \Sabre\CardDAV\Card {
+
+ function getACL() {
+ $acl = parent::getACL();
+ if ($this->getOwner() === 'principals/system/system') {
+ $acl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ];
+ }
+
+ return $acl;
+ }
+
+}
diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php
index b2597baedc6..29b056672b4 100644
--- a/apps/dav/lib/carddav/carddavbackend.php
+++ b/apps/dav/lib/carddav/carddavbackend.php
@@ -22,6 +22,7 @@
namespace OCA\DAV\CardDAV;
+use OCA\DAV\Connector\Sabre\Principal;
use Sabre\CardDAV\Backend\BackendInterface;
use Sabre\CardDAV\Backend\SyncSupport;
use Sabre\CardDAV\Plugin;
@@ -29,8 +30,12 @@ use Sabre\DAV\Exception\BadRequest;
class CardDavBackend implements BackendInterface, SyncSupport {
- public function __construct(\OCP\IDBConnection $db) {
+ /** @var Principal */
+ private $principalBackend;
+
+ public function __construct(\OCP\IDBConnection $db, Principal $principalBackend) {
$this->db = $db;
+ $this->principalBackend = $principalBackend;
}
/**
@@ -73,9 +78,61 @@ class CardDavBackend implements BackendInterface, SyncSupport {
}
$result->closeCursor();
+ // query for shared calendars
+ $query = $this->db->getQueryBuilder();
+ $query2 = $this->db->getQueryBuilder();
+ $query2->select(['resourceid'])
+ ->from('dav_shares')
+ ->where($query2->expr()->eq('principaluri', $query2->createParameter('principaluri')))
+ ->andWhere($query2->expr()->eq('type', $query2->createParameter('type')));
+ $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
+ ->from('addressbooks')
+ ->where($query->expr()->in('id', $query->createFunction($query2->getSQL())))
+ ->setParameter('type', 'addressbook')
+ ->setParameter('principaluri', $principalUri)
+ ->execute();
+
+ while($row = $result->fetch()) {
+ $addressBooks[] = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{DAV:}displayname' => $row['displayname'],
+ '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ ];
+ }
+ $result->closeCursor();
+
return $addressBooks;
}
+ public function getAddressBooksByUri($addressBookUri) {
+ $query = $this->db->getQueryBuilder();
+ $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
+ ->from('addressbooks')
+ ->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri)))
+ ->setMaxResults(1)
+ ->execute();
+
+ $row = $result->fetch();
+ $result->closeCursor();
+ if ($row === false) {
+ return null;
+ }
+
+ return [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{DAV:}displayname' => $row['displayname'],
+ '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ ];
+ }
+
/**
* Updates properties for an address book.
*
@@ -86,7 +143,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $addressBookId
* @param \Sabre\DAV\PropPatch $propPatch
@@ -201,6 +258,11 @@ class CardDavBackend implements BackendInterface, SyncSupport {
->where($query->expr()->eq('id', $query->createParameter('id')))
->setParameter('id', $addressBookId)
->execute();
+
+ $query->delete('dav_shares')
+ ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBookId)))
+ ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook')))
+ ->execute();
}
/**
@@ -281,7 +343,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* If the backend supports this, it may allow for some speed-ups.
*
* @param mixed $addressBookId
- * @param array $uris
+ * @param string[] $uris
* @return array
*/
function getMultipleCards($addressBookId, array $uris) {
@@ -328,7 +390,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* @param mixed $addressBookId
* @param string $cardUri
* @param string $cardData
- * @return string|null
+ * @return string
*/
function createCard($addressBookId, $cardUri, $cardData) {
$etag = md5($cardData);
@@ -373,7 +435,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* @param mixed $addressBookId
* @param string $cardUri
* @param string $cardData
- * @return string|null
+ * @return string
*/
function updateCard($addressBookId, $cardUri, $cardData) {
@@ -561,4 +623,115 @@ class CardDavBackend implements BackendInterface, SyncSupport {
return $cardData;
}
+ /**
+ * @param string $path
+ * @param string[] $add
+ * @param string[] $remove
+ */
+ public function updateShares($path, $add, $remove) {
+ foreach($add as $element) {
+ $this->shareWith($path, $element);
+ }
+ foreach($remove as $element) {
+ $this->unshare($path, $element);
+ }
+ }
+
+ /**
+ * @param string $addressBookUri
+ * @param string $element
+ */
+ private function shareWith($addressBookUri, $element) {
+ $user = $element['href'];
+ $parts = explode(':', $user, 2);
+ if ($parts[0] !== 'principal') {
+ return;
+ }
+ $p = $this->principalBackend->getPrincipalByPath($parts[1]);
+ if (is_null($p)) {
+ return;
+ }
+
+ $addressBook = $this->getAddressBooksByUri($addressBookUri);
+ if (is_null($addressBook)) {
+ return;
+ }
+
+ // remove the share if it already exists
+ $this->unshare($addressBookUri, $element);
+
+ $query = $this->db->getQueryBuilder();
+ $query->insert('dav_shares')
+ ->values([
+ 'principaluri' => $query->createNamedParameter($parts[1]),
+ 'uri' => $query->createNamedParameter($addressBookUri),
+ 'type' => $query->createNamedParameter('addressbook'),
+ 'access' => $query->createNamedParameter(0),
+ 'resourceid' => $query->createNamedParameter($addressBook['id'])
+ ]);
+ $query->execute();
+ }
+
+ /**
+ * @param string $addressBookUri
+ * @param string $element
+ */
+ private function unshare($addressBookUri, $element) {
+ $user = $element['href'];
+ $parts = explode(':', $user, 2);
+ if ($parts[0] !== 'principal') {
+ return;
+ }
+ $p = $this->principalBackend->getPrincipalByPath($parts[1]);
+ if (is_null($p)) {
+ return;
+ }
+
+ $addressBook = $this->getAddressBooksByUri($addressBookUri);
+ if (is_null($addressBook)) {
+ return;
+ }
+
+ $query = $this->db->getQueryBuilder();
+ $query->delete('dav_shares')
+ ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBook['id'])))
+ ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook')))
+ ->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($parts[1])))
+ ;
+ $query->execute();
+ }
+
+ /**
+ * Returns the list of people whom this address book is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ public function getShares($addressBookUri) {
+ $query = $this->db->getQueryBuilder();
+ $result = $query->select(['principaluri', 'access'])
+ ->from('dav_shares')
+ ->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri)))
+ ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook')))
+ ->execute();
+
+ $shares = [];
+ while($row = $result->fetch()) {
+ $p = $this->principalBackend->getPrincipalByPath($row['principaluri']);
+ $shares[]= [
+ 'href' => "principal:${p['uri']}",
+ 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '',
+ 'status' => 1,
+ 'readOnly' => ($row['access'] === 1)
+ ];
+ }
+
+ return $shares;
+ }
}
diff --git a/apps/dav/lib/carddav/converter.php b/apps/dav/lib/carddav/converter.php
new file mode 100644
index 00000000000..56b73eba4c0
--- /dev/null
+++ b/apps/dav/lib/carddav/converter.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\CardDAV;
+
+use OCP\IImage;
+use OCP\IUser;
+use Sabre\VObject\Component\VCard;
+use Sabre\VObject\Property\Text;
+
+class Converter {
+
+ /**
+ * @param IUser $user
+ * @return VCard
+ */
+ public function createCardFromUser(IUser $user) {
+
+ $uid = $user->getUID();
+ $displayName = $user->getDisplayName();
+ $displayName = empty($displayName ) ? $uid : $displayName;
+ $emailAddress = $user->getEMailAddress();
+ $cloudId = $user->getCloudId();
+ $image = $user->getAvatarImage(-1);
+
+ $vCard = new VCard();
+ $vCard->add(new Text($vCard, 'UID', $uid));
+ if (!empty($displayName)) {
+ $vCard->add(new Text($vCard, 'FN', $displayName));
+ $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName)));
+ }
+ if (!empty($emailAddress)) {
+ $vCard->add(new Text($vCard, 'EMAIL', $emailAddress, ['TYPE' => 'OTHER']));
+ }
+ if (!empty($cloudId)) {
+ $vCard->add(new Text($vCard, 'CLOUD', $cloudId));
+ }
+ if ($image) {
+ $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
+ }
+ $vCard->validate();
+
+ return $vCard;
+ }
+
+ /**
+ * @param VCard $vCard
+ * @param IUser $user
+ * @return bool
+ */
+ public function updateCard(VCard $vCard, IUser $user) {
+ $uid = $user->getUID();
+ $displayName = $user->getDisplayName();
+ $displayName = empty($displayName ) ? $uid : $displayName;
+ $emailAddress = $user->getEMailAddress();
+ $cloudId = $user->getCloudId();
+ $image = $user->getAvatarImage(-1);
+
+ $updated = false;
+ if($this->propertyNeedsUpdate($vCard, 'FN', $displayName)) {
+ $vCard->FN = new Text($vCard, 'FN', $displayName);
+ unset($vCard->N);
+ $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName)));
+ $updated = true;
+ }
+ if($this->propertyNeedsUpdate($vCard, 'EMAIL', $emailAddress)) {
+ $vCard->EMAIL = new Text($vCard, 'EMAIL', $emailAddress);
+ $updated = true;
+ }
+ if($this->propertyNeedsUpdate($vCard, 'CLOUD', $cloudId)) {
+ $vCard->CLOUD = new Text($vCard, 'CLOUD', $cloudId);
+ $updated = true;
+ }
+
+ if($this->propertyNeedsUpdate($vCard, 'PHOTO', $image)) {
+ $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
+ $updated = true;
+ }
+
+ if (empty($emailAddress) && !is_null($vCard->EMAIL)) {
+ unset($vCard->EMAIL);
+ $updated = true;
+ }
+ if (empty($cloudId) && !is_null($vCard->CLOUD)) {
+ unset($vCard->CLOUD);
+ $updated = true;
+ }
+ if (empty($image) && !is_null($vCard->PHOTO)) {
+ unset($vCard->PHOTO);
+ $updated = true;
+ }
+
+ return $updated;
+ }
+
+ /**
+ * @param VCard $vCard
+ * @param string $name
+ * @param string|IImage $newValue
+ * @return bool
+ */
+ private function propertyNeedsUpdate(VCard $vCard, $name, $newValue) {
+ if (is_null($newValue)) {
+ return false;
+ }
+ $value = $vCard->__get($name);
+ if (!is_null($value)) {
+ $value = $value->getValue();
+ $newValue = $newValue instanceof IImage ? $newValue->data() : $newValue;
+
+ return $value !== $newValue;
+ }
+ return true;
+ }
+
+ /**
+ * @param string $fullName
+ * @return string[]
+ */
+ public function splitFullName($fullName) {
+ // Very basic western style parsing. I'm not gonna implement
+ // https://github.com/android/platform_packages_providers_contactsprovider/blob/master/src/com/android/providers/contacts/NameSplitter.java ;)
+
+ $elements = explode(' ', $fullName);
+ $result = ['', '', '', '', ''];
+ if (count($elements) > 2) {
+ $result[0] = implode(' ', array_slice($elements, count($elements)-1));
+ $result[1] = $elements[0];
+ $result[2] = implode(' ', array_slice($elements, 1, count($elements)-2));
+ } elseif (count($elements) === 2) {
+ $result[0] = $elements[1];
+ $result[1] = $elements[0];
+ } else {
+ $result[0] = $elements[0];
+ }
+
+ return $result;
+ }
+
+}
diff --git a/apps/dav/lib/carddav/plugin.php b/apps/dav/lib/carddav/plugin.php
new file mode 100644
index 00000000000..f2b3dcbfda9
--- /dev/null
+++ b/apps/dav/lib/carddav/plugin.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\CardDAV;
+
+use Sabre\HTTP\URLUtil;
+
+class Plugin extends \Sabre\CardDAV\Plugin {
+
+ /**
+ * Returns the addressbook home for a given principal
+ *
+ * @param string $principal
+ * @return string
+ */
+ protected function getAddressbookHomeForPrincipal($principal) {
+
+ if (strrpos($principal, 'principals/users', -strlen($principal)) !== FALSE) {
+ list(, $principalId) = URLUtil::splitPath($principal);
+ return self::ADDRESSBOOK_ROOT . '/users/' . $principalId;
+ }
+ if (strrpos($principal, 'principals/system', -strlen($principal)) !== FALSE) {
+ list(, $principalId) = URLUtil::splitPath($principal);
+ return self::ADDRESSBOOK_ROOT . '/system/' . $principalId;
+ }
+
+ throw new \LogicException('This is not supposed to happen');
+ }
+}
diff --git a/apps/dav/lib/carddav/sharing/ishareableaddressbook.php b/apps/dav/lib/carddav/sharing/ishareableaddressbook.php
new file mode 100644
index 00000000000..856a9ed18e6
--- /dev/null
+++ b/apps/dav/lib/carddav/sharing/ishareableaddressbook.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace OCA\DAV\CardDAV\Sharing;
+use Sabre\CardDAV\IAddressBook;
+
+/**
+ * This interface represents a Calendar that can be shared with other users.
+ *
+ */
+interface IShareableAddressBook extends IAddressBook {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * addressbook.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ function updateShares(array $add, array $remove);
+
+ /**
+ * Returns the list of people whom this addressbook is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ function getShares();
+
+} \ No newline at end of file
diff --git a/apps/dav/lib/carddav/sharing/plugin.php b/apps/dav/lib/carddav/sharing/plugin.php
new file mode 100644
index 00000000000..99c6f8f912c
--- /dev/null
+++ b/apps/dav/lib/carddav/sharing/plugin.php
@@ -0,0 +1,218 @@
+<?php
+
+namespace OCA\DAV\CardDAV\Sharing;
+
+use OCA\DAV\Connector\Sabre\Auth;
+use OCP\IRequest;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Server;
+use Sabre\DAV\ServerPlugin;
+use Sabre\DAV\XMLUtil;
+use Sabre\HTTP\RequestInterface;
+use Sabre\HTTP\ResponseInterface;
+
+class Plugin extends ServerPlugin {
+
+ public function __construct(Auth $authBackEnd, IRequest $request) {
+ $this->auth = $authBackEnd;
+ $this->request = $request;
+ }
+
+ /**
+ * Reference to SabreDAV server object.
+ *
+ * @var \Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * This method should return a list of server-features.
+ *
+ * This is for example 'versioning' and is added to the DAV: header
+ * in an OPTIONS response.
+ *
+ * @return string[]
+ */
+ function getFeatures() {
+
+ return ['oc-addressbook-sharing'];
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ function getPluginName() {
+
+ return 'carddav-sharing';
+
+ }
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param Server $server
+ * @return void
+ */
+ function initialize(Server $server) {
+ $this->server = $server;
+ $server->resourceTypeMapping['OCA\\DAV\CardDAV\\ISharedAddressbook'] = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}shared';
+
+ $this->server->on('method:POST', [$this, 'httpPost']);
+ }
+
+ /**
+ * We intercept this to handle POST requests on calendars.
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return null|false
+ */
+ function httpPost(RequestInterface $request, ResponseInterface $response) {
+
+ $path = $request->getPath();
+
+ // Only handling xml
+ $contentType = $request->getHeader('Content-Type');
+ if (strpos($contentType, 'application/xml') === false && strpos($contentType, 'text/xml') === false)
+ return;
+
+ // Making sure the node exists
+ try {
+ $node = $this->server->tree->getNodeForPath($path);
+ } catch (NotFound $e) {
+ return;
+ }
+
+ // CSRF protection
+ $this->protectAgainstCSRF();
+
+ $requestBody = $request->getBodyAsString();
+
+ // If this request handler could not deal with this POST request, it
+ // will return 'null' and other plugins get a chance to handle the
+ // request.
+ //
+ // However, we already requested the full body. This is a problem,
+ // because a body can only be read once. This is why we preemptively
+ // re-populated the request body with the existing data.
+ $request->setBody($requestBody);
+
+ $dom = XMLUtil::loadDOMDocument($requestBody);
+
+ $documentType = XMLUtil::toClarkNotation($dom->firstChild);
+
+ switch ($documentType) {
+
+ // Dealing with the 'share' document, which modified invitees on a
+ // calendar.
+ case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}share' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableAddressBook) {
+ return;
+ }
+
+ $this->server->transactionType = 'post-calendar-share';
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($path, '{DAV:}write');
+ }
+
+ $mutations = $this->parseShareRequest($dom);
+
+ $node->updateShares($mutations[0], $mutations[1]);
+
+ $response->setStatus(200);
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $response->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+ }
+ }
+
+ /**
+ * Parses the 'share' POST request.
+ *
+ * This method returns an array, containing two arrays.
+ * The first array is a list of new sharees. Every element is a struct
+ * containing a:
+ * * href element. (usually a mailto: address)
+ * * commonName element (often a first and lastname, but can also be
+ * false)
+ * * readOnly (true or false)
+ * * summary (A description of the share, can also be false)
+ *
+ * The second array is a list of sharees that are to be removed. This is
+ * just a simple array with 'hrefs'.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ function parseShareRequest(\DOMDocument $dom) {
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNamespace('cs', \Sabre\CardDAV\Plugin::NS_CARDDAV);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $set = [];
+ $elems = $xpath->query('cs:set');
+
+ for ($i = 0; $i < $elems->length; $i++) {
+
+ $xset = $elems->item($i);
+ $set[] = [
+ 'href' => $xpath->evaluate('string(d:href)', $xset),
+ 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset),
+ 'summary' => $xpath->evaluate('string(cs:summary)', $xset),
+ 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset) !== false
+ ];
+
+ }
+
+ $remove = [];
+ $elems = $xpath->query('cs:remove');
+
+ for ($i = 0; $i < $elems->length; $i++) {
+
+ $xremove = $elems->item($i);
+ $remove[] = $xpath->evaluate('string(d:href)', $xremove);
+
+ }
+
+ return [$set, $remove];
+
+ }
+
+ private function protectAgainstCSRF() {
+ $user = $this->auth->getCurrentUser();
+ if ($this->auth->isDavAuthenticated($user)) {
+ return true;
+ }
+
+ if ($this->request->passesCSRFCheck()) {
+ return true;
+ }
+
+ throw new BadRequest();
+ }
+
+
+}
diff --git a/apps/dav/lib/carddav/useraddressbooks.php b/apps/dav/lib/carddav/useraddressbooks.php
new file mode 100644
index 00000000000..093cee0e1b2
--- /dev/null
+++ b/apps/dav/lib/carddav/useraddressbooks.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace OCA\DAV\CardDAV;
+
+class UserAddressBooks extends \Sabre\CardDAV\AddressBookHome {
+
+ /**
+ * Returns a list of addressbooks
+ *
+ * @return array
+ */
+ function getChildren() {
+
+ $addressBooks = $this->carddavBackend->getAddressBooksForUser($this->principalUri);
+ $objects = [];
+ foreach($addressBooks as $addressBook) {
+ $objects[] = new AddressBook($this->carddavBackend, $addressBook);
+ }
+ return $objects;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ function getACL() {
+
+ $acl = parent::getACL();
+ if ($this->principalUri === 'principals/system/system') {
+ $acl[] = [
+ 'privilege' => '{DAV:}read',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ];
+ }
+
+ return $acl;
+ }
+
+}
diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php
index 39a7df31b7f..4f319770234 100644
--- a/apps/dav/lib/connector/sabre/auth.php
+++ b/apps/dav/lib/connector/sabre/auth.php
@@ -35,6 +35,8 @@ use OCP\IUserSession;
use Sabre\DAV\Auth\Backend\AbstractBasic;
use Sabre\DAV\Exception\NotAuthenticated;
use Sabre\DAV\Exception\ServiceUnavailable;
+use Sabre\HTTP\RequestInterface;
+use Sabre\HTTP\ResponseInterface;
class Auth extends AbstractBasic {
const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND';
@@ -52,6 +54,7 @@ class Auth extends AbstractBasic {
IUserSession $userSession) {
$this->session = $session;
$this->userSession = $userSession;
+ $this->principalPrefix = 'principals/users/';
}
/**
@@ -65,7 +68,7 @@ class Auth extends AbstractBasic {
* @param string $username
* @return bool
*/
- protected function isDavAuthenticated($username) {
+ public function isDavAuthenticated($username) {
return !is_null($this->session->get(self::DAV_AUTHENTICATED)) &&
$this->session->get(self::DAV_AUTHENTICATED) === $username;
}
@@ -122,22 +125,15 @@ class Auth extends AbstractBasic {
}
/**
- * Override function here. We want to cache authentication cookies
- * in the syncing client to avoid HTTP-401 roundtrips.
- * If the sync client supplies the cookies, then OC_User::isLoggedIn()
- * will return true and we can see this WebDAV request as already authenticated,
- * even if there are no HTTP Basic Auth headers.
- * In other case, just fallback to the parent implementation.
- *
- * @param \Sabre\DAV\Server $server
- * @param string $realm
- * @return bool
- * @throws ServiceUnavailable
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return array
* @throws NotAuthenticated
+ * @throws ServiceUnavailable
*/
- public function authenticate(\Sabre\DAV\Server $server, $realm) {
+ function check(RequestInterface $request, ResponseInterface $response) {
try {
- $result = $this->auth($server, $realm);
+ $result = $this->auth($request, $response);
return $result;
} catch (NotAuthenticated $e) {
throw $e;
@@ -149,11 +145,11 @@ class Auth extends AbstractBasic {
}
/**
- * @param \Sabre\DAV\Server $server
- * @param $realm
- * @return bool
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return array
*/
- private function auth(\Sabre\DAV\Server $server, $realm) {
+ private function auth(RequestInterface $request, ResponseInterface $response) {
if (\OC_User::handleApacheAuth() ||
($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED)))
) {
@@ -161,9 +157,16 @@ class Auth extends AbstractBasic {
\OC_Util::setupFS($user);
$this->currentUser = $user;
$this->session->close();
- return true;
+ return [true, $this->principalPrefix . $user];
+ }
+
+ if (!$this->userSession->isLoggedIn() && $request->getHeader('X-Requested-With') === 'XMLHttpRequest') {
+ // do not re-authenticate over ajax, use dummy auth name to prevent browser popup
+ $response->addHeader('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"');
+ $response->setStatus(401);
+ throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
}
- return parent::authenticate($server, $realm);
+ return parent::check($request, $response);
}
}
diff --git a/apps/dav/lib/connector/sabre/directory.php b/apps/dav/lib/connector/sabre/directory.php
index 8c736ea0108..b602dd2f7b1 100644
--- a/apps/dav/lib/connector/sabre/directory.php
+++ b/apps/dav/lib/connector/sabre/directory.php
@@ -28,8 +28,10 @@
*/
namespace OCA\DAV\Connector\Sabre;
+use OCA\DAV\Connector\Sabre\Exception\Forbidden;
use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
use OCA\DAV\Connector\Sabre\Exception\FileLocked;
+use OCP\Files\ForbiddenException;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
use Sabre\DAV\Exception\Locked;
@@ -117,6 +119,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
} catch (\OCP\Files\InvalidPathException $ex) {
throw new InvalidPath($ex->getMessage());
+ } catch (ForbiddenException $ex) {
+ throw new Forbidden($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
@@ -146,6 +150,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
} catch (\OCP\Files\InvalidPathException $ex) {
throw new InvalidPath($ex->getMessage());
+ } catch (ForbiddenException $ex) {
+ throw new Forbidden($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
@@ -247,6 +253,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node
// assume it wasn't possible to remove due to permission issue
throw new \Sabre\DAV\Exception\Forbidden();
}
+ } catch (ForbiddenException $ex) {
+ throw new Forbidden($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
diff --git a/apps/dav/lib/connector/sabre/exception/forbidden.php b/apps/dav/lib/connector/sabre/exception/forbidden.php
new file mode 100644
index 00000000000..673958349f3
--- /dev/null
+++ b/apps/dav/lib/connector/sabre/exception/forbidden.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Connector\Sabre\Exception;
+
+class Forbidden extends \Sabre\DAV\Exception\Forbidden {
+
+ const NS_OWNCLOUD = 'http://owncloud.org/ns';
+
+ /**
+ * @var bool
+ */
+ private $retry;
+
+ /**
+ * @param string $message
+ * @param bool $retry
+ * @param \Exception $previous
+ */
+ public function __construct($message, $retry = false, \Exception $previous = null) {
+ parent::__construct($message, 0, $previous);
+ $this->retry = $retry;
+ }
+
+ /**
+ * This method allows the exception to include additional information
+ * into the WebDAV error response
+ *
+ * @param \Sabre\DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
+
+ // set ownCloud namespace
+ $errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
+
+ // adding the retry node
+ $error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
+ $errorNode->appendChild($error);
+
+ // adding the message node
+ $error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
+ $errorNode->appendChild($error);
+ }
+}
diff --git a/apps/dav/lib/connector/sabre/fakelockerplugin.php b/apps/dav/lib/connector/sabre/fakelockerplugin.php
new file mode 100644
index 00000000000..b75e7f137d8
--- /dev/null
+++ b/apps/dav/lib/connector/sabre/fakelockerplugin.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Connector\Sabre;
+
+use Sabre\DAV\Locks\LockInfo;
+use Sabre\DAV\ServerPlugin;
+use Sabre\DAV\Xml\Property\LockDiscovery;
+use Sabre\DAV\Xml\Property\SupportedLock;
+use Sabre\HTTP\RequestInterface;
+use Sabre\HTTP\ResponseInterface;
+use Sabre\DAV\PropFind;
+use Sabre\DAV\INode;
+
+/**
+ * Class FakeLockerPlugin is a plugin only used when connections come in from
+ * OS X via Finder. The fake locking plugin does emulate Class 2 WebDAV support
+ * (locking of files) which allows Finder to access the storage in write mode as
+ * well.
+ *
+ * No real locking is performed, instead the plugin just returns always positive
+ * responses.
+ *
+ * @see https://github.com/owncloud/core/issues/17732
+ * @package OCA\DAV\Connector\Sabre
+ */
+class FakeLockerPlugin extends ServerPlugin {
+ /** @var \Sabre\DAV\Server */
+ private $server;
+
+ /** {@inheritDoc} */
+ public function initialize(\Sabre\DAV\Server $server) {
+ $this->server = $server;
+ $this->server->on('method:LOCK', [$this, 'fakeLockProvider'], 1);
+ $this->server->on('method:UNLOCK', [$this, 'fakeUnlockProvider'], 1);
+ $server->on('propFind', [$this, 'propFind']);
+ $server->on('validateTokens', [$this, 'validateTokens']);
+ }
+
+ /**
+ * Indicate that we support LOCK and UNLOCK
+ *
+ * @param string $path
+ * @return string[]
+ */
+ public function getHTTPMethods($path) {
+ return [
+ 'LOCK',
+ 'UNLOCK',
+ ];
+ }
+
+ /**
+ * Indicate that we support locking
+ *
+ * @return integer[]
+ */
+ function getFeatures() {
+ return [2];
+ }
+
+ /**
+ * Return some dummy response for PROPFIND requests with regard to locking
+ *
+ * @param PropFind $propFind
+ * @param INode $node
+ * @return void
+ */
+ function propFind(PropFind $propFind, INode $node) {
+ $propFind->handle('{DAV:}supportedlock', function() {
+ return new SupportedLock(true);
+ });
+ $propFind->handle('{DAV:}lockdiscovery', function() use ($propFind) {
+ return new LockDiscovery([]);
+ });
+ }
+
+ /**
+ * Mark a locking token always as valid
+ *
+ * @param RequestInterface $request
+ * @param array $conditions
+ */
+ public function validateTokens(RequestInterface $request, &$conditions) {
+ foreach($conditions as &$fileCondition) {
+ if(isset($fileCondition['tokens'])) {
+ foreach($fileCondition['tokens'] as &$token) {
+ if(isset($token['token'])) {
+ if(substr($token['token'], 0, 16) === 'opaquelocktoken:') {
+ $token['validToken'] = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Fakes a successful LOCK
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool
+ */
+ public function fakeLockProvider(RequestInterface $request,
+ ResponseInterface $response) {
+
+ $lockInfo = new LockInfo();
+ $lockInfo->token = md5($request->getPath());
+ $lockInfo->uri = $request->getPath();
+ $lockInfo->depth = \Sabre\DAV\Server::DEPTH_INFINITY;
+ $lockInfo->timeout = 1800;
+
+ $body = $this->server->xml->write('{DAV:}prop', [
+ '{DAV:}lockdiscovery' =>
+ new LockDiscovery([$lockInfo])
+ ]);
+
+ $response->setBody($body);
+
+ return false;
+ }
+
+ /**
+ * Fakes a successful LOCK
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool
+ */
+ public function fakeUnlockProvider(RequestInterface $request,
+ ResponseInterface $response) {
+ $response->setStatus(204);
+ $response->setHeader('Content-Length', '0');
+ return false;
+ }
+}
diff --git a/apps/dav/lib/connector/sabre/file.php b/apps/dav/lib/connector/sabre/file.php
index 961532daf50..c66f627c0a3 100644
--- a/apps/dav/lib/connector/sabre/file.php
+++ b/apps/dav/lib/connector/sabre/file.php
@@ -35,9 +35,11 @@ namespace OCA\DAV\Connector\Sabre;
use OC\Files\Filesystem;
use OCA\DAV\Connector\Sabre\Exception\EntityTooLarge;
use OCA\DAV\Connector\Sabre\Exception\FileLocked;
+use OCA\DAV\Connector\Sabre\Exception\Forbidden as DAVForbiddenException;
use OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\Files\EntityTooLargeException;
+use OCP\Files\ForbiddenException;
use OCP\Files\InvalidContentException;
use OCP\Files\InvalidPathException;
use OCP\Files\LockNotAcquiredException;
@@ -175,6 +177,8 @@ class File extends Node implements IFile {
\OCP\Util::writeLog('webdav', 'renaming part file to final file failed', \OCP\Util::ERROR);
throw new Exception('Could not rename part file to final file');
}
+ } catch (ForbiddenException $ex) {
+ throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry());
} catch (\Exception $e) {
$partStorage->unlink($internalPartPath);
$this->convertToSabreException($e);
@@ -188,7 +192,7 @@ class File extends Node implements IFile {
}
// since we skipped the view we need to scan and emit the hooks ourselves
- $this->fileView->getUpdater()->update($this->path);
+ $storage->getUpdater()->update($internalPath);
if ($view) {
$this->emitPostHooks($exists);
@@ -209,6 +213,9 @@ class File extends Node implements IFile {
return '"' . $this->info->getEtag() . '"';
}
+ /**
+ * @param string $path
+ */
private function emitPreHooks($exists, $path = null) {
if (is_null($path)) {
$path = $this->path;
@@ -234,6 +241,9 @@ class File extends Node implements IFile {
return $run;
}
+ /**
+ * @param string $path
+ */
private function emitPostHooks($exists, $path = null) {
if (is_null($path)) {
$path = $this->path;
@@ -256,7 +266,7 @@ class File extends Node implements IFile {
/**
* Returns the data
*
- * @return string|resource
+ * @return resource
* @throws Forbidden
* @throws ServiceUnavailable
*/
@@ -273,6 +283,8 @@ class File extends Node implements IFile {
throw new ServiceUnavailable("Encryption not ready: " . $e->getMessage());
} catch (StorageNotAvailableException $e) {
throw new ServiceUnavailable("Failed to open file: " . $e->getMessage());
+ } catch (ForbiddenException $ex) {
+ throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
@@ -296,6 +308,8 @@ class File extends Node implements IFile {
}
} catch (StorageNotAvailableException $e) {
throw new ServiceUnavailable("Failed to unlink: " . $e->getMessage());
+ } catch (ForbiddenException $ex) {
+ throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
@@ -306,7 +320,7 @@ class File extends Node implements IFile {
*
* If null is returned, we'll assume application/octet-stream
*
- * @return mixed
+ * @return string
*/
public function getContentType() {
$mimeType = $this->info->getMimetype();
@@ -424,7 +438,7 @@ class File extends Node implements IFile {
$this->fileView->changeLock($targetPath, ILockingProvider::LOCK_SHARED);
// since we skipped the view we need to scan and emit the hooks ourselves
- $this->fileView->getUpdater()->update($targetPath);
+ $targetStorage->getUpdater()->update($targetInternalPath);
$this->emitPostHooks($exists, $targetPath);
@@ -474,6 +488,10 @@ class File extends Node implements IFile {
// a more general case - due to whatever reason the content could not be written
throw new Forbidden($e->getMessage(), 0, $e);
}
+ if ($e instanceof ForbiddenException) {
+ // the path for the file was forbidden
+ throw new DAVForbiddenException($e->getMessage(), $e->getRetry(), $e);
+ }
if ($e instanceof EntityTooLargeException) {
// the file is too big to be stored
throw new EntityTooLarge($e->getMessage(), 0, $e);
diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php
index 61b5360cac1..e85a67a8759 100644
--- a/apps/dav/lib/connector/sabre/filesplugin.php
+++ b/apps/dav/lib/connector/sabre/filesplugin.php
@@ -37,11 +37,14 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
// namespace
const NS_OWNCLOUD = 'http://owncloud.org/ns';
const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id';
+ const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid';
const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions';
const DOWNLOADURL_PROPERTYNAME = '{http://owncloud.org/ns}downloadURL';
const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size';
const GETETAG_PROPERTYNAME = '{DAV:}getetag';
const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
+ const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
+ const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
/**
* Reference to main server object
@@ -96,9 +99,12 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$server->xmlNamespaces[self::NS_OWNCLOUD] = 'oc';
$server->protectedProperties[] = self::FILEID_PROPERTYNAME;
+ $server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME;
$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
$server->protectedProperties[] = self::SIZE_PROPERTYNAME;
$server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME;
+ $server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
+ $server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
$allowedProperties = ['{DAV:}getetag'];
@@ -110,6 +116,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$this->server->on('afterBind', array($this, 'sendFileIdHeader'));
$this->server->on('afterWriteContent', array($this, 'sendFileIdHeader'));
$this->server->on('afterMethod:GET', [$this,'httpGet']);
+ $this->server->on('afterMethod:GET', array($this, 'handleDownloadToken'));
$this->server->on('afterResponse', function($request, ResponseInterface $response) {
$body = $response->getBody();
if (is_resource($body)) {
@@ -143,6 +150,32 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
}
/**
+ * This sets a cookie to be able to recognize the start of the download
+ * the content must not be longer than 32 characters and must only contain
+ * alphanumeric characters
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ */
+ function handleDownloadToken(RequestInterface $request, ResponseInterface $response) {
+ $queryParams = $request->getQueryParameters();
+
+ /**
+ * this sets a cookie to be able to recognize the start of the download
+ * the content must not be longer than 32 characters and must only contain
+ * alphanumeric characters
+ */
+ if (isset($queryParams['downloadStartSecret'])) {
+ $token = $queryParams['downloadStartSecret'];
+ if (!isset($token[32])
+ && preg_match('!^[a-zA-Z0-9]+$!', $token) === 1) {
+ // FIXME: use $response->setHeader() instead
+ setcookie('ocDownloadStarted', $token, time() + 20, '/');
+ }
+ }
+ }
+
+ /**
* Plugin that adds a 'Content-Disposition: attachment' header to all files
* delivered by SabreDAV.
* @param RequestInterface $request
@@ -171,6 +204,10 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
return $node->getFileId();
});
+ $propFind->handle(self::INTERNAL_FILEID_PROPERTYNAME, function() use ($node) {
+ return $node->getInternalFileId();
+ });
+
$propFind->handle(self::PERMISSIONS_PROPERTYNAME, function() use ($node) {
$perms = $node->getDavPermissions();
if ($this->isPublic) {
@@ -201,6 +238,16 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
return $node->getSize();
});
}
+
+ $propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) {
+ $owner = $node->getOwner();
+ return $owner->getUID();
+ });
+ $propFind->handle(self::OWNER_DISPLAY_NAME_PROPERTYNAME, function() use ($node) {
+ $owner = $node->getOwner();
+ $displayName = $owner->getDisplayName();
+ return $displayName;
+ });
}
/**
diff --git a/apps/dav/lib/connector/sabre/lockplugin.php b/apps/dav/lib/connector/sabre/lockplugin.php
index 5840e59854c..d770b141eb9 100644
--- a/apps/dav/lib/connector/sabre/lockplugin.php
+++ b/apps/dav/lib/connector/sabre/lockplugin.php
@@ -27,7 +27,6 @@ use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\ServerPlugin;
-use Sabre\DAV\Tree;
use Sabre\HTTP\RequestInterface;
class LockPlugin extends ServerPlugin {
@@ -39,18 +38,6 @@ class LockPlugin extends ServerPlugin {
private $server;
/**
- * @var \Sabre\DAV\Tree
- */
- private $tree;
-
- /**
- * @param \Sabre\DAV\Tree $tree tree
- */
- public function __construct(Tree $tree) {
- $this->tree = $tree;
- }
-
- /**
* {@inheritdoc}
*/
public function initialize(\Sabre\DAV\Server $server) {
@@ -66,7 +53,7 @@ class LockPlugin extends ServerPlugin {
return;
}
try {
- $node = $this->tree->getNodeForPath($request->getPath());
+ $node = $this->server->tree->getNodeForPath($request->getPath());
} catch (NotFound $e) {
return;
}
@@ -84,7 +71,7 @@ class LockPlugin extends ServerPlugin {
return;
}
try {
- $node = $this->tree->getNodeForPath($request->getPath());
+ $node = $this->server->tree->getNodeForPath($request->getPath());
} catch (NotFound $e) {
return;
}
diff --git a/apps/dav/lib/connector/sabre/node.php b/apps/dav/lib/connector/sabre/node.php
index 814aaceb077..c4e0614077f 100644
--- a/apps/dav/lib/connector/sabre/node.php
+++ b/apps/dav/lib/connector/sabre/node.php
@@ -178,7 +178,7 @@ abstract class Node implements \Sabre\DAV\INode {
/**
* Returns the size of the node, in bytes
*
- * @return int|float
+ * @return integer
*/
public function getSize() {
return $this->info->getSize();
@@ -207,7 +207,14 @@ abstract class Node implements \Sabre\DAV\INode {
}
/**
- * @return string|null
+ * @return integer
+ */
+ public function getInternalFileId() {
+ return $this->info->getId();
+ }
+
+ /**
+ * @return string
*/
public function getDavPermissions() {
$p = '';
@@ -238,6 +245,10 @@ abstract class Node implements \Sabre\DAV\INode {
return $p;
}
+ public function getOwner() {
+ return $this->info->getOwner();
+ }
+
protected function verifyPath() {
try {
$fileName = basename($this->info->getPath());
diff --git a/apps/dav/lib/connector/sabre/objecttree.php b/apps/dav/lib/connector/sabre/objecttree.php
index 80c0ef74610..2e9c1b9916c 100644
--- a/apps/dav/lib/connector/sabre/objecttree.php
+++ b/apps/dav/lib/connector/sabre/objecttree.php
@@ -25,10 +25,12 @@
namespace OCA\DAV\Connector\Sabre;
+use OCA\DAV\Connector\Sabre\Exception\Forbidden;
use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
use OCA\DAV\Connector\Sabre\Exception\FileLocked;
use OC\Files\FileInfo;
use OC\Files\Mount\MoveableMount;
+use OCP\Files\ForbiddenException;
use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
use OCP\Lock\LockedException;
@@ -235,6 +237,8 @@ class ObjectTree extends \Sabre\DAV\Tree {
}
} catch (StorageNotAvailableException $e) {
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
+ } catch (ForbiddenException $ex) {
+ throw new Forbidden($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
@@ -274,6 +278,8 @@ class ObjectTree extends \Sabre\DAV\Tree {
$this->fileView->copy($source, $destination);
} catch (StorageNotAvailableException $e) {
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
+ } catch (ForbiddenException $ex) {
+ throw new Forbidden($ex->getMessage(), $ex->getRetry());
} catch (LockedException $e) {
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php
index 35215e1f63c..cc9c1c40d59 100644
--- a/apps/dav/lib/connector/sabre/principal.php
+++ b/apps/dav/lib/connector/sabre/principal.php
@@ -30,9 +30,11 @@
namespace OCA\DAV\Connector\Sabre;
+use OCP\IUser;
use OCP\IUserManager;
use OCP\IConfig;
use \Sabre\DAV\PropPatch;
+use Sabre\HTTP\URLUtil;
class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
/** @var IConfig */
@@ -66,20 +68,9 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
public function getPrincipalsByPrefix($prefixPath) {
$principals = [];
- if ($prefixPath === 'principals') {
+ if ($prefixPath === 'principals/users') {
foreach($this->userManager->search('') as $user) {
-
- $principal = [
- 'uri' => 'principals/' . $user->getUID(),
- '{DAV:}displayname' => $user->getUID(),
- ];
-
- $email = $this->config->getUserValue($user->getUID(), 'settings', 'email');
- if(!empty($email)) {
- $principal['{http://sabredav.org/ns}email-address'] = $email;
- }
-
- $principals[] = $principal;
+ $principals[] = $this->userToPrincipal($user);
}
}
@@ -95,21 +86,18 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
* @return array
*/
public function getPrincipalByPath($path) {
- list($prefix, $name) = explode('/', $path);
+ $elements = explode('/', $path);
+ if ($elements[0] !== 'principals') {
+ return null;
+ }
+ if ($elements[1] !== 'users') {
+ return null;
+ }
+ $name = $elements[2];
$user = $this->userManager->get($name);
- if ($prefix === 'principals' && !is_null($user)) {
- $principal = [
- 'uri' => 'principals/' . $user->getUID(),
- '{DAV:}displayname' => $user->getUID(),
- ];
-
- $email = $this->config->getUserValue($user->getUID(), 'settings', 'email');
- if($email) {
- $principal['{http://sabredav.org/ns}email-address'] = $email;
- }
-
- return $principal;
+ if (!is_null($user)) {
+ return $this->userToPrincipal($user);
}
return null;
@@ -140,10 +128,10 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
* @throws \Sabre\DAV\Exception
*/
public function getGroupMembership($principal) {
- list($prefix, $name) = \Sabre\HTTP\URLUtil::splitPath($principal);
+ list($prefix, $name) = URLUtil::splitPath($principal);
$group_membership = array();
- if ($prefix === 'principals') {
+ if ($prefix === 'principals/users') {
$principal = $this->getPrincipalByPath($principal);
if (!$principal) {
throw new \Sabre\DAV\Exception('Principal not found');
@@ -151,8 +139,8 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
// TODO: for now the user principal has only its own groups
return array(
- 'principals/'.$name.'/calendar-proxy-read',
- 'principals/'.$name.'/calendar-proxy-write',
+ 'principals/users/'.$name.'/calendar-proxy-read',
+ 'principals/users/'.$name.'/calendar-proxy-write',
// The addressbook groups are not supported in Sabre,
// see http://groups.google.com/group/sabredav-discuss/browse_thread/thread/ef2fa9759d55f8c#msg_5720afc11602e753
//'principals/'.$name.'/addressbook-proxy-read',
@@ -168,7 +156,7 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
* The principals should be passed as a list of uri's.
*
* @param string $principal
- * @param array $members
+ * @param string[] $members
* @throws \Sabre\DAV\Exception
*/
public function setGroupMemberSet($principal, array $members) {
@@ -202,4 +190,24 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface {
function findByUri($uri, $principalPrefix) {
return '';
}
+
+ /**
+ * @param IUser $user
+ * @return array
+ */
+ protected function userToPrincipal($user) {
+ $userId = $user->getUID();
+ $displayName = $user->getDisplayName();
+ $principal = [
+ 'uri' => "principals/users/$userId",
+ '{DAV:}displayname' => is_null($displayName) ? $userId : $displayName,
+ ];
+
+ $email = $user->getEMailAddress();
+ if (!empty($email)) {
+ $principal['{http://sabredav.org/ns}email-address'] = $email;
+ return $principal;
+ }
+ return $principal;
+ }
}
diff --git a/apps/dav/lib/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php
index f67e949e802..0f0377e96bd 100644
--- a/apps/dav/lib/connector/sabre/serverfactory.php
+++ b/apps/dav/lib/connector/sabre/serverfactory.php
@@ -26,12 +26,41 @@ use OCP\Files\Mount\IMountManager;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\ILogger;
+use OCP\IRequest;
use OCP\ITagManager;
use OCP\IUserSession;
use Sabre\DAV\Auth\Backend\BackendInterface;
+use Sabre\DAV\Locks\Plugin;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class ServerFactory {
+ /** @var IConfig */
+ private $config;
+ /** @var ILogger */
+ private $logger;
+ /** @var IDBConnection */
+ private $databaseConnection;
+ /** @var IUserSession */
+ private $userSession;
+ /** @var IMountManager */
+ private $mountManager;
+ /** @var ITagManager */
+ private $tagManager;
+ /** @var EventDispatcherInterface */
+ private $dispatcher;
+ /** @var IRequest */
+ private $request;
+
+ /**
+ * @param IConfig $config
+ * @param ILogger $logger
+ * @param IDBConnection $databaseConnection
+ * @param IUserSession $userSession
+ * @param IMountManager $mountManager
+ * @param ITagManager $tagManager
+ * @param EventDispatcherInterface $dispatcher
+ * @param IRequest $request
+ */
public function __construct(
IConfig $config,
ILogger $logger,
@@ -39,7 +68,8 @@ class ServerFactory {
IUserSession $userSession,
IMountManager $mountManager,
ITagManager $tagManager,
- EventDispatcherInterface $dispatcher
+ EventDispatcherInterface $dispatcher,
+ IRequest $request
) {
$this->config = $config;
$this->logger = $logger;
@@ -48,6 +78,7 @@ class ServerFactory {
$this->mountManager = $mountManager;
$this->tagManager = $tagManager;
$this->dispatcher = $dispatcher;
+ $this->request = $request;
}
/**
@@ -57,7 +88,10 @@ class ServerFactory {
* @param callable $viewCallBack callback that should return the view for the dav endpoint
* @return Server
*/
- public function createServer($baseUri, $requestUri, BackendInterface $authBackend, callable $viewCallBack) {
+ public function createServer($baseUri,
+ $requestUri,
+ BackendInterface $authBackend,
+ callable $viewCallBack) {
// Fire up server
$objectTree = new \OCA\DAV\Connector\Sabre\ObjectTree();
$server = new \OCA\DAV\Connector\Sabre\Server($objectTree);
@@ -73,8 +107,13 @@ class ServerFactory {
// FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
$server->addPlugin(new \OCA\DAV\Connector\Sabre\DummyGetResponsePlugin());
$server->addPlugin(new \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin('webdav', $this->logger));
- $server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin($objectTree));
+ $server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin());
$server->addPlugin(new \OCA\DAV\Connector\Sabre\ListenerPlugin($this->dispatcher));
+ // Finder on OS X requires Class 2 WebDAV support (locking), since we do
+ // not provide locking we emulate it using a fake locking plugin.
+ if($this->request->isUserAgent(['/WebDAVFS/'])) {
+ $server->addPlugin(new \OCA\DAV\Connector\Sabre\FakeLockerPlugin());
+ }
// wait with registering these until auth is handled and the filesystem is setup
$server->on('beforeMethod', function () use ($server, $objectTree, $viewCallBack) {
diff --git a/apps/dav/lib/connector/sabre/taglist.php b/apps/dav/lib/connector/sabre/taglist.php
index 177cc23e805..1b32d4b1047 100644
--- a/apps/dav/lib/connector/sabre/taglist.php
+++ b/apps/dav/lib/connector/sabre/taglist.php
@@ -22,82 +22,100 @@
namespace OCA\DAV\Connector\Sabre;
-use Sabre\DAV;
+use Sabre\Xml\Element;
+use Sabre\Xml\Reader;
+use Sabre\Xml\Writer;
/**
* TagList property
*
* This property contains multiple "tag" elements, each containing a tag name.
*/
-class TagList extends DAV\Property {
+class TagList implements Element {
const NS_OWNCLOUD = 'http://owncloud.org/ns';
- /**
- * tags
- *
- * @var array
- */
- private $tags;
-
- /**
- * @param array $tags
- */
- public function __construct(array $tags) {
- $this->tags = $tags;
- }
-
- /**
- * Returns the tags
- *
- * @return array
- */
- public function getTags() {
-
- return $this->tags;
-
- }
-
- /**
- * Serializes this property.
- *
- * @param DAV\Server $server
- * @param \DOMElement $dom
- * @return void
- */
- public function serialize(DAV\Server $server,\DOMElement $dom) {
-
- $prefix = $server->xmlNamespaces[self::NS_OWNCLOUD];
-
- foreach($this->tags as $tag) {
-
- $elem = $dom->ownerDocument->createElement($prefix . ':tag');
- $elem->appendChild($dom->ownerDocument->createTextNode($tag));
-
- $dom->appendChild($elem);
- }
-
- }
-
- /**
- * Unserializes this property from a DOM Element
- *
- * This method returns an instance of this class.
- * It will only decode tag values.
- *
- * @param \DOMElement $dom
- * @param array $propertyMap
- * @return \OCA\DAV\Connector\Sabre\TagList
- */
- static function unserialize(\DOMElement $dom, array $propertyMap) {
-
- $tags = array();
- foreach($dom->childNodes as $child) {
- if (DAV\XMLUtil::toClarkNotation($child)==='{' . self::NS_OWNCLOUD . '}tag') {
- $tags[] = $child->textContent;
- }
- }
- return new self($tags);
-
- }
-
+ /**
+ * tags
+ *
+ * @var array
+ */
+ private $tags;
+
+ /**
+ * @param array $tags
+ */
+ public function __construct(array $tags) {
+ $this->tags = $tags;
+ }
+
+ /**
+ * Returns the tags
+ *
+ * @return array
+ */
+ public function getTags() {
+
+ return $this->tags;
+
+ }
+
+ /**
+ * The deserialize method is called during xml parsing.
+ *
+ * This method is called statictly, this is because in theory this method
+ * may be used as a type of constructor, or factory method.
+ *
+ * Often you want to return an instance of the current class, but you are
+ * free to return other data as well.
+ *
+ * You are responsible for advancing the reader to the next element. Not
+ * doing anything will result in a never-ending loop.
+ *
+ * If you just want to skip parsing for this element altogether, you can
+ * just call $reader->next();
+ *
+ * $reader->parseInnerTree() will parse the entire sub-tree, and advance to
+ * the next element.
+ *
+ * @param Reader $reader
+ * @return mixed
+ */
+ static function xmlDeserialize(Reader $reader) {
+ $tags = [];
+
+ foreach ($reader->parseInnerTree() as $elem) {
+ if ($elem['name'] === '{' . self::NS_OWNCLOUD . '}tag') {
+ $tags[] = $elem['value'];
+ }
+ }
+ return new self($tags);
+ }
+
+ /**
+ * The xmlSerialize metod is called during xml writing.
+ *
+ * Use the $writer argument to write its own xml serialization.
+ *
+ * An important note: do _not_ create a parent element. Any element
+ * implementing XmlSerializble should only ever write what's considered
+ * its 'inner xml'.
+ *
+ * The parent of the current element is responsible for writing a
+ * containing element.
+ *
+ * This allows serializers to be re-used for different element names.
+ *
+ * If you are opening new elements, you must also close them again.
+ *
+ * @param Writer $writer
+ * @return void
+ */
+ function xmlSerialize(Writer $writer) {
+
+ foreach ($this->tags as $tag) {
+ $writer->startElement(self::NS_OWNCLOUD . ':tag');
+ $writer->writeElement($tag);
+ $writer->endElement();
+ }
+ }
}
diff --git a/apps/dav/lib/dav/systemprincipalbackend.php b/apps/dav/lib/dav/systemprincipalbackend.php
new file mode 100644
index 00000000000..2c2049ace60
--- /dev/null
+++ b/apps/dav/lib/dav/systemprincipalbackend.php
@@ -0,0 +1,183 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\DAV;
+
+use Sabre\DAVACL\PrincipalBackend\AbstractBackend;
+use Sabre\HTTP\URLUtil;
+
+class SystemPrincipalBackend extends AbstractBackend {
+
+ /**
+ * Returns a list of principals based on a prefix.
+ *
+ * This prefix will often contain something like 'principals'. You are only
+ * expected to return principals that are in this base path.
+ *
+ * You are expected to return at least a 'uri' for every user, you can
+ * return any additional properties if you wish so. Common properties are:
+ * {DAV:}displayname
+ * {http://sabredav.org/ns}email-address - This is a custom SabreDAV
+ * field that's actually injected in a number of other properties. If
+ * you have an email address, use this property.
+ *
+ * @param string $prefixPath
+ * @return array
+ */
+ function getPrincipalsByPrefix($prefixPath) {
+ $principals = [];
+
+ if ($prefixPath === 'principals/system') {
+ $principals[] = [
+ 'uri' => 'principals/system/system',
+ '{DAV:}displayname' => 'system',
+ ];
+ }
+
+ return $principals;
+ }
+
+ /**
+ * Returns a specific principal, specified by it's path.
+ * The returned structure should be the exact same as from
+ * getPrincipalsByPrefix.
+ *
+ * @param string $path
+ * @return array
+ */
+ function getPrincipalByPath($path) {
+
+ $elements = explode('/', $path);
+ if ($elements[0] !== 'principals') {
+ return null;
+ }
+ if ($elements[1] === 'system') {
+ $principal = [
+ 'uri' => 'principals/system/system',
+ '{DAV:}displayname' => 'system',
+ ];
+ return $principal;
+ }
+
+ return null;
+ }
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is stored in a Sabre\DAV\PropPatch object.
+ * To do the actual updates, you must tell this object which properties
+ * you're going to process with the handle() method.
+ *
+ * Calling the handle method is like telling the PropPatch object "I
+ * promise I can handle updating this property".
+ *
+ * Read the PropPatch documentation for more info and examples.
+ *
+ * @param string $path
+ * @param \Sabre\DAV\PropPatch $propPatch
+ * @return void
+ */
+ function updatePrincipal($path, \Sabre\DAV\PropPatch $propPatch) {
+ }
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * By default, if multiple properties are submitted to this method, the
+ * various properties should be combined with 'AND'. If $test is set to
+ * 'anyof', it should be combined using 'OR'.
+ *
+ * This method should simply return an array with full principal uri's.
+ *
+ * If somebody attempted to search on a property the backend does not
+ * support, you should simply return 0 results.
+ *
+ * You can also just return 0 results if you choose to not support
+ * searching at all, but keep in mind that this may stop certain features
+ * from working.
+ *
+ * @param string $prefixPath
+ * @param array $searchProperties
+ * @param string $test
+ * @return array
+ */
+ function searchPrincipals($prefixPath, array $searchProperties, $test = 'allof') {
+ return [];
+ }
+
+ /**
+ * Returns the list of members for a group-principal
+ *
+ * @param string $principal
+ * @return array
+ */
+ function getGroupMemberSet($principal) {
+ // TODO: for now the group principal has only one member, the user itself
+ $principal = $this->getPrincipalByPath($principal);
+ if (!$principal) {
+ throw new \Sabre\DAV\Exception('Principal not found');
+ }
+
+ return [$principal['uri']];
+ }
+
+ /**
+ * Returns the list of groups a principal is a member of
+ *
+ * @param string $principal
+ * @return array
+ */
+ function getGroupMembership($principal) {
+ list($prefix, $name) = URLUtil::splitPath($principal);
+
+ if ($prefix === 'principals/system') {
+ $principal = $this->getPrincipalByPath($principal);
+ if (!$principal) {
+ throw new \Sabre\DAV\Exception('Principal not found');
+ }
+
+ return [];
+ }
+ return [];
+ }
+
+ /**
+ * Updates the list of group members for a group principal.
+ *
+ * The principals should be passed as a list of uri's.
+ *
+ * @param string $principal
+ * @param array $members
+ * @return void
+ */
+ function setGroupMemberSet($principal, array $members) {
+ throw new \Sabre\DAV\Exception('Setting members of the group is not supported yet');
+ }
+}
diff --git a/apps/dav/lib/rootcollection.php b/apps/dav/lib/rootcollection.php
index 850180d8481..c1635c9cde5 100644
--- a/apps/dav/lib/rootcollection.php
+++ b/apps/dav/lib/rootcollection.php
@@ -2,36 +2,55 @@
namespace OCA\DAV;
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\CardDAV\AddressBookRoot;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\Connector\Sabre\Principal;
+use OCA\DAV\DAV\SystemPrincipalBackend;
+use Sabre\CalDAV\CalendarRoot;
use Sabre\CalDAV\Principal\Collection;
-use Sabre\CardDAV\AddressBookRoot;
use Sabre\DAV\SimpleCollection;
class RootCollection extends SimpleCollection {
public function __construct() {
$config = \OC::$server->getConfig();
+ $db = \OC::$server->getDatabaseConnection();
$principalBackend = new Principal(
- $config,
- \OC::$server->getUserManager()
+ $config,
+ \OC::$server->getUserManager()
);
// as soon as debug mode is enabled we allow listing of principals
$disableListing = !$config->getSystemValue('debug', false);
// setup the first level of the dav tree
- $principalCollection = new Collection($principalBackend);
- $principalCollection->disableListing = $disableListing;
- $filesCollection = new Files\RootCollection($principalBackend);
+ $userPrincipals = new Collection($principalBackend, 'principals/users');
+ $userPrincipals->disableListing = $disableListing;
+ $systemPrincipals = new Collection(new SystemPrincipalBackend(), 'principals/system');
+ $systemPrincipals->disableListing = $disableListing;
+ $filesCollection = new Files\RootCollection($principalBackend, 'principals/users');
$filesCollection->disableListing = $disableListing;
- $cardDavBackend = new CardDavBackend(\OC::$server->getDatabaseConnection());
- $addressBookRoot = new AddressBookRoot($principalBackend, $cardDavBackend);
- $addressBookRoot->disableListing = $disableListing;
+ $caldavBackend = new CalDavBackend($db);
+ $calendarRoot = new CalendarRoot($principalBackend, $caldavBackend, 'principals/users');
+ $calendarRoot->disableListing = $disableListing;
+
+ $usersCardDavBackend = new CardDavBackend($db, $principalBackend);
+ $usersAddressBookRoot = new AddressBookRoot($principalBackend, $usersCardDavBackend, 'principals/users');
+ $usersAddressBookRoot->disableListing = $disableListing;
+
+ $systemCardDavBackend = new CardDavBackend($db, $principalBackend);
+ $systemAddressBookRoot = new AddressBookRoot(new SystemPrincipalBackend(), $systemCardDavBackend, 'principals/system');
+ $systemAddressBookRoot->disableListing = $disableListing;
$children = [
- $principalCollection,
- $filesCollection,
- $addressBookRoot,
+ new SimpleCollection('principals', [
+ $userPrincipals,
+ $systemPrincipals]),
+ $filesCollection,
+ $calendarRoot,
+ new SimpleCollection('addressbooks', [
+ $usersAddressBookRoot,
+ $systemAddressBookRoot]),
];
parent::__construct('root', $children);
diff --git a/apps/dav/lib/server.php b/apps/dav/lib/server.php
index a92c9980f54..a031f2c442b 100644
--- a/apps/dav/lib/server.php
+++ b/apps/dav/lib/server.php
@@ -17,6 +17,9 @@ class Server {
public function __construct(IRequest $request, $baseUri) {
$this->request = $request;
$this->baseUri = $baseUri;
+ $logger = \OC::$server->getLogger();
+ $dispatcher = \OC::$server->getEventDispatcher();
+
$root = new RootCollection();
$this->server = new \OCA\DAV\Connector\Sabre\Server($root);
@@ -32,10 +35,36 @@ class Server {
$this->server->addPlugin(new BlockLegacyClientPlugin(\OC::$server->getConfig()));
$this->server->addPlugin(new Plugin($authBackend, 'ownCloud'));
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\DummyGetResponsePlugin());
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin('webdav', $logger));
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin());
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\ListenerPlugin($dispatcher));
+ $this->server->addPlugin(new \Sabre\DAV\Sync\Plugin());
+
+ // acl
+ $acl = new \Sabre\DAVACL\Plugin();
+ $acl->defaultUsernamePath = 'principals/users';
+ $this->server->addPlugin($acl);
+
+ // calendar plugins
+ $this->server->addPlugin(new \Sabre\CalDAV\Plugin());
+ $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
+ $senderEmail = \OCP\Util::getDefaultEmailAddress('no-reply');
+ $this->server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin());
+ $this->server->addPlugin(new \Sabre\CalDAV\Schedule\IMipPlugin($senderEmail));
+ $this->server->addPlugin(new \Sabre\CalDAV\SharingPlugin());
+ $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin());
+ $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin());
+ $this->server->addPlugin(new CardDAV\Sharing\Plugin($authBackend, \OC::$server->getRequest()));
- $this->server->addPlugin(new \Sabre\DAVACL\Plugin());
+ // addressbook plugins
+ $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin());
- $this->server->addPlugin(new \Sabre\CardDAV\Plugin());
+ // Finder on OS X requires Class 2 WebDAV support (locking), since we do
+ // not provide locking we emulate it using a fake locking plugin.
+ if($request->isUserAgent(['/WebDAVFS/'])) {
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FakeLockerPlugin());
+ }
// wait with registering these until auth is handled and the filesystem is setup
$this->server->on('beforeMethod', function () {
diff --git a/apps/dav/tests/misc/sharing.xml b/apps/dav/tests/misc/sharing.xml
new file mode 100644
index 00000000000..8771256ce79
--- /dev/null
+++ b/apps/dav/tests/misc/sharing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" ?>
+ <CS:share xmlns:D="DAV:" xmlns:CS="urn:ietf:params:xml:ns:carddav">
+ <CS:set>
+ <D:href>principal:principals/admin</D:href>
+ <CS:read-write />
+ </CS:set>
+ </CS:share>
diff --git a/apps/dav/tests/travis/caldavtest/config/serverinfo.xml b/apps/dav/tests/travis/caldavtest/config/serverinfo.xml
index b85a8639e4e..c80e47f9481 100644
--- a/apps/dav/tests/travis/caldavtest/config/serverinfo.xml
+++ b/apps/dav/tests/travis/caldavtest/config/serverinfo.xml
@@ -180,7 +180,7 @@
<!-- relative path to main principal collection-->
<substitution>
<key>$principalcollection:</key>
- <value>$root:principals/</value>
+ <value>$root:principals/users/</value>
</substitution>
<!-- the core recored type collections-->
@@ -569,7 +569,7 @@
<!-- relative path to user addressbook home-->
<substitution>
<key>$addressbookhome%d:</key>
- <value>$addressbooks_uids:$userguid%d:</value>
+ <value>$addressbooks:users/$userid%d:</value>
</substitution>
<!-- relative path to user addressbook-->
<substitution>
diff --git a/apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml b/apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml
new file mode 100644
index 00000000000..ffa6662981c
--- /dev/null
+++ b/apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml
@@ -0,0 +1,1602 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2015 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+ <require-feature>
+ <feature>carddav</feature>
+ <feature>sync-report</feature>
+ </require-feature>
+
+ <start>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ </request>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/2.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/2.vcf</filepath>
+ </data>
+ </request>
+ </start>
+
+ <test-suite name='support-report-set'>
+ <test name='1'>
+ <description>Not on addressbooks</description>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$addressbooks:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>xmlElementMatch</callback>
+ <arg>
+ <name>notexists</name>
+ <value>$verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}supported-report-set</value>
+ </arg>
+ <arg>
+ <name>badprops</name>
+ <value>{DAV:}sync-token</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <!--
+ original test2 has been removed since we do not support sync support on addressbooks home
+ -->
+ <test name='3'>
+ <description>On addressbook</description>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>xmlElementMatch</callback>
+ <arg>
+ <name>exists</name>
+ <value>$verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection</value>
+ <!-- verification below does not match -->
+ <!-- value>$verify-property-prefix:/{DAV:}sync-token[+data:,]</value -->
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}supported-report-set</value>
+ <value>{DAV:}sync-token</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='simple reports - empty token - no props'>
+ <test name='1'>
+ <description>initial query - addressbook depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <!-- no sync on addressbook level -->
+ <!-- value>$calendar_sync_extra_items:</value -->
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <!-- test 2 and 3 require sync support on addressbook collection -->
+ <test name='4'>
+ <description>add new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/3.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='5'>
+ <description>new resource - addressbook depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <!-- no sync on addressbook level -->
+ <!-- value>$calendar_sync_extra_items:</value -->
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <!-- test name='6'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <description>new resource - home depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='7'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <description>new resource - home depth:infinity</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ <value>$addressbook:/2.vcf</value>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test -->
+ <test name='8'>
+ <description>remove new resource</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='9'>
+ <description>remove new resource - addressbook depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <!-- no sync on addressbook level -->
+ <!--<value>$calendar_sync_extra_items:</value>-->
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <!--test name='10'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <description>remove new resource - home depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='11'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <description>remove new resource - home depth:infinity</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ <value>$addressbook:/2.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='12'>
+ <description>changed resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='13'>
+ <description>changed resource - addressbook depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='14'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <description>changed resource - home depth:1</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='15'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <description>changed resource - home depth:infinity</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ <value>$addressbook:/2.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ -->
+ </test-suite>
+
+ <!--
+ <test-suite name='simple reports - diff token - no props'>
+ <test name='1'>
+ <description>initial query - grab token</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='2'>
+ <description>new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/3.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken2:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='3'>
+ <description>remove resource (treated as new)</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>badhrefs</name>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='4'>
+ <description>remove resource (treated as old)</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/4.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>badhrefs</name>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='5'>
+ <description>changed resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>1.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='6'>
+ <description>no change</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='simple reports - empty token - props'>
+ <test name='1'>
+ <description>initial query</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/5.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='2'>
+ <description>new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/3.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/5.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='3'>
+ <description>remove resource new resource</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/5.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='4'>
+ <description>changed resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/5.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='simple reports - diff token - props'>
+ <test name='1'>
+ <description>initial query - grab token</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/5.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>1.vcf</value>
+ <value>2.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='2'>
+ <description>new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/3.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken2:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='3'>
+ <description>remove resource (treated as new)</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>badhrefs</name>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='4'>
+ <description>remove resource (treated as old)</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/7.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>badhrefs</name>
+ <value>3.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='5'>
+ <description>changed resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>1.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='6'>
+ <description>no change</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='simple reports - diff token - no props - home depth:infinity'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <test name='1'>
+ <description>Initialize</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/</ruri>
+ </request>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ </request>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/2.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/2.vcf</filepath>
+ </data>
+ </request>
+ </test>
+ <test name='2'>
+ <description>initial query - grab token</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ <value>$addressbook:/2.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='3'>
+ <description>new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/3.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken2:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='4'>
+ <description>remove resource (treated as new)</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ </arg>
+ <arg>
+ <name>badhrefs</name>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='5'>
+ <description>remove resource (treated as old)</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/4.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ </arg>
+ <arg>
+ <name>badhrefs</name>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='6'>
+ <description>changed resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='7'>
+ <description>no change</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='simple reports - diff token - props - home depth:infinity'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <test name='1'>
+ <description>initial query - grab token</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/5.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$calendar_sync_extra_items:</value>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ <value>$addressbook:/2.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='2'>
+ <description>new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/3.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken2:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='3'>
+ <description>remove resource (treated as new)</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookpath1:/3.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ </arg>
+ <arg>
+ <name>badhrefs</name>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>ignore</name>
+ <value>$addressbookpath1:/</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>ignore</name>
+ <value>$addressbookpath1:/3.vcf</value>
+ </arg>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='4'>
+ <description>remove resource (treated as old)</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/7.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ </arg>
+ <arg>
+ <name>badhrefs</name>
+ <value>$addressbook:/3.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>count</name>
+ <value>2</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='5'>
+ <description>changed resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$addressbookpath1:/1.vcf</ruri>
+ <data>
+ <content-type>text/vcard; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/put/1.vcf</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ <value>$addressbook:/1.vcf</value>
+ </arg>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='6'>
+ <description>no change</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/6.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ </verify>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{DAV:}getcontenttype</value>
+ <value>{DAV:}getetag</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='simple reports - diff token - delete/create addressbook - home depth:infinity' ignore='yes'>
+ <require-feature>
+ <feature>sync-report-home</feature>
+ </require-feature>
+ <test name='1'>
+ <description>initial query - grab token</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/2.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>$addressbook:/</value>
+ <value>syncaddressbook3/</value>
+ <value>syncaddressbook3/1.vcf</value>
+ <value>syncaddressbook3/2.vcf</value>
+ <value>syncaddressbook4/</value>
+ <value>syncaddressbook4/1.vcf</value>
+ <value>syncaddressbook4/2.vcf</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='2'>
+ <description>remove resource then addressbook</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookhome1:/syncaddressbook3/1.vcf</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>DELETE</method>
+ <ruri>$addressbookhome1:/syncaddressbook3/</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>badhrefs</name>
+ <value>syncaddressbook3/</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken2:</variable>
+ </grabelement>
+ </request>
+ </test>
+ <test name='3'>
+ <description>add addressbook - test last sync</description>
+ <request end-delete="yes">
+ <method>MKCOL</method>
+ <ruri>$addressbookhome1:/syncaddressbook3/</ruri>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/Common/MKCOL/addressbook.xml</filepath>
+ </data>
+ </request>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/4.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>syncaddressbook3/</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='4'>
+ <description>add addressbook - test previous sync</description>
+ <request>
+ <method>REPORT</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>infinity</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CardDAV/vreports/sync/3.xml</filepath>
+ </data>
+ <verify>
+ <callback>multistatusItems</callback>
+ <arg>
+ <name>okhrefs</name>
+ <value>syncaddressbook3/</value>
+ </arg>
+ </verify>
+ <grabelement>
+ <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+ <variable>$synctoken1:</variable>
+ </grabelement>
+ </request>
+ </test>
+ </test-suite>
+-->
+
+ <end>
+ <request user="$useradmin:" pswd="$pswdadmin:">
+ <method>DELETEALL</method>
+ <ruri>$addressbookhome1:/</ruri>
+ <ruri>$addressbookhome2:/</ruri>
+ <ruri>$notificationpath1:/</ruri>
+ <ruri>$notificationpath2:/</ruri>
+ </request>
+ </end>
+
+</caldavtest>
diff --git a/apps/dav/tests/travis/carddavtester.sh b/apps/dav/tests/travis/carddavtester.sh
index a128872f42a..17f7e8eb4a8 100644
--- a/apps/dav/tests/travis/carddavtester.sh
+++ b/apps/dav/tests/travis/carddavtester.sh
@@ -18,11 +18,18 @@ fi
# create test user
cd "$SCRIPTPATH/../../../../"
OC_PASS=user01 php occ user:add --password-from-env user01
+php occ dav:create-addressbook user01 addressbook
OC_PASS=user02 php occ user:add --password-from-env user02
+php occ dav:create-addressbook user02 addressbook
cd "$SCRIPTPATH/../../../../"
# run the tests
cd "$SCRIPTPATH/CalDAVTester"
PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail -s "$SCRIPTPATH/caldavtest/config/serverinfo.xml" -o cdt.txt \
- "$SCRIPTPATH/caldavtest/tests/CardDAV/current-user-principal.xml"
+ "$SCRIPTPATH/caldavtest/tests/CardDAV/current-user-principal.xml" \
+ "$SCRIPTPATH/caldavtest/tests/CardDAV/sync-report.xml"
+RESULT=$?
+tail "$SCRIPTPATH/../../../../data-autotest/owncloud.log"
+
+exit $RESULT
diff --git a/apps/dav/tests/unit/bootstrap.php b/apps/dav/tests/unit/bootstrap.php
index 28f6b971dec..b6ea48ec903 100644
--- a/apps/dav/tests/unit/bootstrap.php
+++ b/apps/dav/tests/unit/bootstrap.php
@@ -1,6 +1,8 @@
<?php
-define('PHPUNIT_RUN', 1);
+if (!defined('PHPUNIT_RUN')) {
+ define('PHPUNIT_RUN', 1);
+}
require_once __DIR__.'/../../../../lib/base.php';
diff --git a/apps/dav/tests/unit/caldav/caldavbackendtest.php b/apps/dav/tests/unit/caldav/caldavbackendtest.php
new file mode 100644
index 00000000000..e9483a47a78
--- /dev/null
+++ b/apps/dav/tests/unit/caldav/caldavbackendtest.php
@@ -0,0 +1,348 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace Tests\Connector\Sabre;
+
+use DateTime;
+use DateTimeZone;
+use OCA\DAV\CalDAV\CalDavBackend;
+use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
+use Sabre\DAV\PropPatch;
+use Sabre\DAV\Xml\Property\Href;
+use Test\TestCase;
+
+/**
+ * Class CalDavBackendTest
+ *
+ * @group DB
+ *
+ * @package Tests\Connector\Sabre
+ */
+class CalDavBackendTest extends TestCase {
+
+ /** @var CalDavBackend */
+ private $backend;
+
+ const UNIT_TEST_USER = 'caldav-unit-test';
+
+
+ public function setUp() {
+ parent::setUp();
+
+ $db = \OC::$server->getDatabaseConnection();
+ $this->backend = new CalDavBackend($db);
+
+ $this->tearDown();
+ }
+
+ public function tearDown() {
+ parent::tearDown();
+
+ if (is_null($this->backend)) {
+ return;
+ }
+ $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ foreach ($books as $book) {
+ $this->backend->deleteCalendar($book['id']);
+ }
+ $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
+ foreach ($subscriptions as $subscription) {
+ $this->backend->deleteSubscription($subscription['id']);
+ }
+ }
+
+ public function testCalendarOperations() {
+
+ $calendarId = $this->createTestCalendar();
+
+ // update it's display name
+ $patch = new PropPatch([
+ '{DAV:}displayname' => 'Unit test',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar used for unit testing'
+ ]);
+ $this->backend->updateCalendar($calendarId, $patch);
+ $patch->commit();
+ $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($books));
+ $this->assertEquals('Unit test', $books[0]['{DAV:}displayname']);
+ $this->assertEquals('Calendar used for unit testing', $books[0]['{urn:ietf:params:xml:ns:caldav}calendar-description']);
+
+ // delete the address book
+ $this->backend->deleteCalendar($books[0]['id']);
+ $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(0, count($books));
+ }
+
+ public function testCalendarObjectsOperations() {
+
+ $calendarId = $this->createTestCalendar();
+
+ // create a card
+ $uri = $this->getUniqueID('calobj');
+ $calData = <<<'EOD'
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:ownCloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20130910T125139Z
+UID:47d15e3ec8
+LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
+SUMMARY:Test Event
+DTSTART;VALUE=DATE-TIME:20130912T130000Z
+DTEND;VALUE=DATE-TIME:20130912T140000Z
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+EOD;
+
+ $this->backend->createCalendarObject($calendarId, $uri, $calData);
+
+ // get all the cards
+ $calendarObjects = $this->backend->getCalendarObjects($calendarId);
+ $this->assertEquals(1, count($calendarObjects));
+ $this->assertEquals($calendarId, $calendarObjects[0]['calendarid']);
+
+ // get the cards
+ $calendarObject = $this->backend->getCalendarObject($calendarId, $uri);
+ $this->assertNotNull($calendarObject);
+ $this->assertArrayHasKey('id', $calendarObject);
+ $this->assertArrayHasKey('uri', $calendarObject);
+ $this->assertArrayHasKey('lastmodified', $calendarObject);
+ $this->assertArrayHasKey('etag', $calendarObject);
+ $this->assertArrayHasKey('size', $calendarObject);
+ $this->assertEquals($calData, $calendarObject['calendardata']);
+
+ // update the card
+ $calData = <<<'EOD'
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:ownCloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20130910T125139Z
+UID:47d15e3ec8
+LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
+SUMMARY:Test Event
+DTSTART;VALUE=DATE-TIME:20130912T130000Z
+DTEND;VALUE=DATE-TIME:20130912T140000Z
+END:VEVENT
+END:VCALENDAR
+EOD;
+ $this->backend->updateCalendarObject($calendarId, $uri, $calData);
+ $calendarObject = $this->backend->getCalendarObject($calendarId, $uri);
+ $this->assertEquals($calData, $calendarObject['calendardata']);
+
+ // delete the card
+ $this->backend->deleteCalendarObject($calendarId, $uri);
+ $calendarObjects = $this->backend->getCalendarObjects($calendarId);
+ $this->assertEquals(0, count($calendarObjects));
+ }
+
+ public function testMultiCalendarObjects() {
+
+ $calendarId = $this->createTestCalendar();
+
+ // create an event
+ $calData = <<<'EOD'
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:ownCloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20130910T125139Z
+UID:47d15e3ec8
+LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
+SUMMARY:Test Event
+DTSTART;VALUE=DATE-TIME:20130912T130000Z
+DTEND;VALUE=DATE-TIME:20130912T140000Z
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+EOD;
+ $uri0 = $this->getUniqueID('card');
+ $this->backend->createCalendarObject($calendarId, $uri0, $calData);
+ $uri1 = $this->getUniqueID('card');
+ $this->backend->createCalendarObject($calendarId, $uri1, $calData);
+ $uri2 = $this->getUniqueID('card');
+ $this->backend->createCalendarObject($calendarId, $uri2, $calData);
+
+ // get all the cards
+ $calendarObjects = $this->backend->getCalendarObjects($calendarId);
+ $this->assertEquals(3, count($calendarObjects));
+
+ // get the cards
+ $calendarObjects = $this->backend->getMultipleCalendarObjects($calendarId, [$uri1, $uri2]);
+ $this->assertEquals(2, count($calendarObjects));
+ foreach($calendarObjects as $card) {
+ $this->assertArrayHasKey('id', $card);
+ $this->assertArrayHasKey('uri', $card);
+ $this->assertArrayHasKey('lastmodified', $card);
+ $this->assertArrayHasKey('etag', $card);
+ $this->assertArrayHasKey('size', $card);
+ $this->assertEquals($calData, $card['calendardata']);
+ }
+
+ // delete the card
+ $this->backend->deleteCalendarObject($calendarId, $uri0);
+ $this->backend->deleteCalendarObject($calendarId, $uri1);
+ $this->backend->deleteCalendarObject($calendarId, $uri2);
+ $calendarObjects = $this->backend->getCalendarObjects($calendarId);
+ $this->assertEquals(0, count($calendarObjects));
+ }
+
+ /**
+ * @dataProvider providesCalendarQueryParameters
+ */
+ public function testCalendarQuery($expectedEventsInResult, $propFilters, $compFilter) {
+ $calendarId = $this->createTestCalendar();
+ $events = [];
+ $events[0] = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
+ $events[1] = $this->createEvent($calendarId, '20130912T150000Z', '20130912T170000Z');
+ $events[2] = $this->createEvent($calendarId, '20130912T173000Z', '20130912T220000Z');
+
+ $result = $this->backend->calendarQuery($calendarId, [
+ 'name' => '',
+ 'prop-filters' => $propFilters,
+ 'comp-filters' => $compFilter
+ ]);
+
+ $expectedEventsInResult = array_map(function($index) use($events) {
+ return $events[$index];
+ }, $expectedEventsInResult);
+ $this->assertEquals($expectedEventsInResult, $result, '', 0.0, 10, true);
+ }
+
+ public function testGetCalendarObjectByUID() {
+ $calendarId = $this->createTestCalendar();
+ $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
+
+ $co = $this->backend->getCalendarObjectByUID(self::UNIT_TEST_USER, '47d15e3ec8');
+ $this->assertNotNull($co);
+ }
+
+ public function providesCalendarQueryParameters() {
+ return [
+ 'all' => [[0, 1, 2], [], []],
+ 'only-todos' => [[], ['name' => 'VTODO'], []],
+ 'only-events' => [[0, 1, 2], [], [['name' => 'VEVENT', 'is-not-defined' => false, 'comp-filters' => [], 'time-range' => ['start' => null, 'end' => null], 'prop-filters' => []]],],
+ 'start' => [[1, 2], [], [['name' => 'VEVENT', 'is-not-defined' => false, 'comp-filters' => [], 'time-range' => ['start' => new DateTime('2013-09-12 14:00:00', new DateTimeZone('UTC')), 'end' => null], 'prop-filters' => []]],],
+ 'end' => [[0], [], [['name' => 'VEVENT', 'is-not-defined' => false, 'comp-filters' => [], 'time-range' => ['start' => null, 'end' => new DateTime('2013-09-12 14:00:00', new DateTimeZone('UTC'))], 'prop-filters' => []]],],
+ ];
+ }
+
+ private function createTestCalendar() {
+ $this->backend->createCalendar(self::UNIT_TEST_USER, 'Example', [
+ '{http://apple.com/ns/ical/}calendar-color' => '#1C4587FF'
+ ]);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($calendars));
+ $this->assertEquals(self::UNIT_TEST_USER, $calendars[0]['principaluri']);
+ /** @var SupportedCalendarComponentSet $components */
+ $components = $calendars[0]['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'];
+ $this->assertEquals(['VEVENT','VTODO'], $components->getValue());
+ $color = $calendars[0]['{http://apple.com/ns/ical/}calendar-color'];
+ $this->assertEquals('#1C4587FF', $color);
+ $this->assertEquals('Example', $calendars[0]['uri']);
+ $this->assertEquals('Example', $calendars[0]['{DAV:}displayname']);
+ $calendarId = $calendars[0]['id'];
+
+ return $calendarId;
+ }
+
+ private function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z') {
+
+ $calData = <<<EOD
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:ownCloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20130910T125139Z
+UID:47d15e3ec8
+LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
+SUMMARY:Test Event
+DTSTART;VALUE=DATE-TIME:$start
+DTEND;VALUE=DATE-TIME:$end
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+EOD;
+ $uri0 = $this->getUniqueID('event');
+ $this->backend->createCalendarObject($calendarId, $uri0, $calData);
+
+ return $uri0;
+ }
+
+ public function testSyncSupport() {
+ $calendarId = $this->createTestCalendar();
+
+ // fist call without synctoken
+ $changes = $this->backend->getChangesForCalendar($calendarId, '', 1);
+ $syncToken = $changes['syncToken'];
+
+ // add a change
+ $event = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
+
+ // look for changes
+ $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 1);
+ $this->assertEquals($event, $changes['added'][0]);
+ }
+
+ public function testSubscriptions() {
+ $id = $this->backend->createSubscription(self::UNIT_TEST_USER, 'Subscription', [
+ '{http://calendarserver.org/ns/}source' => new Href('test-source')
+ ]);
+
+ $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($subscriptions));
+ $this->assertEquals($id, $subscriptions[0]['id']);
+
+ $patch = new PropPatch([
+ '{DAV:}displayname' => 'Unit test',
+ ]);
+ $this->backend->updateSubscription($id, $patch);
+ $patch->commit();
+
+ $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($subscriptions));
+ $this->assertEquals($id, $subscriptions[0]['id']);
+ $this->assertEquals('Unit test', $subscriptions[0]['{DAV:}displayname']);
+
+ $this->backend->deleteSubscription($id);
+ $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(0, count($subscriptions));
+ }
+
+ public function testScheduling() {
+ $this->backend->createSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule', '');
+
+ $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($sos));
+
+ $so = $this->backend->getSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule');
+ $this->assertNotNull($so);
+
+ $this->backend->deleteSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule');
+
+ $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
+ $this->assertEquals(0, count($sos));
+ }
+}
diff --git a/apps/dav/tests/unit/carddav/carddavbackendtest.php b/apps/dav/tests/unit/carddav/carddavbackendtest.php
index 79ef36d8097..dd5e205242a 100644
--- a/apps/dav/tests/unit/carddav/carddavbackendtest.php
+++ b/apps/dav/tests/unit/carddav/carddavbackendtest.php
@@ -24,6 +24,13 @@ use OCA\DAV\CardDAV\CardDavBackend;
use Sabre\DAV\PropPatch;
use Test\TestCase;
+/**
+ * Class CardDavBackendTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\CardDAV
+ */
class CardDavBackendTest extends TestCase {
/** @var CardDavBackend */
@@ -31,12 +38,20 @@ class CardDavBackendTest extends TestCase {
const UNIT_TEST_USER = 'carddav-unit-test';
-
public function setUp() {
parent::setUp();
+ $principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal')
+ ->disableOriginalConstructor()
+ ->setMethods(['getPrincipalByPath'])
+ ->getMock();
+ $principal->method('getPrincipalByPath')
+ ->willReturn([
+ 'uri' => 'principals/best-friend'
+ ]);
+
$db = \OC::$server->getDatabaseConnection();
- $this->backend = new CardDavBackend($db);
+ $this->backend = new CardDavBackend($db, $principal);
$this->tearDown();
}
@@ -178,4 +193,32 @@ class CardDavBackendTest extends TestCase {
$changes = $this->backend->getChangesForAddressBook($bookId, $syncToken, 1);
$this->assertEquals($uri0, $changes['added'][0]);
}
+
+ public function testSharing() {
+ $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
+ $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER);
+ $this->assertEquals(1, count($books));
+
+ $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []);
+
+ $shares = $this->backend->getShares('Example');
+ $this->assertEquals(1, count($shares));
+
+ // adding the same sharee again has no effect
+ $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []);
+
+ $shares = $this->backend->getShares('Example');
+ $this->assertEquals(1, count($shares));
+
+ $books = $this->backend->getAddressBooksForUser('principals/best-friend');
+ $this->assertEquals(1, count($books));
+
+ $this->backend->updateShares('Example', [], [['href' => 'principal:principals/best-friend']]);
+
+ $shares = $this->backend->getShares('Example');
+ $this->assertEquals(0, count($shares));
+
+ $books = $this->backend->getAddressBooksForUser('principals/best-friend');
+ $this->assertEquals(0, count($books));
+ }
}
diff --git a/apps/dav/tests/unit/carddav/convertertest.php b/apps/dav/tests/unit/carddav/convertertest.php
new file mode 100644
index 00000000000..f4e2ea3f002
--- /dev/null
+++ b/apps/dav/tests/unit/carddav/convertertest.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Tests\Unit;
+
+use OCA\DAV\CardDAV\Converter;
+use Test\TestCase;
+
+class ConverterTests extends TestCase {
+
+ /**
+ * @dataProvider providesNewUsers
+ */
+ public function testCreation($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) {
+ $user = $this->getUserMock($displayName, $eMailAddress, $cloudId);
+
+ $converter = new Converter();
+ $vCard = $converter->createCardFromUser($user);
+ $cardData = $vCard->serialize();
+
+ $this->assertEquals($expectedVCard, $cardData);
+ }
+
+ public function providesNewUsers() {
+ return [
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n"],
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"],
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"],
+ ];
+ }
+
+ /**
+ * @dataProvider providesNewUsers
+ */
+ public function testUpdateOfUnchangedUser($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) {
+ $user = $this->getUserMock($displayName, $eMailAddress, $cloudId);
+
+ $converter = new Converter();
+ $vCard = $converter->createCardFromUser($user);
+ $updated = $converter->updateCard($vCard, $user);
+ $this->assertFalse($updated);
+ $cardData = $vCard->serialize();
+
+ $this->assertEquals($expectedVCard, $cardData);
+ }
+
+ /**
+ * @dataProvider providesUsersForUpdateOfRemovedElement
+ */
+ public function testUpdateOfRemovedElement($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) {
+ $user = $this->getUserMock($displayName, $eMailAddress, $cloudId);
+
+ $converter = new Converter();
+ $vCard = $converter->createCardFromUser($user);
+
+ $user1 = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock();
+ $user1->method('getUID')->willReturn('12345');
+ $user1->method('getDisplayName')->willReturn(null);
+ $user1->method('getEMailAddress')->willReturn(null);
+ $user1->method('getCloudId')->willReturn(null);
+ $user1->method('getAvatarImage')->willReturn(null);
+
+ $updated = $converter->updateCard($vCard, $user1);
+ $this->assertTrue($updated);
+ $cardData = $vCard->serialize();
+
+ $this->assertEquals($expectedVCard, $cardData);
+ }
+
+ public function providesUsersForUpdateOfRemovedElement() {
+ return [
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"],
+ ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"],
+ ];
+ }
+
+ /**
+ * @dataProvider providesNames
+ * @param $expected
+ * @param $fullName
+ */
+ public function testNameSplitter($expected, $fullName) {
+
+ $converter = new Converter();
+ $r = $converter->splitFullName($fullName);
+ $r = implode(';', $r);
+ $this->assertEquals($expected, $r);
+ }
+
+ public function providesNames() {
+ return [
+ ['Sauron;;;;', 'Sauron'],
+ ['Baggins;Bilbo;;;', 'Bilbo Baggins'],
+ ['Tolkien;John;Ronald Reuel;;', 'John Ronald Reuel Tolkien'],
+ ];
+ }
+
+ /**
+ * @param $displayName
+ * @param $eMailAddress
+ * @param $cloudId
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ protected function getUserMock($displayName, $eMailAddress, $cloudId) {
+ $image0 = $this->getMockBuilder('OCP\IImage')->disableOriginalConstructor()->getMock();
+ $image0->method('mimeType')->willReturn('JPEG');
+ $image0->method('data')->willReturn('123456789');
+ $user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock();
+ $user->method('getUID')->willReturn('12345');
+ $user->method('getDisplayName')->willReturn($displayName);
+ $user->method('getEMailAddress')->willReturn($eMailAddress);
+ $user->method('getCloudId')->willReturn($cloudId);
+ $user->method('getAvatarImage')->willReturn($image0);
+ return $user;
+ }
+}
diff --git a/apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php b/apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php
new file mode 100644
index 00000000000..8539e9c06ee
--- /dev/null
+++ b/apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCA\DAV\Tests\Unit\Connector\Sabre;
+
+use OCA\DAV\Connector\Sabre\FakeLockerPlugin;
+use Sabre\HTTP\Response;
+use Test\TestCase;
+
+/**
+ * Class FakeLockerPluginTest
+ *
+ * @package OCA\DAV\Tests\Unit\Connector\Sabre
+ */
+class FakeLockerPluginTest extends TestCase {
+ /** @var FakeLockerPlugin */
+ private $fakeLockerPlugin;
+
+ public function setUp() {
+ parent::setUp();
+ $this->fakeLockerPlugin = new FakeLockerPlugin();
+ }
+
+ public function testInitialize() {
+ /** @var \Sabre\DAV\Server $server */
+ $server = $this->getMock('\Sabre\DAV\Server');
+ $server
+ ->expects($this->at(0))
+ ->method('on')
+ ->with('method:LOCK', [$this->fakeLockerPlugin, 'fakeLockProvider'], 1);
+ $server
+ ->expects($this->at(1))
+ ->method('on')
+ ->with('method:UNLOCK', [$this->fakeLockerPlugin, 'fakeUnlockProvider'], 1);
+ $server
+ ->expects($this->at(2))
+ ->method('on')
+ ->with('propFind', [$this->fakeLockerPlugin, 'propFind']);
+ $server
+ ->expects($this->at(3))
+ ->method('on')
+ ->with('validateTokens', [$this->fakeLockerPlugin, 'validateTokens']);
+
+ $this->fakeLockerPlugin->initialize($server);
+ }
+
+ public function testGetHTTPMethods() {
+ $expected = [
+ 'LOCK',
+ 'UNLOCK',
+ ];
+ $this->assertSame($expected, $this->fakeLockerPlugin->getHTTPMethods('Test'));
+ }
+
+ public function testGetFeatures() {
+ $expected = [
+ 2,
+ ];
+ $this->assertSame($expected, $this->fakeLockerPlugin->getFeatures());
+ }
+
+ public function testPropFind() {
+ $propFind = $this->getMockBuilder('\Sabre\DAV\PropFind')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node = $this->getMock('\Sabre\DAV\INode');
+
+ $propFind->expects($this->at(0))
+ ->method('handle')
+ ->with('{DAV:}supportedlock');
+ $propFind->expects($this->at(1))
+ ->method('handle')
+ ->with('{DAV:}lockdiscovery');
+
+ $this->fakeLockerPlugin->propFind($propFind, $node);
+ }
+
+ public function tokenDataProvider() {
+ return [
+ [
+ [
+ [
+ 'tokens' => [
+ [
+ 'token' => 'aToken',
+ 'validToken' => false,
+ ],
+ [],
+ [
+ 'token' => 'opaquelocktoken:asdf',
+ 'validToken' => false,
+ ]
+ ],
+ ]
+ ],
+ [
+ [
+ 'tokens' => [
+ [
+ 'token' => 'aToken',
+ 'validToken' => false,
+ ],
+ [],
+ [
+ 'token' => 'opaquelocktoken:asdf',
+ 'validToken' => true,
+ ]
+ ],
+ ]
+ ],
+ ]
+ ];
+ }
+
+ /**
+ * @dataProvider tokenDataProvider
+ * @param array $input
+ * @param array $expected
+ */
+ public function testValidateTokens(array $input, array $expected) {
+ $request = $this->getMock('\Sabre\HTTP\RequestInterface');
+ $this->fakeLockerPlugin->validateTokens($request, $input);
+ $this->assertSame($expected, $input);
+ }
+
+ public function testFakeLockProvider() {
+ $request = $this->getMock('\Sabre\HTTP\RequestInterface');
+ $response = new Response();
+ $server = $this->getMock('\Sabre\DAV\Server');
+ $this->fakeLockerPlugin->initialize($server);
+
+ $request->expects($this->exactly(2))
+ ->method('getPath')
+ ->will($this->returnValue('MyPath'));
+
+ $this->assertSame(false, $this->fakeLockerPlugin->fakeLockProvider($request, $response));
+
+ $expectedXml = '<?xml version="1.0" encoding="utf-8"?><d:prop xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns"><d:lockdiscovery><d:activelock><d:lockscope><d:exclusive/></d:lockscope><d:locktype><d:write/></d:locktype><d:lockroot><d:href>MyPath</d:href></d:lockroot><d:depth>infinity</d:depth><d:timeout>Second-1800</d:timeout><d:locktoken><d:href>opaquelocktoken:fe4f7f2437b151fbcb4e9f5c8118c6b1</d:href></d:locktoken><d:owner/></d:activelock></d:lockdiscovery></d:prop>';
+
+ $this->assertXmlStringEqualsXmlString($expectedXml, $response->getBody());
+ }
+
+ public function testFakeUnlockProvider() {
+ $request = $this->getMock('\Sabre\HTTP\RequestInterface');
+ $response = $this->getMock('\Sabre\HTTP\ResponseInterface');
+
+ $response->expects($this->once())
+ ->method('setStatus')
+ ->with('204');
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with('Content-Length', '0');
+
+ $this->assertSame(false, $this->fakeLockerPlugin->fakeUnlockProvider($request, $response));
+ }
+}
diff --git a/apps/dav/tests/unit/connector/sabre/auth.php b/apps/dav/tests/unit/connector/sabre/auth.php
index d18747d732a..217ff5fc3fa 100644
--- a/apps/dav/tests/unit/connector/sabre/auth.php
+++ b/apps/dav/tests/unit/connector/sabre/auth.php
@@ -249,9 +249,12 @@ class Auth extends TestCase {
}
public function testAuthenticateAlreadyLoggedIn() {
- $server = $this->getMockBuilder('\Sabre\DAV\Server')
- ->disableOriginalConstructor()
- ->getMock();
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
$this->userSession
->expects($this->once())
->method('isLoggedIn')
@@ -275,13 +278,10 @@ class Auth extends TestCase {
->expects($this->once())
->method('close');
- $this->assertTrue($this->auth->authenticate($server, 'TestRealm'));
+ $response = $this->auth->check($request, $response);
+ $this->assertEquals([true, 'principals/users/MyWrongDavUser'], $response);
}
- /**
- * @expectedException \Sabre\DAV\Exception\NotAuthenticated
- * @expectedExceptionMessage No basic authentication headers were found
- */
public function testAuthenticateNoBasicAuthenticateHeadersProvided() {
$server = $this->getMockBuilder('\Sabre\DAV\Server')
->disableOriginalConstructor()
@@ -292,7 +292,59 @@ class Auth extends TestCase {
$server->httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface')
->disableOriginalConstructor()
->getMock();
- $this->auth->authenticate($server, 'TestRealm');
+ $response = $this->auth->check($server->httpRequest, $server->httpResponse);
+ $this->assertEquals([false, 'No \'Authorization: Basic\' header found. Either the client didn\'t send one, or the server is mis-configured'], $response);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotAuthenticated
+ * @expectedExceptionMessage Cannot authenticate over ajax calls
+ */
+ public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjax() {
+ /** @var \Sabre\HTTP\RequestInterface $httpRequest */
+ $httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ /** @var \Sabre\HTTP\ResponseInterface $httpResponse */
+ $httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSession
+ ->expects($this->any())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(false));
+ $httpRequest
+ ->expects($this->once())
+ ->method('getHeader')
+ ->with('X-Requested-With')
+ ->will($this->returnValue('XMLHttpRequest'));
+ $this->auth->check($httpRequest, $httpResponse);
+ }
+
+ public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjaxButUserIsStillLoggedIn() {
+ /** @var \Sabre\HTTP\RequestInterface $httpRequest */
+ $httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ /** @var \Sabre\HTTP\ResponseInterface $httpResponse */
+ $httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSession
+ ->expects($this->any())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+ $this->session
+ ->expects($this->once())
+ ->method('get')
+ ->with('AUTHENTICATED_TO_DAV_BACKEND')
+ ->will($this->returnValue('MyTestUser'));
+ $httpRequest
+ ->expects($this->once())
+ ->method('getHeader')
+ ->with('Authorization')
+ ->will($this->returnValue(null));
+ $this->auth->check($httpRequest, $httpResponse);
}
public function testAuthenticateValidCredentials() {
@@ -303,7 +355,12 @@ class Auth extends TestCase {
->disableOriginalConstructor()
->getMock();
$server->httpRequest
- ->expects($this->once())
+ ->expects($this->at(0))
+ ->method('getHeader')
+ ->with('X-Requested-With')
+ ->will($this->returnValue(null));
+ $server->httpRequest
+ ->expects($this->at(1))
->method('getHeader')
->with('Authorization')
->will($this->returnValue('basic dXNlcm5hbWU6cGFzc3dvcmQ='));
@@ -325,13 +382,10 @@ class Auth extends TestCase {
->expects($this->exactly(2))
->method('getUser')
->will($this->returnValue($user));
- $this->assertTrue($this->auth->authenticate($server, 'TestRealm'));
+ $response = $this->auth->check($server->httpRequest, $server->httpResponse);
+ $this->assertEquals([true, 'principals/users/username'], $response);
}
- /**
- * @expectedException \Sabre\DAV\Exception\NotAuthenticated
- * @expectedExceptionMessage Username or password does not match
- */
public function testAuthenticateInvalidCredentials() {
$server = $this->getMockBuilder('\Sabre\DAV\Server')
->disableOriginalConstructor()
@@ -340,7 +394,12 @@ class Auth extends TestCase {
->disableOriginalConstructor()
->getMock();
$server->httpRequest
- ->expects($this->once())
+ ->expects($this->at(0))
+ ->method('getHeader')
+ ->with('X-Requested-With')
+ ->will($this->returnValue(null));
+ $server->httpRequest
+ ->expects($this->at(1))
->method('getHeader')
->with('Authorization')
->will($this->returnValue('basic dXNlcm5hbWU6cGFzc3dvcmQ='));
@@ -352,6 +411,7 @@ class Auth extends TestCase {
->method('login')
->with('username', 'password')
->will($this->returnValue(false));
- $this->auth->authenticate($server, 'TestRealm');
+ $response = $this->auth->check($server->httpRequest, $server->httpResponse);
+ $this->assertEquals([false, 'Username or password was incorrect'], $response);
}
}
diff --git a/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php b/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php
index e1bcc996908..1a973a28ed4 100644
--- a/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php
+++ b/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php
@@ -8,6 +8,14 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre;
* later.
* See the COPYING-README file.
*/
+
+/**
+ * Class CustomPropertiesBackend
+ *
+ * @group DB
+ *
+ * @package Tests\Connector\Sabre
+ */
class CustomPropertiesBackend extends \Test\TestCase {
/**
diff --git a/apps/dav/tests/unit/connector/sabre/directory.php b/apps/dav/tests/unit/connector/sabre/directory.php
index 148a91d26db..75c4828641b 100644
--- a/apps/dav/tests/unit/connector/sabre/directory.php
+++ b/apps/dav/tests/unit/connector/sabre/directory.php
@@ -9,6 +9,8 @@
namespace OCA\DAV\Tests\Unit\Connector\Sabre;
+use OCP\Files\ForbiddenException;
+
class Directory extends \Test\TestCase {
/** @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject */
@@ -49,6 +51,25 @@ class Directory extends \Test\TestCase {
}
/**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\Forbidden
+ */
+ public function testDeleteForbidden() {
+ // deletion allowed
+ $this->info->expects($this->once())
+ ->method('isDeletable')
+ ->will($this->returnValue(true));
+
+ // but fails
+ $this->view->expects($this->once())
+ ->method('rmdir')
+ ->with('sub')
+ ->willThrowException(new ForbiddenException('', true));
+
+ $dir = $this->getDir('sub');
+ $dir->delete();
+ }
+
+ /**
*
*/
public function testDeleteFolderWhenAllowed() {
diff --git a/apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php b/apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php
new file mode 100644
index 00000000000..19799c71b9e
--- /dev/null
+++ b/apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright (c) 2015 Thomas Müller <deepdiver@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\DAV\Tests\Unit\Connector\Sabre\Exception;
+
+use OCA\DAV\Connector\Sabre\Exception\Forbidden;
+
+class ForbiddenTest extends \Test\TestCase {
+
+ public function testSerialization() {
+
+ // create xml doc
+ $DOM = new \DOMDocument('1.0','utf-8');
+ $DOM->formatOutput = true;
+ $error = $DOM->createElementNS('DAV:','d:error');
+ $error->setAttribute('xmlns:s', \Sabre\DAV\Server::NS_SABREDAV);
+ $DOM->appendChild($error);
+
+ // serialize the exception
+ $message = "1234567890";
+ $retry = false;
+ $expectedXml = <<<EOD
+<?xml version="1.0" encoding="utf-8"?>
+<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:o="http://owncloud.org/ns">
+ <o:retry xmlns:o="o:">false</o:retry>
+ <o:reason xmlns:o="o:">1234567890</o:reason>
+</d:error>
+
+EOD;
+
+ $ex = new Forbidden($message, $retry);
+ $server = $this->getMock('Sabre\DAV\Server');
+ $ex->serialize($server, $error);
+
+ // assert
+ $xml = $DOM->saveXML();
+ $this->assertEquals($expectedXml, $xml);
+ }
+}
diff --git a/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php b/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php
index 19e82320d55..4296a4d5618 100644
--- a/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php
+++ b/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php
@@ -1,15 +1,15 @@
<?php
-
-namespace OCA\DAV\Tests\Unit\Connector\Sabre\Exception;
-
-use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
-
/**
* Copyright (c) 2015 Thomas Müller <deepdiver@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
+
+namespace OCA\DAV\Tests\Unit\Connector\Sabre\Exception;
+
+use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
+
class InvalidPathTest extends \Test\TestCase {
public function testSerialization() {
diff --git a/apps/dav/tests/unit/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php
index 94dadf88fe4..2a6cf46ef16 100644
--- a/apps/dav/tests/unit/connector/sabre/file.php
+++ b/apps/dav/tests/unit/connector/sabre/file.php
@@ -9,10 +9,18 @@
namespace OCA\DAV\Tests\Unit\Connector\Sabre;
use OC\Files\Storage\Local;
+use OCP\Files\ForbiddenException;
use Test\HookHelper;
use OC\Files\Filesystem;
use OCP\Lock\ILockingProvider;
+/**
+ * Class File
+ *
+ * @group DB
+ *
+ * @package Test\Connector\Sabre
+ */
class File extends \Test\TestCase {
/**
@@ -40,6 +48,9 @@ class File extends \Test\TestCase {
parent::tearDown();
}
+ /**
+ * @param string $string
+ */
private function getStream($string) {
$stream = fopen('php://temp', 'r+');
fwrite($stream, $string);
@@ -73,6 +84,10 @@ class File extends \Test\TestCase {
'Sabre\DAV\Exception\Forbidden'
],
[
+ new \OCP\Files\ForbiddenException('', true),
+ 'OCA\DAV\Connector\Sabre\Exception\Forbidden'
+ ],
+ [
new \OCP\Files\LockNotAcquiredException('/test.txt', 1),
'OCA\DAV\Connector\Sabre\Exception\FileLocked'
],
@@ -234,7 +249,7 @@ class File extends \Test\TestCase {
* @param string $path path to put the file into
* @param string $viewRoot root to use for the view
*
- * @return result of the PUT operaiton which is usually the etag
+ * @return null|string of the PUT operaiton which is usually the etag
*/
private function doPut($path, $viewRoot = null) {
$view = \OC\Files\Filesystem::getView();
@@ -691,6 +706,29 @@ class File extends \Test\TestCase {
}
/**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\Forbidden
+ */
+ public function testDeleteThrowsWhenDeletionThrows() {
+ // setup
+ $view = $this->getMock('\OC\Files\View',
+ array());
+
+ // but fails
+ $view->expects($this->once())
+ ->method('unlink')
+ ->willThrowException(new ForbiddenException('', true));
+
+ $info = new \OC\Files\FileInfo('/test.txt', null, null, array(
+ 'permissions' => \OCP\Constants::PERMISSION_ALL
+ ), null);
+
+ $file = new \OCA\DAV\Connector\Sabre\File($view, $info);
+
+ // action
+ $file->delete();
+ }
+
+ /**
* Asserts hook call
*
* @param array $callData hook call data to check
@@ -835,4 +873,22 @@ class File extends \Test\TestCase {
$file->get();
}
+
+ /**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\Forbidden
+ */
+ public function testGetFopenThrows() {
+ $view = $this->getMock('\OC\Files\View', ['fopen'], array());
+ $view->expects($this->atLeastOnce())
+ ->method('fopen')
+ ->willThrowException(new ForbiddenException('', true));
+
+ $info = new \OC\Files\FileInfo('/test.txt', null, null, array(
+ 'permissions' => \OCP\Constants::PERMISSION_ALL
+ ), null);
+
+ $file = new \OCA\DAV\Connector\Sabre\File($view, $info);
+
+ $file->get();
+ }
}
diff --git a/apps/dav/tests/unit/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php
index f3c862941c0..b33c8340f72 100644
--- a/apps/dav/tests/unit/connector/sabre/filesplugin.php
+++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php
@@ -11,10 +11,13 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre;
class FilesPlugin extends \Test\TestCase {
const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME;
const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME;
+ const INTERNAL_FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::INTERNAL_FILEID_PROPERTYNAME;
const SIZE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME;
const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME;
const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME;
const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME;
+ const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME;
+ const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
/**
* @var \Sabre\DAV\Server
@@ -52,6 +55,9 @@ class FilesPlugin extends \Test\TestCase {
$this->plugin->initialize($this->server);
}
+ /**
+ * @param string $class
+ */
private function createTestNode($class) {
$node = $this->getMockBuilder($class)
->disableOriginalConstructor()
@@ -67,7 +73,10 @@ class FilesPlugin extends \Test\TestCase {
$node->expects($this->any())
->method('getFileId')
- ->will($this->returnValue(123));
+ ->will($this->returnValue('00000123instanceid'));
+ $node->expects($this->any())
+ ->method('getInternalFileId')
+ ->will($this->returnValue('123'));
$node->expects($this->any())
->method('getEtag')
->will($this->returnValue('"abc"'));
@@ -88,16 +97,33 @@ class FilesPlugin extends \Test\TestCase {
array(
self::GETETAG_PROPERTYNAME,
self::FILEID_PROPERTYNAME,
+ self::INTERNAL_FILEID_PROPERTYNAME,
self::SIZE_PROPERTYNAME,
self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME,
+ self::OWNER_ID_PROPERTYNAME,
+ self::OWNER_DISPLAY_NAME_PROPERTYNAME
),
0
);
+ $user = $this->getMockBuilder('\OC\User\User')
+ ->disableOriginalConstructor()->getMock();
+ $user
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('foo'));
+ $user
+ ->expects($this->once())
+ ->method('getDisplayName')
+ ->will($this->returnValue('M. Foo'));
+
$node->expects($this->once())
->method('getDirectDownload')
->will($this->returnValue(array('url' => 'http://example.com/')));
+ $node->expects($this->exactly(2))
+ ->method('getOwner')
+ ->will($this->returnValue($user));
$node->expects($this->never())
->method('getSize');
@@ -107,10 +133,13 @@ class FilesPlugin extends \Test\TestCase {
);
$this->assertEquals('"abc"', $propFind->get(self::GETETAG_PROPERTYNAME));
- $this->assertEquals(123, $propFind->get(self::FILEID_PROPERTYNAME));
+ $this->assertEquals('00000123instanceid', $propFind->get(self::FILEID_PROPERTYNAME));
+ $this->assertEquals('123', $propFind->get(self::INTERNAL_FILEID_PROPERTYNAME));
$this->assertEquals(null, $propFind->get(self::SIZE_PROPERTYNAME));
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
$this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
+ $this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME));
+ $this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME));
$this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties());
}
@@ -166,7 +195,7 @@ class FilesPlugin extends \Test\TestCase {
);
$this->assertEquals('"abc"', $propFind->get(self::GETETAG_PROPERTYNAME));
- $this->assertEquals(123, $propFind->get(self::FILEID_PROPERTYNAME));
+ $this->assertEquals('00000123instanceid', $propFind->get(self::FILEID_PROPERTYNAME));
$this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME));
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
$this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
@@ -207,6 +236,36 @@ class FilesPlugin extends \Test\TestCase {
$this->assertEquals(200, $result[self::GETETAG_PROPERTYNAME]);
}
+ public function testUpdatePropsForbidden() {
+ $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File');
+
+ $propPatch = new \Sabre\DAV\PropPatch(array(
+ self::OWNER_ID_PROPERTYNAME => 'user2',
+ self::OWNER_DISPLAY_NAME_PROPERTYNAME => 'User Two',
+ self::FILEID_PROPERTYNAME => 12345,
+ self::PERMISSIONS_PROPERTYNAME => 'C',
+ self::SIZE_PROPERTYNAME => 123,
+ self::DOWNLOADURL_PROPERTYNAME => 'http://example.com/',
+ ));
+
+ $this->plugin->handleUpdateProperties(
+ '/dummypath',
+ $propPatch
+ );
+
+ $propPatch->commit();
+
+ $this->assertEmpty($propPatch->getRemainingMutations());
+
+ $result = $propPatch->getResult();
+ $this->assertEquals(403, $result[self::OWNER_ID_PROPERTYNAME]);
+ $this->assertEquals(403, $result[self::OWNER_DISPLAY_NAME_PROPERTYNAME]);
+ $this->assertEquals(403, $result[self::FILEID_PROPERTYNAME]);
+ $this->assertEquals(403, $result[self::PERMISSIONS_PROPERTYNAME]);
+ $this->assertEquals(403, $result[self::SIZE_PROPERTYNAME]);
+ $this->assertEquals(403, $result[self::DOWNLOADURL_PROPERTYNAME]);
+ }
+
/**
* Testcase from https://github.com/owncloud/core/issues/5251
*
diff --git a/apps/dav/tests/unit/connector/sabre/objecttree.php b/apps/dav/tests/unit/connector/sabre/objecttree.php
index 3a56404e552..1cea4ff0b69 100644
--- a/apps/dav/tests/unit/connector/sabre/objecttree.php
+++ b/apps/dav/tests/unit/connector/sabre/objecttree.php
@@ -41,6 +41,13 @@ class TestDoubleFileView extends \OC\Files\View {
}
}
+/**
+ * Class ObjectTree
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Connector\Sabre
+ */
class ObjectTree extends \Test\TestCase {
/**
diff --git a/apps/dav/tests/unit/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php
index 2fbab124fb7..9a6ae545b58 100644
--- a/apps/dav/tests/unit/connector/sabre/principal.php
+++ b/apps/dav/tests/unit/connector/sabre/principal.php
@@ -41,43 +41,45 @@ class Principal extends \Test\TestCase {
$fooUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
$fooUser
- ->expects($this->exactly(3))
- ->method('getUID')
- ->will($this->returnValue('foo'));
+ ->expects($this->exactly(1))
+ ->method('getUID')
+ ->will($this->returnValue('foo'));
+ $fooUser
+ ->expects($this->exactly(1))
+ ->method('getDisplayName')
+ ->will($this->returnValue('Dr. Foo-Bar'));
+ $fooUser
+ ->expects($this->exactly(1))
+ ->method('getEMailAddress')
+ ->will($this->returnValue(''));
$barUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
$barUser
- ->expects($this->exactly(3))
+ ->expects($this->exactly(1))
->method('getUID')
->will($this->returnValue('bar'));
+ $barUser
+ ->expects($this->exactly(1))
+ ->method('getEMailAddress')
+ ->will($this->returnValue('bar@owncloud.org'));
$this->userManager
->expects($this->once())
->method('search')
->with('')
->will($this->returnValue([$fooUser, $barUser]));
- $this->config
- ->expects($this->at(0))
- ->method('getUserValue')
- ->with('foo', 'settings', 'email')
- ->will($this->returnValue(''));
- $this->config
- ->expects($this->at(1))
- ->method('getUserValue')
- ->with('bar', 'settings', 'email')
- ->will($this->returnValue('bar@owncloud.org'));
$expectedResponse = [
0 => [
- 'uri' => 'principals/foo',
- '{DAV:}displayname' => 'foo'
+ 'uri' => 'principals/users/foo',
+ '{DAV:}displayname' => 'Dr. Foo-Bar'
],
1 => [
- 'uri' => 'principals/bar',
+ 'uri' => 'principals/users/bar',
'{DAV:}displayname' => 'bar',
'{http://sabredav.org/ns}email-address' => 'bar@owncloud.org'
]
];
- $response = $this->connector->getPrincipalsByPrefix('principals');
+ $response = $this->connector->getPrincipalsByPrefix('principals/users');
$this->assertSame($expectedResponse, $response);
}
@@ -88,7 +90,7 @@ class Principal extends \Test\TestCase {
->with('')
->will($this->returnValue([]));
- $response = $this->connector->getPrincipalsByPrefix('principals');
+ $response = $this->connector->getPrincipalsByPrefix('principals/users');
$this->assertSame([], $response);
}
@@ -96,7 +98,7 @@ class Principal extends \Test\TestCase {
$fooUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
$fooUser
- ->expects($this->exactly(3))
+ ->expects($this->exactly(1))
->method('getUID')
->will($this->returnValue('foo'));
$this->userManager
@@ -104,17 +106,12 @@ class Principal extends \Test\TestCase {
->method('get')
->with('foo')
->will($this->returnValue($fooUser));
- $this->config
- ->expects($this->once())
- ->method('getUserValue')
- ->with('foo', 'settings', 'email')
- ->will($this->returnValue(''));
$expectedResponse = [
- 'uri' => 'principals/foo',
+ 'uri' => 'principals/users/foo',
'{DAV:}displayname' => 'foo'
];
- $response = $this->connector->getPrincipalByPath('principals/foo');
+ $response = $this->connector->getPrincipalByPath('principals/users/foo');
$this->assertSame($expectedResponse, $response);
}
@@ -122,26 +119,25 @@ class Principal extends \Test\TestCase {
$fooUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
$fooUser
- ->expects($this->exactly(3))
- ->method('getUID')
- ->will($this->returnValue('foo'));
+ ->expects($this->exactly(1))
+ ->method('getEMailAddress')
+ ->will($this->returnValue('foo@owncloud.org'));
+ $fooUser
+ ->expects($this->exactly(1))
+ ->method('getUID')
+ ->will($this->returnValue('foo'));
$this->userManager
->expects($this->once())
->method('get')
->with('foo')
->will($this->returnValue($fooUser));
- $this->config
- ->expects($this->once())
- ->method('getUserValue')
- ->with('foo', 'settings', 'email')
- ->will($this->returnValue('foo@owncloud.org'));
$expectedResponse = [
- 'uri' => 'principals/foo',
+ 'uri' => 'principals/users/foo',
'{DAV:}displayname' => 'foo',
'{http://sabredav.org/ns}email-address' => 'foo@owncloud.org'
];
- $response = $this->connector->getPrincipalByPath('principals/foo');
+ $response = $this->connector->getPrincipalByPath('principals/users/foo');
$this->assertSame($expectedResponse, $response);
}
@@ -152,7 +148,7 @@ class Principal extends \Test\TestCase {
->with('foo')
->will($this->returnValue(null));
- $response = $this->connector->getPrincipalByPath('principals/foo');
+ $response = $this->connector->getPrincipalByPath('principals/users/foo');
$this->assertSame(null, $response);
}
@@ -160,7 +156,7 @@ class Principal extends \Test\TestCase {
$fooUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
$fooUser
- ->expects($this->exactly(3))
+ ->expects($this->exactly(1))
->method('getUID')
->will($this->returnValue('foo'));
$this->userManager
@@ -168,14 +164,9 @@ class Principal extends \Test\TestCase {
->method('get')
->with('foo')
->will($this->returnValue($fooUser));
- $this->config
- ->expects($this->once())
- ->method('getUserValue')
- ->with('foo', 'settings', 'email')
- ->will($this->returnValue('foo@owncloud.org'));
- $response = $this->connector->getGroupMemberSet('principals/foo');
- $this->assertSame(['principals/foo'], $response);
+ $response = $this->connector->getGroupMemberSet('principals/users/foo');
+ $this->assertSame(['principals/users/foo'], $response);
}
/**
@@ -189,14 +180,14 @@ class Principal extends \Test\TestCase {
->with('foo')
->will($this->returnValue(null));
- $this->connector->getGroupMemberSet('principals/foo');
+ $this->connector->getGroupMemberSet('principals/users/foo');
}
public function testGetGroupMembership() {
$fooUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
$fooUser
- ->expects($this->exactly(3))
+ ->expects($this->exactly(1))
->method('getUID')
->will($this->returnValue('foo'));
$this->userManager
@@ -204,17 +195,12 @@ class Principal extends \Test\TestCase {
->method('get')
->with('foo')
->will($this->returnValue($fooUser));
- $this->config
- ->expects($this->once())
- ->method('getUserValue')
- ->with('foo', 'settings', 'email')
- ->will($this->returnValue('foo@owncloud.org'));
$expectedResponse = [
- 'principals/foo/calendar-proxy-read',
- 'principals/foo/calendar-proxy-write'
+ 'principals/users/foo/calendar-proxy-read',
+ 'principals/users/foo/calendar-proxy-write'
];
- $response = $this->connector->getGroupMembership('principals/foo');
+ $response = $this->connector->getGroupMembership('principals/users/foo');
$this->assertSame($expectedResponse, $response);
}
@@ -229,7 +215,7 @@ class Principal extends \Test\TestCase {
->with('foo')
->will($this->returnValue(null));
- $this->connector->getGroupMembership('principals/foo');
+ $this->connector->getGroupMembership('principals/users/foo');
}
/**
@@ -237,7 +223,7 @@ class Principal extends \Test\TestCase {
* @expectedExceptionMessage Setting members of the group is not supported yet
*/
public function testSetGroupMembership() {
- $this->connector->setGroupMemberSet('principals/foo', ['foo']);
+ $this->connector->setGroupMemberSet('principals/users/foo', ['foo']);
}
public function testUpdatePrincipal() {
@@ -245,6 +231,6 @@ class Principal extends \Test\TestCase {
}
public function testSearchPrincipals() {
- $this->assertSame([], $this->connector->searchPrincipals('principals', []));
+ $this->assertSame([], $this->connector->searchPrincipals('principals/users', []));
}
}
diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/auth.php b/apps/dav/tests/unit/connector/sabre/requesttest/auth.php
index 41b554d11db..3caa019af8d 100644
--- a/apps/dav/tests/unit/connector/sabre/requesttest/auth.php
+++ b/apps/dav/tests/unit/connector/sabre/requesttest/auth.php
@@ -9,6 +9,8 @@
namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest;
use Sabre\DAV\Auth\Backend\BackendInterface;
+use Sabre\HTTP\RequestInterface;
+use Sabre\HTTP\ResponseInterface;
class Auth implements BackendInterface {
/**
@@ -32,18 +34,35 @@ class Auth implements BackendInterface {
$this->password = $password;
}
-
/**
- * Authenticates the user based on the current request.
+ * When this method is called, the backend must check if authentication was
+ * successful.
+ *
+ * The returned value must be one of the following
+ *
+ * [true, "principals/username"]
+ * [false, "reason for failure"]
+ *
+ * If authentication was successful, it's expected that the authentication
+ * backend returns a so-called principal url.
+ *
+ * Examples of a principal url:
*
- * If authentication is successful, true must be returned.
- * If authentication fails, an exception must be thrown.
+ * principals/admin
+ * principals/user1
+ * principals/users/joe
+ * principals/uid/123457
*
- * @param \Sabre\DAV\Server $server
- * @param string $realm
- * @return bool
+ * If you don't use WebDAV ACL (RFC3744) we recommend that you simply
+ * return a string such as:
+ *
+ * principals/users/[username]
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return array
*/
- function authenticate(\Sabre\DAV\Server $server, $realm) {
+ function check(RequestInterface $request, ResponseInterface $response) {
$userSession = \OC::$server->getUserSession();
$result = $userSession->login($this->user, $this->password);
if ($result) {
@@ -52,18 +71,33 @@ class Auth implements BackendInterface {
\OC_Util::setupFS($user);
//trigger creation of user home and /files folder
\OC::$server->getUserFolder($user);
+ return [true, "principals/$user"];
}
- return $result;
+ return [false, "login failed"];
}
/**
- * Returns information about the currently logged in username.
+ * This method is called when a user could not be authenticated, and
+ * authentication was required for the current request.
+ *
+ * This gives you the opportunity to set authentication headers. The 401
+ * status code will already be set.
+ *
+ * In this case of Basic Auth, this would for example mean that the
+ * following header needs to be set:
+ *
+ * $response->addHeader('WWW-Authenticate', 'Basic realm=SabreDAV');
*
- * If nobody is currently logged in, this method should return null.
+ * Keep in mind that in the case of multiple authentication backends, other
+ * WWW-Authenticate headers may already have been set, and you'll want to
+ * append your own WWW-Authenticate header instead of overwriting the
+ * existing one.
*
- * @return string|null
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return void
*/
- function getCurrentUser() {
- return $this->user;
+ function challenge(RequestInterface $request, ResponseInterface $response) {
+ // TODO: Implement challenge() method.
}
}
diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php
index 245deff3b31..29454c38218 100644
--- a/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php
+++ b/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php
@@ -11,6 +11,13 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest;
use OCP\AppFramework\Http;
use OCP\Lock\ILockingProvider;
+/**
+ * Class DownloadTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest
+ */
class DownloadTest extends RequestTest {
public function testDownload() {
$user = $this->getUniqueID();
diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php
index ed1d6046d75..b79dfa0c265 100644
--- a/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php
+++ b/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php
@@ -11,6 +11,13 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest;
use OC\Files\View;
use Test\Traits\EncryptionTrait;
+/**
+ * Class EncryptionUploadTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest
+ */
class EncryptionUploadTest extends UploadTest {
use EncryptionTrait;
diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php b/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php
index d90cf6e19bc..a83f25c1585 100644
--- a/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php
+++ b/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php
@@ -46,7 +46,8 @@ abstract class RequestTest extends TestCase {
\OC::$server->getUserSession(),
\OC::$server->getMountManager(),
\OC::$server->getTagManager(),
- \OC::$server->getEventDispatcher()
+ \OC::$server->getEventDispatcher(),
+ $this->getMock('\OCP\IRequest')
);
}
@@ -67,6 +68,7 @@ abstract class RequestTest extends TestCase {
* @param resource|string|null $body
* @param array|null $headers
* @return \Sabre\HTTP\Response
+ * @throws \Exception
*/
protected function request($view, $user, $password, $method, $url, $body = null, $headers = null) {
if (is_string($body)) {
diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php
index a2a8326f4ff..c1876a7f29f 100644
--- a/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php
+++ b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php
@@ -12,6 +12,13 @@ use OC\Connector\Sabre\Exception\FileLocked;
use OCP\AppFramework\Http;
use OCP\Lock\ILockingProvider;
+/**
+ * Class UploadTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest
+ */
class UploadTest extends RequestTest {
public function testBasicUpload() {
$user = $this->getUniqueID();
diff --git a/apps/encryption/hooks/userhooks.php b/apps/encryption/hooks/userhooks.php
index 5bd5e39f3c5..4a5f1198fcf 100644
--- a/apps/encryption/hooks/userhooks.php
+++ b/apps/encryption/hooks/userhooks.php
@@ -141,7 +141,7 @@ class UserHooks implements IHook {
*
* @note This method should never be called for users using client side encryption
* @param array $params
- * @return bool
+ * @return boolean|null
*/
public function login($params) {
@@ -199,7 +199,7 @@ class UserHooks implements IHook {
* If the password can't be changed within ownCloud, than update the key password in advance.
*
* @param array $params : uid, password
- * @return bool
+ * @return boolean|null
*/
public function preSetPassphrase($params) {
if (App::isEnabled('encryption')) {
@@ -216,7 +216,7 @@ class UserHooks implements IHook {
* Change a user's encryption passphrase
*
* @param array $params keys: uid, password
- * @return bool
+ * @return boolean|null
*/
public function setPassphrase($params) {
diff --git a/apps/encryption/l10n/es_AR.js b/apps/encryption/l10n/es_AR.js
index bff5b7c593e..3f2fbb5de32 100644
--- a/apps/encryption/l10n/es_AR.js
+++ b/apps/encryption/l10n/es_AR.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"encryption",
{
+ "Missing recovery key password" : "Falta contraseña de recuperación",
"Recovery key successfully enabled" : "Se habilitó la recuperación de archivos",
"Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la clave de recuperación. Por favor, comprobá tu contraseña.",
"Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
diff --git a/apps/encryption/l10n/es_AR.json b/apps/encryption/l10n/es_AR.json
index 0cdcd9cd121..225ca5139f2 100644
--- a/apps/encryption/l10n/es_AR.json
+++ b/apps/encryption/l10n/es_AR.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Missing recovery key password" : "Falta contraseña de recuperación",
"Recovery key successfully enabled" : "Se habilitó la recuperación de archivos",
"Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la clave de recuperación. Por favor, comprobá tu contraseña.",
"Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
diff --git a/apps/encryption/l10n/tr.js b/apps/encryption/l10n/tr.js
index e1fcb526d06..5abbf87b813 100644
--- a/apps/encryption/l10n/tr.js
+++ b/apps/encryption/l10n/tr.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.",
"Cheers!" : "Hoşçakalın!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.<br><br>",
+ "Encrypt the home storage" : "Yerel depolamayı şifrele",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Bu seçeneği etkinleştirmek ana depolamadaki bütün dosyaları şifreler, aksi takdirde sadece harici depolamadaki dosyalar şifrelenir",
"Enable recovery key" : "Kurtarma anahtarını etkinleştir",
"Disable recovery key" : "Kurtarma anahtarını devre dışı bırak",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kurtarma anahtarı, dosyaların şifrelenmesi için daha fazla \nşifreleme sunar. Bu kullanıcının dosyasının şifresini unuttuğunda kurtarmasına imkan verir.",
diff --git a/apps/encryption/l10n/tr.json b/apps/encryption/l10n/tr.json
index 743d3e7d15c..31824461d84 100644
--- a/apps/encryption/l10n/tr.json
+++ b/apps/encryption/l10n/tr.json
@@ -30,6 +30,8 @@
"The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.",
"Cheers!" : "Hoşçakalın!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.<br><br>",
+ "Encrypt the home storage" : "Yerel depolamayı şifrele",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Bu seçeneği etkinleştirmek ana depolamadaki bütün dosyaları şifreler, aksi takdirde sadece harici depolamadaki dosyalar şifrelenir",
"Enable recovery key" : "Kurtarma anahtarını etkinleştir",
"Disable recovery key" : "Kurtarma anahtarını devre dışı bırak",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kurtarma anahtarı, dosyaların şifrelenmesi için daha fazla \nşifreleme sunar. Bu kullanıcının dosyasının şifresini unuttuğunda kurtarmasına imkan verir.",
diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php
index c0dcc936bdf..dbc0364a157 100644
--- a/apps/encryption/lib/crypto/crypt.php
+++ b/apps/encryption/lib/crypto/crypt.php
@@ -34,7 +34,6 @@ use OCA\Encryption\Vendor\PBKDF2Fallback;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\IConfig;
use OCP\ILogger;
-use OCP\IUser;
use OCP\IUserSession;
class Crypt {
@@ -146,7 +145,7 @@ class Crypt {
/**
* @param string $plainContent
* @param string $passPhrase
- * @return bool|string
+ * @return false|string
* @throws GenericEncryptionException
*/
public function symmetricEncryptFileContent($plainContent, $passPhrase) {
@@ -273,7 +272,7 @@ class Crypt {
}
/**
- * @param $data
+ * @param string $data
* @return string
*/
private function addPadding($data) {
@@ -326,7 +325,7 @@ class Crypt {
* @param string $privateKey
* @param string $password
* @param string $uid for regular users, empty for system keys
- * @return bool|string
+ * @return false|string
*/
public function encryptPrivateKey($privateKey, $password, $uid = '') {
$cipher = $this->getCipher();
@@ -343,7 +342,7 @@ class Crypt {
* @param string $privateKey
* @param string $password
* @param string $uid for regular users, empty for system keys
- * @return bool|string
+ * @return false|string
*/
public function decryptPrivateKey($privateKey, $password = '', $uid = '') {
@@ -386,7 +385,7 @@ class Crypt {
/**
* check if it is a valid private key
*
- * @param $plainKey
+ * @param string $plainKey
* @return bool
*/
protected function isValidPrivateKey($plainKey) {
@@ -402,7 +401,7 @@ class Crypt {
}
/**
- * @param $keyFileContents
+ * @param string $keyFileContents
* @param string $passPhrase
* @param string $cipher
* @return string
@@ -424,7 +423,7 @@ class Crypt {
* remove padding
*
* @param $padded
- * @return bool|string
+ * @return string|false
*/
private function removePadding($padded) {
if (substr($padded, -2) === 'xx') {
@@ -436,8 +435,8 @@ class Crypt {
/**
* split iv from encrypted content
*
- * @param $catFile
- * @return array
+ * @param string|false $catFile
+ * @return string
*/
private function splitIv($catFile) {
// Fetch encryption metadata from end of file
@@ -457,8 +456,8 @@ class Crypt {
}
/**
- * @param $encryptedContent
- * @param $iv
+ * @param string $encryptedContent
+ * @param string $iv
* @param string $passPhrase
* @param string $cipher
* @return string
@@ -479,7 +478,7 @@ class Crypt {
}
/**
- * @param $data
+ * @param string $data
* @return array
*/
protected function parseHeader($data) {
@@ -551,7 +550,7 @@ class Crypt {
* @param $encKeyFile
* @param $shareKey
* @param $privateKey
- * @return mixed
+ * @return string
* @throws MultiKeyDecryptException
*/
public function multiKeyDecrypt($encKeyFile, $shareKey, $privateKey) {
diff --git a/apps/encryption/lib/crypto/encryptall.php b/apps/encryption/lib/crypto/encryptall.php
index 8e97fe341b4..ef67523d7e2 100644
--- a/apps/encryption/lib/crypto/encryptall.php
+++ b/apps/encryption/lib/crypto/encryptall.php
@@ -31,6 +31,7 @@ use OCP\IL10N;
use OCP\IUserManager;
use OCP\Mail\IMailer;
use OCP\Security\ISecureRandom;
+use OCP\Util;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Helper\Table;
@@ -358,14 +359,15 @@ class EncryptAll {
$progress = new ProgressBar($this->output, count($this->userPasswords));
$progress->start();
- foreach ($this->userPasswords as $recipient => $password) {
+ foreach ($this->userPasswords as $uid => $password) {
$progress->advance();
if (!empty($password)) {
- $recipientDisplayName = $this->userManager->get($recipient)->getDisplayName();
- $to = $this->config->getUserValue($recipient, 'settings', 'email', '');
+ $recipient = $this->userManager->get($uid);
+ $recipientDisplayName = $recipient->getDisplayName();
+ $to = $recipient->getEMailAddress();
if ($to === '') {
- $noMail[] = $recipient;
+ $noMail[] = $uid;
continue;
}
@@ -380,12 +382,12 @@ class EncryptAll {
$message->setHtmlBody($htmlBody);
$message->setPlainBody($textBody);
$message->setFrom([
- \OCP\Util::getDefaultEmailAddress('admin-noreply')
+ Util::getDefaultEmailAddress('admin-noreply')
]);
$this->mailer->send($message);
} catch (\Exception $e) {
- $noMail[] = $recipient;
+ $noMail[] = $uid;
}
}
}
diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php
index d1140ce7cde..ea6c05c338f 100644
--- a/apps/encryption/lib/crypto/encryption.php
+++ b/apps/encryption/lib/crypto/encryption.php
@@ -247,7 +247,7 @@ class Encryption implements IEncryptionModule {
* encrypt data
*
* @param string $data you want to encrypt
- * @return mixed encrypted data
+ * @return string encrypted data
*/
public function encrypt($data) {
@@ -312,7 +312,7 @@ class Encryption implements IEncryptionModule {
* decrypt data
*
* @param string $data you want to decrypt
- * @return mixed decrypted data
+ * @return string decrypted data
* @throws DecryptionFailedException
*/
public function decrypt($data) {
diff --git a/apps/encryption/lib/keymanager.php b/apps/encryption/lib/keymanager.php
index c4507228878..0c8418c67a8 100644
--- a/apps/encryption/lib/keymanager.php
+++ b/apps/encryption/lib/keymanager.php
@@ -280,7 +280,7 @@ class KeyManager {
/**
* @param $userId
- * @param $key
+ * @param string $key
* @return bool
*/
public function setPrivateKey($userId, $key) {
@@ -365,7 +365,7 @@ class KeyManager {
/**
* @param $userId
- * @return mixed
+ * @return string
* @throws PrivateKeyMissingException
*/
public function getPrivateKey($userId) {
@@ -379,7 +379,7 @@ class KeyManager {
}
/**
- * @param $path
+ * @param string $path
* @param $uid
* @return string
*/
@@ -412,7 +412,7 @@ class KeyManager {
/**
* get the encrypted file key
*
- * @param $path
+ * @param string $path
* @return string
*/
public function getEncryptedFileKey($path) {
@@ -508,7 +508,7 @@ class KeyManager {
}
/**
- * @param $purpose
+ * @param string $purpose
* @param bool $timestamp
* @param bool $includeUserKeys
*/
@@ -534,13 +534,16 @@ class KeyManager {
}
/**
- * @param $uid
+ * @param string $uid
* @return bool
*/
private function deletePrivateKey($uid) {
return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId, Encryption::ID);
}
+ /**
+ * @param string $path
+ */
public function deleteAllFileKeys($path) {
return $this->keyStorage->deleteAllFileKeys($path);
}
diff --git a/apps/encryption/lib/migration.php b/apps/encryption/lib/migration.php
index 1a7c2e9877d..7bc399ddcbe 100644
--- a/apps/encryption/lib/migration.php
+++ b/apps/encryption/lib/migration.php
@@ -50,7 +50,7 @@ class Migration {
*/
public function __construct(IConfig $config, View $view, IDBConnection $connection, ILogger $logger) {
$this->view = $view;
- $this->view->getUpdater()->disable();
+ $this->view->disableCacheUpdate();
$this->connection = $connection;
$this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
$this->config = $config;
@@ -237,7 +237,7 @@ class Migration {
/**
* rename system wide public key
*
- * @param $privateKey private key for which we want to rename the corresponding public key
+ * @param string $privateKey private key for which we want to rename the corresponding public key
*/
private function renameSystemPublicKey($privateKey) {
$publicKey = substr($privateKey,0 , strrpos($privateKey, '.privateKey')) . '.publicKey';
diff --git a/apps/encryption/lib/recovery.php b/apps/encryption/lib/recovery.php
index e7b20e2c4af..cffa641f517 100644
--- a/apps/encryption/lib/recovery.php
+++ b/apps/encryption/lib/recovery.php
@@ -103,7 +103,7 @@ class Recovery {
/**
* @param $recoveryKeyId
- * @param $password
+ * @param string $password
* @return bool
*/
public function enableAdminRecovery($password) {
@@ -144,7 +144,7 @@ class Recovery {
}
/**
- * @param $recoveryPassword
+ * @param string $recoveryPassword
* @return bool
*/
public function disableAdminRecovery($recoveryPassword) {
@@ -212,6 +212,7 @@ class Recovery {
/**
* add recovery key to all encrypted files
+ * @param string $path
*/
private function addRecoveryKeys($path) {
$dirContent = $this->view->getDirectoryContent($path);
@@ -239,6 +240,7 @@ class Recovery {
/**
* remove recovery key to all encrypted files
+ * @param string $path
*/
private function removeRecoveryKeys($path) {
$dirContent = $this->view->getDirectoryContent($path);
diff --git a/apps/encryption/tests/lib/MigrationTest.php b/apps/encryption/tests/lib/MigrationTest.php
index 65fefa262a7..fc3d014345b 100644
--- a/apps/encryption/tests/lib/MigrationTest.php
+++ b/apps/encryption/tests/lib/MigrationTest.php
@@ -62,6 +62,9 @@ class MigrationTest extends \Test\TestCase {
$this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
}
+ /**
+ * @param string $uid
+ */
protected function createDummyShareKeys($uid) {
$this->loginAsUser($uid);
@@ -89,6 +92,9 @@ class MigrationTest extends \Test\TestCase {
}
}
+ /**
+ * @param string $uid
+ */
protected function createDummyUserKeys($uid) {
$this->loginAsUser($uid);
@@ -98,6 +104,9 @@ class MigrationTest extends \Test\TestCase {
$this->view->file_put_contents('/files_encryption/public_keys/' . $uid . '.publicKey', 'publicKey');
}
+ /**
+ * @param string $uid
+ */
protected function createDummyFileKeys($uid) {
$this->loginAsUser($uid);
@@ -111,6 +120,9 @@ class MigrationTest extends \Test\TestCase {
$this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/fileKey' , 'data');
}
+ /**
+ * @param string $uid
+ */
protected function createDummyFiles($uid) {
$this->loginAsUser($uid);
@@ -124,6 +136,9 @@ class MigrationTest extends \Test\TestCase {
$this->view->file_put_contents($uid . '/files/folder2/file.2.1/fileKey' , 'data');
}
+ /**
+ * @param string $uid
+ */
protected function createDummyFilesInTrash($uid) {
$this->loginAsUser($uid);
@@ -239,6 +254,9 @@ class MigrationTest extends \Test\TestCase {
}
+ /**
+ * @param string $uid
+ */
protected function verifyFilesInTrash($uid) {
$this->loginAsUser($uid);
@@ -266,6 +284,9 @@ class MigrationTest extends \Test\TestCase {
);
}
+ /**
+ * @param string $uid
+ */
protected function verifyNewKeyPath($uid) {
// private key
if ($uid !== '') {
@@ -394,6 +415,11 @@ class MigrationTest extends \Test\TestCase {
}
+ /**
+ * @param string $table
+ * @param string $appid
+ * @param integer $expected
+ */
public function verifyDB($table, $appid, $expected) {
/** @var \OCP\IDBConnection $connection */
$connection = \OC::$server->getDatabaseConnection();
diff --git a/apps/federation/api/ocsauthapi.php b/apps/federation/api/ocsauthapi.php
new file mode 100644
index 00000000000..42d7113820d
--- /dev/null
+++ b/apps/federation/api/ocsauthapi.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\API;
+
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\AppFramework\Http;
+use OCP\BackgroundJob\IJobList;
+use OCP\IRequest;
+use OCP\Security\ISecureRandom;
+use OCP\Security\StringUtils;
+
+/**
+ * Class OCSAuthAPI
+ *
+ * OCS API end-points to exchange shared secret between two connected ownClouds
+ *
+ * @package OCA\Federation\API
+ */
+class OCSAuthAPI {
+
+ /** @var IRequest */
+ private $request;
+
+ /** @var ISecureRandom */
+ private $secureRandom;
+
+ /** @var IJobList */
+ private $jobList;
+
+ /** @var TrustedServers */
+ private $trustedServers;
+
+ /** @var DbHandler */
+ private $dbHandler;
+
+ /**
+ * OCSAuthAPI constructor.
+ *
+ * @param IRequest $request
+ * @param ISecureRandom $secureRandom
+ * @param IJobList $jobList
+ * @param TrustedServers $trustedServers
+ * @param DbHandler $dbHandler
+ */
+ public function __construct(
+ IRequest $request,
+ ISecureRandom $secureRandom,
+ IJobList $jobList,
+ TrustedServers $trustedServers,
+ DbHandler $dbHandler
+ ) {
+ $this->request = $request;
+ $this->secureRandom = $secureRandom;
+ $this->jobList = $jobList;
+ $this->trustedServers = $trustedServers;
+ $this->dbHandler = $dbHandler;
+ }
+
+ /**
+ * request received to ask remote server for a shared secret
+ *
+ * @return \OC_OCS_Result
+ */
+ public function requestSharedSecret() {
+
+ $url = $this->request->getParam('url');
+ $token = $this->request->getParam('token');
+
+ if ($this->trustedServers->isTrustedServer($url) === false) {
+ return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN);
+ }
+
+ // if both server initiated the exchange of the shared secret the greater
+ // token wins
+ $localToken = $this->dbHandler->getToken($url);
+ if (strcmp($localToken, $token) > 0) {
+ return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN);
+ }
+
+ $this->jobList->add(
+ 'OCA\Federation\BackgroundJob\GetSharedSecret',
+ [
+ 'url' => $url,
+ 'token' => $token,
+ ]
+ );
+
+ return new \OC_OCS_Result(null, Http::STATUS_OK);
+
+ }
+
+ /**
+ * create shared secret and return it
+ *
+ * @return \OC_OCS_Result
+ */
+ public function getSharedSecret() {
+
+ $url = $this->request->getParam('url');
+ $token = $this->request->getParam('token');
+
+ if (
+ $this->trustedServers->isTrustedServer($url) === false
+ || $this->isValidToken($url, $token) === false
+ ) {
+ return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN);
+ }
+
+ $sharedSecret = $this->secureRandom->getMediumStrengthGenerator()->generate(32);
+
+ $this->trustedServers->addSharedSecret($url, $sharedSecret);
+ // reset token after the exchange of the shared secret was successful
+ $this->dbHandler->addToken($url, '');
+
+ return new \OC_OCS_Result(['sharedSecret' => $sharedSecret], Http::STATUS_OK);
+
+ }
+
+ protected function isValidToken($url, $token) {
+ $storedToken = $this->dbHandler->getToken($url);
+ return StringUtils::equals($storedToken, $token);
+ }
+
+}
diff --git a/apps/federation/appinfo/app.php b/apps/federation/appinfo/app.php
new file mode 100644
index 00000000000..8cc77885d6f
--- /dev/null
+++ b/apps/federation/appinfo/app.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Federation\AppInfo;
+
+$app = new Application();
+$app->registerSettings();
+$app->registerHooks();
diff --git a/apps/federation/appinfo/application.php b/apps/federation/appinfo/application.php
new file mode 100644
index 00000000000..172283536b4
--- /dev/null
+++ b/apps/federation/appinfo/application.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Federation\AppInfo;
+
+use OCA\Federation\API\OCSAuthAPI;
+use OCA\Federation\Controller\SettingsController;
+use OCA\Federation\DbHandler;
+use OCA\Federation\Hooks;
+use OCA\Federation\Middleware\AddServerMiddleware;
+use OCA\Federation\TrustedServers;
+use OCP\API;
+use OCP\App;
+use OCP\AppFramework\IAppContainer;
+use OCP\Util;
+
+class Application extends \OCP\AppFramework\App {
+
+ /**
+ * @param array $urlParams
+ */
+ public function __construct($urlParams = array()) {
+ parent::__construct('federation', $urlParams);
+ $this->registerService();
+ $this->registerMiddleware();
+ }
+
+ /**
+ * register setting scripts
+ */
+ public function registerSettings() {
+ App::registerAdmin('federation', 'settings/settings-admin');
+ }
+
+ private function registerService() {
+ $container = $this->getContainer();
+
+ $container->registerService('addServerMiddleware', function(IAppContainer $c) {
+ return new AddServerMiddleware(
+ $c->getAppName(),
+ \OC::$server->getL10N($c->getAppName()),
+ \OC::$server->getLogger()
+ );
+ });
+
+ $container->registerService('DbHandler', function(IAppContainer $c) {
+ return new DbHandler(
+ \OC::$server->getDatabaseConnection(),
+ \OC::$server->getL10N($c->getAppName())
+ );
+ });
+
+ $container->registerService('TrustedServers', function(IAppContainer $c) {
+ return new TrustedServers(
+ $c->query('DbHandler'),
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getLogger(),
+ \OC::$server->getJobList(),
+ \OC::$server->getSecureRandom(),
+ \OC::$server->getConfig()
+ );
+ });
+
+ $container->registerService('SettingsController', function (IAppContainer $c) {
+ $server = $c->getServer();
+ return new SettingsController(
+ $c->getAppName(),
+ $server->getRequest(),
+ $server->getL10N($c->getAppName()),
+ $c->query('TrustedServers')
+ );
+ });
+ }
+
+ private function registerMiddleware() {
+ $container = $this->getContainer();
+ $container->registerMiddleware('addServerMiddleware');
+ }
+
+ /**
+ * register OCS API Calls
+ */
+ public function registerOCSApi() {
+
+ $container = $this->getContainer();
+ $server = $container->getServer();
+
+ $auth = new OCSAuthAPI(
+ $server->getRequest(),
+ $server->getSecureRandom(),
+ $server->getJobList(),
+ $container->query('TrustedServers'),
+ $container->query('DbHandler')
+
+ );
+
+ API::register('get',
+ '/apps/federation/api/v1/shared-secret',
+ array($auth, 'getSharedSecret'),
+ 'federation',
+ API::GUEST_AUTH
+ );
+
+ API::register('post',
+ '/apps/federation/api/v1/request-shared-secret',
+ array($auth, 'requestSharedSecret'),
+ 'federation',
+ API::GUEST_AUTH
+ );
+
+ }
+
+ /**
+ * listen to federated_share_added hooks to auto-add new servers to the
+ * list of trusted servers.
+ */
+ public function registerHooks() {
+
+ $container = $this->getContainer();
+ $hooksManager = new Hooks($container->query('TrustedServers'));
+
+ Util::connectHook(
+ 'OCP\Share',
+ 'federated_share_added',
+ $hooksManager,
+ 'addServerHook'
+ );
+ }
+
+}
diff --git a/apps/federation/appinfo/database.xml b/apps/federation/appinfo/database.xml
new file mode 100644
index 00000000000..e0bb241918e
--- /dev/null
+++ b/apps/federation/appinfo/database.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<database>
+ <name>*dbname*</name>
+ <create>true</create>
+ <overwrite>false</overwrite>
+ <charset>utf8</charset>
+ <table>
+ <name>*dbprefix*trusted_servers</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <length>4</length>
+ </field>
+ <field>
+ <name>url</name>
+ <type>text</type>
+ <notnull>true</notnull>
+ <length>512</length>
+ <comments>Url of trusted server</comments>
+ </field>
+ <field>
+ <name>url_hash</name>
+ <type>text</type>
+ <default></default>
+ <notnull>true</notnull>
+ <length>32</length>
+ <comments>md5 hash of the url without the protocol</comments>
+ </field>
+ <field>
+ <name>token</name>
+ <type>text</type>
+ <length>128</length>
+ <comments>toke used to exchange the shared secret</comments>
+ </field>
+ <field>
+ <name>shared_secret</name>
+ <type>text</type>
+ <length>256</length>
+ <comments>shared secret used to authenticate</comments>
+ </field>
+ <field>
+ <name>status</name>
+ <type>integer</type>
+ <length>4</length>
+ <notnull>true</notnull>
+ <default>2</default>
+ <comments>current status of the connection</comments>
+ </field>
+ <index>
+ <name>url_hash</name>
+ <unique>true</unique>
+ <field>
+ <name>url_hash</name>
+ <sorting>ascending</sorting>
+ </field>
+ </index>
+ </declaration>
+ </table>
+</database>
diff --git a/apps/federation/appinfo/info.xml b/apps/federation/appinfo/info.xml
new file mode 100644
index 00000000000..53b2926ba53
--- /dev/null
+++ b/apps/federation/appinfo/info.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<info>
+ <id>federation</id>
+ <name>Federation</name>
+ <description>ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing.</description>
+ <licence>AGPL</licence>
+ <author>Bjoern Schiessle</author>
+ <version>0.0.1</version>
+ <namespace>Federation</namespace>
+ <category>other</category>
+ <dependencies>
+ <owncloud min-version="9.0" />
+ </dependencies>
+</info>
diff --git a/apps/federation/appinfo/routes.php b/apps/federation/appinfo/routes.php
new file mode 100644
index 00000000000..8c1629a4fc6
--- /dev/null
+++ b/apps/federation/appinfo/routes.php
@@ -0,0 +1,47 @@
+<?php
+/**
+* @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+*
+ * This code is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+$application = new \OCA\Federation\AppInfo\Application();
+
+$application->registerRoutes(
+ $this,
+ [
+ 'routes' => [
+ [
+ 'name' => 'Settings#addServer',
+ 'url' => '/trusted-servers',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Settings#removeServer',
+ 'url' => '/trusted-servers/{id}',
+ 'verb' => 'DELETE'
+ ],
+ [
+ 'name' => 'Settings#autoAddServers',
+ 'url' => '/auto-add-servers',
+ 'verb' => 'POST'
+ ],
+ ]
+ ]
+);
+
+$application->registerOCSApi();
diff --git a/apps/federation/backgroundjob/getsharedsecret.php b/apps/federation/backgroundjob/getsharedsecret.php
new file mode 100644
index 00000000000..eb55fa2d6ab
--- /dev/null
+++ b/apps/federation/backgroundjob/getsharedsecret.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\BackgroundJob;
+
+use GuzzleHttp\Exception\ClientException;
+use OC\BackgroundJob\JobList;
+use OC\BackgroundJob\QueuedJob;
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\AppFramework\Http;
+use OCP\BackgroundJob\IJobList;
+use OCP\Http\Client\IClient;
+use OCP\ILogger;
+use OCP\IURLGenerator;
+
+/**
+ * Class GetSharedSecret
+ *
+ * request shared secret from remote ownCloud
+ *
+ * @package OCA\Federation\Backgroundjob
+ */
+class GetSharedSecret extends QueuedJob{
+
+ /** @var IClient */
+ private $httpClient;
+
+ /** @var IJobList */
+ private $jobList;
+
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /** @var TrustedServers */
+ private $trustedServers;
+
+ /** @var DbHandler */
+ private $dbHandler;
+
+ /** @var ILogger */
+ private $logger;
+
+ private $endPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret?format=json';
+
+ /**
+ * RequestSharedSecret constructor.
+ *
+ * @param IClient $httpClient
+ * @param IURLGenerator $urlGenerator
+ * @param IJobList $jobList
+ * @param TrustedServers $trustedServers
+ * @param ILogger $logger
+ * @param DbHandler $dbHandler
+ */
+ public function __construct(
+ IClient $httpClient = null,
+ IURLGenerator $urlGenerator = null,
+ IJobList $jobList = null,
+ TrustedServers $trustedServers = null,
+ ILogger $logger = null,
+ dbHandler $dbHandler = null
+ ) {
+ $this->logger = $logger ? $logger : \OC::$server->getLogger();
+ $this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient();
+ $this->jobList = $jobList ? $jobList : \OC::$server->getJobList();
+ $this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator();
+ $this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation'));
+ if ($trustedServers) {
+ $this->trustedServers = $trustedServers;
+ } else {
+ $this->trustedServers = new TrustedServers(
+ $this->dbHandler,
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getLogger(),
+ $this->jobList,
+ \OC::$server->getSecureRandom(),
+ \OC::$server->getConfig()
+ );
+ }
+ }
+
+ /**
+ * run the job, then remove it from the joblist
+ *
+ * @param JobList $jobList
+ * @param ILogger $logger
+ */
+ public function execute($jobList, ILogger $logger = null) {
+ $jobList->remove($this, $this->argument);
+ $target = $this->argument['url'];
+ // only execute if target is still in the list of trusted domains
+ if ($this->trustedServers->isTrustedServer($target)) {
+ $this->parentExecute($jobList, $logger);
+ }
+ }
+
+ /**
+ * call execute() method of parent
+ *
+ * @param JobList $jobList
+ * @param ILogger $logger
+ */
+ protected function parentExecute($jobList, $logger) {
+ parent::execute($jobList, $logger);
+ }
+
+ protected function run($argument) {
+ $target = $argument['url'];
+ $source = $this->urlGenerator->getAbsoluteURL('/');
+ $source = rtrim($source, '/');
+ $token = $argument['token'];
+
+ try {
+ $result = $this->httpClient->get(
+ $target . $this->endPoint,
+ [
+ 'query' =>
+ [
+ 'url' => $source,
+ 'token' => $token
+ ],
+ 'timeout' => 3,
+ 'connect_timeout' => 3,
+ ]
+ );
+
+ $status = $result->getStatusCode();
+
+ } catch (ClientException $e) {
+ $status = $e->getCode();
+ }
+
+ // if we received a unexpected response we try again later
+ if (
+ $status !== Http::STATUS_OK
+ && $status !== Http::STATUS_FORBIDDEN
+ ) {
+ $this->jobList->add(
+ 'OCA\Federation\BackgroundJob\GetSharedSecret',
+ $argument
+ );
+ } else {
+ // reset token if we received a valid response
+ $this->dbHandler->addToken($target, '');
+ }
+
+ if ($status === Http::STATUS_OK) {
+ $body = $result->getBody();
+ $result = json_decode($body, true);
+ if (isset($result['ocs']['data']['sharedSecret'])) {
+ $this->trustedServers->addSharedSecret(
+ $target,
+ $result['ocs']['data']['sharedSecret']
+ );
+ } else {
+ $this->logger->error(
+ 'remote server "' . $target . '"" does not return a valid shared secret',
+ ['app' => 'federation']
+ );
+ $this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
+ }
+ }
+
+ }
+}
diff --git a/apps/federation/backgroundjob/requestsharedsecret.php b/apps/federation/backgroundjob/requestsharedsecret.php
new file mode 100644
index 00000000000..24d8adada11
--- /dev/null
+++ b/apps/federation/backgroundjob/requestsharedsecret.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\BackgroundJob;
+
+
+use GuzzleHttp\Exception\ClientException;
+use OC\BackgroundJob\JobList;
+use OC\BackgroundJob\QueuedJob;
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\AppFramework\Http;
+use OCP\BackgroundJob\IJobList;
+use OCP\Http\Client\IClient;
+use OCP\ILogger;
+use OCP\IURLGenerator;
+
+/**
+ * Class RequestSharedSecret
+ *
+ * Ask remote ownCloud to request a sharedSecret from this server
+ *
+ * @package OCA\Federation\Backgroundjob
+ */
+class RequestSharedSecret extends QueuedJob {
+
+ /** @var IClient */
+ private $httpClient;
+
+ /** @var IJobList */
+ private $jobList;
+
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /** @var DbHandler */
+ private $dbHandler;
+
+ /** @var TrustedServers */
+ private $trustedServers;
+
+ private $endPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret?format=json';
+
+ /**
+ * RequestSharedSecret constructor.
+ *
+ * @param IClient $httpClient
+ * @param IURLGenerator $urlGenerator
+ * @param IJobList $jobList
+ * @param TrustedServers $trustedServers
+ * @param DbHandler $dbHandler
+ */
+ public function __construct(
+ IClient $httpClient = null,
+ IURLGenerator $urlGenerator = null,
+ IJobList $jobList = null,
+ TrustedServers $trustedServers = null,
+ dbHandler $dbHandler = null
+ ) {
+ $this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient();
+ $this->jobList = $jobList ? $jobList : \OC::$server->getJobList();
+ $this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator();
+ $this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation'));
+ if ($trustedServers) {
+ $this->trustedServers = $trustedServers;
+ } else {
+ $this->trustedServers = new TrustedServers(
+ $this->dbHandler,
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getLogger(),
+ $this->jobList,
+ \OC::$server->getSecureRandom(),
+ \OC::$server->getConfig()
+ );
+ }
+ }
+
+
+ /**
+ * run the job, then remove it from the joblist
+ *
+ * @param JobList $jobList
+ * @param ILogger $logger
+ */
+ public function execute($jobList, ILogger $logger = null) {
+ $jobList->remove($this, $this->argument);
+ $target = $this->argument['url'];
+ // only execute if target is still in the list of trusted domains
+ if ($this->trustedServers->isTrustedServer($target)) {
+ $this->parentExecute($jobList, $logger);
+ }
+ }
+
+ /**
+ * @param JobList $jobList
+ * @param ILogger $logger
+ */
+ protected function parentExecute($jobList, $logger) {
+ parent::execute($jobList, $logger);
+ }
+
+ protected function run($argument) {
+
+ $target = $argument['url'];
+ $source = $this->urlGenerator->getAbsoluteURL('/');
+ $source = rtrim($source, '/');
+ $token = $argument['token'];
+
+ try {
+ $result = $this->httpClient->post(
+ $target . $this->endPoint,
+ [
+ 'body' => [
+ 'url' => $source,
+ 'token' => $token,
+ ],
+ 'timeout' => 3,
+ 'connect_timeout' => 3,
+ ]
+ );
+
+ $status = $result->getStatusCode();
+
+ } catch (ClientException $e) {
+ $status = $e->getCode();
+ }
+
+ // if we received a unexpected response we try again later
+ if (
+ $status !== Http::STATUS_OK
+ && $status !== Http::STATUS_FORBIDDEN
+ ) {
+ $this->jobList->add(
+ 'OCA\Federation\BackgroundJob\RequestSharedSecret',
+ $argument
+ );
+ }
+
+ if ($status === Http::STATUS_FORBIDDEN) {
+ // clear token if remote server refuses to ask for shared secret
+ $this->dbHandler->addToken($target, '');
+ }
+
+ }
+}
diff --git a/apps/federation/controller/settingscontroller.php b/apps/federation/controller/settingscontroller.php
new file mode 100644
index 00000000000..2e28cd60cfa
--- /dev/null
+++ b/apps/federation/controller/settingscontroller.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Federation\Controller;
+
+use OC\HintException;
+use OCA\Federation\TrustedServers;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IRequest;
+
+
+class SettingsController extends Controller {
+
+ /** @var IL10N */
+ private $l;
+
+ /** @var TrustedServers */
+ private $trustedServers;
+
+ /**
+ * @param string $AppName
+ * @param IRequest $request
+ * @param IL10N $l10n
+ * @param TrustedServers $trustedServers
+ */
+ public function __construct($AppName,
+ IRequest $request,
+ IL10N $l10n,
+ TrustedServers $trustedServers
+ ) {
+ parent::__construct($AppName, $request);
+ $this->l = $l10n;
+ $this->trustedServers = $trustedServers;
+ }
+
+
+ /**
+ * add server to the list of trusted ownClouds
+ *
+ * @param string $url
+ * @return DataResponse
+ * @throws HintException
+ */
+ public function addServer($url) {
+ $this->checkServer($url);
+ $id = $this->trustedServers->addServer($url);
+
+ return new DataResponse(
+ [
+ 'url' => $url,
+ 'id' => $id,
+ 'message' => (string) $this->l->t('Server added to the list of trusted ownClouds')
+ ]
+ );
+ }
+
+ /**
+ * add server to the list of trusted ownClouds
+ *
+ * @param int $id
+ * @return DataResponse
+ */
+ public function removeServer($id) {
+ $this->trustedServers->removeServer($id);
+ return new DataResponse();
+ }
+
+ /**
+ * enable/disable to automatically add servers to the list of trusted servers
+ * once a federated share was created and accepted successfully
+ *
+ * @param bool $autoAddServers
+ */
+ public function autoAddServers($autoAddServers) {
+ $this->trustedServers->setAutoAddServers($autoAddServers);
+ }
+
+ /**
+ * check if the server should be added to the list of trusted servers or not
+ *
+ * @param string $url
+ * @return bool
+ * @throws HintException
+ */
+ protected function checkServer($url) {
+ if ($this->trustedServers->isTrustedServer($url) === true) {
+ $message = 'Server is already in the list of trusted servers.';
+ $hint = $this->l->t('Server is already in the list of trusted servers.');
+ throw new HintException($message, $hint);
+ }
+
+ if ($this->trustedServers->isOwnCloudServer($url) === false) {
+ $message = 'No ownCloud server found';
+ $hint = $this->l->t('No ownCloud server found');
+ throw new HintException($message, $hint);
+ }
+
+ return true;
+ }
+
+}
diff --git a/apps/federation/css/settings-admin.css b/apps/federation/css/settings-admin.css
new file mode 100644
index 00000000000..55b1dd64d15
--- /dev/null
+++ b/apps/federation/css/settings-admin.css
@@ -0,0 +1,26 @@
+#ocFederationSettings p {
+ padding-top: 10px;
+}
+
+#listOfTrustedServers li {
+ padding-top: 10px;
+ padding-left: 20px;
+}
+
+.removeTrustedServer {
+ display: none;
+ vertical-align:middle;
+ padding-left: 10px;
+}
+
+#ocFederationAddServerButton {
+ cursor: pointer;
+}
+
+#listOfTrustedServers li:hover {
+ cursor: pointer;
+}
+
+#listOfTrustedServers .status {
+ margin-right: 10px;
+}
diff --git a/apps/federation/img/app.svg b/apps/federation/img/app.svg
new file mode 100644
index 00000000000..b6ae35211a3
--- /dev/null
+++ b/apps/federation/img/app.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <path d="m13.733 0.00064c-0.52991 0-0.93331 0.40337-0.93331 0.93333v2.6666c-1.182 0.3034-2.243 0.7934-3.2668 1.4001l-1.9334-1.9334c-0.3747-0.3747-0.9586-0.3747-1.3333 0l-3.1999 3.2c-0.37473 0.37474-0.37473 0.95859 0 1.3333l1.9334 1.9335c-0.6067 1.0239-1.0967 2.0849-1.4001 3.2669h-2.6666c-0.52994 0-0.9333 0.403-0.9333 0.933v4.5333c2e-8 0.52996 0.40336 0.93333 0.93331 0.93333h2.6666c0.30335 1.1817 0.79332 2.2426 1.4 3.2666l-1.9334 1.9349c-0.37473 0.37474-0.37473 0.95859 0 1.3333l3.1999 3.2c0.37473 0.37474 0.95857 0.37474 1.3333 0l1.9334-1.9349c1.024 0.608 2.0849 1.0965 3.2665 1.3995v2.6667c0 0.53 0.403 0.933 0.933 0.933h4.5332c0.52991 0 0.93331-0.4032 0.93331-0.9344v-2.6667c1.1816-0.30336 2.2425-0.79335 3.2665-1.4l1.9333 1.9333c0.37473 0.37474 0.95857 0.37474 1.3333 0l3.1999-3.2c0.37473-0.37474 0.37473-0.95859 0-1.3333l-1.9327-1.9328c0.60798-1.024 1.0965-2.0845 1.3994-3.2661h2.6666c0.532 0 0.935-0.403 0.935-0.933v-4.534c0-0.53-0.403-0.933-0.934-0.933h-2.667c-0.303-1.182-0.791-2.243-1.399-3.2666l1.932-1.9334c0.37473-0.37474 0.37473-0.95859 0-1.3333l-3.2-3.2c-0.37473-0.37474-0.95857-0.37474-1.3333 0l-1.9327 1.9334c-1.024-0.6067-2.084-1.0967-3.266-1.4001v-2.6667c0-0.52993-0.403-0.9333-0.933-0.9333zm2.2666 8.8689c3.9361 0 7.1309 3.1947 7.1309 7.1311 0 3.9362-3.1946 7.1311-7.1309 7.1311-3.9361 0-7.1309-3.1955-7.1309-7.1317s3.1948-7.1311 7.1309-7.1311z" display="block" fill="#fff"/>
+</svg>
diff --git a/apps/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js
new file mode 100644
index 00000000000..7d531b39d8c
--- /dev/null
+++ b/apps/federation/js/settings-admin.js
@@ -0,0 +1,82 @@
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+$(document).ready(function () {
+
+ // show input field to add a new trusted server
+ $("#ocFederationAddServer").on('click', function() {
+ $('#ocFederationAddServerButton').addClass('hidden');
+ $("#serverUrl").removeClass('hidden');
+ $("#serverUrl").focus();
+ });
+
+ // add new trusted server
+ $("#serverUrl").keyup(function (e) {
+ if (e.keyCode === 13) { // add server on "enter"
+ var url = $('#serverUrl').val();
+ OC.msg.startSaving('#ocFederationAddServer .msg');
+ $.post(
+ OC.generateUrl('/apps/federation/trusted-servers'),
+ {
+ url: url
+ }
+ ).done(function (data) {
+ $('#serverUrl').attr('value', '');
+ $('ul#listOfTrustedServers').prepend(
+ $('<li>')
+ .attr('id', data.id)
+ .attr('class', 'icon-delete')
+ .html('<span class="status indeterminate"></span>' + data.url)
+ );
+ OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message);
+ })
+ .fail(function (jqXHR) {
+ OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).message);
+ });
+ } else if (e.keyCode === 27) { // hide input filed again in ESC
+ $('#ocFederationAddServerButton').toggleClass('hidden');
+ $("#serverUrl").toggleClass('hidden');
+ }
+ });
+
+ // remove trusted server from list
+ $( "#listOfTrustedServers" ).on('click', 'li', function() {
+ var id = $(this).attr('id');
+ var $this = $(this);
+ $.ajax({
+ url: OC.generateUrl('/apps/federation/trusted-servers/' + id),
+ type: 'DELETE',
+ success: function(response) {
+ $this.remove();
+ }
+ });
+
+ });
+
+ $("#ocFederationSettings #autoAddServers").change(function() {
+ $.post(
+ OC.generateUrl('/apps/federation/auto-add-servers'),
+ {
+ autoAddServers: $(this).is(":checked")
+ }
+ );
+ });
+
+});
diff --git a/apps/federation/lib/dbhandler.php b/apps/federation/lib/dbhandler.php
new file mode 100644
index 00000000000..7606593f780
--- /dev/null
+++ b/apps/federation/lib/dbhandler.php
@@ -0,0 +1,270 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation;
+
+
+use OC\Files\Filesystem;
+use OC\HintException;
+use OCP\IDBConnection;
+use OCP\IL10N;
+
+/**
+ * Class DbHandler
+ *
+ * handles all database calls for the federation app
+ *
+ * @group DB
+ * @package OCA\Federation
+ */
+class DbHandler {
+
+ /** @var IDBConnection */
+ private $connection;
+
+ /** @var IL10N */
+ private $l;
+
+ /** @var string */
+ private $dbTable = 'trusted_servers';
+
+ /**
+ * @param IDBConnection $connection
+ * @param IL10N $il10n
+ */
+ public function __construct(
+ IDBConnection $connection,
+ IL10N $il10n
+ ) {
+ $this->connection = $connection;
+ $this->IL10N = $il10n;
+ }
+
+ /**
+ * add server to the list of trusted ownCloud servers
+ *
+ * @param string $url
+ * @return int
+ * @throws HintException
+ */
+ public function addServer($url) {
+ $hash = $this->hash($url);
+ $url = rtrim($url, '/');
+ $query = $this->connection->getQueryBuilder();
+ $query->insert($this->dbTable)
+ ->values(
+ [
+ 'url' => $query->createParameter('url'),
+ 'url_hash' => $query->createParameter('url_hash'),
+ ]
+ )
+ ->setParameter('url', $url)
+ ->setParameter('url_hash', $hash);
+
+ $result = $query->execute();
+
+ if ($result) {
+ return (int)$this->connection->lastInsertId('*PREFIX*'.$this->dbTable);
+ } else {
+ $message = 'Internal failure, Could not add ownCloud as trusted server: ' . $url;
+ $message_t = $this->l->t('Could not add server');
+ throw new HintException($message, $message_t);
+ }
+ }
+
+ /**
+ * remove server from the list of trusted ownCloud servers
+ *
+ * @param int $id
+ */
+ public function removeServer($id) {
+ $query = $this->connection->getQueryBuilder();
+ $query->delete($this->dbTable)
+ ->where($query->expr()->eq('id', $query->createParameter('id')))
+ ->setParameter('id', $id);
+ $query->execute();
+ }
+
+ /**
+ * get all trusted servers
+ *
+ * @return array
+ */
+ public function getAllServer() {
+ $query = $this->connection->getQueryBuilder();
+ $query->select(['url', 'id', 'status'])->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ return $result;
+ }
+
+ /**
+ * check if server already exists in the database table
+ *
+ * @param string $url
+ * @return bool
+ */
+ public function serverExists($url) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->select('url')->from($this->dbTable)
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash);
+ $result = $query->execute()->fetchAll();
+
+ return !empty($result);
+ }
+
+ /**
+ * write token to database. Token is used to exchange the secret
+ *
+ * @param string $url
+ * @param string $token
+ */
+ public function addToken($url, $token) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->update($this->dbTable)
+ ->set('token', $query->createParameter('token'))
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash)
+ ->setParameter('token', $token);
+ $query->execute();
+ }
+
+ /**
+ * get token stored in database
+ *
+ * @param string $url
+ * @return string
+ */
+ public function getToken($url) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->select('token')->from($this->dbTable)
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash);
+
+ $result = $query->execute()->fetch();
+ return $result['token'];
+ }
+
+ /**
+ * add shared Secret to database
+ *
+ * @param string $url
+ * @param string $sharedSecret
+ */
+ public function addSharedSecret($url, $sharedSecret) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->update($this->dbTable)
+ ->set('shared_secret', $query->createParameter('sharedSecret'))
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash)
+ ->setParameter('sharedSecret', $sharedSecret);
+ $query->execute();
+ }
+
+ /**
+ * get shared secret from database
+ *
+ * @param string $url
+ * @return string
+ */
+ public function getSharedSecret($url) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->select('shared_secret')->from($this->dbTable)
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash);
+
+ $result = $query->execute()->fetch();
+ return $result['shared_secret'];
+ }
+
+ /**
+ * set server status
+ *
+ * @param string $url
+ * @param int $status
+ */
+ public function setServerStatus($url, $status) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->update($this->dbTable)
+ ->set('status', $query->createParameter('status'))
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash)
+ ->setParameter('status', $status);
+ $query->execute();
+ }
+
+ /**
+ * get server status
+ *
+ * @param string $url
+ * @return int
+ */
+ public function getServerStatus($url) {
+ $hash = $this->hash($url);
+ $query = $this->connection->getQueryBuilder();
+ $query->select('status')->from($this->dbTable)
+ ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash')))
+ ->setParameter('url_hash', $hash);
+
+ $result = $query->execute()->fetch();
+ return (int)$result['status'];
+ }
+
+ /**
+ * create hash from URL
+ *
+ * @param string $url
+ * @return string
+ */
+ protected function hash($url) {
+ $normalized = $this->normalizeUrl($url);
+ return md5($normalized);
+ }
+
+ /**
+ * normalize URL, used to create the md5 hash
+ *
+ * @param string $url
+ * @return string
+ */
+ protected function normalizeUrl($url) {
+ $normalized = $url;
+
+ if (strpos($url, 'https://') === 0) {
+ $normalized = substr($url, strlen('https://'));
+ } else if (strpos($url, 'http://') === 0) {
+ $normalized = substr($url, strlen('http://'));
+ }
+
+ $normalized = Filesystem::normalizePath($normalized);
+ $normalized = trim($normalized, '/');
+
+ return $normalized;
+ }
+
+}
diff --git a/apps/federation/lib/hooks.php b/apps/federation/lib/hooks.php
new file mode 100644
index 00000000000..4bf5be4e5b6
--- /dev/null
+++ b/apps/federation/lib/hooks.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation;
+
+
+
+class Hooks {
+
+ /** @var TrustedServers */
+ private $trustedServers;
+
+ public function __construct(TrustedServers $trustedServers) {
+ $this->trustedServers = $trustedServers;
+ }
+
+ /**
+ * add servers to the list of trusted servers once a federated share was established
+ *
+ * @param array $params
+ */
+ public function addServerHook($params) {
+ if (
+ $this->trustedServers->getAutoAddServers() === true &&
+ $this->trustedServers->isTrustedServer($params['server']) === false
+ ) {
+ $this->trustedServers->addServer($params['server']);
+ }
+ }
+
+}
diff --git a/apps/federation/lib/trustedservers.php b/apps/federation/lib/trustedservers.php
new file mode 100644
index 00000000000..96a29178076
--- /dev/null
+++ b/apps/federation/lib/trustedservers.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation;
+
+use OCP\AppFramework\Http;
+use OCP\BackgroundJob\IJobList;
+use OCP\Http\Client\IClientService;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\Security\ISecureRandom;
+
+class TrustedServers {
+
+ /** after a user list was exchanged at least once successfully */
+ const STATUS_OK = 1;
+ /** waiting for shared secret or initial user list exchange */
+ const STATUS_PENDING = 2;
+ /** something went wrong, misconfigured server, software bug,... user interaction needed */
+ const STATUS_FAILURE = 3;
+
+ /** @var dbHandler */
+ private $dbHandler;
+
+ /** @var IClientService */
+ private $httpClientService;
+
+ /** @var ILogger */
+ private $logger;
+
+ /** @var IJobList */
+ private $jobList;
+
+ /** @var ISecureRandom */
+ private $secureRandom;
+
+ /** @var IConfig */
+ private $config;
+
+ /**
+ * @param DbHandler $dbHandler
+ * @param IClientService $httpClientService
+ * @param ILogger $logger
+ * @param IJobList $jobList
+ * @param ISecureRandom $secureRandom
+ * @param IConfig $config
+ */
+ public function __construct(
+ DbHandler $dbHandler,
+ IClientService $httpClientService,
+ ILogger $logger,
+ IJobList $jobList,
+ ISecureRandom $secureRandom,
+ IConfig $config
+ ) {
+ $this->dbHandler = $dbHandler;
+ $this->httpClientService = $httpClientService;
+ $this->logger = $logger;
+ $this->jobList = $jobList;
+ $this->secureRandom = $secureRandom;
+ $this->config = $config;
+ }
+
+ /**
+ * add server to the list of trusted ownCloud servers
+ *
+ * @param $url
+ * @return int server id
+ */
+ public function addServer($url) {
+ $url = $this->updateProtocol($url);
+ $result = $this->dbHandler->addServer($url);
+ if ($result) {
+ $token = $this->secureRandom->getMediumStrengthGenerator()->generate(16);
+ $this->dbHandler->addToken($url, $token);
+ $this->jobList->add(
+ 'OCA\Federation\BackgroundJob\RequestSharedSecret',
+ [
+ 'url' => $url,
+ 'token' => $token
+ ]
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * enable/disable to automatically add servers to the list of trusted servers
+ * once a federated share was created and accepted successfully
+ *
+ * @param bool $status
+ */
+ public function setAutoAddServers($status) {
+ $value = $status ? '1' : '0';
+ $this->config->setAppValue('federation', 'autoAddServers', $value);
+ }
+
+ /**
+ * return if we automatically add servers to the list of trusted servers
+ * once a federated share was created and accepted successfully
+ *
+ * @return bool
+ */
+ public function getAutoAddServers() {
+ $value = $this->config->getAppValue('federation', 'autoAddServers', '1');
+ return $value === '1';
+ }
+
+ /**
+ * get shared secret for the given server
+ *
+ * @param string $url
+ * @return string
+ */
+ public function getSharedSecret($url) {
+ return $this->dbHandler->getSharedSecret($url);
+ }
+
+ /**
+ * add shared secret for the given server
+ *
+ * @param string $url
+ * @param $sharedSecret
+ */
+ public function addSharedSecret($url, $sharedSecret) {
+ $this->dbHandler->addSharedSecret($url, $sharedSecret);
+ }
+
+ /**
+ * remove server from the list of trusted ownCloud servers
+ *
+ * @param int $id
+ */
+ public function removeServer($id) {
+ $this->dbHandler->removeServer($id);
+ }
+
+ /**
+ * get all trusted servers
+ *
+ * @return array
+ */
+ public function getServers() {
+ return $this->dbHandler->getAllServer();
+ }
+
+ /**
+ * check if given server is a trusted ownCloud server
+ *
+ * @param string $url
+ * @return bool
+ */
+ public function isTrustedServer($url) {
+ return $this->dbHandler->serverExists($url);
+ }
+
+ /**
+ * set server status
+ *
+ * @param string $url
+ * @param int $status
+ */
+ public function setServerStatus($url, $status) {
+ $this->dbHandler->setServerStatus($url, $status);
+ }
+
+ /**
+ * @param string $url
+ * @return int
+ */
+ public function getServerStatus($url) {
+ return $this->dbHandler->getServerStatus($url);
+ }
+
+ /**
+ * check if URL point to a ownCloud server
+ *
+ * @param string $url
+ * @return bool
+ */
+ public function isOwnCloudServer($url) {
+ $isValidOwnCloud = false;
+ $client = $this->httpClientService->newClient();
+ try {
+ $result = $client->get(
+ $url . '/status.php',
+ [
+ 'timeout' => 3,
+ 'connect_timeout' => 3,
+ ]
+ );
+ if ($result->getStatusCode() === Http::STATUS_OK) {
+ $isValidOwnCloud = $this->checkOwnCloudVersion($result->getBody());
+ }
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage(), ['app' => 'federation']);
+ return false;
+ }
+ return $isValidOwnCloud;
+ }
+
+ /**
+ * check if ownCloud version is >= 9.0
+ *
+ * @param $statusphp
+ * @return bool
+ */
+ protected function checkOwnCloudVersion($statusphp) {
+ $decoded = json_decode($statusphp, true);
+ if (!empty($decoded) && isset($decoded['version'])) {
+ return version_compare($decoded['version'], '9.0.0', '>=');
+ }
+ return false;
+ }
+
+ /**
+ * check if the URL contain a protocol, if not add https
+ *
+ * @param string $url
+ * @return string
+ */
+ protected function updateProtocol($url) {
+ if (
+ strpos($url, 'https://') === 0
+ || strpos($url, 'http://') === 0
+ ) {
+
+ return $url;
+
+ }
+
+ return 'https://' . $url;
+ }
+}
diff --git a/apps/federation/middleware/addservermiddleware.php b/apps/federation/middleware/addservermiddleware.php
new file mode 100644
index 00000000000..56552021dc2
--- /dev/null
+++ b/apps/federation/middleware/addservermiddleware.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Federation\Middleware ;
+
+use OC\HintException;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\JSONResponse;
+use OCP\AppFramework\Middleware;
+use OCP\IL10N;
+use OCP\ILogger;
+
+class AddServerMiddleware extends Middleware {
+
+ /** @var string */
+ protected $appName;
+
+ /** @var IL10N */
+ protected $l;
+
+ /** @var ILogger */
+ protected $logger;
+
+ public function __construct($appName, IL10N $l, ILogger $logger) {
+ $this->appName = $appName;
+ $this->l = $l;
+ $this->logger = $logger;
+ }
+
+ /**
+ * Log error message and return a response which can be displayed to the user
+ *
+ * @param \OCP\AppFramework\Controller $controller
+ * @param string $methodName
+ * @param \Exception $exception
+ * @return JSONResponse
+ */
+ public function afterException($controller, $methodName, \Exception $exception) {
+ $this->logger->error($exception->getMessage(), ['app' => $this->appName]);
+ if ($exception instanceof HintException) {
+ $message = $exception->getHint();
+ } else {
+ $message = $this->l->t('Unknown error');
+ }
+
+ return new JSONResponse(
+ ['message' => $message],
+ Http::STATUS_BAD_REQUEST
+ );
+
+ }
+
+}
diff --git a/apps/federation/settings/settings-admin.php b/apps/federation/settings/settings-admin.php
new file mode 100644
index 00000000000..76ae0c3b6e0
--- /dev/null
+++ b/apps/federation/settings/settings-admin.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+\OC_Util::checkAdminUser();
+
+$template = new OCP\Template('federation', 'settings-admin');
+
+$dbHandler = new \OCA\Federation\DbHandler(
+ \OC::$server->getDatabaseConnection(),
+ \OC::$server->getL10N('federation')
+);
+
+$trustedServers = new \OCA\Federation\TrustedServers(
+ $dbHandler,
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getLogger(),
+ \OC::$server->getJobList(),
+ \OC::$server->getSecureRandom(),
+ \OC::$server->getConfig()
+);
+
+$template->assign('trustedServers', $trustedServers->getServers());
+$template->assign('autoAddServers', $trustedServers->getAutoAddServers());
+
+return $template->fetchPage();
diff --git a/apps/federation/templates/settings-admin.php b/apps/federation/templates/settings-admin.php
new file mode 100644
index 00000000000..854bb744179
--- /dev/null
+++ b/apps/federation/templates/settings-admin.php
@@ -0,0 +1,40 @@
+<?php
+/** @var array $_ */
+use OCA\Federation\TrustedServers;
+
+/** @var OC_L10N $l */
+script('federation', 'settings-admin');
+style('federation', 'settings-admin')
+?>
+<div id="ocFederationSettings" class="section">
+ <h2><?php p($l->t('Federation')); ?></h2>
+ <em><?php p($l->t('ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing.')); ?></em>
+
+ <p>
+ <input id="autoAddServers" type="checkbox" class="checkbox" <?php if($_['autoAddServers']) p('checked'); ?> />
+ <label for="autoAddServers">Add server automatically once a federated share was created successfully</label>
+ </p>
+
+ <h3>Trusted ownCloud Servers</h3>
+ <p id="ocFederationAddServer">
+ <button id="ocFederationAddServerButton" class="">+ Add ownCloud server</button>
+ <input id="serverUrl" class="hidden" type="text" value="" placeholder="ownCloud Server" name="server_url"/>
+ <span class="msg"></span>
+ </p>
+ <ul id="listOfTrustedServers">
+ <?php foreach($_['trustedServers'] as $trustedServer) { ?>
+ <li id="<?php p($trustedServer['id']); ?>" class="icon-delete">
+ <?php if((int)$trustedServer['status'] === TrustedServers::STATUS_OK) { ?>
+ <span class="status success"></span>
+ <?php } elseif((int)$trustedServer['status'] === TrustedServers::STATUS_PENDING) { ?>
+ <span class="status indeterminate"></span>
+ <?php } else {?>
+ <span class="status error"></span>
+ <?php } ?>
+ <?php p($trustedServer['url']); ?>
+ </li>
+ <?php } ?>
+ </ul>
+
+</div>
+
diff --git a/apps/federation/tests/api/ocsauthapitest.php b/apps/federation/tests/api/ocsauthapitest.php
new file mode 100644
index 00000000000..a334686c24e
--- /dev/null
+++ b/apps/federation/tests/api/ocsauthapitest.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\API;
+
+
+use OC\BackgroundJob\JobList;
+use OCA\Federation\API\OCSAuthAPI;
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\AppFramework\Http;
+use OCP\IRequest;
+use OCP\Security\ISecureRandom;
+use Test\TestCase;
+
+class OCSAuthAPITest extends TestCase {
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IRequest */
+ private $request;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | ISecureRandom */
+ private $secureRandom;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | JobList */
+ private $jobList;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */
+ private $trustedServers;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */
+ private $dbHandler;
+
+ /** @var OCSAuthApi */
+ private $ocsAuthApi;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->request = $this->getMock('OCP\IRequest');
+ $this->secureRandom = $this->getMock('OCP\Security\ISecureRandom');
+ $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->disableOriginalConstructor()->getMock();
+ $this->dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')
+ ->disableOriginalConstructor()->getMock();
+ $this->jobList = $this->getMockBuilder('OC\BackgroundJob\JobList')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->ocsAuthApi = new OCSAuthAPI(
+ $this->request,
+ $this->secureRandom,
+ $this->jobList,
+ $this->trustedServers,
+ $this->dbHandler
+ );
+
+ }
+
+ /**
+ * @dataProvider dataTestRequestSharedSecret
+ *
+ * @param string $token
+ * @param string $localToken
+ * @param bool $isTrustedServer
+ * @param int $expected
+ */
+ public function testRequestSharedSecret($token, $localToken, $isTrustedServer, $expected) {
+
+ $url = 'url';
+
+ $this->request->expects($this->at(0))->method('getParam')->with('url')->willReturn($url);
+ $this->request->expects($this->at(1))->method('getParam')->with('token')->willReturn($token);
+ $this->trustedServers
+ ->expects($this->once())
+ ->method('isTrustedServer')->with($url)->willReturn($isTrustedServer);
+ $this->dbHandler->expects($this->any())
+ ->method('getToken')->with($url)->willReturn($localToken);
+
+ if ($expected === Http::STATUS_OK) {
+ $this->jobList->expects($this->once())->method('add')
+ ->with('OCA\Federation\BackgroundJob\GetSharedSecret', ['url' => $url, 'token' => $token]);
+ } else {
+ $this->jobList->expects($this->never())->method('add');
+ }
+
+ $result = $this->ocsAuthApi->requestSharedSecret();
+ $this->assertSame($expected, $result->getStatusCode());
+ }
+
+ public function dataTestRequestSharedSecret() {
+ return [
+ ['token2', 'token1', true, Http::STATUS_OK],
+ ['token1', 'token2', false, Http::STATUS_FORBIDDEN],
+ ['token1', 'token2', true, Http::STATUS_FORBIDDEN],
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestGetSharedSecret
+ *
+ * @param bool $isTrustedServer
+ * @param bool $isValidToken
+ * @param int $expected
+ */
+ public function testGetSharedSecret($isTrustedServer, $isValidToken, $expected) {
+
+ $url = 'url';
+ $token = 'token';
+
+ $this->request->expects($this->at(0))->method('getParam')->with('url')->willReturn($url);
+ $this->request->expects($this->at(1))->method('getParam')->with('token')->willReturn($token);
+
+ /** @var OCSAuthAPI | \PHPUnit_Framework_MockObject_MockObject $ocsAuthApi */
+ $ocsAuthApi = $this->getMockBuilder('OCA\Federation\API\OCSAuthAPI')
+ ->setConstructorArgs(
+ [
+ $this->request,
+ $this->secureRandom,
+ $this->jobList,
+ $this->trustedServers,
+ $this->dbHandler
+ ]
+ )->setMethods(['isValidToken'])->getMock();
+
+ $this->trustedServers
+ ->expects($this->any())
+ ->method('isTrustedServer')->with($url)->willReturn($isTrustedServer);
+ $ocsAuthApi->expects($this->any())
+ ->method('isValidToken')->with($url, $token)->willReturn($isValidToken);
+
+ if($expected === Http::STATUS_OK) {
+ $this->secureRandom->expects($this->once())->method('getMediumStrengthGenerator')
+ ->willReturn($this->secureRandom);
+ $this->secureRandom->expects($this->once())->method('generate')->with(32)
+ ->willReturn('secret');
+ $this->trustedServers->expects($this->once())
+ ->method('addSharedSecret')->willReturn($url, 'secret');
+ $this->dbHandler->expects($this->once())
+ ->method('addToken')->with($url, '');
+ } else {
+ $this->secureRandom->expects($this->never())->method('getMediumStrengthGenerator');
+ $this->secureRandom->expects($this->never())->method('generate');
+ $this->trustedServers->expects($this->never())->method('addSharedSecret');
+ $this->dbHandler->expects($this->never())->method('addToken');
+ }
+
+ $result = $ocsAuthApi->getSharedSecret();
+
+ $this->assertSame($expected, $result->getStatusCode());
+
+ if ($expected === Http::STATUS_OK) {
+ $data = $result->getData();
+ $this->assertSame('secret', $data['sharedSecret']);
+ }
+ }
+
+ public function dataTestGetSharedSecret() {
+ return [
+ [true, true, Http::STATUS_OK],
+ [false, true, Http::STATUS_FORBIDDEN],
+ [true, false, Http::STATUS_FORBIDDEN],
+ [false, false, Http::STATUS_FORBIDDEN],
+ ];
+ }
+
+}
diff --git a/apps/federation/tests/backgroundjob/getsharedsecrettest.php b/apps/federation/tests/backgroundjob/getsharedsecrettest.php
new file mode 100644
index 00000000000..cb3a294713a
--- /dev/null
+++ b/apps/federation/tests/backgroundjob/getsharedsecrettest.php
@@ -0,0 +1,197 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\BackgroundJob;
+
+
+use OCA\Federation\BackgroundJob\GetSharedSecret;
+use OCA\Files_Sharing\Tests\TestCase;
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\AppFramework\Http;
+use OCP\BackgroundJob\IJobList;
+use OCP\Http\Client\IClient;
+use OCP\Http\Client\IResponse;
+use OCP\ILogger;
+use OCP\IURLGenerator;
+
+/**
+ * Class GetSharedSecretTest
+ *
+ * @group DB
+ *
+ * @package OCA\Federation\Tests\BackgroundJob
+ */
+class GetSharedSecretTest extends TestCase {
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IClient */
+ private $httpClient;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IJobList */
+ private $jobList;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IURLGenerator */
+ private $urlGenerator;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */
+ private $trustedServers;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */
+ private $dbHandler;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */
+ private $logger;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */
+ private $response;
+
+ /** @var GetSharedSecret */
+ private $getSharedSecret;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->httpClient = $this->getMock('OCP\Http\Client\IClient');
+ $this->jobList = $this->getMock('OCP\BackgroundJob\IJobList');
+ $this->urlGenerator = $this->getMock('OCP\IURLGenerator');
+ $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->disableOriginalConstructor()->getMock();
+ $this->dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')
+ ->disableOriginalConstructor()->getMock();
+ $this->logger = $this->getMock('OCP\ILogger');
+ $this->response = $this->getMock('OCP\Http\Client\IResponse');
+
+ $this->getSharedSecret = new GetSharedSecret(
+ $this->httpClient,
+ $this->urlGenerator,
+ $this->jobList,
+ $this->trustedServers,
+ $this->logger,
+ $this->dbHandler
+ );
+ }
+
+ /**
+ * @dataProvider dataTestExecute
+ *
+ * @param bool $isTrustedServer
+ */
+ public function testExecute($isTrustedServer) {
+ /** @var GetSharedSecret |\PHPUnit_Framework_MockObject_MockObject $getSharedSecret */
+ $getSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\GetSharedSecret')
+ ->setConstructorArgs(
+ [
+ $this->httpClient,
+ $this->urlGenerator,
+ $this->jobList,
+ $this->trustedServers,
+ $this->logger,
+ $this->dbHandler
+ ]
+ )->setMethods(['parentExecute'])->getMock();
+ $this->invokePrivate($getSharedSecret, 'argument', [['url' => 'url']]);
+
+ $this->jobList->expects($this->once())->method('remove');
+ $this->trustedServers->expects($this->once())->method('isTrustedServer')
+ ->with('url')->willReturn($isTrustedServer);
+ if ($isTrustedServer) {
+ $getSharedSecret->expects($this->once())->method('parentExecute');
+ } else {
+ $getSharedSecret->expects($this->never())->method('parentExecute');
+ }
+
+ $getSharedSecret->execute($this->jobList);
+
+ }
+
+ public function dataTestExecute() {
+ return [
+ [true],
+ [false]
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestRun
+ *
+ * @param int $statusCode
+ */
+ public function testRun($statusCode) {
+
+ $target = 'targetURL';
+ $source = 'sourceURL';
+ $token = 'token';
+
+ $argument = ['url' => $target, 'token' => $token];
+
+ $this->urlGenerator->expects($this->once())->method('getAbsoluteURL')->with('/')
+ ->willReturn($source);
+ $this->httpClient->expects($this->once())->method('get')
+ ->with(
+ $target . '/ocs/v2.php/apps/federation/api/v1/shared-secret?format=json',
+ [
+ 'query' =>
+ [
+ 'url' => $source,
+ 'token' => $token
+ ],
+ 'timeout' => 3,
+ 'connect_timeout' => 3,
+ ]
+ )->willReturn($this->response);
+
+ $this->response->expects($this->once())->method('getStatusCode')
+ ->willReturn($statusCode);
+
+ if (
+ $statusCode !== Http::STATUS_OK
+ && $statusCode !== Http::STATUS_FORBIDDEN
+ ) {
+ $this->jobList->expects($this->once())->method('add')
+ ->with('OCA\Federation\BackgroundJob\GetSharedSecret', $argument);
+ $this->dbHandler->expects($this->never())->method('addToken');
+ } else {
+ $this->dbHandler->expects($this->once())->method('addToken')->with($target, '');
+ $this->jobList->expects($this->never())->method('add');
+ }
+
+ if ($statusCode === Http::STATUS_OK) {
+ $this->response->expects($this->once())->method('getBody')
+ ->willReturn('{"ocs":{"data":{"sharedSecret":"secret"}}}');
+ $this->trustedServers->expects($this->once())->method('addSharedSecret')
+ ->with($target, 'secret');
+ } else {
+ $this->trustedServers->expects($this->never())->method('addSharedSecret');
+ }
+
+ $this->invokePrivate($this->getSharedSecret, 'run', [$argument]);
+ }
+
+ public function dataTestRun() {
+ return [
+ [Http::STATUS_OK],
+ [Http::STATUS_FORBIDDEN],
+ [Http::STATUS_CONFLICT],
+ ];
+ }
+
+}
diff --git a/apps/federation/tests/backgroundjob/requestsharedsecrettest.php b/apps/federation/tests/backgroundjob/requestsharedsecrettest.php
new file mode 100644
index 00000000000..df81113c686
--- /dev/null
+++ b/apps/federation/tests/backgroundjob/requestsharedsecrettest.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\BackgroundJob;
+
+
+use OCA\Federation\BackgroundJob\RequestSharedSecret;
+use OCP\AppFramework\Http;
+use Test\TestCase;
+
+class RequestSharedSecretTest extends TestCase {
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IClient */
+ private $httpClient;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IJobList */
+ private $jobList;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IURLGenerator */
+ private $urlGenerator;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */
+ private $dbHandler;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */
+ private $trustedServers;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */
+ private $response;
+
+ /** @var RequestSharedSecret */
+ private $requestSharedSecret;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->httpClient = $this->getMock('OCP\Http\Client\IClient');
+ $this->jobList = $this->getMock('OCP\BackgroundJob\IJobList');
+ $this->urlGenerator = $this->getMock('OCP\IURLGenerator');
+ $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->disableOriginalConstructor()->getMock();
+ $this->dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')
+ ->disableOriginalConstructor()->getMock();
+ $this->response = $this->getMock('OCP\Http\Client\IResponse');
+
+ $this->requestSharedSecret = new RequestSharedSecret(
+ $this->httpClient,
+ $this->urlGenerator,
+ $this->jobList,
+ $this->trustedServers,
+ $this->dbHandler
+ );
+ }
+
+ /**
+ * @dataProvider dataTestExecute
+ *
+ * @param bool $isTrustedServer
+ */
+ public function testExecute($isTrustedServer) {
+ /** @var RequestSharedSecret |\PHPUnit_Framework_MockObject_MockObject $requestSharedSecret */
+ $requestSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\RequestSharedSecret')
+ ->setConstructorArgs(
+ [
+ $this->httpClient,
+ $this->urlGenerator,
+ $this->jobList,
+ $this->trustedServers,
+ $this->dbHandler
+ ]
+ )->setMethods(['parentExecute'])->getMock();
+ $this->invokePrivate($requestSharedSecret, 'argument', [['url' => 'url']]);
+
+ $this->jobList->expects($this->once())->method('remove');
+ $this->trustedServers->expects($this->once())->method('isTrustedServer')
+ ->with('url')->willReturn($isTrustedServer);
+ if ($isTrustedServer) {
+ $requestSharedSecret->expects($this->once())->method('parentExecute');
+ } else {
+ $requestSharedSecret->expects($this->never())->method('parentExecute');
+ }
+
+ $requestSharedSecret->execute($this->jobList);
+
+ }
+
+ public function dataTestExecute() {
+ return [
+ [true],
+ [false]
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestRun
+ *
+ * @param int $statusCode
+ */
+ public function testRun($statusCode) {
+
+ $target = 'targetURL';
+ $source = 'sourceURL';
+ $token = 'token';
+
+ $argument = ['url' => $target, 'token' => $token];
+
+ $this->urlGenerator->expects($this->once())->method('getAbsoluteURL')->with('/')
+ ->willReturn($source);
+ $this->httpClient->expects($this->once())->method('post')
+ ->with(
+ $target . '/ocs/v2.php/apps/federation/api/v1/request-shared-secret?format=json',
+ [
+ 'body' =>
+ [
+ 'url' => $source,
+ 'token' => $token
+ ],
+ 'timeout' => 3,
+ 'connect_timeout' => 3,
+ ]
+ )->willReturn($this->response);
+
+ $this->response->expects($this->once())->method('getStatusCode')
+ ->willReturn($statusCode);
+
+ if (
+ $statusCode !== Http::STATUS_OK
+ && $statusCode !== Http::STATUS_FORBIDDEN
+ ) {
+ $this->jobList->expects($this->once())->method('add')
+ ->with('OCA\Federation\BackgroundJob\RequestSharedSecret', $argument);
+ $this->dbHandler->expects($this->never())->method('addToken');
+ }
+
+ if ($statusCode === Http::STATUS_FORBIDDEN) {
+ $this->jobList->expects($this->never())->method('add');
+ $this->dbHandler->expects($this->once())->method('addToken')->with($target, '');
+ }
+
+ $this->invokePrivate($this->requestSharedSecret, 'run', [$argument]);
+ }
+
+ public function dataTestRun() {
+ return [
+ [Http::STATUS_OK],
+ [Http::STATUS_FORBIDDEN],
+ [Http::STATUS_CONFLICT],
+ ];
+ }
+}
diff --git a/apps/federation/tests/controller/settingscontrollertest.php b/apps/federation/tests/controller/settingscontrollertest.php
new file mode 100644
index 00000000000..efbc6911c52
--- /dev/null
+++ b/apps/federation/tests/controller/settingscontrollertest.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\Controller;
+
+
+use OCA\Federation\Controller\SettingsController;
+use OCP\AppFramework\Http\DataResponse;
+use Test\TestCase;
+
+class SettingsControllerTest extends TestCase {
+
+ /** @var SettingsController */
+ private $controller;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IRequest */
+ private $request;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IL10N */
+ private $l10n;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OCA\Federation\TrustedServers */
+ private $trustedServers;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->request = $this->getMock('OCP\IRequest');
+ $this->l10n = $this->getMock('OCP\IL10N');
+ $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->controller = new SettingsController(
+ 'SettingsControllerTest',
+ $this->request,
+ $this->l10n,
+ $this->trustedServers
+ );
+ }
+
+ public function testAddServer() {
+ $this->trustedServers
+ ->expects($this->once())
+ ->method('isTrustedServer')
+ ->with('url')
+ ->willReturn(false);
+ $this->trustedServers
+ ->expects($this->once())
+ ->method('isOwnCloudServer')
+ ->with('url')
+ ->willReturn(true);
+
+ $result = $this->controller->addServer('url');
+ $this->assertTrue($result instanceof DataResponse);
+
+ $data = $result->getData();
+ $this->assertSame(200, $result->getStatus());
+ $this->assertSame('url', $data['url']);
+ $this->assertArrayHasKey('id', $data);
+ }
+
+ /**
+ * @dataProvider checkServerFails
+ * @expectedException \OC\HintException
+ *
+ * @param bool $isTrustedServer
+ * @param bool $isOwnCloud
+ */
+ public function testAddServerFail($isTrustedServer, $isOwnCloud) {
+ $this->trustedServers
+ ->expects($this->any())
+ ->method('isTrustedServer')
+ ->with('url')
+ ->willReturn($isTrustedServer);
+ $this->trustedServers
+ ->expects($this->any())
+ ->method('isOwnCloudServer')
+ ->with('url')
+ ->willReturn($isOwnCloud);
+
+ $this->controller->addServer('url');
+ }
+
+ public function testRemoveServer() {
+ $this->trustedServers->expects($this->once())->method('removeServer')
+ ->with('url');
+ $result = $this->controller->removeServer('url');
+ $this->assertTrue($result instanceof DataResponse);
+ $this->assertSame(200, $result->getStatus());
+ }
+
+ public function testCheckServer() {
+ $this->trustedServers
+ ->expects($this->once())
+ ->method('isTrustedServer')
+ ->with('url')
+ ->willReturn(false);
+ $this->trustedServers
+ ->expects($this->once())
+ ->method('isOwnCloudServer')
+ ->with('url')
+ ->willReturn(true);
+
+ $this->assertTrue(
+ $this->invokePrivate($this->controller, 'checkServer', ['url'])
+ );
+
+ }
+
+ /**
+ * @dataProvider checkServerFails
+ * @expectedException \OC\HintException
+ *
+ * @param bool $isTrustedServer
+ * @param bool $isOwnCloud
+ */
+ public function testCheckServerFail($isTrustedServer, $isOwnCloud) {
+ $this->trustedServers
+ ->expects($this->any())
+ ->method('isTrustedServer')
+ ->with('url')
+ ->willReturn($isTrustedServer);
+ $this->trustedServers
+ ->expects($this->any())
+ ->method('isOwnCloudServer')
+ ->with('url')
+ ->willReturn($isOwnCloud);
+
+ $this->assertTrue(
+ $this->invokePrivate($this->controller, 'checkServer', ['url'])
+ );
+
+ }
+
+ /**
+ * data to simulate checkServer fails
+ *
+ * @return array
+ */
+ public function checkServerFails() {
+ return [
+ [true, true],
+ [false, false]
+ ];
+ }
+
+}
diff --git a/apps/federation/tests/lib/dbhandlertest.php b/apps/federation/tests/lib/dbhandlertest.php
new file mode 100644
index 00000000000..123eaaee450
--- /dev/null
+++ b/apps/federation/tests/lib/dbhandlertest.php
@@ -0,0 +1,259 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\lib;
+
+
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\IDBConnection;
+use Test\TestCase;
+
+/**
+ * @group DB
+ */
+class DbHandlerTest extends TestCase {
+
+ /** @var DbHandler */
+ private $dbHandler;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $il10n;
+
+ /** @var IDBConnection */
+ private $connection;
+
+ /** @var string */
+ private $dbTable = 'trusted_servers';
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->connection = \OC::$server->getDatabaseConnection();
+ $this->il10n = $this->getMock('OCP\IL10N');
+
+ $this->dbHandler = new DbHandler(
+ $this->connection,
+ $this->il10n
+ );
+
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertEmpty($result, 'we need to start with a empty trusted_servers table');
+ }
+
+ public function tearDown() {
+ parent::tearDown();
+ $query = $this->connection->getQueryBuilder()->delete($this->dbTable);
+ $query->execute();
+ }
+
+ /**
+ * @dataProvider dataTestAddServer
+ *
+ * @param string $url passed to the method
+ * @param string $expectedUrl the url we expect to be written to the db
+ * @param string $expectedHash the hash value we expect to be written to the db
+ */
+ public function testAddServer($url, $expectedUrl, $expectedHash) {
+ $id = $this->dbHandler->addServer($url);
+
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame($expectedUrl, $result[0]['url']);
+ $this->assertSame($id, (int)$result[0]['id']);
+ $this->assertSame($expectedHash, $result[0]['url_hash']);
+ $this->assertSame(TrustedServers::STATUS_PENDING, (int)$result[0]['status']);
+ }
+
+ public function dataTestAddServer() {
+ return [
+ ['http://owncloud.org', 'http://owncloud.org', md5('owncloud.org')],
+ ['https://owncloud.org', 'https://owncloud.org', md5('owncloud.org')],
+ ['http://owncloud.org/', 'http://owncloud.org', md5('owncloud.org')],
+ ];
+ }
+
+ public function testRemove() {
+ $id1 = $this->dbHandler->addServer('server1');
+ $id2 = $this->dbHandler->addServer('server2');
+
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(2, count($result));
+ $this->assertSame('server1', $result[0]['url']);
+ $this->assertSame('server2', $result[1]['url']);
+ $this->assertSame($id1, (int)$result[0]['id']);
+ $this->assertSame($id2, (int)$result[1]['id']);
+
+ $this->dbHandler->removeServer($id2);
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame('server1', $result[0]['url']);
+ $this->assertSame($id1, (int)$result[0]['id']);
+ }
+
+ public function testGetAll() {
+ $id1 = $this->dbHandler->addServer('server1');
+ $id2 = $this->dbHandler->addServer('server2');
+
+ $result = $this->dbHandler->getAllServer();
+ $this->assertSame(2, count($result));
+ $this->assertSame('server1', $result[0]['url']);
+ $this->assertSame('server2', $result[1]['url']);
+ $this->assertSame($id1, (int)$result[0]['id']);
+ $this->assertSame($id2, (int)$result[1]['id']);
+ }
+
+ /**
+ * @dataProvider dataTestServerExists
+ *
+ * @param string $serverInTable
+ * @param string $checkForServer
+ * @param bool $expected
+ */
+ public function testServerExists($serverInTable, $checkForServer, $expected) {
+ $this->dbHandler->addServer($serverInTable);
+ $this->assertSame($expected,
+ $this->dbHandler->serverExists($checkForServer)
+ );
+ }
+
+ public function dataTestServerExists() {
+ return [
+ ['server1', 'server1', true],
+ ['server1', 'http://server1', true],
+ ['server1', 'server2', false]
+ ];
+ }
+
+ public function testAddToken() {
+ $this->dbHandler->addServer('server1');
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame(null, $result[0]['token']);
+ $this->dbHandler->addToken('http://server1', 'token');
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame('token', $result[0]['token']);
+ }
+
+ public function testGetToken() {
+ $this->dbHandler->addServer('server1');
+ $this->dbHandler->addToken('http://server1', 'token');
+ $this->assertSame('token',
+ $this->dbHandler->getToken('https://server1')
+ );
+ }
+
+ public function testAddSharedSecret() {
+ $this->dbHandler->addServer('server1');
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame(null, $result[0]['shared_secret']);
+ $this->dbHandler->addSharedSecret('http://server1', 'secret');
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame('secret', $result[0]['shared_secret']);
+ }
+
+ public function testGetSharedSecret() {
+ $this->dbHandler->addServer('server1');
+ $this->dbHandler->addSharedSecret('http://server1', 'secret');
+ $this->assertSame('secret',
+ $this->dbHandler->getSharedSecret('https://server1')
+ );
+ }
+
+ public function testSetServerStatus() {
+ $this->dbHandler->addServer('server1');
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame(TrustedServers::STATUS_PENDING, (int)$result[0]['status']);
+ $this->dbHandler->setServerStatus('http://server1', TrustedServers::STATUS_OK);
+ $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
+ $result = $query->execute()->fetchAll();
+ $this->assertSame(1, count($result));
+ $this->assertSame(TrustedServers::STATUS_OK, (int)$result[0]['status']);
+ }
+
+ public function testGetServerStatus() {
+ $this->dbHandler->addServer('server1');
+ $this->dbHandler->setServerStatus('http://server1', TrustedServers::STATUS_OK);
+ $this->assertSame(TrustedServers::STATUS_OK,
+ $this->dbHandler->getServerStatus('https://server1')
+ );
+ }
+
+ /**
+ * hash should always be computed with the normalized URL
+ *
+ * @dataProvider dataTestHash
+ *
+ * @param string $url
+ * @param string $expected
+ */
+ public function testHash($url, $expected) {
+ $this->assertSame($expected,
+ $this->invokePrivate($this->dbHandler, 'hash', [$url])
+ );
+ }
+
+ public function dataTestHash() {
+ return [
+ ['server1', md5('server1')],
+ ['http://server1', md5('server1')],
+ ['https://server1', md5('server1')],
+ ['http://server1/', md5('server1')],
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestNormalizeUrl
+ *
+ * @param string $url
+ * @param string $expected
+ */
+ public function testNormalizeUrl($url, $expected) {
+ $this->assertSame($expected,
+ $this->invokePrivate($this->dbHandler, 'normalizeUrl', [$url])
+ );
+ }
+
+ public function dataTestNormalizeUrl() {
+ return [
+ ['owncloud.org', 'owncloud.org'],
+ ['http://owncloud.org', 'owncloud.org'],
+ ['https://owncloud.org', 'owncloud.org'],
+ ['https://owncloud.org//mycloud', 'owncloud.org/mycloud'],
+ ['https://owncloud.org/mycloud/', 'owncloud.org/mycloud'],
+ ];
+ }
+
+}
diff --git a/apps/federation/tests/lib/hookstest.php b/apps/federation/tests/lib/hookstest.php
new file mode 100644
index 00000000000..5b19c167456
--- /dev/null
+++ b/apps/federation/tests/lib/hookstest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\lib;
+
+
+use OCA\Federation\Hooks;
+use OCA\Federation\TrustedServers;
+use Test\TestCase;
+
+class HooksTest extends TestCase {
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */
+ private $trustedServers;
+
+ /** @var Hooks */
+ private $hooks;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->hooks = new Hooks($this->trustedServers);
+ }
+
+ /**
+ * @dataProvider dataTestAddServerHook
+ *
+ * @param bool $autoAddEnabled is auto-add enabled
+ * @param bool $isTrustedServer is the server already in the list of trusted servers
+ * @param bool $addServer should the server be added
+ */
+ public function testAddServerHook($autoAddEnabled, $isTrustedServer, $addServer) {
+ $this->trustedServers->expects($this->any())->method('getAutoAddServers')
+ ->willReturn($autoAddEnabled);
+ $this->trustedServers->expects($this->any())->method('isTrustedServer')
+ ->with('url')->willReturn($isTrustedServer);
+
+ if ($addServer) {
+ $this->trustedServers->expects($this->once())->method('addServer')
+ ->with('url');
+ } else {
+ $this->trustedServers->expects($this->never())->method('addServer');
+ }
+
+ $this->hooks->addServerHook(['server' => 'url']);
+
+ }
+
+ public function dataTestAddServerHook() {
+ return [
+ [true, true, false],
+ [false, true, false],
+ [true, false, true],
+ [false, false, false],
+ ];
+ }
+}
diff --git a/apps/federation/tests/lib/trustedserverstest.php b/apps/federation/tests/lib/trustedserverstest.php
new file mode 100644
index 00000000000..d067cd1c185
--- /dev/null
+++ b/apps/federation/tests/lib/trustedserverstest.php
@@ -0,0 +1,344 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\lib;
+
+
+use OCA\Federation\DbHandler;
+use OCA\Federation\TrustedServers;
+use OCP\BackgroundJob\IJobList;
+use OCP\Http\Client\IClient;
+use OCP\Http\Client\IClientService;
+use OCP\Http\Client\IResponse;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\Security\ISecureRandom;
+use Test\TestCase;
+
+class TrustedServersTest extends TestCase {
+
+ /** @var TrustedServers */
+ private $trustedServers;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */
+ private $dbHandler;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IClientService */
+ private $httpClientService;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IClient */
+ private $httpClient;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */
+ private $response;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */
+ private $logger;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IJobList */
+ private $jobList;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | ISecureRandom */
+ private $secureRandom;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IConfig */
+ private $config;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->dbHandler = $this->getMockBuilder('\OCA\Federation\DbHandler')
+ ->disableOriginalConstructor()->getMock();
+ $this->httpClientService = $this->getMock('OCP\Http\Client\IClientService');
+ $this->httpClient = $this->getMock('OCP\Http\Client\IClient');
+ $this->response = $this->getMock('OCP\Http\Client\IResponse');
+ $this->logger = $this->getMock('OCP\ILogger');
+ $this->jobList = $this->getMock('OCP\BackgroundJob\IJobList');
+ $this->secureRandom = $this->getMock('OCP\Security\ISecureRandom');
+ $this->config = $this->getMock('OCP\IConfig');
+
+ $this->trustedServers = new TrustedServers(
+ $this->dbHandler,
+ $this->httpClientService,
+ $this->logger,
+ $this->jobList,
+ $this->secureRandom,
+ $this->config
+ );
+
+ }
+
+ /**
+ * @dataProvider dataTrueFalse
+ *
+ * @param bool $success
+ */
+ public function testAddServer($success) {
+ /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers $trustedServer */
+ $trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->setConstructorArgs(
+ [
+ $this->dbHandler,
+ $this->httpClientService,
+ $this->logger,
+ $this->jobList,
+ $this->secureRandom,
+ $this->config
+ ]
+ )
+ ->setMethods(['normalizeUrl', 'updateProtocol'])
+ ->getMock();
+ $trustedServers->expects($this->once())->method('updateProtocol')
+ ->with('url')->willReturn('https://url');
+ $this->dbHandler->expects($this->once())->method('addServer')->with('https://url')
+ ->willReturn($success);
+
+ if ($success) {
+ $this->secureRandom->expects($this->once())->method('getMediumStrengthGenerator')
+ ->willReturn($this->secureRandom);
+ $this->secureRandom->expects($this->once())->method('generate')
+ ->willReturn('token');
+ $this->dbHandler->expects($this->once())->method('addToken')->with('https://url', 'token');
+ $this->jobList->expects($this->once())->method('add')
+ ->with('OCA\Federation\BackgroundJob\RequestSharedSecret',
+ ['url' => 'https://url', 'token' => 'token']);
+ } else {
+ $this->jobList->expects($this->never())->method('add');
+ }
+
+ $this->assertSame($success,
+ $trustedServers->addServer('url')
+ );
+ }
+
+ public function dataTrueFalse() {
+ return [
+ [true],
+ [false]
+ ];
+ }
+
+ /**
+ * @dataProvider dataTrueFalse
+ *
+ * @param bool $status
+ */
+ public function testSetAutoAddServers($status) {
+ if ($status) {
+ $this->config->expects($this->once())->method('setAppValue')
+ ->with('federation', 'autoAddServers', '1');
+ } else {
+ $this->config->expects($this->once())->method('setAppValue')
+ ->with('federation', 'autoAddServers', '0');
+ }
+
+ $this->trustedServers->setAutoAddServers($status);
+ }
+
+ /**
+ * @dataProvider dataTestGetAutoAddServers
+ *
+ * @param string $status
+ * @param bool $expected
+ */
+ public function testGetAutoAddServers($status, $expected) {
+ $this->config->expects($this->once())->method('getAppValue')
+ ->with('federation', 'autoAddServers', '1')->willReturn($status);
+
+ $this->assertSame($expected,
+ $this->trustedServers->getAutoAddServers($status)
+ );
+ }
+
+ public function dataTestGetAutoAddServers() {
+ return [
+ ['1', true],
+ ['0', false]
+ ];
+ }
+
+ public function testAddSharedSecret() {
+ $this->dbHandler->expects($this->once())->method('addSharedSecret')
+ ->with('url', 'secret');
+ $this->trustedServers->addSharedSecret('url', 'secret');
+ }
+
+ public function testGetSharedSecret() {
+ $this->dbHandler->expects($this->once())->method('getSharedSecret')
+ ->with('url')->willReturn(true);
+ $this->assertTrue(
+ $this->trustedServers->getSharedSecret('url')
+ );
+ }
+
+ public function testRemoveServer() {
+ $id = 42;
+ $this->dbHandler->expects($this->once())->method('removeServer')->with($id);
+ $this->trustedServers->removeServer($id);
+ }
+
+ public function testGetServers() {
+ $this->dbHandler->expects($this->once())->method('getAllServer')->willReturn(true);
+
+ $this->assertTrue(
+ $this->trustedServers->getServers()
+ );
+ }
+
+
+ public function testIsTrustedServer() {
+ $this->dbHandler->expects($this->once())->method('serverExists')->with('url')
+ ->willReturn(true);
+
+ $this->assertTrue(
+ $this->trustedServers->isTrustedServer('url')
+ );
+ }
+
+ public function testSetServerStatus() {
+ $this->dbHandler->expects($this->once())->method('setServerStatus')
+ ->with('url', 'status');
+ $this->trustedServers->setServerStatus('url', 'status');
+ }
+
+ public function testGetServerStatus() {
+ $this->dbHandler->expects($this->once())->method('getServerStatus')
+ ->with('url')->willReturn(true);
+ $this->assertTrue(
+ $this->trustedServers->getServerStatus('url')
+ );
+ }
+
+ /**
+ * @dataProvider dataTestIsOwnCloudServer
+ *
+ * @param int $statusCode
+ * @param bool $isValidOwnCloudVersion
+ * @param bool $expected
+ */
+ public function testIsOwnCloudServer($statusCode, $isValidOwnCloudVersion, $expected) {
+
+ $server = 'server1';
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers $trustedServer */
+ $trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
+ ->setConstructorArgs(
+ [
+ $this->dbHandler,
+ $this->httpClientService,
+ $this->logger,
+ $this->jobList,
+ $this->secureRandom,
+ $this->config
+ ]
+ )
+ ->setMethods(['checkOwnCloudVersion'])
+ ->getMock();
+
+ $this->httpClientService->expects($this->once())->method('newClient')
+ ->willReturn($this->httpClient);
+
+ $this->httpClient->expects($this->once())->method('get')->with($server . '/status.php')
+ ->willReturn($this->response);
+
+ $this->response->expects($this->once())->method('getStatusCode')
+ ->willReturn($statusCode);
+
+ if ($statusCode === 200) {
+ $trustedServers->expects($this->once())->method('checkOwnCloudVersion')
+ ->willReturn($isValidOwnCloudVersion);
+ } else {
+ $trustedServers->expects($this->never())->method('checkOwnCloudVersion');
+ }
+
+ $this->assertSame($expected,
+ $trustedServers->isOwnCloudServer($server)
+ );
+
+ }
+
+ public function dataTestIsOwnCloudServer() {
+ return [
+ [200, true, true],
+ [200, false, false],
+ [404, true, false],
+ ];
+ }
+
+ public function testIsOwnCloudServerFail() {
+ $server = 'server1';
+
+ $this->httpClientService->expects($this->once())->method('newClient')
+ ->willReturn($this->httpClient);
+
+ $this->logger->expects($this->once())->method('error')
+ ->with('simulated exception', ['app' => 'federation']);
+
+ $this->httpClient->expects($this->once())->method('get')->with($server . '/status.php')
+ ->willReturnCallback(function () {
+ throw new \Exception('simulated exception');
+ });
+
+ $this->assertFalse($this->trustedServers->isOwnCloudServer($server));
+
+ }
+
+ /**
+ * @dataProvider dataTestCheckOwnCloudVersion
+ *
+ * @param $statusphp
+ * @param $expected
+ */
+ public function testCheckOwnCloudVersion($statusphp, $expected) {
+ $this->assertSame($expected,
+ $this->invokePrivate($this->trustedServers, 'checkOwnCloudVersion', [$statusphp])
+ );
+ }
+
+ public function dataTestCheckOwnCloudVersion() {
+ return [
+ ['{"version":"8.4.0"}', false],
+ ['{"version":"9.0.0"}', true],
+ ['{"version":"9.1.0"}', true]
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestUpdateProtocol
+ * @param string $url
+ * @param string $expected
+ */
+ public function testUpdateProtocol($url, $expected) {
+ $this->assertSame($expected,
+ $this->invokePrivate($this->trustedServers, 'updateProtocol', [$url])
+ );
+ }
+
+ public function dataTestUpdateProtocol() {
+ return [
+ ['http://owncloud.org', 'http://owncloud.org'],
+ ['https://owncloud.org', 'https://owncloud.org'],
+ ['owncloud.org', 'https://owncloud.org'],
+ ['httpserver', 'https://httpserver'],
+ ];
+ }
+}
diff --git a/apps/federation/tests/middleware/addservermiddlewaretest.php b/apps/federation/tests/middleware/addservermiddlewaretest.php
new file mode 100644
index 00000000000..1be5a342285
--- /dev/null
+++ b/apps/federation/tests/middleware/addservermiddlewaretest.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Federation\Tests\Middleware;
+
+
+use OC\HintException;
+use OCA\Federation\Middleware\AddServerMiddleware;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
+use Test\TestCase;
+
+class AddServerMiddlewareTest extends TestCase {
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */
+ private $logger;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IL10N */
+ private $l10n;
+
+ /** @var AddServerMiddleware */
+ private $middleware;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | Controller */
+ private $controller;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->logger = $this->getMock('OCP\ILogger');
+ $this->l10n = $this->getMock('OCP\IL10N');
+ $this->controller = $this->getMockBuilder('OCP\AppFramework\Controller')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->middleware = new AddServerMiddleware(
+ 'AddServerMiddlewareTest',
+ $this->l10n,
+ $this->logger
+ );
+ }
+
+ /**
+ * @dataProvider dataTestAfterException
+ *
+ * @param \Exception $exception
+ * @param string $message
+ * @param string $hint
+ */
+ public function testAfterException($exception, $message, $hint) {
+
+ $this->logger->expects($this->once())->method('error')
+ ->with($message, ['app' => 'AddServerMiddlewareTest']);
+
+ $this->l10n->expects($this->any())->method('t')
+ ->willReturnCallback(
+ function($message) {
+ return $message;
+ }
+ );
+
+ $result = $this->middleware->afterException($this->controller, 'method', $exception);
+
+ $this->assertSame(Http::STATUS_BAD_REQUEST,
+ $result->getStatus()
+ );
+
+ $data = $result->getData();
+
+ $this->assertSame($hint,
+ $data['message']
+ );
+ }
+
+ public function dataTestAfterException() {
+ return [
+ [new HintException('message', 'hint'), 'message', 'hint'],
+ [new \Exception('message'), 'message', 'Unknown error'],
+ ];
+ }
+
+}
diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php
deleted file mode 100644
index 2d02869df14..00000000000
--- a/apps/files/ajax/delete.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Frank Karlitschek <frank@owncloud.org>
- * @author Jakob Sack <mail@jakobsack.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-\OC::$server->getSession()->close();
-
-
-// Get data
-$dir = isset($_POST['dir']) ? (string)$_POST['dir'] : '';
-$allFiles = isset($_POST["allfiles"]) ? (string)$_POST["allfiles"] : false;
-
-// delete all files in dir ?
-if ($allFiles === 'true') {
- $files = array();
- $fileList = \OC\Files\Filesystem::getDirectoryContent($dir);
- foreach ($fileList as $fileInfo) {
- $files[] = $fileInfo['name'];
- }
-} else {
- $files = isset($_POST["file"]) ? (string)$_POST["file"] : (string)$_POST["files"];
- $files = json_decode($files);
-}
-$filesWithError = '';
-
-$success = true;
-
-//Now delete
-foreach ($files as $file) {
- try {
- if (\OC\Files\Filesystem::file_exists($dir . '/' . $file) &&
- !(\OC\Files\Filesystem::isDeletable($dir . '/' . $file) &&
- \OC\Files\Filesystem::unlink($dir . '/' . $file))
- ) {
- $filesWithError .= $file . "\n";
- $success = false;
- }
- } catch (\Exception $e) {
- $filesWithError .= $file . "\n";
- $success = false;
- }
-}
-
-// get array with updated storage stats (e.g. max file size) after upload
-try {
- $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
-} catch(\OCP\Files\NotFoundException $e) {
- OCP\JSON::error(['data' => ['message' => 'File not found']]);
- return;
-}
-
-if ($success) {
- OCP\JSON::success(array("data" => array_merge(array("dir" => $dir, "files" => $files), $storageStats)));
-} else {
- OCP\JSON::error(array("data" => array_merge(array("message" => "Could not delete:\n" . $filesWithError), $storageStats)));
-}
diff --git a/apps/files/ajax/move.php b/apps/files/ajax/move.php
deleted file mode 100644
index 0961636a116..00000000000
--- a/apps/files/ajax/move.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Frank Karlitschek <frank@owncloud.org>
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-\OC::$server->getSession()->close();
-
-// Get data
-$dir = isset($_POST['dir']) ? (string)$_POST['dir'] : '';
-$file = isset($_POST['file']) ? (string)$_POST['file'] : '';
-$target = isset($_POST['target']) ? rawurldecode((string)$_POST['target']) : '';
-
-$l = \OC::$server->getL10N('files');
-
-if(\OC\Files\Filesystem::file_exists($target . '/' . $file)) {
- OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s - File with this name already exists", array($file)) )));
- exit;
-}
-
-if ($target != '' || strtolower($file) != 'shared') {
- $targetFile = \OC\Files\Filesystem::normalizePath($target . '/' . $file);
- $sourceFile = \OC\Files\Filesystem::normalizePath($dir . '/' . $file);
- try {
- if(\OC\Files\Filesystem::rename($sourceFile, $targetFile)) {
- OCP\JSON::success(array("data" => array( "dir" => $dir, "files" => $file )));
- } else {
- OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s", array($file)) )));
- }
- } catch (\OCP\Files\NotPermittedException $e) {
- OCP\JSON::error(array("data" => array( "message" => $l->t("Permission denied") )));
- } catch (\Exception $e) {
- OCP\JSON::error(array("data" => array( "message" => $e->getMessage())));
- }
-}else{
- OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s", array($file)) )));
-}
diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php
deleted file mode 100644
index be09b288d4b..00000000000
--- a/apps/files/ajax/newfile.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-/**
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-// Init owncloud
-global $eventSource;
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::callCheck();
-
-\OC::$server->getSession()->close();
-
-// Get the params
-$dir = isset( $_REQUEST['dir'] ) ? '/'.trim((string)$_REQUEST['dir'], '/\\') : '';
-$fileName = isset( $_REQUEST['filename'] ) ? trim((string)$_REQUEST['filename'], '/\\') : '';
-
-$l10n = \OC::$server->getL10N('files');
-
-$result = array(
- 'success' => false,
- 'data' => NULL
-);
-
-try {
- \OC\Files\Filesystem::getView()->verifyPath($dir, $fileName);
-} catch (\OCP\Files\InvalidPathException $ex) {
- $result['data'] = [
- 'message' => $ex->getMessage()];
- OCP\JSON::error($result);
- return;
-}
-
-if (!\OC\Files\Filesystem::file_exists($dir . '/')) {
- $result['data'] = array('message' => (string)$l10n->t(
- 'The target folder has been moved or deleted.'),
- 'code' => 'targetnotfound'
- );
- OCP\JSON::error($result);
- exit();
-}
-
-$target = $dir.'/'.$fileName;
-
-if (\OC\Files\Filesystem::file_exists($target)) {
- $result['data'] = array('message' => (string)$l10n->t(
- 'The name %s is already used in the folder %s. Please choose a different name.',
- array($fileName, $dir))
- );
- OCP\JSON::error($result);
- exit();
-}
-
-$success = false;
-$templateManager = OC_Helper::getFileTemplateManager();
-$mimeType = OC_Helper::getMimetypeDetector()->detectPath($target);
-$content = $templateManager->getTemplate($mimeType);
-
-try {
- if($content) {
- $success = \OC\Files\Filesystem::file_put_contents($target, $content);
- } else {
- $success = \OC\Files\Filesystem::touch($target);
- }
-} catch (\Exception $e) {
- $result = [
- 'success' => false,
- 'data' => [
- 'message' => $e->getMessage()
- ]
- ];
- OCP\JSON::error($result);
- exit();
-}
-
-if($success) {
- $meta = \OC\Files\Filesystem::getFileInfo($target);
- OCP\JSON::success(array('data' => \OCA\Files\Helper::formatFileInfo($meta)));
- return;
-}
-
-OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Error when creating the file') )));
diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php
deleted file mode 100644
index a2897dd437a..00000000000
--- a/apps/files/ajax/newfolder.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Frank Karlitschek <frank@owncloud.org>
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-// Init owncloud
-
-
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-\OC::$server->getSession()->close();
-
-// Get the params
-$dir = isset($_POST['dir']) ? (string)$_POST['dir'] : '';
-$folderName = isset($_POST['foldername']) ?(string) $_POST['foldername'] : '';
-
-$l10n = \OC::$server->getL10N('files');
-
-$result = array(
- 'success' => false,
- 'data' => NULL
- );
-
-try {
- \OC\Files\Filesystem::getView()->verifyPath($dir, $folderName);
-} catch (\OCP\Files\InvalidPathException $ex) {
- $result['data'] = [
- 'message' => $ex->getMessage()];
- OCP\JSON::error($result);
- return;
-}
-
-if (!\OC\Files\Filesystem::file_exists($dir . '/')) {
- $result['data'] = array('message' => (string)$l10n->t(
- 'The target folder has been moved or deleted.'),
- 'code' => 'targetnotfound'
- );
- OCP\JSON::error($result);
- exit();
-}
-
-$target = $dir . '/' . $folderName;
-
-if (\OC\Files\Filesystem::file_exists($target)) {
- $result['data'] = array('message' => $l10n->t(
- 'The name %s is already used in the folder %s. Please choose a different name.',
- array($folderName, $dir))
- );
- OCP\JSON::error($result);
- exit();
-}
-
-try {
- if(\OC\Files\Filesystem::mkdir($target)) {
- if ( $dir !== '/') {
- $path = $dir.'/'.$folderName;
- } else {
- $path = '/'.$folderName;
- }
- $meta = \OC\Files\Filesystem::getFileInfo($path);
- $meta['type'] = 'dir'; // missing ?!
- OCP\JSON::success(array('data' => \OCA\Files\Helper::formatFileInfo($meta)));
- exit();
- }
-} catch (\Exception $e) {
- $result = [
- 'success' => false,
- 'data' => [
- 'message' => $e->getMessage()
- ]
- ];
- OCP\JSON::error($result);
- exit();
-}
-
-OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Error when creating the folder') )));
diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php
deleted file mode 100644
index a24a57b1046..00000000000
--- a/apps/files/ajax/rename.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Frank Karlitschek <frank@owncloud.org>
- * @author Jakob Sack <mail@jakobsack.de>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-\OC::$server->getSession()->close();
-
-$l10n = \OC::$server->getL10N('files');
-
-$files = new \OCA\Files\App(
- \OC\Files\Filesystem::getView(),
- \OC::$server->getL10N('files')
-);
-try {
- $result = $files->rename(
- isset($_GET['dir']) ? (string)$_GET['dir'] : '',
- isset($_GET['file']) ? (string)$_GET['file'] : '',
- isset($_GET['newname']) ? (string)$_GET['newname'] : ''
- );
-} catch (\Exception $e) {
- $result = [
- 'success' => false,
- 'data' => [
- 'message' => $e->getMessage()
- ]
- ];
-}
-
-if($result['success'] === true){
- OCP\JSON::success(['data' => $result['data']]);
-} else {
- OCP\JSON::error(['data' => $result['data']]);
-}
diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php
index 491adaa9b88..7710a28a8ca 100644
--- a/apps/files/ajax/scan.php
+++ b/apps/files/ajax/scan.php
@@ -47,9 +47,8 @@ $listener = new ScanListener($eventSource);
foreach ($users as $user) {
$eventSource->send('user', $user);
- $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection());
+ $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
$scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', array($listener, 'file'));
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', array($listener, 'folder'));
try {
if ($force) {
$scanner->scan($dir);
@@ -81,13 +80,6 @@ class ScanListener {
$this->eventSource = $eventSource;
}
- /**
- * @param string $path
- */
- public function folder($path) {
- $this->eventSource->send('folder', $path);
- }
-
public function file() {
$this->fileCount++;
if ($this->fileCount > $this->lastCount + 20) { //send a count update every 20 files
diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index a784642728f..18e9cfe6117 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -41,7 +41,6 @@ OCP\JSON::setContentTypeHeader('text/plain');
// If not, check the login.
// If no token is sent along, rely on login only
-$allowedPermissions = \OCP\Constants::PERMISSION_ALL;
$errorCode = null;
$l = \OC::$server->getL10N('files');
@@ -60,8 +59,6 @@ if (empty($_POST['dirToken'])) {
\OC_User::setIncognitoMode(true);
- // return only read permissions for public upload
- $allowedPermissions = \OCP\Constants::PERMISSION_READ;
$publicDirectory = !empty($_POST['subdir']) ? (string)$_POST['subdir'] : '/';
$linkItem = OCP\Share::getShareByToken((string)$_POST['dirToken']);
@@ -207,7 +204,7 @@ if (\OC\Files\Filesystem::isValidPath($dir) === true) {
$data['originalname'] = $files['name'][$i];
$data['uploadMaxFilesize'] = $maxUploadFileSize;
$data['maxHumanFilesize'] = $maxHumanFileSize;
- $data['permissions'] = $meta['permissions'] & $allowedPermissions;
+ $data['permissions'] = $meta['permissions'];
$data['directory'] = $returnedDir;
$result[] = $data;
}
@@ -234,7 +231,7 @@ if (\OC\Files\Filesystem::isValidPath($dir) === true) {
$data['originalname'] = $files['name'][$i];
$data['uploadMaxFilesize'] = $maxUploadFileSize;
$data['maxHumanFilesize'] = $maxHumanFileSize;
- $data['permissions'] = $meta['permissions'] & $allowedPermissions;
+ $data['permissions'] = $meta['permissions'];
$data['directory'] = $returnedDir;
$result[] = $data;
}
diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index 40b194ab882..61ff6d748f9 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -25,12 +25,14 @@
*/
\OCP\App::registerAdmin('files', 'admin');
+
\OC::$server->getNavigationManager()->add(function () {
+ $urlGenerator = \OC::$server->getURLGenerator();
$l = \OC::$server->getL10N('files');
return [
'id' => 'files_index',
'order' => 0,
- 'href' => \OCP\Util::linkTo('files', 'index.php'),
+ 'href' => $urlGenerator->linkToRoute('files.view.index'),
'icon' => \OCP\Util::imagePath('core', 'places/files.svg'),
'name' => $l->t('Files'),
];
@@ -63,6 +65,7 @@ $templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadshe
new \OCA\Files\ActivityHelper(
\OC::$server->getTagManager()
),
+ \OC::$server->getDatabaseConnection(),
\OC::$server->getConfig()
);
});
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index ba8bb62494e..4ab226f3968 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -8,7 +8,7 @@
<shipped>true</shipped>
<standalone/>
<default_enable/>
- <version>1.3.0</version>
+ <version>1.4.0</version>
<types>
<filesystem/>
</types>
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php
index d52dfaab21c..2bb913c30a6 100644
--- a/apps/files/appinfo/routes.php
+++ b/apps/files/appinfo/routes.php
@@ -48,14 +48,17 @@ $application->registerRoutes(
'verb' => 'GET',
'requirements' => array('tagName' => '.+'),
),
+ [
+ 'name' => 'view#index',
+ 'url' => '/',
+ 'verb' => 'GET',
+ ],
)
)
);
/** @var $this \OC\Route\Router */
-$this->create('files_index', '/')
- ->actionInclude('files/index.php');
$this->create('files_ajax_delete', 'ajax/delete.php')
->actionInclude('files/ajax/delete.php');
$this->create('files_ajax_download', 'ajax/download.php')
diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php
index 99ce64e09cc..31ae555e041 100644
--- a/apps/files/command/scan.php
+++ b/apps/files/command/scan.php
@@ -26,6 +26,7 @@
namespace OCA\Files\Command;
use OC\ForbiddenException;
+use OCP\Files\StorageNotAvailableException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@@ -74,7 +75,7 @@ class Scan extends Command {
}
protected function scanFiles($user, $path, $quiet, OutputInterface $output) {
- $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection());
+ $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
if (!$quiet) {
$scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) {
$output->writeln("Scanning file <info>$path</info>");
@@ -82,6 +83,9 @@ class Scan extends Command {
$scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) {
$output->writeln("Scanning folder <info>$path</info>");
});
+ $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output) {
+ $output->writeln("Error while scanning, storage not available (" . $e->getMessage() . ")");
+ });
}
try {
$scanner->scan($path);
diff --git a/apps/files/controller/apicontroller.php b/apps/files/controller/apicontroller.php
index 1ecd5294c66..ee54db63191 100644
--- a/apps/files/controller/apicontroller.php
+++ b/apps/files/controller/apicontroller.php
@@ -127,7 +127,7 @@ class ApiController extends Controller {
*
* @NoAdminRequired
*
- * @param array|string $tagName tag name to filter by
+ * @param string $tagName tag name to filter by
* @return DataResponse
*/
public function getFilesByTag($tagName) {
diff --git a/apps/files/controller/viewcontroller.php b/apps/files/controller/viewcontroller.php
new file mode 100644
index 00000000000..d9c59592863
--- /dev/null
+++ b/apps/files/controller/viewcontroller.php
@@ -0,0 +1,230 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files\Controller;
+
+use OC\AppFramework\Http\Request;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\ContentSecurityPolicy;
+use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IL10N;
+use OCP\INavigationManager;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use OCP\IConfig;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Class ViewController
+ *
+ * @package OCA\Files\Controller
+ */
+class ViewController extends Controller {
+ /** @var string */
+ protected $appName;
+ /** @var IRequest */
+ protected $request;
+ /** @var IURLGenerator */
+ protected $urlGenerator;
+ /** @var INavigationManager */
+ protected $navigationManager;
+ /** @var IL10N */
+ protected $l10n;
+ /** @var IConfig */
+ protected $config;
+ /** @var EventDispatcherInterface */
+ protected $eventDispatcher;
+
+ /**
+ * @param string $appName
+ * @param IRequest $request
+ * @param IURLGenerator $urlGenerator
+ * @param INavigationManager $navigationManager
+ * @param IL10N $l10n
+ * @param IConfig $config
+ * @param EventDispatcherInterface $eventDispatcherInterface
+ */
+ public function __construct($appName,
+ IRequest $request,
+ IURLGenerator $urlGenerator,
+ INavigationManager $navigationManager,
+ IL10N $l10n,
+ IConfig $config,
+ EventDispatcherInterface $eventDispatcherInterface) {
+ parent::__construct($appName, $request);
+ $this->appName = $appName;
+ $this->request = $request;
+ $this->urlGenerator = $urlGenerator;
+ $this->navigationManager = $navigationManager;
+ $this->l10n = $l10n;
+ $this->config = $config;
+ $this->eventDispatcher = $eventDispatcherInterface;
+ }
+
+ /**
+ * @param string $appName
+ * @param string $scriptName
+ * @return string
+ */
+ protected function renderScript($appName, $scriptName) {
+ $content = '';
+ $appPath = \OC_App::getAppPath($appName);
+ $scriptPath = $appPath . '/' . $scriptName;
+ if (file_exists($scriptPath)) {
+ // TODO: sanitize path / script name ?
+ ob_start();
+ include $scriptPath;
+ $content = ob_get_contents();
+ @ob_end_clean();
+ }
+ return $content;
+ }
+
+ /**
+ * FIXME: Replace with non static code
+ *
+ * @return array
+ * @throws \OCP\Files\NotFoundException
+ */
+ protected function getStorageInfo() {
+ $dirInfo = \OC\Files\Filesystem::getFileInfo('/', false);
+ return \OC_Helper::getStorageInfo('/', $dirInfo);
+ }
+
+ /**
+ * @NoCSRFRequired
+ * @NoAdminRequired
+ *
+ * @param string $dir
+ * @param string $view
+ * @return TemplateResponse
+ * @throws \OCP\Files\NotFoundException
+ */
+ public function index($dir = '', $view = '') {
+ $nav = new \OCP\Template('files', 'appnavigation', '');
+
+ // Load the files we need
+ \OCP\Util::addStyle('files', 'files');
+ \OCP\Util::addStyle('files', 'upload');
+ \OCP\Util::addStyle('files', 'mobile');
+ \OCP\Util::addscript('files', 'app');
+ \OCP\Util::addscript('files', 'file-upload');
+ \OCP\Util::addscript('files', 'newfilemenu');
+ \OCP\Util::addscript('files', 'jquery.iframe-transport');
+ \OCP\Util::addscript('files', 'jquery.fileupload');
+ \OCP\Util::addscript('files', 'jquery-visibility');
+ \OCP\Util::addscript('files', 'fileinfomodel');
+ \OCP\Util::addscript('files', 'filesummary');
+ \OCP\Util::addscript('files', 'breadcrumb');
+ \OCP\Util::addscript('files', 'filelist');
+ \OCP\Util::addscript('files', 'search');
+
+ \OCP\Util::addScript('files', 'favoritesfilelist');
+ \OCP\Util::addScript('files', 'tagsplugin');
+ \OCP\Util::addScript('files', 'favoritesplugin');
+
+ \OCP\Util::addScript('files', 'detailfileinfoview');
+ \OCP\Util::addScript('files', 'detailtabview');
+ \OCP\Util::addScript('files', 'mainfileinfodetailview');
+ \OCP\Util::addScript('files', 'detailsview');
+ \OCP\Util::addStyle('files', 'detailsView');
+
+ \OC_Util::addVendorScript('core', 'handlebars/handlebars');
+
+ \OCP\Util::addscript('files', 'fileactions');
+ \OCP\Util::addscript('files', 'fileactionsmenu');
+ \OCP\Util::addscript('files', 'files');
+ \OCP\Util::addscript('files', 'keyboardshortcuts');
+ \OCP\Util::addscript('files', 'navigation');
+
+ // if IE8 and "?dir=path&view=someview" was specified, reformat the URL to use a hash like "#?dir=path&view=someview"
+ $isIE8 = $this->request->isUserAgent([Request::USER_AGENT_IE_8]);
+ if ($isIE8 && ($dir !== '' || $view !== '')) {
+ $dir = !empty($dir) ? $dir : '/';
+ $view = !empty($view) ? $view : 'files';
+ $hash = '#?dir=' . \OCP\Util::encodePath($dir);
+ if ($view !== 'files') {
+ $hash .= '&view=' . urlencode($view);
+ }
+ return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index') . $hash);
+ }
+
+ // mostly for the home storage's free space
+ // FIXME: Make non static
+ $storageInfo = $this->getStorageInfo();
+
+ \OCA\Files\App::getNavigationManager()->add(
+ [
+ 'id' => 'favorites',
+ 'appname' => 'files',
+ 'script' => 'simplelist.php',
+ 'order' => 5,
+ 'name' => $this->l10n->t('Favorites')
+ ]
+ );
+
+ $navItems = \OCA\Files\App::getNavigationManager()->getAll();
+ usort($navItems, function($item1, $item2) {
+ return $item1['order'] - $item2['order'];
+ });
+ $nav->assign('navigationItems', $navItems);
+
+ $contentItems = [];
+
+ // render the container content for every navigation item
+ foreach ($navItems as $item) {
+ $content = '';
+ if (isset($item['script'])) {
+ $content = $this->renderScript($item['appname'], $item['script']);
+ }
+ $contentItem = [];
+ $contentItem['id'] = $item['id'];
+ $contentItem['content'] = $content;
+ $contentItems[] = $contentItem;
+ }
+
+ $this->eventDispatcher->dispatch('OCA\Files::loadAdditionalScripts');
+
+ $params = [];
+ $params['usedSpacePercent'] = (int)$storageInfo['relative'];
+ $params['owner'] = $storageInfo['owner'];
+ $params['ownerDisplayName'] = $storageInfo['ownerDisplayName'];
+ $params['isPublic'] = false;
+ $params['mailNotificationEnabled'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no');
+ $params['mailPublicNotificationEnabled'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no');
+ $params['allowShareWithLink'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes');
+ $params['appNavigation'] = $nav;
+ $params['appContents'] = $contentItems;
+ $this->navigationManager->setActiveEntry('files_index');
+
+ $response = new TemplateResponse(
+ $this->appName,
+ 'index',
+ $params
+ );
+ $policy = new ContentSecurityPolicy();
+ $policy->addAllowedFrameDomain('\'self\'');
+ $response->setContentSecurityPolicy($policy);
+
+ return $response;
+ }
+}
diff --git a/apps/files/index.php b/apps/files/index.php
deleted file mode 100644
index cc007ebdb07..00000000000
--- a/apps/files/index.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Frank Karlitschek <frank@owncloud.org>
- * @author Jakob Sack <mail@jakobsack.de>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Roman Geber <rgeber@owncloudapps.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-// Check if we are a user
-OCP\User::checkLoggedIn();
-
-// Load the files we need
-OCP\Util::addStyle('files', 'files');
-OCP\Util::addStyle('files', 'upload');
-OCP\Util::addStyle('files', 'mobile');
-OCP\Util::addscript('files', 'app');
-OCP\Util::addscript('files', 'file-upload');
-OCP\Util::addscript('files', 'newfilemenu');
-OCP\Util::addscript('files', 'jquery.iframe-transport');
-OCP\Util::addscript('files', 'jquery.fileupload');
-OCP\Util::addscript('files', 'jquery-visibility');
-OCP\Util::addscript('files', 'fileinfomodel');
-OCP\Util::addscript('files', 'filesummary');
-OCP\Util::addscript('files', 'breadcrumb');
-OCP\Util::addscript('files', 'filelist');
-OCP\Util::addscript('files', 'search');
-
-\OCP\Util::addScript('files', 'favoritesfilelist');
-\OCP\Util::addScript('files', 'tagsplugin');
-\OCP\Util::addScript('files', 'favoritesplugin');
-
-\OCP\Util::addScript('files', 'detailfileinfoview');
-\OCP\Util::addScript('files', 'detailtabview');
-\OCP\Util::addScript('files', 'mainfileinfodetailview');
-\OCP\Util::addScript('files', 'detailsview');
-\OCP\Util::addStyle('files', 'detailsView');
-
-\OC_Util::addVendorScript('core', 'handlebars/handlebars');
-
-OCP\App::setActiveNavigationEntry('files_index');
-
-$l = \OC::$server->getL10N('files');
-
-$isIE8 = false;
-preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
-if (count($matches) > 0 && $matches[1] <= 9) {
- $isIE8 = true;
-}
-
-// if IE8 and "?dir=path&view=someview" was specified, reformat the URL to use a hash like "#?dir=path&view=someview"
-if ($isIE8 && (isset($_GET['dir']) || isset($_GET['view']))) {
- $hash = '#?';
- $dir = isset($_GET['dir']) ? $_GET['dir'] : '/';
- $view = isset($_GET['view']) ? $_GET['view'] : 'files';
- $hash = '#?dir=' . \OCP\Util::encodePath($dir);
- if ($view !== 'files') {
- $hash .= '&view=' . urlencode($view);
- }
- header('Location: ' . OCP\Util::linkTo('files', 'index.php') . $hash);
- exit();
-}
-
-$user = OC_User::getUser();
-
-$config = \OC::$server->getConfig();
-
-// mostly for the home storage's free space
-$dirInfo = \OC\Files\Filesystem::getFileInfo('/', false);
-$storageInfo=OC_Helper::getStorageInfo('/', $dirInfo);
-
-$nav = new OCP\Template('files', 'appnavigation', '');
-
-function sortNavigationItems($item1, $item2) {
- return $item1['order'] - $item2['order'];
-}
-
-\OCA\Files\App::getNavigationManager()->add(
- array(
- 'id' => 'favorites',
- 'appname' => 'files',
- 'script' => 'simplelist.php',
- 'order' => 5,
- 'name' => $l->t('Favorites')
- )
-);
-
-$navItems = \OCA\Files\App::getNavigationManager()->getAll();
-usort($navItems, 'sortNavigationItems');
-$nav->assign('navigationItems', $navItems);
-
-$contentItems = array();
-
-function renderScript($appName, $scriptName) {
- $content = '';
- $appPath = OC_App::getAppPath($appName);
- $scriptPath = $appPath . '/' . $scriptName;
- if (file_exists($scriptPath)) {
- // TODO: sanitize path / script name ?
- ob_start();
- include $scriptPath;
- $content = ob_get_contents();
- @ob_end_clean();
- }
- return $content;
-}
-
-// render the container content for every navigation item
-foreach ($navItems as $item) {
- $content = '';
- if (isset($item['script'])) {
- $content = renderScript($item['appname'], $item['script']);
- }
- $contentItem = array();
- $contentItem['id'] = $item['id'];
- $contentItem['content'] = $content;
- $contentItems[] = $contentItem;
-}
-
-OCP\Util::addscript('files', 'fileactions');
-OCP\Util::addscript('files', 'fileactionsmenu');
-OCP\Util::addscript('files', 'files');
-OCP\Util::addscript('files', 'navigation');
-OCP\Util::addscript('files', 'keyboardshortcuts');
-
-\OC::$server->getEventDispatcher()->dispatch('OCA\Files::loadAdditionalScripts');
-
-$tmpl = new OCP\Template('files', 'index', 'user');
-$tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']);
-$tmpl->assign('owner', $storageInfo['owner']);
-$tmpl->assign('ownerDisplayName', $storageInfo['ownerDisplayName']);
-$tmpl->assign('isPublic', false);
-$tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'no'));
-$tmpl->assign("mailPublicNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_public_notification', 'no'));
-$tmpl->assign("allowShareWithLink", $config->getAppValue('core', 'shareapi_allow_links', 'yes'));
-$tmpl->assign('appNavigation', $nav);
-$tmpl->assign('appContents', $contentItems);
-
-$tmpl->printPage();
diff --git a/apps/files/js/app.js b/apps/files/js/app.js
index f31770466fe..ff505d417f1 100644
--- a/apps/files/js/app.js
+++ b/apps/files/js/app.js
@@ -71,7 +71,8 @@
folderDropOptions: folderDropOptions,
fileActions: fileActions,
allowLegacyActions: true,
- scrollTo: urlParams.scrollto
+ scrollTo: urlParams.scrollto,
+ filesClient: OC.Files.getClient()
}
);
this.files.initialize();
diff --git a/apps/files/js/favoritesplugin.js b/apps/files/js/favoritesplugin.js
index 417a32ef804..454a505c7bd 100644
--- a/apps/files/js/favoritesplugin.js
+++ b/apps/files/js/favoritesplugin.js
@@ -92,7 +92,7 @@
// folder in the files app instead of opening it directly
fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
OCA.Files.App.setActiveView('files', {silent: true});
- OCA.Files.App.fileList.changeDirectory(context.$file.attr('data-path') + '/' + filename, true, true);
+ OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true);
});
fileActions.setDefault('dir', 'Open');
return fileActions;
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 6a767d48a28..871a2149c88 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -575,7 +575,8 @@
},
actionHandler: function (filename, context) {
var dir = context.dir || context.fileList.getCurrentDirectory();
- var url = context.fileList.getDownloadUrl(filename, dir);
+ var isDir = context.$file.attr('data-type') === 'dir';
+ var url = context.fileList.getDownloadUrl(filename, dir, isDir);
var downloadFileaction = $(context.$file).find('.fileactions .action-download');
@@ -611,10 +612,7 @@
this.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
var dir = context.$file.attr('data-path') || context.fileList.getCurrentDirectory();
- if (dir !== '/') {
- dir = dir + '/';
- }
- context.fileList.changeDirectory(dir + filename);
+ context.fileList.changeDirectory(OC.joinPaths(dir, filename));
});
this.registerAction({
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index d1f68d98eab..672c39a8bb1 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -22,11 +22,12 @@
*
* @param $el container element with existing markup for the #controls
* and a table
- * @param [options] map of options, see other parameters
- * @param [options.scrollContainer] scrollable container, defaults to $(window)
- * @param [options.dragOptions] drag options, disabled by default
- * @param [options.folderDropOptions] folder drop options, disabled by default
- * @param [options.detailsViewEnabled=true] whether to enable details view
+ * @param {Object} [options] map of options, see other parameters
+ * @param {Object} [options.scrollContainer] scrollable container, defaults to $(window)
+ * @param {Object} [options.dragOptions] drag options, disabled by default
+ * @param {Object} [options.folderDropOptions] folder drop options, disabled by default
+ * @param {boolean} [options.detailsViewEnabled=true] whether to enable details view
+ * @param {OC.Files.Client} [options.filesClient] files client to use
*/
var FileList = function($el, options) {
this.initialize($el, options);
@@ -74,6 +75,13 @@
_detailsView: null,
/**
+ * Files client instance
+ *
+ * @type OC.Files.Client
+ */
+ filesClient: null,
+
+ /**
* Whether the file list was initialized already.
* @type boolean
*/
@@ -92,11 +100,18 @@
* Array of files in the current folder.
* The entries are of file data.
*
- * @type Array.<Object>
+ * @type Array.<OC.Files.FileInfo>
*/
files: [],
/**
+ * Current directory entry
+ *
+ * @type OC.Files.FileInfo
+ */
+ dirInfo: null,
+
+ /**
* File actions handler, defaults to OCA.Files.FileActions
* @type OCA.Files.FileActions
*/
@@ -149,7 +164,7 @@
* When false, clicking on a table header will call reload().
* When true, clicking on a table header will simply resort the list.
*/
- _clientSideSort: false,
+ _clientSideSort: true,
/**
* Current directory
@@ -170,6 +185,7 @@
* @param options.dragOptions drag options, disabled by default
* @param options.folderDropOptions folder drop options, disabled by default
* @param options.scrollTo name of file to scroll to after the first load
+ * @param {OC.Files.Client} [options.filesClient] files API client
* @private
*/
initialize: function($el, options) {
@@ -185,6 +201,12 @@
if (options.folderDropOptions) {
this._folderDropOptions = options.folderDropOptions;
}
+ if (options.filesClient) {
+ this.filesClient = options.filesClient;
+ } else {
+ // default client if not specified
+ this.filesClient = OC.Files.getClient();
+ }
this.$el = $el;
if (options.id) {
@@ -209,6 +231,8 @@
this.files = [];
this._selectedFiles = {};
this._selectionSummary = new OCA.Files.FileSummary();
+ // dummy root dir info
+ this.dirInfo = new OC.Files.FileInfo({});
this.fileSummary = this._createSummary();
@@ -359,7 +383,7 @@
var highlightState = $tr.hasClass('highlighted');
$tr = self.updateRow(
$tr,
- _.extend({isPreviewAvailable: true}, model.toJSON()),
+ model.toJSON(),
{updateSummary: true, silent: false, animate: true}
);
$tr.toggleClass('highlighted', highlightState);
@@ -618,7 +642,7 @@
};
OCA.Files.FileActions.updateFileActionSpinner(downloadFileaction, true);
- OCA.Files.Files.handleDownload(this.getDownloadUrl(files, dir), disableLoadingState);
+ OCA.Files.Files.handleDownload(this.getDownloadUrl(files, dir, true), disableLoadingState);
return false;
},
@@ -894,16 +918,39 @@
self.$el.closest('#app-content').trigger(jQuery.Event('apprendered'));
});
},
+
+ /**
+ * Returns the icon URL matching the given file info
+ *
+ * @param {OC.Files.FileInfo} fileInfo file info
+ *
+ * @return {string} icon URL
+ */
+ _getIconUrl: function(fileInfo) {
+ var mimeType = fileInfo.mimetype || 'application/octet-stream';
+ if (mimeType === 'httpd/unix-directory') {
+ // use default folder icon
+ if (fileInfo.mountType === 'shared' || fileInfo.mountType === 'shared-root') {
+ return OC.MimeType.getIconUrl('dir-shared');
+ } else if (fileInfo.mountType === 'external-root') {
+ return OC.MimeType.getIconUrl('dir-external');
+ }
+ return OC.MimeType.getIconUrl('dir');
+ }
+ return OC.MimeType.getIconUrl(mimeType);
+ },
+
/**
* Creates a new table row element using the given file data.
- * @param {OCA.Files.FileInfo} fileData file info attributes
+ * @param {OC.Files.FileInfo} fileData file info attributes
* @param options map of attributes
* @return new tr element (not appended to the table)
*/
_createRow: function(fileData, options) {
var td, simpleSize, basename, extension, sizeColor,
- icon = OC.MimeType.getIconUrl(fileData.mimetype),
+ icon = fileData.icon || this._getIconUrl(fileData),
name = fileData.name,
+ // TODO: get rid of type, only use mime type
type = fileData.type || 'file',
mtime = parseInt(fileData.mtime, 10),
mime = fileData.mimetype,
@@ -943,6 +990,14 @@
}
if (fileData.mountType) {
+ // FIXME: HACK: detect shared-root
+ if (fileData.mountType === 'shared' && this.dirInfo.mountType !== 'shared') {
+ // if parent folder isn't share, assume the displayed folder is a share root
+ fileData.mountType = 'shared-root';
+ } else if (fileData.mountType === 'external' && this.dirInfo.mountType !== 'external') {
+ // if parent folder isn't external, assume the displayed folder is the external storage root
+ fileData.mountType = 'external-root';
+ }
tr.attr('data-mounttype', fileData.mountType);
}
@@ -953,24 +1008,16 @@
path = this.getCurrentDirectory();
}
- if (type === 'dir') {
- // use default folder icon
- icon = icon || OC.imagePath('core', 'filetypes/folder');
- }
- else {
- icon = icon || OC.imagePath('core', 'filetypes/file');
- }
-
// filename td
td = $('<td class="filename"></td>');
// linkUrl
- if (type === 'dir') {
+ if (mime === 'httpd/unix-directory') {
linkUrl = this.linkTo(path + '/' + name);
}
else {
- linkUrl = this.getDownloadUrl(name, path);
+ linkUrl = this.getDownloadUrl(name, path, type === 'dir');
}
if (this._allowSelection) {
td.append(
@@ -996,7 +1043,7 @@
basename = '';
extension = name;
// split extension from filename for non dirs
- } else if (type !== 'dir' && name.indexOf('.') !== -1) {
+ } else if (mime !== 'httpd/unix-directory' && name.indexOf('.') !== -1) {
basename = name.substr(0, name.lastIndexOf('.'));
extension = name.substr(name.lastIndexOf('.'));
} else {
@@ -1018,7 +1065,7 @@
nameSpan.tooltip({placement: 'right'});
}
// dirs can show the number of uploaded files
- if (type === 'dir') {
+ if (mime !== 'httpd/unix-directory') {
linkElem.append($('<span></span>').attr({
'class': 'uploadtext',
'currentUploads': 0
@@ -1074,7 +1121,7 @@
* Adds an entry to the files array and also into the DOM
* in a sorted manner.
*
- * @param {OCA.Files.FileInfo} fileData map of file attributes
+ * @param {OC.Files.FileInfo} fileData map of file attributes
* @param {Object} [options] map of attributes
* @param {boolean} [options.updateSummary] true to update the summary
* after adding (default), false otherwise. Defaults to true.
@@ -1147,7 +1194,7 @@
* Creates a new row element based on the given attributes
* and returns it.
*
- * @param {OCA.Files.FileInfo} fileData map of file attributes
+ * @param {OC.Files.FileInfo} fileData map of file attributes
* @param {Object} [options] map of attributes
* @param {int} [options.index] index at which to insert the element
* @param {boolean} [options.updateSummary] true to update the summary
@@ -1182,7 +1229,7 @@
filenameTd.draggable(this._dragOptions);
}
// allow dropping on folders
- if (this._folderDropOptions && fileData.type === 'dir') {
+ if (this._folderDropOptions && mime === 'httpd/unix-directory') {
filenameTd.droppable(this._folderDropOptions);
}
@@ -1193,7 +1240,7 @@
// display actions
this.fileActions.display(filenameTd, !options.silent, this);
- if (fileData.isPreviewAvailable && mime !== 'httpd/unix-directory') {
+ if (mime !== 'httpd/unix-directory') {
var iconDiv = filenameTd.find('.thumbnail');
// lazy load / newly inserted td ?
// the typeof check ensures that the default value of animate is true
@@ -1330,6 +1377,13 @@
},
/**
+ * Returns list of webdav properties to request
+ */
+ _getWebdavProperties: function() {
+ return this.filesClient.getPropfindProperties();
+ },
+
+ /**
* Reloads the file list using ajax call
*
* @return ajax call object
@@ -1343,17 +1397,12 @@
this._currentFileModel = null;
this.$el.find('.select-all').prop('checked', false);
this.showMask();
- if (this._reloadCall) {
- this._reloadCall.abort();
- }
- this._reloadCall = $.ajax({
- url: this.getAjaxUrl('list'),
- data: {
- dir : this.getCurrentDirectory(),
- sort: this._sort,
- sortdirection: this._sortDirection
+ this._reloadCall = this.filesClient.getFolderContents(
+ this.getCurrentDirectory(), {
+ includeParent: true,
+ properties: this._getWebdavProperties()
}
- });
+ );
if (this._detailsView) {
// close sidebar
this._updateDetailsView(null);
@@ -1361,24 +1410,19 @@
var callBack = this.reloadCallback.bind(this);
return this._reloadCall.then(callBack, callBack);
},
- reloadCallback: function(result) {
+ reloadCallback: function(status, result) {
delete this._reloadCall;
this.hideMask();
- if (!result || result.status === 'error') {
- // if the error is not related to folder we're trying to load, reload the page to handle logout etc
- if (result.data.error === 'authentication_error' ||
- result.data.error === 'token_expired' ||
- result.data.error === 'application_not_enabled'
- ) {
- OC.redirect(OC.generateUrl('apps/files'));
- }
- OC.Notification.showTemporary(result.data.message);
+ if (status === 401) {
+ // TODO: append current URL to be able to get back after logging in again
+ OC.redirect(OC.generateUrl('apps/files'));
+ OC.Notification.show(result);
return false;
}
// Firewall Blocked request?
- if (result.status === 403) {
+ if (status === 403) {
// Go home
this.changeDirectory('/');
OC.Notification.showTemporary(t('files', 'This operation is forbidden'));
@@ -1386,32 +1430,49 @@
}
// Did share service die or something else fail?
- if (result.status === 500) {
+ if (status === 500) {
// Go home
this.changeDirectory('/');
- OC.Notification.showTemporary(t('files', 'This directory is unavailable, please check the logs or contact the administrator'));
+ OC.Notification.showTemporary(
+ t('files', 'This directory is unavailable, please check the logs or contact the administrator')
+ );
+ return false;
+ }
+
+ if (status === 503) {
+ // Go home
+ if (this.getCurrentDirectory() !== '/') {
+ this.changeDirectory('/');
+ // TODO: read error message from exception
+ OC.Notification.showTemporary(
+ t('files', 'Storage not available')
+ );
+ }
return false;
}
- if (result.status === 404) {
+ if (status === 404) {
// go back home
this.changeDirectory('/');
return false;
}
// aborted ?
- if (result.status === 0){
+ if (status === 0){
return true;
}
- // TODO: should rather return upload file size through
- // the files list ajax call
+ // TODO: parse remaining quota from PROPFIND response
this.updateStorageStatistics(true);
- if (result.data.permissions) {
- this.setDirectoryPermissions(result.data.permissions);
+ // first entry is the root
+ this.dirInfo = result.shift();
+
+ if (this.dirInfo.permissions) {
+ this.setDirectoryPermissions(this.dirInfo.permissions);
}
- this.setFiles(result.data.files);
+ result.sort(this._sortComparator);
+ this.setFiles(result);
return true;
},
@@ -1419,12 +1480,15 @@
OCA.Files.Files.updateStorageStatistics(this.getCurrentDirectory(), force);
},
+ /**
+ * @deprecated do not use nor override
+ */
getAjaxUrl: function(action, params) {
return OCA.Files.Files.getAjaxUrl(action, params);
},
- getDownloadUrl: function(files, dir) {
- return OCA.Files.Files.getDownloadUrl(files, dir || this.getCurrentDirectory());
+ getDownloadUrl: function(files, dir, isDir) {
+ return OCA.Files.Files.getDownloadUrl(files, dir || this.getCurrentDirectory(), isDir);
},
/**
@@ -1489,8 +1553,6 @@
if (etag){
// use etag as cache buster
urlSpec.c = etag;
- } else {
- console.warn('OCA.Files.FileList.lazyLoadPreview(): missing etag argument');
}
previewURL = self.generatePreviewUrl(urlSpec);
@@ -1514,6 +1576,9 @@
img.src = previewURL;
},
+ /**
+ * @deprecated
+ */
setDirectoryPermissions: function(permissions) {
var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
this.$el.find('#permissions').val(permissions);
@@ -1610,7 +1675,7 @@
* fileData should be inserted, considering the current
* sorting
*
- * @param {OCA.Files.FileInfo} fileData file info
+ * @param {OC.Files.FileInfo} fileData file info
*/
_findInsertionIndex: function(fileData) {
var index = 0;
@@ -1628,6 +1693,9 @@
move: function(fileNames, targetPath) {
var self = this;
var dir = this.getCurrentDirectory();
+ if (dir.charAt(dir.length - 1) !== '/') {
+ dir += '/';
+ }
var target = OC.basename(targetPath);
if (!_.isArray(fileNames)) {
fileNames = [fileNames];
@@ -1635,46 +1703,42 @@
_.each(fileNames, function(fileName) {
var $tr = self.findFileEl(fileName);
self.showFileBusyState($tr, true);
- // TODO: improve performance by sending all file names in a single call
- $.post(
- OC.filePath('files', 'ajax', 'move.php'),
- {
- dir: dir,
- file: fileName,
- target: targetPath
- },
- function(result) {
- if (result) {
- if (result.status === 'success') {
- // if still viewing the same directory
- if (self.getCurrentDirectory() === dir) {
- // recalculate folder size
- var oldFile = self.findFileEl(target);
- var newFile = self.findFileEl(fileName);
- var oldSize = oldFile.data('size');
- var newSize = oldSize + newFile.data('size');
- oldFile.data('size', newSize);
- oldFile.find('td.filesize').text(OC.Util.humanFileSize(newSize));
-
- // TODO: also update entry in FileList.files
-
- self.remove(fileName);
- }
- } else {
- OC.Notification.hide();
- if (result.status === 'error' && result.data.message) {
- OC.Notification.showTemporary(result.data.message);
- }
- else {
- OC.Notification.showTemporary(t('files', 'Error moving file.'));
- }
- }
+ if (targetPath.charAt(targetPath.length - 1) !== '/') {
+ // make sure we move the files into the target dir,
+ // not overwrite it
+ targetPath = targetPath + '/';
+ }
+ self.filesClient.move(dir + fileName, targetPath + fileName)
+ .done(function() {
+ // if still viewing the same directory
+ if (OC.joinPaths(self.getCurrentDirectory(), '/') === dir) {
+ // recalculate folder size
+ var oldFile = self.findFileEl(target);
+ var newFile = self.findFileEl(fileName);
+ var oldSize = oldFile.data('size');
+ var newSize = oldSize + newFile.data('size');
+ oldFile.data('size', newSize);
+ oldFile.find('td.filesize').text(OC.Util.humanFileSize(newSize));
+
+ // TODO: also update entry in FileList.files
+ self.remove(fileName);
+ }
+ })
+ .fail(function(status) {
+ if (status === 412) {
+ // TODO: some day here we should invoke the conflict dialog
+ OC.Notification.showTemporary(
+ t('files', 'Could not move "{file}", target exists', {file: fileName})
+ );
} else {
- OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error'));
+ OC.Notification.showTemporary(
+ t('files', 'Could not move "{file}"', {file: fileName})
+ );
}
+ })
+ .always(function() {
self.showFileBusyState($tr, false);
- }
- );
+ });
});
},
@@ -1700,16 +1764,16 @@
* Triggers file rename input field for the given file name.
* If the user enters a new name, the file will be renamed.
*
- * @param oldname file name of the file to rename
+ * @param oldName file name of the file to rename
*/
- rename: function(oldname) {
+ rename: function(oldName) {
var self = this;
var tr, td, input, form;
- tr = this.findFileEl(oldname);
+ tr = this.findFileEl(oldName);
var oldFileInfo = this.files[tr.index()];
tr.data('renaming',true);
td = tr.children('td.filename');
- input = $('<input type="text" class="filename"/>').val(oldname);
+ input = $('<input type="text" class="filename"/>').val(oldName);
form = $('<form></form>');
form.append(input);
td.children('a.name').hide();
@@ -1724,11 +1788,11 @@
input.selectRange(0, len);
var checkInput = function () {
var filename = input.val();
- if (filename !== oldname) {
+ if (filename !== oldName) {
// Files.isFileNameValid(filename) throws an exception itself
OCA.Files.Files.isFileNameValid(filename);
if (self.inList(filename)) {
- throw t('files', '{new_name} already exists', {new_name: filename});
+ throw t('files', '{newName} already exists', {newName: filename});
}
}
return true;
@@ -1741,6 +1805,12 @@
td.children('a.name').show();
}
+ function updateInList(fileInfo) {
+ self.updateRow(tr, fileInfo);
+ self._updateDetailsView(fileInfo.name, false);
+ }
+
+ // TODO: too many nested blocks, move parts into functions
form.submit(function(event) {
event.stopPropagation();
event.preventDefault();
@@ -1753,7 +1823,7 @@
input.tooltip('hide');
form.remove();
- if (newName !== oldname) {
+ if (newName !== oldName) {
checkInput();
// mark as loading (temp element)
self.showFileBusyState(tr, true);
@@ -1765,34 +1835,45 @@
td.find('a.name span.nametext').text(basename);
td.children('a.name').show();
- $.ajax({
- url: OC.filePath('files','ajax','rename.php'),
- data: {
- dir : tr.attr('data-path') || self.getCurrentDirectory(),
- newname: newName,
- file: oldname
- },
- success: function(result) {
- var fileInfo;
- if (!result || result.status === 'error') {
- OC.dialogs.alert(result.data.message, t('files', 'Could not rename file'));
- fileInfo = oldFileInfo;
- if (result.data.code === 'sourcenotfound') {
- self.remove(result.data.newname, {updateSummary: true});
- return;
- }
- }
- else {
- fileInfo = result.data;
+ var path = tr.attr('data-path') || self.getCurrentDirectory();
+ self.filesClient.move(OC.joinPaths(path, oldName), OC.joinPaths(path, newName))
+ .done(function() {
+ oldFileInfo.name = newName;
+ updateInList(oldFileInfo);
+ })
+ .fail(function(status) {
+ // TODO: 409 means current folder does not exist, redirect ?
+ if (status === 404) {
+ // source not found, so remove it from the list
+ OC.Notification.showTemporary(
+ t(
+ 'files',
+ 'Could not rename "{fileName}", it does not exist any more',
+ {fileName: oldName}
+ )
+ );
+ self.remove(newName, {updateSummary: true});
+ return;
+ } else if (status === 412) {
+ // target exists
+ OC.Notification.showTemporary(
+ t(
+ 'files',
+ 'The name "{targetName}" is already used in the folder "{dir}". Please choose a different name.',
+ {
+ targetName: newName,
+ dir: self.getCurrentDirectory()
+ }
+ )
+ );
+ } else {
+ // restore the item to its previous state
+ OC.Notification.showTemporary(
+ t('files', 'Could not rename "{fileName}"', {fileName: oldName})
+ );
}
- // reinsert row
- self.files.splice(tr.index(), 1);
- tr.remove();
- tr = self.add(fileInfo, {updateSummary: false, silent: true});
- self.$fileList.trigger($.Event('fileActionsReady', {fileList: self, $files: $(tr)}));
- self._updateDetailsView(fileInfo.name, false);
- }
- });
+ updateInList(oldFileInfo);
+ });
} else {
// add back the old file info when cancelled
self.files.splice(tr.index(), 1);
@@ -1849,32 +1930,48 @@
var promise = deferred.promise();
OCA.Files.Files.isFileNameValid(name);
- name = this.getUniqueName(name);
if (this.lastAction) {
this.lastAction();
}
- $.post(
- OC.generateUrl('/apps/files/ajax/newfile.php'),
- {
- dir: this.getCurrentDirectory(),
- filename: name
- },
- function(result) {
- if (result.status === 'success') {
- self.add(result.data, {animate: true, scrollTo: true});
- deferred.resolve(result.status, result.data);
+ name = this.getUniqueName(name);
+ var targetPath = this.getCurrentDirectory() + '/' + name;
+
+ self.filesClient.putFileContents(
+ targetPath,
+ '',
+ {
+ contentType: 'text/plain',
+ overwrite: true
+ }
+ )
+ .done(function() {
+ // TODO: error handling / conflicts
+ self.filesClient.getFileInfo(
+ targetPath, {
+ properties: self._getWebdavProperties()
+ }
+ )
+ .then(function(status, data) {
+ self.add(data, {animate: true, scrollTo: true});
+ deferred.resolve(status, data);
+ })
+ .fail(function(status) {
+ OC.Notification.showTemporary(t('files', 'Could not create file "{file}"', {file: name}));
+ deferred.reject(status);
+ });
+ })
+ .fail(function(status) {
+ if (status === 412) {
+ OC.Notification.showTemporary(
+ t('files', 'Could not create file "{file}" because it already exists', {file: name})
+ );
} else {
- if (result.data && result.data.message) {
- OC.Notification.showTemporary(result.data.message);
- } else {
- OC.Notification.showTemporary(t('core', 'Could not create file'));
- }
- deferred.reject(result.status, result.data);
+ OC.Notification.showTemporary(t('files', 'Could not create file "{file}"', {file: name}));
}
- }
- );
+ deferred.reject(status);
+ });
return promise;
},
@@ -1895,32 +1992,58 @@
var promise = deferred.promise();
OCA.Files.Files.isFileNameValid(name);
- name = this.getUniqueName(name);
if (this.lastAction) {
this.lastAction();
}
- $.post(
- OC.generateUrl('/apps/files/ajax/newfolder.php'),
- {
- dir: this.getCurrentDirectory(),
- foldername: name
- },
- function(result) {
- if (result.status === 'success') {
- self.add(result.data, {animate: true, scrollTo: true});
- deferred.resolve(result.status, result.data);
+ name = this.getUniqueName(name);
+ var targetPath = this.getCurrentDirectory() + '/' + name;
+
+ this.filesClient.createDirectory(targetPath)
+ .done(function(createStatus) {
+ self.filesClient.getFileInfo(
+ targetPath, {
+ properties: self._getWebdavProperties()
+ }
+ )
+ .done(function(status, data) {
+ self.add(data, {animate: true, scrollTo: true});
+ deferred.resolve(status, data);
+ })
+ .fail(function() {
+ OC.Notification.showTemporary(t('files', 'Could not create folder "{dir}"', {dir: name}));
+ deferred.reject(createStatus);
+ });
+ })
+ .fail(function(createStatus) {
+ // method not allowed, folder might exist already
+ if (createStatus === 405) {
+ self.filesClient.getFileInfo(
+ targetPath, {
+ properties: self._getWebdavProperties()
+ }
+ )
+ .done(function(status, data) {
+ // add it to the list, for completeness
+ self.add(data, {animate: true, scrollTo: true});
+ OC.Notification.showTemporary(
+ t('files', 'Could not create folder "{dir}" because it already exists', {dir: name})
+ );
+ // still consider a failure
+ deferred.reject(createStatus, data);
+ })
+ .fail(function() {
+ OC.Notification.showTemporary(
+ t('files', 'Could not create folder "{dir}"', {dir: name})
+ );
+ deferred.reject(status);
+ });
} else {
- if (result.data && result.data.message) {
- OC.Notification.showTemporary(result.data.message);
- } else {
- OC.Notification.showTemporary(t('core', 'Could not create folder'));
- }
- deferred.reject(result.status);
+ OC.Notification.showTemporary(t('files', 'Could not create folder "{dir}"', {dir: name}));
+ deferred.reject(createStatus);
}
- }
- );
+ });
return promise;
},
@@ -1981,76 +2104,59 @@
*/
do_delete:function(files, dir) {
var self = this;
- var params;
if (files && files.substr) {
files=[files];
}
+ if (!files) {
+ // delete all files in directory
+ files = _.pluck(this.files, 'name');
+ }
if (files) {
this.showFileBusyState(files, true);
- for (var i=0; i<files.length; i++) {
- }
}
// Finish any existing actions
if (this.lastAction) {
this.lastAction();
}
- params = {
- dir: dir || this.getCurrentDirectory()
- };
- if (files) {
- params.files = JSON.stringify(files);
+ dir = dir || this.getCurrentDirectory();
+
+ function removeFromList(file) {
+ var fileEl = self.remove(file, {updateSummary: false});
+ // FIXME: not sure why we need this after the
+ // element isn't even in the DOM any more
+ fileEl.find('.selectCheckBox').prop('checked', false);
+ fileEl.removeClass('selected');
+ self.fileSummary.remove({type: fileEl.attr('data-type'), size: fileEl.attr('data-size')});
+ // TODO: this info should be returned by the ajax call!
+ self.updateEmptyContent();
+ self.fileSummary.update();
+ self.updateSelectionSummary();
+ // FIXME: don't repeat this, do it once all files are done
+ self.updateStorageStatistics();
}
- else {
- // no files passed, delete all in current dir
- params.allfiles = true;
- // show spinner for all files
- this.showFileBusyState(this.$fileList.find('tr'), true);
- }
-
- $.post(OC.filePath('files', 'ajax', 'delete.php'),
- params,
- function(result) {
- if (result.status === 'success') {
- if (params.allfiles) {
- self.setFiles([]);
- }
- else {
- $.each(files,function(index,file) {
- var fileEl = self.remove(file, {updateSummary: false});
- // FIXME: not sure why we need this after the
- // element isn't even in the DOM any more
- fileEl.find('.selectCheckBox').prop('checked', false);
- fileEl.removeClass('selected');
- self.fileSummary.remove({type: fileEl.attr('data-type'), size: fileEl.attr('data-size')});
- });
- }
- // TODO: this info should be returned by the ajax call!
- self.updateEmptyContent();
- self.fileSummary.update();
- self.updateSelectionSummary();
- self.updateStorageStatistics();
- // in case there was a "storage full" permanent notification
- OC.Notification.hide();
+
+ _.each(files, function(file) {
+ self.filesClient.remove(dir + '/' + file)
+ .done(function() {
+ removeFromList(file);
+ })
+ .fail(function(status) {
+ if (status === 404) {
+ // the file already did not exist, remove it from the list
+ removeFromList(file);
} else {
- if (result.status === 'error' && result.data.message) {
- OC.Notification.showTemporary(result.data.message);
- }
- else {
- OC.Notification.showTemporary(t('files', 'Error deleting file.'));
- }
- if (params.allfiles) {
- // reload the page as we don't know what files were deleted
- // and which ones remain
- self.reload();
- }
- else {
- $.each(files,function(index,file) {
- self.showFileBusyState(file, false);
- });
- }
+ // only reset the spinner for that one file
+ OC.Notification.showTemporary(
+ t('files', 'Error deleting file "{fileName}".', {fileName: file}),
+ {timeout: 10}
+ );
+ var deleteAction = self.findFileEl(file).find('.action.delete');
+ deleteAction.removeClass('icon-loading-small').addClass('icon-delete');
+ self.showFileBusyState(files, false);
}
});
+ });
},
/**
* Creates the file summary section
@@ -2659,8 +2765,8 @@
* Compares two file infos by name, making directories appear
* first.
*
- * @param {OCA.Files.FileInfo} fileInfo1 file info
- * @param {OCA.Files.FileInfo} fileInfo2 file info
+ * @param {OC.Files.FileInfo} fileInfo1 file info
+ * @param {OC.Files.FileInfo} fileInfo2 file info
* @return {int} -1 if the first file must appear before the second one,
* 0 if they are identify, 1 otherwise.
*/
@@ -2676,8 +2782,8 @@
/**
* Compares two file infos by size.
*
- * @param {OCA.Files.FileInfo} fileInfo1 file info
- * @param {OCA.Files.FileInfo} fileInfo2 file info
+ * @param {OC.Files.FileInfo} fileInfo1 file info
+ * @param {OC.Files.FileInfo} fileInfo2 file info
* @return {int} -1 if the first file must appear before the second one,
* 0 if they are identify, 1 otherwise.
*/
@@ -2687,8 +2793,8 @@
/**
* Compares two file infos by timestamp.
*
- * @param {OCA.Files.FileInfo} fileInfo1 file info
- * @param {OCA.Files.FileInfo} fileInfo2 file info
+ * @param {OC.Files.FileInfo} fileInfo1 file info
+ * @param {OC.Files.FileInfo} fileInfo2 file info
* @return {int} -1 if the first file must appear before the second one,
* 0 if they are identify, 1 otherwise.
*/
@@ -2700,23 +2806,14 @@
/**
* File info attributes.
*
- * @todo make this a real class in the future
- * @typedef {Object} OCA.Files.FileInfo
+ * @typedef {Object} OC.Files.FileInfo
+ *
+ * @lends OC.Files.FileInfo
+ *
+ * @deprecated use OC.Files.FileInfo instead
*
- * @property {int} id file id
- * @property {String} name file name
- * @property {String} [path] file path, defaults to the list's current path
- * @property {String} mimetype mime type
- * @property {String} type "file" for files or "dir" for directories
- * @property {int} permissions file permissions
- * @property {int} mtime modification time in milliseconds
- * @property {boolean} [isShareMountPoint] whether the file is a share mount
- * point
- * @property {boolean} [isPreviewAvailable] whether a preview is available
- * for the given file type
- * @property {String} [icon] path to the mime type icon
- * @property {String} etag etag of the file
*/
+ OCA.Files.FileInfo = OC.Files.FileInfo;
OCA.Files.FileList = FileList;
})();
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index ae38511ec05..e33b8354437 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -136,13 +136,27 @@
/**
* Returns the download URL of the given file(s)
- * @param filename string or array of file names to download
- * @param dir optional directory in which the file name is, defaults to the current directory
+ * @param {string} filename string or array of file names to download
+ * @param {string} [dir] optional directory in which the file name is, defaults to the current directory
+ * @param {bool} [isDir=false] whether the given filename is a directory and might need a special URL
*/
- getDownloadUrl: function(filename, dir) {
- if ($.isArray(filename)) {
+ getDownloadUrl: function(filename, dir, isDir) {
+ if (!_.isArray(filename) && !isDir) {
+ var pathSections = dir.split('/');
+ pathSections.push(filename);
+ var encodedPath = '';
+ _.each(pathSections, function(section) {
+ if (section !== '') {
+ encodedPath += '/' + encodeURIComponent(section);
+ }
+ });
+ return OC.linkToRemoteBase('webdav') + encodedPath;
+ }
+
+ if (_.isArray(filename)) {
filename = JSON.stringify(filename);
}
+
var params = {
dir: dir,
files: filename
@@ -193,7 +207,7 @@
*/
lazyLoadPreview : function(path, mime, ready, width, height, etag) {
console.warn('DEPRECATED: please use lazyLoadPreview() from an OCA.Files.FileList instance');
- return OCA.Files.App.fileList.lazyLoadPreview({
+ return FileList.lazyLoadPreview({
path: path,
mime: mime,
callback: ready,
@@ -356,8 +370,10 @@ scanFiles.scanning=false;
// TODO: move to FileList
var createDragShadow = function(event) {
+ // FIXME: inject file list instance somehow
+ /* global FileList, Files */
+
//select dragged file
- var FileList = OCA.Files.App.fileList;
var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked');
if (!isDragSelected) {
//select dragged file
@@ -394,7 +410,7 @@ var createDragShadow = function(event) {
.css('background-image', 'url(' + OC.imagePath('core', 'filetypes/folder.png') + ')');
} else {
var path = dir + '/' + elem.name;
- OCA.Files.App.files.lazyLoadPreview(path, elem.mime, function(previewpath) {
+ Files.lazyLoadPreview(path, elem.mimetype, function(previewpath) {
newtr.find('td.filename')
.css('background-image', 'url(' + previewpath + ')');
}, null, null, elem.etag);
@@ -441,7 +457,7 @@ var folderDropOptions = {
hoverClass: "canDrop",
drop: function( event, ui ) {
// don't allow moving a file into a selected folder
- var FileList = OCA.Files.App.fileList;
+ /* global FileList */
if ($(event.target).parents('tr').find('td input:first').prop('checked') === true) {
return false;
}
diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js
index 175eb1d1a75..be7dcc40b6e 100644
--- a/apps/files/js/newfilemenu.js
+++ b/apps/files/js/newfilemenu.js
@@ -44,6 +44,11 @@
'click .menuitem': '_onClickAction'
},
+ /**
+ * @type OCA.Files.FileList
+ */
+ fileList: null,
+
initialize: function(options) {
var self = this;
var $uploadEl = $('#file_upload_start');
@@ -55,25 +60,16 @@
console.warn('Missing upload element "file_upload_start"');
}
- this._fileList = options && options.fileList;
+ this.fileList = options && options.fileList;
this._menuItems = [{
- id: 'file',
- displayName: t('files', 'Text file'),
- templateName: t('files', 'New text file.txt'),
- iconClass: 'icon-filetype-text',
- fileType: 'file',
- actionHandler: function(name) {
- self._fileList.createFile(name);
- }
- }, {
id: 'folder',
displayName: t('files', 'Folder'),
templateName: t('files', 'New folder'),
iconClass: 'icon-folder',
fileType: 'folder',
actionHandler: function(name) {
- self._fileList.createDirectory(name);
+ self.fileList.createDirectory(name);
}
}];
@@ -149,7 +145,7 @@
try {
if (!Files.isFileNameValid(filename)) {
// Files.isFileNameValid(filename) throws an exception itself
- } else if (self._fileList.inList(filename)) {
+ } else if (self.fileList.inList(filename)) {
throw t('files', '{newname} already exists', {newname: filename});
} else {
return true;
diff --git a/apps/files/js/tagsplugin.js b/apps/files/js/tagsplugin.js
index 23945d52603..81b22e34cc2 100644
--- a/apps/files/js/tagsplugin.js
+++ b/apps/files/js/tagsplugin.js
@@ -161,6 +161,38 @@
fileInfo.tags = tags;
return fileInfo;
};
+
+ var NS_OC = 'http://owncloud.org/ns';
+
+ var oldGetWebdavProperties = fileList._getWebdavProperties;
+ fileList._getWebdavProperties = function() {
+ var props = oldGetWebdavProperties.apply(this, arguments);
+ props.push('{' + NS_OC + '}tags');
+ props.push('{' + NS_OC + '}favorite');
+ return props;
+ };
+
+ fileList.filesClient.addFileInfoParser(function(response) {
+ var data = {};
+ var props = response.propStat[0].properties;
+ var tags = props['{' + NS_OC + '}tags'];
+ var favorite = props['{' + NS_OC + '}favorite'];
+ if (tags && tags.length) {
+ tags = _.chain(tags).filter(function(xmlvalue) {
+ return (xmlvalue.namespaceURI === NS_OC && xmlvalue.nodeName.split(':')[1] === 'tag');
+ }).map(function(xmlvalue) {
+ return xmlvalue.textContent || xmlvalue.text;
+ }).value();
+ }
+ if (tags) {
+ data.tags = tags;
+ }
+ if (favorite && parseInt(favorite, 10) !== 0) {
+ data.tags = data.tags || [];
+ data.tags.push(OC.TAG_FAVORITE);
+ }
+ return data;
+ });
},
attach: function(fileList) {
diff --git a/apps/files/l10n/af_ZA.js b/apps/files/l10n/af_ZA.js
index 2061e5ec49c..ddc06b6c11f 100644
--- a/apps/files/l10n/af_ZA.js
+++ b/apps/files/l10n/af_ZA.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"files",
{
- "Error" : "Fout",
"Folder" : "Omslag",
"Settings" : "Instellings"
},
diff --git a/apps/files/l10n/af_ZA.json b/apps/files/l10n/af_ZA.json
index 95096fd551b..bad49a673e0 100644
--- a/apps/files/l10n/af_ZA.json
+++ b/apps/files/l10n/af_ZA.json
@@ -1,5 +1,4 @@
{ "translations": {
- "Error" : "Fout",
"Folder" : "Omslag",
"Settings" : "Instellings"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index 0e20f237022..953267393b2 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "وحدة التخزين غير متوفرة ",
"Storage invalid" : "وحدة تخزين غير صالحه ",
"Unknown error" : "خطأ غير معروف. ",
- "Could not move %s - File with this name already exists" : "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم",
- "Could not move %s" : "فشل في نقل %s",
- "Permission denied" : "تم رفض الاذن ",
- "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 . فضلا اختر اسم مختلف .",
- "Error when creating the file" : "خطأ اثناء انشاء الملف ",
- "Error when creating the folder" : "خطأ اثناء انشاء المجلد ",
"Unable to set upload directory." : "غير قادر على تحميل المجلد",
"Invalid Token" : "علامة غير صالحة",
"No file was uploaded. Unknown error" : "لم يتم رفع أي ملف , خطأ غير معروف",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "المجلد المؤقت غير موجود",
"Failed to write to disk" : "خطأ في الكتابة على القرص الصلب",
"Not enough storage available" : "لا يوجد مساحة تخزينية كافية",
+ "The target folder has been moved or deleted." : "المجلد المطلوب قد تم نقله او حذفه ",
"Upload failed. Could not find uploaded file" : "*فشلت علمية الرفع. تعذر إيجاد الملف الذي تم رفعه.\n*فشلت علمية التحميل. تعذر إيجاد الملف الذي تم تحميله.",
"Upload failed. Could not get file info." : "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.",
"Invalid directory." : "مسار غير صحيح.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "المفضلة ",
"Home" : "البيت",
"Close" : "إغلاق",
+ "Upload cancelled." : "تم إلغاء عملية رفع الملفات .",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
"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." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.",
"Actions" : "* تطبيقات.\n* أنشطة.",
@@ -45,14 +39,6 @@ OC.L10N.register(
"Pending" : "قيد الانتظار",
"Unable to determine date" : "تعذر تحديد التاريخ",
"This operation is forbidden" : "هذة العملية ممنوعة ",
- "Error moving file." : "خطأ اثناء نقل الملف ",
- "Error moving file" : "حدث خطأ أثناء نقل الملف",
- "Error" : "خطأ",
- "{new_name} already exists" : "{new_name} موجود مسبقا",
- "Could not rename file" : "لا يستطيع اعادة تسمية الملف",
- "Could not create file" : "لا يستطيع انشاء ملف ",
- "Could not create folder" : "لا يستطيع انشاء مجلد ",
- "Error deleting file." : "خطأ اثناء حذف الملف ",
"No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'",
"Name" : "اسم",
"Size" : "حجم",
@@ -70,12 +56,10 @@ OC.L10N.register(
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "المساحة التخزينية لـ {owner} ممتلئة تقريبا ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "مساحتك التخزينية امتلأت تقريبا ",
"Favorite" : "المفضلة",
- "{newname} already exists" : "{newname} موجود مسبقاً",
- "Upload" : "رفع",
- "Text file" : "ملف نصي",
- "New text file.txt" : "ملف نصي جديد fille.txt",
"Folder" : "مجلد",
"New folder" : "مجلد جديد",
+ "{newname} already exists" : "{newname} موجود مسبقاً",
+ "Upload" : "رفع",
"An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags",
"A new file or folder has been <strong>created</strong>" : "تم <strong> إنشاء</strong> ملف جديد أو مجلد ",
"A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد",
@@ -90,15 +74,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s حذف %1$s",
"You restored %1$s" : "لقد قمت باستعادة %1$s",
"%2$s restored %1$s" : "%2$s مستعاد %1$s",
- "%s could not be renamed as it has been deleted" : "%s لا يمكن اعادة تسميته فقد تم حذفه ",
- "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ",
"Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
"File handling" : "التعامل مع الملف",
"Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها",
"max. possible: " : "الحد الأقصى المسموح به",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "بستخدام PHP-FPM هذه القيمة سوف تحتاج الي 5 دقائق حتي تُتِم عملها بعد الحفظ ",
"Save" : "حفظ",
- "Can not be edited from here due to insufficient permissions." : "لا يمكن التعديل من هنا نظرا لعدم توفر الصلاحيات الكافيه ",
"Settings" : "إعدادات",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>",
@@ -112,6 +92,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .",
"Currently scanning" : "حالياً يقوم بالفحص",
"No favorites" : "لا يوجد مفضلات ",
- "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا "
+ "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
+ "Text file" : "ملف نصي",
+ "New text file.txt" : "ملف نصي جديد fille.txt"
},
"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/ar.json b/apps/files/l10n/ar.json
index e1b2eb3af1b..245fe9a0b9e 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -2,13 +2,6 @@
"Storage not available" : "وحدة التخزين غير متوفرة ",
"Storage invalid" : "وحدة تخزين غير صالحه ",
"Unknown error" : "خطأ غير معروف. ",
- "Could not move %s - File with this name already exists" : "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم",
- "Could not move %s" : "فشل في نقل %s",
- "Permission denied" : "تم رفض الاذن ",
- "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 . فضلا اختر اسم مختلف .",
- "Error when creating the file" : "خطأ اثناء انشاء الملف ",
- "Error when creating the folder" : "خطأ اثناء انشاء المجلد ",
"Unable to set upload directory." : "غير قادر على تحميل المجلد",
"Invalid Token" : "علامة غير صالحة",
"No file was uploaded. Unknown error" : "لم يتم رفع أي ملف , خطأ غير معروف",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "المجلد المؤقت غير موجود",
"Failed to write to disk" : "خطأ في الكتابة على القرص الصلب",
"Not enough storage available" : "لا يوجد مساحة تخزينية كافية",
+ "The target folder has been moved or deleted." : "المجلد المطلوب قد تم نقله او حذفه ",
"Upload failed. Could not find uploaded file" : "*فشلت علمية الرفع. تعذر إيجاد الملف الذي تم رفعه.\n*فشلت علمية التحميل. تعذر إيجاد الملف الذي تم تحميله.",
"Upload failed. Could not get file info." : "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.",
"Invalid directory." : "مسار غير صحيح.",
@@ -28,10 +22,10 @@
"Favorites" : "المفضلة ",
"Home" : "البيت",
"Close" : "إغلاق",
+ "Upload cancelled." : "تم إلغاء عملية رفع الملفات .",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
"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." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.",
"Actions" : "* تطبيقات.\n* أنشطة.",
@@ -43,14 +37,6 @@
"Pending" : "قيد الانتظار",
"Unable to determine date" : "تعذر تحديد التاريخ",
"This operation is forbidden" : "هذة العملية ممنوعة ",
- "Error moving file." : "خطأ اثناء نقل الملف ",
- "Error moving file" : "حدث خطأ أثناء نقل الملف",
- "Error" : "خطأ",
- "{new_name} already exists" : "{new_name} موجود مسبقا",
- "Could not rename file" : "لا يستطيع اعادة تسمية الملف",
- "Could not create file" : "لا يستطيع انشاء ملف ",
- "Could not create folder" : "لا يستطيع انشاء مجلد ",
- "Error deleting file." : "خطأ اثناء حذف الملف ",
"No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'",
"Name" : "اسم",
"Size" : "حجم",
@@ -68,12 +54,10 @@
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "المساحة التخزينية لـ {owner} ممتلئة تقريبا ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "مساحتك التخزينية امتلأت تقريبا ",
"Favorite" : "المفضلة",
- "{newname} already exists" : "{newname} موجود مسبقاً",
- "Upload" : "رفع",
- "Text file" : "ملف نصي",
- "New text file.txt" : "ملف نصي جديد fille.txt",
"Folder" : "مجلد",
"New folder" : "مجلد جديد",
+ "{newname} already exists" : "{newname} موجود مسبقاً",
+ "Upload" : "رفع",
"An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags",
"A new file or folder has been <strong>created</strong>" : "تم <strong> إنشاء</strong> ملف جديد أو مجلد ",
"A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد",
@@ -88,15 +72,11 @@
"%2$s deleted %1$s" : "%2$s حذف %1$s",
"You restored %1$s" : "لقد قمت باستعادة %1$s",
"%2$s restored %1$s" : "%2$s مستعاد %1$s",
- "%s could not be renamed as it has been deleted" : "%s لا يمكن اعادة تسميته فقد تم حذفه ",
- "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ",
"Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
"File handling" : "التعامل مع الملف",
"Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها",
"max. possible: " : "الحد الأقصى المسموح به",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "بستخدام PHP-FPM هذه القيمة سوف تحتاج الي 5 دقائق حتي تُتِم عملها بعد الحفظ ",
"Save" : "حفظ",
- "Can not be edited from here due to insufficient permissions." : "لا يمكن التعديل من هنا نظرا لعدم توفر الصلاحيات الكافيه ",
"Settings" : "إعدادات",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>",
@@ -110,6 +90,8 @@
"Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .",
"Currently scanning" : "حالياً يقوم بالفحص",
"No favorites" : "لا يوجد مفضلات ",
- "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا "
+ "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
+ "Text file" : "ملف نصي",
+ "New text file.txt" : "ملف نصي جديد fille.txt"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js
index 926587837dd..8fc63c1ac35 100644
--- a/apps/files/l10n/ast.js
+++ b/apps/files/l10n/ast.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Almacenamientu non disponible",
"Storage invalid" : "Almacenamientu inválidu",
"Unknown error" : "Fallu desconocíu",
- "Could not move %s - File with this name already exists" : "Nun pudo movese %s - Yá existe un ficheru con esi nome.",
- "Could not move %s" : "Nun pudo movese %s",
- "Permission denied" : "Permisu denegáu",
- "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.",
- "The name %s is already used in the folder %s. Please choose a different name." : "El nome %s yá ta n'usu na carpeta %s. Por favor, escueyi un nome diferente.",
- "Error when creating the file" : "Fallu cuando se creaba'l ficheru",
- "Error when creating the folder" : "Fallu cuando se creaba la carpeta",
"Unable to set upload directory." : "Nun pue afitase la carpeta de xubida.",
"Invalid Token" : "Token inválidu",
"No file was uploaded. Unknown error" : "Nun se xubió dengún ficheru. Fallu desconocíu",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Falta una carpeta temporal",
"Failed to write to disk" : "Fallu al escribir al discu",
"Not enough storage available" : "Nun hai abondu espaciu disponible",
+ "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.",
"Upload failed. Could not find uploaded file" : "Xubida fallida. Nun pudo atopase'l ficheru xubíu.",
"Upload failed. Could not get file info." : "Falló la xubida. Nun se pudo obtener la información del ficheru.",
"Invalid directory." : "Direutoriu non válidu.",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Imposible determinar la fecha",
"This operation is forbidden" : "La operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
- "Error moving file." : "Fallu moviendo'l ficheru.",
- "Error moving file" : "Fallu moviendo'l ficheru",
- "Error" : "Fallu",
- "{new_name} already exists" : "{new_name} yá existe",
- "Could not rename file" : "Nun pudo renomase'l ficheru",
- "Could not create file" : "Nun pudo crease'l ficheru",
- "Could not create folder" : "Nun pudo crease la carpeta",
- "Error deleting file." : "Fallu desaniciando'l ficheru.",
"No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'",
"Name" : "Nome",
"Size" : "Tamañu",
@@ -75,8 +61,6 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
"Favorited" : "Favoritos",
"Favorite" : "Favoritu",
- "Text file" : "Ficheru de testu",
- "New text file.txt" : "Nuevu testu ficheru.txt",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
"{newname} already exists" : "{newname} yá existe",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Modificáu por %2$s",
"Deleted by %2$s" : "Desaniciáu por %2$s",
"Restored by %2$s" : "Recuperáu por %2$s",
- "%s could not be renamed as it has been deleted" : "%s nun pue renomase dempués de desaniciase",
- "%s could not be renamed" : "Nun se puede renomar %s ",
"Upload (max. %s)" : "Xuba (máx. %s)",
"File handling" : "Alministración de ficheros",
"Maximum upload size" : "Tamañu máximu de xubida",
"max. possible: " : "máx. posible:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM esti valor pue retrasase 5 minutos pa tener efeutu dempués de salvar.",
"Save" : "Guardar",
- "Can not be edited from here due to insufficient permissions." : "Nun pue editáse dende equí por mor d'insuficientes permisos.",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.",
"Currently scanning" : "Anguaño escaneando",
"No favorites" : "Nengún favoritu",
- "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí"
+ "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí",
+ "Text file" : "Ficheru de testu",
+ "New text file.txt" : "Nuevu testu ficheru.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json
index 750ed1f959a..33c119771f7 100644
--- a/apps/files/l10n/ast.json
+++ b/apps/files/l10n/ast.json
@@ -2,13 +2,6 @@
"Storage not available" : "Almacenamientu non disponible",
"Storage invalid" : "Almacenamientu inválidu",
"Unknown error" : "Fallu desconocíu",
- "Could not move %s - File with this name already exists" : "Nun pudo movese %s - Yá existe un ficheru con esi nome.",
- "Could not move %s" : "Nun pudo movese %s",
- "Permission denied" : "Permisu denegáu",
- "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.",
- "The name %s is already used in the folder %s. Please choose a different name." : "El nome %s yá ta n'usu na carpeta %s. Por favor, escueyi un nome diferente.",
- "Error when creating the file" : "Fallu cuando se creaba'l ficheru",
- "Error when creating the folder" : "Fallu cuando se creaba la carpeta",
"Unable to set upload directory." : "Nun pue afitase la carpeta de xubida.",
"Invalid Token" : "Token inválidu",
"No file was uploaded. Unknown error" : "Nun se xubió dengún ficheru. Fallu desconocíu",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Falta una carpeta temporal",
"Failed to write to disk" : "Fallu al escribir al discu",
"Not enough storage available" : "Nun hai abondu espaciu disponible",
+ "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.",
"Upload failed. Could not find uploaded file" : "Xubida fallida. Nun pudo atopase'l ficheru xubíu.",
"Upload failed. Could not get file info." : "Falló la xubida. Nun se pudo obtener la información del ficheru.",
"Invalid directory." : "Direutoriu non válidu.",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Imposible determinar la fecha",
"This operation is forbidden" : "La operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
- "Error moving file." : "Fallu moviendo'l ficheru.",
- "Error moving file" : "Fallu moviendo'l ficheru",
- "Error" : "Fallu",
- "{new_name} already exists" : "{new_name} yá existe",
- "Could not rename file" : "Nun pudo renomase'l ficheru",
- "Could not create file" : "Nun pudo crease'l ficheru",
- "Could not create folder" : "Nun pudo crease la carpeta",
- "Error deleting file." : "Fallu desaniciando'l ficheru.",
"No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'",
"Name" : "Nome",
"Size" : "Tamañu",
@@ -73,8 +59,6 @@
"_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
"Favorited" : "Favoritos",
"Favorite" : "Favoritu",
- "Text file" : "Ficheru de testu",
- "New text file.txt" : "Nuevu testu ficheru.txt",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
"{newname} already exists" : "{newname} yá existe",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Modificáu por %2$s",
"Deleted by %2$s" : "Desaniciáu por %2$s",
"Restored by %2$s" : "Recuperáu por %2$s",
- "%s could not be renamed as it has been deleted" : "%s nun pue renomase dempués de desaniciase",
- "%s could not be renamed" : "Nun se puede renomar %s ",
"Upload (max. %s)" : "Xuba (máx. %s)",
"File handling" : "Alministración de ficheros",
"Maximum upload size" : "Tamañu máximu de xubida",
"max. possible: " : "máx. posible:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM esti valor pue retrasase 5 minutos pa tener efeutu dempués de salvar.",
"Save" : "Guardar",
- "Can not be edited from here due to insufficient permissions." : "Nun pue editáse dende equí por mor d'insuficientes permisos.",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.",
"Currently scanning" : "Anguaño escaneando",
"No favorites" : "Nengún favoritu",
- "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí"
+ "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí",
+ "Text file" : "Ficheru de testu",
+ "New text file.txt" : "Nuevu testu ficheru.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js
index b278fad62b1..cf7d81063ce 100644
--- a/apps/files/l10n/az.js
+++ b/apps/files/l10n/az.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "İnformasiya daşıyıcısı mövcud deyil",
"Storage invalid" : "İnformasiya daşıyıcısı yalnışdır",
"Unknown error" : "Bəlli olmayan səhv baş verdi",
- "Could not move %s - File with this name already exists" : "Köçürmə mümkün deyil %s - Bu adla fayl artıq mövcuddur",
- "Could not move %s" : "Yerdəyişmə mükün olmadı %s",
- "Permission denied" : "Yetki qadağandır",
- "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Bu ad %s artıq %s qovluğunda istifadə edilir. Xahiş olunur fərqli ad istifadə edəsiniz.",
- "Error when creating the file" : "Fayl yaratdıqda səhv baş vermişdir",
- "Error when creating the folder" : "Qovluğu yaratdıqda səhv baş vermişdir",
"Unable to set upload directory." : "Əlavələr qovluğunu təyin etmək mümkün olmadı.",
"Invalid Token" : "Yalnış token",
"No file was uploaded. Unknown error" : "Heç bir fayl uüklənilmədi. Naməlum səhv",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
"Failed to write to disk" : "Sərt diskə yazmaq mümkün olmadı",
"Not enough storage available" : "Tələb edilən qədər yer yoxdur.",
+ "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
"Upload failed. Could not find uploaded file" : "Yüklənmədə səhv oldu. Yüklənmiş faylı tapmaq olmur.",
"Upload failed. Could not get file info." : "Yüklənmədə səhv oldu. Faylın informasiyasını almaq mümkün olmadı.",
"Invalid directory." : "Yalnış qovluq.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Sevimlilər",
"Home" : "Ev",
"Close" : "Bağla",
+ "Upload cancelled." : "Yüklənmə dayandırıldı.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Yükləmək olmur {filename} ona görə ki, ya qovluqdur yada ki, həcmi 0 baytdır ",
"Total file size {size1} exceeds upload limit {size2}" : "Ümumi fayl həcmi {size1} yüklənmə limiti {size2} -ni aşır",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Kifayət qədər boş yer yoxdur, siz yükləyirsiniz {size1} ancaq {size2} var. ",
- "Upload cancelled." : "Yüklənmə dayandırıldı.",
"Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
"Actions" : "İşlər",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
"This operation is forbidden" : "Bu əməliyyat qadağandır",
"This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
- "Error moving file." : "Faylın köçürülməsində səhv baş verdi.",
- "Error moving file" : "Faylın köçürülməsində səhv baş verdi",
- "Error" : "Səhv",
- "{new_name} already exists" : "{new_name} artıq mövcuddur",
- "Could not rename file" : "Faylın adını dəyişmək mümkün olmadı",
- "Could not create file" : "Faylı yaratmaq olmur",
- "Could not create folder" : "Qovluğu yaratmaq olmur",
- "Error deleting file." : "Faylın silinməsində səhv baş verdi.",
"No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı",
"Name" : "Ad",
"Size" : "Həcm",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"],
"Favorited" : "İstəkləndi",
"Favorite" : "İstəkli",
- "{newname} already exists" : "{newname} artıq mövcuddur",
- "Upload" : "Serverə yüklə",
- "Text file" : "Tekst faylı",
- "New text file.txt" : "Yeni mətn file.txt",
"Folder" : "Qovluq",
"New folder" : "Yeni qovluq",
+ "{newname} already exists" : "{newname} artıq mövcuddur",
+ "Upload" : "Serverə yüklə",
"An error occurred while trying to update the tags" : "Qeydlərin yenilənməsi müddətində səhv baş verdi ",
"A new file or folder has been <strong>created</strong>" : "Yeni fayl və ya direktoriya <strong>yaradılmışdır</strong>",
"A file or folder has been <strong>changed</strong>" : "Fayl və ya direktoriya <strong>dəyişdirilib</strong>",
@@ -96,15 +80,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s silindi %1$s",
"You restored %1$s" : "Siz qayıtdınız %1$s",
"%2$s restored %1$s" : "%2$s bərpa edildi %1$s",
- "%s could not be renamed as it has been deleted" : "%s adını dəyişə bilmərik ona görə ki, o silinib artıq",
- "%s could not be renamed" : "%s adını dəyişə bilməz",
"Upload (max. %s)" : "Yüklə (max. %s)",
"File handling" : "Fayl emalı",
"Maximum upload size" : "Maksimal yükləmə həcmi",
"max. possible: " : "maks. ola bilər: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ilə bu məna yadda saxladıldıqından 5 dəqiqə sonra işə düşə bilər. ",
"Save" : "Saxlamaq",
- "Can not be edited from here due to insufficient permissions." : "Yetki çatışmamazlığına görə, burdan başlayaraq dəyişiklik edə bilməzsiniz.",
"Settings" : "Quraşdırmalar",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bu ünvanı <a href=\"%s\" target=\"_blank\">WebDAV vasitəsilə fayllarınızı əldə etmək üçün</a> istifadə edə bilərsiniz. ",
@@ -118,6 +98,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.",
"Currently scanning" : "Hal-hazırda skan edilir",
"No favorites" : "Seçilmiş yoxdur",
- "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək"
+ "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək",
+ "Text file" : "Tekst faylı",
+ "New text file.txt" : "Yeni mətn file.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json
index 8603939790d..f2c45fda2f7 100644
--- a/apps/files/l10n/az.json
+++ b/apps/files/l10n/az.json
@@ -2,13 +2,6 @@
"Storage not available" : "İnformasiya daşıyıcısı mövcud deyil",
"Storage invalid" : "İnformasiya daşıyıcısı yalnışdır",
"Unknown error" : "Bəlli olmayan səhv baş verdi",
- "Could not move %s - File with this name already exists" : "Köçürmə mümkün deyil %s - Bu adla fayl artıq mövcuddur",
- "Could not move %s" : "Yerdəyişmə mükün olmadı %s",
- "Permission denied" : "Yetki qadağandır",
- "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Bu ad %s artıq %s qovluğunda istifadə edilir. Xahiş olunur fərqli ad istifadə edəsiniz.",
- "Error when creating the file" : "Fayl yaratdıqda səhv baş vermişdir",
- "Error when creating the folder" : "Qovluğu yaratdıqda səhv baş vermişdir",
"Unable to set upload directory." : "Əlavələr qovluğunu təyin etmək mümkün olmadı.",
"Invalid Token" : "Yalnış token",
"No file was uploaded. Unknown error" : "Heç bir fayl uüklənilmədi. Naməlum səhv",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
"Failed to write to disk" : "Sərt diskə yazmaq mümkün olmadı",
"Not enough storage available" : "Tələb edilən qədər yer yoxdur.",
+ "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
"Upload failed. Could not find uploaded file" : "Yüklənmədə səhv oldu. Yüklənmiş faylı tapmaq olmur.",
"Upload failed. Could not get file info." : "Yüklənmədə səhv oldu. Faylın informasiyasını almaq mümkün olmadı.",
"Invalid directory." : "Yalnış qovluq.",
@@ -28,10 +22,10 @@
"Favorites" : "Sevimlilər",
"Home" : "Ev",
"Close" : "Bağla",
+ "Upload cancelled." : "Yüklənmə dayandırıldı.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Yükləmək olmur {filename} ona görə ki, ya qovluqdur yada ki, həcmi 0 baytdır ",
"Total file size {size1} exceeds upload limit {size2}" : "Ümumi fayl həcmi {size1} yüklənmə limiti {size2} -ni aşır",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Kifayət qədər boş yer yoxdur, siz yükləyirsiniz {size1} ancaq {size2} var. ",
- "Upload cancelled." : "Yüklənmə dayandırıldı.",
"Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
"Actions" : "İşlər",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
"This operation is forbidden" : "Bu əməliyyat qadağandır",
"This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
- "Error moving file." : "Faylın köçürülməsində səhv baş verdi.",
- "Error moving file" : "Faylın köçürülməsində səhv baş verdi",
- "Error" : "Səhv",
- "{new_name} already exists" : "{new_name} artıq mövcuddur",
- "Could not rename file" : "Faylın adını dəyişmək mümkün olmadı",
- "Could not create file" : "Faylı yaratmaq olmur",
- "Could not create folder" : "Qovluğu yaratmaq olmur",
- "Error deleting file." : "Faylın silinməsində səhv baş verdi.",
"No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı",
"Name" : "Ad",
"Size" : "Həcm",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"],
"Favorited" : "İstəkləndi",
"Favorite" : "İstəkli",
- "{newname} already exists" : "{newname} artıq mövcuddur",
- "Upload" : "Serverə yüklə",
- "Text file" : "Tekst faylı",
- "New text file.txt" : "Yeni mətn file.txt",
"Folder" : "Qovluq",
"New folder" : "Yeni qovluq",
+ "{newname} already exists" : "{newname} artıq mövcuddur",
+ "Upload" : "Serverə yüklə",
"An error occurred while trying to update the tags" : "Qeydlərin yenilənməsi müddətində səhv baş verdi ",
"A new file or folder has been <strong>created</strong>" : "Yeni fayl və ya direktoriya <strong>yaradılmışdır</strong>",
"A file or folder has been <strong>changed</strong>" : "Fayl və ya direktoriya <strong>dəyişdirilib</strong>",
@@ -94,15 +78,11 @@
"%2$s deleted %1$s" : "%2$s silindi %1$s",
"You restored %1$s" : "Siz qayıtdınız %1$s",
"%2$s restored %1$s" : "%2$s bərpa edildi %1$s",
- "%s could not be renamed as it has been deleted" : "%s adını dəyişə bilmərik ona görə ki, o silinib artıq",
- "%s could not be renamed" : "%s adını dəyişə bilməz",
"Upload (max. %s)" : "Yüklə (max. %s)",
"File handling" : "Fayl emalı",
"Maximum upload size" : "Maksimal yükləmə həcmi",
"max. possible: " : "maks. ola bilər: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ilə bu məna yadda saxladıldıqından 5 dəqiqə sonra işə düşə bilər. ",
"Save" : "Saxlamaq",
- "Can not be edited from here due to insufficient permissions." : "Yetki çatışmamazlığına görə, burdan başlayaraq dəyişiklik edə bilməzsiniz.",
"Settings" : "Quraşdırmalar",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bu ünvanı <a href=\"%s\" target=\"_blank\">WebDAV vasitəsilə fayllarınızı əldə etmək üçün</a> istifadə edə bilərsiniz. ",
@@ -116,6 +96,8 @@
"Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.",
"Currently scanning" : "Hal-hazırda skan edilir",
"No favorites" : "Seçilmiş yoxdur",
- "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək"
+ "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək",
+ "Text file" : "Tekst faylı",
+ "New text file.txt" : "Yeni mətn file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/be.js b/apps/files/l10n/be.js
index 77e9a4d6071..55e94ac2477 100644
--- a/apps/files/l10n/be.js
+++ b/apps/files/l10n/be.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"files",
{
- "Error" : "Памылка",
"Settings" : "Налады"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files/l10n/be.json b/apps/files/l10n/be.json
index 27c2988b703..3f70a0783fe 100644
--- a/apps/files/l10n/be.json
+++ b/apps/files/l10n/be.json
@@ -1,5 +1,4 @@
{ "translations": {
- "Error" : "Памылка",
"Settings" : "Налады"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js
index 98e0e2bd4b9..b30f670e310 100644
--- a/apps/files/l10n/bg_BG.js
+++ b/apps/files/l10n/bg_BG.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Липсва дисковото устройство.",
"Storage invalid" : "Невалидно дисково устройство.",
"Unknown error" : "Непозната грешка.",
- "Could not move %s - File with this name already exists" : "Неуспешно преместване на %s - Файл със същото име вече съществува.",
- "Could not move %s" : "Неуспешно преместване на %s.",
- "Permission denied" : "Достъпът отказан",
- "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. Моля, избери друго име.",
- "Error when creating the file" : "Грешка при създаването на файлът.",
- "Error when creating the folder" : "Грешка при създаването на папката.",
"Unable to set upload directory." : "Неуспешно задаване на директория за качване.",
"Invalid Token" : "Невалиеден токен.",
"No file was uploaded. Unknown error" : "Неуспешно качвачване на файл. Непозната грешка.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Липсва временна папка.",
"Failed to write to disk" : "Възникна проблем при запис на диска.",
"Not enough storage available" : "Недостатъчно място.",
+ "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.",
"Upload failed. Could not find uploaded file" : "Неуспешно качване. Не бе открит качения файл.",
"Upload failed. Could not get file info." : "Неуспешно качване. Не се получи информация за файла.",
"Invalid directory." : "Невалидна директория.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Любими",
"Home" : "Домашен",
"Close" : "Затвори",
+ "Upload cancelled." : "Качването е прекъснато.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.",
"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." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.",
"Actions" : "Действия",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Избери",
"Pending" : "Чакащо",
"Unable to determine date" : "Неуспешно установяване на дата",
- "Error moving file." : "Грешка при местенето на файла.",
- "Error moving file" : "Грешка при преместването на файла.",
- "Error" : "Грешка",
- "{new_name} already exists" : "{new_name} вече съществува.",
- "Could not rename file" : "Неуспешно преименуване на файла.",
- "Could not create file" : "Несупешно създаване на файла.",
- "Could not create folder" : "Неуспешно създаване на папка.",
- "Error deleting file." : "Грешка при изтриването на файла.",
"No entries in this folder match '{filter}'" : "Нищо в тази папка не отговаря на '{filter}'",
"Name" : "Име",
"Size" : "Размер",
@@ -69,10 +55,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "],
"Favorited" : "Отбелязано в любими",
"Favorite" : "Любими",
- "Upload" : "Качване",
- "Text file" : "Текстов файл",
"Folder" : "Папка",
"New folder" : "Нова папка",
+ "Upload" : "Качване",
"An error occurred while trying to update the tags" : "Настъпи грешка при опита за промяна на бележките",
"A new file or folder has been <strong>created</strong>" : "Нов файл или папка беше <strong>създаден/а</strong>",
"A file or folder has been <strong>changed</strong>" : "Файл или папка беше <strong>променен/а</strong>",
@@ -87,14 +72,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s изтри %1$s.",
"You restored %1$s" : "Вие възстановихте %1$s",
"%2$s restored %1$s" : "%2$s възстанови %1$s",
- "%s could not be renamed as it has been deleted" : "%s не може да бъде преименуван, защото е вече изтрит",
- "%s could not be renamed" : "%s не може да бъде преименуван.",
"Upload (max. %s)" : "Качи (макс. %s)",
"File handling" : "Операция с файла",
"Maximum upload size" : "Максимален размер",
"max. possible: " : "максимално:",
"Save" : "Запис",
- "Can not be edited from here due to insufficient permissions." : "Не може да бъде редактиран от тук, поради липса на права",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Използвай този адрес, за да получиш <a href=\"%s\" target=\"_blank\">достъп до своите файлове чрез WebDAV</a>.",
@@ -108,6 +90,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.",
"Currently scanning" : "В момента се търси",
"No favorites" : "Няма любими",
- "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук"
+ "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук",
+ "Text file" : "Текстов файл"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json
index 48d6729232b..e676d27fcba 100644
--- a/apps/files/l10n/bg_BG.json
+++ b/apps/files/l10n/bg_BG.json
@@ -2,13 +2,6 @@
"Storage not available" : "Липсва дисковото устройство.",
"Storage invalid" : "Невалидно дисково устройство.",
"Unknown error" : "Непозната грешка.",
- "Could not move %s - File with this name already exists" : "Неуспешно преместване на %s - Файл със същото име вече съществува.",
- "Could not move %s" : "Неуспешно преместване на %s.",
- "Permission denied" : "Достъпът отказан",
- "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. Моля, избери друго име.",
- "Error when creating the file" : "Грешка при създаването на файлът.",
- "Error when creating the folder" : "Грешка при създаването на папката.",
"Unable to set upload directory." : "Неуспешно задаване на директория за качване.",
"Invalid Token" : "Невалиеден токен.",
"No file was uploaded. Unknown error" : "Неуспешно качвачване на файл. Непозната грешка.",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Липсва временна папка.",
"Failed to write to disk" : "Възникна проблем при запис на диска.",
"Not enough storage available" : "Недостатъчно място.",
+ "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.",
"Upload failed. Could not find uploaded file" : "Неуспешно качване. Не бе открит качения файл.",
"Upload failed. Could not get file info." : "Неуспешно качване. Не се получи информация за файла.",
"Invalid directory." : "Невалидна директория.",
@@ -28,10 +22,10 @@
"Favorites" : "Любими",
"Home" : "Домашен",
"Close" : "Затвори",
+ "Upload cancelled." : "Качването е прекъснато.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.",
"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." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.",
"Actions" : "Действия",
@@ -42,14 +36,6 @@
"Select" : "Избери",
"Pending" : "Чакащо",
"Unable to determine date" : "Неуспешно установяване на дата",
- "Error moving file." : "Грешка при местенето на файла.",
- "Error moving file" : "Грешка при преместването на файла.",
- "Error" : "Грешка",
- "{new_name} already exists" : "{new_name} вече съществува.",
- "Could not rename file" : "Неуспешно преименуване на файла.",
- "Could not create file" : "Несупешно създаване на файла.",
- "Could not create folder" : "Неуспешно създаване на папка.",
- "Error deleting file." : "Грешка при изтриването на файла.",
"No entries in this folder match '{filter}'" : "Нищо в тази папка не отговаря на '{filter}'",
"Name" : "Име",
"Size" : "Размер",
@@ -67,10 +53,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "],
"Favorited" : "Отбелязано в любими",
"Favorite" : "Любими",
- "Upload" : "Качване",
- "Text file" : "Текстов файл",
"Folder" : "Папка",
"New folder" : "Нова папка",
+ "Upload" : "Качване",
"An error occurred while trying to update the tags" : "Настъпи грешка при опита за промяна на бележките",
"A new file or folder has been <strong>created</strong>" : "Нов файл или папка беше <strong>създаден/а</strong>",
"A file or folder has been <strong>changed</strong>" : "Файл или папка беше <strong>променен/а</strong>",
@@ -85,14 +70,11 @@
"%2$s deleted %1$s" : "%2$s изтри %1$s.",
"You restored %1$s" : "Вие възстановихте %1$s",
"%2$s restored %1$s" : "%2$s възстанови %1$s",
- "%s could not be renamed as it has been deleted" : "%s не може да бъде преименуван, защото е вече изтрит",
- "%s could not be renamed" : "%s не може да бъде преименуван.",
"Upload (max. %s)" : "Качи (макс. %s)",
"File handling" : "Операция с файла",
"Maximum upload size" : "Максимален размер",
"max. possible: " : "максимално:",
"Save" : "Запис",
- "Can not be edited from here due to insufficient permissions." : "Не може да бъде редактиран от тук, поради липса на права",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Използвай този адрес, за да получиш <a href=\"%s\" target=\"_blank\">достъп до своите файлове чрез WebDAV</a>.",
@@ -106,6 +88,7 @@
"Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.",
"Currently scanning" : "В момента се търси",
"No favorites" : "Няма любими",
- "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук"
+ "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук",
+ "Text file" : "Текстов файл"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js
index bc8d7ce8d5c..b968a225da7 100644
--- a/apps/files/l10n/bn_BD.js
+++ b/apps/files/l10n/bn_BD.js
@@ -4,11 +4,6 @@ OC.L10N.register(
"Storage not available" : "সংরক্ষণের স্থান নেই",
"Storage invalid" : "সংরক্ষণাগার বৈধ নয়",
"Unknown error" : "অজানা জটিলতা",
- "Could not move %s - File with this name already exists" : "%s কে স্থানান্তর করা সম্ভব হলো না - এই নামের ফাইল বিদ্যমান",
- "Could not move %s" : "%s কে স্থানান্তর করা সম্ভব হলো না",
- "Permission denied" : "অনুমতি দেয়া হয়নি",
- "Error when creating the file" : "ফাইলটি তৈরী করতে যেয়ে সমস্যা হলো",
- "Error when creating the folder" : "ফোল্ডার তৈরী করতে যেয়ে সমস্যা হলো",
"Unable to set upload directory." : "েআপলোড ডিরেক্টরি নির্ধারণ করা গেলনা।",
"No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।",
"There is no error, the file uploaded with success" : "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।",
@@ -33,11 +28,6 @@ OC.L10N.register(
"Delete" : "মুছে",
"Details" : "বিস্তারিত",
"Pending" : "মুলতুবি",
- "Error moving file." : "ফাইল সরাতে সমস্যা হলো।",
- "Error moving file" : "ফাইল সরাতে সমস্যা হলো",
- "Error" : "সমস্যা",
- "{new_name} already exists" : "{new_name} টি বিদ্যমান",
- "Could not rename file" : "ফাইলের পূণঃনামকরণ করা গেলনা",
"Name" : "রাম",
"Size" : "আকার",
"Modified" : "পরিবর্তিত",
@@ -47,10 +37,9 @@ OC.L10N.register(
"File name cannot be empty." : "ফাইলের নামটি ফাঁকা রাখা যাবে না।",
"Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ",
"Favorite" : "প্রিয়জন",
- "Upload" : "আপলোড",
- "Text file" : "টেক্সট ফাইল",
"Folder" : "ফোল্ডার",
"New folder" : "নব ফােলডার",
+ "Upload" : "আপলোড",
"A new file or folder has been <strong>created</strong>" : "একটি ফাইল বা ফোলডার <strong>তৈরি</strong> করা হয়েছে",
"A file or folder has been <strong>changed</strong>" : "একটি ফাইল বা ফোলডার <strong>পরিবরতন</strong> করা হয়েছে",
"A file or folder has been <strong>deleted</strong>" : "একটি ফাইল বা ফোলডার <strong>মোছা</strong> হয়েছে",
@@ -70,6 +59,7 @@ OC.L10N.register(
"Cancel upload" : "আপলোড বাতিল কর",
"Upload too large" : "আপলোডের আকারটি অনেক বড়",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
- "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।"
+ "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।",
+ "Text file" : "টেক্সট ফাইল"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json
index 43ebbc8ad96..bed559330ad 100644
--- a/apps/files/l10n/bn_BD.json
+++ b/apps/files/l10n/bn_BD.json
@@ -2,11 +2,6 @@
"Storage not available" : "সংরক্ষণের স্থান নেই",
"Storage invalid" : "সংরক্ষণাগার বৈধ নয়",
"Unknown error" : "অজানা জটিলতা",
- "Could not move %s - File with this name already exists" : "%s কে স্থানান্তর করা সম্ভব হলো না - এই নামের ফাইল বিদ্যমান",
- "Could not move %s" : "%s কে স্থানান্তর করা সম্ভব হলো না",
- "Permission denied" : "অনুমতি দেয়া হয়নি",
- "Error when creating the file" : "ফাইলটি তৈরী করতে যেয়ে সমস্যা হলো",
- "Error when creating the folder" : "ফোল্ডার তৈরী করতে যেয়ে সমস্যা হলো",
"Unable to set upload directory." : "েআপলোড ডিরেক্টরি নির্ধারণ করা গেলনা।",
"No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।",
"There is no error, the file uploaded with success" : "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।",
@@ -31,11 +26,6 @@
"Delete" : "মুছে",
"Details" : "বিস্তারিত",
"Pending" : "মুলতুবি",
- "Error moving file." : "ফাইল সরাতে সমস্যা হলো।",
- "Error moving file" : "ফাইল সরাতে সমস্যা হলো",
- "Error" : "সমস্যা",
- "{new_name} already exists" : "{new_name} টি বিদ্যমান",
- "Could not rename file" : "ফাইলের পূণঃনামকরণ করা গেলনা",
"Name" : "রাম",
"Size" : "আকার",
"Modified" : "পরিবর্তিত",
@@ -45,10 +35,9 @@
"File name cannot be empty." : "ফাইলের নামটি ফাঁকা রাখা যাবে না।",
"Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ",
"Favorite" : "প্রিয়জন",
- "Upload" : "আপলোড",
- "Text file" : "টেক্সট ফাইল",
"Folder" : "ফোল্ডার",
"New folder" : "নব ফােলডার",
+ "Upload" : "আপলোড",
"A new file or folder has been <strong>created</strong>" : "একটি ফাইল বা ফোলডার <strong>তৈরি</strong> করা হয়েছে",
"A file or folder has been <strong>changed</strong>" : "একটি ফাইল বা ফোলডার <strong>পরিবরতন</strong> করা হয়েছে",
"A file or folder has been <strong>deleted</strong>" : "একটি ফাইল বা ফোলডার <strong>মোছা</strong> হয়েছে",
@@ -68,6 +57,7 @@
"Cancel upload" : "আপলোড বাতিল কর",
"Upload too large" : "আপলোডের আকারটি অনেক বড়",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
- "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।"
+ "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।",
+ "Text file" : "টেক্সট ফাইল"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/bn_IN.js b/apps/files/l10n/bn_IN.js
index d7f61133133..e69597d35ca 100644
--- a/apps/files/l10n/bn_IN.js
+++ b/apps/files/l10n/bn_IN.js
@@ -1,8 +1,6 @@
OC.L10N.register(
"files",
{
- "Could not move %s - File with this name already exists" : "%s সরানো যায়নি-এই নামে আগে থেকেই ফাইল আছে",
- "Could not move %s" : "%s সরানো যায়নি",
"No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি।অজানা ত্রুটি",
"There is no error, the file uploaded with success" : "কোন ত্রুটি নেই,ফাইল সাফল্যের সঙ্গে আপলোড করা হয়েছে",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "আপলোড করা ফাইল-php.ini মধ্যে upload_max_filesize নির্দেশ অতিক্রম করে:",
@@ -19,7 +17,6 @@ OC.L10N.register(
"Rename" : "পুনঃনামকরণ",
"Delete" : "মুছে ফেলা",
"Pending" : "মুলতুবি",
- "Error" : "ভুল",
"Name" : "নাম",
"Size" : "আকার",
"Folder" : "ফোল্ডার",
diff --git a/apps/files/l10n/bn_IN.json b/apps/files/l10n/bn_IN.json
index f2d5d9fbf74..20c8c2e795e 100644
--- a/apps/files/l10n/bn_IN.json
+++ b/apps/files/l10n/bn_IN.json
@@ -1,6 +1,4 @@
{ "translations": {
- "Could not move %s - File with this name already exists" : "%s সরানো যায়নি-এই নামে আগে থেকেই ফাইল আছে",
- "Could not move %s" : "%s সরানো যায়নি",
"No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি।অজানা ত্রুটি",
"There is no error, the file uploaded with success" : "কোন ত্রুটি নেই,ফাইল সাফল্যের সঙ্গে আপলোড করা হয়েছে",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "আপলোড করা ফাইল-php.ini মধ্যে upload_max_filesize নির্দেশ অতিক্রম করে:",
@@ -17,7 +15,6 @@
"Rename" : "পুনঃনামকরণ",
"Delete" : "মুছে ফেলা",
"Pending" : "মুলতুবি",
- "Error" : "ভুল",
"Name" : "নাম",
"Size" : "আকার",
"Folder" : "ফোল্ডার",
diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js
index 6ca6ebe90c5..9da51ece871 100644
--- a/apps/files/l10n/bs.js
+++ b/apps/files/l10n/bs.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Pohrana je nedostupna",
"Storage invalid" : "Pohrana je neispravna",
"Unknown error" : "Nepoznata greška",
- "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji",
- "Could not move %s" : "Nemoguće premjestiti %s",
- "Permission denied" : "Nemate ovlaštenje",
- "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u direktoriju %s. Molim odaberite drugi naziv.",
- "Error when creating the file" : "Greška pri kreiranju datoteke",
- "Error when creating the folder" : "Greška pri kreiranju direktorija",
"Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.",
"Invalid Token" : "Neispravan Znak",
"No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Nedostaje privremeni direktorij.",
"Failed to write to disk" : "Zapisivanje na disk nije uspjelo.",
"Not enough storage available" : "Prostor za pohranu je nedovoljan",
+ "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.",
"Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka",
"Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.",
"Invalid directory." : "Neispravan direktorij.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoriti",
"Home" : "Kuća",
"Close" : "Zatvori",
+ "Upload cancelled." : "Učitavanje je prekinuto.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta",
"Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo",
- "Upload cancelled." : "Učitavanje je prekinuto.",
"Could not get result from server." : "Nemoguće dobiti rezultat od servera.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
@@ -43,14 +37,6 @@ OC.L10N.register(
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemoguće odrediti datum",
- "Error moving file." : "Greška pri premještanju datoteke",
- "Error moving file" : "Greška pri premještanju datoteke",
- "Error" : "Greška",
- "{new_name} already exists" : "{new_name} već postoji",
- "Could not rename file" : "Nemoguće preimenovati datoteku",
- "Could not create file" : "Datoteku nije moguće kreirati",
- "Could not create folder" : "Direktorij nije moguće kreirati",
- "Error deleting file." : "Greška pri brisanju datoteke",
"Name" : "Ime",
"Size" : "Veličina",
"Modified" : "Izmijenjeno",
@@ -66,12 +52,9 @@ OC.L10N.register(
"Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)",
"Favorited" : "Favorizovano",
"Favorite" : "Favorit",
- "Upload" : "Učitaj",
- "Text file" : "Tekstualna datoteka",
"Folder" : "Direktorij",
"New folder" : "Novi direktorij",
- "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan",
- "%s could not be renamed" : "%s nije moguće preimenovati",
+ "Upload" : "Učitaj",
"Upload (max. %s)" : "Učitaj (max. %s)",
"File handling" : "Obrada datoteke",
"Maximum upload size" : "Maksimalna veličina učitavanja",
@@ -88,6 +71,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.",
"Currently scanning" : "Provjera u toku",
"No favorites" : "Nema favorita",
- "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje"
+ "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje",
+ "Text file" : "Tekstualna datoteka"
},
"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/bs.json b/apps/files/l10n/bs.json
index 553662622f2..095fe47048d 100644
--- a/apps/files/l10n/bs.json
+++ b/apps/files/l10n/bs.json
@@ -2,13 +2,6 @@
"Storage not available" : "Pohrana je nedostupna",
"Storage invalid" : "Pohrana je neispravna",
"Unknown error" : "Nepoznata greška",
- "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji",
- "Could not move %s" : "Nemoguće premjestiti %s",
- "Permission denied" : "Nemate ovlaštenje",
- "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u direktoriju %s. Molim odaberite drugi naziv.",
- "Error when creating the file" : "Greška pri kreiranju datoteke",
- "Error when creating the folder" : "Greška pri kreiranju direktorija",
"Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.",
"Invalid Token" : "Neispravan Znak",
"No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Nedostaje privremeni direktorij.",
"Failed to write to disk" : "Zapisivanje na disk nije uspjelo.",
"Not enough storage available" : "Prostor za pohranu je nedovoljan",
+ "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.",
"Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka",
"Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.",
"Invalid directory." : "Neispravan direktorij.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoriti",
"Home" : "Kuća",
"Close" : "Zatvori",
+ "Upload cancelled." : "Učitavanje je prekinuto.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta",
"Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo",
- "Upload cancelled." : "Učitavanje je prekinuto.",
"Could not get result from server." : "Nemoguće dobiti rezultat od servera.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
@@ -41,14 +35,6 @@
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemoguće odrediti datum",
- "Error moving file." : "Greška pri premještanju datoteke",
- "Error moving file" : "Greška pri premještanju datoteke",
- "Error" : "Greška",
- "{new_name} already exists" : "{new_name} već postoji",
- "Could not rename file" : "Nemoguće preimenovati datoteku",
- "Could not create file" : "Datoteku nije moguće kreirati",
- "Could not create folder" : "Direktorij nije moguće kreirati",
- "Error deleting file." : "Greška pri brisanju datoteke",
"Name" : "Ime",
"Size" : "Veličina",
"Modified" : "Izmijenjeno",
@@ -64,12 +50,9 @@
"Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)",
"Favorited" : "Favorizovano",
"Favorite" : "Favorit",
- "Upload" : "Učitaj",
- "Text file" : "Tekstualna datoteka",
"Folder" : "Direktorij",
"New folder" : "Novi direktorij",
- "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan",
- "%s could not be renamed" : "%s nije moguće preimenovati",
+ "Upload" : "Učitaj",
"Upload (max. %s)" : "Učitaj (max. %s)",
"File handling" : "Obrada datoteke",
"Maximum upload size" : "Maksimalna veličina učitavanja",
@@ -86,6 +69,7 @@
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.",
"Currently scanning" : "Provjera u toku",
"No favorites" : "Nema favorita",
- "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje"
+ "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje",
+ "Text file" : "Tekstualna datoteka"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js
index b5cd0beedfe..88ad7224161 100644
--- a/apps/files/l10n/ca.js
+++ b/apps/files/l10n/ca.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Emmagatzemament no disponible",
"Storage invalid" : "Emmagatzemament no vàlid",
"Unknown error" : "Error desconegut",
- "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",
- "Permission denied" : "Permís denegat",
- "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.",
- "Error when creating the file" : "S'ha produït un error en crear el fitxer",
- "Error when creating the folder" : "S'ha produït un error en crear la carpeta",
"Unable to set upload directory." : "No es pot establir la carpeta de pujada.",
"Invalid Token" : "Testimoni no vàlid",
"No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Preferits",
"Home" : "Casa",
"Close" : "Tanca",
+ "Upload cancelled." : "La pujada s'ha cancel·lat.",
"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",
"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à.",
"Actions" : "Accions",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Selecciona",
"Pending" : "Pendent",
"Unable to determine date" : "No s'ha pogut determinar la data",
- "Error moving file." : "Error en moure el fitxer.",
- "Error moving file" : "Error en moure el fitxer",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ja existeix",
- "Could not rename file" : "No es pot canviar el nom de fitxer",
- "Could not create file" : "No s'ha pogut crear el fitxer",
- "Could not create folder" : "No s'ha pogut crear la carpeta",
- "Error deleting file." : "Error en esborrar el fitxer.",
"No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'",
"Name" : "Nom",
"Size" : "Mida",
@@ -71,10 +57,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["coincidències '{filter}'","coincidència '{filter}'"],
"Favorited" : "Agregat a favorits",
"Favorite" : "Preferits",
- "Upload" : "Puja",
- "Text file" : "Fitxer de text",
"Folder" : "Carpeta",
"New folder" : "Carpeta nova",
+ "Upload" : "Puja",
"An error occurred while trying to update the tags" : "S'ha produït un error en tractar d'actualitzar les etiquetes",
"A new file or folder has been <strong>created</strong>" : "S'ha <strong>creat</strong> un nou fitxer o una nova carpeta",
"A file or folder has been <strong>changed</strong>" : "S'ha <strong>canviat</strong> un fitxer o una carpeta",
@@ -90,14 +75,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s ha esborrat %1$s",
"You restored %1$s" : "Has restaurat %1$s",
"%2$s restored %1$s" : "%2$s ha restaurat %1$s",
- "%s could not be renamed as it has been deleted" : "No s'ha pogut renombrar %s ja que ha estat borrat",
- "%s could not be renamed" : "%s no es pot canviar el nom",
"Upload (max. %s)" : "Pujada (màx. %s)",
"File handling" : "Gestió de fitxers",
"Maximum upload size" : "Mida màxima de pujada",
"max. possible: " : "màxim possible:",
"Save" : "Desa",
- "Can not be edited from here due to insufficient permissions." : "No es pot editar des d'aquí per permisos insuficients.",
"Settings" : "Arranjament",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Useu aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir als fitxers via WebDAV</a>",
@@ -111,6 +93,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu",
"Currently scanning" : "Actualment escanejant",
"No favorites" : "No hi ha favorits",
- "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits"
+ "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits",
+ "Text file" : "Fitxer de text"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json
index 7558821627f..4eee482e835 100644
--- a/apps/files/l10n/ca.json
+++ b/apps/files/l10n/ca.json
@@ -2,13 +2,6 @@
"Storage not available" : "Emmagatzemament no disponible",
"Storage invalid" : "Emmagatzemament no vàlid",
"Unknown error" : "Error desconegut",
- "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",
- "Permission denied" : "Permís denegat",
- "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.",
- "Error when creating the file" : "S'ha produït un error en crear el fitxer",
- "Error when creating the folder" : "S'ha produït un error en crear la carpeta",
"Unable to set upload directory." : "No es pot establir la carpeta de pujada.",
"Invalid Token" : "Testimoni no vàlid",
"No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Preferits",
"Home" : "Casa",
"Close" : "Tanca",
+ "Upload cancelled." : "La pujada s'ha cancel·lat.",
"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",
"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à.",
"Actions" : "Accions",
@@ -42,14 +36,6 @@
"Select" : "Selecciona",
"Pending" : "Pendent",
"Unable to determine date" : "No s'ha pogut determinar la data",
- "Error moving file." : "Error en moure el fitxer.",
- "Error moving file" : "Error en moure el fitxer",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ja existeix",
- "Could not rename file" : "No es pot canviar el nom de fitxer",
- "Could not create file" : "No s'ha pogut crear el fitxer",
- "Could not create folder" : "No s'ha pogut crear la carpeta",
- "Error deleting file." : "Error en esborrar el fitxer.",
"No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'",
"Name" : "Nom",
"Size" : "Mida",
@@ -69,10 +55,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["coincidències '{filter}'","coincidència '{filter}'"],
"Favorited" : "Agregat a favorits",
"Favorite" : "Preferits",
- "Upload" : "Puja",
- "Text file" : "Fitxer de text",
"Folder" : "Carpeta",
"New folder" : "Carpeta nova",
+ "Upload" : "Puja",
"An error occurred while trying to update the tags" : "S'ha produït un error en tractar d'actualitzar les etiquetes",
"A new file or folder has been <strong>created</strong>" : "S'ha <strong>creat</strong> un nou fitxer o una nova carpeta",
"A file or folder has been <strong>changed</strong>" : "S'ha <strong>canviat</strong> un fitxer o una carpeta",
@@ -88,14 +73,11 @@
"%2$s deleted %1$s" : "%2$s ha esborrat %1$s",
"You restored %1$s" : "Has restaurat %1$s",
"%2$s restored %1$s" : "%2$s ha restaurat %1$s",
- "%s could not be renamed as it has been deleted" : "No s'ha pogut renombrar %s ja que ha estat borrat",
- "%s could not be renamed" : "%s no es pot canviar el nom",
"Upload (max. %s)" : "Pujada (màx. %s)",
"File handling" : "Gestió de fitxers",
"Maximum upload size" : "Mida màxima de pujada",
"max. possible: " : "màxim possible:",
"Save" : "Desa",
- "Can not be edited from here due to insufficient permissions." : "No es pot editar des d'aquí per permisos insuficients.",
"Settings" : "Arranjament",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Useu aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir als fitxers via WebDAV</a>",
@@ -109,6 +91,7 @@
"Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu",
"Currently scanning" : "Actualment escanejant",
"No favorites" : "No hi ha favorits",
- "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits"
+ "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits",
+ "Text file" : "Fitxer de text"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js
index 10f9d49984f..8c40cbcd771 100644
--- a/apps/files/l10n/cs_CZ.js
+++ b/apps/files/l10n/cs_CZ.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Úložiště není dostupné",
"Storage invalid" : "Neplatné úložiště",
"Unknown error" : "Neznámá chyba",
- "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",
- "Permission denied" : "Přístup odepřen",
- "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.",
- "Error when creating the file" : "Chyba při vytváření souboru",
- "Error when creating the folder" : "Chyba při vytváření složky",
"Unable to set upload directory." : "Nelze nastavit adresář pro nahrané soubory.",
"Invalid Token" : "Neplatný token",
"No file was uploaded. Unknown error" : "Žádný soubor nebyl odeslán. Neznámá chyba",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Cílová složka byla přesunuta nebo smazána.",
"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ář",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Oblíbené",
"Home" : "Domů",
"Close" : "Zavřít",
+ "Upload cancelled." : "Odesílání zrušeno.",
"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ů",
"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í.",
"Actions" : "Činnosti",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Nelze určit datum",
"This operation is forbidden" : "Tato operace je zakázána",
"This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte prosím logy nebo kontaktujte svého správce systému",
- "Error moving file." : "Chyba při přesunu souboru.",
- "Error moving file" : "Chyba při přesunu souboru",
- "Error" : "Chyba",
- "{new_name} already exists" : "{new_name} již existuje",
- "Could not rename file" : "Nepodařilo se přejmenovat soubor",
- "Could not create file" : "Nepodařilo se vytvořit soubor",
- "Could not create folder" : "Nepodařilo se vytvořit složku",
- "Error deleting file." : "Chyba při mazání souboru.",
+ "Could not move \"{file}\", target exists" : "Nelze přesunout \"{file}\", cíl existuje",
+ "Could not move \"{file}\"" : "Nelze přesunout \"{file}\"",
+ "{newName} already exists" : "{newName} již existuje",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Nelze přejmenovat \"{fileName}\", již neexistuje",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jméno \"{targetName}\" je již použito v adresáři \"{dir}\". Vyberte prosím jiné jméno.",
+ "Could not rename \"{fileName}\"" : "Nelze přejmenovat \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Nelze vytvořit soubor \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Nelze vytvořit soubor \"{file}\", protože již existuje",
+ "Could not create folder \"{dir}\"" : "Nelze vytvořit adresář \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Nelze vytvořit adresář \"{dir}\", protože již existuje",
+ "Error deleting file \"{fileName}\"." : "Chyba mazání souboru \"{fileName}\".",
"No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'",
"Name" : "Název",
"Size" : "Velikost",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"],
"Favorited" : "Přidáno k oblíbeným",
"Favorite" : "Oblíbené",
- "{newname} already exists" : "{newname} již existuje",
- "Upload" : "Odeslat",
- "Text file" : "Textový soubor",
- "New text file.txt" : "Nový textový soubor.txt",
"Folder" : "Složka",
"New folder" : "Nová složka",
+ "{newname} already exists" : "{newname} již existuje",
+ "Upload" : "Odeslat",
"An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba",
"A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo složka",
"A file or folder has been <strong>changed</strong>" : "Soubor nebo složka byla <strong>změněna</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "Změněno uživatelem %2$s",
"Deleted by %2$s" : "Smazáno uživatelem %2$s",
"Restored by %2$s" : "Obnoveno uživatelem %2$s",
- "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán",
- "%s could not be renamed" : "%s nemůže být přejmenován",
"Upload (max. %s)" : "Nahrát (max. %s)",
"File handling" : "Zacházení se soubory",
"Maximum upload size" : "Maximální velikost pro odesílání",
"max. possible: " : "největší možná: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Při použití PHP-FPM může změna tohoto nastavení trvat až 5 minut po jeho uložení.",
"Save" : "Uložit",
- "Can not be edited from here due to insufficient permissions." : "Nelze odsud upravovat z důvodu nedostatečných oprávnění.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Při použití PHP-FPM může změna nastavení trvat až 5 minut od uložení.",
+ "Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.",
"Settings" : "Nastavení",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup k vašim souborům přes WebDAV</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.",
"Currently scanning" : "Prohledává se",
"No favorites" : "Žádné oblíbené",
- "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde"
+ "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde",
+ "Text file" : "Textový soubor",
+ "New text file.txt" : "Nový textový soubor.txt"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json
index cc475fbfd5c..70b61ec784a 100644
--- a/apps/files/l10n/cs_CZ.json
+++ b/apps/files/l10n/cs_CZ.json
@@ -2,13 +2,6 @@
"Storage not available" : "Úložiště není dostupné",
"Storage invalid" : "Neplatné úložiště",
"Unknown error" : "Neznámá chyba",
- "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",
- "Permission denied" : "Přístup odepřen",
- "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.",
- "Error when creating the file" : "Chyba při vytváření souboru",
- "Error when creating the folder" : "Chyba při vytváření složky",
"Unable to set upload directory." : "Nelze nastavit adresář pro nahrané soubory.",
"Invalid Token" : "Neplatný token",
"No file was uploaded. Unknown error" : "Žádný soubor nebyl odeslán. Neznámá chyba",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Cílová složka byla přesunuta nebo smazána.",
"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ář",
@@ -28,10 +22,10 @@
"Favorites" : "Oblíbené",
"Home" : "Domů",
"Close" : "Zavřít",
+ "Upload cancelled." : "Odesílání zrušeno.",
"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ů",
"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í.",
"Actions" : "Činnosti",
@@ -44,14 +38,17 @@
"Unable to determine date" : "Nelze určit datum",
"This operation is forbidden" : "Tato operace je zakázána",
"This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte prosím logy nebo kontaktujte svého správce systému",
- "Error moving file." : "Chyba při přesunu souboru.",
- "Error moving file" : "Chyba při přesunu souboru",
- "Error" : "Chyba",
- "{new_name} already exists" : "{new_name} již existuje",
- "Could not rename file" : "Nepodařilo se přejmenovat soubor",
- "Could not create file" : "Nepodařilo se vytvořit soubor",
- "Could not create folder" : "Nepodařilo se vytvořit složku",
- "Error deleting file." : "Chyba při mazání souboru.",
+ "Could not move \"{file}\", target exists" : "Nelze přesunout \"{file}\", cíl existuje",
+ "Could not move \"{file}\"" : "Nelze přesunout \"{file}\"",
+ "{newName} already exists" : "{newName} již existuje",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Nelze přejmenovat \"{fileName}\", již neexistuje",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jméno \"{targetName}\" je již použito v adresáři \"{dir}\". Vyberte prosím jiné jméno.",
+ "Could not rename \"{fileName}\"" : "Nelze přejmenovat \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Nelze vytvořit soubor \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Nelze vytvořit soubor \"{file}\", protože již existuje",
+ "Could not create folder \"{dir}\"" : "Nelze vytvořit adresář \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Nelze vytvořit adresář \"{dir}\", protože již existuje",
+ "Error deleting file \"{fileName}\"." : "Chyba mazání souboru \"{fileName}\".",
"No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'",
"Name" : "Název",
"Size" : "Velikost",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"],
"Favorited" : "Přidáno k oblíbeným",
"Favorite" : "Oblíbené",
- "{newname} already exists" : "{newname} již existuje",
- "Upload" : "Odeslat",
- "Text file" : "Textový soubor",
- "New text file.txt" : "Nový textový soubor.txt",
"Folder" : "Složka",
"New folder" : "Nová složka",
+ "{newname} already exists" : "{newname} již existuje",
+ "Upload" : "Odeslat",
"An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba",
"A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo složka",
"A file or folder has been <strong>changed</strong>" : "Soubor nebo složka byla <strong>změněna</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "Změněno uživatelem %2$s",
"Deleted by %2$s" : "Smazáno uživatelem %2$s",
"Restored by %2$s" : "Obnoveno uživatelem %2$s",
- "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán",
- "%s could not be renamed" : "%s nemůže být přejmenován",
"Upload (max. %s)" : "Nahrát (max. %s)",
"File handling" : "Zacházení se soubory",
"Maximum upload size" : "Maximální velikost pro odesílání",
"max. possible: " : "největší možná: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Při použití PHP-FPM může změna tohoto nastavení trvat až 5 minut po jeho uložení.",
"Save" : "Uložit",
- "Can not be edited from here due to insufficient permissions." : "Nelze odsud upravovat z důvodu nedostatečných oprávnění.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Při použití PHP-FPM může změna nastavení trvat až 5 minut od uložení.",
+ "Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.",
"Settings" : "Nastavení",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup k vašim souborům přes WebDAV</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.",
"Currently scanning" : "Prohledává se",
"No favorites" : "Žádné oblíbené",
- "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde"
+ "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde",
+ "Text file" : "Textový soubor",
+ "New text file.txt" : "Nový textový soubor.txt"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js
index 2f64d032f01..983df98f350 100644
--- a/apps/files/l10n/cy_GB.js
+++ b/apps/files/l10n/cy_GB.js
@@ -1,8 +1,6 @@
OC.L10N.register(
"files",
{
- "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",
"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:",
@@ -24,8 +22,6 @@ OC.L10N.register(
"Delete" : "Dileu",
"Details" : "Manylion",
"Pending" : "I ddod",
- "Error" : "Gwall",
- "{new_name} already exists" : "{new_name} yn bodoli'n barod",
"Name" : "Enw",
"Size" : "Maint",
"Modified" : "Addaswyd",
@@ -33,9 +29,8 @@ OC.L10N.register(
"File name cannot be empty." : "Does dim hawl cael enw ffeil gwag.",
"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}%)",
- "Upload" : "Llwytho i fyny",
- "Text file" : "Ffeil destun",
"Folder" : "Plygell",
+ "Upload" : "Llwytho i fyny",
"File handling" : "Trafod ffeiliau",
"Maximum upload size" : "Maint mwyaf llwytho i fyny",
"max. possible: " : "mwyaf. posib:",
@@ -44,6 +39,7 @@ OC.L10N.register(
"Cancel upload" : "Diddymu llwytho i fyny",
"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."
+ "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio.",
+ "Text file" : "Ffeil destun"
},
"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json
index 602cc780abe..b8b87b31dea 100644
--- a/apps/files/l10n/cy_GB.json
+++ b/apps/files/l10n/cy_GB.json
@@ -1,6 +1,4 @@
{ "translations": {
- "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",
"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:",
@@ -22,8 +20,6 @@
"Delete" : "Dileu",
"Details" : "Manylion",
"Pending" : "I ddod",
- "Error" : "Gwall",
- "{new_name} already exists" : "{new_name} yn bodoli'n barod",
"Name" : "Enw",
"Size" : "Maint",
"Modified" : "Addaswyd",
@@ -31,9 +27,8 @@
"File name cannot be empty." : "Does dim hawl cael enw ffeil gwag.",
"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}%)",
- "Upload" : "Llwytho i fyny",
- "Text file" : "Ffeil destun",
"Folder" : "Plygell",
+ "Upload" : "Llwytho i fyny",
"File handling" : "Trafod ffeiliau",
"Maximum upload size" : "Maint mwyaf llwytho i fyny",
"max. possible: " : "mwyaf. posib:",
@@ -42,6 +37,7 @@
"Cancel upload" : "Diddymu llwytho i fyny",
"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."
+ "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio.",
+ "Text file" : "Ffeil destun"
},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
} \ No newline at end of file
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index 4f8cd7ab497..2c27835f917 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Lagerplads er ikke tilgængeligt",
"Storage invalid" : "Lagerplads er ugyldig",
"Unknown error" : "Ukendt fejl",
- "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",
- "Permission denied" : "Adgang nægtet",
- "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.",
- "Error when creating the file" : "Fejl ved oprettelse af fil",
- "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 ",
"No file was uploaded. Unknown error" : "Ingen fil blev uploadet. Ukendt fejl.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Mappen er blevet slettet eller fjernet.",
"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.",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Denne operation er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
- "Error moving file." : "Fejl ved flytning af fil",
- "Error moving file" : "Fejl ved flytning af fil",
- "Error" : "Fejl",
- "{new_name} already exists" : "{new_name} eksisterer allerede",
- "Could not rename file" : "Kunne ikke omdøbe filen",
- "Could not create file" : "Kunne ikke oprette fil",
- "Could not create folder" : "Kunne ikke oprette mappe",
- "Error deleting file." : "Fejl ved sletnign af fil.",
"No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -75,8 +61,6 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Gjort til foretrukken",
"Favorite" : "Foretrukken",
- "Text file" : "Tekstfil",
- "New text file.txt" : "Ny tekst file.txt",
"Folder" : "Mappe",
"New folder" : "Ny Mappe",
"{newname} already exists" : "{newname} eksistere allerede",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Ændret af %2$s",
"Deleted by %2$s" : "Slettet af %2$s",
"Restored by %2$s" : "Gendannet af %2$s",
- "%s could not be renamed as it has been deleted" : "%s kunne ikke omdøbes, da den er blevet slettet",
- "%s could not be renamed" : "%s kunne ikke omdøbes",
"Upload (max. %s)" : "Upload (max. %s)",
"File handling" : "Filhåndtering",
"Maximum upload size" : "Maksimal upload-størrelse",
"max. possible: " : "max. mulige: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med denne PHP-FPM værdi, kan der gå op til 5 minutter før virkningen indtræffer, efter at der gemmes.",
"Save" : "Gem",
- "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres herfra på grund af utilstrækkelige rettigheder.",
"Settings" : "Indstillinger",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Brug denne adresse for at <a href=\"%s\" target=\"_blank\">tilgå dine filer via WebDAV</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.",
"Currently scanning" : "Skanning er i gang",
"No favorites" : "Ingen foretrukne",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her"
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her",
+ "Text file" : "Tekstfil",
+ "New text file.txt" : "Ny tekst file.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index d0fe2575d3e..33663829721 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -2,13 +2,6 @@
"Storage not available" : "Lagerplads er ikke tilgængeligt",
"Storage invalid" : "Lagerplads er ugyldig",
"Unknown error" : "Ukendt fejl",
- "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",
- "Permission denied" : "Adgang nægtet",
- "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.",
- "Error when creating the file" : "Fejl ved oprettelse af fil",
- "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 ",
"No file was uploaded. Unknown error" : "Ingen fil blev uploadet. Ukendt fejl.",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Mappen er blevet slettet eller fjernet.",
"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.",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Denne operation er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
- "Error moving file." : "Fejl ved flytning af fil",
- "Error moving file" : "Fejl ved flytning af fil",
- "Error" : "Fejl",
- "{new_name} already exists" : "{new_name} eksisterer allerede",
- "Could not rename file" : "Kunne ikke omdøbe filen",
- "Could not create file" : "Kunne ikke oprette fil",
- "Could not create folder" : "Kunne ikke oprette mappe",
- "Error deleting file." : "Fejl ved sletnign af fil.",
"No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -73,8 +59,6 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Gjort til foretrukken",
"Favorite" : "Foretrukken",
- "Text file" : "Tekstfil",
- "New text file.txt" : "Ny tekst file.txt",
"Folder" : "Mappe",
"New folder" : "Ny Mappe",
"{newname} already exists" : "{newname} eksistere allerede",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Ændret af %2$s",
"Deleted by %2$s" : "Slettet af %2$s",
"Restored by %2$s" : "Gendannet af %2$s",
- "%s could not be renamed as it has been deleted" : "%s kunne ikke omdøbes, da den er blevet slettet",
- "%s could not be renamed" : "%s kunne ikke omdøbes",
"Upload (max. %s)" : "Upload (max. %s)",
"File handling" : "Filhåndtering",
"Maximum upload size" : "Maksimal upload-størrelse",
"max. possible: " : "max. mulige: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med denne PHP-FPM værdi, kan der gå op til 5 minutter før virkningen indtræffer, efter at der gemmes.",
"Save" : "Gem",
- "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres herfra på grund af utilstrækkelige rettigheder.",
"Settings" : "Indstillinger",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Brug denne adresse for at <a href=\"%s\" target=\"_blank\">tilgå dine filer via WebDAV</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.",
"Currently scanning" : "Skanning er i gang",
"No favorites" : "Ingen foretrukne",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her"
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her",
+ "Text file" : "Tekstfil",
+ "New text file.txt" : "Ny tekst file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index b6f3711617a..cec0cfda0ca 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Speicher nicht verfügbar",
"Storage invalid" : "Speicher ungültig",
"Unknown error" : "Unbekannter Fehler",
- "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",
- "Permission denied" : "Zugriff verweigert",
- "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.",
- "Error when creating the file" : "Fehler beim Erstellen der Datei",
- "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ültiger Token",
"No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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.",
+ "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoriten",
"Home" : "Home",
"Close" : "Schließen",
+ "Upload cancelled." : "Upload abgebrochen.",
"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",
"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.",
"Actions" : "Aktionen",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
"This operation is forbidden" : "Diese Operation ist nicht erlaubt",
"This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator",
- "Error moving file." : "Fehler beim Verschieben der Datei.",
- "Error moving file" : "Fehler beim Verschieben der Datei",
- "Error" : "Fehler",
- "{new_name} already exists" : "{new_name} existiert bereits",
- "Could not rename file" : "Die Datei konnte nicht umbenannt werden",
- "Could not create file" : "Die Datei konnte nicht erstellt werden",
- "Could not create folder" : "Der Ordner konnte nicht erstellt werden",
- "Error deleting file." : "Fehler beim Löschen der Datei.",
"No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein",
"Name" : "Name",
"Size" : "Größe",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
"Favorited" : "Favorisiert",
"Favorite" : "Favorit",
- "{newname} already exists" : "{newname} existiert bereits",
- "Upload" : "Hochladen",
- "Text file" : "Textdatei",
- "New text file.txt" : "Neue Textdatei.txt",
"Folder" : "Ordner",
"New folder" : "Neuer Ordner",
+ "{newname} already exists" : "{newname} existiert bereits",
+ "Upload" : "Hochladen",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Geändert von %2$s",
"Deleted by %2$s" : "Gelöscht von %2$s",
"Restored by %2$s" : "Wiederhergestellt von %2$s",
- "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde",
- "%s could not be renamed" : "%s konnte nicht umbenannt werden",
"Upload (max. %s)" : "Hochladen (max. %s)",
"File handling" : "Dateibehandlung",
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.",
"Save" : "Speichern",
- "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Deine Dateien zuzugreifen</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
"Currently scanning" : "Durchsuchen läuft",
"No favorites" : "Keine Favoriten",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen"
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen",
+ "Text file" : "Textdatei",
+ "New text file.txt" : "Neue Textdatei.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index d0cfab4929e..4e7a6e1bf09 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -2,13 +2,6 @@
"Storage not available" : "Speicher nicht verfügbar",
"Storage invalid" : "Speicher ungültig",
"Unknown error" : "Unbekannter Fehler",
- "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",
- "Permission denied" : "Zugriff verweigert",
- "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.",
- "Error when creating the file" : "Fehler beim Erstellen der Datei",
- "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ültiger Token",
"No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler",
@@ -20,6 +13,7 @@
"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.",
+ "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoriten",
"Home" : "Home",
"Close" : "Schließen",
+ "Upload cancelled." : "Upload abgebrochen.",
"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",
"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.",
"Actions" : "Aktionen",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
"This operation is forbidden" : "Diese Operation ist nicht erlaubt",
"This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator",
- "Error moving file." : "Fehler beim Verschieben der Datei.",
- "Error moving file" : "Fehler beim Verschieben der Datei",
- "Error" : "Fehler",
- "{new_name} already exists" : "{new_name} existiert bereits",
- "Could not rename file" : "Die Datei konnte nicht umbenannt werden",
- "Could not create file" : "Die Datei konnte nicht erstellt werden",
- "Could not create folder" : "Der Ordner konnte nicht erstellt werden",
- "Error deleting file." : "Fehler beim Löschen der Datei.",
"No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein",
"Name" : "Name",
"Size" : "Größe",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
"Favorited" : "Favorisiert",
"Favorite" : "Favorit",
- "{newname} already exists" : "{newname} existiert bereits",
- "Upload" : "Hochladen",
- "Text file" : "Textdatei",
- "New text file.txt" : "Neue Textdatei.txt",
"Folder" : "Ordner",
"New folder" : "Neuer Ordner",
+ "{newname} already exists" : "{newname} existiert bereits",
+ "Upload" : "Hochladen",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Geändert von %2$s",
"Deleted by %2$s" : "Gelöscht von %2$s",
"Restored by %2$s" : "Wiederhergestellt von %2$s",
- "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde",
- "%s could not be renamed" : "%s konnte nicht umbenannt werden",
"Upload (max. %s)" : "Hochladen (max. %s)",
"File handling" : "Dateibehandlung",
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.",
"Save" : "Speichern",
- "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Deine Dateien zuzugreifen</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
"Currently scanning" : "Durchsuchen läuft",
"No favorites" : "Keine Favoriten",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen"
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen",
+ "Text file" : "Textdatei",
+ "New text file.txt" : "Neue Textdatei.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js
index 4f5296dc11f..d7a77f9ee40 100644
--- a/apps/files/l10n/de_AT.js
+++ b/apps/files/l10n/de_AT.js
@@ -6,9 +6,8 @@ OC.L10N.register(
"Download" : "Herunterladen",
"Delete" : "Löschen",
"Details" : "Details",
- "Error" : "Fehler",
- "Upload" : "Hochladen",
"New folder" : "Neuer Ordner",
+ "Upload" : "Hochladen",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner hat sich <strong>geändert</strong>",
"A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>",
diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json
index 91ec7e5e4e1..7381a96665a 100644
--- a/apps/files/l10n/de_AT.json
+++ b/apps/files/l10n/de_AT.json
@@ -4,9 +4,8 @@
"Download" : "Herunterladen",
"Delete" : "Löschen",
"Details" : "Details",
- "Error" : "Fehler",
- "Upload" : "Hochladen",
"New folder" : "Neuer Ordner",
+ "Upload" : "Hochladen",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner hat sich <strong>geändert</strong>",
"A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 9a75b417ace..d65d062c75d 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Speicher nicht verfügbar",
"Storage invalid" : "Speicher ungültig",
"Unknown error" : "Unbekannter Fehler",
- "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",
- "Permission denied" : "Zugriff verweigert",
- "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ählen Sie einen anderen Namen.",
- "Error when creating the file" : "Fehler beim Erstellen der Datei",
- "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ültiger Token",
"No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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.",
+ "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoriten",
"Home" : "Zuhause",
"Close" : "Schließen",
+ "Upload cancelled." : "Upload abgebrochen.",
"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",
"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.",
"Actions" : "Aktionen",
@@ -46,14 +40,16 @@ OC.L10N.register(
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
"This operation is forbidden" : "Diese Operation ist nicht erlaubt",
"This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator",
- "Error moving file." : "Fehler beim Verschieben der Datei.",
- "Error moving file" : "Fehler beim Verschieben der Datei",
- "Error" : "Fehler",
- "{new_name} already exists" : "{new_name} existiert bereits",
- "Could not rename file" : "Die Datei konnte nicht umbenannt werden",
- "Could not create file" : "Die Datei konnte nicht erstellt werden",
- "Could not create folder" : "Der Ordner konnte nicht erstellt werden",
- "Error deleting file." : "Fehler beim Löschen der Datei.",
+ "Could not move \"{file}\", target exists" : "Die Datei konnte nicht verschoben werden \"{file}\", da die Datei im Zielordner bereits existiert",
+ "Could not move \"{file}\"" : "Die Datei konnte nicht verschoben werden \"{file}\"",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei konnte nicht umbennant werden \"{fileName}\", da die Datei nicht mehr existiert",
+ "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da diese bereits existiert",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner konnte nicht erstellt werden \"{dir}\", da dieser bereits existiert",
+ "Error deleting file \"{fileName}\"." : "Fehler beim löschen der Datei \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein",
"Name" : "Name",
"Size" : "Größe",
@@ -71,12 +67,14 @@ OC.L10N.register(
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Ihr Speicher ist fast voll ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"],
+ "Path" : "Pfad",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Favorisiert",
"Favorite" : "Favorit",
- "Upload" : "Hochladen",
- "Text file" : "Textdatei",
"Folder" : "Ordner",
"New folder" : "Neuer Ordner",
+ "{newname} already exists" : "{newname} existiert bereits",
+ "Upload" : "Hochladen",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
@@ -92,14 +90,13 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s hat %1$s gelöscht",
"You restored %1$s" : "Sie haben %1$s wiederhergestellt",
"%2$s restored %1$s" : "%2$s wiederhergestellt %1$s",
- "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde",
- "%s could not be renamed" : "%s konnte nicht umbenannt werden",
+ "Deleted by %2$s" : "Gelöscht durch %2$s",
+ "Restored by %2$s" : "Wiederhergestellt durch %2$s",
"Upload (max. %s)" : "Hochladen (max. %s)",
"File handling" : "Dateibehandlung",
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
"Save" : "Speichern",
- "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
@@ -113,6 +110,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
"Currently scanning" : "Durchsuchen läuft",
"No favorites" : "Keine Favoriten",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen"
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
+ "Text file" : "Textdatei",
+ "New text file.txt" : "Neue Textdatei file.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 910ad9ac6aa..79467fc7642 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -2,13 +2,6 @@
"Storage not available" : "Speicher nicht verfügbar",
"Storage invalid" : "Speicher ungültig",
"Unknown error" : "Unbekannter Fehler",
- "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",
- "Permission denied" : "Zugriff verweigert",
- "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ählen Sie einen anderen Namen.",
- "Error when creating the file" : "Fehler beim Erstellen der Datei",
- "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ültiger Token",
"No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler",
@@ -20,6 +13,7 @@
"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.",
+ "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoriten",
"Home" : "Zuhause",
"Close" : "Schließen",
+ "Upload cancelled." : "Upload abgebrochen.",
"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",
"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.",
"Actions" : "Aktionen",
@@ -44,14 +38,16 @@
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
"This operation is forbidden" : "Diese Operation ist nicht erlaubt",
"This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator",
- "Error moving file." : "Fehler beim Verschieben der Datei.",
- "Error moving file" : "Fehler beim Verschieben der Datei",
- "Error" : "Fehler",
- "{new_name} already exists" : "{new_name} existiert bereits",
- "Could not rename file" : "Die Datei konnte nicht umbenannt werden",
- "Could not create file" : "Die Datei konnte nicht erstellt werden",
- "Could not create folder" : "Der Ordner konnte nicht erstellt werden",
- "Error deleting file." : "Fehler beim Löschen der Datei.",
+ "Could not move \"{file}\", target exists" : "Die Datei konnte nicht verschoben werden \"{file}\", da die Datei im Zielordner bereits existiert",
+ "Could not move \"{file}\"" : "Die Datei konnte nicht verschoben werden \"{file}\"",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei konnte nicht umbennant werden \"{fileName}\", da die Datei nicht mehr existiert",
+ "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da diese bereits existiert",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner konnte nicht erstellt werden \"{dir}\", da dieser bereits existiert",
+ "Error deleting file \"{fileName}\"." : "Fehler beim löschen der Datei \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein",
"Name" : "Name",
"Size" : "Größe",
@@ -69,12 +65,14 @@
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Ihr Speicher ist fast voll ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"],
+ "Path" : "Pfad",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Favorisiert",
"Favorite" : "Favorit",
- "Upload" : "Hochladen",
- "Text file" : "Textdatei",
"Folder" : "Ordner",
"New folder" : "Neuer Ordner",
+ "{newname} already exists" : "{newname} existiert bereits",
+ "Upload" : "Hochladen",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
@@ -90,14 +88,13 @@
"%2$s deleted %1$s" : "%2$s hat %1$s gelöscht",
"You restored %1$s" : "Sie haben %1$s wiederhergestellt",
"%2$s restored %1$s" : "%2$s wiederhergestellt %1$s",
- "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde",
- "%s could not be renamed" : "%s konnte nicht umbenannt werden",
+ "Deleted by %2$s" : "Gelöscht durch %2$s",
+ "Restored by %2$s" : "Wiederhergestellt durch %2$s",
"Upload (max. %s)" : "Hochladen (max. %s)",
"File handling" : "Dateibehandlung",
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
"Save" : "Speichern",
- "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
@@ -111,6 +108,8 @@
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
"Currently scanning" : "Durchsuchen läuft",
"No favorites" : "Keine Favoriten",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen"
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
+ "Text file" : "Textdatei",
+ "New text file.txt" : "Neue Textdatei file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js
index 113f10266a4..f60e842199f 100644
--- a/apps/files/l10n/el.js
+++ b/apps/files/l10n/el.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Μη διαθέσιμος αποθηκευτικός χώρος",
"Storage invalid" : "Μη έγκυρος αποθηκευτικός χώρος",
"Unknown error" : "Άγνωστο σφάλμα",
- "Could not move %s - File with this name already exists" : "Αδυναμία μετακίνησης του %s - υπάρχει ήδη αρχείο με αυτό το όνομα",
- "Could not move %s" : "Αδυναμία μετακίνησης του %s",
- "Permission denied" : "Η πρόσβαση απορρίφθηκε",
- "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. Παρακαλώ επιλέξτε ένα άλλο όνομα.",
- "Error when creating the file" : "Σφάλμα κατά τη δημιουργία του αρχείου",
- "Error when creating the folder" : "Σφάλμα κατά τη δημιουργία του φακέλου",
"Unable to set upload directory." : "Αδυναμία ορισμού καταλόγου αποστολής.",
"Invalid Token" : "Μη έγκυρο Token",
"No file was uploaded. Unknown error" : "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Λείπει ο προσωρινός φάκελος",
"Failed to write to disk" : "Αποτυχία εγγραφής στο δίσκο",
"Not enough storage available" : "Ο διαθέσιμος αποθηκευτικός χώρος δεν επαρκεί",
+ "The target folder has been moved or deleted." : "Ο φάκελος προορισμού έχει μετακινηθεί ή διαγραφεί.",
"Upload failed. Could not find uploaded file" : "Η φόρτωση απέτυχε. Αδυναμία εύρεσης αρχείου προς φόρτωση.",
"Upload failed. Could not get file info." : "Η φόρτωση απέτυχε. Αδυναμία λήψης πληροφοριών αρχείων.",
"Invalid directory." : "Μη έγκυρος φάκελος.",
@@ -46,14 +40,13 @@ OC.L10N.register(
"Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ",
"This operation is forbidden" : "Αυτή η ενέργεια δεν επιτρέπεται",
"This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλώ ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
- "Error moving file." : "Σφάλμα κατά τη μετακίνηση του αρχείου.",
- "Error moving file" : "Σφάλμα κατά τη μετακίνηση του αρχείου",
- "Error" : "Σφάλμα",
- "{new_name} already exists" : "το {new_name} υπάρχει ήδη",
- "Could not rename file" : "Αδυναμία μετονομασίας αρχείου",
- "Could not create file" : "Αδυναμία δημιουργίας αρχείου",
- "Could not create folder" : "Αδυναμία δημιουργίας φακέλου",
- "Error deleting file." : "Σφάλμα κατά τη διαγραφή του αρχείου.",
+ "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα",
+ "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"",
+ "{newName} already exists" : "Το {newname} υπάρχει ήδη",
+ "Could not rename \"{fileName}\"" : "Αδυναμία μετονομασίας του \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του \"{file}\"",
+ "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"",
+ "Error deleting file \"{fileName}\"." : "Αδυναμία διαγραφής του \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Δεν ταιριάζουν καταχωρήσεις σε αυτόν το φάκελο '{filter}'",
"Name" : "Όνομα",
"Size" : "Μέγεθος",
@@ -75,8 +68,6 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Προτιμώμενα",
"Favorite" : "Αγαπημένο",
- "Text file" : "Αρχείο κειμένου",
- "New text file.txt" : "Νέο αρχείο κειμένου.txt",
"Folder" : "Φάκελος",
"New folder" : "Νέος φάκελος",
"{newname} already exists" : "το {newname} υπάρχει ήδη",
@@ -99,15 +90,13 @@ OC.L10N.register(
"Changed by %2$s" : "Άλλαξε από το χρήστη %2$s",
"Deleted by %2$s" : "Διαγράφηκε από το χρήστη %2$s",
"Restored by %2$s" : "Επαναφορά από το χρήστη %2$s",
- "%s could not be renamed as it has been deleted" : "Το %s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί",
- "%s could not be renamed" : "Αδυναμία μετονομασίας του %s",
"Upload (max. %s)" : "Διαμοιρασμός (max. %s)",
"File handling" : "Διαχείριση αρχείων",
"Maximum upload size" : "Μέγιστο μέγεθος αποστολής",
"max. possible: " : "μέγιστο δυνατό:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Με την PHP-FPM αυτή η τιμή μπορεί να χρειαστεί μέχρι και 5 λεπτά για να ενεργοποιηθεί μετά την αποθήκευση.",
"Save" : "Αποθήκευση",
- "Can not be edited from here due to insufficient permissions." : "Δεν είναι δυνατή η επεξεργασία λόγω μη επαρκών δικαιωμάτων",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Με PHP-FPM μπορεί να χρειαστούν μέχρι και 5 λεπτά για να ενεργοποιηθούν οι αλλαγές.",
+ "Missing permissions to edit from here." : "Δεν υπάρχουν τα απαραίτητα δικαιώματα για να γίνει τροποποιήση σε αυτό το σημείο.",
"Settings" : "Ρυθμίσεις",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε <a href=\"%s\" target=\"_blank\">πρόσβαση στα αρχεία σας μέσω WebDAV</a>",
@@ -121,6 +110,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.",
"Currently scanning" : "Σάρωση σε εξέλιξη",
"No favorites" : "Δεν υπάρχουν αγαπημένα",
- "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ "
+ "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ ",
+ "Text file" : "Αρχείο κειμένου",
+ "New text file.txt" : "Νέο αρχείο κειμένου.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json
index baaea21511c..15cb56c87d1 100644
--- a/apps/files/l10n/el.json
+++ b/apps/files/l10n/el.json
@@ -2,13 +2,6 @@
"Storage not available" : "Μη διαθέσιμος αποθηκευτικός χώρος",
"Storage invalid" : "Μη έγκυρος αποθηκευτικός χώρος",
"Unknown error" : "Άγνωστο σφάλμα",
- "Could not move %s - File with this name already exists" : "Αδυναμία μετακίνησης του %s - υπάρχει ήδη αρχείο με αυτό το όνομα",
- "Could not move %s" : "Αδυναμία μετακίνησης του %s",
- "Permission denied" : "Η πρόσβαση απορρίφθηκε",
- "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. Παρακαλώ επιλέξτε ένα άλλο όνομα.",
- "Error when creating the file" : "Σφάλμα κατά τη δημιουργία του αρχείου",
- "Error when creating the folder" : "Σφάλμα κατά τη δημιουργία του φακέλου",
"Unable to set upload directory." : "Αδυναμία ορισμού καταλόγου αποστολής.",
"Invalid Token" : "Μη έγκυρο Token",
"No file was uploaded. Unknown error" : "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Λείπει ο προσωρινός φάκελος",
"Failed to write to disk" : "Αποτυχία εγγραφής στο δίσκο",
"Not enough storage available" : "Ο διαθέσιμος αποθηκευτικός χώρος δεν επαρκεί",
+ "The target folder has been moved or deleted." : "Ο φάκελος προορισμού έχει μετακινηθεί ή διαγραφεί.",
"Upload failed. Could not find uploaded file" : "Η φόρτωση απέτυχε. Αδυναμία εύρεσης αρχείου προς φόρτωση.",
"Upload failed. Could not get file info." : "Η φόρτωση απέτυχε. Αδυναμία λήψης πληροφοριών αρχείων.",
"Invalid directory." : "Μη έγκυρος φάκελος.",
@@ -44,14 +38,13 @@
"Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ",
"This operation is forbidden" : "Αυτή η ενέργεια δεν επιτρέπεται",
"This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλώ ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
- "Error moving file." : "Σφάλμα κατά τη μετακίνηση του αρχείου.",
- "Error moving file" : "Σφάλμα κατά τη μετακίνηση του αρχείου",
- "Error" : "Σφάλμα",
- "{new_name} already exists" : "το {new_name} υπάρχει ήδη",
- "Could not rename file" : "Αδυναμία μετονομασίας αρχείου",
- "Could not create file" : "Αδυναμία δημιουργίας αρχείου",
- "Could not create folder" : "Αδυναμία δημιουργίας φακέλου",
- "Error deleting file." : "Σφάλμα κατά τη διαγραφή του αρχείου.",
+ "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα",
+ "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"",
+ "{newName} already exists" : "Το {newname} υπάρχει ήδη",
+ "Could not rename \"{fileName}\"" : "Αδυναμία μετονομασίας του \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του \"{file}\"",
+ "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"",
+ "Error deleting file \"{fileName}\"." : "Αδυναμία διαγραφής του \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Δεν ταιριάζουν καταχωρήσεις σε αυτόν το φάκελο '{filter}'",
"Name" : "Όνομα",
"Size" : "Μέγεθος",
@@ -73,8 +66,6 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Προτιμώμενα",
"Favorite" : "Αγαπημένο",
- "Text file" : "Αρχείο κειμένου",
- "New text file.txt" : "Νέο αρχείο κειμένου.txt",
"Folder" : "Φάκελος",
"New folder" : "Νέος φάκελος",
"{newname} already exists" : "το {newname} υπάρχει ήδη",
@@ -97,15 +88,13 @@
"Changed by %2$s" : "Άλλαξε από το χρήστη %2$s",
"Deleted by %2$s" : "Διαγράφηκε από το χρήστη %2$s",
"Restored by %2$s" : "Επαναφορά από το χρήστη %2$s",
- "%s could not be renamed as it has been deleted" : "Το %s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί",
- "%s could not be renamed" : "Αδυναμία μετονομασίας του %s",
"Upload (max. %s)" : "Διαμοιρασμός (max. %s)",
"File handling" : "Διαχείριση αρχείων",
"Maximum upload size" : "Μέγιστο μέγεθος αποστολής",
"max. possible: " : "μέγιστο δυνατό:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Με την PHP-FPM αυτή η τιμή μπορεί να χρειαστεί μέχρι και 5 λεπτά για να ενεργοποιηθεί μετά την αποθήκευση.",
"Save" : "Αποθήκευση",
- "Can not be edited from here due to insufficient permissions." : "Δεν είναι δυνατή η επεξεργασία λόγω μη επαρκών δικαιωμάτων",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Με PHP-FPM μπορεί να χρειαστούν μέχρι και 5 λεπτά για να ενεργοποιηθούν οι αλλαγές.",
+ "Missing permissions to edit from here." : "Δεν υπάρχουν τα απαραίτητα δικαιώματα για να γίνει τροποποιήση σε αυτό το σημείο.",
"Settings" : "Ρυθμίσεις",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε <a href=\"%s\" target=\"_blank\">πρόσβαση στα αρχεία σας μέσω WebDAV</a>",
@@ -119,6 +108,8 @@
"Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.",
"Currently scanning" : "Σάρωση σε εξέλιξη",
"No favorites" : "Δεν υπάρχουν αγαπημένα",
- "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ "
+ "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ ",
+ "Text file" : "Αρχείο κειμένου",
+ "New text file.txt" : "Νέο αρχείο κειμένου.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index 5109eb0743b..a190c45e846 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Storage not available",
"Storage invalid" : "Storage invalid",
"Unknown error" : "Unknown error",
- "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",
- "Permission denied" : "Permission denied",
- "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.",
- "Error when creating the file" : "Error when creating the file",
- "Error when creating the folder" : "Error when creating the folder",
"Unable to set upload directory." : "Unable to set upload directory.",
"Invalid Token" : "Invalid Token",
"No file was uploaded. Unknown error" : "No file was uploaded. Unknown error",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "The target folder has been moved or deleted.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favourites",
"Home" : "Home",
"Close" : "Close",
+ "Upload cancelled." : "Upload cancelled.",
"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",
"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.",
"Actions" : "Actions",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Select",
"Pending" : "Pending",
"Unable to determine date" : "Unable to determine date",
- "Error moving file." : "Error moving file.",
- "Error moving file" : "Error moving file",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} already exists",
- "Could not rename file" : "Could not rename file",
- "Could not create file" : "Could not create file",
- "Could not create folder" : "Could not create folder",
- "Error deleting file." : "Error deleting file.",
"No entries in this folder match '{filter}'" : "No entries in this folder match '{filter}'",
"Name" : "Name",
"Size" : "Size",
@@ -69,10 +55,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["matches '{filter}'","match '{filter}'"],
"Favorited" : "Favourited",
"Favorite" : "Favourite",
- "Upload" : "Upload",
- "Text file" : "Text file",
"Folder" : "Folder",
"New folder" : "New folder",
+ "Upload" : "Upload",
"An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags",
"A new file or folder has been <strong>created</strong>" : "A new file or folder has been <strong>created</strong>",
"A file or folder has been <strong>changed</strong>" : "A file or folder has been <strong>changed</strong>",
@@ -88,14 +73,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s deleted %1$s",
"You restored %1$s" : "You restored %1$s",
"%2$s restored %1$s" : "%2$s restored %1$s",
- "%s could not be renamed as it has been deleted" : "%s could not be renamed as it has been deleted",
- "%s could not be renamed" : "%s could not be renamed",
"Upload (max. %s)" : "Upload (max. %s)",
"File handling" : "File handling",
"Maximum upload size" : "Maximum upload size",
"max. possible: " : "max. possible: ",
"Save" : "Save",
- "Can not be edited from here due to insufficient permissions." : "Can not be edited from here due to insufficient permissions.",
"Settings" : "Settings",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>",
@@ -109,6 +91,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Files are being scanned, please wait.",
"Currently scanning" : "Currently scanning",
"No favorites" : "No favourites",
- "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here"
+ "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
+ "Text file" : "Text file"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index 1f9acabeda3..ca8a60ec73b 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -2,13 +2,6 @@
"Storage not available" : "Storage not available",
"Storage invalid" : "Storage invalid",
"Unknown error" : "Unknown error",
- "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",
- "Permission denied" : "Permission denied",
- "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.",
- "Error when creating the file" : "Error when creating the file",
- "Error when creating the folder" : "Error when creating the folder",
"Unable to set upload directory." : "Unable to set upload directory.",
"Invalid Token" : "Invalid Token",
"No file was uploaded. Unknown error" : "No file was uploaded. Unknown error",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "The target folder has been moved or deleted.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favourites",
"Home" : "Home",
"Close" : "Close",
+ "Upload cancelled." : "Upload cancelled.",
"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",
"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.",
"Actions" : "Actions",
@@ -42,14 +36,6 @@
"Select" : "Select",
"Pending" : "Pending",
"Unable to determine date" : "Unable to determine date",
- "Error moving file." : "Error moving file.",
- "Error moving file" : "Error moving file",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} already exists",
- "Could not rename file" : "Could not rename file",
- "Could not create file" : "Could not create file",
- "Could not create folder" : "Could not create folder",
- "Error deleting file." : "Error deleting file.",
"No entries in this folder match '{filter}'" : "No entries in this folder match '{filter}'",
"Name" : "Name",
"Size" : "Size",
@@ -67,10 +53,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["matches '{filter}'","match '{filter}'"],
"Favorited" : "Favourited",
"Favorite" : "Favourite",
- "Upload" : "Upload",
- "Text file" : "Text file",
"Folder" : "Folder",
"New folder" : "New folder",
+ "Upload" : "Upload",
"An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags",
"A new file or folder has been <strong>created</strong>" : "A new file or folder has been <strong>created</strong>",
"A file or folder has been <strong>changed</strong>" : "A file or folder has been <strong>changed</strong>",
@@ -86,14 +71,11 @@
"%2$s deleted %1$s" : "%2$s deleted %1$s",
"You restored %1$s" : "You restored %1$s",
"%2$s restored %1$s" : "%2$s restored %1$s",
- "%s could not be renamed as it has been deleted" : "%s could not be renamed as it has been deleted",
- "%s could not be renamed" : "%s could not be renamed",
"Upload (max. %s)" : "Upload (max. %s)",
"File handling" : "File handling",
"Maximum upload size" : "Maximum upload size",
"max. possible: " : "max. possible: ",
"Save" : "Save",
- "Can not be edited from here due to insufficient permissions." : "Can not be edited from here due to insufficient permissions.",
"Settings" : "Settings",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>",
@@ -107,6 +89,7 @@
"Files are being scanned, please wait." : "Files are being scanned, please wait.",
"Currently scanning" : "Currently scanning",
"No favorites" : "No favourites",
- "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here"
+ "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
+ "Text file" : "Text file"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js
index b881c3d9d01..dbdd0422911 100644
--- a/apps/files/l10n/eo.js
+++ b/apps/files/l10n/eo.js
@@ -2,11 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "Nekonata eraro",
- "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",
- "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.",
- "Error when creating the file" : "Eraris la kreo de la dosiero",
- "Error when creating the folder" : "Eraris la kreo de la dosierujo",
"Unable to set upload directory." : "Ne povis agordiĝi la alŝuta dosierujo.",
"No file was uploaded. Unknown error" : "Neniu dosiero alŝutiĝis. Nekonata eraro.",
"There is no error, the file uploaded with success" : "Ne estas eraro, la dosiero alŝutiĝis sukcese.",
@@ -25,8 +20,8 @@ OC.L10N.register(
"Favorites" : "Favoratoj",
"Home" : "Hejmo",
"Close" : "Fermi",
- "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",
"Upload cancelled." : "La alŝuto nuliĝis.",
+ "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",
"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.",
"Actions" : "Agoj",
@@ -36,12 +31,6 @@ OC.L10N.register(
"Details" : "Detaloj",
"Select" : "Elekti",
"Pending" : "Traktotaj",
- "Error moving file" : "Eraris movo de dosiero",
- "Error" : "Eraro",
- "{new_name} already exists" : "{new_name} jam ekzistas",
- "Could not rename file" : "Ne povis alinomiĝi dosiero",
- "Could not create file" : "Ne povis kreiĝi dosiero",
- "Could not create folder" : "Ne povis kreiĝi dosierujo",
"Name" : "Nomo",
"Size" : "Grando",
"Modified" : "Modifita",
@@ -55,10 +44,9 @@ OC.L10N.register(
"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}%)",
"Favorite" : "Favorato",
- "Upload" : "Alŝuti",
- "Text file" : "Tekstodosiero",
"Folder" : "Dosierujo",
"New folder" : "Nova dosierujo",
+ "Upload" : "Alŝuti",
"You created %1$s" : "Vi kreis %1$s",
"%2$s created %1$s" : "%2$s kreis %1$s",
"%1$s was created in a public folder" : "%1$s kreiĝis en publika dosierujo",
@@ -66,8 +54,6 @@ OC.L10N.register(
"%2$s changed %1$s" : "%2$s ŝanĝis %1$s",
"You deleted %1$s" : "Vi forigis %1$s",
"%2$s deleted %1$s" : "%2$s forigis %1$s",
- "%s could not be renamed as it has been deleted" : "%s ne povis alinomiĝi ĉar ĝi forigitis",
- "%s could not be renamed" : "%s ne povis alinomiĝi",
"Upload (max. %s)" : "Alŝuti (maks. %s)",
"File handling" : "Dosieradministro",
"Maximum upload size" : "Maksimuma alŝutogrando",
@@ -81,6 +67,7 @@ OC.L10N.register(
"Select all" : "Elekti ĉion",
"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."
+ "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi.",
+ "Text file" : "Tekstodosiero"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json
index 93f3bdbede1..b858ccece4d 100644
--- a/apps/files/l10n/eo.json
+++ b/apps/files/l10n/eo.json
@@ -1,10 +1,5 @@
{ "translations": {
"Unknown error" : "Nekonata eraro",
- "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",
- "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.",
- "Error when creating the file" : "Eraris la kreo de la dosiero",
- "Error when creating the folder" : "Eraris la kreo de la dosierujo",
"Unable to set upload directory." : "Ne povis agordiĝi la alŝuta dosierujo.",
"No file was uploaded. Unknown error" : "Neniu dosiero alŝutiĝis. Nekonata eraro.",
"There is no error, the file uploaded with success" : "Ne estas eraro, la dosiero alŝutiĝis sukcese.",
@@ -23,8 +18,8 @@
"Favorites" : "Favoratoj",
"Home" : "Hejmo",
"Close" : "Fermi",
- "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",
"Upload cancelled." : "La alŝuto nuliĝis.",
+ "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",
"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.",
"Actions" : "Agoj",
@@ -34,12 +29,6 @@
"Details" : "Detaloj",
"Select" : "Elekti",
"Pending" : "Traktotaj",
- "Error moving file" : "Eraris movo de dosiero",
- "Error" : "Eraro",
- "{new_name} already exists" : "{new_name} jam ekzistas",
- "Could not rename file" : "Ne povis alinomiĝi dosiero",
- "Could not create file" : "Ne povis kreiĝi dosiero",
- "Could not create folder" : "Ne povis kreiĝi dosierujo",
"Name" : "Nomo",
"Size" : "Grando",
"Modified" : "Modifita",
@@ -53,10 +42,9 @@
"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}%)",
"Favorite" : "Favorato",
- "Upload" : "Alŝuti",
- "Text file" : "Tekstodosiero",
"Folder" : "Dosierujo",
"New folder" : "Nova dosierujo",
+ "Upload" : "Alŝuti",
"You created %1$s" : "Vi kreis %1$s",
"%2$s created %1$s" : "%2$s kreis %1$s",
"%1$s was created in a public folder" : "%1$s kreiĝis en publika dosierujo",
@@ -64,8 +52,6 @@
"%2$s changed %1$s" : "%2$s ŝanĝis %1$s",
"You deleted %1$s" : "Vi forigis %1$s",
"%2$s deleted %1$s" : "%2$s forigis %1$s",
- "%s could not be renamed as it has been deleted" : "%s ne povis alinomiĝi ĉar ĝi forigitis",
- "%s could not be renamed" : "%s ne povis alinomiĝi",
"Upload (max. %s)" : "Alŝuti (maks. %s)",
"File handling" : "Dosieradministro",
"Maximum upload size" : "Maksimuma alŝutogrando",
@@ -79,6 +65,7 @@
"Select all" : "Elekti ĉion",
"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."
+ "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi.",
+ "Text file" : "Tekstodosiero"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 15062395e40..dd8759c3f0c 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Almacenamiento no disponible",
"Storage invalid" : "Almacenamiento inválido",
"Unknown error" : "Error desconocido",
- "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",
- "Permission denied" : "Permiso denegado",
- "The target folder has been moved or deleted." : "La carpeta de 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.",
- "Error when creating the file" : "Error al crear el archivo",
- "Error when creating the folder" : "Error al crear la carpeta.",
"Unable to set upload directory." : "Incapaz de crear directorio de subida.",
"Invalid Token" : "Token Inválido",
"No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoritos",
"Home" : "Particular",
"Close" : "Cerrar",
+ "Upload cancelled." : "Subida cancelada.",
"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",
"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.",
"Actions" : "Acciones",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "No se pudo determinar la fecha",
"This operation is forbidden" : "Esta operación está prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador",
- "Error moving file." : "Error al mover el archivo.",
- "Error moving file" : "Error moviendo archivo",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ya existe",
- "Could not rename file" : "No se pudo renombrar el archivo",
- "Could not create file" : "No se pudo crear el archivo",
- "Could not create folder" : "No se pudo crear la carpeta",
- "Error deleting file." : "Error al borrar el archivo",
"No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'",
"Name" : "Nombre",
"Size" : "Tamaño",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Agregado a Favoritos",
"Favorite" : "Favorito",
- "{newname} already exists" : "{new_name} ya existe",
- "Upload" : "Subir",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo archivo de texto.txt",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
+ "{newname} already exists" : "{new_name} ya existe",
+ "Upload" : "Subir",
"An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas",
"A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta",
"A file or folder has been <strong>changed</strong>" : "Se ha <strong>modificado</strong> un archivo o carpeta",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Cambiado por %2$s",
"Deleted by %2$s" : "Eliminado por %2$s",
"Restored by %2$s" : "Restaurado por %2$s",
- "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado",
- "%s could not be renamed" : "%s no pudo ser renombrado",
"Upload (max. %s)" : "Subida (máx. %s)",
"File handling" : "Administración de archivos",
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM este valor se puede demorar hasta 5 minutos para tener efecto después de guardar.",
"Save" : "Guardar",
- "Can not be edited from here due to insufficient permissions." : "No se puede editar desde aquí por permisos insuficientes.",
"Settings" : "Ajustes",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta URL <a href=\"%s\" target=\"_blank\">para acceder via WebDAV</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.",
"Currently scanning" : "Escaneando en este momento",
"No favorites" : "No hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos"
+ "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos",
+ "Text file" : "Archivo de texto",
+ "New text file.txt" : "Nuevo archivo de texto.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 4ce106ea4b5..de4005ae515 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -2,13 +2,6 @@
"Storage not available" : "Almacenamiento no disponible",
"Storage invalid" : "Almacenamiento inválido",
"Unknown error" : "Error desconocido",
- "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",
- "Permission denied" : "Permiso denegado",
- "The target folder has been moved or deleted." : "La carpeta de 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.",
- "Error when creating the file" : "Error al crear el archivo",
- "Error when creating the folder" : "Error al crear la carpeta.",
"Unable to set upload directory." : "Incapaz de crear directorio de subida.",
"Invalid Token" : "Token Inválido",
"No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoritos",
"Home" : "Particular",
"Close" : "Cerrar",
+ "Upload cancelled." : "Subida cancelada.",
"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",
"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.",
"Actions" : "Acciones",
@@ -44,14 +38,6 @@
"Unable to determine date" : "No se pudo determinar la fecha",
"This operation is forbidden" : "Esta operación está prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador",
- "Error moving file." : "Error al mover el archivo.",
- "Error moving file" : "Error moviendo archivo",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ya existe",
- "Could not rename file" : "No se pudo renombrar el archivo",
- "Could not create file" : "No se pudo crear el archivo",
- "Could not create folder" : "No se pudo crear la carpeta",
- "Error deleting file." : "Error al borrar el archivo",
"No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'",
"Name" : "Nombre",
"Size" : "Tamaño",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Agregado a Favoritos",
"Favorite" : "Favorito",
- "{newname} already exists" : "{new_name} ya existe",
- "Upload" : "Subir",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo archivo de texto.txt",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
+ "{newname} already exists" : "{new_name} ya existe",
+ "Upload" : "Subir",
"An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas",
"A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta",
"A file or folder has been <strong>changed</strong>" : "Se ha <strong>modificado</strong> un archivo o carpeta",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Cambiado por %2$s",
"Deleted by %2$s" : "Eliminado por %2$s",
"Restored by %2$s" : "Restaurado por %2$s",
- "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado",
- "%s could not be renamed" : "%s no pudo ser renombrado",
"Upload (max. %s)" : "Subida (máx. %s)",
"File handling" : "Administración de archivos",
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM este valor se puede demorar hasta 5 minutos para tener efecto después de guardar.",
"Save" : "Guardar",
- "Can not be edited from here due to insufficient permissions." : "No se puede editar desde aquí por permisos insuficientes.",
"Settings" : "Ajustes",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta URL <a href=\"%s\" target=\"_blank\">para acceder via WebDAV</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.",
"Currently scanning" : "Escaneando en este momento",
"No favorites" : "No hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos"
+ "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos",
+ "Text file" : "Archivo de texto",
+ "New text file.txt" : "Nuevo archivo de texto.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js
index f81f0e6bed1..6c6b0d49853 100644
--- a/apps/files/l10n/es_AR.js
+++ b/apps/files/l10n/es_AR.js
@@ -1,12 +1,9 @@
OC.L10N.register(
"files",
{
+ "Storage not available" : "Almacenamiento no disponible",
+ "Storage invalid" : "Almacenamiento invalido",
"Unknown error" : "Error desconocido",
- "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 ",
- "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.",
- "Error when creating the file" : "Error al crear el archivo",
- "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",
@@ -18,15 +15,19 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "La carpeta destino fue movida o borrada.",
"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",
+ "All files" : "Todos los archivos",
"Favorites" : "Favoritos",
"Home" : "Particular",
"Close" : "Cerrar",
- "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",
+ "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.",
+ "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}",
"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á.",
"Actions" : "Acciones",
@@ -36,13 +37,7 @@ OC.L10N.register(
"Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendientes",
- "Error moving file" : "Error moviendo el archivo",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ya existe",
- "Could not rename file" : "No se pudo renombrar el archivo",
- "Could not create file" : "No se pudo crear el archivo",
- "Could not create folder" : "No se pudo crear el directorio",
- "Error deleting file." : "Error al borrar el archivo.",
+ "Unable to determine date" : "No fue posible determinar la fecha",
"Name" : "Nombre",
"Size" : "Tamaño",
"Modified" : "Modificado",
@@ -56,10 +51,9 @@ OC.L10N.register(
"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}%)",
"Favorite" : "Favorito",
- "Upload" : "Subir",
- "Text file" : "Archivo de texto",
"Folder" : "Carpeta",
"New folder" : "Nueva Carpeta",
+ "Upload" : "Subir",
"A new file or folder has been <strong>created</strong>" : "Un archivo o carpeta ha sido <strong>creado</strong>",
"A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>modificado</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un archivo o carpeta ha sido <strong>eliminado</strong>",
@@ -69,7 +63,6 @@ OC.L10N.register(
"%2$s changed %1$s" : "%2$s modificó %1$s",
"You deleted %1$s" : "Eliminaste %1$s",
"%2$s deleted %1$s" : "%2$s eliminó %1$s",
- "%s could not be renamed" : "No se pudo renombrar %s",
"File handling" : "Tratamiento de archivos",
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
@@ -80,6 +73,7 @@ OC.L10N.register(
"Cancel upload" : "Cancelar subida",
"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á."
+ "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá.",
+ "Text file" : "Archivo de texto"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json
index a9d5c8ece30..ad492b4048a 100644
--- a/apps/files/l10n/es_AR.json
+++ b/apps/files/l10n/es_AR.json
@@ -1,10 +1,7 @@
{ "translations": {
+ "Storage not available" : "Almacenamiento no disponible",
+ "Storage invalid" : "Almacenamiento invalido",
"Unknown error" : "Error desconocido",
- "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 ",
- "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.",
- "Error when creating the file" : "Error al crear el archivo",
- "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",
@@ -16,15 +13,19 @@
"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",
+ "The target folder has been moved or deleted." : "La carpeta destino fue movida o borrada.",
"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",
+ "All files" : "Todos los archivos",
"Favorites" : "Favoritos",
"Home" : "Particular",
"Close" : "Cerrar",
- "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",
+ "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.",
+ "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}",
"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á.",
"Actions" : "Acciones",
@@ -34,13 +35,7 @@
"Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendientes",
- "Error moving file" : "Error moviendo el archivo",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ya existe",
- "Could not rename file" : "No se pudo renombrar el archivo",
- "Could not create file" : "No se pudo crear el archivo",
- "Could not create folder" : "No se pudo crear el directorio",
- "Error deleting file." : "Error al borrar el archivo.",
+ "Unable to determine date" : "No fue posible determinar la fecha",
"Name" : "Nombre",
"Size" : "Tamaño",
"Modified" : "Modificado",
@@ -54,10 +49,9 @@
"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}%)",
"Favorite" : "Favorito",
- "Upload" : "Subir",
- "Text file" : "Archivo de texto",
"Folder" : "Carpeta",
"New folder" : "Nueva Carpeta",
+ "Upload" : "Subir",
"A new file or folder has been <strong>created</strong>" : "Un archivo o carpeta ha sido <strong>creado</strong>",
"A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>modificado</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un archivo o carpeta ha sido <strong>eliminado</strong>",
@@ -67,7 +61,6 @@
"%2$s changed %1$s" : "%2$s modificó %1$s",
"You deleted %1$s" : "Eliminaste %1$s",
"%2$s deleted %1$s" : "%2$s eliminó %1$s",
- "%s could not be renamed" : "No se pudo renombrar %s",
"File handling" : "Tratamiento de archivos",
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
@@ -78,6 +71,7 @@
"Cancel upload" : "Cancelar subida",
"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á."
+ "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá.",
+ "Text file" : "Archivo de texto"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js
index 9b0929f50af..7b67ca39ac5 100644
--- a/apps/files/l10n/es_CL.js
+++ b/apps/files/l10n/es_CL.js
@@ -6,9 +6,8 @@ OC.L10N.register(
"Download" : "Descargar",
"Rename" : "Renombrar",
"Details" : "detalles",
- "Error" : "Error",
- "Upload" : "Subir",
"New folder" : "Nuevo directorio",
+ "Upload" : "Subir",
"A new file or folder has been <strong>created</strong>" : "Un nuevo archivo o carpeta ha sido <strong>creado</strong>",
"A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un archivo o carpeta ha sido <strong>eliminado</strong>",
diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json
index 57c23a61ea7..7c42b2a4097 100644
--- a/apps/files/l10n/es_CL.json
+++ b/apps/files/l10n/es_CL.json
@@ -4,9 +4,8 @@
"Download" : "Descargar",
"Rename" : "Renombrar",
"Details" : "detalles",
- "Error" : "Error",
- "Upload" : "Subir",
"New folder" : "Nuevo directorio",
+ "Upload" : "Subir",
"A new file or folder has been <strong>created</strong>" : "Un nuevo archivo o carpeta ha sido <strong>creado</strong>",
"A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un archivo o carpeta ha sido <strong>eliminado</strong>",
diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js
index 5502733d2e2..0e4dbddeda9 100644
--- a/apps/files/l10n/es_MX.js
+++ b/apps/files/l10n/es_MX.js
@@ -2,11 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "Error desconocido",
- "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",
- "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.",
- "Error when creating the file" : "Error al crear el archivo",
- "Error when creating the folder" : "Error al crear la carpeta.",
"Unable to set upload directory." : "Incapaz de crear directorio de subida.",
"Invalid Token" : "Token Inválido",
"No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido",
@@ -25,8 +20,8 @@ OC.L10N.register(
"Favorites" : "Favoritos",
"Home" : "Particular",
"Close" : "Cerrar",
- "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",
"Upload cancelled." : "Subida cancelada.",
+ "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",
"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.",
"Actions" : "Acciones",
@@ -35,13 +30,6 @@ OC.L10N.register(
"Delete" : "Eliminar",
"Details" : "Detalles",
"Pending" : "Pendiente",
- "Error moving file" : "Error moviendo archivo",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ya existe",
- "Could not rename file" : "No se pudo renombrar el archivo",
- "Could not create file" : "No se pudo crear el archivo",
- "Could not create folder" : "No se pudo crear la carpeta",
- "Error deleting file." : "Error borrando el archivo.",
"Name" : "Nombre",
"Size" : "Tamaño",
"Modified" : "Modificado",
@@ -55,14 +43,12 @@ OC.L10N.register(
"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}%)",
"Favorite" : "Favorito",
- "Upload" : "Subir archivo",
- "Text file" : "Archivo de texto",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
+ "Upload" : "Subir archivo",
"You created %1$s" : "Has creado %1$s",
"You changed %1$s" : "Has cambiado %1$s",
"You deleted %1$s" : "Has eliminado %1$s",
- "%s could not be renamed" : "%s no pudo ser renombrado",
"File handling" : "Administración de archivos",
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
@@ -73,6 +59,7 @@ OC.L10N.register(
"Cancel upload" : "Cancelar subida",
"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."
+ "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.",
+ "Text file" : "Archivo de texto"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json
index 22918fae182..cb903ddd9dc 100644
--- a/apps/files/l10n/es_MX.json
+++ b/apps/files/l10n/es_MX.json
@@ -1,10 +1,5 @@
{ "translations": {
"Unknown error" : "Error desconocido",
- "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",
- "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.",
- "Error when creating the file" : "Error al crear el archivo",
- "Error when creating the folder" : "Error al crear la carpeta.",
"Unable to set upload directory." : "Incapaz de crear directorio de subida.",
"Invalid Token" : "Token Inválido",
"No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido",
@@ -23,8 +18,8 @@
"Favorites" : "Favoritos",
"Home" : "Particular",
"Close" : "Cerrar",
- "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",
"Upload cancelled." : "Subida cancelada.",
+ "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",
"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.",
"Actions" : "Acciones",
@@ -33,13 +28,6 @@
"Delete" : "Eliminar",
"Details" : "Detalles",
"Pending" : "Pendiente",
- "Error moving file" : "Error moviendo archivo",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} ya existe",
- "Could not rename file" : "No se pudo renombrar el archivo",
- "Could not create file" : "No se pudo crear el archivo",
- "Could not create folder" : "No se pudo crear la carpeta",
- "Error deleting file." : "Error borrando el archivo.",
"Name" : "Nombre",
"Size" : "Tamaño",
"Modified" : "Modificado",
@@ -53,14 +41,12 @@
"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}%)",
"Favorite" : "Favorito",
- "Upload" : "Subir archivo",
- "Text file" : "Archivo de texto",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
+ "Upload" : "Subir archivo",
"You created %1$s" : "Has creado %1$s",
"You changed %1$s" : "Has cambiado %1$s",
"You deleted %1$s" : "Has eliminado %1$s",
- "%s could not be renamed" : "%s no pudo ser renombrado",
"File handling" : "Administración de archivos",
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
@@ -71,6 +57,7 @@
"Cancel upload" : "Cancelar subida",
"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."
+ "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.",
+ "Text file" : "Archivo de texto"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index 86bda48300b..f136bd300b1 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Andmehoidla pole saadaval",
"Storage invalid" : "Vigane andmehoidla",
"Unknown error" : "Tundmatu viga",
- "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",
- "Permission denied" : "Ligipääs keelatud",
- "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.",
- "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.",
- "Error when creating the file" : "Viga faili loomisel",
- "Error when creating the folder" : "Viga kataloogi loomisel",
"Unable to set upload directory." : "Üleslaadimiste kausta määramine ebaõnnestus.",
"Invalid Token" : "Vigane kontrollkood",
"No file was uploaded. Unknown error" : "Ühtegi faili ei laetud üles. Tundmatu viga",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Lemmikud",
"Home" : "Kodu",
"Close" : "Sulge",
+ "Upload cancelled." : "Üleslaadimine tühistati.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Faili suurus {size1} ületab faili üleslaadimise mahu piirangu {size2}.",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.",
- "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.",
"Actions" : "Tegevused",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud",
"This operation is forbidden" : "See toiming on keelatud",
"This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga",
- "Error moving file." : "Viga faili liigutamisel.",
- "Error moving file" : "Viga faili eemaldamisel",
- "Error" : "Viga",
- "{new_name} already exists" : "{new_name} on juba olemas",
- "Could not rename file" : "Ei suuda faili ümber nimetada",
- "Could not create file" : "Ei suuda luua faili",
- "Could not create folder" : "Ei suuda luua kataloogi",
- "Error deleting file." : "Viga faili kustutamisel.",
"No entries in this folder match '{filter}'" : "Ükski sissekanne ei kattu filtriga '{filter}'",
"Name" : "Nimi",
"Size" : "Suurus",
@@ -74,10 +60,9 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bait","%n baiti"],
"Favorited" : "Lemmikud",
"Favorite" : "Lemmik",
- "Upload" : "Lae üles",
- "Text file" : "Tekstifail",
"Folder" : "Kaust",
"New folder" : "Uus kaust",
+ "Upload" : "Lae üles",
"An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge",
"A new file or folder has been <strong>created</strong>" : "Uus fail või kataloog on <strong>loodud</strong>",
"A file or folder has been <strong>changed</strong>" : "Fail või kataloog on <strong>muudetud</strong>",
@@ -92,15 +77,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s kustutas %1$s",
"You restored %1$s" : "Sa taastasid %1$s",
"%2$s restored %1$s" : "%2$s taastas %1$s",
- "%s could not be renamed as it has been deleted" : "%s ei saa ümber nimetada, kuna see on kustutatud",
- "%s could not be renamed" : "%s ümbernimetamine ebaõnnestus",
"Upload (max. %s)" : "Üleslaadimine (max. %s)",
"File handling" : "Failide käsitlemine",
"Maximum upload size" : "Maksimaalne üleslaadimise suurus",
"max. possible: " : "maks. võimalik: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-ga võib see väärtuse mõju rakendamine võtta aega kuni 5 minutit pärast salvestamist.",
"Save" : "Salvesta",
- "Can not be edited from here due to insufficient permissions." : "Ei saa õiguste puudumise tõttu muuta.",
"Settings" : "Seaded",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>",
@@ -114,6 +95,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Faile skannitakse, palun oota.",
"Currently scanning" : "Praegu skännimisel",
"No favorites" : "Lemmikuid pole",
- "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks"
+ "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks",
+ "Text file" : "Tekstifail"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index a95de6cf039..6e1961770c9 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -2,13 +2,6 @@
"Storage not available" : "Andmehoidla pole saadaval",
"Storage invalid" : "Vigane andmehoidla",
"Unknown error" : "Tundmatu viga",
- "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",
- "Permission denied" : "Ligipääs keelatud",
- "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.",
- "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.",
- "Error when creating the file" : "Viga faili loomisel",
- "Error when creating the folder" : "Viga kataloogi loomisel",
"Unable to set upload directory." : "Üleslaadimiste kausta määramine ebaõnnestus.",
"Invalid Token" : "Vigane kontrollkood",
"No file was uploaded. Unknown error" : "Ühtegi faili ei laetud üles. Tundmatu viga",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Lemmikud",
"Home" : "Kodu",
"Close" : "Sulge",
+ "Upload cancelled." : "Üleslaadimine tühistati.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Faili suurus {size1} ületab faili üleslaadimise mahu piirangu {size2}.",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.",
- "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.",
"Actions" : "Tegevused",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud",
"This operation is forbidden" : "See toiming on keelatud",
"This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga",
- "Error moving file." : "Viga faili liigutamisel.",
- "Error moving file" : "Viga faili eemaldamisel",
- "Error" : "Viga",
- "{new_name} already exists" : "{new_name} on juba olemas",
- "Could not rename file" : "Ei suuda faili ümber nimetada",
- "Could not create file" : "Ei suuda luua faili",
- "Could not create folder" : "Ei suuda luua kataloogi",
- "Error deleting file." : "Viga faili kustutamisel.",
"No entries in this folder match '{filter}'" : "Ükski sissekanne ei kattu filtriga '{filter}'",
"Name" : "Nimi",
"Size" : "Suurus",
@@ -72,10 +58,9 @@
"_%n byte_::_%n bytes_" : ["%n bait","%n baiti"],
"Favorited" : "Lemmikud",
"Favorite" : "Lemmik",
- "Upload" : "Lae üles",
- "Text file" : "Tekstifail",
"Folder" : "Kaust",
"New folder" : "Uus kaust",
+ "Upload" : "Lae üles",
"An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge",
"A new file or folder has been <strong>created</strong>" : "Uus fail või kataloog on <strong>loodud</strong>",
"A file or folder has been <strong>changed</strong>" : "Fail või kataloog on <strong>muudetud</strong>",
@@ -90,15 +75,11 @@
"%2$s deleted %1$s" : "%2$s kustutas %1$s",
"You restored %1$s" : "Sa taastasid %1$s",
"%2$s restored %1$s" : "%2$s taastas %1$s",
- "%s could not be renamed as it has been deleted" : "%s ei saa ümber nimetada, kuna see on kustutatud",
- "%s could not be renamed" : "%s ümbernimetamine ebaõnnestus",
"Upload (max. %s)" : "Üleslaadimine (max. %s)",
"File handling" : "Failide käsitlemine",
"Maximum upload size" : "Maksimaalne üleslaadimise suurus",
"max. possible: " : "maks. võimalik: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-ga võib see väärtuse mõju rakendamine võtta aega kuni 5 minutit pärast salvestamist.",
"Save" : "Salvesta",
- "Can not be edited from here due to insufficient permissions." : "Ei saa õiguste puudumise tõttu muuta.",
"Settings" : "Seaded",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>",
@@ -112,6 +93,7 @@
"Files are being scanned, please wait." : "Faile skannitakse, palun oota.",
"Currently scanning" : "Praegu skännimisel",
"No favorites" : "Lemmikuid pole",
- "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks"
+ "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks",
+ "Text file" : "Tekstifail"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js
index c01afc96c55..9add1516c46 100644
--- a/apps/files/l10n/eu.js
+++ b/apps/files/l10n/eu.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Biltegia ez dago eskuragarri",
"Storage invalid" : "Biltegi bliogabea",
"Unknown error" : "Errore ezezaguna",
- "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",
- "Permission denied" : "Baimena Ukatua",
- "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.",
- "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.",
- "Error when creating the file" : "Errorea fitxategia sortzerakoan",
- "Error when creating the folder" : "Errorea karpeta sortzerakoan",
"Unable to set upload directory." : "Ezin da igoera direktorioa ezarri.",
"Invalid Token" : "Lekuko baliogabea",
"No file was uploaded. Unknown error" : "Ez da fitxategirik igo. Errore ezezaguna",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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,",
+ "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Gogokoak",
"Home" : "Etxekoa",
"Close" : "Itxi",
+ "Upload cancelled." : "Igoera ezeztatuta",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako",
"Total file size {size1} exceeds upload limit {size2}" : "Fitxategiaren tamainak {size1} igotzeko muga {size2} gainditzen du",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, zu {size1} igotzen ari zara baina bakarrik {size2} libre dago",
- "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.",
"Actions" : "Ekintzak",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "hautatu",
"Pending" : "Zain",
"Unable to determine date" : "Ezin izan da data zehaztu",
- "Error moving file." : "Errorea fitxategia mugitzean.",
- "Error moving file" : "Errorea fitxategia mugitzean",
- "Error" : "Errorea",
- "{new_name} already exists" : "{new_name} dagoeneko existitzen da",
- "Could not rename file" : "Ezin izan da fitxategia berrizendatu",
- "Could not create file" : "Ezin izan da fitxategia sortu",
- "Could not create folder" : "Ezin izan da karpeta sortu",
- "Error deleting file." : "Errorea fitxategia ezabatzerakoan.",
"No entries in this folder match '{filter}'" : "Karpeta honetan ez dago sarrerarik '{filter}' iragazkiarekin bat egiten dutenak",
"Name" : "Izena",
"Size" : "Tamaina",
@@ -68,10 +54,9 @@ OC.L10N.register(
"Your storage is almost full ({usedSpacePercent}%)" : "Zure biltegiratzea nahiko beterik dago (%{usedSpacePercent})",
"Favorited" : "Gogokoa",
"Favorite" : "Gogokoa",
- "Upload" : "Igo",
- "Text file" : "Testu fitxategia",
"Folder" : "Karpeta",
"New folder" : "Karpeta berria",
+ "Upload" : "Igo",
"A new file or folder has been <strong>created</strong>" : "Fitxategi edo karpeta berri bat <strong>sortu da</strong>",
"A file or folder has been <strong>changed</strong>" : "Fitxategi edo karpeta bat <strong>aldatu da</strong>",
"A file or folder has been <strong>deleted</strong>" : "Fitxategi edo karpeta bat <strong>ezabatu da</strong>",
@@ -85,8 +70,6 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$sk ezabatuta %1$s",
"You restored %1$s" : "Zuk %1$s berrezarri duzu",
"%2$s restored %1$s" : "%2$sk %1$s berrezarri du",
- "%s could not be renamed as it has been deleted" : "%s ezin izan da berrizendatu ezabatua zegoen eta",
- "%s could not be renamed" : "%s ezin da berrizendatu",
"Upload (max. %s)" : "Igo (max. %s)",
"File handling" : "Fitxategien kudeaketa",
"Maximum upload size" : "Igo daitekeen gehienezko tamaina",
@@ -104,6 +87,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
"Currently scanning" : "Eskaneatzen une honetan",
"No favorites" : "Gogokorik ez",
- "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira"
+ "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira",
+ "Text file" : "Testu fitxategia"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json
index 997e8bf73cf..96943f33a9a 100644
--- a/apps/files/l10n/eu.json
+++ b/apps/files/l10n/eu.json
@@ -2,13 +2,6 @@
"Storage not available" : "Biltegia ez dago eskuragarri",
"Storage invalid" : "Biltegi bliogabea",
"Unknown error" : "Errore ezezaguna",
- "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",
- "Permission denied" : "Baimena Ukatua",
- "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.",
- "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.",
- "Error when creating the file" : "Errorea fitxategia sortzerakoan",
- "Error when creating the folder" : "Errorea karpeta sortzerakoan",
"Unable to set upload directory." : "Ezin da igoera direktorioa ezarri.",
"Invalid Token" : "Lekuko baliogabea",
"No file was uploaded. Unknown error" : "Ez da fitxategirik igo. Errore ezezaguna",
@@ -20,6 +13,7 @@
"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,",
+ "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Gogokoak",
"Home" : "Etxekoa",
"Close" : "Itxi",
+ "Upload cancelled." : "Igoera ezeztatuta",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako",
"Total file size {size1} exceeds upload limit {size2}" : "Fitxategiaren tamainak {size1} igotzeko muga {size2} gainditzen du",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, zu {size1} igotzen ari zara baina bakarrik {size2} libre dago",
- "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.",
"Actions" : "Ekintzak",
@@ -42,14 +36,6 @@
"Select" : "hautatu",
"Pending" : "Zain",
"Unable to determine date" : "Ezin izan da data zehaztu",
- "Error moving file." : "Errorea fitxategia mugitzean.",
- "Error moving file" : "Errorea fitxategia mugitzean",
- "Error" : "Errorea",
- "{new_name} already exists" : "{new_name} dagoeneko existitzen da",
- "Could not rename file" : "Ezin izan da fitxategia berrizendatu",
- "Could not create file" : "Ezin izan da fitxategia sortu",
- "Could not create folder" : "Ezin izan da karpeta sortu",
- "Error deleting file." : "Errorea fitxategia ezabatzerakoan.",
"No entries in this folder match '{filter}'" : "Karpeta honetan ez dago sarrerarik '{filter}' iragazkiarekin bat egiten dutenak",
"Name" : "Izena",
"Size" : "Tamaina",
@@ -66,10 +52,9 @@
"Your storage is almost full ({usedSpacePercent}%)" : "Zure biltegiratzea nahiko beterik dago (%{usedSpacePercent})",
"Favorited" : "Gogokoa",
"Favorite" : "Gogokoa",
- "Upload" : "Igo",
- "Text file" : "Testu fitxategia",
"Folder" : "Karpeta",
"New folder" : "Karpeta berria",
+ "Upload" : "Igo",
"A new file or folder has been <strong>created</strong>" : "Fitxategi edo karpeta berri bat <strong>sortu da</strong>",
"A file or folder has been <strong>changed</strong>" : "Fitxategi edo karpeta bat <strong>aldatu da</strong>",
"A file or folder has been <strong>deleted</strong>" : "Fitxategi edo karpeta bat <strong>ezabatu da</strong>",
@@ -83,8 +68,6 @@
"%2$s deleted %1$s" : "%2$sk ezabatuta %1$s",
"You restored %1$s" : "Zuk %1$s berrezarri duzu",
"%2$s restored %1$s" : "%2$sk %1$s berrezarri du",
- "%s could not be renamed as it has been deleted" : "%s ezin izan da berrizendatu ezabatua zegoen eta",
- "%s could not be renamed" : "%s ezin da berrizendatu",
"Upload (max. %s)" : "Igo (max. %s)",
"File handling" : "Fitxategien kudeaketa",
"Maximum upload size" : "Igo daitekeen gehienezko tamaina",
@@ -102,6 +85,7 @@
"Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
"Currently scanning" : "Eskaneatzen une honetan",
"No favorites" : "Gogokorik ez",
- "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira"
+ "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira",
+ "Text file" : "Testu fitxategia"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js
index b053d4af79b..46cbbc376ab 100644
--- a/apps/files/l10n/fa.js
+++ b/apps/files/l10n/fa.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "فضای ذخیره سازی موجود نیست",
"Storage invalid" : "فضای ذخیره‌سازی نامعتبر",
"Unknown error" : "خطای نامشخص",
- "Could not move %s - File with this name already exists" : "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ",
- "Could not move %s" : "%s نمی تواند حرکت کند ",
- "Permission denied" : "رد دسترسی",
- "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 مورد استفاده قرار گرفته شده است. لطفا نام دیگری انتخاب کنید.",
- "Error when creating the file" : "خطا در حین ایجاد فایل",
- "Error when creating the folder" : "خطا در حین ایجاد پوشه",
"Unable to set upload directory." : "قادر به تنظیم پوشه آپلود نمی باشد.",
"Invalid Token" : "رمز نامعتبر",
"No file was uploaded. Unknown error" : "هیچ فایلی آپلود نشد.خطای ناشناس",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "یک پوشه موقت گم شده",
"Failed to write to disk" : "نوشتن بر روی دیسک سخت ناموفق بود",
"Not enough storage available" : "فضای کافی در دسترس نیست",
+ "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.",
"Upload failed. Could not find uploaded file" : "خطا در آپلود. امکان یافتن فایل‌های آپلود شده وجود ندارد",
"Upload failed. Could not get file info." : "خطای آپلود. امکان دریافت جزئیات فایل وجود ندارد.",
"Invalid directory." : "فهرست راهنما نامعتبر می باشد.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "موارد محبوب",
"Home" : "خانه",
"Close" : "بستن",
+ "Upload cancelled." : "بار گذاری لغو شد",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشه‌ای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد",
"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." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ",
"Actions" : "فعالیت ها",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "امکان تعیین تاریخ وجود ندارد",
"This operation is forbidden" : "این عملیات غیرمجاز است",
"This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید",
- "Error moving file." : "خطا در انتقال فایل.",
- "Error moving file" : "خطا در انتقال فایل",
- "Error" : "خطا",
- "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.",
- "Could not rename file" : "امکان تغییر نام وجود ندارد",
- "Could not create file" : "امکان ایجاد فایل وجود ندارد",
- "Could not create folder" : "امکان ایجاد پوشه وجود ندارد",
- "Error deleting file." : "خطا در حذف فایل.",
"No entries in this folder match '{filter}'" : "هیچ ورودی‌ای با '{filter}' تطبیق ندارد",
"Name" : "نام",
"Size" : "اندازه",
@@ -75,11 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n بایت"],
"Favorited" : "برگزیده شده",
"Favorite" : "برگزیده",
- "{newname} already exists" : "{newname} هم‌اکنون وجود دارد",
- "Upload" : "بارگزاری",
- "Text file" : "فایل متنی",
"Folder" : "پوشه",
"New folder" : "پوشه جدید",
+ "{newname} already exists" : "{newname} هم‌اکنون وجود دارد",
+ "Upload" : "بارگزاری",
"An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است",
"A new file or folder has been <strong>created</strong>" : "فایل یا پوشه ای <strong>ایجاد</strong> شد",
"A file or folder has been <strong>changed</strong>" : "فایل یا پوشه ای به <strong>تغییر</strong> یافت",
@@ -97,14 +82,11 @@ OC.L10N.register(
"Changed by %2$s" : "تغییریافته توسط %2$s",
"Deleted by %2$s" : "حذف شده توسط %2$s",
"Restored by %2$s" : "بازگردانی شده توسط %2$s",
- "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد",
- "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.",
"Upload (max. %s)" : "آپلود (بیشترین سایز %s)",
"File handling" : "اداره پرونده ها",
"Maximum upload size" : "حداکثر اندازه بارگزاری",
"max. possible: " : "حداکثرمقدارممکن:",
"Save" : "ذخیره",
- "Can not be edited from here due to insufficient permissions." : "با توجه به دسترسی محدود، امکان ویرایش از اینجا وجود ندارد.",
"Settings" : "تنظیمات",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید</a>",
@@ -118,6 +100,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید",
"Currently scanning" : "در حال اسکن",
"No favorites" : "هیچ برگزیده",
- "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود"
+ "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
+ "Text file" : "فایل متنی"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json
index 0f745e7f243..b9e32d69e37 100644
--- a/apps/files/l10n/fa.json
+++ b/apps/files/l10n/fa.json
@@ -2,13 +2,6 @@
"Storage not available" : "فضای ذخیره سازی موجود نیست",
"Storage invalid" : "فضای ذخیره‌سازی نامعتبر",
"Unknown error" : "خطای نامشخص",
- "Could not move %s - File with this name already exists" : "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ",
- "Could not move %s" : "%s نمی تواند حرکت کند ",
- "Permission denied" : "رد دسترسی",
- "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 مورد استفاده قرار گرفته شده است. لطفا نام دیگری انتخاب کنید.",
- "Error when creating the file" : "خطا در حین ایجاد فایل",
- "Error when creating the folder" : "خطا در حین ایجاد پوشه",
"Unable to set upload directory." : "قادر به تنظیم پوشه آپلود نمی باشد.",
"Invalid Token" : "رمز نامعتبر",
"No file was uploaded. Unknown error" : "هیچ فایلی آپلود نشد.خطای ناشناس",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "یک پوشه موقت گم شده",
"Failed to write to disk" : "نوشتن بر روی دیسک سخت ناموفق بود",
"Not enough storage available" : "فضای کافی در دسترس نیست",
+ "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.",
"Upload failed. Could not find uploaded file" : "خطا در آپلود. امکان یافتن فایل‌های آپلود شده وجود ندارد",
"Upload failed. Could not get file info." : "خطای آپلود. امکان دریافت جزئیات فایل وجود ندارد.",
"Invalid directory." : "فهرست راهنما نامعتبر می باشد.",
@@ -28,10 +22,10 @@
"Favorites" : "موارد محبوب",
"Home" : "خانه",
"Close" : "بستن",
+ "Upload cancelled." : "بار گذاری لغو شد",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشه‌ای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد",
"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." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ",
"Actions" : "فعالیت ها",
@@ -44,14 +38,6 @@
"Unable to determine date" : "امکان تعیین تاریخ وجود ندارد",
"This operation is forbidden" : "این عملیات غیرمجاز است",
"This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید",
- "Error moving file." : "خطا در انتقال فایل.",
- "Error moving file" : "خطا در انتقال فایل",
- "Error" : "خطا",
- "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.",
- "Could not rename file" : "امکان تغییر نام وجود ندارد",
- "Could not create file" : "امکان ایجاد فایل وجود ندارد",
- "Could not create folder" : "امکان ایجاد پوشه وجود ندارد",
- "Error deleting file." : "خطا در حذف فایل.",
"No entries in this folder match '{filter}'" : "هیچ ورودی‌ای با '{filter}' تطبیق ندارد",
"Name" : "نام",
"Size" : "اندازه",
@@ -73,11 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n بایت"],
"Favorited" : "برگزیده شده",
"Favorite" : "برگزیده",
- "{newname} already exists" : "{newname} هم‌اکنون وجود دارد",
- "Upload" : "بارگزاری",
- "Text file" : "فایل متنی",
"Folder" : "پوشه",
"New folder" : "پوشه جدید",
+ "{newname} already exists" : "{newname} هم‌اکنون وجود دارد",
+ "Upload" : "بارگزاری",
"An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است",
"A new file or folder has been <strong>created</strong>" : "فایل یا پوشه ای <strong>ایجاد</strong> شد",
"A file or folder has been <strong>changed</strong>" : "فایل یا پوشه ای به <strong>تغییر</strong> یافت",
@@ -95,14 +80,11 @@
"Changed by %2$s" : "تغییریافته توسط %2$s",
"Deleted by %2$s" : "حذف شده توسط %2$s",
"Restored by %2$s" : "بازگردانی شده توسط %2$s",
- "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد",
- "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.",
"Upload (max. %s)" : "آپلود (بیشترین سایز %s)",
"File handling" : "اداره پرونده ها",
"Maximum upload size" : "حداکثر اندازه بارگزاری",
"max. possible: " : "حداکثرمقدارممکن:",
"Save" : "ذخیره",
- "Can not be edited from here due to insufficient permissions." : "با توجه به دسترسی محدود، امکان ویرایش از اینجا وجود ندارد.",
"Settings" : "تنظیمات",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید</a>",
@@ -116,6 +98,7 @@
"Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید",
"Currently scanning" : "در حال اسکن",
"No favorites" : "هیچ برگزیده",
- "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود"
+ "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
+ "Text file" : "فایل متنی"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js
index cf4bb0f5792..8bebb81fd35 100644
--- a/apps/files/l10n/fi_FI.js
+++ b/apps/files/l10n/fi_FI.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Tallennustila ei ole käytettävissä",
"Storage invalid" : "Virheellinen tallennustila",
"Unknown error" : "Tuntematon virhe",
- "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",
- "Permission denied" : "Ei käyttöoikeutta",
- "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.",
- "Error when creating the file" : "Virhe tiedostoa luotaessa",
- "Error when creating the folder" : "Virhe kansiota luotaessa",
"Unable to set upload directory." : "Lähetyskansion asettaminen epäonnistui.",
"Invalid Token" : "Virheellinen token",
"No file was uploaded. Unknown error" : "Tiedostoa ei lähetetty. Tuntematon virhe",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Tilapäiskansio puuttuu",
"Failed to write to disk" : "Levylle kirjoitus epäonnistui",
"Not enough storage available" : "Tallennustilaa ei ole riittävästi käytettävissä",
+ "The target folder has been moved or deleted." : "Kohdekansio on siirretty tai poistettu.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Suosikit",
"Home" : "Koti",
"Close" : "Sulje",
+ "Upload cancelled." : "Lähetys peruttu.",
"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",
"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.",
"Actions" : "Toiminnot",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Päivämäärän määrittäminen epäonnistui",
"This operation is forbidden" : "Tämä toiminto on kielletty",
"This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.",
- "Error moving file." : "Virhe tiedostoa siirrettäessä.",
- "Error moving file" : "Virhe tiedostoa siirrettäessä",
- "Error" : "Virhe",
- "{new_name} already exists" : "{new_name} on jo olemassa",
- "Could not rename file" : "Tiedoston nimeäminen uudelleen epäonnistui",
- "Could not create file" : "Tiedoston luominen epäonnistui",
- "Could not create folder" : "Kansion luominen epäonnistui",
- "Error deleting file." : "Virhe tiedostoa poistaessa.",
+ "Could not move \"{file}\", target exists" : "Tiedoston \"{file}\" siirtäminen ei onnistunut, kohde on olemassa",
+ "Could not move \"{file}\"" : "Tiedoston \"{file}\" siirtäminen ei onnistunut",
+ "{newName} already exists" : "{newName} on jo olemassa",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut, koska sitä ei ole enää olemassa",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.",
+ "Could not rename \"{fileName}\"" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut",
+ "Could not create file \"{file}\"" : "Tiedostoa \"{file}\" ei voitu luoda",
+ "Could not create file \"{file}\" because it already exists" : "Tiedostoa \"{file}\" ei voitu luoda, koska se on jo olemassa",
+ "Could not create folder \"{dir}\"" : "Kansiota \"{dir}\" ei voitu luoda",
+ "Could not create folder \"{dir}\" because it already exists" : "Kansiota \"{dir}\" ei voitu luoda, koska se on jo olemassa",
+ "Error deleting file \"{fileName}\"." : "Virhe poistaessa tiedostoa \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'",
"Name" : "Nimi",
"Size" : "Koko",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"],
"Favorited" : "Lisätty suosikkeihin",
"Favorite" : "Suosikki",
- "{newname} already exists" : "{newname} on jo olemassa",
- "Upload" : "Lähetä",
- "Text file" : "Tekstitiedosto",
- "New text file.txt" : "Uusi tekstitiedosto.txt",
"Folder" : "Kansio",
"New folder" : "Uusi kansio",
+ "{newname} already exists" : "{newname} on jo olemassa",
+ "Upload" : "Lähetä",
"An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe",
"A new file or folder has been <strong>created</strong>" : "Uusi tiedosto tai kansio on <strong>luotu</strong>",
"A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "Muuttanut %2$s",
"Deleted by %2$s" : "Poistanut %2$s",
"Restored by %2$s" : "Palauttanut %2$s",
- "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu",
- "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui",
"Upload (max. %s)" : "Lähetys (enintään %s)",
"File handling" : "Tiedostonhallinta",
"Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko",
"max. possible: " : "suurin mahdollinen:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM:n ollessa käytössä tämän arvon tuleminen voimaan saattaa kestää viisi minuuttia tallennushetkestä.",
"Save" : "Tallenna",
- "Can not be edited from here due to insufficient permissions." : "Ei muokattavissa täällä puutteellisten oikeuksien vuoksi.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM:tä käyttäen muutoksien voimaantulossa saattaa kestää 5 minuuttia.",
+ "Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.",
"Settings" : "Asetukset",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAVin kautta</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.",
"Currently scanning" : "Tutkitaan parhaillaan",
"No favorites" : "Ei suosikkeja",
- "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä"
+ "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
+ "Text file" : "Tekstitiedosto",
+ "New text file.txt" : "Uusi tekstitiedosto.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json
index 56417b3c74d..64b0a886b73 100644
--- a/apps/files/l10n/fi_FI.json
+++ b/apps/files/l10n/fi_FI.json
@@ -2,13 +2,6 @@
"Storage not available" : "Tallennustila ei ole käytettävissä",
"Storage invalid" : "Virheellinen tallennustila",
"Unknown error" : "Tuntematon virhe",
- "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",
- "Permission denied" : "Ei käyttöoikeutta",
- "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.",
- "Error when creating the file" : "Virhe tiedostoa luotaessa",
- "Error when creating the folder" : "Virhe kansiota luotaessa",
"Unable to set upload directory." : "Lähetyskansion asettaminen epäonnistui.",
"Invalid Token" : "Virheellinen token",
"No file was uploaded. Unknown error" : "Tiedostoa ei lähetetty. Tuntematon virhe",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Tilapäiskansio puuttuu",
"Failed to write to disk" : "Levylle kirjoitus epäonnistui",
"Not enough storage available" : "Tallennustilaa ei ole riittävästi käytettävissä",
+ "The target folder has been moved or deleted." : "Kohdekansio on siirretty tai poistettu.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Suosikit",
"Home" : "Koti",
"Close" : "Sulje",
+ "Upload cancelled." : "Lähetys peruttu.",
"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",
"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.",
"Actions" : "Toiminnot",
@@ -44,14 +38,17 @@
"Unable to determine date" : "Päivämäärän määrittäminen epäonnistui",
"This operation is forbidden" : "Tämä toiminto on kielletty",
"This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.",
- "Error moving file." : "Virhe tiedostoa siirrettäessä.",
- "Error moving file" : "Virhe tiedostoa siirrettäessä",
- "Error" : "Virhe",
- "{new_name} already exists" : "{new_name} on jo olemassa",
- "Could not rename file" : "Tiedoston nimeäminen uudelleen epäonnistui",
- "Could not create file" : "Tiedoston luominen epäonnistui",
- "Could not create folder" : "Kansion luominen epäonnistui",
- "Error deleting file." : "Virhe tiedostoa poistaessa.",
+ "Could not move \"{file}\", target exists" : "Tiedoston \"{file}\" siirtäminen ei onnistunut, kohde on olemassa",
+ "Could not move \"{file}\"" : "Tiedoston \"{file}\" siirtäminen ei onnistunut",
+ "{newName} already exists" : "{newName} on jo olemassa",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut, koska sitä ei ole enää olemassa",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.",
+ "Could not rename \"{fileName}\"" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut",
+ "Could not create file \"{file}\"" : "Tiedostoa \"{file}\" ei voitu luoda",
+ "Could not create file \"{file}\" because it already exists" : "Tiedostoa \"{file}\" ei voitu luoda, koska se on jo olemassa",
+ "Could not create folder \"{dir}\"" : "Kansiota \"{dir}\" ei voitu luoda",
+ "Could not create folder \"{dir}\" because it already exists" : "Kansiota \"{dir}\" ei voitu luoda, koska se on jo olemassa",
+ "Error deleting file \"{fileName}\"." : "Virhe poistaessa tiedostoa \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'",
"Name" : "Nimi",
"Size" : "Koko",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"],
"Favorited" : "Lisätty suosikkeihin",
"Favorite" : "Suosikki",
- "{newname} already exists" : "{newname} on jo olemassa",
- "Upload" : "Lähetä",
- "Text file" : "Tekstitiedosto",
- "New text file.txt" : "Uusi tekstitiedosto.txt",
"Folder" : "Kansio",
"New folder" : "Uusi kansio",
+ "{newname} already exists" : "{newname} on jo olemassa",
+ "Upload" : "Lähetä",
"An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe",
"A new file or folder has been <strong>created</strong>" : "Uusi tiedosto tai kansio on <strong>luotu</strong>",
"A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "Muuttanut %2$s",
"Deleted by %2$s" : "Poistanut %2$s",
"Restored by %2$s" : "Palauttanut %2$s",
- "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu",
- "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui",
"Upload (max. %s)" : "Lähetys (enintään %s)",
"File handling" : "Tiedostonhallinta",
"Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko",
"max. possible: " : "suurin mahdollinen:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM:n ollessa käytössä tämän arvon tuleminen voimaan saattaa kestää viisi minuuttia tallennushetkestä.",
"Save" : "Tallenna",
- "Can not be edited from here due to insufficient permissions." : "Ei muokattavissa täällä puutteellisten oikeuksien vuoksi.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM:tä käyttäen muutoksien voimaantulossa saattaa kestää 5 minuuttia.",
+ "Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.",
"Settings" : "Asetukset",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAVin kautta</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.",
"Currently scanning" : "Tutkitaan parhaillaan",
"No favorites" : "Ei suosikkeja",
- "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä"
+ "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
+ "Text file" : "Tekstitiedosto",
+ "New text file.txt" : "Uusi tekstitiedosto.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 0b290eb160a..6af58e93094 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Support de stockage non disponible",
"Storage invalid" : "Support de stockage non valable",
"Unknown error" : "Erreur Inconnue ",
- "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier portant ce nom existe déjà",
- "Could not move %s" : "Impossible de déplacer %s",
- "Permission denied" : "Permission refusée",
- "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.",
- "Error when creating the file" : "Erreur pendant la création du fichier",
- "Error when creating the folder" : "Erreur pendant la création du dossier",
"Unable to set upload directory." : "Impossible de définir le dossier de destination.",
"Invalid Token" : "Jeton non valide",
"No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Absence de dossier temporaire",
"Failed to write to disk" : "Erreur d'écriture sur le disque",
"Not enough storage available" : "Trop peu d'espace de stockage disponible",
+ "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.",
"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 non valide.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoris",
"Home" : "Mes fichiers",
"Close" : "Fermer",
+ "Upload cancelled." : "Envoi annulé.",
"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",
"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 libre 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.",
"Actions" : "Actions",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Impossible de déterminer la date",
"This operation is forbidden" : "Cette opération est interdite",
"This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur",
- "Error moving file." : "Erreur lors du déplacement du fichier.",
- "Error moving file" : "Erreur lors du déplacement du fichier",
- "Error" : "Erreur",
- "{new_name} already exists" : "{new_name} existe déjà",
- "Could not rename file" : "Impossible de renommer le fichier",
- "Could not create file" : "Impossible de créer le fichier",
- "Could not create folder" : "Impossible de créer le dossier",
- "Error deleting file." : "Erreur pendant la suppression du fichier.",
+ "Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe",
+ "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
+ "{newName} already exists" : "{newName} existe déjà",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renommer \"{file}\", il n'existe plus",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{targetName}\" est déjà utilisé dans le dossier \"{dir}\". Merci de choisir un nom différent.",
+ "Could not rename \"{fileName}\"" : "Impossible de renommer \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Impossible de créer le fichier \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà",
+ "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà",
+ "Error deleting file \"{fileName}\"." : "Erreur pendant la suppression du fichier \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Aucune entrée de ce dossier ne correspond à '{filter}'",
"Name" : "Nom",
"Size" : "Taille",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
"Favorited" : "Marqué comme favori",
"Favorite" : "Favoris",
- "{newname} already exists" : "{newname} existe déjà",
- "Upload" : "Chargement",
- "Text file" : "Fichier texte",
- "New text file.txt" : "Nouveau fichier texte.txt",
"Folder" : "Dossier",
"New folder" : "Nouveau dossier",
+ "{newname} already exists" : "{newname} existe déjà",
+ "Upload" : "Chargement",
"An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes",
"A new file or folder has been <strong>created</strong>" : "Un nouveau fichier ou répertoire a été <strong>créé</strong>",
"A file or folder has been <strong>changed</strong>" : "Un fichier ou un répertoire a été <strong>modifié</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "Modifié par %2$s",
"Deleted by %2$s" : "Supprimé par %2$s",
"Restored by %2$s" : "Restauré par %2$s",
- "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ",
- "%s could not be renamed" : "%s ne peut être renommé",
"Upload (max. %s)" : "Envoi (max. %s)",
"File handling" : "Gestion de fichiers",
"Maximum upload size" : "Taille max. d'envoi",
"max. possible: " : "Max. possible :",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Avec PHP-FPM, il peut se passer jusqu'à 5 minutes avant que cette valeur ne soit appliquée.",
"Save" : "Sauvegarder",
- "Can not be edited from here due to insufficient permissions." : "Ne peut être modifié ici à cause de permissions insuffisantes.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Avec PHP-FPM il peut se passer 5 minutes pour que les changements soient appliqués.",
+ "Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.",
"Currently scanning" : "Analyse en cours",
"No favorites" : "Aucun favori",
- "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici"
+ "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici",
+ "Text file" : "Fichier texte",
+ "New text file.txt" : "Nouveau fichier texte.txt"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 5f51bdee302..ba25b77e3df 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -2,13 +2,6 @@
"Storage not available" : "Support de stockage non disponible",
"Storage invalid" : "Support de stockage non valable",
"Unknown error" : "Erreur Inconnue ",
- "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier portant ce nom existe déjà",
- "Could not move %s" : "Impossible de déplacer %s",
- "Permission denied" : "Permission refusée",
- "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.",
- "Error when creating the file" : "Erreur pendant la création du fichier",
- "Error when creating the folder" : "Erreur pendant la création du dossier",
"Unable to set upload directory." : "Impossible de définir le dossier de destination.",
"Invalid Token" : "Jeton non valide",
"No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Absence de dossier temporaire",
"Failed to write to disk" : "Erreur d'écriture sur le disque",
"Not enough storage available" : "Trop peu d'espace de stockage disponible",
+ "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.",
"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 non valide.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoris",
"Home" : "Mes fichiers",
"Close" : "Fermer",
+ "Upload cancelled." : "Envoi annulé.",
"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",
"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 libre 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.",
"Actions" : "Actions",
@@ -44,14 +38,17 @@
"Unable to determine date" : "Impossible de déterminer la date",
"This operation is forbidden" : "Cette opération est interdite",
"This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur",
- "Error moving file." : "Erreur lors du déplacement du fichier.",
- "Error moving file" : "Erreur lors du déplacement du fichier",
- "Error" : "Erreur",
- "{new_name} already exists" : "{new_name} existe déjà",
- "Could not rename file" : "Impossible de renommer le fichier",
- "Could not create file" : "Impossible de créer le fichier",
- "Could not create folder" : "Impossible de créer le dossier",
- "Error deleting file." : "Erreur pendant la suppression du fichier.",
+ "Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe",
+ "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
+ "{newName} already exists" : "{newName} existe déjà",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renommer \"{file}\", il n'existe plus",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{targetName}\" est déjà utilisé dans le dossier \"{dir}\". Merci de choisir un nom différent.",
+ "Could not rename \"{fileName}\"" : "Impossible de renommer \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Impossible de créer le fichier \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà",
+ "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà",
+ "Error deleting file \"{fileName}\"." : "Erreur pendant la suppression du fichier \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Aucune entrée de ce dossier ne correspond à '{filter}'",
"Name" : "Nom",
"Size" : "Taille",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
"Favorited" : "Marqué comme favori",
"Favorite" : "Favoris",
- "{newname} already exists" : "{newname} existe déjà",
- "Upload" : "Chargement",
- "Text file" : "Fichier texte",
- "New text file.txt" : "Nouveau fichier texte.txt",
"Folder" : "Dossier",
"New folder" : "Nouveau dossier",
+ "{newname} already exists" : "{newname} existe déjà",
+ "Upload" : "Chargement",
"An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes",
"A new file or folder has been <strong>created</strong>" : "Un nouveau fichier ou répertoire a été <strong>créé</strong>",
"A file or folder has been <strong>changed</strong>" : "Un fichier ou un répertoire a été <strong>modifié</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "Modifié par %2$s",
"Deleted by %2$s" : "Supprimé par %2$s",
"Restored by %2$s" : "Restauré par %2$s",
- "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ",
- "%s could not be renamed" : "%s ne peut être renommé",
"Upload (max. %s)" : "Envoi (max. %s)",
"File handling" : "Gestion de fichiers",
"Maximum upload size" : "Taille max. d'envoi",
"max. possible: " : "Max. possible :",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Avec PHP-FPM, il peut se passer jusqu'à 5 minutes avant que cette valeur ne soit appliquée.",
"Save" : "Sauvegarder",
- "Can not be edited from here due to insufficient permissions." : "Ne peut être modifié ici à cause de permissions insuffisantes.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Avec PHP-FPM il peut se passer 5 minutes pour que les changements soient appliqués.",
+ "Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.",
"Currently scanning" : "Analyse en cours",
"No favorites" : "Aucun favori",
- "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici"
+ "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici",
+ "Text file" : "Fichier texte",
+ "New text file.txt" : "Nouveau fichier texte.txt"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index 2910ab97ea4..3b71b1669e7 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Almacenamento non dispoñíbel",
"Storage invalid" : "Almacenamento incorrecto",
"Unknown error" : "Produciuse un erro descoñecido",
- "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",
- "Permission denied" : "Permiso denegado",
- "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.",
- "Error when creating the file" : "Produciuse un erro ao crear o ficheiro",
- "Error when creating the folder" : "Produciuse un erro ao crear o cartafol",
"Unable to set upload directory." : "Non é posíbel configurar o directorio de envíos.",
"Invalid Token" : "Marca incorrecta",
"No file was uploaded. Unknown error" : "Non se enviou ningún ficheiro. Produciuse un erro descoñecido.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "O cartafol de destino foi movido ou eliminado.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoritos",
"Home" : "Inicio",
"Close" : "Pechar",
+ "Upload cancelled." : "Envío cancelado.",
"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",
"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.",
"Actions" : "Accións",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Non é posíbel determinar a data",
"This operation is forbidden" : "Esta operación está prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador",
- "Error moving file." : "Produciuse un erro ao mover o ficheiro.",
- "Error moving file" : "Produciuse un erro ao mover o ficheiro",
- "Error" : "Erro",
- "{new_name} already exists" : "Xa existe un {new_name}",
- "Could not rename file" : "Non foi posíbel renomear o ficheiro",
- "Could not create file" : "Non foi posíbel crear o ficheiro",
- "Could not create folder" : "Non foi posíbel crear o cartafol",
- "Error deleting file." : "Produciuse un erro ao eliminar o ficheiro.",
"No entries in this folder match '{filter}'" : "Non hai entradas neste cartafol coincidentes con «{filter}»",
"Name" : "Nome",
"Size" : "Tamaño",
@@ -75,10 +61,9 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Marcado como favorito",
"Favorite" : "Favorito",
- "Upload" : "Enviar",
- "Text file" : "Ficheiro de texto",
"Folder" : "Cartafol",
"New folder" : "Novo cartafol",
+ "Upload" : "Enviar",
"An error occurred while trying to update the tags" : "Produciuse un erro ao tentar actualizar as etiquetas",
"A new file or folder has been <strong>created</strong>" : "<strong>Creouse</strong> un novo ficheiro ou cartafol",
"A file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol",
@@ -94,14 +79,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s eliminado %1$s",
"You restored %1$s" : "Vostede restaurou %1$s",
"%2$s restored %1$s" : "%2$s restaurou %1$s",
- "%s could not be renamed as it has been deleted" : "Non é posíbel renomear %s xa que foi eliminado",
- "%s could not be renamed" : "%s non pode cambiar de nome",
"Upload (max. %s)" : "Envío (máx. %s)",
"File handling" : "Manexo de ficheiro",
"Maximum upload size" : "Tamaño máximo do envío",
"max. possible: " : "máx. posíbel: ",
"Save" : "Gardar",
- "Can not be edited from here due to insufficient permissions." : "Non pode ser editado desde aquí por mor de falta de permisos.",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Empregue esta ligazón para <a href=\"%s\" target=\"_blank\">acceder aos seus ficheiros mediante WebDAV</a>",
@@ -115,6 +97,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.",
"Currently scanning" : "Análise actual",
"No favorites" : "Non hai favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí"
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí",
+ "Text file" : "Ficheiro de texto"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index 386df1569a9..73e6e523e44 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -2,13 +2,6 @@
"Storage not available" : "Almacenamento non dispoñíbel",
"Storage invalid" : "Almacenamento incorrecto",
"Unknown error" : "Produciuse un erro descoñecido",
- "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",
- "Permission denied" : "Permiso denegado",
- "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.",
- "Error when creating the file" : "Produciuse un erro ao crear o ficheiro",
- "Error when creating the folder" : "Produciuse un erro ao crear o cartafol",
"Unable to set upload directory." : "Non é posíbel configurar o directorio de envíos.",
"Invalid Token" : "Marca incorrecta",
"No file was uploaded. Unknown error" : "Non se enviou ningún ficheiro. Produciuse un erro descoñecido.",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "O cartafol de destino foi movido ou eliminado.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoritos",
"Home" : "Inicio",
"Close" : "Pechar",
+ "Upload cancelled." : "Envío cancelado.",
"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",
"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.",
"Actions" : "Accións",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Non é posíbel determinar a data",
"This operation is forbidden" : "Esta operación está prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador",
- "Error moving file." : "Produciuse un erro ao mover o ficheiro.",
- "Error moving file" : "Produciuse un erro ao mover o ficheiro",
- "Error" : "Erro",
- "{new_name} already exists" : "Xa existe un {new_name}",
- "Could not rename file" : "Non foi posíbel renomear o ficheiro",
- "Could not create file" : "Non foi posíbel crear o ficheiro",
- "Could not create folder" : "Non foi posíbel crear o cartafol",
- "Error deleting file." : "Produciuse un erro ao eliminar o ficheiro.",
"No entries in this folder match '{filter}'" : "Non hai entradas neste cartafol coincidentes con «{filter}»",
"Name" : "Nome",
"Size" : "Tamaño",
@@ -73,10 +59,9 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Marcado como favorito",
"Favorite" : "Favorito",
- "Upload" : "Enviar",
- "Text file" : "Ficheiro de texto",
"Folder" : "Cartafol",
"New folder" : "Novo cartafol",
+ "Upload" : "Enviar",
"An error occurred while trying to update the tags" : "Produciuse un erro ao tentar actualizar as etiquetas",
"A new file or folder has been <strong>created</strong>" : "<strong>Creouse</strong> un novo ficheiro ou cartafol",
"A file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol",
@@ -92,14 +77,11 @@
"%2$s deleted %1$s" : "%2$s eliminado %1$s",
"You restored %1$s" : "Vostede restaurou %1$s",
"%2$s restored %1$s" : "%2$s restaurou %1$s",
- "%s could not be renamed as it has been deleted" : "Non é posíbel renomear %s xa que foi eliminado",
- "%s could not be renamed" : "%s non pode cambiar de nome",
"Upload (max. %s)" : "Envío (máx. %s)",
"File handling" : "Manexo de ficheiro",
"Maximum upload size" : "Tamaño máximo do envío",
"max. possible: " : "máx. posíbel: ",
"Save" : "Gardar",
- "Can not be edited from here due to insufficient permissions." : "Non pode ser editado desde aquí por mor de falta de permisos.",
"Settings" : "Axustes",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Empregue esta ligazón para <a href=\"%s\" target=\"_blank\">acceder aos seus ficheiros mediante WebDAV</a>",
@@ -113,6 +95,7 @@
"Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.",
"Currently scanning" : "Análise actual",
"No favorites" : "Non hai favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí"
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí",
+ "Text file" : "Ficheiro de texto"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js
index 1eaf54aad71..389fe8e4d2c 100644
--- a/apps/files/l10n/he.js
+++ b/apps/files/l10n/he.js
@@ -2,8 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "שגיאה בלתי ידועה",
- "Could not move %s - File with this name already exists" : "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים",
- "Could not move %s" : "לא ניתן להעביר את %s",
"No file was uploaded. Unknown error" : "לא הועלה קובץ. טעות בלתי מזוהה.",
"There is no error, the file uploaded with success" : "לא התרחשה שגיאה, הקובץ הועלה בהצלחה",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:",
@@ -29,8 +27,6 @@ OC.L10N.register(
"Details" : "פרטים",
"Select" : "בחר",
"Pending" : "ממתין",
- "Error" : "שגיאה",
- "{new_name} already exists" : "{new_name} כבר קיים",
"Name" : "שם",
"Size" : "גודל",
"Modified" : "זמן שינוי",
@@ -38,10 +34,9 @@ OC.L10N.register(
"File name cannot be empty." : "שם קובץ אינו יכול להיות ריק",
"Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)",
"Favorite" : "מועדף",
- "Upload" : "העלאה",
- "Text file" : "קובץ טקסט",
"Folder" : "תיקייה",
"New folder" : "תיקייה חדשה",
+ "Upload" : "העלאה",
"A new file or folder has been <strong>created</strong>" : "קובץ או תיקייה חדשים <strong>נוצרו<strong/>",
"A file or folder has been <strong>changed</strong>" : "קובץ או תיקייה <strong>שונו<strong/>",
"A file or folder has been <strong>deleted</strong>" : "קובץ או תיקייה <strong>נמחקו<strong/>",
@@ -62,6 +57,7 @@ OC.L10N.register(
"Cancel upload" : "ביטול ההעלאה",
"Upload too large" : "העלאה גדולה מידי",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
- "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין."
+ "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין.",
+ "Text file" : "קובץ טקסט"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json
index fe56eef25c2..c4866aea3c0 100644
--- a/apps/files/l10n/he.json
+++ b/apps/files/l10n/he.json
@@ -1,7 +1,5 @@
{ "translations": {
"Unknown error" : "שגיאה בלתי ידועה",
- "Could not move %s - File with this name already exists" : "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים",
- "Could not move %s" : "לא ניתן להעביר את %s",
"No file was uploaded. Unknown error" : "לא הועלה קובץ. טעות בלתי מזוהה.",
"There is no error, the file uploaded with success" : "לא התרחשה שגיאה, הקובץ הועלה בהצלחה",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:",
@@ -27,8 +25,6 @@
"Details" : "פרטים",
"Select" : "בחר",
"Pending" : "ממתין",
- "Error" : "שגיאה",
- "{new_name} already exists" : "{new_name} כבר קיים",
"Name" : "שם",
"Size" : "גודל",
"Modified" : "זמן שינוי",
@@ -36,10 +32,9 @@
"File name cannot be empty." : "שם קובץ אינו יכול להיות ריק",
"Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)",
"Favorite" : "מועדף",
- "Upload" : "העלאה",
- "Text file" : "קובץ טקסט",
"Folder" : "תיקייה",
"New folder" : "תיקייה חדשה",
+ "Upload" : "העלאה",
"A new file or folder has been <strong>created</strong>" : "קובץ או תיקייה חדשים <strong>נוצרו<strong/>",
"A file or folder has been <strong>changed</strong>" : "קובץ או תיקייה <strong>שונו<strong/>",
"A file or folder has been <strong>deleted</strong>" : "קובץ או תיקייה <strong>נמחקו<strong/>",
@@ -60,6 +55,7 @@
"Cancel upload" : "ביטול ההעלאה",
"Upload too large" : "העלאה גדולה מידי",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
- "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין."
+ "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין.",
+ "Text file" : "קובץ טקסט"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/hi.js b/apps/files/l10n/hi.js
index 2a546af9b1e..2de5b85e169 100644
--- a/apps/files/l10n/hi.js
+++ b/apps/files/l10n/hi.js
@@ -4,9 +4,8 @@ OC.L10N.register(
"Files" : "फाइलें ",
"Close" : "बंद करें ",
"Details" : "विवरण ",
- "Error" : "त्रुटि",
- "Upload" : "अपलोड ",
"New folder" : "नया फ़ोल्डर",
+ "Upload" : "अपलोड ",
"Save" : "सहेजें",
"Settings" : "सेटिंग्स"
},
diff --git a/apps/files/l10n/hi.json b/apps/files/l10n/hi.json
index 47830eca416..3bccaa2d9f0 100644
--- a/apps/files/l10n/hi.json
+++ b/apps/files/l10n/hi.json
@@ -2,9 +2,8 @@
"Files" : "फाइलें ",
"Close" : "बंद करें ",
"Details" : "विवरण ",
- "Error" : "त्रुटि",
- "Upload" : "अपलोड ",
"New folder" : "नया फ़ोल्डर",
+ "Upload" : "अपलोड ",
"Save" : "सहेजें",
"Settings" : "सेटिंग्स"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js
index d6e48d1da13..6f27879f125 100644
--- a/apps/files/l10n/hr.js
+++ b/apps/files/l10n/hr.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Pohrana nedostupna",
"Storage invalid" : "Pohrana neispravna",
"Unknown error" : "Nepoznata pogreška",
- "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji",
- "Could not move %s" : "Nemoguće premjestiti %s",
- "Permission denied" : "Nemate dozvolu",
- "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u mapi %s. Molimo odaberite drukčiji naziv.",
- "Error when creating the file" : "Pogreška pri kreiranju datoteke",
- "Error when creating the folder" : "Pogreška pri kreiranju mape",
"Unable to set upload directory." : "Postavka učitavanja direktorija nije moguća",
"Invalid Token" : "Neispravan token",
"No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Pogreška nepoznata.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Nedostaje privremena mapa",
"Failed to write to disk" : "Zapisivanje na disk nije uspjelo",
"Not enough storage available" : "Prostor za pohranu nedostatan",
+ "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.",
"Upload failed. Could not find uploaded file" : "Učitavanje neuspješno. Nije emoguće pronaći učitanu dataoteku",
"Upload failed. Could not get file info." : "Učitavanje neuspješno. Nije moguće dohvatiti informacije o datoteci",
"Invalid directory." : "Neispravan direktorij",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoriti",
"Home" : "Kuća",
"Close" : "Zatvorite",
+ "Upload cancelled." : "Učitavanje je prekinuto.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće učitati {filename} jer je ili direktorij ili ima 0 bajta",
"Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} premašuje ograničenje unosa {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo",
- "Upload cancelled." : "Učitavanje je prekinuto.",
"Could not get result from server." : "Nemoguće dobiti rezultat od poslužitelja.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Selektiraj",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemogucnost odredjivanja datuma",
- "Error moving file." : "Pogrešno premještanje datoteke",
- "Error moving file" : "Pogrešno premještanje datoteke",
- "Error" : "Pogreška",
- "{new_name} already exists" : "{new_name} već postoji",
- "Could not rename file" : "Datoteku nije moguće preimenovati",
- "Could not create file" : "Datoteku nije moguće kreirati",
- "Could not create folder" : "Mapu nije moguće kreirati",
- "Error deleting file." : "Pogrešno brisanje datoteke",
"No entries in this folder match '{filter}'" : "Nema zapisa u ovom folderu match '{filter}'",
"Name" : "Naziv",
"Size" : "Veličina",
@@ -68,10 +54,9 @@ OC.L10N.register(
"Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)",
"Favorited" : "Favoritovan",
"Favorite" : "Favorit",
- "Upload" : "Učitavanje",
- "Text file" : "Tekstualna datoteka",
"Folder" : "Mapa",
"New folder" : "Nova mapa",
+ "Upload" : "Učitavanje",
"A new file or folder has been <strong>created</strong>" : "Nova datoteka ili nova mapa su <strong>kreirani</strong>",
"A file or folder has been <strong>changed</strong>" : "Datoteka ili mapa su <strong>promijenjeni</strong>",
"A file or folder has been <strong>deleted</strong>" : "Datoteka ili mapa su <strong>izbrisani</strong>",
@@ -85,8 +70,6 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s je izbrisao %1$s",
"You restored %1$s" : "Vraćeno %1$s",
"%2$s restored %1$s" : "%2$s vraćeno %1$s",
- "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan",
- "%s could not be renamed" : "%s nije moguće preimenovati",
"Upload (max. %s)" : "Prijenos (max. %s)",
"File handling" : "Obrada datoteke",
"Maximum upload size" : "Maksimalna veličina učitanog sadržaja",
@@ -104,6 +87,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.",
"Currently scanning" : "Provjera u tijeku",
"No favorites" : "Nema favorita",
- "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje"
+ "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje",
+ "Text file" : "Tekstualna datoteka"
},
"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/hr.json b/apps/files/l10n/hr.json
index 99f7737b66c..9377b55ef6f 100644
--- a/apps/files/l10n/hr.json
+++ b/apps/files/l10n/hr.json
@@ -2,13 +2,6 @@
"Storage not available" : "Pohrana nedostupna",
"Storage invalid" : "Pohrana neispravna",
"Unknown error" : "Nepoznata pogreška",
- "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji",
- "Could not move %s" : "Nemoguće premjestiti %s",
- "Permission denied" : "Nemate dozvolu",
- "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u mapi %s. Molimo odaberite drukčiji naziv.",
- "Error when creating the file" : "Pogreška pri kreiranju datoteke",
- "Error when creating the folder" : "Pogreška pri kreiranju mape",
"Unable to set upload directory." : "Postavka učitavanja direktorija nije moguća",
"Invalid Token" : "Neispravan token",
"No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Pogreška nepoznata.",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Nedostaje privremena mapa",
"Failed to write to disk" : "Zapisivanje na disk nije uspjelo",
"Not enough storage available" : "Prostor za pohranu nedostatan",
+ "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.",
"Upload failed. Could not find uploaded file" : "Učitavanje neuspješno. Nije emoguće pronaći učitanu dataoteku",
"Upload failed. Could not get file info." : "Učitavanje neuspješno. Nije moguće dohvatiti informacije o datoteci",
"Invalid directory." : "Neispravan direktorij",
@@ -28,10 +22,10 @@
"Favorites" : "Favoriti",
"Home" : "Kuća",
"Close" : "Zatvorite",
+ "Upload cancelled." : "Učitavanje je prekinuto.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće učitati {filename} jer je ili direktorij ili ima 0 bajta",
"Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} premašuje ograničenje unosa {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo",
- "Upload cancelled." : "Učitavanje je prekinuto.",
"Could not get result from server." : "Nemoguće dobiti rezultat od poslužitelja.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
@@ -42,14 +36,6 @@
"Select" : "Selektiraj",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemogucnost odredjivanja datuma",
- "Error moving file." : "Pogrešno premještanje datoteke",
- "Error moving file" : "Pogrešno premještanje datoteke",
- "Error" : "Pogreška",
- "{new_name} already exists" : "{new_name} već postoji",
- "Could not rename file" : "Datoteku nije moguće preimenovati",
- "Could not create file" : "Datoteku nije moguće kreirati",
- "Could not create folder" : "Mapu nije moguće kreirati",
- "Error deleting file." : "Pogrešno brisanje datoteke",
"No entries in this folder match '{filter}'" : "Nema zapisa u ovom folderu match '{filter}'",
"Name" : "Naziv",
"Size" : "Veličina",
@@ -66,10 +52,9 @@
"Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)",
"Favorited" : "Favoritovan",
"Favorite" : "Favorit",
- "Upload" : "Učitavanje",
- "Text file" : "Tekstualna datoteka",
"Folder" : "Mapa",
"New folder" : "Nova mapa",
+ "Upload" : "Učitavanje",
"A new file or folder has been <strong>created</strong>" : "Nova datoteka ili nova mapa su <strong>kreirani</strong>",
"A file or folder has been <strong>changed</strong>" : "Datoteka ili mapa su <strong>promijenjeni</strong>",
"A file or folder has been <strong>deleted</strong>" : "Datoteka ili mapa su <strong>izbrisani</strong>",
@@ -83,8 +68,6 @@
"%2$s deleted %1$s" : "%2$s je izbrisao %1$s",
"You restored %1$s" : "Vraćeno %1$s",
"%2$s restored %1$s" : "%2$s vraćeno %1$s",
- "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan",
- "%s could not be renamed" : "%s nije moguće preimenovati",
"Upload (max. %s)" : "Prijenos (max. %s)",
"File handling" : "Obrada datoteke",
"Maximum upload size" : "Maksimalna veličina učitanog sadržaja",
@@ -102,6 +85,7 @@
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.",
"Currently scanning" : "Provjera u tijeku",
"No favorites" : "Nema favorita",
- "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje"
+ "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje",
+ "Text file" : "Tekstualna datoteka"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js
index 5eff7a8f842..b6ed823de68 100644
--- a/apps/files/l10n/hu_HU.js
+++ b/apps/files/l10n/hu_HU.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "A tároló elérhetetlen.",
"Storage invalid" : "A tároló érvénytelen",
"Unknown error" : "Ismeretlen hiba",
- "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",
- "Permission denied" : "Engedély megtagadva ",
- "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.",
- "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!",
- "Error when creating the file" : "Hiba történt az állomány létrehozásakor",
- "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 token",
"No file was uploaded. Unknown error" : "Nem történt feltöltés. Ismeretlen hiba",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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.",
+ "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Kedvencek",
"Home" : "Otthoni",
"Close" : "Bezárás",
+ "Upload cancelled." : "A feltöltést megszakítottuk.",
"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.",
"Total file size {size1} exceeds upload limit {size2}" : "A teljes fájlméret: {size1} meghaladja a feltöltési limitet: {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely. A feltöltés mérete {size1}, de csak ennyi hely van: {size2}.",
- "Upload cancelled." : "A feltöltést megszakítottuk.",
"Could not get result from server." : "A kiszolgálótól nem kapható meg a művelet eredménye.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
"Actions" : "Műveletek",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Nem lehet meghatározni a dátumot",
"This operation is forbidden" : "Tiltott művelet",
"This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem elérhető, kérem nézze meg a naplófájlokat vagy keresse az adminisztrátort",
- "Error moving file." : "Hiba történt a fájl áthelyezése közben.",
- "Error moving file" : "Az állomány áthelyezése nem sikerült.",
- "Error" : "Hiba",
- "{new_name} already exists" : "{new_name} már létezik",
- "Could not rename file" : "Az állomány nem nevezhető át",
- "Could not create file" : "Az állomány nem hozható létre",
- "Could not create folder" : "A mappa nem hozható létre",
- "Error deleting file." : "Hiba a file törlése közben.",
"No entries in this folder match '{filter}'" : "Nincsenek egyező bejegyzések ebben a könyvtárban '{filter}'",
"Name" : "Név",
"Size" : "Méret",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
"Favorited" : "Kedvenc",
"Favorite" : "Kedvenc",
- "{newname} already exists" : "{newname} már létezik",
- "Upload" : "Feltöltés",
- "Text file" : "Szövegfájl",
- "New text file.txt" : "Új szöveges fájl.txt",
"Folder" : "Mappa",
"New folder" : "Új mappa",
+ "{newname} already exists" : "{newname} már létezik",
+ "Upload" : "Feltöltés",
"An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket",
"A new file or folder has been <strong>created</strong>" : "Új fájl vagy könyvtár <strong>létrehozása</strong>",
"A file or folder has been <strong>changed</strong>" : "Fájl vagy könyvtár <strong>módosítása</strong>",
@@ -99,15 +83,13 @@ OC.L10N.register(
"Changed by %2$s" : "Megváltoztatta: %2$s",
"Deleted by %2$s" : "Törölte: %2$s",
"Restored by %2$s" : "Visszaállította: %2$s",
- "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett",
- "%s could not be renamed" : "%s átnevezése nem sikerült",
"Upload (max. %s)" : "Feltöltés (max.: %s)",
"File handling" : "Fájlkezelés",
"Maximum upload size" : "Maximális feltölthető fájlméret",
"max. possible: " : "max. lehetséges: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-mel ez az érték életbe lépése mentés után akár 5 percbe is telhet.",
"Save" : "Mentés",
- "Can not be edited from here due to insufficient permissions." : "Innen nem lehet szerkeszteni az elégtelen jogosultság miatt ",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM-mel akár 5 percbe is telhet, míg ez a beállítás érvénybe lép.",
+ "Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.",
"Settings" : "Beállítások",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ezt a címet használja, ha <a href=\"%s\" target=\"_blank\">WebDAV-on keresztül szeretné elérni a fájljait</a>",
@@ -121,6 +103,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!",
"Currently scanning" : "Mappaellenőrzés: ",
"No favorites" : "Nincsenek kedvencek",
- "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg"
+ "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg",
+ "Text file" : "Szövegfájl",
+ "New text file.txt" : "Új szöveges fájl.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json
index da5eed09733..8b8fbbd9b57 100644
--- a/apps/files/l10n/hu_HU.json
+++ b/apps/files/l10n/hu_HU.json
@@ -2,13 +2,6 @@
"Storage not available" : "A tároló elérhetetlen.",
"Storage invalid" : "A tároló érvénytelen",
"Unknown error" : "Ismeretlen hiba",
- "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",
- "Permission denied" : "Engedély megtagadva ",
- "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.",
- "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!",
- "Error when creating the file" : "Hiba történt az állomány létrehozásakor",
- "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 token",
"No file was uploaded. Unknown error" : "Nem történt feltöltés. Ismeretlen hiba",
@@ -20,6 +13,7 @@
"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.",
+ "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Kedvencek",
"Home" : "Otthoni",
"Close" : "Bezárás",
+ "Upload cancelled." : "A feltöltést megszakítottuk.",
"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.",
"Total file size {size1} exceeds upload limit {size2}" : "A teljes fájlméret: {size1} meghaladja a feltöltési limitet: {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely. A feltöltés mérete {size1}, de csak ennyi hely van: {size2}.",
- "Upload cancelled." : "A feltöltést megszakítottuk.",
"Could not get result from server." : "A kiszolgálótól nem kapható meg a művelet eredménye.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
"Actions" : "Műveletek",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Nem lehet meghatározni a dátumot",
"This operation is forbidden" : "Tiltott művelet",
"This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem elérhető, kérem nézze meg a naplófájlokat vagy keresse az adminisztrátort",
- "Error moving file." : "Hiba történt a fájl áthelyezése közben.",
- "Error moving file" : "Az állomány áthelyezése nem sikerült.",
- "Error" : "Hiba",
- "{new_name} already exists" : "{new_name} már létezik",
- "Could not rename file" : "Az állomány nem nevezhető át",
- "Could not create file" : "Az állomány nem hozható létre",
- "Could not create folder" : "A mappa nem hozható létre",
- "Error deleting file." : "Hiba a file törlése közben.",
"No entries in this folder match '{filter}'" : "Nincsenek egyező bejegyzések ebben a könyvtárban '{filter}'",
"Name" : "Név",
"Size" : "Méret",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
"Favorited" : "Kedvenc",
"Favorite" : "Kedvenc",
- "{newname} already exists" : "{newname} már létezik",
- "Upload" : "Feltöltés",
- "Text file" : "Szövegfájl",
- "New text file.txt" : "Új szöveges fájl.txt",
"Folder" : "Mappa",
"New folder" : "Új mappa",
+ "{newname} already exists" : "{newname} már létezik",
+ "Upload" : "Feltöltés",
"An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket",
"A new file or folder has been <strong>created</strong>" : "Új fájl vagy könyvtár <strong>létrehozása</strong>",
"A file or folder has been <strong>changed</strong>" : "Fájl vagy könyvtár <strong>módosítása</strong>",
@@ -97,15 +81,13 @@
"Changed by %2$s" : "Megváltoztatta: %2$s",
"Deleted by %2$s" : "Törölte: %2$s",
"Restored by %2$s" : "Visszaállította: %2$s",
- "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett",
- "%s could not be renamed" : "%s átnevezése nem sikerült",
"Upload (max. %s)" : "Feltöltés (max.: %s)",
"File handling" : "Fájlkezelés",
"Maximum upload size" : "Maximális feltölthető fájlméret",
"max. possible: " : "max. lehetséges: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-mel ez az érték életbe lépése mentés után akár 5 percbe is telhet.",
"Save" : "Mentés",
- "Can not be edited from here due to insufficient permissions." : "Innen nem lehet szerkeszteni az elégtelen jogosultság miatt ",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM-mel akár 5 percbe is telhet, míg ez a beállítás érvénybe lép.",
+ "Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.",
"Settings" : "Beállítások",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ezt a címet használja, ha <a href=\"%s\" target=\"_blank\">WebDAV-on keresztül szeretné elérni a fájljait</a>",
@@ -119,6 +101,8 @@
"Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!",
"Currently scanning" : "Mappaellenőrzés: ",
"No favorites" : "Nincsenek kedvencek",
- "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg"
+ "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg",
+ "Text file" : "Szövegfájl",
+ "New text file.txt" : "Új szöveges fájl.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/hy.js b/apps/files/l10n/hy.js
index 62bc84d6c7b..ecf99c1077f 100644
--- a/apps/files/l10n/hy.js
+++ b/apps/files/l10n/hy.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files",
{
"Files" : "Ֆայլեր",
+ "All files" : "Բոլոր ֆայլերը",
"Close" : "Փակել",
"Download" : "Բեռնել",
"Rename" : "Վերանվանել",
@@ -9,10 +10,17 @@ OC.L10N.register(
"Select" : "Նշել",
"Name" : "Անուն",
"Size" : "Չափս",
+ "Modified" : "Փոփոխված",
+ "_%n folder_::_%n folders_" : ["%n պանակ","%n պանակ"],
+ "_%n file_::_%n files_" : ["%n ֆայլ","%n ֆայլ"],
+ "{dirs} and {files}" : "{dirs} և {files}",
"New" : "Նոր",
+ "_%n byte_::_%n bytes_" : ["%n բայտ","%n բայտ"],
"Folder" : "Պանակ",
"New folder" : "Նոր պանակ",
"Save" : "Պահպանել",
- "Select all" : "Նշել բոլորը"
+ "Select all" : "Նշել բոլորը",
+ "Text file" : "Տեքստ ֆայլ",
+ "New text file.txt" : "Նոր տեքստ ֆայլ.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/hy.json b/apps/files/l10n/hy.json
index c5afd306272..8b23697b4a2 100644
--- a/apps/files/l10n/hy.json
+++ b/apps/files/l10n/hy.json
@@ -1,5 +1,6 @@
{ "translations": {
"Files" : "Ֆայլեր",
+ "All files" : "Բոլոր ֆայլերը",
"Close" : "Փակել",
"Download" : "Բեռնել",
"Rename" : "Վերանվանել",
@@ -7,10 +8,17 @@
"Select" : "Նշել",
"Name" : "Անուն",
"Size" : "Չափս",
+ "Modified" : "Փոփոխված",
+ "_%n folder_::_%n folders_" : ["%n պանակ","%n պանակ"],
+ "_%n file_::_%n files_" : ["%n ֆայլ","%n ֆայլ"],
+ "{dirs} and {files}" : "{dirs} և {files}",
"New" : "Նոր",
+ "_%n byte_::_%n bytes_" : ["%n բայտ","%n բայտ"],
"Folder" : "Պանակ",
"New folder" : "Նոր պանակ",
"Save" : "Պահպանել",
- "Select all" : "Նշել բոլորը"
+ "Select all" : "Նշել բոլորը",
+ "Text file" : "Տեքստ ֆայլ",
+ "New text file.txt" : "Նոր տեքստ ֆայլ.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js
index 84f3b4d8c45..a1548e6b732 100644
--- a/apps/files/l10n/ia.js
+++ b/apps/files/l10n/ia.js
@@ -10,16 +10,14 @@ OC.L10N.register(
"Close" : "Clauder",
"Download" : "Discargar",
"Delete" : "Deler",
- "Error" : "Error",
"Name" : "Nomine",
"Size" : "Dimension",
"Modified" : "Modificate",
"New" : "Nove",
"File name cannot be empty." : "Le nomine de file non pote esser vacue.",
- "Upload" : "Incargar",
- "Text file" : "File de texto",
"Folder" : "Dossier",
"New folder" : "Nove dossier",
+ "Upload" : "Incargar",
"A new file or folder has been <strong>created</strong>" : "Un nove file o dossier ha essite <strong>create</strong>",
"A file or folder has been <strong>changed</strong>" : "Un nove file o dossier ha essite <strong>modificate</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un nove file o dossier ha essite <strong>delite</strong>",
@@ -37,6 +35,7 @@ OC.L10N.register(
"Maximum upload size" : "Dimension maxime de incargamento",
"Save" : "Salveguardar",
"Settings" : "Configurationes",
- "Upload too large" : "Incargamento troppo longe"
+ "Upload too large" : "Incargamento troppo longe",
+ "Text file" : "File de texto"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json
index 2843f8789ac..bbc3f4bc02a 100644
--- a/apps/files/l10n/ia.json
+++ b/apps/files/l10n/ia.json
@@ -8,16 +8,14 @@
"Close" : "Clauder",
"Download" : "Discargar",
"Delete" : "Deler",
- "Error" : "Error",
"Name" : "Nomine",
"Size" : "Dimension",
"Modified" : "Modificate",
"New" : "Nove",
"File name cannot be empty." : "Le nomine de file non pote esser vacue.",
- "Upload" : "Incargar",
- "Text file" : "File de texto",
"Folder" : "Dossier",
"New folder" : "Nove dossier",
+ "Upload" : "Incargar",
"A new file or folder has been <strong>created</strong>" : "Un nove file o dossier ha essite <strong>create</strong>",
"A file or folder has been <strong>changed</strong>" : "Un nove file o dossier ha essite <strong>modificate</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un nove file o dossier ha essite <strong>delite</strong>",
@@ -35,6 +33,7 @@
"Maximum upload size" : "Dimension maxime de incargamento",
"Save" : "Salveguardar",
"Settings" : "Configurationes",
- "Upload too large" : "Incargamento troppo longe"
+ "Upload too large" : "Incargamento troppo longe",
+ "Text file" : "File de texto"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js
index f02a6d79c4d..93ec698cfa4 100644
--- a/apps/files/l10n/id.js
+++ b/apps/files/l10n/id.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Penyimpanan tidak tersedia",
"Storage invalid" : "Penyimpanan tidak sah",
"Unknown error" : "Kesalahan tidak diketahui",
- "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",
- "Permission denied" : "Perizinan ditolak",
- "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.",
- "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.",
- "Error when creating the file" : "Kesalahan saat membuat berkas",
- "Error when creating the folder" : "Kesalahan saat membuat folder",
"Unable to set upload directory." : "Tidak dapat mengatur folder unggah",
"Invalid Token" : "Token tidak sah",
"No file was uploaded. Unknown error" : "Tidak ada berkas yang diunggah. Kesalahan tidak dikenal.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favorit",
"Home" : "Rumah",
"Close" : "Tutup",
+ "Upload cancelled." : "Pengunggahan dibatalkan.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Jumlah ukuran berkas {size1} melampaui batas unggah {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa",
- "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.",
"Actions" : "Tindakan",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Tidak dapat menentukan tanggal",
"This operation is forbidden" : "Operasi ini dilarang",
"This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak",
- "Error moving file." : "Kesalahan saat memindahkan berkas.",
- "Error moving file" : "Kesalahan saat memindahkan berkas",
- "Error" : "Kesalahan ",
- "{new_name} already exists" : "{new_name} sudah ada",
- "Could not rename file" : "Tidak dapat mengubah nama berkas",
- "Could not create file" : "Tidak dapat membuat berkas",
- "Could not create folder" : "Tidak dapat membuat folder",
- "Error deleting file." : "Kesalahan saat menghapus berkas.",
"No entries in this folder match '{filter}'" : "Tidak ada entri di folder ini yang cocok dengan '{filter}'",
"Name" : "Nama",
"Size" : "Ukuran",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte"],
"Favorited" : "Difavoritkan",
"Favorite" : "Favorit",
- "{newname} already exists" : "{newname} sudah ada",
- "Upload" : "Unggah",
- "Text file" : "Berkas teks",
- "New text file.txt" : "Teks baru file.txt",
"Folder" : "Folder",
"New folder" : "Map baru",
+ "{newname} already exists" : "{newname} sudah ada",
+ "Upload" : "Unggah",
"An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label",
"A new file or folder has been <strong>created</strong>" : "Sebuah berkas atau folder baru telah <strong>dibuat</strong>",
"A file or folder has been <strong>changed</strong>" : "Sebuah berkas atau folder telah <strong>diubah</strong>",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Diubah oleh %2$s",
"Deleted by %2$s" : "Dihapus oleh %2$s",
"Restored by %2$s" : "Dipulihkan oleh %2$s",
- "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus",
- "%s could not be renamed" : "%s tidak dapat diubah nama",
"Upload (max. %s)" : "Unggah (maks. %s)",
"File handling" : "Penanganan berkas",
"Maximum upload size" : "Ukuran pengunggahan maksimum",
"max. possible: " : "Kemungkinan maks.:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Dengan PHP-FPM, nilai ini bisa memerlukan waktu hingga 5 menit untuk berlaku setelah penyimpanan.",
"Save" : "Simpan",
- "Can not be edited from here due to insufficient permissions." : "Tidak dapat disunting dari sini karena tidak memiliki izin.",
"Settings" : "Pengaturan",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses Berkas via WebDAV</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.",
"Currently scanning" : "Pemindaian terbaru",
"No favorites" : "Tidak ada favorit",
- "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini."
+ "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.",
+ "Text file" : "Berkas teks",
+ "New text file.txt" : "Teks baru file.txt"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json
index 773f6b8f5a7..dca3e7bd163 100644
--- a/apps/files/l10n/id.json
+++ b/apps/files/l10n/id.json
@@ -2,13 +2,6 @@
"Storage not available" : "Penyimpanan tidak tersedia",
"Storage invalid" : "Penyimpanan tidak sah",
"Unknown error" : "Kesalahan tidak diketahui",
- "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",
- "Permission denied" : "Perizinan ditolak",
- "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.",
- "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.",
- "Error when creating the file" : "Kesalahan saat membuat berkas",
- "Error when creating the folder" : "Kesalahan saat membuat folder",
"Unable to set upload directory." : "Tidak dapat mengatur folder unggah",
"Invalid Token" : "Token tidak sah",
"No file was uploaded. Unknown error" : "Tidak ada berkas yang diunggah. Kesalahan tidak dikenal.",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favorit",
"Home" : "Rumah",
"Close" : "Tutup",
+ "Upload cancelled." : "Pengunggahan dibatalkan.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Jumlah ukuran berkas {size1} melampaui batas unggah {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa",
- "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.",
"Actions" : "Tindakan",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Tidak dapat menentukan tanggal",
"This operation is forbidden" : "Operasi ini dilarang",
"This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak",
- "Error moving file." : "Kesalahan saat memindahkan berkas.",
- "Error moving file" : "Kesalahan saat memindahkan berkas",
- "Error" : "Kesalahan ",
- "{new_name} already exists" : "{new_name} sudah ada",
- "Could not rename file" : "Tidak dapat mengubah nama berkas",
- "Could not create file" : "Tidak dapat membuat berkas",
- "Could not create folder" : "Tidak dapat membuat folder",
- "Error deleting file." : "Kesalahan saat menghapus berkas.",
"No entries in this folder match '{filter}'" : "Tidak ada entri di folder ini yang cocok dengan '{filter}'",
"Name" : "Nama",
"Size" : "Ukuran",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n byte"],
"Favorited" : "Difavoritkan",
"Favorite" : "Favorit",
- "{newname} already exists" : "{newname} sudah ada",
- "Upload" : "Unggah",
- "Text file" : "Berkas teks",
- "New text file.txt" : "Teks baru file.txt",
"Folder" : "Folder",
"New folder" : "Map baru",
+ "{newname} already exists" : "{newname} sudah ada",
+ "Upload" : "Unggah",
"An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label",
"A new file or folder has been <strong>created</strong>" : "Sebuah berkas atau folder baru telah <strong>dibuat</strong>",
"A file or folder has been <strong>changed</strong>" : "Sebuah berkas atau folder telah <strong>diubah</strong>",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Diubah oleh %2$s",
"Deleted by %2$s" : "Dihapus oleh %2$s",
"Restored by %2$s" : "Dipulihkan oleh %2$s",
- "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus",
- "%s could not be renamed" : "%s tidak dapat diubah nama",
"Upload (max. %s)" : "Unggah (maks. %s)",
"File handling" : "Penanganan berkas",
"Maximum upload size" : "Ukuran pengunggahan maksimum",
"max. possible: " : "Kemungkinan maks.:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Dengan PHP-FPM, nilai ini bisa memerlukan waktu hingga 5 menit untuk berlaku setelah penyimpanan.",
"Save" : "Simpan",
- "Can not be edited from here due to insufficient permissions." : "Tidak dapat disunting dari sini karena tidak memiliki izin.",
"Settings" : "Pengaturan",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses Berkas via WebDAV</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.",
"Currently scanning" : "Pemindaian terbaru",
"No favorites" : "Tidak ada favorit",
- "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini."
+ "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.",
+ "Text file" : "Berkas teks",
+ "New text file.txt" : "Teks baru file.txt"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js
index 780dbe4301f..967e205145f 100644
--- a/apps/files/l10n/is.js
+++ b/apps/files/l10n/is.js
@@ -1,8 +1,6 @@
OC.L10N.register(
"files",
{
- "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",
"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:",
@@ -21,16 +19,13 @@ OC.L10N.register(
"Delete" : "Eyða",
"Select" : "Velja",
"Pending" : "Bíður",
- "Error" : "Villa",
- "{new_name} already exists" : "{new_name} er þegar til",
"Name" : "Nafn",
"Size" : "Stærð",
"Modified" : "Breytt",
"New" : "Nýtt",
"File name cannot be empty." : "Nafn skráar má ekki vera tómt",
- "Upload" : "Senda inn",
- "Text file" : "Texta skrá",
"Folder" : "Mappa",
+ "Upload" : "Senda inn",
"File handling" : "Meðhöndlun skrár",
"Maximum upload size" : "Hámarks stærð innsendingar",
"max. possible: " : "hámark mögulegt: ",
@@ -42,6 +37,7 @@ OC.L10N.register(
"Select all" : "Velja allt",
"Upload too large" : "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
- "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu."
+ "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu.",
+ "Text file" : "Texta skrá"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json
index aed9568f7d0..caff3b037d5 100644
--- a/apps/files/l10n/is.json
+++ b/apps/files/l10n/is.json
@@ -1,6 +1,4 @@
{ "translations": {
- "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",
"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:",
@@ -19,16 +17,13 @@
"Delete" : "Eyða",
"Select" : "Velja",
"Pending" : "Bíður",
- "Error" : "Villa",
- "{new_name} already exists" : "{new_name} er þegar til",
"Name" : "Nafn",
"Size" : "Stærð",
"Modified" : "Breytt",
"New" : "Nýtt",
"File name cannot be empty." : "Nafn skráar má ekki vera tómt",
- "Upload" : "Senda inn",
- "Text file" : "Texta skrá",
"Folder" : "Mappa",
+ "Upload" : "Senda inn",
"File handling" : "Meðhöndlun skrár",
"Maximum upload size" : "Hámarks stærð innsendingar",
"max. possible: " : "hámark mögulegt: ",
@@ -40,6 +35,7 @@
"Select all" : "Velja allt",
"Upload too large" : "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
- "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu."
+ "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu.",
+ "Text file" : "Texta skrá"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index c8286c66a57..93a013492a2 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Archiviazione non disponibile",
"Storage invalid" : "Archiviazione non valida",
"Unknown error" : "Errore sconosciuto",
- "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",
- "Permission denied" : "Permesso negato",
- "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.",
- "Error when creating the file" : "Errore durante la creazione del file",
- "Error when creating the folder" : "Errore durante la creazione della cartella",
"Unable to set upload directory." : "Impossibile impostare una cartella di caricamento.",
"Invalid Token" : "Token non valido",
"No file was uploaded. Unknown error" : "Nessun file è stato caricato. Errore sconosciuto",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "La cartella di destinazione è stata spostata o eliminata.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Preferiti",
"Home" : "Home",
"Close" : "Chiudi",
+ "Upload cancelled." : "Caricamento annullato.",
"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.",
"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." : "Caricamento 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.",
"Actions" : "Azioni",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Impossibile determinare la data",
"This operation is forbidden" : "Questa operazione è vietata",
"This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
- "Error moving file." : "Errore durante lo spostamento del file.",
- "Error moving file" : "Errore durante lo spostamento del file",
- "Error" : "Errore",
- "{new_name} already exists" : "{new_name} esiste già",
- "Could not rename file" : "Impossibile rinominare il file",
- "Could not create file" : "Impossibile creare il file",
- "Could not create folder" : "Impossibile creare la cartella",
- "Error deleting file." : "Errore durante l'eliminazione del file.",
+ "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già",
+ "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"",
+ "{newName} already exists" : "{newName} esiste già",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile rinominare \"{fileName}\", non esiste più",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{targetName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.",
+ "Could not rename \"{fileName}\"" : "Impossibile rinominare \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già",
+ "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già",
+ "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'",
"Name" : "Nome",
"Size" : "Dimensione",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
"Favorited" : "Preferiti",
"Favorite" : "Preferito",
- "{newname} already exists" : "{newname} esiste già",
- "Upload" : "Carica",
- "Text file" : "File di testo",
- "New text file.txt" : "Nuovo file di testo.txt",
"Folder" : "Cartella",
"New folder" : "Nuova cartella",
+ "{newname} already exists" : "{newname} esiste già",
+ "Upload" : "Carica",
"An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette",
"A new file or folder has been <strong>created</strong>" : "Un nuovo file o cartella è stato <strong>creato</strong>",
"A file or folder has been <strong>changed</strong>" : "Un file o una cartella è stato <strong>modificato</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "Modificata da %2$s",
"Deleted by %2$s" : "Eliminata da %2$s",
"Restored by %2$s" : "Ripristinata da %2$s",
- "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato",
- "%s could not be renamed" : "%s non può essere rinominato",
"Upload (max. %s)" : "Carica (massimo %s)",
"File handling" : "Gestione file",
"Maximum upload size" : "Dimensione massima caricamento",
"max. possible: " : "numero mass.: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM questo valore potrebbe richiedere fino a 5 minuti perché abbia effetto dopo il salvataggio.",
"Save" : "Salva",
- "Can not be edited from here due to insufficient permissions." : "Non può essere modificato da qui a causa della mancanza di permessi.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM potrebbe richiedere 5 minuti perché le modifiche siano applicate.",
+ "Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.",
"Settings" : "Impostazioni",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Scansione dei file in corso, attendi",
"Currently scanning" : "Scansione in corso",
"No favorites" : "Nessun preferito",
- "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui"
+ "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
+ "Text file" : "File di testo",
+ "New text file.txt" : "Nuovo file di testo.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 6f6092c5c15..25d3834b0a3 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -2,13 +2,6 @@
"Storage not available" : "Archiviazione non disponibile",
"Storage invalid" : "Archiviazione non valida",
"Unknown error" : "Errore sconosciuto",
- "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",
- "Permission denied" : "Permesso negato",
- "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.",
- "Error when creating the file" : "Errore durante la creazione del file",
- "Error when creating the folder" : "Errore durante la creazione della cartella",
"Unable to set upload directory." : "Impossibile impostare una cartella di caricamento.",
"Invalid Token" : "Token non valido",
"No file was uploaded. Unknown error" : "Nessun file è stato caricato. Errore sconosciuto",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "La cartella di destinazione è stata spostata o eliminata.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Preferiti",
"Home" : "Home",
"Close" : "Chiudi",
+ "Upload cancelled." : "Caricamento annullato.",
"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.",
"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." : "Caricamento 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.",
"Actions" : "Azioni",
@@ -44,14 +38,17 @@
"Unable to determine date" : "Impossibile determinare la data",
"This operation is forbidden" : "Questa operazione è vietata",
"This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
- "Error moving file." : "Errore durante lo spostamento del file.",
- "Error moving file" : "Errore durante lo spostamento del file",
- "Error" : "Errore",
- "{new_name} already exists" : "{new_name} esiste già",
- "Could not rename file" : "Impossibile rinominare il file",
- "Could not create file" : "Impossibile creare il file",
- "Could not create folder" : "Impossibile creare la cartella",
- "Error deleting file." : "Errore durante l'eliminazione del file.",
+ "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già",
+ "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"",
+ "{newName} already exists" : "{newName} esiste già",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile rinominare \"{fileName}\", non esiste più",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{targetName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.",
+ "Could not rename \"{fileName}\"" : "Impossibile rinominare \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già",
+ "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già",
+ "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'",
"Name" : "Nome",
"Size" : "Dimensione",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
"Favorited" : "Preferiti",
"Favorite" : "Preferito",
- "{newname} already exists" : "{newname} esiste già",
- "Upload" : "Carica",
- "Text file" : "File di testo",
- "New text file.txt" : "Nuovo file di testo.txt",
"Folder" : "Cartella",
"New folder" : "Nuova cartella",
+ "{newname} already exists" : "{newname} esiste già",
+ "Upload" : "Carica",
"An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette",
"A new file or folder has been <strong>created</strong>" : "Un nuovo file o cartella è stato <strong>creato</strong>",
"A file or folder has been <strong>changed</strong>" : "Un file o una cartella è stato <strong>modificato</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "Modificata da %2$s",
"Deleted by %2$s" : "Eliminata da %2$s",
"Restored by %2$s" : "Ripristinata da %2$s",
- "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato",
- "%s could not be renamed" : "%s non può essere rinominato",
"Upload (max. %s)" : "Carica (massimo %s)",
"File handling" : "Gestione file",
"Maximum upload size" : "Dimensione massima caricamento",
"max. possible: " : "numero mass.: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM questo valore potrebbe richiedere fino a 5 minuti perché abbia effetto dopo il salvataggio.",
"Save" : "Salva",
- "Can not be edited from here due to insufficient permissions." : "Non può essere modificato da qui a causa della mancanza di permessi.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM potrebbe richiedere 5 minuti perché le modifiche siano applicate.",
+ "Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.",
"Settings" : "Impostazioni",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "Scansione dei file in corso, attendi",
"Currently scanning" : "Scansione in corso",
"No favorites" : "Nessun preferito",
- "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui"
+ "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
+ "Text file" : "File di testo",
+ "New text file.txt" : "Nuovo file di testo.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 052562d13ee..cd6f45f27b9 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "ストレージが利用できません",
"Storage invalid" : "ストレージが無効です",
"Unknown error" : "不明なエラー",
- "Could not move %s - File with this name already exists" : "%s を移動できませんでした ― この名前のファイルはすでに存在します",
- "Could not move %s" : "%s を移動できませんでした",
- "Permission denied" : "アクセス拒否",
- "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 ですでに使われています。別の名前を選択してください。",
- "Error when creating the file" : "ファイルの生成エラー",
- "Error when creating the folder" : "フォルダーの生成エラー",
"Unable to set upload directory." : "アップロードディレクトリを設定できません。",
"Invalid Token" : "無効なトークン",
"No file was uploaded. Unknown error" : "ファイルは何もアップロードされていません。不明なエラー",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "一時保存フォルダーが見つかりません",
"Failed to write to disk" : "ディスクへの書き込みに失敗しました",
"Not enough storage available" : "ストレージに十分な空き容量がありません",
+ "The target folder has been moved or deleted." : "対象のフォルダーは移動されたか、削除されました。",
"Upload failed. Could not find uploaded file" : "アップロードに失敗しました。アップロード済みのファイルを見つけることができませんでした。",
"Upload failed. Could not get file info." : "アップロードに失敗しました。ファイル情報を取得できませんでした。",
"Invalid directory." : "無効なディレクトリです。",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "更新日不明",
"This operation is forbidden" : "この操作は禁止されています",
"This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
- "Error moving file." : "ファイル移動でエラー",
- "Error moving file" : "ファイルの移動エラー",
- "Error" : "エラー",
- "{new_name} already exists" : "{new_name} はすでに存在します",
- "Could not rename file" : "ファイルの名前変更ができませんでした",
- "Could not create file" : "ファイルを作成できませんでした",
- "Could not create folder" : "フォルダーを作成できませんでした",
- "Error deleting file." : "ファイルの削除エラー。",
+ "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした",
+ "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした",
+ "{newName} already exists" : "{newName} はすでに存在します",
+ "Could not rename \"{fileName}\", it does not exist any more" : "ファイルが存在しないため,\"{fileName}\"の名前変更ができませんでした",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" はフォルダー \"{dir}\" ですでに使われています。別の名前を選択してください。",
+ "Could not rename \"{fileName}\"" : "\"{fileName}\"の名前変更ができませんでした",
+ "Could not create file \"{file}\"" : "ファイル \"{file}\" を作成できませんでした",
+ "Could not create file \"{file}\" because it already exists" : "ファイル \"{file}\"は既に存在するため作成できませんでした",
+ "Could not create folder \"{dir}\"" : "フォルダー \"{dir}\" を作成できませんでした",
+ "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" は既に存在するため作成できませんでした",
+ "Error deleting file \"{fileName}\"." : "\"{fileName}\" でエラーを検出しました。",
"No entries in this folder match '{filter}'" : "このフォルダー内で '{filter}' にマッチするものはありません",
"Name" : "名前",
"Size" : "サイズ",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n バイト"],
"Favorited" : "お気に入り済",
"Favorite" : "お気に入り",
- "{newname} already exists" : "{newname} はすでに存在します",
- "Upload" : "アップロード",
- "Text file" : "テキストファイル",
- "New text file.txt" : "新規のテキストファイル作成",
"Folder" : "フォルダー",
"New folder" : "新しいフォルダー",
+ "{newname} already exists" : "{newname} はすでに存在します",
+ "Upload" : "アップロード",
"An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"A new file or folder has been <strong>created</strong>" : "新しいファイルまたはフォルダーを<strong>作成</strong>したとき",
"A file or folder has been <strong>changed</strong>" : "ファイルまたはフォルダーを<strong>変更</strong>したとき",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "%2$s により更新",
"Deleted by %2$s" : "%2$s により削除",
"Restored by %2$s" : "%2$s により復元",
- "%s could not be renamed as it has been deleted" : "%s は削除されたため、ファイル名を変更できません",
- "%s could not be renamed" : "%sの名前を変更できませんでした",
"Upload (max. %s)" : "アップロード ( 最大 %s )",
"File handling" : "ファイル操作",
"Maximum upload size" : "最大アップロードサイズ",
"max. possible: " : "最大容量: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。",
"Save" : "保存",
- "Can not be edited from here due to insufficient permissions." : "権限不足のため直接編集することはできません。",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。",
+ "Missing permissions to edit from here." : "ここから編集するための権限がありません。",
"Settings" : "設定",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV経由でのファイルアクセス</a>にはこのアドレスを利用してください",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。",
"Currently scanning" : "現在スキャン中",
"No favorites" : "お気に入りなし",
- "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。"
+ "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。",
+ "Text file" : "テキストファイル",
+ "New text file.txt" : "新規のテキストファイル作成"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 4534e787e0f..01d93403c20 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -2,13 +2,6 @@
"Storage not available" : "ストレージが利用できません",
"Storage invalid" : "ストレージが無効です",
"Unknown error" : "不明なエラー",
- "Could not move %s - File with this name already exists" : "%s を移動できませんでした ― この名前のファイルはすでに存在します",
- "Could not move %s" : "%s を移動できませんでした",
- "Permission denied" : "アクセス拒否",
- "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 ですでに使われています。別の名前を選択してください。",
- "Error when creating the file" : "ファイルの生成エラー",
- "Error when creating the folder" : "フォルダーの生成エラー",
"Unable to set upload directory." : "アップロードディレクトリを設定できません。",
"Invalid Token" : "無効なトークン",
"No file was uploaded. Unknown error" : "ファイルは何もアップロードされていません。不明なエラー",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "一時保存フォルダーが見つかりません",
"Failed to write to disk" : "ディスクへの書き込みに失敗しました",
"Not enough storage available" : "ストレージに十分な空き容量がありません",
+ "The target folder has been moved or deleted." : "対象のフォルダーは移動されたか、削除されました。",
"Upload failed. Could not find uploaded file" : "アップロードに失敗しました。アップロード済みのファイルを見つけることができませんでした。",
"Upload failed. Could not get file info." : "アップロードに失敗しました。ファイル情報を取得できませんでした。",
"Invalid directory." : "無効なディレクトリです。",
@@ -44,14 +38,17 @@
"Unable to determine date" : "更新日不明",
"This operation is forbidden" : "この操作は禁止されています",
"This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
- "Error moving file." : "ファイル移動でエラー",
- "Error moving file" : "ファイルの移動エラー",
- "Error" : "エラー",
- "{new_name} already exists" : "{new_name} はすでに存在します",
- "Could not rename file" : "ファイルの名前変更ができませんでした",
- "Could not create file" : "ファイルを作成できませんでした",
- "Could not create folder" : "フォルダーを作成できませんでした",
- "Error deleting file." : "ファイルの削除エラー。",
+ "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした",
+ "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした",
+ "{newName} already exists" : "{newName} はすでに存在します",
+ "Could not rename \"{fileName}\", it does not exist any more" : "ファイルが存在しないため,\"{fileName}\"の名前変更ができませんでした",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" はフォルダー \"{dir}\" ですでに使われています。別の名前を選択してください。",
+ "Could not rename \"{fileName}\"" : "\"{fileName}\"の名前変更ができませんでした",
+ "Could not create file \"{file}\"" : "ファイル \"{file}\" を作成できませんでした",
+ "Could not create file \"{file}\" because it already exists" : "ファイル \"{file}\"は既に存在するため作成できませんでした",
+ "Could not create folder \"{dir}\"" : "フォルダー \"{dir}\" を作成できませんでした",
+ "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" は既に存在するため作成できませんでした",
+ "Error deleting file \"{fileName}\"." : "\"{fileName}\" でエラーを検出しました。",
"No entries in this folder match '{filter}'" : "このフォルダー内で '{filter}' にマッチするものはありません",
"Name" : "名前",
"Size" : "サイズ",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n バイト"],
"Favorited" : "お気に入り済",
"Favorite" : "お気に入り",
- "{newname} already exists" : "{newname} はすでに存在します",
- "Upload" : "アップロード",
- "Text file" : "テキストファイル",
- "New text file.txt" : "新規のテキストファイル作成",
"Folder" : "フォルダー",
"New folder" : "新しいフォルダー",
+ "{newname} already exists" : "{newname} はすでに存在します",
+ "Upload" : "アップロード",
"An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"A new file or folder has been <strong>created</strong>" : "新しいファイルまたはフォルダーを<strong>作成</strong>したとき",
"A file or folder has been <strong>changed</strong>" : "ファイルまたはフォルダーを<strong>変更</strong>したとき",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "%2$s により更新",
"Deleted by %2$s" : "%2$s により削除",
"Restored by %2$s" : "%2$s により復元",
- "%s could not be renamed as it has been deleted" : "%s は削除されたため、ファイル名を変更できません",
- "%s could not be renamed" : "%sの名前を変更できませんでした",
"Upload (max. %s)" : "アップロード ( 最大 %s )",
"File handling" : "ファイル操作",
"Maximum upload size" : "最大アップロードサイズ",
"max. possible: " : "最大容量: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。",
"Save" : "保存",
- "Can not be edited from here due to insufficient permissions." : "権限不足のため直接編集することはできません。",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。",
+ "Missing permissions to edit from here." : "ここから編集するための権限がありません。",
"Settings" : "設定",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV経由でのファイルアクセス</a>にはこのアドレスを利用してください",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。",
"Currently scanning" : "現在スキャン中",
"No favorites" : "お気に入りなし",
- "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。"
+ "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。",
+ "Text file" : "テキストファイル",
+ "New text file.txt" : "新規のテキストファイル作成"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js
index c76e75864f9..f5a57f44266 100644
--- a/apps/files/l10n/ka_GE.js
+++ b/apps/files/l10n/ka_GE.js
@@ -2,8 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "უცნობი შეცდომა",
- "Could not move %s - File with this name already exists" : "%s –ის გადატანა ვერ მოხერხდა – ფაილი ამ სახელით უკვე არსებობს",
- "Could not move %s" : "%s –ის გადატანა ვერ მოხერხდა",
"No file was uploaded. Unknown error" : "ფაილი არ აიტვირთა. უცნობი შეცდომა",
"There is no error, the file uploaded with success" : "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში",
@@ -26,8 +24,6 @@ OC.L10N.register(
"Delete" : "წაშლა",
"Details" : "დეტალური ინფორმაცია",
"Pending" : "მოცდის რეჟიმში",
- "Error" : "შეცდომა",
- "{new_name} already exists" : "{new_name} უკვე არსებობს",
"Name" : "სახელი",
"Size" : "ზომა",
"Modified" : "შეცვლილია",
@@ -36,10 +32,9 @@ OC.L10N.register(
"Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!",
"Your storage is almost full ({usedSpacePercent}%)" : "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)",
"Favorite" : "ფავორიტი",
- "Upload" : "ატვირთვა",
- "Text file" : "ტექსტური ფაილი",
"Folder" : "საქაღალდე",
"New folder" : "ახალი ფოლდერი",
+ "Upload" : "ატვირთვა",
"File handling" : "ფაილის დამუშავება",
"Maximum upload size" : "მაქსიმუმ ატვირთის ზომა",
"max. possible: " : "მაქს. შესაძლებელი:",
@@ -49,6 +44,7 @@ OC.L10N.register(
"Cancel upload" : "ატვირთვის გაუქმება",
"Upload too large" : "ასატვირთი ფაილი ძალიან დიდია",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
- "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ."
+ "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.",
+ "Text file" : "ტექსტური ფაილი"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json
index 058bee2618b..cb8f6dce6fd 100644
--- a/apps/files/l10n/ka_GE.json
+++ b/apps/files/l10n/ka_GE.json
@@ -1,7 +1,5 @@
{ "translations": {
"Unknown error" : "უცნობი შეცდომა",
- "Could not move %s - File with this name already exists" : "%s –ის გადატანა ვერ მოხერხდა – ფაილი ამ სახელით უკვე არსებობს",
- "Could not move %s" : "%s –ის გადატანა ვერ მოხერხდა",
"No file was uploaded. Unknown error" : "ფაილი არ აიტვირთა. უცნობი შეცდომა",
"There is no error, the file uploaded with success" : "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში",
@@ -24,8 +22,6 @@
"Delete" : "წაშლა",
"Details" : "დეტალური ინფორმაცია",
"Pending" : "მოცდის რეჟიმში",
- "Error" : "შეცდომა",
- "{new_name} already exists" : "{new_name} უკვე არსებობს",
"Name" : "სახელი",
"Size" : "ზომა",
"Modified" : "შეცვლილია",
@@ -34,10 +30,9 @@
"Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!",
"Your storage is almost full ({usedSpacePercent}%)" : "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)",
"Favorite" : "ფავორიტი",
- "Upload" : "ატვირთვა",
- "Text file" : "ტექსტური ფაილი",
"Folder" : "საქაღალდე",
"New folder" : "ახალი ფოლდერი",
+ "Upload" : "ატვირთვა",
"File handling" : "ფაილის დამუშავება",
"Maximum upload size" : "მაქსიმუმ ატვირთის ზომა",
"max. possible: " : "მაქს. შესაძლებელი:",
@@ -47,6 +42,7 @@
"Cancel upload" : "ატვირთვის გაუქმება",
"Upload too large" : "ასატვირთი ფაილი ძალიან დიდია",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
- "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ."
+ "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.",
+ "Text file" : "ტექსტური ფაილი"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js
index 030bdd35eda..f03aa9c4693 100644
--- a/apps/files/l10n/km.js
+++ b/apps/files/l10n/km.js
@@ -2,8 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "មិន​ស្គាល់​កំហុស",
- "Could not move %s - File with this name already exists" : "មិន​អាច​ផ្លាស់​ទី %s - មាន​ឈ្មោះ​ឯកសារ​ដូច​នេះ​ហើយ",
- "Could not move %s" : "មិន​អាច​ផ្លាស់ទី %s",
"No file was uploaded. Unknown error" : "មិន​មាន​ឯកសារ​ដែល​បាន​ផ្ទុក​ឡើង។ មិន​ស្គាល់​កំហុស",
"There is no error, the file uploaded with success" : "មិន​មាន​កំហុស​អ្វី​ទេ ហើយ​ឯកសារ​ត្រូវ​បាន​ផ្ទុកឡើង​ដោយ​ជោគជ័យ",
"Files" : "ឯកសារ",
@@ -14,17 +12,14 @@ OC.L10N.register(
"Delete" : "លុប",
"Details" : "ព័ត៌មាន​លម្អិត",
"Pending" : "កំពុង​រង់ចាំ",
- "Error" : "កំហុស",
- "{new_name} already exists" : "មាន​ឈ្មោះ {new_name} រួច​ហើយ",
"Name" : "ឈ្មោះ",
"Size" : "ទំហំ",
"Modified" : "បាន​កែ​ប្រែ",
"New" : "ថ្មី",
"File name cannot be empty." : "ឈ្មោះ​ឯកសារ​មិន​អាច​នៅ​ទទេ​បាន​ឡើយ។",
- "Upload" : "ផ្ទុក​ឡើង",
- "Text file" : "ឯកសារ​អក្សរ",
"Folder" : "ថត",
"New folder" : "ថត​ថ្មី",
+ "Upload" : "ផ្ទុក​ឡើង",
"You created %1$s" : "អ្នក​បាន​បង្កើត %1$s",
"%2$s created %1$s" : "%2$s បាន​បង្កើត %1$s",
"You changed %1$s" : "អ្នក​បាន​ផ្លាស់​ប្ដូរ %1$s",
@@ -36,6 +31,7 @@ OC.L10N.register(
"Settings" : "ការកំណត់",
"WebDAV" : "WebDAV",
"Cancel upload" : "បោះបង់​ការ​ផ្ទុកឡើង",
- "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក"
+ "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក",
+ "Text file" : "ឯកសារ​អក្សរ"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json
index 679787a5ce2..f050b00b795 100644
--- a/apps/files/l10n/km.json
+++ b/apps/files/l10n/km.json
@@ -1,7 +1,5 @@
{ "translations": {
"Unknown error" : "មិន​ស្គាល់​កំហុស",
- "Could not move %s - File with this name already exists" : "មិន​អាច​ផ្លាស់​ទី %s - មាន​ឈ្មោះ​ឯកសារ​ដូច​នេះ​ហើយ",
- "Could not move %s" : "មិន​អាច​ផ្លាស់ទី %s",
"No file was uploaded. Unknown error" : "មិន​មាន​ឯកសារ​ដែល​បាន​ផ្ទុក​ឡើង។ មិន​ស្គាល់​កំហុស",
"There is no error, the file uploaded with success" : "មិន​មាន​កំហុស​អ្វី​ទេ ហើយ​ឯកសារ​ត្រូវ​បាន​ផ្ទុកឡើង​ដោយ​ជោគជ័យ",
"Files" : "ឯកសារ",
@@ -12,17 +10,14 @@
"Delete" : "លុប",
"Details" : "ព័ត៌មាន​លម្អិត",
"Pending" : "កំពុង​រង់ចាំ",
- "Error" : "កំហុស",
- "{new_name} already exists" : "មាន​ឈ្មោះ {new_name} រួច​ហើយ",
"Name" : "ឈ្មោះ",
"Size" : "ទំហំ",
"Modified" : "បាន​កែ​ប្រែ",
"New" : "ថ្មី",
"File name cannot be empty." : "ឈ្មោះ​ឯកសារ​មិន​អាច​នៅ​ទទេ​បាន​ឡើយ។",
- "Upload" : "ផ្ទុក​ឡើង",
- "Text file" : "ឯកសារ​អក្សរ",
"Folder" : "ថត",
"New folder" : "ថត​ថ្មី",
+ "Upload" : "ផ្ទុក​ឡើង",
"You created %1$s" : "អ្នក​បាន​បង្កើត %1$s",
"%2$s created %1$s" : "%2$s បាន​បង្កើត %1$s",
"You changed %1$s" : "អ្នក​បាន​ផ្លាស់​ប្ដូរ %1$s",
@@ -34,6 +29,7 @@
"Settings" : "ការកំណត់",
"WebDAV" : "WebDAV",
"Cancel upload" : "បោះបង់​ការ​ផ្ទុកឡើង",
- "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក"
+ "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក",
+ "Text file" : "ឯកសារ​អក្សរ"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js
index 7538d9b033e..840837bdad3 100644
--- a/apps/files/l10n/kn.js
+++ b/apps/files/l10n/kn.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ",
"Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ",
"Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ",
- "Could not move %s - File with this name already exists" : "%s ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ",
- "Could not move %s" : "%s ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ",
- "Permission denied" : "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ",
- "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 ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತದೆ. ಬೇರೆ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.",
- "Error when creating the file" : "ಕಡತವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ",
- "Error when creating the folder" : "ಕೊಶವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ",
"Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.",
"Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ",
"No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ",
@@ -20,6 +13,7 @@ OC.L10N.register(
"Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ",
"Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ",
"Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ",
+ "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.",
"Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.",
"Files" : "ಕಡತಗಳು",
"All files" : "ಎಲ್ಲಾ ಕಡತಗಳು",
@@ -34,14 +28,6 @@ OC.L10N.register(
"Select" : "ಆಯ್ಕೆ ಮಾಡಿ",
"Pending" : "ಬಾಕಿ ಇದೆ",
"Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
- "Error moving file." : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ.",
- "Error moving file" : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ",
- "Error" : "ತಪ್ಪಾಗಿದೆ",
- "{new_name} already exists" : "ಈಗಾಗಲೇ {new_name} ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ",
- "Could not rename file" : "ಕಡತ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ",
- "Could not create file" : "ಕಡತ ರಚಿಸಲಾಗಲಿಲ್ಲ",
- "Could not create folder" : "ಕೋಶವನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ",
- "Error deleting file." : "ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ಲೋಪವಾದೆ",
"Name" : "ಹೆಸರು",
"Size" : " ಪ್ರಮಾಣ",
"Modified" : "ಬದಲಾಯಿಸಿದ",
@@ -53,10 +39,9 @@ OC.L10N.register(
"File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.",
"Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು",
"Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ",
- "Upload" : "ವರ್ಗಾಯಿಸಿ",
- "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ",
"Folder" : "ಕಡತಕೋಶ",
"New folder" : "ಹೊಸ ಕಡತಕೋಶ",
+ "Upload" : "ವರ್ಗಾಯಿಸಿ",
"Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)",
"File handling" : "ಕಡತ ನಿರ್ವಹಣೆ",
"Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ",
@@ -71,6 +56,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.",
"Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ",
"No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ",
- "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ"
+ "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ",
+ "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json
index b9f55d4151a..d6345be732c 100644
--- a/apps/files/l10n/kn.json
+++ b/apps/files/l10n/kn.json
@@ -2,13 +2,6 @@
"Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ",
"Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ",
"Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ",
- "Could not move %s - File with this name already exists" : "%s ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ",
- "Could not move %s" : "%s ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ",
- "Permission denied" : "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ",
- "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 ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತದೆ. ಬೇರೆ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.",
- "Error when creating the file" : "ಕಡತವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ",
- "Error when creating the folder" : "ಕೊಶವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ",
"Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.",
"Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ",
"No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ",
@@ -18,6 +11,7 @@
"Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ",
"Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ",
"Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ",
+ "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.",
"Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.",
"Files" : "ಕಡತಗಳು",
"All files" : "ಎಲ್ಲಾ ಕಡತಗಳು",
@@ -32,14 +26,6 @@
"Select" : "ಆಯ್ಕೆ ಮಾಡಿ",
"Pending" : "ಬಾಕಿ ಇದೆ",
"Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
- "Error moving file." : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ.",
- "Error moving file" : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ",
- "Error" : "ತಪ್ಪಾಗಿದೆ",
- "{new_name} already exists" : "ಈಗಾಗಲೇ {new_name} ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ",
- "Could not rename file" : "ಕಡತ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ",
- "Could not create file" : "ಕಡತ ರಚಿಸಲಾಗಲಿಲ್ಲ",
- "Could not create folder" : "ಕೋಶವನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ",
- "Error deleting file." : "ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ಲೋಪವಾದೆ",
"Name" : "ಹೆಸರು",
"Size" : " ಪ್ರಮಾಣ",
"Modified" : "ಬದಲಾಯಿಸಿದ",
@@ -51,10 +37,9 @@
"File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.",
"Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು",
"Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ",
- "Upload" : "ವರ್ಗಾಯಿಸಿ",
- "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ",
"Folder" : "ಕಡತಕೋಶ",
"New folder" : "ಹೊಸ ಕಡತಕೋಶ",
+ "Upload" : "ವರ್ಗಾಯಿಸಿ",
"Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)",
"File handling" : "ಕಡತ ನಿರ್ವಹಣೆ",
"Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ",
@@ -69,6 +54,7 @@
"Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.",
"Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ",
"No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ",
- "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ"
+ "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ",
+ "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index 67b5e869e5e..13e917e3cfa 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "저장소를 사용할 수 없음",
"Storage invalid" : "저장소가 잘못됨",
"Unknown error" : "알 수 없는 오류",
- "Could not move %s - File with this name already exists" : "항목 %s을(를) 이동시킬 수 없음 - 같은 이름의 파일이 이미 존재함",
- "Could not move %s" : "항목 %s을(를) 이동시킬 수 없음",
- "Permission denied" : "권한 거부됨",
- "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에서 이미 사용 중입니다. 다른 이름을 사용하십시오.",
- "Error when creating the file" : "파일 생성 중 오류 발생",
- "Error when creating the folder" : "폴더 생성 중 오류 발생",
"Unable to set upload directory." : "업로드 디렉터리를 설정할 수 없습니다.",
"Invalid Token" : "잘못된 토큰",
"No file was uploaded. Unknown error" : "파일이 업로드 되지 않았습니다. 알 수 없는 오류입니다",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "임시 폴더가 없음",
"Failed to write to disk" : "디스크에 쓰지 못했습니다",
"Not enough storage available" : "저장소가 용량이 충분하지 않습니다.",
+ "The target folder has been moved or deleted." : "대상 폴더가 이동되거나 삭제되었습니다.",
"Upload failed. Could not find uploaded file" : "업로드에 실패했습니다. 업로드할 파일을 찾을 수 없습니다",
"Upload failed. Could not get file info." : "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.",
"Invalid directory." : "올바르지 않은 디렉터리입니다.",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "날짜를 결정할 수 없음",
"This operation is forbidden" : "이 작업이 금지됨",
"This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
- "Error moving file." : "파일 이동 오류.",
- "Error moving file" : "파일 이동 오류",
- "Error" : "오류",
- "{new_name} already exists" : "{new_name}이(가) 이미 존재함",
- "Could not rename file" : "이름을 변경할 수 없음",
- "Could not create file" : "파일을 만들 수 없음",
- "Could not create folder" : "폴더를 만들 수 없음",
- "Error deleting file." : "파일 삭제 오류.",
"No entries in this folder match '{filter}'" : "이 폴더에 '{filter}'와(과) 일치하는 항목 없음",
"Name" : "이름",
"Size" : "크기",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n바이트"],
"Favorited" : "책갈피에 추가됨",
"Favorite" : "즐겨찾기",
- "{newname} already exists" : "{newname} 항목이 이미 존재함",
- "Upload" : "업로드",
- "Text file" : "텍스트 파일",
- "New text file.txt" : "새 텍스트 파일.txt",
"Folder" : "폴더",
"New folder" : "새 폴더",
+ "{newname} already exists" : "{newname} 항목이 이미 존재함",
+ "Upload" : "업로드",
"An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생",
"A new file or folder has been <strong>created</strong>" : "새 파일이나 폴더가 <strong>생성됨</strong>",
"A file or folder has been <strong>changed</strong>" : "파일이나 폴더가 <strong>변경됨</strong>",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "%2$s 님이 변경함",
"Deleted by %2$s" : "%2$s 님이 삭제함",
"Restored by %2$s" : "%2$s 님이 복원함",
- "%s could not be renamed as it has been deleted" : "%s이(가) 삭제되었기 때문에 이름을 변경할 수 없습니다",
- "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다",
"Upload (max. %s)" : "업로드(최대 %s)",
"File handling" : "파일 처리",
"Maximum upload size" : "최대 업로드 크기",
"max. possible: " : "최대 가능:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM을 사용하고 있으면 설정 변화가 적용될 때까지 5분 정도 걸릴 수 있습니다.",
"Save" : "저장",
- "Can not be edited from here due to insufficient permissions." : "권한이 부족하므로 여기에서 편집할 수 없습니다.",
"Settings" : "설정",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "WebDAV로 파일에 접근하려면 <a href=\"%s\" target=\"_blank\">이 주소를 사용하십시오</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.",
"Currently scanning" : "현재 검사 중",
"No favorites" : "책갈피 없음",
- "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다"
+ "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다",
+ "Text file" : "텍스트 파일",
+ "New text file.txt" : "새 텍스트 파일.txt"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index 3c88e502b1f..1e77ab1b9bc 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -2,13 +2,6 @@
"Storage not available" : "저장소를 사용할 수 없음",
"Storage invalid" : "저장소가 잘못됨",
"Unknown error" : "알 수 없는 오류",
- "Could not move %s - File with this name already exists" : "항목 %s을(를) 이동시킬 수 없음 - 같은 이름의 파일이 이미 존재함",
- "Could not move %s" : "항목 %s을(를) 이동시킬 수 없음",
- "Permission denied" : "권한 거부됨",
- "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에서 이미 사용 중입니다. 다른 이름을 사용하십시오.",
- "Error when creating the file" : "파일 생성 중 오류 발생",
- "Error when creating the folder" : "폴더 생성 중 오류 발생",
"Unable to set upload directory." : "업로드 디렉터리를 설정할 수 없습니다.",
"Invalid Token" : "잘못된 토큰",
"No file was uploaded. Unknown error" : "파일이 업로드 되지 않았습니다. 알 수 없는 오류입니다",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "임시 폴더가 없음",
"Failed to write to disk" : "디스크에 쓰지 못했습니다",
"Not enough storage available" : "저장소가 용량이 충분하지 않습니다.",
+ "The target folder has been moved or deleted." : "대상 폴더가 이동되거나 삭제되었습니다.",
"Upload failed. Could not find uploaded file" : "업로드에 실패했습니다. 업로드할 파일을 찾을 수 없습니다",
"Upload failed. Could not get file info." : "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.",
"Invalid directory." : "올바르지 않은 디렉터리입니다.",
@@ -44,14 +38,6 @@
"Unable to determine date" : "날짜를 결정할 수 없음",
"This operation is forbidden" : "이 작업이 금지됨",
"This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
- "Error moving file." : "파일 이동 오류.",
- "Error moving file" : "파일 이동 오류",
- "Error" : "오류",
- "{new_name} already exists" : "{new_name}이(가) 이미 존재함",
- "Could not rename file" : "이름을 변경할 수 없음",
- "Could not create file" : "파일을 만들 수 없음",
- "Could not create folder" : "폴더를 만들 수 없음",
- "Error deleting file." : "파일 삭제 오류.",
"No entries in this folder match '{filter}'" : "이 폴더에 '{filter}'와(과) 일치하는 항목 없음",
"Name" : "이름",
"Size" : "크기",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n바이트"],
"Favorited" : "책갈피에 추가됨",
"Favorite" : "즐겨찾기",
- "{newname} already exists" : "{newname} 항목이 이미 존재함",
- "Upload" : "업로드",
- "Text file" : "텍스트 파일",
- "New text file.txt" : "새 텍스트 파일.txt",
"Folder" : "폴더",
"New folder" : "새 폴더",
+ "{newname} already exists" : "{newname} 항목이 이미 존재함",
+ "Upload" : "업로드",
"An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생",
"A new file or folder has been <strong>created</strong>" : "새 파일이나 폴더가 <strong>생성됨</strong>",
"A file or folder has been <strong>changed</strong>" : "파일이나 폴더가 <strong>변경됨</strong>",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "%2$s 님이 변경함",
"Deleted by %2$s" : "%2$s 님이 삭제함",
"Restored by %2$s" : "%2$s 님이 복원함",
- "%s could not be renamed as it has been deleted" : "%s이(가) 삭제되었기 때문에 이름을 변경할 수 없습니다",
- "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다",
"Upload (max. %s)" : "업로드(최대 %s)",
"File handling" : "파일 처리",
"Maximum upload size" : "최대 업로드 크기",
"max. possible: " : "최대 가능:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM을 사용하고 있으면 설정 변화가 적용될 때까지 5분 정도 걸릴 수 있습니다.",
"Save" : "저장",
- "Can not be edited from here due to insufficient permissions." : "권한이 부족하므로 여기에서 편집할 수 없습니다.",
"Settings" : "설정",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "WebDAV로 파일에 접근하려면 <a href=\"%s\" target=\"_blank\">이 주소를 사용하십시오</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.",
"Currently scanning" : "현재 검사 중",
"No favorites" : "책갈피 없음",
- "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다"
+ "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다",
+ "Text file" : "텍스트 파일",
+ "New text file.txt" : "새 텍스트 파일.txt"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ku_IQ.js b/apps/files/l10n/ku_IQ.js
index 32af16b3673..1ceca50b705 100644
--- a/apps/files/l10n/ku_IQ.js
+++ b/apps/files/l10n/ku_IQ.js
@@ -6,10 +6,9 @@ OC.L10N.register(
"Close" : "دابخه",
"Download" : "داگرتن",
"Select" : "دیاریکردنی",
- "Error" : "هه‌ڵه",
"Name" : "ناو",
- "Upload" : "بارکردن",
"Folder" : "بوخچه",
+ "Upload" : "بارکردن",
"Save" : "پاشکه‌وتکردن",
"Settings" : "ڕێکخستنه‌کان"
},
diff --git a/apps/files/l10n/ku_IQ.json b/apps/files/l10n/ku_IQ.json
index 4f1068bbb04..e934b5eb29b 100644
--- a/apps/files/l10n/ku_IQ.json
+++ b/apps/files/l10n/ku_IQ.json
@@ -4,10 +4,9 @@
"Close" : "دابخه",
"Download" : "داگرتن",
"Select" : "دیاریکردنی",
- "Error" : "هه‌ڵه",
"Name" : "ناو",
- "Upload" : "بارکردن",
"Folder" : "بوخچه",
+ "Upload" : "بارکردن",
"Save" : "پاشکه‌وتکردن",
"Settings" : "ڕێکخستنه‌کان"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js
index 047aac2dbb3..39e12b763cd 100644
--- a/apps/files/l10n/lb.js
+++ b/apps/files/l10n/lb.js
@@ -19,15 +19,13 @@ OC.L10N.register(
"Delete" : "Läschen",
"Details" : "Detailer",
"Select" : "Auswielen",
- "Error" : "Fehler",
"Name" : "Numm",
"Size" : "Gréisst",
"Modified" : "Geännert",
"New" : "Nei",
- "Upload" : "Eroplueden",
- "Text file" : "Text Fichier",
"Folder" : "Dossier",
"New folder" : "Neien Dossier",
+ "Upload" : "Eroplueden",
"File handling" : "Fichier handling",
"Maximum upload size" : "Maximum Upload Gréisst ",
"max. possible: " : "max. méiglech:",
@@ -38,6 +36,7 @@ OC.L10N.register(
"Select all" : "All auswielen",
"Upload too large" : "Upload ze grouss",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
- "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg."
+ "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg.",
+ "Text file" : "Text Fichier"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json
index f298444a35f..95148452566 100644
--- a/apps/files/l10n/lb.json
+++ b/apps/files/l10n/lb.json
@@ -17,15 +17,13 @@
"Delete" : "Läschen",
"Details" : "Detailer",
"Select" : "Auswielen",
- "Error" : "Fehler",
"Name" : "Numm",
"Size" : "Gréisst",
"Modified" : "Geännert",
"New" : "Nei",
- "Upload" : "Eroplueden",
- "Text file" : "Text Fichier",
"Folder" : "Dossier",
"New folder" : "Neien Dossier",
+ "Upload" : "Eroplueden",
"File handling" : "Fichier handling",
"Maximum upload size" : "Maximum Upload Gréisst ",
"max. possible: " : "max. méiglech:",
@@ -36,6 +34,7 @@
"Select all" : "All auswielen",
"Upload too large" : "Upload ze grouss",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
- "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg."
+ "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg.",
+ "Text file" : "Text Fichier"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/lo.js b/apps/files/l10n/lo.js
index 2f3b6e43d61..2d01379b83d 100644
--- a/apps/files/l10n/lo.js
+++ b/apps/files/l10n/lo.js
@@ -4,9 +4,6 @@ OC.L10N.register(
"Storage not available" : "ບໍ່ມີພື້ນທີ່ເກັບຂໍ້ມູນ",
"Storage invalid" : "ພື້ນທີ່ເກັບຂໍ້ມູນບໍ່ຖືກຕ້ອງ",
"Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ",
- "Could not move %s - File with this name already exists" : "ບໍ່ສາມາດຍ້າຍໄຟລ໌ %s ນີ້ໄດ້ - ຊື່ໄຟລ໌ນີ້ຖືກນຳໃຊ້ແລ້ວ",
- "Could not move %s" : "ບໍ່ສາມາດຍ້າຍ %s ໄດ້",
- "Permission denied" : "ບໍ່ທີສິດໃນການເຂົ້າເຖິງ",
"The target folder has been moved or deleted." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/lo.json b/apps/files/l10n/lo.json
index c7bfdc31dbb..12eea86a936 100644
--- a/apps/files/l10n/lo.json
+++ b/apps/files/l10n/lo.json
@@ -2,9 +2,6 @@
"Storage not available" : "ບໍ່ມີພື້ນທີ່ເກັບຂໍ້ມູນ",
"Storage invalid" : "ພື້ນທີ່ເກັບຂໍ້ມູນບໍ່ຖືກຕ້ອງ",
"Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ",
- "Could not move %s - File with this name already exists" : "ບໍ່ສາມາດຍ້າຍໄຟລ໌ %s ນີ້ໄດ້ - ຊື່ໄຟລ໌ນີ້ຖືກນຳໃຊ້ແລ້ວ",
- "Could not move %s" : "ບໍ່ສາມາດຍ້າຍ %s ໄດ້",
- "Permission denied" : "ບໍ່ທີສິດໃນການເຂົ້າເຖິງ",
"The target folder has been moved or deleted." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index f2ea62593c1..b4001e0c8ea 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Saugykla nepasiekiama",
"Storage invalid" : "Saugykla neteisinga",
"Unknown error" : "Neatpažinta klaida",
- "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",
- "Permission denied" : "Neturite teisių",
- "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.",
- "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ą.",
- "Error when creating the file" : "Klaida kuriant failą",
- "Error when creating the folder" : "Klaida kuriant aplanką",
"Unable to set upload directory." : "Nepavyksta nustatyti įkėlimų katalogo.",
"Invalid Token" : "Netinkamas ženklas",
"No file was uploaded. Unknown error" : "Failai nebuvo įkelti dėl nežinomos priežasties",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Nėra laikinojo katalogo",
"Failed to write to disk" : "Nepavyko įrašyti į diską",
"Not enough storage available" : "Nepakanka vietos serveryje",
+ "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.",
"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",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Nepavyksta nustatyti datos",
"This operation is forbidden" : "Ši operacija yra uždrausta",
"This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi",
- "Error moving file." : "Klaida perkeliant failą.",
- "Error moving file" : "Klaida perkeliant failą",
- "Error" : "Klaida",
- "{new_name} already exists" : "{new_name} jau egzistuoja",
- "Could not rename file" : "Neįmanoma pervadinti failo",
- "Could not create file" : "Neįmanoma sukurti failo",
- "Could not create folder" : "Neįmanoma sukurti aplanko",
- "Error deleting file." : "Klaida trinant failą.",
"No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“",
"Name" : "Pavadinimas",
"Size" : "Dydis",
@@ -75,8 +61,6 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų"],
"Favorited" : "Pažymėta mėgstamu",
"Favorite" : "Mėgiamas",
- "Text file" : "Teksto failas",
- "New text file.txt" : "Naujas tekstas file.txt",
"Folder" : "Katalogas",
"New folder" : "Naujas aplankas",
"{newname} already exists" : "{newname} jau egzistuoja",
@@ -99,15 +83,13 @@ OC.L10N.register(
"Changed by %2$s" : "Pakeitė %2$s",
"Deleted by %2$s" : "Ištrynė %2$s",
"Restored by %2$s" : "Atkūrė %2$s",
- "%s could not be renamed as it has been deleted" : "%s negalėjo būti pervadintas, nes buvo ištrintas",
- "%s could not be renamed" : "%s negali būti pervadintas",
"Upload (max. %s)" : "Įkelti (maks. %s)",
"File handling" : "Failų tvarkymas",
"Maximum upload size" : "Maksimalus įkeliamo failo dydis",
"max. possible: " : "maks. galima:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Su PHP-FPM reikšmės atnaujinimas gali užtrukti iki 5 minučių po pakeitimo.",
"Save" : "Išsaugoti",
- "Can not be edited from here due to insufficient permissions." : "Negali būti redaguojamas iš čia dėl leidimų trūkumo.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Su PHP-FPM atnaujinimai gali užtrukti apie 5min.",
+ "Missing permissions to edit from here." : "Draudžiama iš čia redaguoti",
"Settings" : "Nustatymai",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>",
@@ -121,6 +103,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.",
"Currently scanning" : "Šiuo metu skenuojama",
"No favorites" : "Nėra mėgstamiausių",
- "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia"
+ "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia",
+ "Text file" : "Teksto failas",
+ "New text file.txt" : "Naujas tekstas file.txt"
},
"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/lt_LT.json b/apps/files/l10n/lt_LT.json
index 56455896282..ba8610da86b 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -2,13 +2,6 @@
"Storage not available" : "Saugykla nepasiekiama",
"Storage invalid" : "Saugykla neteisinga",
"Unknown error" : "Neatpažinta klaida",
- "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",
- "Permission denied" : "Neturite teisių",
- "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.",
- "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ą.",
- "Error when creating the file" : "Klaida kuriant failą",
- "Error when creating the folder" : "Klaida kuriant aplanką",
"Unable to set upload directory." : "Nepavyksta nustatyti įkėlimų katalogo.",
"Invalid Token" : "Netinkamas ženklas",
"No file was uploaded. Unknown error" : "Failai nebuvo įkelti dėl nežinomos priežasties",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Nėra laikinojo katalogo",
"Failed to write to disk" : "Nepavyko įrašyti į diską",
"Not enough storage available" : "Nepakanka vietos serveryje",
+ "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.",
"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",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Nepavyksta nustatyti datos",
"This operation is forbidden" : "Ši operacija yra uždrausta",
"This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi",
- "Error moving file." : "Klaida perkeliant failą.",
- "Error moving file" : "Klaida perkeliant failą",
- "Error" : "Klaida",
- "{new_name} already exists" : "{new_name} jau egzistuoja",
- "Could not rename file" : "Neįmanoma pervadinti failo",
- "Could not create file" : "Neįmanoma sukurti failo",
- "Could not create folder" : "Neįmanoma sukurti aplanko",
- "Error deleting file." : "Klaida trinant failą.",
"No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“",
"Name" : "Pavadinimas",
"Size" : "Dydis",
@@ -73,8 +59,6 @@
"_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų"],
"Favorited" : "Pažymėta mėgstamu",
"Favorite" : "Mėgiamas",
- "Text file" : "Teksto failas",
- "New text file.txt" : "Naujas tekstas file.txt",
"Folder" : "Katalogas",
"New folder" : "Naujas aplankas",
"{newname} already exists" : "{newname} jau egzistuoja",
@@ -97,15 +81,13 @@
"Changed by %2$s" : "Pakeitė %2$s",
"Deleted by %2$s" : "Ištrynė %2$s",
"Restored by %2$s" : "Atkūrė %2$s",
- "%s could not be renamed as it has been deleted" : "%s negalėjo būti pervadintas, nes buvo ištrintas",
- "%s could not be renamed" : "%s negali būti pervadintas",
"Upload (max. %s)" : "Įkelti (maks. %s)",
"File handling" : "Failų tvarkymas",
"Maximum upload size" : "Maksimalus įkeliamo failo dydis",
"max. possible: " : "maks. galima:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Su PHP-FPM reikšmės atnaujinimas gali užtrukti iki 5 minučių po pakeitimo.",
"Save" : "Išsaugoti",
- "Can not be edited from here due to insufficient permissions." : "Negali būti redaguojamas iš čia dėl leidimų trūkumo.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Su PHP-FPM atnaujinimai gali užtrukti apie 5min.",
+ "Missing permissions to edit from here." : "Draudžiama iš čia redaguoti",
"Settings" : "Nustatymai",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>",
@@ -119,6 +101,8 @@
"Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.",
"Currently scanning" : "Šiuo metu skenuojama",
"No favorites" : "Nėra mėgstamiausių",
- "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia"
+ "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia",
+ "Text file" : "Teksto failas",
+ "New text file.txt" : "Naujas tekstas file.txt"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
index f0d5b4212b0..d615c8e5d28 100644
--- a/apps/files/l10n/lv.js
+++ b/apps/files/l10n/lv.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Glabātuve nav pieejama",
"Storage invalid" : "Nepareiza krātuve",
"Unknown error" : "Nezināma kļūda",
- "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",
- "Permission denied" : "Pieeja liegta",
- "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta",
- "The name %s is already used in the folder %s. Please choose a different name." : "Nosaukums '%s' jau tiek izmantots mapē '%s'. Lūdzu izvēlieties citu nosaukumu.",
- "Error when creating the file" : "Kļūda veidojot datni",
- "Error when creating the folder" : "Kļūda, veidojot mapi",
"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",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Trūkst pagaidu mapes",
"Failed to write to disk" : "Neizdevās saglabāt diskā",
"Not enough storage available" : "Nav pietiekami daudz vietas",
+ "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta",
"Upload failed. Could not find uploaded file" : "Augšupielāde nesekmīga. Neizdevās atrast augšupielādēto failu.",
"Upload failed. Could not get file info." : "Augšupielāde nesekmīga. Neizdevās iegūt informāciju par failu.",
"Invalid directory." : "Nederīga direktorija.",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Norādīt",
"Pending" : "Gaida savu kārtu",
"Unable to determine date" : "Neizdevās noteikt datumu",
- "Error moving file." : "Kļūda, pārvietojot datni.",
- "Error moving file" : "Kļūda, pārvietojot datni",
- "Error" : "Kļūda",
- "{new_name} already exists" : "{new_name} jau eksistē",
- "Could not rename file" : "Neizdevās pārsaukt datni",
- "Could not create file" : "Neizdevās izveidot datni",
- "Could not create folder" : "Neizdevās izveidot mapi",
- "Error deleting file." : "Kļūda, dzēšot datni.",
"No entries in this folder match '{filter}'" : "Šajā mapē nekas nav atrasts, meklējot pēc '{filter}'",
"Name" : "Nosaukums",
"Size" : "Izmērs",
@@ -69,10 +55,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["atrasts pēc '{filter}'","atrasts pēc '{filter}'","atrasti pēc '{filter}'"],
"Favorited" : "Favorīti",
"Favorite" : "Iecienītais",
- "Upload" : "Augšupielādēt",
- "Text file" : "Teksta datne",
"Folder" : "Mape",
"New folder" : "Jauna mape",
+ "Upload" : "Augšupielādēt",
"An error occurred while trying to update the tags" : "Atjaunojot atzīmes notika kļūda",
"A new file or folder has been <strong>created</strong>" : "<strong>Izveidots</strong> jauns fails vai mape",
"A file or folder has been <strong>changed</strong>" : "<strong>Izmainīts</strong> fails vai mape",
@@ -87,8 +72,6 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s izdzēsa %1$s",
"You restored %1$s" : "Tu atjaunoji %1$s",
"%2$s restored %1$s" : "%2$s atjaunoja %1$s",
- "%s could not be renamed as it has been deleted" : "Nevarēja pārsaukt %s, jo tas ir dzēsts",
- "%s could not be renamed" : "%s nevar tikt pārsaukts",
"Upload (max. %s)" : "Augšupielādēt (maks. %s)",
"File handling" : "Datņu pārvaldība",
"Maximum upload size" : "Maksimālais datņu augšupielādes apjoms",
@@ -106,6 +89,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.",
"Currently scanning" : "Pašlaik skenē",
"No favorites" : "Nav favorītu",
- "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit"
+ "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit",
+ "Text file" : "Teksta datne"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
index 14d0b4093df..0888d81ad64 100644
--- a/apps/files/l10n/lv.json
+++ b/apps/files/l10n/lv.json
@@ -2,13 +2,6 @@
"Storage not available" : "Glabātuve nav pieejama",
"Storage invalid" : "Nepareiza krātuve",
"Unknown error" : "Nezināma kļūda",
- "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",
- "Permission denied" : "Pieeja liegta",
- "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta",
- "The name %s is already used in the folder %s. Please choose a different name." : "Nosaukums '%s' jau tiek izmantots mapē '%s'. Lūdzu izvēlieties citu nosaukumu.",
- "Error when creating the file" : "Kļūda veidojot datni",
- "Error when creating the folder" : "Kļūda, veidojot mapi",
"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",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Trūkst pagaidu mapes",
"Failed to write to disk" : "Neizdevās saglabāt diskā",
"Not enough storage available" : "Nav pietiekami daudz vietas",
+ "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta",
"Upload failed. Could not find uploaded file" : "Augšupielāde nesekmīga. Neizdevās atrast augšupielādēto failu.",
"Upload failed. Could not get file info." : "Augšupielāde nesekmīga. Neizdevās iegūt informāciju par failu.",
"Invalid directory." : "Nederīga direktorija.",
@@ -42,14 +36,6 @@
"Select" : "Norādīt",
"Pending" : "Gaida savu kārtu",
"Unable to determine date" : "Neizdevās noteikt datumu",
- "Error moving file." : "Kļūda, pārvietojot datni.",
- "Error moving file" : "Kļūda, pārvietojot datni",
- "Error" : "Kļūda",
- "{new_name} already exists" : "{new_name} jau eksistē",
- "Could not rename file" : "Neizdevās pārsaukt datni",
- "Could not create file" : "Neizdevās izveidot datni",
- "Could not create folder" : "Neizdevās izveidot mapi",
- "Error deleting file." : "Kļūda, dzēšot datni.",
"No entries in this folder match '{filter}'" : "Šajā mapē nekas nav atrasts, meklējot pēc '{filter}'",
"Name" : "Nosaukums",
"Size" : "Izmērs",
@@ -67,10 +53,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["atrasts pēc '{filter}'","atrasts pēc '{filter}'","atrasti pēc '{filter}'"],
"Favorited" : "Favorīti",
"Favorite" : "Iecienītais",
- "Upload" : "Augšupielādēt",
- "Text file" : "Teksta datne",
"Folder" : "Mape",
"New folder" : "Jauna mape",
+ "Upload" : "Augšupielādēt",
"An error occurred while trying to update the tags" : "Atjaunojot atzīmes notika kļūda",
"A new file or folder has been <strong>created</strong>" : "<strong>Izveidots</strong> jauns fails vai mape",
"A file or folder has been <strong>changed</strong>" : "<strong>Izmainīts</strong> fails vai mape",
@@ -85,8 +70,6 @@
"%2$s deleted %1$s" : "%2$s izdzēsa %1$s",
"You restored %1$s" : "Tu atjaunoji %1$s",
"%2$s restored %1$s" : "%2$s atjaunoja %1$s",
- "%s could not be renamed as it has been deleted" : "Nevarēja pārsaukt %s, jo tas ir dzēsts",
- "%s could not be renamed" : "%s nevar tikt pārsaukts",
"Upload (max. %s)" : "Augšupielādēt (maks. %s)",
"File handling" : "Datņu pārvaldība",
"Maximum upload size" : "Maksimālais datņu augšupielādes apjoms",
@@ -104,6 +87,7 @@
"Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.",
"Currently scanning" : "Pašlaik skenē",
"No favorites" : "Nav favorītu",
- "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit"
+ "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit",
+ "Text file" : "Teksta datne"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js
index e6265c851e8..92616a372a3 100644
--- a/apps/files/l10n/mk.js
+++ b/apps/files/l10n/mk.js
@@ -2,10 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "Непозната грешка",
- "Could not move %s - File with this name already exists" : "Не можам да го преместам %s - Датотека со такво име веќе постои",
- "Could not move %s" : "Не можам да ги префрлам %s",
- "Error when creating the file" : "Грешка при креирање на датотека",
- "Error when creating the folder" : "Грешка при креирање на папка",
"Unable to set upload directory." : "Не може да се постави папката за префрлање на податоци.",
"Invalid Token" : "Грешен токен",
"No file was uploaded. Unknown error" : "Ниту еден фајл не се вчита. Непозната грешка",
@@ -33,12 +29,6 @@ OC.L10N.register(
"Details" : "Детали:",
"Select" : "Избери",
"Pending" : "Чека",
- "Error moving file" : "Грешка при префрлање на датотека",
- "Error" : "Грешка",
- "{new_name} already exists" : "{new_name} веќе постои",
- "Could not rename file" : "Не можам да ја преименувам датотеката",
- "Could not create file" : "Не множам да креирам датотека",
- "Could not create folder" : "Не можам да креирам папка",
"Name" : "Име",
"Size" : "Големина",
"Modified" : "Променето",
@@ -47,17 +37,15 @@ OC.L10N.register(
"File name cannot be empty." : "Името на датотеката не може да биде празно.",
"Your storage is full, files can not be updated or synced anymore!" : "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!",
"Your storage is almost full ({usedSpacePercent}%)" : "Вашиот сториџ е скоро полн ({usedSpacePercent}%)",
- "Upload" : "Подигни",
- "Text file" : "Текстуална датотека",
"Folder" : "Папка",
"New folder" : "Нова папка",
+ "Upload" : "Подигни",
"You created %1$s" : "Вие креиравте %1$s",
"%2$s created %1$s" : "%2$s креирано %1$s",
"You changed %1$s" : "Вие изменивте %1$s",
"%2$s changed %1$s" : "%2$s променето %1$s",
"You deleted %1$s" : "Вие избришавте %1$s",
"%2$s deleted %1$s" : "%2$s избришани %1$s",
- "%s could not be renamed" : "%s не може да биде преименуван",
"Upload (max. %s)" : "Префрлање (макс. %s)",
"File handling" : "Ракување со датотеки",
"Maximum upload size" : "Максимална големина за подигање",
@@ -68,6 +56,7 @@ OC.L10N.register(
"Cancel upload" : "Откажи прикачување",
"Upload too large" : "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
- "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте."
+ "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.",
+ "Text file" : "Текстуална датотека"
},
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json
index 0806f7d0966..147707256c6 100644
--- a/apps/files/l10n/mk.json
+++ b/apps/files/l10n/mk.json
@@ -1,9 +1,5 @@
{ "translations": {
"Unknown error" : "Непозната грешка",
- "Could not move %s - File with this name already exists" : "Не можам да го преместам %s - Датотека со такво име веќе постои",
- "Could not move %s" : "Не можам да ги префрлам %s",
- "Error when creating the file" : "Грешка при креирање на датотека",
- "Error when creating the folder" : "Грешка при креирање на папка",
"Unable to set upload directory." : "Не може да се постави папката за префрлање на податоци.",
"Invalid Token" : "Грешен токен",
"No file was uploaded. Unknown error" : "Ниту еден фајл не се вчита. Непозната грешка",
@@ -31,12 +27,6 @@
"Details" : "Детали:",
"Select" : "Избери",
"Pending" : "Чека",
- "Error moving file" : "Грешка при префрлање на датотека",
- "Error" : "Грешка",
- "{new_name} already exists" : "{new_name} веќе постои",
- "Could not rename file" : "Не можам да ја преименувам датотеката",
- "Could not create file" : "Не множам да креирам датотека",
- "Could not create folder" : "Не можам да креирам папка",
"Name" : "Име",
"Size" : "Големина",
"Modified" : "Променето",
@@ -45,17 +35,15 @@
"File name cannot be empty." : "Името на датотеката не може да биде празно.",
"Your storage is full, files can not be updated or synced anymore!" : "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!",
"Your storage is almost full ({usedSpacePercent}%)" : "Вашиот сториџ е скоро полн ({usedSpacePercent}%)",
- "Upload" : "Подигни",
- "Text file" : "Текстуална датотека",
"Folder" : "Папка",
"New folder" : "Нова папка",
+ "Upload" : "Подигни",
"You created %1$s" : "Вие креиравте %1$s",
"%2$s created %1$s" : "%2$s креирано %1$s",
"You changed %1$s" : "Вие изменивте %1$s",
"%2$s changed %1$s" : "%2$s променето %1$s",
"You deleted %1$s" : "Вие избришавте %1$s",
"%2$s deleted %1$s" : "%2$s избришани %1$s",
- "%s could not be renamed" : "%s не може да биде преименуван",
"Upload (max. %s)" : "Префрлање (макс. %s)",
"File handling" : "Ракување со датотеки",
"Maximum upload size" : "Максимална големина за подигање",
@@ -66,6 +54,7 @@
"Cancel upload" : "Откажи прикачување",
"Upload too large" : "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
- "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте."
+ "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.",
+ "Text file" : "Текстуална датотека"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js
index 7ef2afeb84e..b60faff6bd9 100644
--- a/apps/files/l10n/ms_MY.js
+++ b/apps/files/l10n/ms_MY.js
@@ -16,14 +16,12 @@ OC.L10N.register(
"Rename" : "Namakan",
"Delete" : "Padam",
"Pending" : "Dalam proses",
- "Error" : "Ralat",
"Name" : "Nama",
"Size" : "Saiz",
"Modified" : "Dimodifikasi",
"New" : "Baru",
- "Upload" : "Muat naik",
- "Text file" : "Fail teks",
"Folder" : "Folder",
+ "Upload" : "Muat naik",
"You created %1$s" : "Anda telah membina %1$s",
"%2$s created %1$s" : "%2$s membina %1$s",
"You changed %1$s" : "Anda menukar %1$s",
@@ -35,6 +33,7 @@ OC.L10N.register(
"Cancel upload" : "Batal muat naik",
"Upload too large" : "Muatnaik terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
- "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar."
+ "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar.",
+ "Text file" : "Fail teks"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json
index aec2dd50949..fa78e9446b7 100644
--- a/apps/files/l10n/ms_MY.json
+++ b/apps/files/l10n/ms_MY.json
@@ -14,14 +14,12 @@
"Rename" : "Namakan",
"Delete" : "Padam",
"Pending" : "Dalam proses",
- "Error" : "Ralat",
"Name" : "Nama",
"Size" : "Saiz",
"Modified" : "Dimodifikasi",
"New" : "Baru",
- "Upload" : "Muat naik",
- "Text file" : "Fail teks",
"Folder" : "Folder",
+ "Upload" : "Muat naik",
"You created %1$s" : "Anda telah membina %1$s",
"%2$s created %1$s" : "%2$s membina %1$s",
"You changed %1$s" : "Anda menukar %1$s",
@@ -33,6 +31,7 @@
"Cancel upload" : "Batal muat naik",
"Upload too large" : "Muatnaik terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
- "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar."
+ "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar.",
+ "Text file" : "Fail teks"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js
index 7fe475a6a22..9d01ad626b7 100644
--- a/apps/files/l10n/nb_NO.js
+++ b/apps/files/l10n/nb_NO.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Lagringsplass ikke tilgjengelig",
"Storage invalid" : "Lagringsplass ugyldig",
"Unknown error" : "Ukjent feil",
- "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",
- "Permission denied" : "Tilgang nektet",
- "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.",
- "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.",
- "Error when creating the file" : "Feil ved oppretting av filen",
- "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.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Mangler midlertidig mappe",
"Failed to write to disk" : "Klarte ikke å skrive til disk",
"Not enough storage available" : "Ikke nok lagringsplass",
+ "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.",
"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.",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Operasjonen er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
- "Error moving file." : "Feil ved flytting av fil.",
- "Error moving file" : "Feil ved flytting av fil",
- "Error" : "Feil",
- "{new_name} already exists" : "{new_name} finnes allerede",
- "Could not rename file" : "Klarte ikke å gi nytt navn til fil",
- "Could not create file" : "Klarte ikke å opprette fil",
- "Could not create folder" : "Klarte ikke å opprette mappe",
- "Error deleting file." : "Feil ved sletting av fil.",
"No entries in this folder match '{filter}'" : "Ingen oppføringer i denne mappen stemmer med '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Er favoritt",
"Favorite" : "Gjør til favoritt",
- "{newname} already exists" : "{newname} finnes allerede",
- "Upload" : "Last opp",
- "Text file" : "Tekstfil",
- "New text file.txt" : "Ny tekstfil.txt",
"Folder" : "Mappe",
"New folder" : "Ny mappe",
+ "{newname} already exists" : "{newname} finnes allerede",
+ "Upload" : "Last opp",
"An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av taggene",
"A new file or folder has been <strong>created</strong>" : "En ny fil eller mappe ble <strong>opprettet</strong>",
"A file or folder has been <strong>changed</strong>" : "En fil eller mappe ble <strong>endret</strong>",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Endret av %2$s",
"Deleted by %2$s" : "Slettet av %2$s",
"Restored by %2$s" : "Gjenopprettet av %2$s",
- "%s could not be renamed as it has been deleted" : "%s kunne ikke gis nytt navn da den er blitt slettet",
- "%s could not be renamed" : "Kunne ikke gi nytt navn til %s",
"Upload (max. %s)" : "Opplasting (maks. %s)",
"File handling" : "Filhåndtering",
"Maximum upload size" : "Største opplastingsstørrelse",
"max. possible: " : "max. mulige:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM kan det ta inntil 5 minutter fra denne verdien lagres til den trer i kraft.",
"Save" : "Lagre",
- "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres her pga. manglende rettigheter.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Skanner filer, vennligst vent.",
"Currently scanning" : "Skanner nå",
"No favorites" : "Ingen favoritter",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her"
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her",
+ "Text file" : "Tekstfil",
+ "New text file.txt" : "Ny tekstfil.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json
index 69e8ca742aa..32eb320296c 100644
--- a/apps/files/l10n/nb_NO.json
+++ b/apps/files/l10n/nb_NO.json
@@ -2,13 +2,6 @@
"Storage not available" : "Lagringsplass ikke tilgjengelig",
"Storage invalid" : "Lagringsplass ugyldig",
"Unknown error" : "Ukjent feil",
- "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",
- "Permission denied" : "Tilgang nektet",
- "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.",
- "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.",
- "Error when creating the file" : "Feil ved oppretting av filen",
- "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.",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Mangler midlertidig mappe",
"Failed to write to disk" : "Klarte ikke å skrive til disk",
"Not enough storage available" : "Ikke nok lagringsplass",
+ "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.",
"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.",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Operasjonen er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
- "Error moving file." : "Feil ved flytting av fil.",
- "Error moving file" : "Feil ved flytting av fil",
- "Error" : "Feil",
- "{new_name} already exists" : "{new_name} finnes allerede",
- "Could not rename file" : "Klarte ikke å gi nytt navn til fil",
- "Could not create file" : "Klarte ikke å opprette fil",
- "Could not create folder" : "Klarte ikke å opprette mappe",
- "Error deleting file." : "Feil ved sletting av fil.",
"No entries in this folder match '{filter}'" : "Ingen oppføringer i denne mappen stemmer med '{filter}'",
"Name" : "Navn",
"Size" : "Størrelse",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Er favoritt",
"Favorite" : "Gjør til favoritt",
- "{newname} already exists" : "{newname} finnes allerede",
- "Upload" : "Last opp",
- "Text file" : "Tekstfil",
- "New text file.txt" : "Ny tekstfil.txt",
"Folder" : "Mappe",
"New folder" : "Ny mappe",
+ "{newname} already exists" : "{newname} finnes allerede",
+ "Upload" : "Last opp",
"An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av taggene",
"A new file or folder has been <strong>created</strong>" : "En ny fil eller mappe ble <strong>opprettet</strong>",
"A file or folder has been <strong>changed</strong>" : "En fil eller mappe ble <strong>endret</strong>",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Endret av %2$s",
"Deleted by %2$s" : "Slettet av %2$s",
"Restored by %2$s" : "Gjenopprettet av %2$s",
- "%s could not be renamed as it has been deleted" : "%s kunne ikke gis nytt navn da den er blitt slettet",
- "%s could not be renamed" : "Kunne ikke gi nytt navn til %s",
"Upload (max. %s)" : "Opplasting (maks. %s)",
"File handling" : "Filhåndtering",
"Maximum upload size" : "Største opplastingsstørrelse",
"max. possible: " : "max. mulige:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM kan det ta inntil 5 minutter fra denne verdien lagres til den trer i kraft.",
"Save" : "Lagre",
- "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres her pga. manglende rettigheter.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Skanner filer, vennligst vent.",
"Currently scanning" : "Skanner nå",
"No favorites" : "Ingen favoritter",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her"
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her",
+ "Text file" : "Tekstfil",
+ "New text file.txt" : "Ny tekstfil.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/nds.js b/apps/files/l10n/nds.js
index 9b28220ae43..bb3dc429711 100644
--- a/apps/files/l10n/nds.js
+++ b/apps/files/l10n/nds.js
@@ -3,7 +3,10 @@ OC.L10N.register(
{
"Files" : "Dateien",
"Delete" : "Löschen",
+ "Details" : "Details",
"Name" : "Name",
+ "New folder" : "Neuer Ordner",
+ "Upload" : "Hochladen",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV"
},
diff --git a/apps/files/l10n/nds.json b/apps/files/l10n/nds.json
index 4ab8de68b35..c8e93f2fa2b 100644
--- a/apps/files/l10n/nds.json
+++ b/apps/files/l10n/nds.json
@@ -1,7 +1,10 @@
{ "translations": {
"Files" : "Dateien",
"Delete" : "Löschen",
+ "Details" : "Details",
"Name" : "Name",
+ "New folder" : "Neuer Ordner",
+ "Upload" : "Hochladen",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 53ec6c1d804..f99d3314230 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Opslag niet beschikbaar",
"Storage invalid" : "Opslag ongeldig",
"Unknown error" : "Onbekende fout",
- "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",
- "Permission denied" : "Toegang geweigerd",
- "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.",
- "Error when creating the file" : "Fout bij creëren bestand",
- "Error when creating the folder" : "Fout bij aanmaken map",
"Unable to set upload directory." : "Kan uploadmap niet instellen.",
"Invalid Token" : "Ongeldig Token",
"No file was uploaded. Unknown error" : "Er was geen bestand geladen. Onbekende fout",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "De doelmap is verplaatst of verwijderd.",
"Upload failed. Could not find uploaded file" : "Upload mislukt. Kon geüploade bestand niet vinden",
"Upload failed. Could not get file info." : "Upload mislukt. Kon geen bestandsinfo krijgen.",
"Invalid directory." : "Ongeldige directory.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favorieten",
"Home" : "Thuis",
"Close" : "Sluiten",
+ "Upload cancelled." : "Uploaden geannuleerd.",
"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",
"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.",
"Actions" : "Acties",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Kon datum niet vaststellen",
"This operation is forbidden" : "Deze taak is verboden",
"This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
- "Error moving file." : "Fout bij verplaatsen bestand.",
- "Error moving file" : "Fout bij verplaatsen bestand",
- "Error" : "Fout",
- "{new_name} already exists" : "{new_name} bestaat al",
- "Could not rename file" : "Kon de naam van het bestand niet wijzigen",
- "Could not create file" : "Kon bestand niet creëren",
- "Could not create folder" : "Kon niet creëren map",
- "Error deleting file." : "Fout bij verwijderen bestand.",
+ "Could not move \"{file}\", target exists" : "Kon \"{file}\" niet verplaatsen, doel bestaat al",
+ "Could not move \"{file}\"" : "Kon \"{file}\" niet verplaatsen",
+ "{newName} already exists" : "{newName} bestaat al",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Kon \"{fileName}\" niet hernoemen, het bestaat niet meer",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{targetName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
+ "Could not rename \"{fileName}\"" : "Kon \"{fileName}\" niet hernoemen",
+ "Could not create file \"{file}\"" : "Kon \"{file}\" niet aanmaken",
+ "Could not create file \"{file}\" because it already exists" : "Kon \"{file}\" niet aanmaken omdat het al bestaat",
+ "Could not create folder \"{dir}\"" : "Kon map \"{dir}\" niet aanmaken",
+ "Could not create folder \"{dir}\" because it already exists" : "Kon map \"{dir}\" niet aanmaken omdat die al bestaat",
+ "Error deleting file \"{fileName}\"." : "Fout bij verwijderen bestand \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'",
"Name" : "Naam",
"Size" : "Grootte",
@@ -74,12 +71,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Favoriet",
"Favorite" : "Favoriet",
- "{newname} already exists" : "{newname} bestaat al",
- "Upload" : "Uploaden",
- "Text file" : "Tekstbestand",
- "New text file.txt" : "Nieuw tekstbestand.txt",
"Folder" : "Map",
"New folder" : "Nieuwe map",
+ "{newname} already exists" : "{newname} bestaat al",
+ "Upload" : "Uploaden",
"An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de tags bij te werken",
"A new file or folder has been <strong>created</strong>" : "Een nieuw bestand of map is <strong>aangemaakt</strong>",
"A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>",
@@ -98,15 +93,13 @@ OC.L10N.register(
"Changed by %2$s" : "Gewijzigd door %2$s",
"Deleted by %2$s" : "Verwijderd door %2$s",
"Restored by %2$s" : "Hersteld door %2$s",
- "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is",
- "%s could not be renamed" : "%s kon niet worden hernoemd",
"Upload (max. %s)" : "Upload (max. %s)",
"File handling" : "Bestand",
"Maximum upload size" : "Maximale bestandsgrootte voor uploads",
"max. possible: " : "max. mogelijk: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Met PHP-FPM kan het tot 5 minuten duren voordat de aanpassing van deze waarde effect heeft.",
"Save" : "Bewaren",
- "Can not be edited from here due to insufficient permissions." : "Kan hier niet worden bewerkt wegens onvoldoende permissies.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Met PHP-FPM kan het 5 minuten duren voordat wijzigingen zijn doorgevoerd.",
+ "Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.",
"Settings" : "Instellingen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\">om uw bestanden via WebDAV te benaderen</a>",
@@ -120,6 +113,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.",
"Currently scanning" : "Nu aan het scannen",
"No favorites" : "Geen favorieten",
- "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont"
+ "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont",
+ "Text file" : "Tekstbestand",
+ "New text file.txt" : "Nieuw tekstbestand.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index 6a077b1cc1a..aaf4edcfdd4 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -2,13 +2,6 @@
"Storage not available" : "Opslag niet beschikbaar",
"Storage invalid" : "Opslag ongeldig",
"Unknown error" : "Onbekende fout",
- "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",
- "Permission denied" : "Toegang geweigerd",
- "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.",
- "Error when creating the file" : "Fout bij creëren bestand",
- "Error when creating the folder" : "Fout bij aanmaken map",
"Unable to set upload directory." : "Kan uploadmap niet instellen.",
"Invalid Token" : "Ongeldig Token",
"No file was uploaded. Unknown error" : "Er was geen bestand geladen. Onbekende fout",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "De doelmap is verplaatst of verwijderd.",
"Upload failed. Could not find uploaded file" : "Upload mislukt. Kon geüploade bestand niet vinden",
"Upload failed. Could not get file info." : "Upload mislukt. Kon geen bestandsinfo krijgen.",
"Invalid directory." : "Ongeldige directory.",
@@ -28,10 +22,10 @@
"Favorites" : "Favorieten",
"Home" : "Thuis",
"Close" : "Sluiten",
+ "Upload cancelled." : "Uploaden geannuleerd.",
"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",
"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.",
"Actions" : "Acties",
@@ -44,14 +38,17 @@
"Unable to determine date" : "Kon datum niet vaststellen",
"This operation is forbidden" : "Deze taak is verboden",
"This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
- "Error moving file." : "Fout bij verplaatsen bestand.",
- "Error moving file" : "Fout bij verplaatsen bestand",
- "Error" : "Fout",
- "{new_name} already exists" : "{new_name} bestaat al",
- "Could not rename file" : "Kon de naam van het bestand niet wijzigen",
- "Could not create file" : "Kon bestand niet creëren",
- "Could not create folder" : "Kon niet creëren map",
- "Error deleting file." : "Fout bij verwijderen bestand.",
+ "Could not move \"{file}\", target exists" : "Kon \"{file}\" niet verplaatsen, doel bestaat al",
+ "Could not move \"{file}\"" : "Kon \"{file}\" niet verplaatsen",
+ "{newName} already exists" : "{newName} bestaat al",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Kon \"{fileName}\" niet hernoemen, het bestaat niet meer",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{targetName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
+ "Could not rename \"{fileName}\"" : "Kon \"{fileName}\" niet hernoemen",
+ "Could not create file \"{file}\"" : "Kon \"{file}\" niet aanmaken",
+ "Could not create file \"{file}\" because it already exists" : "Kon \"{file}\" niet aanmaken omdat het al bestaat",
+ "Could not create folder \"{dir}\"" : "Kon map \"{dir}\" niet aanmaken",
+ "Could not create folder \"{dir}\" because it already exists" : "Kon map \"{dir}\" niet aanmaken omdat die al bestaat",
+ "Error deleting file \"{fileName}\"." : "Fout bij verwijderen bestand \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'",
"Name" : "Naam",
"Size" : "Grootte",
@@ -72,12 +69,10 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Favoriet",
"Favorite" : "Favoriet",
- "{newname} already exists" : "{newname} bestaat al",
- "Upload" : "Uploaden",
- "Text file" : "Tekstbestand",
- "New text file.txt" : "Nieuw tekstbestand.txt",
"Folder" : "Map",
"New folder" : "Nieuwe map",
+ "{newname} already exists" : "{newname} bestaat al",
+ "Upload" : "Uploaden",
"An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de tags bij te werken",
"A new file or folder has been <strong>created</strong>" : "Een nieuw bestand of map is <strong>aangemaakt</strong>",
"A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>",
@@ -96,15 +91,13 @@
"Changed by %2$s" : "Gewijzigd door %2$s",
"Deleted by %2$s" : "Verwijderd door %2$s",
"Restored by %2$s" : "Hersteld door %2$s",
- "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is",
- "%s could not be renamed" : "%s kon niet worden hernoemd",
"Upload (max. %s)" : "Upload (max. %s)",
"File handling" : "Bestand",
"Maximum upload size" : "Maximale bestandsgrootte voor uploads",
"max. possible: " : "max. mogelijk: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Met PHP-FPM kan het tot 5 minuten duren voordat de aanpassing van deze waarde effect heeft.",
"Save" : "Bewaren",
- "Can not be edited from here due to insufficient permissions." : "Kan hier niet worden bewerkt wegens onvoldoende permissies.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Met PHP-FPM kan het 5 minuten duren voordat wijzigingen zijn doorgevoerd.",
+ "Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.",
"Settings" : "Instellingen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\">om uw bestanden via WebDAV te benaderen</a>",
@@ -118,6 +111,8 @@
"Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.",
"Currently scanning" : "Nu aan het scannen",
"No favorites" : "Geen favorieten",
- "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont"
+ "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont",
+ "Text file" : "Tekstbestand",
+ "New text file.txt" : "Nieuw tekstbestand.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js
index 924670d596b..efe3707c213 100644
--- a/apps/files/l10n/nn_NO.js
+++ b/apps/files/l10n/nn_NO.js
@@ -2,8 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "Ukjend feil",
- "Could not move %s - File with this name already exists" : "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet",
- "Could not move %s" : "Klarte ikkje flytta %s",
"Unable to set upload directory." : "Klarte ikkje å endra opplastingsmappa.",
"Invalid Token" : "Ugyldig token",
"No file was uploaded. Unknown error" : "Ingen filer lasta opp. Ukjend feil",
@@ -22,8 +20,8 @@ OC.L10N.register(
"Favorites" : "Favorittar",
"Home" : "Heime",
"Close" : "Lukk",
- "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.",
"Upload cancelled." : "Opplasting avbroten.",
+ "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.",
"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.",
"Actions" : "Handlingar",
@@ -32,9 +30,6 @@ OC.L10N.register(
"Delete" : "Slett",
"Details" : "Detaljar",
"Pending" : "Under vegs",
- "Error moving file" : "Feil ved flytting av fil",
- "Error" : "Feil",
- "{new_name} already exists" : "{new_name} finst allereie",
"Name" : "Namn",
"Size" : "Storleik",
"Modified" : "Endra",
@@ -47,10 +42,9 @@ OC.L10N.register(
"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} %)",
"Favorite" : "Favoritt",
- "Upload" : "Last opp",
- "Text file" : "Tekst fil",
"Folder" : "Mappe",
"New folder" : "Ny mappe",
+ "Upload" : "Last opp",
"A new file or folder has been <strong>created</strong>" : "Ei ny fil eller mappe er <strong>oppretta</strong>",
"A file or folder has been <strong>changed</strong>" : "Ei fil eller mappe er <strong>endra</strong>",
"A file or folder has been <strong>deleted</strong>" : "Ei fil eller mappe er <strong>sletta</strong>",
@@ -61,7 +55,6 @@ OC.L10N.register(
"%2$s changed %1$s" : "%2$s endra %1$s",
"You deleted %1$s" : "Du sletta %1$s",
"%2$s deleted %1$s" : "%2$s sletta %1$s",
- "%s could not be renamed" : "Klarte ikkje å omdøypa på %s",
"File handling" : "Filhandtering",
"Maximum upload size" : "Maksimal opplastingsstorleik",
"max. possible: " : "maks. moglege:",
@@ -71,6 +64,7 @@ OC.L10N.register(
"Cancel upload" : "Avbryt opplasting",
"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."
+ "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent.",
+ "Text file" : "Tekst fil"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json
index 05e6f0a9d2d..929f8c0d7fe 100644
--- a/apps/files/l10n/nn_NO.json
+++ b/apps/files/l10n/nn_NO.json
@@ -1,7 +1,5 @@
{ "translations": {
"Unknown error" : "Ukjend feil",
- "Could not move %s - File with this name already exists" : "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet",
- "Could not move %s" : "Klarte ikkje flytta %s",
"Unable to set upload directory." : "Klarte ikkje å endra opplastingsmappa.",
"Invalid Token" : "Ugyldig token",
"No file was uploaded. Unknown error" : "Ingen filer lasta opp. Ukjend feil",
@@ -20,8 +18,8 @@
"Favorites" : "Favorittar",
"Home" : "Heime",
"Close" : "Lukk",
- "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.",
"Upload cancelled." : "Opplasting avbroten.",
+ "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.",
"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.",
"Actions" : "Handlingar",
@@ -30,9 +28,6 @@
"Delete" : "Slett",
"Details" : "Detaljar",
"Pending" : "Under vegs",
- "Error moving file" : "Feil ved flytting av fil",
- "Error" : "Feil",
- "{new_name} already exists" : "{new_name} finst allereie",
"Name" : "Namn",
"Size" : "Storleik",
"Modified" : "Endra",
@@ -45,10 +40,9 @@
"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} %)",
"Favorite" : "Favoritt",
- "Upload" : "Last opp",
- "Text file" : "Tekst fil",
"Folder" : "Mappe",
"New folder" : "Ny mappe",
+ "Upload" : "Last opp",
"A new file or folder has been <strong>created</strong>" : "Ei ny fil eller mappe er <strong>oppretta</strong>",
"A file or folder has been <strong>changed</strong>" : "Ei fil eller mappe er <strong>endra</strong>",
"A file or folder has been <strong>deleted</strong>" : "Ei fil eller mappe er <strong>sletta</strong>",
@@ -59,7 +53,6 @@
"%2$s changed %1$s" : "%2$s endra %1$s",
"You deleted %1$s" : "Du sletta %1$s",
"%2$s deleted %1$s" : "%2$s sletta %1$s",
- "%s could not be renamed" : "Klarte ikkje å omdøypa på %s",
"File handling" : "Filhandtering",
"Maximum upload size" : "Maksimal opplastingsstorleik",
"max. possible: " : "maks. moglege:",
@@ -69,6 +62,7 @@
"Cancel upload" : "Avbryt opplasting",
"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."
+ "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent.",
+ "Text file" : "Tekst fil"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js
index 6a0a05c782a..a3088b663fd 100644
--- a/apps/files/l10n/oc.js
+++ b/apps/files/l10n/oc.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Supòrt d'emmagazinatge pas disponible",
"Storage invalid" : "Supòrt d'emmagazinatge pas valable",
"Unknown error" : "Error Desconeguda ",
- "Could not move %s - File with this name already exists" : "Impossible de desplaçar %s - Un fichièr que pòrta aqueste nom existís ja",
- "Could not move %s" : "Impossible de desplaçar %s",
- "Permission denied" : "Permission refusada",
- "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Lo nom %s es ja utilizat dins lo dorsièr %s. Mercé de causir un nom diferent.",
- "Error when creating the file" : "Error pendent la creacion del fichièr",
- "Error when creating the folder" : "Error pendent la creacion del dorsièr",
"Unable to set upload directory." : "Impossible de definir lo dorsièr de destinacion.",
"Invalid Token" : "Geton invalid",
"No file was uploaded. Unknown error" : "Cap de fichièr es pas estat mandat. Error desconeguda",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Abséncia de dorsièr temporari",
"Failed to write to disk" : "Error d'escritura sul disc",
"Not enough storage available" : "Pas pro d'espaci d'emmagazinatge de disponible",
+ "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.",
"Upload failed. Could not find uploaded file" : "Lo mandadís a fracassat. Impossible de trobar lo fichièr mandat.",
"Upload failed. Could not get file info." : "Lo mandadís a fracassat. Impossible d'obténer las informacions del fichièr.",
"Invalid directory." : "Dorsièr invalid.",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Impossible de determinar la data",
"This operation is forbidden" : "L'operacion es interdicha",
"This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
- "Error moving file." : "Error al moment del desplaçament del fichièr.",
- "Error moving file" : "Error al moment del desplaçament del fichièr",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} existís ja",
- "Could not rename file" : "Impossible de renomenar lo fichièr",
- "Could not create file" : "Impossible de crear lo fichièr",
- "Could not create folder" : "Impossible de crear lo dorsièr",
- "Error deleting file." : "Error pendent la supression del fichièr.",
+ "Could not move \"{file}\", target exists" : "Impossible de desplaçar \"{file}\", la cibla existís",
+ "Could not move \"{file}\"" : "Impossible de desplaçar \"{file}\"",
+ "{newName} already exists" : "{newName} existís ja",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renomenar \"{file}\", existís pas mai",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Lo nom \"{targetName}\" es ja utilizat dins lo dorsièr \"{dir}\". Mercé de causir un nom diferent.",
+ "Could not rename \"{fileName}\"" : "Impossible de renomenar \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Impossible de crear lo fichièr \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossible de crear lo fichièr \"{file}\" perque existís ja",
+ "Could not create folder \"{dir}\"" : "Impossible de crear lo dorsièr \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossible de crear lo dorsièr \"{dir}\" perque existís ja",
+ "Error deleting file \"{fileName}\"." : "Error pendent la supression del fichièr \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Cap d'entrada d'aqueste dorsièr correspond pas a '{filter}'",
"Name" : "Nom",
"Size" : "Talha",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
"Favorited" : "Marcat coma favorit",
"Favorite" : "Favorit",
- "{newname} already exists" : "{new_name} existís ja",
- "Upload" : "Cargament",
- "Text file" : "Fichièr tèxte",
- "New text file.txt" : "Novèl fichièr tèxte .txt",
"Folder" : "Dorsièr",
"New folder" : "Novèl dorsièr",
+ "{newname} already exists" : "{new_name} existís ja",
+ "Upload" : "Cargament",
"An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas",
"A new file or folder has been <strong>created</strong>" : "Un novèl fichièr o repertòri es estat <strong>creat</strong>",
"A file or folder has been <strong>changed</strong>" : "Un fichièr o un repertòri es estat <strong>modificat</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "Modificat per %2$s",
"Deleted by %2$s" : "Suprimit per %2$s",
"Restored by %2$s" : "Restablit per %2$s",
- "%s could not be renamed as it has been deleted" : "%s pòt pas èsser renomenat perque es estat suprimit ",
- "%s could not be renamed" : "%s pòt pas èsser renomenat",
"Upload (max. %s)" : "Mandadís (max. %s)",
"File handling" : "Gestion de fichièrs",
"Maximum upload size" : "Talha max. de mandadís",
"max. possible: " : "Max. possible :",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Amb PHP-FPM, se pòdon passar fins a 5 minutas abans qu'aquesta valor siá aplicada.",
"Save" : "Salvar",
- "Can not be edited from here due to insufficient permissions." : "Pòt pas èsser modificat aicí a causa de permissions insufisentas.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Amb PHP-FPM se pòdon passar 5 minutas per que los cambiaments s'apliquen.",
+ "Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizatz aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir a vòstres fichièrs per WebDAV</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.",
"Currently scanning" : "Analisi en cors",
"No favorites" : "Pas cap de favorit",
- "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí"
+ "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí",
+ "Text file" : "Fichièr tèxte",
+ "New text file.txt" : "Novèl fichièr tèxte .txt"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json
index 0577b75076a..c6048605696 100644
--- a/apps/files/l10n/oc.json
+++ b/apps/files/l10n/oc.json
@@ -2,13 +2,6 @@
"Storage not available" : "Supòrt d'emmagazinatge pas disponible",
"Storage invalid" : "Supòrt d'emmagazinatge pas valable",
"Unknown error" : "Error Desconeguda ",
- "Could not move %s - File with this name already exists" : "Impossible de desplaçar %s - Un fichièr que pòrta aqueste nom existís ja",
- "Could not move %s" : "Impossible de desplaçar %s",
- "Permission denied" : "Permission refusada",
- "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Lo nom %s es ja utilizat dins lo dorsièr %s. Mercé de causir un nom diferent.",
- "Error when creating the file" : "Error pendent la creacion del fichièr",
- "Error when creating the folder" : "Error pendent la creacion del dorsièr",
"Unable to set upload directory." : "Impossible de definir lo dorsièr de destinacion.",
"Invalid Token" : "Geton invalid",
"No file was uploaded. Unknown error" : "Cap de fichièr es pas estat mandat. Error desconeguda",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Abséncia de dorsièr temporari",
"Failed to write to disk" : "Error d'escritura sul disc",
"Not enough storage available" : "Pas pro d'espaci d'emmagazinatge de disponible",
+ "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.",
"Upload failed. Could not find uploaded file" : "Lo mandadís a fracassat. Impossible de trobar lo fichièr mandat.",
"Upload failed. Could not get file info." : "Lo mandadís a fracassat. Impossible d'obténer las informacions del fichièr.",
"Invalid directory." : "Dorsièr invalid.",
@@ -44,14 +38,17 @@
"Unable to determine date" : "Impossible de determinar la data",
"This operation is forbidden" : "L'operacion es interdicha",
"This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
- "Error moving file." : "Error al moment del desplaçament del fichièr.",
- "Error moving file" : "Error al moment del desplaçament del fichièr",
- "Error" : "Error",
- "{new_name} already exists" : "{new_name} existís ja",
- "Could not rename file" : "Impossible de renomenar lo fichièr",
- "Could not create file" : "Impossible de crear lo fichièr",
- "Could not create folder" : "Impossible de crear lo dorsièr",
- "Error deleting file." : "Error pendent la supression del fichièr.",
+ "Could not move \"{file}\", target exists" : "Impossible de desplaçar \"{file}\", la cibla existís",
+ "Could not move \"{file}\"" : "Impossible de desplaçar \"{file}\"",
+ "{newName} already exists" : "{newName} existís ja",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renomenar \"{file}\", existís pas mai",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Lo nom \"{targetName}\" es ja utilizat dins lo dorsièr \"{dir}\". Mercé de causir un nom diferent.",
+ "Could not rename \"{fileName}\"" : "Impossible de renomenar \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Impossible de crear lo fichièr \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossible de crear lo fichièr \"{file}\" perque existís ja",
+ "Could not create folder \"{dir}\"" : "Impossible de crear lo dorsièr \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossible de crear lo dorsièr \"{dir}\" perque existís ja",
+ "Error deleting file \"{fileName}\"." : "Error pendent la supression del fichièr \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Cap d'entrada d'aqueste dorsièr correspond pas a '{filter}'",
"Name" : "Nom",
"Size" : "Talha",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
"Favorited" : "Marcat coma favorit",
"Favorite" : "Favorit",
- "{newname} already exists" : "{new_name} existís ja",
- "Upload" : "Cargament",
- "Text file" : "Fichièr tèxte",
- "New text file.txt" : "Novèl fichièr tèxte .txt",
"Folder" : "Dorsièr",
"New folder" : "Novèl dorsièr",
+ "{newname} already exists" : "{new_name} existís ja",
+ "Upload" : "Cargament",
"An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas",
"A new file or folder has been <strong>created</strong>" : "Un novèl fichièr o repertòri es estat <strong>creat</strong>",
"A file or folder has been <strong>changed</strong>" : "Un fichièr o un repertòri es estat <strong>modificat</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "Modificat per %2$s",
"Deleted by %2$s" : "Suprimit per %2$s",
"Restored by %2$s" : "Restablit per %2$s",
- "%s could not be renamed as it has been deleted" : "%s pòt pas èsser renomenat perque es estat suprimit ",
- "%s could not be renamed" : "%s pòt pas èsser renomenat",
"Upload (max. %s)" : "Mandadís (max. %s)",
"File handling" : "Gestion de fichièrs",
"Maximum upload size" : "Talha max. de mandadís",
"max. possible: " : "Max. possible :",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Amb PHP-FPM, se pòdon passar fins a 5 minutas abans qu'aquesta valor siá aplicada.",
"Save" : "Salvar",
- "Can not be edited from here due to insufficient permissions." : "Pòt pas èsser modificat aicí a causa de permissions insufisentas.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Amb PHP-FPM se pòdon passar 5 minutas per que los cambiaments s'apliquen.",
+ "Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.",
"Settings" : "Paramètres",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizatz aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir a vòstres fichièrs per WebDAV</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.",
"Currently scanning" : "Analisi en cors",
"No favorites" : "Pas cap de favorit",
- "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí"
+ "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí",
+ "Text file" : "Fichièr tèxte",
+ "New text file.txt" : "Novèl fichièr tèxte .txt"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/pa.js b/apps/files/l10n/pa.js
index dfb7c392837..847adbc5ac1 100644
--- a/apps/files/l10n/pa.js
+++ b/apps/files/l10n/pa.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"Rename" : "ਨਾਂ ਬਦਲੋ",
"Delete" : "ਹਟਾਓ",
"Details" : "ਵੇਰਵ",
- "Error" : "ਗਲਤੀ",
"Upload" : "ਅੱਪਲੋਡ",
"Settings" : "ਸੈਟਿੰਗ",
"Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ"
diff --git a/apps/files/l10n/pa.json b/apps/files/l10n/pa.json
index c1f4dae97fa..6d7025feec1 100644
--- a/apps/files/l10n/pa.json
+++ b/apps/files/l10n/pa.json
@@ -5,7 +5,6 @@
"Rename" : "ਨਾਂ ਬਦਲੋ",
"Delete" : "ਹਟਾਓ",
"Details" : "ਵੇਰਵ",
- "Error" : "ਗਲਤੀ",
"Upload" : "ਅੱਪਲੋਡ",
"Settings" : "ਸੈਟਿੰਗ",
"Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ"
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index 5cba43675dd..6478fbe5eb4 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Pamięć nie dostępna",
"Storage invalid" : "Pamięć nieprawidłowa",
"Unknown error" : "Nieznany błąd",
- "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",
- "Permission denied" : "Dostęp zabroniony",
- "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ę.",
- "Error when creating the file" : "Błąd przy tworzeniu pliku",
- "Error when creating the folder" : "Błąd przy tworzeniu folderu",
"Unable to set upload directory." : "Nie można ustawić katalog wczytywania.",
"Invalid Token" : "Nieprawidłowy Token",
"No file was uploaded. Unknown error" : "Żaden plik nie został załadowany. Nieznany błąd",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Folder docelowy został przeniesiony lub usunięty",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Ulubione",
"Home" : "Dom",
"Close" : "Zamknij",
+ "Upload cancelled." : "Wczytywanie anulowane.",
"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",
"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.",
"Actions" : "Akcje",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Wybierz",
"Pending" : "Oczekujące",
"Unable to determine date" : "Nie można ustalić daty",
- "Error moving file." : "Błąd podczas przenoszenia pliku.",
- "Error moving file" : "Błąd prz przenoszeniu pliku",
- "Error" : "Błąd",
- "{new_name} already exists" : "{new_name} już istnieje",
- "Could not rename file" : "Nie można zmienić nazwy pliku",
- "Could not create file" : "Nie można utworzyć pliku",
- "Could not create folder" : "Nie można utworzyć folderu",
- "Error deleting file." : "Błąd podczas usuwania pliku",
"No entries in this folder match '{filter}'" : "Brak wyników pasujących do '{filter}'",
"Name" : "Nazwa",
"Size" : "Rozmiar",
@@ -70,10 +56,9 @@ OC.L10N.register(
"Your storage is almost full ({usedSpacePercent}%)" : "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
"Favorited" : "Ulubione",
"Favorite" : "Ulubione",
- "Upload" : "Wyślij",
- "Text file" : "Plik tekstowy",
"Folder" : "Folder",
"New folder" : "Nowy folder",
+ "Upload" : "Wyślij",
"A new file or folder has been <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>",
"A file or folder has been <strong>changed</strong>" : "Plik lub folder został <strong>zmieniony</strong>",
"A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>",
@@ -87,8 +72,6 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s usunął %1$s",
"You restored %1$s" : "Przywróciłeś %1$s",
"%2$s restored %1$s" : "%2$s przywrócił %1$s",
- "%s could not be renamed as it has been deleted" : "%s nie może mieć zmienionej nazwy, ponieważ został usunięty",
- "%s could not be renamed" : "%s nie można zmienić nazwy",
"Upload (max. %s)" : "Wysyłka (max. %s)",
"File handling" : "Zarządzanie plikami",
"Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku",
@@ -103,6 +86,7 @@ OC.L10N.register(
"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ć.",
- "Currently scanning" : "Aktualnie skanowane"
+ "Currently scanning" : "Aktualnie skanowane",
+ "Text file" : "Plik tekstowy"
},
"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/pl.json b/apps/files/l10n/pl.json
index 5b09f326134..98a0592cc75 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -2,13 +2,6 @@
"Storage not available" : "Pamięć nie dostępna",
"Storage invalid" : "Pamięć nieprawidłowa",
"Unknown error" : "Nieznany błąd",
- "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",
- "Permission denied" : "Dostęp zabroniony",
- "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ę.",
- "Error when creating the file" : "Błąd przy tworzeniu pliku",
- "Error when creating the folder" : "Błąd przy tworzeniu folderu",
"Unable to set upload directory." : "Nie można ustawić katalog wczytywania.",
"Invalid Token" : "Nieprawidłowy Token",
"No file was uploaded. Unknown error" : "Żaden plik nie został załadowany. Nieznany błąd",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Folder docelowy został przeniesiony lub usunięty",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Ulubione",
"Home" : "Dom",
"Close" : "Zamknij",
+ "Upload cancelled." : "Wczytywanie anulowane.",
"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",
"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.",
"Actions" : "Akcje",
@@ -42,14 +36,6 @@
"Select" : "Wybierz",
"Pending" : "Oczekujące",
"Unable to determine date" : "Nie można ustalić daty",
- "Error moving file." : "Błąd podczas przenoszenia pliku.",
- "Error moving file" : "Błąd prz przenoszeniu pliku",
- "Error" : "Błąd",
- "{new_name} already exists" : "{new_name} już istnieje",
- "Could not rename file" : "Nie można zmienić nazwy pliku",
- "Could not create file" : "Nie można utworzyć pliku",
- "Could not create folder" : "Nie można utworzyć folderu",
- "Error deleting file." : "Błąd podczas usuwania pliku",
"No entries in this folder match '{filter}'" : "Brak wyników pasujących do '{filter}'",
"Name" : "Nazwa",
"Size" : "Rozmiar",
@@ -68,10 +54,9 @@
"Your storage is almost full ({usedSpacePercent}%)" : "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
"Favorited" : "Ulubione",
"Favorite" : "Ulubione",
- "Upload" : "Wyślij",
- "Text file" : "Plik tekstowy",
"Folder" : "Folder",
"New folder" : "Nowy folder",
+ "Upload" : "Wyślij",
"A new file or folder has been <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>",
"A file or folder has been <strong>changed</strong>" : "Plik lub folder został <strong>zmieniony</strong>",
"A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>",
@@ -85,8 +70,6 @@
"%2$s deleted %1$s" : "%2$s usunął %1$s",
"You restored %1$s" : "Przywróciłeś %1$s",
"%2$s restored %1$s" : "%2$s przywrócił %1$s",
- "%s could not be renamed as it has been deleted" : "%s nie może mieć zmienionej nazwy, ponieważ został usunięty",
- "%s could not be renamed" : "%s nie można zmienić nazwy",
"Upload (max. %s)" : "Wysyłka (max. %s)",
"File handling" : "Zarządzanie plikami",
"Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku",
@@ -101,6 +84,7 @@
"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ć.",
- "Currently scanning" : "Aktualnie skanowane"
+ "Currently scanning" : "Aktualnie skanowane",
+ "Text file" : "Plik tekstowy"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 70d38e747ba..6619da366e9 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Armazanamento não disponível",
"Storage invalid" : "Armazenamento invávilido",
"Unknown error" : "Erro desconhecido",
- "Could not move %s - File with this name already exists" : "Impossível mover %s - Já existe um arquivo com esse nome",
- "Could not move %s" : "Impossível mover %s",
- "Permission denied" : "Permissão Negada",
- "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.",
- "Error when creating the file" : "Erro ao criar o arquivo",
- "Error when creating the folder" : "Erro ao criar a pasta",
"Unable to set upload directory." : "Impossível configurar o diretório de envio",
"Invalid Token" : "Token inválido",
"No file was uploaded. Unknown error" : "Nenhum arquivo foi enviado. Erro desconhecido",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "A pasta de destino foi movida ou excluída.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favoritos",
"Home" : "Home",
"Close" : "Fechar",
+ "Upload cancelled." : "Envio cancelado.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do arquivo {size1} excede o 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." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.",
"Actions" : "Ações",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Impossível determinar a data",
"This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador",
- "Error moving file." : "Erro movendo o arquivo.",
- "Error moving file" : "Erro movendo o arquivo",
- "Error" : "Erro",
- "{new_name} already exists" : "{new_name} já existe",
- "Could not rename file" : "Não foi possível renomear o arquivo",
- "Could not create file" : "Não foi possível criar o arquivo",
- "Could not create folder" : "Não foi possível criar a pasta",
- "Error deleting file." : "Erro eliminando o arquivo.",
"No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'",
"Name" : "Nome",
"Size" : "Tamanho",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Favorito",
"Favorite" : "Favorito",
- "{newname} already exists" : "{newname} já existe",
- "Upload" : "Enviar",
- "Text file" : "Arquivo texto",
- "New text file.txt" : "Novo texto file.txt",
"Folder" : "Pasta",
"New folder" : "Nova pasta",
+ "{newname} already exists" : "{newname} já existe",
+ "Upload" : "Enviar",
"An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas",
"A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>",
"A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>",
@@ -99,15 +83,13 @@ OC.L10N.register(
"Changed by %2$s" : "Modificado por %2$s",
"Deleted by %2$s" : "Deletado por %2$s",
"Restored by %2$s" : "Restaurado por %2$s",
- "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado",
- "%s could not be renamed" : "%s não pode ser renomeado",
"Upload (max. %s)" : "Envio (max. %s)",
"File handling" : "Tratamento de Arquivo",
"Maximum upload size" : "Tamanho máximo para envio",
"max. possible: " : "max. possível:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor pode demorar até 5 minutos para fazer efeito depois de ser salvo.",
"Save" : "Salvar",
- "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.",
+ "Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.",
"Settings" : "Configurações",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\">para ter acesso aos seus Arquivos via WebDAV</a>",
@@ -121,6 +103,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.",
"Currently scanning" : "Atualmente escaneando",
"No favorites" : "Sem favoritos",
- "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui"
+ "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui",
+ "Text file" : "Arquivo texto",
+ "New text file.txt" : "Novo texto file.txt"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index d0023e7d5be..e656d9e0079 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -2,13 +2,6 @@
"Storage not available" : "Armazanamento não disponível",
"Storage invalid" : "Armazenamento invávilido",
"Unknown error" : "Erro desconhecido",
- "Could not move %s - File with this name already exists" : "Impossível mover %s - Já existe um arquivo com esse nome",
- "Could not move %s" : "Impossível mover %s",
- "Permission denied" : "Permissão Negada",
- "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.",
- "Error when creating the file" : "Erro ao criar o arquivo",
- "Error when creating the folder" : "Erro ao criar a pasta",
"Unable to set upload directory." : "Impossível configurar o diretório de envio",
"Invalid Token" : "Token inválido",
"No file was uploaded. Unknown error" : "Nenhum arquivo foi enviado. Erro desconhecido",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "A pasta de destino foi movida ou excluída.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favoritos",
"Home" : "Home",
"Close" : "Fechar",
+ "Upload cancelled." : "Envio cancelado.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do arquivo {size1} excede o 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." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.",
"Actions" : "Ações",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Impossível determinar a data",
"This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador",
- "Error moving file." : "Erro movendo o arquivo.",
- "Error moving file" : "Erro movendo o arquivo",
- "Error" : "Erro",
- "{new_name} already exists" : "{new_name} já existe",
- "Could not rename file" : "Não foi possível renomear o arquivo",
- "Could not create file" : "Não foi possível criar o arquivo",
- "Could not create folder" : "Não foi possível criar a pasta",
- "Error deleting file." : "Erro eliminando o arquivo.",
"No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'",
"Name" : "Nome",
"Size" : "Tamanho",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Favorito",
"Favorite" : "Favorito",
- "{newname} already exists" : "{newname} já existe",
- "Upload" : "Enviar",
- "Text file" : "Arquivo texto",
- "New text file.txt" : "Novo texto file.txt",
"Folder" : "Pasta",
"New folder" : "Nova pasta",
+ "{newname} already exists" : "{newname} já existe",
+ "Upload" : "Enviar",
"An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas",
"A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>",
"A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>",
@@ -97,15 +81,13 @@
"Changed by %2$s" : "Modificado por %2$s",
"Deleted by %2$s" : "Deletado por %2$s",
"Restored by %2$s" : "Restaurado por %2$s",
- "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado",
- "%s could not be renamed" : "%s não pode ser renomeado",
"Upload (max. %s)" : "Envio (max. %s)",
"File handling" : "Tratamento de Arquivo",
"Maximum upload size" : "Tamanho máximo para envio",
"max. possible: " : "max. possível:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor pode demorar até 5 minutos para fazer efeito depois de ser salvo.",
"Save" : "Salvar",
- "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.",
+ "Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.",
"Settings" : "Configurações",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\">para ter acesso aos seus Arquivos via WebDAV</a>",
@@ -119,6 +101,8 @@
"Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.",
"Currently scanning" : "Atualmente escaneando",
"No favorites" : "Sem favoritos",
- "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui"
+ "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui",
+ "Text file" : "Arquivo texto",
+ "New text file.txt" : "Novo texto file.txt"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index 5474826994f..ecb66e0eb1a 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Armazenamento indisposinvel",
"Storage invalid" : "Armazenamento inválido",
"Unknown error" : "Erro Desconhecido",
- "Could not move %s - File with this name already exists" : "Não foi possível mover %s - Já existe um ficheiro com este nome",
- "Could not move %s" : "Não foi possível mover %s",
- "Permission denied" : "Permissão negada",
- "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.",
- "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.",
- "Error when creating the file" : "Erro ao criar o ficheiro",
- "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" : "Não foi enviado nenhum ficheiro. Erro desconhecido",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "A pasta temporária está em falta",
"Failed to write to disk" : "Não foi possível gravar no disco",
"Not enough storage available" : "Não há espaço suficiente em disco",
+ "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.",
"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." : "Diretoria inválida.",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Impossível determinar a data",
"This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
- "Error moving file." : "Erro a mover o ficheiro.",
- "Error moving file" : "Erro ao mover o ficheiro",
- "Error" : "Erro",
- "{new_name} already exists" : "O nome {new_name} já existe",
- "Could not rename file" : "Não pôde renomear o ficheiro",
- "Could not create file" : "Não pôde criar ficheiro",
- "Could not create folder" : "Não pôde criar pasta",
- "Error deleting file." : "Erro ao apagar o ficheiro.",
"No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'",
"Name" : "Nome",
"Size" : "Tamanho",
@@ -75,8 +61,6 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Assinalado como Favorito",
"Favorite" : "Favorito",
- "Text file" : "Ficheiro de Texto",
- "New text file.txt" : "Novo texto ficheiro.txt",
"Folder" : "Pasta",
"New folder" : "Nova Pasta",
"{newname} already exists" : "{newname} já existe",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Alterado por %2$s",
"Deleted by %2$s" : "Eliminado por %2$s",
"Restored by %2$s" : "Restaurado por %2$s",
- "%s could not be renamed as it has been deleted" : "Não foi possível renomear %s devido a ter sido eliminado",
- "%s could not be renamed" : "%s não pode ser renomeada",
"Upload (max. %s)" : "Enviar (max. %s)",
"File handling" : "Manuseamento do ficheiro",
"Maximum upload size" : "Tamanho máximo de envio",
"max. possible: " : "Máx. possível: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor poderá demorar até 5 minutos para ser aplicado depois de guardar.",
"Save" : "Guardar",
- "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.",
"Settings" : "Definições",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.",
"Currently scanning" : "A analisar",
"No favorites" : "Sem favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui"
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui",
+ "Text file" : "Ficheiro de Texto",
+ "New text file.txt" : "Novo texto ficheiro.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 44bf606a97f..bdbdb7225bb 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -2,13 +2,6 @@
"Storage not available" : "Armazenamento indisposinvel",
"Storage invalid" : "Armazenamento inválido",
"Unknown error" : "Erro Desconhecido",
- "Could not move %s - File with this name already exists" : "Não foi possível mover %s - Já existe um ficheiro com este nome",
- "Could not move %s" : "Não foi possível mover %s",
- "Permission denied" : "Permissão negada",
- "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.",
- "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.",
- "Error when creating the file" : "Erro ao criar o ficheiro",
- "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" : "Não foi enviado nenhum ficheiro. Erro desconhecido",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "A pasta temporária está em falta",
"Failed to write to disk" : "Não foi possível gravar no disco",
"Not enough storage available" : "Não há espaço suficiente em disco",
+ "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.",
"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." : "Diretoria inválida.",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Impossível determinar a data",
"This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
- "Error moving file." : "Erro a mover o ficheiro.",
- "Error moving file" : "Erro ao mover o ficheiro",
- "Error" : "Erro",
- "{new_name} already exists" : "O nome {new_name} já existe",
- "Could not rename file" : "Não pôde renomear o ficheiro",
- "Could not create file" : "Não pôde criar ficheiro",
- "Could not create folder" : "Não pôde criar pasta",
- "Error deleting file." : "Erro ao apagar o ficheiro.",
"No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'",
"Name" : "Nome",
"Size" : "Tamanho",
@@ -73,8 +59,6 @@
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Assinalado como Favorito",
"Favorite" : "Favorito",
- "Text file" : "Ficheiro de Texto",
- "New text file.txt" : "Novo texto ficheiro.txt",
"Folder" : "Pasta",
"New folder" : "Nova Pasta",
"{newname} already exists" : "{newname} já existe",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Alterado por %2$s",
"Deleted by %2$s" : "Eliminado por %2$s",
"Restored by %2$s" : "Restaurado por %2$s",
- "%s could not be renamed as it has been deleted" : "Não foi possível renomear %s devido a ter sido eliminado",
- "%s could not be renamed" : "%s não pode ser renomeada",
"Upload (max. %s)" : "Enviar (max. %s)",
"File handling" : "Manuseamento do ficheiro",
"Maximum upload size" : "Tamanho máximo de envio",
"max. possible: " : "Máx. possível: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor poderá demorar até 5 minutos para ser aplicado depois de guardar.",
"Save" : "Guardar",
- "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.",
"Settings" : "Definições",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.",
"Currently scanning" : "A analisar",
"No favorites" : "Sem favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui"
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui",
+ "Text file" : "Ficheiro de Texto",
+ "New text file.txt" : "Novo texto ficheiro.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 83593b4ba8a..54e7c505c9a 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Spațiu de stocare indisponibil",
"Storage invalid" : "Spațiu de stocare invalid",
"Unknown error" : "Eroare necunoscută",
- "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 se poate muta %s",
- "Permission denied" : "Accesul interzis",
- "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Numele %s este deja este folosit în dosarul %s. Te rog alege alt nume.",
- "Error when creating the file" : "Eroare la crearea fișierului",
- "Error when creating the folder" : "Eroare la crearea dosarului",
"Unable to set upload directory." : "Imposibil de a seta directorul pentru încărcare.",
"Invalid Token" : "Jeton Invalid",
"No file was uploaded. Unknown error" : "Niciun fișier nu a fost încărcat. Eroare necunoscută",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Lipsește un dosar temporar",
"Failed to write to disk" : "Eroare la scrierea pe disc",
"Not enough storage available" : "Nu este disponibil suficient spațiu",
+ "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.",
"Upload failed. Could not find uploaded file" : "Încărcare eșuată. Nu se poate găsi fișierul încărcat",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Favorite",
"Home" : "Acasă",
"Close" : "Închide",
+ "Upload cancelled." : "Încărcare anulată.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de încărcare de {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
- "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.",
"Actions" : "Acțiuni",
@@ -43,14 +37,6 @@ OC.L10N.register(
"Details" : "Detalii",
"Select" : "Alege",
"Pending" : "În așteptare",
- "Error moving file." : "Eroare la mutarea fișierului.",
- "Error moving file" : "Eroare la mutarea fișierului",
- "Error" : "Eroare",
- "{new_name} already exists" : "{new_name} există deja",
- "Could not rename file" : "Nu s-a putut redenumi fișierul",
- "Could not create file" : "Nu s-a putut crea fisierul",
- "Could not create folder" : "Nu s-a putut crea folderul",
- "Error deleting file." : "Eroare la ștergerea fișierului.",
"Name" : "Nume",
"Size" : "Mărime",
"Modified" : "Modificat",
@@ -65,10 +51,9 @@ OC.L10N.register(
"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}%)",
"Favorite" : "Favorit",
- "Upload" : "Încărcă",
- "Text file" : "Fișier text",
"Folder" : "Dosar",
"New folder" : "Un nou dosar",
+ "Upload" : "Încărcă",
"A new file or folder has been <strong>created</strong>" : "Un nou fișier sau dosar a fost <strong>creat</strong>",
"A file or folder has been <strong>changed</strong>" : "Un nou fișier sau dosar a fost <strong>modificat</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un nou fișier sau dosar a fost <strong>șters</strong>",
@@ -82,8 +67,6 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s a șters %1$s",
"You restored %1$s" : "Ai restaurat %1$s",
"%2$s restored %1$s" : "%2$s a restaurat %1$s",
- "%s could not be renamed as it has been deleted" : "%s nu a putut fi redenumit deoarece a fost sters",
- "%s could not be renamed" : "%s nu a putut fi redenumit",
"Upload (max. %s)" : "Încarcă (max. %s)",
"File handling" : "Manipulare fișiere",
"Maximum upload size" : "Dimensiune maximă admisă la încărcare",
@@ -97,6 +80,7 @@ OC.L10N.register(
"Upload too large" : "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
"Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.",
- "Currently scanning" : "Acum scanează"
+ "Currently scanning" : "Acum scanează",
+ "Text file" : "Fișier text"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index a2544bba28d..3fe8ba180bb 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -2,13 +2,6 @@
"Storage not available" : "Spațiu de stocare indisponibil",
"Storage invalid" : "Spațiu de stocare invalid",
"Unknown error" : "Eroare necunoscută",
- "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 se poate muta %s",
- "Permission denied" : "Accesul interzis",
- "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Numele %s este deja este folosit în dosarul %s. Te rog alege alt nume.",
- "Error when creating the file" : "Eroare la crearea fișierului",
- "Error when creating the folder" : "Eroare la crearea dosarului",
"Unable to set upload directory." : "Imposibil de a seta directorul pentru încărcare.",
"Invalid Token" : "Jeton Invalid",
"No file was uploaded. Unknown error" : "Niciun fișier nu a fost încărcat. Eroare necunoscută",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Lipsește un dosar temporar",
"Failed to write to disk" : "Eroare la scrierea pe disc",
"Not enough storage available" : "Nu este disponibil suficient spațiu",
+ "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.",
"Upload failed. Could not find uploaded file" : "Încărcare eșuată. Nu se poate găsi fișierul încărcat",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Favorite",
"Home" : "Acasă",
"Close" : "Închide",
+ "Upload cancelled." : "Încărcare anulată.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de încărcare de {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
- "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.",
"Actions" : "Acțiuni",
@@ -41,14 +35,6 @@
"Details" : "Detalii",
"Select" : "Alege",
"Pending" : "În așteptare",
- "Error moving file." : "Eroare la mutarea fișierului.",
- "Error moving file" : "Eroare la mutarea fișierului",
- "Error" : "Eroare",
- "{new_name} already exists" : "{new_name} există deja",
- "Could not rename file" : "Nu s-a putut redenumi fișierul",
- "Could not create file" : "Nu s-a putut crea fisierul",
- "Could not create folder" : "Nu s-a putut crea folderul",
- "Error deleting file." : "Eroare la ștergerea fișierului.",
"Name" : "Nume",
"Size" : "Mărime",
"Modified" : "Modificat",
@@ -63,10 +49,9 @@
"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}%)",
"Favorite" : "Favorit",
- "Upload" : "Încărcă",
- "Text file" : "Fișier text",
"Folder" : "Dosar",
"New folder" : "Un nou dosar",
+ "Upload" : "Încărcă",
"A new file or folder has been <strong>created</strong>" : "Un nou fișier sau dosar a fost <strong>creat</strong>",
"A file or folder has been <strong>changed</strong>" : "Un nou fișier sau dosar a fost <strong>modificat</strong>",
"A file or folder has been <strong>deleted</strong>" : "Un nou fișier sau dosar a fost <strong>șters</strong>",
@@ -80,8 +65,6 @@
"%2$s deleted %1$s" : "%2$s a șters %1$s",
"You restored %1$s" : "Ai restaurat %1$s",
"%2$s restored %1$s" : "%2$s a restaurat %1$s",
- "%s could not be renamed as it has been deleted" : "%s nu a putut fi redenumit deoarece a fost sters",
- "%s could not be renamed" : "%s nu a putut fi redenumit",
"Upload (max. %s)" : "Încarcă (max. %s)",
"File handling" : "Manipulare fișiere",
"Maximum upload size" : "Dimensiune maximă admisă la încărcare",
@@ -95,6 +78,7 @@
"Upload too large" : "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
"Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.",
- "Currently scanning" : "Acum scanează"
+ "Currently scanning" : "Acum scanează",
+ "Text file" : "Fișier text"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 270cc3c6a85..f4b71563e6e 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Хранилище недоступно",
"Storage invalid" : "Хранилище неисправно",
"Unknown error" : "Неизвестная ошибка",
- "Could not move %s - File with this name already exists" : "Невозможно переместить %s - файл с таким именем уже существует",
- "Could not move %s" : "Невозможно переместить %s",
- "Permission denied" : "В доступе отказано",
- "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. Укажите другое имя.",
- "Error when creating the file" : "Ошибка при создании файла",
- "Error when creating the folder" : "Ошибка создания каталога",
"Unable to set upload directory." : "Невозможно установить каталог загрузки.",
"Invalid Token" : "Недопустимый маркер",
"No file was uploaded. Unknown error" : "Файл не был загружен. Неизвестная ошибка",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Отсутствует временный каталог",
"Failed to write to disk" : "Ошибка записи на диск",
"Not enough storage available" : "Недостаточно доступного места в хранилище",
+ "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.",
"Upload failed. Could not find uploaded file" : "Загрузка не удалась. Невозможно найти загружаемый файл",
"Upload failed. Could not get file info." : "Загрузка не удалась. Невозможно получить информацию о файле",
"Invalid directory." : "Неверный каталог.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Избранное",
"Home" : "Главная",
"Close" : "Закрыть",
+ "Upload cancelled." : "Загрузка отменена.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно загрузить {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." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.",
"Actions" : "Действия",
@@ -46,14 +40,15 @@ OC.L10N.register(
"Unable to determine date" : "Невозможно определить дату",
"This operation is forbidden" : "Операция запрещена",
"This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором",
- "Error moving file." : "Ошибка при перемещении файла.",
- "Error moving file" : "Ошибка при перемещении файла",
- "Error" : "Ошибка",
- "{new_name} already exists" : "{new_name} уже существует",
- "Could not rename file" : "Не удалось переименовать файл",
- "Could not create file" : "Не удалось создать файл",
- "Could not create folder" : "Не удалось создать каталог",
- "Error deleting file." : "Ошибка при удалении файла.",
+ "Could not move \"{file}\", target exists" : "Невозможно переместить \"{file}\", цель отсутствует",
+ "Could not move \"{file}\"" : "Невозможно переместить \"{file}\"",
+ "{newName} already exists" : "{newName} уже имеется",
+ "Could not rename \"{fileName}\"" : "Невозможно переименовать \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Невозможно создать файл \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Невозможно создать файл \"{file}\" потому что уже имеется",
+ "Could not create folder \"{dir}\"" : "Невозможно создать папку \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Невозможно создать папку \"{dir}\" потому что уже имеется",
+ "Error deleting file \"{fileName}\"." : "Ошибка удаления файла \"{fileName}\".",
"No entries in this folder match '{filter}'" : "В данном каталоге нет элементов соответствующих '{filter}'",
"Name" : "Имя",
"Size" : "Размер",
@@ -75,12 +70,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"],
"Favorited" : "Избранное",
"Favorite" : "Избранное",
- "{newname} already exists" : "{newname} уже существует",
- "Upload" : "Загрузить",
- "Text file" : "Текстовый файл",
- "New text file.txt" : "Новый текстовый документ.txt",
"Folder" : "Каталог",
"New folder" : "Новый каталог",
+ "{newname} already exists" : "{newname} уже существует",
+ "Upload" : "Загрузить",
"An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка",
"A new file or folder has been <strong>created</strong>" : "<strong>Создан</strong> новый файл или каталог",
"A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог",
@@ -99,15 +92,12 @@ OC.L10N.register(
"Changed by %2$s" : "Изменено %2$s",
"Deleted by %2$s" : "Удалено %2$s",
"Restored by %2$s" : "Восстановлено %2$s",
- "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.",
- "%s could not be renamed" : "%s не может быть переименован",
"Upload (max. %s)" : "Загрузка (максимум %s)",
"File handling" : "Управление файлами",
"Maximum upload size" : "Максимальный размер загружаемого файла",
"max. possible: " : "макс. возможно: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "При использовании PHP-FPM может потребоваться до 5 минут, чтобы это значение встпуило в силу после сохранения.",
"Save" : "Сохранить",
- "Can not be edited from here due to insufficient permissions." : "Невозможно отредактировать здесь из-за нехватки полномочий.",
+ "Missing permissions to edit from here." : "Отсутствуют права на удаление.",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">доступа файлам через WebDAV</a>",
@@ -121,6 +111,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.",
"Currently scanning" : "В настоящее время сканируется",
"No favorites" : "Нет избранного",
- "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные"
+ "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные",
+ "Text file" : "Текстовый файл",
+ "New text file.txt" : "Новый текстовый документ.txt"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 36aae3834a9..81dbf53184e 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -2,13 +2,6 @@
"Storage not available" : "Хранилище недоступно",
"Storage invalid" : "Хранилище неисправно",
"Unknown error" : "Неизвестная ошибка",
- "Could not move %s - File with this name already exists" : "Невозможно переместить %s - файл с таким именем уже существует",
- "Could not move %s" : "Невозможно переместить %s",
- "Permission denied" : "В доступе отказано",
- "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. Укажите другое имя.",
- "Error when creating the file" : "Ошибка при создании файла",
- "Error when creating the folder" : "Ошибка создания каталога",
"Unable to set upload directory." : "Невозможно установить каталог загрузки.",
"Invalid Token" : "Недопустимый маркер",
"No file was uploaded. Unknown error" : "Файл не был загружен. Неизвестная ошибка",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Отсутствует временный каталог",
"Failed to write to disk" : "Ошибка записи на диск",
"Not enough storage available" : "Недостаточно доступного места в хранилище",
+ "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.",
"Upload failed. Could not find uploaded file" : "Загрузка не удалась. Невозможно найти загружаемый файл",
"Upload failed. Could not get file info." : "Загрузка не удалась. Невозможно получить информацию о файле",
"Invalid directory." : "Неверный каталог.",
@@ -28,10 +22,10 @@
"Favorites" : "Избранное",
"Home" : "Главная",
"Close" : "Закрыть",
+ "Upload cancelled." : "Загрузка отменена.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно загрузить {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." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.",
"Actions" : "Действия",
@@ -44,14 +38,15 @@
"Unable to determine date" : "Невозможно определить дату",
"This operation is forbidden" : "Операция запрещена",
"This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором",
- "Error moving file." : "Ошибка при перемещении файла.",
- "Error moving file" : "Ошибка при перемещении файла",
- "Error" : "Ошибка",
- "{new_name} already exists" : "{new_name} уже существует",
- "Could not rename file" : "Не удалось переименовать файл",
- "Could not create file" : "Не удалось создать файл",
- "Could not create folder" : "Не удалось создать каталог",
- "Error deleting file." : "Ошибка при удалении файла.",
+ "Could not move \"{file}\", target exists" : "Невозможно переместить \"{file}\", цель отсутствует",
+ "Could not move \"{file}\"" : "Невозможно переместить \"{file}\"",
+ "{newName} already exists" : "{newName} уже имеется",
+ "Could not rename \"{fileName}\"" : "Невозможно переименовать \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Невозможно создать файл \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Невозможно создать файл \"{file}\" потому что уже имеется",
+ "Could not create folder \"{dir}\"" : "Невозможно создать папку \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Невозможно создать папку \"{dir}\" потому что уже имеется",
+ "Error deleting file \"{fileName}\"." : "Ошибка удаления файла \"{fileName}\".",
"No entries in this folder match '{filter}'" : "В данном каталоге нет элементов соответствующих '{filter}'",
"Name" : "Имя",
"Size" : "Размер",
@@ -73,12 +68,10 @@
"_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"],
"Favorited" : "Избранное",
"Favorite" : "Избранное",
- "{newname} already exists" : "{newname} уже существует",
- "Upload" : "Загрузить",
- "Text file" : "Текстовый файл",
- "New text file.txt" : "Новый текстовый документ.txt",
"Folder" : "Каталог",
"New folder" : "Новый каталог",
+ "{newname} already exists" : "{newname} уже существует",
+ "Upload" : "Загрузить",
"An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка",
"A new file or folder has been <strong>created</strong>" : "<strong>Создан</strong> новый файл или каталог",
"A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог",
@@ -97,15 +90,12 @@
"Changed by %2$s" : "Изменено %2$s",
"Deleted by %2$s" : "Удалено %2$s",
"Restored by %2$s" : "Восстановлено %2$s",
- "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.",
- "%s could not be renamed" : "%s не может быть переименован",
"Upload (max. %s)" : "Загрузка (максимум %s)",
"File handling" : "Управление файлами",
"Maximum upload size" : "Максимальный размер загружаемого файла",
"max. possible: " : "макс. возможно: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "При использовании PHP-FPM может потребоваться до 5 минут, чтобы это значение встпуило в силу после сохранения.",
"Save" : "Сохранить",
- "Can not be edited from here due to insufficient permissions." : "Невозможно отредактировать здесь из-за нехватки полномочий.",
+ "Missing permissions to edit from here." : "Отсутствуют права на удаление.",
"Settings" : "Настройки",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">доступа файлам через WebDAV</a>",
@@ -119,6 +109,8 @@
"Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.",
"Currently scanning" : "В настоящее время сканируется",
"No favorites" : "Нет избранного",
- "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные"
+ "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные",
+ "Text file" : "Текстовый файл",
+ "New text file.txt" : "Новый текстовый документ.txt"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/si_LK.js b/apps/files/l10n/si_LK.js
index 60cd10813d9..44e96c49fc6 100644
--- a/apps/files/l10n/si_LK.js
+++ b/apps/files/l10n/si_LK.js
@@ -17,14 +17,12 @@ OC.L10N.register(
"Rename" : "නැවත නම් කරන්න",
"Delete" : "මකා දමන්න",
"Select" : "තෝරන්න",
- "Error" : "දෝෂයක්",
"Name" : "නම",
"Size" : "ප්‍රමාණය",
"Modified" : "වෙනස් කළ",
"New" : "නව",
- "Upload" : "උඩුගත කරන්න",
- "Text file" : "පෙළ ගොනුව",
"Folder" : "ෆෝල්ඩරය",
+ "Upload" : "උඩුගත කරන්න",
"A new file or folder has been <strong>created</strong>" : "නව ගොනුවක් හෝ බහාලුමක් <strong> නිර්මාණය කර ඇත</ strong> ",
"A file or folder has been <strong>changed</strong>" : "ගොනුවක් හෝ ෆෝල්ඩරයක් <strong>වෙනස්</strong> වී ඇත",
"A file or folder has been <strong>deleted</strong>" : "ගොනුවක් හෝ ෆෝල්ඩරයක් <strong>මකා දමා</strong> ඇත",
@@ -37,6 +35,7 @@ OC.L10N.register(
"Cancel upload" : "උඩුගත කිරීම අත් හරින්න",
"Upload too large" : "උඩුගත කිරීම විශාල වැඩිය",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය",
- "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න"
+ "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න",
+ "Text file" : "පෙළ ගොනුව"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/si_LK.json b/apps/files/l10n/si_LK.json
index 2f910f1d90b..92bcea71587 100644
--- a/apps/files/l10n/si_LK.json
+++ b/apps/files/l10n/si_LK.json
@@ -15,14 +15,12 @@
"Rename" : "නැවත නම් කරන්න",
"Delete" : "මකා දමන්න",
"Select" : "තෝරන්න",
- "Error" : "දෝෂයක්",
"Name" : "නම",
"Size" : "ප්‍රමාණය",
"Modified" : "වෙනස් කළ",
"New" : "නව",
- "Upload" : "උඩුගත කරන්න",
- "Text file" : "පෙළ ගොනුව",
"Folder" : "ෆෝල්ඩරය",
+ "Upload" : "උඩුගත කරන්න",
"A new file or folder has been <strong>created</strong>" : "නව ගොනුවක් හෝ බහාලුමක් <strong> නිර්මාණය කර ඇත</ strong> ",
"A file or folder has been <strong>changed</strong>" : "ගොනුවක් හෝ ෆෝල්ඩරයක් <strong>වෙනස්</strong> වී ඇත",
"A file or folder has been <strong>deleted</strong>" : "ගොනුවක් හෝ ෆෝල්ඩරයක් <strong>මකා දමා</strong> ඇත",
@@ -35,6 +33,7 @@
"Cancel upload" : "උඩුගත කිරීම අත් හරින්න",
"Upload too large" : "උඩුගත කිරීම විශාල වැඩිය",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය",
- "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න"
+ "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න",
+ "Text file" : "පෙළ ගොනුව"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js
index e2fbf695f81..ca7e107d1ca 100644
--- a/apps/files/l10n/sk_SK.js
+++ b/apps/files/l10n/sk_SK.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Úložisko nie je dostupné",
"Storage invalid" : "Úložisko nie je platné",
"Unknown error" : "Neznáma chyba",
- "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",
- "Permission denied" : "Prístup bol odmietnutý",
- "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.",
- "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.",
- "Error when creating the file" : "Chyba pri vytváraní súboru",
- "Error when creating the folder" : "Chyba pri vytváraní priečinka",
"Unable to set upload directory." : "Nemožno nastaviť priečinok pre nahrané súbory.",
"Invalid Token" : "Neplatný token",
"No file was uploaded. Unknown error" : "Žiaden súbor nebol nahraný. Neznáma chyba",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Obľúbené",
"Home" : "Domov",
"Close" : "Zavrieť",
+ "Upload cancelled." : "Odosielanie je zrušené.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Celková veľkosť súboru {size1} prekračuje upload limit {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}",
- "Upload cancelled." : "Odosielanie je 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.",
"Actions" : "Akcie",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Nemožno určiť dátum",
"This operation is forbidden" : "Táto operácia je zakázaná",
"This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
- "Error moving file." : "Chyba pri presune súboru.",
- "Error moving file" : "Chyba pri presúvaní súboru",
- "Error" : "Chyba",
- "{new_name} already exists" : "{new_name} už existuje",
- "Could not rename file" : "Nemožno premenovať súbor",
- "Could not create file" : "Nemožno vytvoriť súbor",
- "Could not create folder" : "Nemožno vytvoriť priečinok",
- "Error deleting file." : "Chyba pri mazaní súboru.",
"No entries in this folder match '{filter}'" : "V tomto priečinku nič nezodpovedá '{filter}'",
"Name" : "Názov",
"Size" : "Veľkosť",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"],
"Favorited" : "Pridané k obľúbeným",
"Favorite" : "Obľúbené",
- "{newname} already exists" : "{newname} už existuje",
- "Upload" : "Nahrať",
- "Text file" : "Textový súbor",
- "New text file.txt" : "Nový text file.txt",
"Folder" : "Priečinok",
"New folder" : "Nový priečinok",
+ "{newname} already exists" : "{newname} už existuje",
+ "Upload" : "Nahrať",
"An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
"A new file or folder has been <strong>created</strong>" : "Nový súbor alebo priečinok bol <strong>vytvorený</strong>",
"A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>",
@@ -96,15 +80,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s zmazal %1$s",
"You restored %1$s" : "Bol obnovený %1$s",
"%2$s restored %1$s" : "%2$s obnovil %1$s",
- "%s could not be renamed as it has been deleted" : "%s nebolo možné premenovať, pretože bol zmazaný",
- "%s could not be renamed" : "%s nemohol byť premenovaný",
"Upload (max. %s)" : "Nahrať (max. %s)",
"File handling" : "Nastavenie správania sa k súborom",
"Maximum upload size" : "Maximálna veľkosť odosielaného súboru",
"max. possible: " : "najväčšie možné:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.",
"Save" : "Uložiť",
- "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.",
"Settings" : "Nastavenia",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>",
@@ -118,6 +98,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.",
"Currently scanning" : "Prehľadáva sa",
"No favorites" : "Žiadne obľúbené",
- "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu"
+ "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu",
+ "Text file" : "Textový súbor",
+ "New text file.txt" : "Nový text file.txt"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json
index e5748baa4c8..4d03e18556a 100644
--- a/apps/files/l10n/sk_SK.json
+++ b/apps/files/l10n/sk_SK.json
@@ -2,13 +2,6 @@
"Storage not available" : "Úložisko nie je dostupné",
"Storage invalid" : "Úložisko nie je platné",
"Unknown error" : "Neznáma chyba",
- "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",
- "Permission denied" : "Prístup bol odmietnutý",
- "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.",
- "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.",
- "Error when creating the file" : "Chyba pri vytváraní súboru",
- "Error when creating the folder" : "Chyba pri vytváraní priečinka",
"Unable to set upload directory." : "Nemožno nastaviť priečinok pre nahrané súbory.",
"Invalid Token" : "Neplatný token",
"No file was uploaded. Unknown error" : "Žiaden súbor nebol nahraný. Neznáma chyba",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Obľúbené",
"Home" : "Domov",
"Close" : "Zavrieť",
+ "Upload cancelled." : "Odosielanie je zrušené.",
"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",
"Total file size {size1} exceeds upload limit {size2}" : "Celková veľkosť súboru {size1} prekračuje upload limit {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}",
- "Upload cancelled." : "Odosielanie je 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.",
"Actions" : "Akcie",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Nemožno určiť dátum",
"This operation is forbidden" : "Táto operácia je zakázaná",
"This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
- "Error moving file." : "Chyba pri presune súboru.",
- "Error moving file" : "Chyba pri presúvaní súboru",
- "Error" : "Chyba",
- "{new_name} already exists" : "{new_name} už existuje",
- "Could not rename file" : "Nemožno premenovať súbor",
- "Could not create file" : "Nemožno vytvoriť súbor",
- "Could not create folder" : "Nemožno vytvoriť priečinok",
- "Error deleting file." : "Chyba pri mazaní súboru.",
"No entries in this folder match '{filter}'" : "V tomto priečinku nič nezodpovedá '{filter}'",
"Name" : "Názov",
"Size" : "Veľkosť",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"],
"Favorited" : "Pridané k obľúbeným",
"Favorite" : "Obľúbené",
- "{newname} already exists" : "{newname} už existuje",
- "Upload" : "Nahrať",
- "Text file" : "Textový súbor",
- "New text file.txt" : "Nový text file.txt",
"Folder" : "Priečinok",
"New folder" : "Nový priečinok",
+ "{newname} already exists" : "{newname} už existuje",
+ "Upload" : "Nahrať",
"An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
"A new file or folder has been <strong>created</strong>" : "Nový súbor alebo priečinok bol <strong>vytvorený</strong>",
"A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>",
@@ -94,15 +78,11 @@
"%2$s deleted %1$s" : "%2$s zmazal %1$s",
"You restored %1$s" : "Bol obnovený %1$s",
"%2$s restored %1$s" : "%2$s obnovil %1$s",
- "%s could not be renamed as it has been deleted" : "%s nebolo možné premenovať, pretože bol zmazaný",
- "%s could not be renamed" : "%s nemohol byť premenovaný",
"Upload (max. %s)" : "Nahrať (max. %s)",
"File handling" : "Nastavenie správania sa k súborom",
"Maximum upload size" : "Maximálna veľkosť odosielaného súboru",
"max. possible: " : "najväčšie možné:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.",
"Save" : "Uložiť",
- "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.",
"Settings" : "Nastavenia",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>",
@@ -116,6 +96,8 @@
"Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.",
"Currently scanning" : "Prehľadáva sa",
"No favorites" : "Žiadne obľúbené",
- "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu"
+ "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu",
+ "Text file" : "Textový súbor",
+ "New text file.txt" : "Nový text file.txt"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index 7ce39724a98..240bce73af1 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Na voljo ni dovolj prostora",
"Storage invalid" : "Določen prostor ni veljaven",
"Unknown error" : "Neznana napaka",
- "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",
- "Permission denied" : "Za to opravilo ni ustreznih dovoljenj.",
- "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.",
- "Error when creating the file" : "Napaka med ustvarjanjem datoteke",
- "Error when creating the folder" : "Napaka med ustvarjanjem mape",
"Unable to set upload directory." : "Mapo, v katero boste prenašali dokumente, ni mogoče določiti",
"Invalid Token" : "Neveljaven žeton",
"No file was uploaded. Unknown error" : "Ni poslane datoteke. Neznana napaka.",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Ciljna mapa je premaknjena ali izbrisana.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Priljubljene",
"Home" : "Domači naslov",
"Close" : "Zapri",
+ "Upload cancelled." : "Pošiljanje je preklicano.",
"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.",
"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.",
"Actions" : "Dejanja",
@@ -44,14 +38,6 @@ OC.L10N.register(
"Select" : "Izberi",
"Pending" : "V čakanju ...",
"Unable to determine date" : "Ni mogoče določiti datuma",
- "Error moving file." : "Napaka premikanja datoteke.",
- "Error moving file" : "Napaka premikanja datoteke",
- "Error" : "Napaka",
- "{new_name} already exists" : "{new_name} že obstaja",
- "Could not rename file" : "Ni mogoče preimenovati datoteke",
- "Could not create file" : "Ni mogoče ustvariti datoteke",
- "Could not create folder" : "Ni mogoče ustvariti mape",
- "Error deleting file." : "Napaka brisanja datoteke.",
"No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'",
"Name" : "Ime",
"Size" : "Velikost",
@@ -71,10 +57,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom '{filter}'","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"],
"Favorited" : "Označeno kot priljubljeno",
"Favorite" : "Priljubljene",
- "Upload" : "Pošlji",
- "Text file" : "Besedilna datoteka",
"Folder" : "Mapa",
"New folder" : "Nova mapa",
+ "Upload" : "Pošlji",
"An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak",
"A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>",
"A file or folder has been <strong>changed</strong>" : "Datoteka ali mapa je <strong>spremenjena</strong>.",
@@ -90,14 +75,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s je izbrisal %1$s",
"You restored %1$s" : "Obnovljen je predmet %1$s",
"%2$s restored %1$s" : "Uporabnik %2$s je obnovil predmet %1$s.",
- "%s could not be renamed as it has been deleted" : "Datoteke %s ni mogoče preimenovati, ker je bila že prej izbrisana.",
- "%s could not be renamed" : "%s ni mogoče preimenovati",
"Upload (max. %s)" : "Pošiljanje (omejitev %s)",
"File handling" : "Upravljanje z datotekami",
"Maximum upload size" : "Največja velikost za pošiljanja",
"max. possible: " : "največ mogoče:",
"Save" : "Shrani",
- "Can not be edited from here due to insufficient permissions." : "Predmeta ni mogoče urejati zaradi neustreznih dovoljenj.",
"Settings" : "Nastavitve",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.",
@@ -111,6 +93,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...",
"Currently scanning" : "Poteka preverjanje",
"No favorites" : "Ni priljubljenih",
- "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj."
+ "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj.",
+ "Text file" : "Besedilna datoteka"
},
"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/sl.json b/apps/files/l10n/sl.json
index b4b28f95bf1..64ad90f56bd 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -2,13 +2,6 @@
"Storage not available" : "Na voljo ni dovolj prostora",
"Storage invalid" : "Določen prostor ni veljaven",
"Unknown error" : "Neznana napaka",
- "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",
- "Permission denied" : "Za to opravilo ni ustreznih dovoljenj.",
- "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.",
- "Error when creating the file" : "Napaka med ustvarjanjem datoteke",
- "Error when creating the folder" : "Napaka med ustvarjanjem mape",
"Unable to set upload directory." : "Mapo, v katero boste prenašali dokumente, ni mogoče določiti",
"Invalid Token" : "Neveljaven žeton",
"No file was uploaded. Unknown error" : "Ni poslane datoteke. Neznana napaka.",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Ciljna mapa je premaknjena ali izbrisana.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Priljubljene",
"Home" : "Domači naslov",
"Close" : "Zapri",
+ "Upload cancelled." : "Pošiljanje je preklicano.",
"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.",
"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.",
"Actions" : "Dejanja",
@@ -42,14 +36,6 @@
"Select" : "Izberi",
"Pending" : "V čakanju ...",
"Unable to determine date" : "Ni mogoče določiti datuma",
- "Error moving file." : "Napaka premikanja datoteke.",
- "Error moving file" : "Napaka premikanja datoteke",
- "Error" : "Napaka",
- "{new_name} already exists" : "{new_name} že obstaja",
- "Could not rename file" : "Ni mogoče preimenovati datoteke",
- "Could not create file" : "Ni mogoče ustvariti datoteke",
- "Could not create folder" : "Ni mogoče ustvariti mape",
- "Error deleting file." : "Napaka brisanja datoteke.",
"No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'",
"Name" : "Ime",
"Size" : "Velikost",
@@ -69,10 +55,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom '{filter}'","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"],
"Favorited" : "Označeno kot priljubljeno",
"Favorite" : "Priljubljene",
- "Upload" : "Pošlji",
- "Text file" : "Besedilna datoteka",
"Folder" : "Mapa",
"New folder" : "Nova mapa",
+ "Upload" : "Pošlji",
"An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak",
"A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>",
"A file or folder has been <strong>changed</strong>" : "Datoteka ali mapa je <strong>spremenjena</strong>.",
@@ -88,14 +73,11 @@
"%2$s deleted %1$s" : "%2$s je izbrisal %1$s",
"You restored %1$s" : "Obnovljen je predmet %1$s",
"%2$s restored %1$s" : "Uporabnik %2$s je obnovil predmet %1$s.",
- "%s could not be renamed as it has been deleted" : "Datoteke %s ni mogoče preimenovati, ker je bila že prej izbrisana.",
- "%s could not be renamed" : "%s ni mogoče preimenovati",
"Upload (max. %s)" : "Pošiljanje (omejitev %s)",
"File handling" : "Upravljanje z datotekami",
"Maximum upload size" : "Največja velikost za pošiljanja",
"max. possible: " : "največ mogoče:",
"Save" : "Shrani",
- "Can not be edited from here due to insufficient permissions." : "Predmeta ni mogoče urejati zaradi neustreznih dovoljenj.",
"Settings" : "Nastavitve",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.",
@@ -109,6 +91,7 @@
"Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...",
"Currently scanning" : "Poteka preverjanje",
"No favorites" : "Ni priljubljenih",
- "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj."
+ "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj.",
+ "Text file" : "Besedilna datoteka"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js
index 8f19800cd2a..6811dc5791f 100644
--- a/apps/files/l10n/sq.js
+++ b/apps/files/l10n/sq.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Pa depozitë gati",
"Storage invalid" : "Depozitë e pavlefshme",
"Unknown error" : "Gabim i panjohur",
- "Could not move %s - File with this name already exists" : "S’u zhvendos dot %s - Ka tashmë kartelë me këtë",
- "Could not move %s" : "S’u zhvendos dot %s",
- "Permission denied" : "Leje e mohuar",
- "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s tashmë është i përdorur në dosjen %s. Ju lutemi, zgjidhni një emër tjetër.",
- "Error when creating the file" : "Gabim gjatë krijimit të kartelës",
- "Error when creating the folder" : "Gabim gjatë krijimit të dosjes",
"Unable to set upload directory." : "S’arrihet të caktohet drejtori ngarkimesh",
"Invalid Token" : "Token i pavlefshëm",
"No file was uploaded. Unknown error" : "S’u ngarkua ndonjë kartelë. Gabim i panjohur",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Mungon një dosje e përkohshme",
"Failed to write to disk" : "Dështoi shkrimi në disk",
"Not enough storage available" : "S’ka depozitë të mjaftueshme",
+ "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.",
"Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. S’u gjet dot kartela e ngarkuar",
"Upload failed. Could not get file info." : "Ngarkoi dështoi. S’u morën dot të dhëna kartele.",
"Invalid directory." : "Drejtori e pavlefshme.",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "S’arrihet të përcaktohet data",
"This operation is forbidden" : "Ky veprim është i ndaluar",
"This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin",
- "Error moving file." : "Gabim në lëvizjen e kartelës.",
- "Error moving file" : "Gabim në lëvizjen e kartelës",
- "Error" : "Gabim",
- "{new_name} already exists" : "{new_name} ekziston tashmtë",
- "Could not rename file" : "Kartela s’u riemërtua dot",
- "Could not create file" : "Kartela s’u krijua dot",
- "Could not create folder" : "Dosja s’u krijua dot",
- "Error deleting file." : "Gabim gjatë fshirjes së kartelës.",
+ "Could not move \"{file}\", target exists" : "S’u lëviz dot \"{file}\", objektivi ekziston",
+ "Could not move \"{file}\"" : "S’u lëviz dot \"{file}\"",
+ "{newName} already exists" : "{newName} ekziston tashmë",
+ "Could not rename \"{fileName}\", it does not exist any more" : "S’u riemërtua dot \"{fileName}\", s’ekziston më",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Emri \"{targetName}\" është tashmë i përdorur te dosja \"{dir}\". Ju lutemi, zgjidhni një emër tjetër.",
+ "Could not rename \"{fileName}\"" : "S’u riemërtua dot \"{fileName}\"",
+ "Could not create file \"{file}\"" : "S’u krijua dot kartela \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "S’u krijua dot kartela \"{file}\" ngaqë ka një të tillë",
+ "Could not create folder \"{dir}\"" : "S’u krijua dot dosja \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "S’u krijua dot dosja \"{dir}\" ngaqë ka një të tillë",
+ "Error deleting file \"{fileName}\"." : "Gabim në fshirjen e kartelës \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Në këtë dosje s’ka zëra me përputhje me '{filter}'",
"Name" : "Emër",
"Size" : "Madhësi",
@@ -70,16 +67,15 @@ OC.L10N.register(
"Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose njëkohësohen më!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "Depozita e {owner} është thuasje plot ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Depozita juaj është thuajse plot ({usedSpacePercent}%)",
+ "_matches '{filter}'_::_match '{filter}'_" : ["ka përputhje me '{filter}'","ka përputhje me '{filter}'"],
"Path" : "Shteg",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"],
"Favorited" : "U kalua e parapëlqyer",
"Favorite" : "E parapëlqyer",
- "{newname} already exists" : "Ka tashmë një {newname}",
- "Upload" : "Ngarkoje",
- "Text file" : "Kartelë tekst",
- "New text file.txt" : "Kartelë e re file.txt",
"Folder" : "Dosje",
"New folder" : "Dosje e re",
+ "{newname} already exists" : "Ka tashmë një {newname}",
+ "Upload" : "Ngarkoje",
"An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat",
"A new file or folder has been <strong>created</strong>" : "<strong>U krijua</strong> një kartelë ose dosje e re",
"A file or folder has been <strong>changed</strong>" : "<strong>U ndryshua</strong> një kartelë ose dosje",
@@ -98,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "Ndryshuar nga %2$s",
"Deleted by %2$s" : "Fshirë nga %2$s",
"Restored by %2$s" : "Rikthyer nga %2$s",
- "%s could not be renamed as it has been deleted" : "%s s’riemërtohet dot, sepse është fshirë",
- "%s could not be renamed" : "%s s’riemërtohet dot",
"Upload (max. %s)" : "Ngarkim (max. %s)",
"File handling" : "Trajtim kartele",
"Maximum upload size" : "Madhësi maksimale ngarkimi",
"max. possible: " : "maks. i mundshëm: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Me PHP-FPM kjo vlerë mund të dojë deri në 5 minuta të hyjë në fuqi, pasi të ruhet.",
"Save" : "Ruaje",
- "Can not be edited from here due to insufficient permissions." : "S’mund të përpunohet që këtu, për shkak lejesh të pamjaftueshme.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Me PHP-FPM mund të duhen 5 minuta që ndryshimet të hyjnë në fuqi.",
+ "Missing permissions to edit from here." : "Mungojnë lejet për të përpunuar që këtu.",
"Settings" : "Rregullime",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
@@ -120,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.",
"Currently scanning" : "Po kontrollohet",
"No favorites" : "Pa të parapëlqyera",
- "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera"
+ "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera",
+ "Text file" : "Kartelë tekst",
+ "New text file.txt" : "Kartelë e re file.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json
index 462f4d06392..45b9d6acb61 100644
--- a/apps/files/l10n/sq.json
+++ b/apps/files/l10n/sq.json
@@ -2,13 +2,6 @@
"Storage not available" : "Pa depozitë gati",
"Storage invalid" : "Depozitë e pavlefshme",
"Unknown error" : "Gabim i panjohur",
- "Could not move %s - File with this name already exists" : "S’u zhvendos dot %s - Ka tashmë kartelë me këtë",
- "Could not move %s" : "S’u zhvendos dot %s",
- "Permission denied" : "Leje e mohuar",
- "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s tashmë është i përdorur në dosjen %s. Ju lutemi, zgjidhni një emër tjetër.",
- "Error when creating the file" : "Gabim gjatë krijimit të kartelës",
- "Error when creating the folder" : "Gabim gjatë krijimit të dosjes",
"Unable to set upload directory." : "S’arrihet të caktohet drejtori ngarkimesh",
"Invalid Token" : "Token i pavlefshëm",
"No file was uploaded. Unknown error" : "S’u ngarkua ndonjë kartelë. Gabim i panjohur",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Mungon një dosje e përkohshme",
"Failed to write to disk" : "Dështoi shkrimi në disk",
"Not enough storage available" : "S’ka depozitë të mjaftueshme",
+ "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.",
"Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. S’u gjet dot kartela e ngarkuar",
"Upload failed. Could not get file info." : "Ngarkoi dështoi. S’u morën dot të dhëna kartele.",
"Invalid directory." : "Drejtori e pavlefshme.",
@@ -44,14 +38,17 @@
"Unable to determine date" : "S’arrihet të përcaktohet data",
"This operation is forbidden" : "Ky veprim është i ndaluar",
"This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin",
- "Error moving file." : "Gabim në lëvizjen e kartelës.",
- "Error moving file" : "Gabim në lëvizjen e kartelës",
- "Error" : "Gabim",
- "{new_name} already exists" : "{new_name} ekziston tashmtë",
- "Could not rename file" : "Kartela s’u riemërtua dot",
- "Could not create file" : "Kartela s’u krijua dot",
- "Could not create folder" : "Dosja s’u krijua dot",
- "Error deleting file." : "Gabim gjatë fshirjes së kartelës.",
+ "Could not move \"{file}\", target exists" : "S’u lëviz dot \"{file}\", objektivi ekziston",
+ "Could not move \"{file}\"" : "S’u lëviz dot \"{file}\"",
+ "{newName} already exists" : "{newName} ekziston tashmë",
+ "Could not rename \"{fileName}\", it does not exist any more" : "S’u riemërtua dot \"{fileName}\", s’ekziston më",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Emri \"{targetName}\" është tashmë i përdorur te dosja \"{dir}\". Ju lutemi, zgjidhni një emër tjetër.",
+ "Could not rename \"{fileName}\"" : "S’u riemërtua dot \"{fileName}\"",
+ "Could not create file \"{file}\"" : "S’u krijua dot kartela \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "S’u krijua dot kartela \"{file}\" ngaqë ka një të tillë",
+ "Could not create folder \"{dir}\"" : "S’u krijua dot dosja \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "S’u krijua dot dosja \"{dir}\" ngaqë ka një të tillë",
+ "Error deleting file \"{fileName}\"." : "Gabim në fshirjen e kartelës \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Në këtë dosje s’ka zëra me përputhje me '{filter}'",
"Name" : "Emër",
"Size" : "Madhësi",
@@ -68,16 +65,15 @@
"Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose njëkohësohen më!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "Depozita e {owner} është thuasje plot ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Depozita juaj është thuajse plot ({usedSpacePercent}%)",
+ "_matches '{filter}'_::_match '{filter}'_" : ["ka përputhje me '{filter}'","ka përputhje me '{filter}'"],
"Path" : "Shteg",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"],
"Favorited" : "U kalua e parapëlqyer",
"Favorite" : "E parapëlqyer",
- "{newname} already exists" : "Ka tashmë një {newname}",
- "Upload" : "Ngarkoje",
- "Text file" : "Kartelë tekst",
- "New text file.txt" : "Kartelë e re file.txt",
"Folder" : "Dosje",
"New folder" : "Dosje e re",
+ "{newname} already exists" : "Ka tashmë një {newname}",
+ "Upload" : "Ngarkoje",
"An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat",
"A new file or folder has been <strong>created</strong>" : "<strong>U krijua</strong> një kartelë ose dosje e re",
"A file or folder has been <strong>changed</strong>" : "<strong>U ndryshua</strong> një kartelë ose dosje",
@@ -96,15 +92,13 @@
"Changed by %2$s" : "Ndryshuar nga %2$s",
"Deleted by %2$s" : "Fshirë nga %2$s",
"Restored by %2$s" : "Rikthyer nga %2$s",
- "%s could not be renamed as it has been deleted" : "%s s’riemërtohet dot, sepse është fshirë",
- "%s could not be renamed" : "%s s’riemërtohet dot",
"Upload (max. %s)" : "Ngarkim (max. %s)",
"File handling" : "Trajtim kartele",
"Maximum upload size" : "Madhësi maksimale ngarkimi",
"max. possible: " : "maks. i mundshëm: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Me PHP-FPM kjo vlerë mund të dojë deri në 5 minuta të hyjë në fuqi, pasi të ruhet.",
"Save" : "Ruaje",
- "Can not be edited from here due to insufficient permissions." : "S’mund të përpunohet që këtu, për shkak lejesh të pamjaftueshme.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Me PHP-FPM mund të duhen 5 minuta që ndryshimet të hyjnë në fuqi.",
+ "Missing permissions to edit from here." : "Mungojnë lejet për të përpunuar që këtu.",
"Settings" : "Rregullime",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
@@ -118,6 +112,8 @@
"Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.",
"Currently scanning" : "Po kontrollohet",
"No favorites" : "Pa të parapëlqyera",
- "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera"
+ "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera",
+ "Text file" : "Kartelë tekst",
+ "New text file.txt" : "Kartelë e re file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 93f8979c2cb..80f81b1e028 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Складиште није доступно",
"Storage invalid" : "Неисправно складиште",
"Unknown error" : "Непозната грешка",
- "Could not move %s - File with this name already exists" : "Не могу да преместим %s – фајл са овим називом већ постоји",
- "Could not move %s" : "Не могу да преместим %s",
- "Permission denied" : "Приступ одбијен",
- "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. Одредите други назив.",
- "Error when creating the file" : "Грешка при стварању фајла",
- "Error when creating the folder" : "Грешка при стварању фајла",
"Unable to set upload directory." : "Не могу да поставим директоријум за отпремање.",
"Invalid Token" : "Неисправан токен",
"No file was uploaded. Unknown error" : "Ниједан фајл није отпремљен. Непозната грешка",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Недостаје привремена фасцикла",
"Failed to write to disk" : "Не могу да пишем на диск",
"Not enough storage available" : "Нема довољно простора",
+ "The target folder has been moved or deleted." : "Одредишна фасцикла је премештена или обрисана.",
"Upload failed. Could not find uploaded file" : "Неуспешно отпремање. Не могу да нађем отпремљени фајл",
"Upload failed. Could not get file info." : "Неуспешно отпремање. Не могу да добијем податке о фајлу.",
"Invalid directory." : "Неисправна фасцикла.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Омиљени",
"Home" : "Почетна",
"Close" : "Затвори",
+ "Upload cancelled." : "Отпремање је отказано.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то директоријум или има 0 бајтова",
"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." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.",
"Actions" : "Радње",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Не могу да одредим датум",
"This operation is forbidden" : "Ова радња је забрањена",
"This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
- "Error moving file." : "Грешка при премештању фајла.",
- "Error moving file" : "Грешка при премештању фајла",
- "Error" : "Грешка",
- "{new_name} already exists" : "{new_name} већ постоји",
- "Could not rename file" : "Не могу да преименујем фајл",
- "Could not create file" : "Не могу да створим фајл",
- "Could not create folder" : "Не могу да створим фасциклу",
- "Error deleting file." : "Грешка при брисању фајла.",
"No entries in this folder match '{filter}'" : "У овој фасцикли ништа се не поклапа са '{filter}'",
"Name" : "Назив",
"Size" : "Величина",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајта"],
"Favorited" : "Омиљено",
"Favorite" : "Омиљени",
- "{newname} already exists" : "{newname} већ постоји",
- "Upload" : "Отпреми",
- "Text file" : "текстуални фајл",
- "New text file.txt" : "Нов текстуални фајл.txt",
"Folder" : "фасцикла",
"New folder" : "Нова фасцикла",
+ "{newname} already exists" : "{newname} већ постоји",
+ "Upload" : "Отпреми",
"An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака",
"A new file or folder has been <strong>created</strong>" : "Нови фајл или фасцикла су <strong>направљени</strong>",
"A file or folder has been <strong>changed</strong>" : "Фајл или фасцикла су <strong>измењени</strong>",
@@ -99,15 +83,11 @@ OC.L10N.register(
"Changed by %2$s" : "Изменио %2$s",
"Deleted by %2$s" : "Обрисао %2$s",
"Restored by %2$s" : "Повратио %2$s",
- "%s could not be renamed as it has been deleted" : "%s се не може преименовати јер је обрисан",
- "%s could not be renamed" : "%s се не може преименовати",
"Upload (max. %s)" : "Отпремање (макс. %s)",
"File handling" : "Руковање фајловима",
"Maximum upload size" : "Највећа величина отпремања",
"max. possible: " : "највише могуће:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "У PHP-FPM-у ова вредност има ефекта тек након 5 минута након примене.",
"Save" : "Сачувај",
- "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.",
"Settings" : "Поставке",
"WebDAV" : "ВебДАВ",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Користите ову адресу да <a href=\"%s\" target=\"_blank\"> приступите фајловима преко ВебДАВ-а</a>",
@@ -121,6 +101,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.",
"Currently scanning" : "Тренутно скенирам",
"No favorites" : "Нема омиљених",
- "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде"
+ "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде",
+ "Text file" : "текстуални фајл",
+ "New text file.txt" : "Нов текстуални фајл.txt"
},
"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.json b/apps/files/l10n/sr.json
index 08ba9712de7..f878b9c14d4 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -2,13 +2,6 @@
"Storage not available" : "Складиште није доступно",
"Storage invalid" : "Неисправно складиште",
"Unknown error" : "Непозната грешка",
- "Could not move %s - File with this name already exists" : "Не могу да преместим %s – фајл са овим називом већ постоји",
- "Could not move %s" : "Не могу да преместим %s",
- "Permission denied" : "Приступ одбијен",
- "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. Одредите други назив.",
- "Error when creating the file" : "Грешка при стварању фајла",
- "Error when creating the folder" : "Грешка при стварању фајла",
"Unable to set upload directory." : "Не могу да поставим директоријум за отпремање.",
"Invalid Token" : "Неисправан токен",
"No file was uploaded. Unknown error" : "Ниједан фајл није отпремљен. Непозната грешка",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Недостаје привремена фасцикла",
"Failed to write to disk" : "Не могу да пишем на диск",
"Not enough storage available" : "Нема довољно простора",
+ "The target folder has been moved or deleted." : "Одредишна фасцикла је премештена или обрисана.",
"Upload failed. Could not find uploaded file" : "Неуспешно отпремање. Не могу да нађем отпремљени фајл",
"Upload failed. Could not get file info." : "Неуспешно отпремање. Не могу да добијем податке о фајлу.",
"Invalid directory." : "Неисправна фасцикла.",
@@ -28,10 +22,10 @@
"Favorites" : "Омиљени",
"Home" : "Почетна",
"Close" : "Затвори",
+ "Upload cancelled." : "Отпремање је отказано.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то директоријум или има 0 бајтова",
"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." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.",
"Actions" : "Радње",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Не могу да одредим датум",
"This operation is forbidden" : "Ова радња је забрањена",
"This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
- "Error moving file." : "Грешка при премештању фајла.",
- "Error moving file" : "Грешка при премештању фајла",
- "Error" : "Грешка",
- "{new_name} already exists" : "{new_name} већ постоји",
- "Could not rename file" : "Не могу да преименујем фајл",
- "Could not create file" : "Не могу да створим фајл",
- "Could not create folder" : "Не могу да створим фасциклу",
- "Error deleting file." : "Грешка при брисању фајла.",
"No entries in this folder match '{filter}'" : "У овој фасцикли ништа се не поклапа са '{filter}'",
"Name" : "Назив",
"Size" : "Величина",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајта"],
"Favorited" : "Омиљено",
"Favorite" : "Омиљени",
- "{newname} already exists" : "{newname} већ постоји",
- "Upload" : "Отпреми",
- "Text file" : "текстуални фајл",
- "New text file.txt" : "Нов текстуални фајл.txt",
"Folder" : "фасцикла",
"New folder" : "Нова фасцикла",
+ "{newname} already exists" : "{newname} већ постоји",
+ "Upload" : "Отпреми",
"An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака",
"A new file or folder has been <strong>created</strong>" : "Нови фајл или фасцикла су <strong>направљени</strong>",
"A file or folder has been <strong>changed</strong>" : "Фајл или фасцикла су <strong>измењени</strong>",
@@ -97,15 +81,11 @@
"Changed by %2$s" : "Изменио %2$s",
"Deleted by %2$s" : "Обрисао %2$s",
"Restored by %2$s" : "Повратио %2$s",
- "%s could not be renamed as it has been deleted" : "%s се не може преименовати јер је обрисан",
- "%s could not be renamed" : "%s се не може преименовати",
"Upload (max. %s)" : "Отпремање (макс. %s)",
"File handling" : "Руковање фајловима",
"Maximum upload size" : "Највећа величина отпремања",
"max. possible: " : "највише могуће:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "У PHP-FPM-у ова вредност има ефекта тек након 5 минута након примене.",
"Save" : "Сачувај",
- "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.",
"Settings" : "Поставке",
"WebDAV" : "ВебДАВ",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Користите ову адресу да <a href=\"%s\" target=\"_blank\"> приступите фајловима преко ВебДАВ-а</a>",
@@ -119,6 +99,8 @@
"Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.",
"Currently scanning" : "Тренутно скенирам",
"No favorites" : "Нема омиљених",
- "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде"
+ "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде",
+ "Text file" : "текстуални фајл",
+ "New text file.txt" : "Нов текстуални фајл.txt"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js
index 9c7732e4e71..d7017005a17 100644
--- a/apps/files/l10n/sr@latin.js
+++ b/apps/files/l10n/sr@latin.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Skladište nije dostupno",
"Storage invalid" : "Neispravno skladište",
"Unknown error" : "Nepoznata greška",
- "Could not move %s - File with this name already exists" : "Ne mogu da premestim %s – fajl sa ovim nazivom već postoji",
- "Could not move %s" : "Ne mogu da premestim %s",
- "Permission denied" : "Pristup odbijen",
- "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s se već koristi u fascikli %s. Odredite drugi naziv.",
- "Error when creating the file" : "Greška pri stvaranju fajla",
- "Error when creating the folder" : "Greška pri stvaranju fajla",
"Unable to set upload directory." : "Ne mogu da postavim direktorijum za otpremanje.",
"Invalid Token" : "Neispravan token",
"No file was uploaded. Unknown error" : "Nijedan fajl nije otpremljen. Nepoznata greška",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Nedostaje privremena fascikla",
"Failed to write to disk" : "Ne mogu da pišem na disk",
"Not enough storage available" : "Nema dovoljno prostora",
+ "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.",
"Upload failed. Could not find uploaded file" : "Neuspešno otpremanje. Ne mogu da nađem otpremljeni fajl",
"Upload failed. Could not get file info." : "Neuspešno otpremanje. Ne mogu da dobijem podatke o fajlu.",
"Invalid directory." : "Neispravna fascikla.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Omiljeni",
"Home" : "Početna",
"Close" : "Zatvori",
+ "Upload cancelled." : "Otpremanje je otkazano.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne mogu da otpremim {filename} jer je to direktorijum ili ima 0 bajtova",
"Total file size {size1} exceeds upload limit {size2}" : "Veličina {size1} prevazilazi ograničenje za otpremanje od {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nema prostora. Otpremate {size1} ali samo {size2} je preostalo",
- "Upload cancelled." : "Otpremanje je otkazano.",
"Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.",
"Download" : "Preuzmi",
@@ -43,14 +37,6 @@ OC.L10N.register(
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Ne mogu da odredim datum",
- "Error moving file." : "Greška pri premeštanju fajla.",
- "Error moving file" : "Greška pri premeštanju fajla",
- "Error" : "Greška",
- "{new_name} already exists" : "{new_name} već postoji",
- "Could not rename file" : "Ne mogu da preimenujem fajl",
- "Could not create file" : "Ne mogu da stvorim fajl",
- "Could not create folder" : "Ne mogu da stvorim fasciklu",
- "Error deleting file." : "Greška pri brisanju fajla.",
"No entries in this folder match '{filter}'" : "U ovoj fascikli ništa se ne poklapa sa '{filter}'",
"Name" : "Naziv",
"Size" : "Veličina",
@@ -68,10 +54,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["se poklapa sa '{filter}'","se poklapaju sa '{filter}'","se poklapa sa '{filter}'"],
"Favorited" : "Omiljeno",
"Favorite" : "Omiljeni",
- "Upload" : "Otpremi",
- "Text file" : "tekstualni fajl",
"Folder" : "fascikla",
"New folder" : "Nova fascikla",
+ "Upload" : "Otpremi",
"An error occurred while trying to update the tags" : "Došlo je do greške pri pokušaju ažuriranja oznaka",
"A new file or folder has been <strong>created</strong>" : "Novi fajl ili fascikla su <strong>napravljeni</strong>",
"A file or folder has been <strong>changed</strong>" : "Fajl ili fascikla su <strong>izmenjeni</strong>",
@@ -87,14 +72,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s obrisa %1$s",
"You restored %1$s" : "Vratili ste %1$s",
"%2$s restored %1$s" : "%2$s povrati %1$s",
- "%s could not be renamed as it has been deleted" : "%s se ne može preimenovati jer je obrisan",
- "%s could not be renamed" : "%s se ne može preimenovati",
"Upload (max. %s)" : "Otpremanje (maks. %s)",
"File handling" : "Rukovanje fajlovima",
"Maximum upload size" : "Najveća veličina otpremanja",
"max. possible: " : "najviše moguće:",
"Save" : "Sačuvaj",
- "Can not be edited from here due to insufficient permissions." : "Ne može da se menja odavde zbog nedostatka dozvola.",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristite ovu adresu da <a href=\"%s\" target=\"_blank\"> pristupite fajlovima preko WebDAV-a</a>",
@@ -108,6 +90,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.",
"Currently scanning" : "Trenutno skeniram",
"No favorites" : "Nema omiljenih",
- "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde"
+ "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde",
+ "Text file" : "tekstualni fajl"
},
"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.json b/apps/files/l10n/sr@latin.json
index 0eb117e6026..98356e441d6 100644
--- a/apps/files/l10n/sr@latin.json
+++ b/apps/files/l10n/sr@latin.json
@@ -2,13 +2,6 @@
"Storage not available" : "Skladište nije dostupno",
"Storage invalid" : "Neispravno skladište",
"Unknown error" : "Nepoznata greška",
- "Could not move %s - File with this name already exists" : "Ne mogu da premestim %s – fajl sa ovim nazivom već postoji",
- "Could not move %s" : "Ne mogu da premestim %s",
- "Permission denied" : "Pristup odbijen",
- "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.",
- "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s se već koristi u fascikli %s. Odredite drugi naziv.",
- "Error when creating the file" : "Greška pri stvaranju fajla",
- "Error when creating the folder" : "Greška pri stvaranju fajla",
"Unable to set upload directory." : "Ne mogu da postavim direktorijum za otpremanje.",
"Invalid Token" : "Neispravan token",
"No file was uploaded. Unknown error" : "Nijedan fajl nije otpremljen. Nepoznata greška",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Nedostaje privremena fascikla",
"Failed to write to disk" : "Ne mogu da pišem na disk",
"Not enough storage available" : "Nema dovoljno prostora",
+ "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.",
"Upload failed. Could not find uploaded file" : "Neuspešno otpremanje. Ne mogu da nađem otpremljeni fajl",
"Upload failed. Could not get file info." : "Neuspešno otpremanje. Ne mogu da dobijem podatke o fajlu.",
"Invalid directory." : "Neispravna fascikla.",
@@ -28,10 +22,10 @@
"Favorites" : "Omiljeni",
"Home" : "Početna",
"Close" : "Zatvori",
+ "Upload cancelled." : "Otpremanje je otkazano.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne mogu da otpremim {filename} jer je to direktorijum ili ima 0 bajtova",
"Total file size {size1} exceeds upload limit {size2}" : "Veličina {size1} prevazilazi ograničenje za otpremanje od {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nema prostora. Otpremate {size1} ali samo {size2} je preostalo",
- "Upload cancelled." : "Otpremanje je otkazano.",
"Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.",
"Download" : "Preuzmi",
@@ -41,14 +35,6 @@
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Ne mogu da odredim datum",
- "Error moving file." : "Greška pri premeštanju fajla.",
- "Error moving file" : "Greška pri premeštanju fajla",
- "Error" : "Greška",
- "{new_name} already exists" : "{new_name} već postoji",
- "Could not rename file" : "Ne mogu da preimenujem fajl",
- "Could not create file" : "Ne mogu da stvorim fajl",
- "Could not create folder" : "Ne mogu da stvorim fasciklu",
- "Error deleting file." : "Greška pri brisanju fajla.",
"No entries in this folder match '{filter}'" : "U ovoj fascikli ništa se ne poklapa sa '{filter}'",
"Name" : "Naziv",
"Size" : "Veličina",
@@ -66,10 +52,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["se poklapa sa '{filter}'","se poklapaju sa '{filter}'","se poklapa sa '{filter}'"],
"Favorited" : "Omiljeno",
"Favorite" : "Omiljeni",
- "Upload" : "Otpremi",
- "Text file" : "tekstualni fajl",
"Folder" : "fascikla",
"New folder" : "Nova fascikla",
+ "Upload" : "Otpremi",
"An error occurred while trying to update the tags" : "Došlo je do greške pri pokušaju ažuriranja oznaka",
"A new file or folder has been <strong>created</strong>" : "Novi fajl ili fascikla su <strong>napravljeni</strong>",
"A file or folder has been <strong>changed</strong>" : "Fajl ili fascikla su <strong>izmenjeni</strong>",
@@ -85,14 +70,11 @@
"%2$s deleted %1$s" : "%2$s obrisa %1$s",
"You restored %1$s" : "Vratili ste %1$s",
"%2$s restored %1$s" : "%2$s povrati %1$s",
- "%s could not be renamed as it has been deleted" : "%s se ne može preimenovati jer je obrisan",
- "%s could not be renamed" : "%s se ne može preimenovati",
"Upload (max. %s)" : "Otpremanje (maks. %s)",
"File handling" : "Rukovanje fajlovima",
"Maximum upload size" : "Najveća veličina otpremanja",
"max. possible: " : "najviše moguće:",
"Save" : "Sačuvaj",
- "Can not be edited from here due to insufficient permissions." : "Ne može da se menja odavde zbog nedostatka dozvola.",
"Settings" : "Postavke",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristite ovu adresu da <a href=\"%s\" target=\"_blank\"> pristupite fajlovima preko WebDAV-a</a>",
@@ -106,6 +88,7 @@
"Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.",
"Currently scanning" : "Trenutno skeniram",
"No favorites" : "Nema omiljenih",
- "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde"
+ "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde",
+ "Text file" : "tekstualni fajl"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 19f42fb144b..f5e81760b0f 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Lagring inte tillgänglig",
"Storage invalid" : "Lagring ogiltig",
"Unknown error" : "Okänt fel",
- "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",
- "Permission denied" : "Behörighet nekad.",
- "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.",
- "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.",
- "Error when creating the file" : "Fel under skapande utav filen",
- "Error when creating the folder" : "Fel under skapande utav en katalog",
"Unable to set upload directory." : "Kan inte sätta mapp för uppladdning.",
"Invalid Token" : "Ogiltig token",
"No file was uploaded. Unknown error" : "Ingen fil uppladdad. Okänt fel",
@@ -22,6 +15,7 @@ OC.L10N.register(
"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",
+ "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.",
"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.",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Misslyckades avgöra datum",
"This operation is forbidden" : "Denna operation är förbjuden",
"This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
- "Error moving file." : "Fel vid flytt av fil.",
- "Error moving file" : "Fel uppstod vid flyttning av fil",
- "Error" : "Fel",
- "{new_name} already exists" : "{new_name} finns redan",
- "Could not rename file" : "Kan ej byta filnamn",
- "Could not create file" : "Kunde ej skapa fil",
- "Could not create folder" : "Kunde ej skapa katalog",
- "Error deleting file." : "Kunde inte ta bort filen.",
"No entries in this folder match '{filter}'" : "Inga poster i denna mapp match \"{filter}\"",
"Name" : "Namn",
"Size" : "Storlek",
@@ -73,12 +59,10 @@ OC.L10N.register(
"Path" : "sökväg",
"Favorited" : "Favoritiserad",
"Favorite" : "Favorit",
- "{newname} already exists" : "{newname} existerar redan",
- "Upload" : "Ladda upp",
- "Text file" : "Textfil",
- "New text file.txt" : "nytextfil.txt",
"Folder" : "Mapp",
"New folder" : "Ny mapp",
+ "{newname} already exists" : "{newname} existerar redan",
+ "Upload" : "Ladda upp",
"An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna",
"A new file or folder has been <strong>created</strong>" : "En ny fil eller mapp har blivit <strong>skapad</strong>",
"A file or folder has been <strong>changed</strong>" : "En ny fil eller mapp har blivit <strong>ändrad</strong>",
@@ -96,15 +80,11 @@ OC.L10N.register(
"Changed by %2$s" : "Ändrad av %2$s",
"Deleted by %2$s" : "Bortagen av %2$s",
"Restored by %2$s" : "Återställd av %2$s",
- "%s could not be renamed as it has been deleted" : "%s kan inte döpas om eftersom den har raderats",
- "%s could not be renamed" : "%s kunde inte namnändras",
"Upload (max. %s)" : "Ladda upp (max. %s)",
"File handling" : "Filhantering",
"Maximum upload size" : "Maximal storlek att ladda upp",
"max. possible: " : "max. möjligt:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM detta värde kan ta upp till 5 minuter för att träda i kraft efter att ha sparat.",
"Save" : "Spara",
- "Can not be edited from here due to insufficient permissions." : "Kan inte redigeras härifrån på grund av otillräcklig behörighet.",
"Settings" : "Inställningar",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress till <a href=\"%s\" target=\"_blank\">nå dina Filer via WebDAV</a>",
@@ -118,6 +98,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Filer skannas, var god vänta",
"Currently scanning" : "sökning pågår",
"No favorites" : "Inga favoriter",
- "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här"
+ "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här",
+ "Text file" : "Textfil",
+ "New text file.txt" : "nytextfil.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index ea512d4f54b..c624c34029c 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -2,13 +2,6 @@
"Storage not available" : "Lagring inte tillgänglig",
"Storage invalid" : "Lagring ogiltig",
"Unknown error" : "Okänt fel",
- "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",
- "Permission denied" : "Behörighet nekad.",
- "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.",
- "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.",
- "Error when creating the file" : "Fel under skapande utav filen",
- "Error when creating the folder" : "Fel under skapande utav en katalog",
"Unable to set upload directory." : "Kan inte sätta mapp för uppladdning.",
"Invalid Token" : "Ogiltig token",
"No file was uploaded. Unknown error" : "Ingen fil uppladdad. Okänt fel",
@@ -20,6 +13,7 @@
"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",
+ "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.",
"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.",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Misslyckades avgöra datum",
"This operation is forbidden" : "Denna operation är förbjuden",
"This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
- "Error moving file." : "Fel vid flytt av fil.",
- "Error moving file" : "Fel uppstod vid flyttning av fil",
- "Error" : "Fel",
- "{new_name} already exists" : "{new_name} finns redan",
- "Could not rename file" : "Kan ej byta filnamn",
- "Could not create file" : "Kunde ej skapa fil",
- "Could not create folder" : "Kunde ej skapa katalog",
- "Error deleting file." : "Kunde inte ta bort filen.",
"No entries in this folder match '{filter}'" : "Inga poster i denna mapp match \"{filter}\"",
"Name" : "Namn",
"Size" : "Storlek",
@@ -71,12 +57,10 @@
"Path" : "sökväg",
"Favorited" : "Favoritiserad",
"Favorite" : "Favorit",
- "{newname} already exists" : "{newname} existerar redan",
- "Upload" : "Ladda upp",
- "Text file" : "Textfil",
- "New text file.txt" : "nytextfil.txt",
"Folder" : "Mapp",
"New folder" : "Ny mapp",
+ "{newname} already exists" : "{newname} existerar redan",
+ "Upload" : "Ladda upp",
"An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna",
"A new file or folder has been <strong>created</strong>" : "En ny fil eller mapp har blivit <strong>skapad</strong>",
"A file or folder has been <strong>changed</strong>" : "En ny fil eller mapp har blivit <strong>ändrad</strong>",
@@ -94,15 +78,11 @@
"Changed by %2$s" : "Ändrad av %2$s",
"Deleted by %2$s" : "Bortagen av %2$s",
"Restored by %2$s" : "Återställd av %2$s",
- "%s could not be renamed as it has been deleted" : "%s kan inte döpas om eftersom den har raderats",
- "%s could not be renamed" : "%s kunde inte namnändras",
"Upload (max. %s)" : "Ladda upp (max. %s)",
"File handling" : "Filhantering",
"Maximum upload size" : "Maximal storlek att ladda upp",
"max. possible: " : "max. möjligt:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM detta värde kan ta upp till 5 minuter för att träda i kraft efter att ha sparat.",
"Save" : "Spara",
- "Can not be edited from here due to insufficient permissions." : "Kan inte redigeras härifrån på grund av otillräcklig behörighet.",
"Settings" : "Inställningar",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress till <a href=\"%s\" target=\"_blank\">nå dina Filer via WebDAV</a>",
@@ -116,6 +96,8 @@
"Files are being scanned, please wait." : "Filer skannas, var god vänta",
"Currently scanning" : "sökning pågår",
"No favorites" : "Inga favoriter",
- "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här"
+ "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här",
+ "Text file" : "Textfil",
+ "New text file.txt" : "nytextfil.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ta_IN.js b/apps/files/l10n/ta_IN.js
index 85ed1ea3141..b2371916f12 100644
--- a/apps/files/l10n/ta_IN.js
+++ b/apps/files/l10n/ta_IN.js
@@ -3,8 +3,8 @@ OC.L10N.register(
{
"Files" : "கோப்புகள்",
"Details" : "விவரங்கள்",
- "Upload" : "பதிவேற்று",
"New folder" : "புதிய கோப்புறை",
+ "Upload" : "பதிவேற்று",
"A new file or folder has been <strong>created</strong>" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் <strong> உருவாக்கப்பட்டுள்ளது.</strong>",
"A file or folder has been <strong>changed</strong>" : "ஒரு கோப்புறை அல்லது ஆவணம் <strong>மாற்றம் செய்யப்பட்டுள்ளது.</strong>",
"A file or folder has been <strong>deleted</strong>" : "ஒரு கோப்புறை அல்லது ஆவணம் <strong> நீக்கப்பட்டுள்ளது. </strong>",
diff --git a/apps/files/l10n/ta_IN.json b/apps/files/l10n/ta_IN.json
index bb7117bc62e..e5fe6f3fc88 100644
--- a/apps/files/l10n/ta_IN.json
+++ b/apps/files/l10n/ta_IN.json
@@ -1,8 +1,8 @@
{ "translations": {
"Files" : "கோப்புகள்",
"Details" : "விவரங்கள்",
- "Upload" : "பதிவேற்று",
"New folder" : "புதிய கோப்புறை",
+ "Upload" : "பதிவேற்று",
"A new file or folder has been <strong>created</strong>" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் <strong> உருவாக்கப்பட்டுள்ளது.</strong>",
"A file or folder has been <strong>changed</strong>" : "ஒரு கோப்புறை அல்லது ஆவணம் <strong>மாற்றம் செய்யப்பட்டுள்ளது.</strong>",
"A file or folder has been <strong>deleted</strong>" : "ஒரு கோப்புறை அல்லது ஆவணம் <strong> நீக்கப்பட்டுள்ளது. </strong>",
diff --git a/apps/files/l10n/ta_LK.js b/apps/files/l10n/ta_LK.js
index de912eaea2e..39a3eda73fe 100644
--- a/apps/files/l10n/ta_LK.js
+++ b/apps/files/l10n/ta_LK.js
@@ -21,16 +21,13 @@ OC.L10N.register(
"Details" : "விவரங்கள்",
"Select" : "தெரிக",
"Pending" : "நிலுவையிலுள்ள",
- "Error" : "வழு",
- "{new_name} already exists" : "{new_name} ஏற்கனவே உள்ளது",
"Name" : "பெயர்",
"Size" : "அளவு",
"Modified" : "மாற்றப்பட்டது",
"New" : "புதிய",
"Favorite" : "விருப்பமான",
- "Upload" : "பதிவேற்றுக",
- "Text file" : "கோப்பு உரை",
"Folder" : "கோப்புறை",
+ "Upload" : "பதிவேற்றுக",
"File handling" : "கோப்பு கையாளுதல்",
"Maximum upload size" : "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ",
"max. possible: " : "ஆகக் கூடியது:",
@@ -39,6 +36,7 @@ OC.L10N.register(
"Cancel upload" : "பதிவேற்றலை இரத்து செய்க",
"Upload too large" : "பதிவேற்றல் மிகப்பெரியது",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.",
- "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்."
+ "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்.",
+ "Text file" : "கோப்பு உரை"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ta_LK.json b/apps/files/l10n/ta_LK.json
index b14853b503e..009ef6c7a8e 100644
--- a/apps/files/l10n/ta_LK.json
+++ b/apps/files/l10n/ta_LK.json
@@ -19,16 +19,13 @@
"Details" : "விவரங்கள்",
"Select" : "தெரிக",
"Pending" : "நிலுவையிலுள்ள",
- "Error" : "வழு",
- "{new_name} already exists" : "{new_name} ஏற்கனவே உள்ளது",
"Name" : "பெயர்",
"Size" : "அளவு",
"Modified" : "மாற்றப்பட்டது",
"New" : "புதிய",
"Favorite" : "விருப்பமான",
- "Upload" : "பதிவேற்றுக",
- "Text file" : "கோப்பு உரை",
"Folder" : "கோப்புறை",
+ "Upload" : "பதிவேற்றுக",
"File handling" : "கோப்பு கையாளுதல்",
"Maximum upload size" : "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ",
"max. possible: " : "ஆகக் கூடியது:",
@@ -37,6 +34,7 @@
"Cancel upload" : "பதிவேற்றலை இரத்து செய்க",
"Upload too large" : "பதிவேற்றல் மிகப்பெரியது",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.",
- "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்."
+ "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்.",
+ "Text file" : "கோப்பு உரை"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/te.js b/apps/files/l10n/te.js
index 9badfac3532..a41177c95f0 100644
--- a/apps/files/l10n/te.js
+++ b/apps/files/l10n/te.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Close" : "మూసివేయి",
"Delete" : "తొలగించు",
- "Error" : "పొరపాటు",
"Name" : "పేరు",
"Size" : "పరిమాణం",
"Folder" : "సంచయం",
diff --git a/apps/files/l10n/te.json b/apps/files/l10n/te.json
index 21d09484cd8..6fa2afe050b 100644
--- a/apps/files/l10n/te.json
+++ b/apps/files/l10n/te.json
@@ -1,7 +1,6 @@
{ "translations": {
"Close" : "మూసివేయి",
"Delete" : "తొలగించు",
- "Error" : "పొరపాటు",
"Name" : "పేరు",
"Size" : "పరిమాణం",
"Folder" : "సంచయం",
diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js
index 1cee4efd362..d371d5a39c4 100644
--- a/apps/files/l10n/th_TH.js
+++ b/apps/files/l10n/th_TH.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้",
"Storage invalid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
"Unknown error" : "ข้อผิดพลาดที่ไม่ทราบสาเหตุ",
- "Could not move %s - File with this name already exists" : "ไม่สามารถย้าย %s ได้ - ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้ว",
- "Could not move %s" : "ไม่สามารถย้าย %s ได้",
- "Permission denied" : "ไม่อนุญาต",
- "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 โปรดเลือกชื่ออื่นที่แตกต่างกัน",
- "Error when creating the file" : "เกิดข้อผิดพลาดเมื่อมีการสร้างไฟล์",
- "Error when creating the folder" : "เกิดข้อผิดพลาดเมื่อมีการสร้างโฟลเดอร์",
"Unable to set upload directory." : "ไม่สามารถตั้งค่าอัพโหลดไดเรกทอรี",
"Invalid Token" : "โทเค็นไม่ถูกต้อง",
"No file was uploaded. Unknown error" : "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "โฟลเดอร์ชั่วคราวเกิดการสูญหาย",
"Failed to write to disk" : "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว",
"Not enough storage available" : "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน",
+ "The target folder has been moved or deleted." : "โฟลเดอร์ปลายทางถูกย้ายหรือลบ",
"Upload failed. Could not find uploaded file" : "อัพโหลดล้มเหลว ไม่สามารถหาไฟล์ที่จะอัพโหลด",
"Upload failed. Could not get file info." : "อัพโหลดล้มเหลว ไม่สามารถรับข้อมูลไฟล์",
"Invalid directory." : "ไดเร็กทอรี่ไม่ถูกต้อง",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "รายการโปรด",
"Home" : "บ้าน",
"Close" : "ปิด",
+ "Upload cancelled." : "การอัพโหลดถูกยกเลิก",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัพโหลด {filename} มันเป็นไดเรกทอรีหรือมี 0 ไบต์",
"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." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"Actions" : "การกระทำ",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "ไม่สามารถกำหนดวัน",
"This operation is forbidden" : "การดำเนินการนี้ถูกห้าม",
"This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ",
- "Error moving file." : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์",
- "Error moving file" : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์",
- "Error" : "ข้อผิดพลาด",
- "{new_name} already exists" : "{new_name} มีอยู่แล้วในระบบ",
- "Could not rename file" : "ไม่สามารถเปลี่ยนชื่อไฟล์",
- "Could not create file" : "ไม่สามารถสร้างไฟล์",
- "Could not create folder" : "ไม่สามารถสร้างโฟลเดอร์",
- "Error deleting file." : "เกิดข้อผิดพลาดในการลบไฟล์",
+ "Could not move \"{file}\", target exists" : "ไม่สามารถย้ายไฟล์ \"{file}\" ไม่มีไฟล์นั้นอยู่",
+ "Could not move \"{file}\"" : "ไม่สามารถย้ายไฟล์ \"{file}\"",
+ "{newName} already exists" : "{newName} มีอยู่แล้ว",
+ "Could not rename \"{fileName}\", it does not exist any more" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\" ไฟล์นั้นไม่มีอยู่",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "ชื่อโฟลเดอร์ \"{targetName}\" มีอยู่แล้วใน \"{dir}\" กรุณาใช้ชื่อที่แตกต่างกัน",
+ "Could not rename \"{fileName}\"" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\"",
+ "Could not create file \"{file}\"" : "ไม่สามารถสร้างไฟล์ \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "ไม่สามารถสร้างไฟล์ \"{file}\" เพราะมันมีอยู่แล้ว",
+ "Could not create folder \"{dir}\"" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\" เพราะมันมีอยู่แล้ว",
+ "Error deleting file \"{fileName}\"." : "เกิดข้อผิดพลาดขณะลบไฟล์ \"{fileName}\"",
"No entries in this folder match '{filter}'" : "ไม่มีรายการในโฟลเดอร์นี้ที่ตรงกับ '{filter}'",
"Name" : "ชื่อ",
"Size" : "ขนาด",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n ไบต์"],
"Favorited" : "รายการโปรด",
"Favorite" : "รายการโปรด",
- "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว",
- "Upload" : "อัพโหลด",
- "Text file" : "ไฟล์ข้อความ",
- "New text file.txt" : "ไฟล์ข้อความใหม่ .txt",
"Folder" : "แฟ้มเอกสาร",
"New folder" : "โฟลเดอร์ใหม่",
+ "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว",
+ "Upload" : "อัพโหลด",
"An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะที่พยายามจะปรับปรุงแท็ก",
"A new file or folder has been <strong>created</strong>" : "มีไฟล์ใหม่หรือโฟลเดอร์ได้ถูก <strong>สร้างขึ้น!</strong>",
"A file or folder has been <strong>changed</strong>" : "มีไฟล์หรือโฟลเดอร์ได้ถูก <strong>เปลี่ยน!</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "เปลี่ยนแปลงโดย %2$s",
"Deleted by %2$s" : "ลบโดย %2$s",
"Restored by %2$s" : "กู้คืนโดย %2$s",
- "%s could not be renamed as it has been deleted" : "%s ไม่สามารถเปลี่ยนชื่อเนื่องจากถูกลบไปแล้ว",
- "%s could not be renamed" : "%s ไม่สามารถเปลี่ยนชื่อ",
"Upload (max. %s)" : "อัพโหลด (สูงสุด %s)",
"File handling" : "การจัดการไฟล์",
"Maximum upload size" : "ขนาดไฟล์สูงสุดที่อัพโหลดได้",
"max. possible: " : "จำนวนสูงสุดที่สามารถทำได้: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "ด้วยค่า PHP-FPM นี้อาจใช้เวลาถึง 5 นาที จะมีผลหลังจากการบันทึก",
"Save" : "บันทึก",
- "Can not be edited from here due to insufficient permissions." : "ไม่สามารถแก้ไขได้จากที่นี่เนื่องจากสิทธิ์ไม่เพียงพอ",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "กับ PHP-FPM อาจใช้เวลา 5 นาทีสำหรับการเปลี่ยนแปลงที่ถูกนำมาใช้",
+ "Missing permissions to edit from here." : "สิทธิ์ในการแก้ไขส่วนนี้หายไป",
"Settings" : "ตั้งค่า",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "ใช้ที่อยู่นี้เพื่อ <a href=\"%s\" target=\"_blank\">เข้าถึงไฟล์ของคุณผ่าน WebDAV</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
"Currently scanning" : "ปัจจุบันกำลังสแกน",
"No favorites" : "ไม่มีรายการโปรด",
- "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่"
+ "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่",
+ "Text file" : "ไฟล์ข้อความ",
+ "New text file.txt" : "ไฟล์ข้อความใหม่ .txt"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json
index e15e4e5803b..5e8086ad9d9 100644
--- a/apps/files/l10n/th_TH.json
+++ b/apps/files/l10n/th_TH.json
@@ -2,13 +2,6 @@
"Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้",
"Storage invalid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
"Unknown error" : "ข้อผิดพลาดที่ไม่ทราบสาเหตุ",
- "Could not move %s - File with this name already exists" : "ไม่สามารถย้าย %s ได้ - ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้ว",
- "Could not move %s" : "ไม่สามารถย้าย %s ได้",
- "Permission denied" : "ไม่อนุญาต",
- "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 โปรดเลือกชื่ออื่นที่แตกต่างกัน",
- "Error when creating the file" : "เกิดข้อผิดพลาดเมื่อมีการสร้างไฟล์",
- "Error when creating the folder" : "เกิดข้อผิดพลาดเมื่อมีการสร้างโฟลเดอร์",
"Unable to set upload directory." : "ไม่สามารถตั้งค่าอัพโหลดไดเรกทอรี",
"Invalid Token" : "โทเค็นไม่ถูกต้อง",
"No file was uploaded. Unknown error" : "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "โฟลเดอร์ชั่วคราวเกิดการสูญหาย",
"Failed to write to disk" : "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว",
"Not enough storage available" : "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน",
+ "The target folder has been moved or deleted." : "โฟลเดอร์ปลายทางถูกย้ายหรือลบ",
"Upload failed. Could not find uploaded file" : "อัพโหลดล้มเหลว ไม่สามารถหาไฟล์ที่จะอัพโหลด",
"Upload failed. Could not get file info." : "อัพโหลดล้มเหลว ไม่สามารถรับข้อมูลไฟล์",
"Invalid directory." : "ไดเร็กทอรี่ไม่ถูกต้อง",
@@ -28,10 +22,10 @@
"Favorites" : "รายการโปรด",
"Home" : "บ้าน",
"Close" : "ปิด",
+ "Upload cancelled." : "การอัพโหลดถูกยกเลิก",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัพโหลด {filename} มันเป็นไดเรกทอรีหรือมี 0 ไบต์",
"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." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"Actions" : "การกระทำ",
@@ -44,14 +38,17 @@
"Unable to determine date" : "ไม่สามารถกำหนดวัน",
"This operation is forbidden" : "การดำเนินการนี้ถูกห้าม",
"This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ",
- "Error moving file." : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์",
- "Error moving file" : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์",
- "Error" : "ข้อผิดพลาด",
- "{new_name} already exists" : "{new_name} มีอยู่แล้วในระบบ",
- "Could not rename file" : "ไม่สามารถเปลี่ยนชื่อไฟล์",
- "Could not create file" : "ไม่สามารถสร้างไฟล์",
- "Could not create folder" : "ไม่สามารถสร้างโฟลเดอร์",
- "Error deleting file." : "เกิดข้อผิดพลาดในการลบไฟล์",
+ "Could not move \"{file}\", target exists" : "ไม่สามารถย้ายไฟล์ \"{file}\" ไม่มีไฟล์นั้นอยู่",
+ "Could not move \"{file}\"" : "ไม่สามารถย้ายไฟล์ \"{file}\"",
+ "{newName} already exists" : "{newName} มีอยู่แล้ว",
+ "Could not rename \"{fileName}\", it does not exist any more" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\" ไฟล์นั้นไม่มีอยู่",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "ชื่อโฟลเดอร์ \"{targetName}\" มีอยู่แล้วใน \"{dir}\" กรุณาใช้ชื่อที่แตกต่างกัน",
+ "Could not rename \"{fileName}\"" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\"",
+ "Could not create file \"{file}\"" : "ไม่สามารถสร้างไฟล์ \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "ไม่สามารถสร้างไฟล์ \"{file}\" เพราะมันมีอยู่แล้ว",
+ "Could not create folder \"{dir}\"" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\" เพราะมันมีอยู่แล้ว",
+ "Error deleting file \"{fileName}\"." : "เกิดข้อผิดพลาดขณะลบไฟล์ \"{fileName}\"",
"No entries in this folder match '{filter}'" : "ไม่มีรายการในโฟลเดอร์นี้ที่ตรงกับ '{filter}'",
"Name" : "ชื่อ",
"Size" : "ขนาด",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n ไบต์"],
"Favorited" : "รายการโปรด",
"Favorite" : "รายการโปรด",
- "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว",
- "Upload" : "อัพโหลด",
- "Text file" : "ไฟล์ข้อความ",
- "New text file.txt" : "ไฟล์ข้อความใหม่ .txt",
"Folder" : "แฟ้มเอกสาร",
"New folder" : "โฟลเดอร์ใหม่",
+ "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว",
+ "Upload" : "อัพโหลด",
"An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะที่พยายามจะปรับปรุงแท็ก",
"A new file or folder has been <strong>created</strong>" : "มีไฟล์ใหม่หรือโฟลเดอร์ได้ถูก <strong>สร้างขึ้น!</strong>",
"A file or folder has been <strong>changed</strong>" : "มีไฟล์หรือโฟลเดอร์ได้ถูก <strong>เปลี่ยน!</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "เปลี่ยนแปลงโดย %2$s",
"Deleted by %2$s" : "ลบโดย %2$s",
"Restored by %2$s" : "กู้คืนโดย %2$s",
- "%s could not be renamed as it has been deleted" : "%s ไม่สามารถเปลี่ยนชื่อเนื่องจากถูกลบไปแล้ว",
- "%s could not be renamed" : "%s ไม่สามารถเปลี่ยนชื่อ",
"Upload (max. %s)" : "อัพโหลด (สูงสุด %s)",
"File handling" : "การจัดการไฟล์",
"Maximum upload size" : "ขนาดไฟล์สูงสุดที่อัพโหลดได้",
"max. possible: " : "จำนวนสูงสุดที่สามารถทำได้: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "ด้วยค่า PHP-FPM นี้อาจใช้เวลาถึง 5 นาที จะมีผลหลังจากการบันทึก",
"Save" : "บันทึก",
- "Can not be edited from here due to insufficient permissions." : "ไม่สามารถแก้ไขได้จากที่นี่เนื่องจากสิทธิ์ไม่เพียงพอ",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "กับ PHP-FPM อาจใช้เวลา 5 นาทีสำหรับการเปลี่ยนแปลงที่ถูกนำมาใช้",
+ "Missing permissions to edit from here." : "สิทธิ์ในการแก้ไขส่วนนี้หายไป",
"Settings" : "ตั้งค่า",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "ใช้ที่อยู่นี้เพื่อ <a href=\"%s\" target=\"_blank\">เข้าถึงไฟล์ของคุณผ่าน WebDAV</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
"Currently scanning" : "ปัจจุบันกำลังสแกน",
"No favorites" : "ไม่มีรายการโปรด",
- "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่"
+ "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่",
+ "Text file" : "ไฟล์ข้อความ",
+ "New text file.txt" : "ไฟล์ข้อความใหม่ .txt"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index cd48408b9e1..d0c68861518 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Depolama mevcut değil",
"Storage invalid" : "Depolama geçersiz",
"Unknown error" : "Bilinmeyen hata",
- "Could not move %s - File with this name already exists" : "%s taşınamadı. Bu isimde dosya zaten mevcut",
- "Could not move %s" : "%s taşınamadı",
- "Permission denied" : "Erişim reddedildi",
- "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.",
- "Error when creating the file" : "Dosya oluşturulurken hata",
- "Error when creating the folder" : "Klasör oluşturulurken hata",
"Unable to set upload directory." : "Yükleme dizini ayarlanamadı.",
"Invalid Token" : "Geçersiz Belirteç",
"No file was uploaded. Unknown error" : "Dosya yüklenmedi. Bilinmeyen hata",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Geçici bir dizin eksik",
"Failed to write to disk" : "Diske yazılamadı",
"Not enough storage available" : "Yeterli disk alanı yok",
+ "The target folder has been moved or deleted." : "Hedef klasör taşındı veya silindi.",
"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.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Sık kullanılanlar",
"Home" : "Ev",
"Close" : "Kapat",
+ "Upload cancelled." : "Yükleme iptal edildi.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi",
"Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını 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. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.",
"Actions" : "Eylemler",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "Tarih tespit edilemedi",
"This operation is forbidden" : "Bu işlem yasak",
"This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü kontrol edin veya yönetici ile iletişime geçin",
- "Error moving file." : "Dosya taşıma hatası.",
- "Error moving file" : "Dosya taşıma hatası",
- "Error" : "Hata",
- "{new_name} already exists" : "{new_name} zaten mevcut",
- "Could not rename file" : "Dosya adlandırılamadı",
- "Could not create file" : "Dosya oluşturulamadı",
- "Could not create folder" : "Klasör oluşturulamadı",
- "Error deleting file." : "Dosya silinirken hata.",
"No entries in this folder match '{filter}'" : "Bu klasörde hiçbir girdi '{filter}' ile eşleşmiyor",
"Name" : "İsim",
"Size" : "Boyut",
@@ -75,12 +61,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"],
"Favorited" : "Sık kullanılanlara eklendi",
"Favorite" : "Sık kullanılan",
- "{newname} already exists" : "{newname} zaten mevcut",
- "Upload" : "Yükle",
- "Text file" : "Metin dosyası",
- "New text file.txt" : "Yeni metin dosyası.txt",
"Folder" : "Klasör",
"New folder" : "Yeni klasör",
+ "{newname} already exists" : "{newname} zaten mevcut",
+ "Upload" : "Yükle",
"An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu",
"A new file or folder has been <strong>created</strong>" : "Yeni bir dosya veya klasör <strong>oluşturuldu</strong>",
"A file or folder has been <strong>changed</strong>" : "Bir dosya veya klasör <strong>değiştirildi</strong>",
@@ -99,15 +83,13 @@ OC.L10N.register(
"Changed by %2$s" : "%2$s tarafından değiştirildi",
"Deleted by %2$s" : "%2$s tarafından silindi",
"Restored by %2$s" : "%2$s tarafından geri yüklendi",
- "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı",
- "%s could not be renamed" : "%s yeniden adlandırılamadı",
"Upload (max. %s)" : "Yükle (azami: %s)",
"File handling" : "Dosya işlemleri",
"Maximum upload size" : "Azami yükleme boyutu",
"max. possible: " : "mümkün olan en fazla: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ile bu değerin kaydedildikten sonra etkili olabilmesi için 5 dakika gerekebilir.",
"Save" : "Kaydet",
- "Can not be edited from here due to insufficient permissions." : "Yetersiz izinler buradan düzenlenemez.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM ile değişikliklerin uygulanması 5 dakika sürebilir.",
+ "Missing permissions to edit from here." : "Buradan düzenleme için eksik yetki.",
"Settings" : "Ayarlar",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">Dosyalarınıza WebDAV aracılığıyla erişmek için</a> bu adresi kullanın",
@@ -121,6 +103,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.",
"Currently scanning" : "Şu anda taranan",
"No favorites" : "Sık kullanılan öge yok.",
- "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek"
+ "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek",
+ "Text file" : "Metin dosyası",
+ "New text file.txt" : "Yeni metin dosyası.txt"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 92af334f703..7bc756530dc 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -2,13 +2,6 @@
"Storage not available" : "Depolama mevcut değil",
"Storage invalid" : "Depolama geçersiz",
"Unknown error" : "Bilinmeyen hata",
- "Could not move %s - File with this name already exists" : "%s taşınamadı. Bu isimde dosya zaten mevcut",
- "Could not move %s" : "%s taşınamadı",
- "Permission denied" : "Erişim reddedildi",
- "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.",
- "Error when creating the file" : "Dosya oluşturulurken hata",
- "Error when creating the folder" : "Klasör oluşturulurken hata",
"Unable to set upload directory." : "Yükleme dizini ayarlanamadı.",
"Invalid Token" : "Geçersiz Belirteç",
"No file was uploaded. Unknown error" : "Dosya yüklenmedi. Bilinmeyen hata",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Geçici bir dizin eksik",
"Failed to write to disk" : "Diske yazılamadı",
"Not enough storage available" : "Yeterli disk alanı yok",
+ "The target folder has been moved or deleted." : "Hedef klasör taşındı veya silindi.",
"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.",
@@ -28,10 +22,10 @@
"Favorites" : "Sık kullanılanlar",
"Home" : "Ev",
"Close" : "Kapat",
+ "Upload cancelled." : "Yükleme iptal edildi.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi",
"Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını 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. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.",
"Actions" : "Eylemler",
@@ -44,14 +38,6 @@
"Unable to determine date" : "Tarih tespit edilemedi",
"This operation is forbidden" : "Bu işlem yasak",
"This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü kontrol edin veya yönetici ile iletişime geçin",
- "Error moving file." : "Dosya taşıma hatası.",
- "Error moving file" : "Dosya taşıma hatası",
- "Error" : "Hata",
- "{new_name} already exists" : "{new_name} zaten mevcut",
- "Could not rename file" : "Dosya adlandırılamadı",
- "Could not create file" : "Dosya oluşturulamadı",
- "Could not create folder" : "Klasör oluşturulamadı",
- "Error deleting file." : "Dosya silinirken hata.",
"No entries in this folder match '{filter}'" : "Bu klasörde hiçbir girdi '{filter}' ile eşleşmiyor",
"Name" : "İsim",
"Size" : "Boyut",
@@ -73,12 +59,10 @@
"_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"],
"Favorited" : "Sık kullanılanlara eklendi",
"Favorite" : "Sık kullanılan",
- "{newname} already exists" : "{newname} zaten mevcut",
- "Upload" : "Yükle",
- "Text file" : "Metin dosyası",
- "New text file.txt" : "Yeni metin dosyası.txt",
"Folder" : "Klasör",
"New folder" : "Yeni klasör",
+ "{newname} already exists" : "{newname} zaten mevcut",
+ "Upload" : "Yükle",
"An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu",
"A new file or folder has been <strong>created</strong>" : "Yeni bir dosya veya klasör <strong>oluşturuldu</strong>",
"A file or folder has been <strong>changed</strong>" : "Bir dosya veya klasör <strong>değiştirildi</strong>",
@@ -97,15 +81,13 @@
"Changed by %2$s" : "%2$s tarafından değiştirildi",
"Deleted by %2$s" : "%2$s tarafından silindi",
"Restored by %2$s" : "%2$s tarafından geri yüklendi",
- "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı",
- "%s could not be renamed" : "%s yeniden adlandırılamadı",
"Upload (max. %s)" : "Yükle (azami: %s)",
"File handling" : "Dosya işlemleri",
"Maximum upload size" : "Azami yükleme boyutu",
"max. possible: " : "mümkün olan en fazla: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ile bu değerin kaydedildikten sonra etkili olabilmesi için 5 dakika gerekebilir.",
"Save" : "Kaydet",
- "Can not be edited from here due to insufficient permissions." : "Yetersiz izinler buradan düzenlenemez.",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM ile değişikliklerin uygulanması 5 dakika sürebilir.",
+ "Missing permissions to edit from here." : "Buradan düzenleme için eksik yetki.",
"Settings" : "Ayarlar",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">Dosyalarınıza WebDAV aracılığıyla erişmek için</a> bu adresi kullanın",
@@ -119,6 +101,8 @@
"Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.",
"Currently scanning" : "Şu anda taranan",
"No favorites" : "Sık kullanılan öge yok.",
- "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek"
+ "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek",
+ "Text file" : "Metin dosyası",
+ "New text file.txt" : "Yeni metin dosyası.txt"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js
index 4371e15067f..55985f6a655 100644
--- a/apps/files/l10n/ug.js
+++ b/apps/files/l10n/ug.js
@@ -2,7 +2,6 @@ OC.L10N.register(
"files",
{
"Unknown error" : "يوچۇن خاتالىق",
- "Could not move %s" : "%s يۆتكىيەلمەيدۇ",
"No file was uploaded. Unknown error" : "ھېچقانداق ھۆججەت يۈكلەنمىدى. يوچۇن خاتالىق",
"No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى",
"Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.",
@@ -19,21 +18,19 @@ OC.L10N.register(
"Rename" : "ئات ئۆزگەرت",
"Delete" : "ئۆچۈر",
"Pending" : "كۈتۈۋاتىدۇ",
- "Error" : "خاتالىق",
- "{new_name} already exists" : "{new_name} مەۋجۇت",
"Name" : "ئاتى",
"Size" : "چوڭلۇقى",
"Modified" : "ئۆزگەرتكەن",
"New" : "يېڭى",
"Favorite" : "يىغقۇچ",
- "Upload" : "يۈكلە",
- "Text file" : "تېكىست ھۆججەت",
"Folder" : "قىسقۇچ",
"New folder" : "يېڭى قىسقۇچ",
+ "Upload" : "يۈكلە",
"Save" : "ساقلا",
"Settings" : "تەڭشەكلەر",
"WebDAV" : "WebDAV",
"Cancel upload" : "يۈكلەشتىن ۋاز كەچ",
- "Upload too large" : "يۈكلەندىغىنى بەك چوڭ"
+ "Upload too large" : "يۈكلەندىغىنى بەك چوڭ",
+ "Text file" : "تېكىست ھۆججەت"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json
index f6a71d8bda6..716bf62afb9 100644
--- a/apps/files/l10n/ug.json
+++ b/apps/files/l10n/ug.json
@@ -1,6 +1,5 @@
{ "translations": {
"Unknown error" : "يوچۇن خاتالىق",
- "Could not move %s" : "%s يۆتكىيەلمەيدۇ",
"No file was uploaded. Unknown error" : "ھېچقانداق ھۆججەت يۈكلەنمىدى. يوچۇن خاتالىق",
"No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى",
"Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.",
@@ -17,21 +16,19 @@
"Rename" : "ئات ئۆزگەرت",
"Delete" : "ئۆچۈر",
"Pending" : "كۈتۈۋاتىدۇ",
- "Error" : "خاتالىق",
- "{new_name} already exists" : "{new_name} مەۋجۇت",
"Name" : "ئاتى",
"Size" : "چوڭلۇقى",
"Modified" : "ئۆزگەرتكەن",
"New" : "يېڭى",
"Favorite" : "يىغقۇچ",
- "Upload" : "يۈكلە",
- "Text file" : "تېكىست ھۆججەت",
"Folder" : "قىسقۇچ",
"New folder" : "يېڭى قىسقۇچ",
+ "Upload" : "يۈكلە",
"Save" : "ساقلا",
"Settings" : "تەڭشەكلەر",
"WebDAV" : "WebDAV",
"Cancel upload" : "يۈكلەشتىن ۋاز كەچ",
- "Upload too large" : "يۈكلەندىغىنى بەك چوڭ"
+ "Upload too large" : "يۈكلەندىغىنى بەك چوڭ",
+ "Text file" : "تېكىست ھۆججەت"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index bf5b0f1d456..8d43949d8ff 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "Сховище не доступне",
"Storage invalid" : "Неправильне сховище",
"Unknown error" : "Невідома помилка",
- "Could not move %s - File with this name already exists" : "Не вдалося перемістити %s - файл з таким ім'ям вже існує",
- "Could not move %s" : "Не вдалося перемістити %s",
- "Permission denied" : "Доступ заборонено",
- "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. Оберіть інше ім'я.",
- "Error when creating the file" : "Помилка створення файлу",
- "Error when creating the folder" : "Помилка створення теки",
"Unable to set upload directory." : "Не вдалося встановити каталог вивантаження.",
"Invalid Token" : "Неприпустимий маркер",
"No file was uploaded. Unknown error" : "Файл не був вивантажений. Невідома помилка",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Відсутній тимчасовий каталог",
"Failed to write to disk" : "Помилка запису на диск",
"Not enough storage available" : "Місця більше немає",
+ "The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.",
"Upload failed. Could not find uploaded file" : "Вивантаження не вдалося. Неможливо знайти вивантажений файл.",
"Upload failed. Could not get file info." : "Вивантаження не вдалося. Неможливо отримати інформацію про файл.",
"Invalid directory." : "Невірний каталог.",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "Улюблені",
"Home" : "Домашня адреса",
"Close" : "Закрити",
+ "Upload cancelled." : "Вивантаження скасовано.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо вивантажити {filename}, оскільки це каталог або файл має розмір 0 байт.",
"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." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.",
"Actions" : "Дії",
@@ -45,14 +39,6 @@ OC.L10N.register(
"Pending" : "Очікування",
"Unable to determine date" : "Неможливо визначити дату",
"This operation is forbidden" : "Ця операція заборонена",
- "Error moving file." : "Помилка переміщення файлу.",
- "Error moving file" : "Помилка переміщення файлу",
- "Error" : "Помилка",
- "{new_name} already exists" : "{new_name} вже існує",
- "Could not rename file" : "Неможливо перейменувати файл",
- "Could not create file" : "Не вдалося створити файл",
- "Could not create folder" : "Не вдалося створити теку",
- "Error deleting file." : "Помилка видалення файлу.",
"No entries in this folder match '{filter}'" : "Нічого не знайдено в цій теці '{filter}'",
"Name" : "Ім'я",
"Size" : "Розмір",
@@ -70,10 +56,9 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'"],
"Favorited" : "Улюблений",
"Favorite" : "Улюблений",
- "Upload" : "Вивантажити",
- "Text file" : "Текстовий файл",
"Folder" : "Тека",
"New folder" : "Нова тека",
+ "Upload" : "Вивантажити",
"An error occurred while trying to update the tags" : "Виникла помилка при спробі оновити мітки",
"A new file or folder has been <strong>created</strong>" : "Новий файл або теку було <strong>створено</strong>",
"A file or folder has been <strong>changed</strong>" : "Файл або теку було <strong> змінено </strong>",
@@ -89,14 +74,11 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s видалено %1$s",
"You restored %1$s" : "Вами відновлено %1$s",
"%2$s restored %1$s" : "%2$s відновлено %1$s",
- "%s could not be renamed as it has been deleted" : "%s не можна перейменувати, оскільки його видалено",
- "%s could not be renamed" : "%s не можна перейменувати",
"Upload (max. %s)" : "Вивантаження (макс. %s)",
"File handling" : "Робота з файлами",
"Maximum upload size" : "Максимальний розмір вивантажень",
"max. possible: " : "макс. можливе:",
"Save" : "Зберегти",
- "Can not be edited from here due to insufficient permissions." : "Неможливо відредагувати тут через брак повноважень.",
"Settings" : "Налаштування",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Для доступу до файлів через WebDAV використовуйте <a href=\"%s\" target=\"_blank\">це посилання</a>",
@@ -110,6 +92,7 @@ OC.L10N.register(
"Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.",
"Currently scanning" : "Триває перевірка",
"No favorites" : "Немає улюблених",
- "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут"
+ "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут",
+ "Text file" : "Текстовий файл"
},
"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/uk.json b/apps/files/l10n/uk.json
index 28d307b55be..d7381e0cfa7 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -2,13 +2,6 @@
"Storage not available" : "Сховище не доступне",
"Storage invalid" : "Неправильне сховище",
"Unknown error" : "Невідома помилка",
- "Could not move %s - File with this name already exists" : "Не вдалося перемістити %s - файл з таким ім'ям вже існує",
- "Could not move %s" : "Не вдалося перемістити %s",
- "Permission denied" : "Доступ заборонено",
- "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. Оберіть інше ім'я.",
- "Error when creating the file" : "Помилка створення файлу",
- "Error when creating the folder" : "Помилка створення теки",
"Unable to set upload directory." : "Не вдалося встановити каталог вивантаження.",
"Invalid Token" : "Неприпустимий маркер",
"No file was uploaded. Unknown error" : "Файл не був вивантажений. Невідома помилка",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "Відсутній тимчасовий каталог",
"Failed to write to disk" : "Помилка запису на диск",
"Not enough storage available" : "Місця більше немає",
+ "The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.",
"Upload failed. Could not find uploaded file" : "Вивантаження не вдалося. Неможливо знайти вивантажений файл.",
"Upload failed. Could not get file info." : "Вивантаження не вдалося. Неможливо отримати інформацію про файл.",
"Invalid directory." : "Невірний каталог.",
@@ -28,10 +22,10 @@
"Favorites" : "Улюблені",
"Home" : "Домашня адреса",
"Close" : "Закрити",
+ "Upload cancelled." : "Вивантаження скасовано.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо вивантажити {filename}, оскільки це каталог або файл має розмір 0 байт.",
"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." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.",
"Actions" : "Дії",
@@ -43,14 +37,6 @@
"Pending" : "Очікування",
"Unable to determine date" : "Неможливо визначити дату",
"This operation is forbidden" : "Ця операція заборонена",
- "Error moving file." : "Помилка переміщення файлу.",
- "Error moving file" : "Помилка переміщення файлу",
- "Error" : "Помилка",
- "{new_name} already exists" : "{new_name} вже існує",
- "Could not rename file" : "Неможливо перейменувати файл",
- "Could not create file" : "Не вдалося створити файл",
- "Could not create folder" : "Не вдалося створити теку",
- "Error deleting file." : "Помилка видалення файлу.",
"No entries in this folder match '{filter}'" : "Нічого не знайдено в цій теці '{filter}'",
"Name" : "Ім'я",
"Size" : "Розмір",
@@ -68,10 +54,9 @@
"_matches '{filter}'_::_match '{filter}'_" : ["знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'"],
"Favorited" : "Улюблений",
"Favorite" : "Улюблений",
- "Upload" : "Вивантажити",
- "Text file" : "Текстовий файл",
"Folder" : "Тека",
"New folder" : "Нова тека",
+ "Upload" : "Вивантажити",
"An error occurred while trying to update the tags" : "Виникла помилка при спробі оновити мітки",
"A new file or folder has been <strong>created</strong>" : "Новий файл або теку було <strong>створено</strong>",
"A file or folder has been <strong>changed</strong>" : "Файл або теку було <strong> змінено </strong>",
@@ -87,14 +72,11 @@
"%2$s deleted %1$s" : "%2$s видалено %1$s",
"You restored %1$s" : "Вами відновлено %1$s",
"%2$s restored %1$s" : "%2$s відновлено %1$s",
- "%s could not be renamed as it has been deleted" : "%s не можна перейменувати, оскільки його видалено",
- "%s could not be renamed" : "%s не можна перейменувати",
"Upload (max. %s)" : "Вивантаження (макс. %s)",
"File handling" : "Робота з файлами",
"Maximum upload size" : "Максимальний розмір вивантажень",
"max. possible: " : "макс. можливе:",
"Save" : "Зберегти",
- "Can not be edited from here due to insufficient permissions." : "Неможливо відредагувати тут через брак повноважень.",
"Settings" : "Налаштування",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Для доступу до файлів через WebDAV використовуйте <a href=\"%s\" target=\"_blank\">це посилання</a>",
@@ -108,6 +90,7 @@
"Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.",
"Currently scanning" : "Триває перевірка",
"No favorites" : "Немає улюблених",
- "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут"
+ "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут",
+ "Text file" : "Текстовий файл"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js
index 2265e52d771..bac2c3b614b 100644
--- a/apps/files/l10n/ur_PK.js
+++ b/apps/files/l10n/ur_PK.js
@@ -5,7 +5,6 @@ OC.L10N.register(
"Close" : "بند ",
"Download" : "ڈاؤن لوڈ،",
"Delete" : "حذف کریں",
- "Error" : "ایرر",
"Name" : "اسم",
"Save" : "حفظ",
"Settings" : "ترتیبات"
diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json
index e8eb736811c..be36293b913 100644
--- a/apps/files/l10n/ur_PK.json
+++ b/apps/files/l10n/ur_PK.json
@@ -3,7 +3,6 @@
"Close" : "بند ",
"Download" : "ڈاؤن لوڈ،",
"Delete" : "حذف کریں",
- "Error" : "ایرر",
"Name" : "اسم",
"Save" : "حفظ",
"Settings" : "ترتیبات"
diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js
index 2c643e3cfb5..4af893ab66a 100644
--- a/apps/files/l10n/vi.js
+++ b/apps/files/l10n/vi.js
@@ -4,11 +4,6 @@ OC.L10N.register(
"Storage not available" : "Lưu trữ không có sẵn",
"Storage invalid" : "Lưu trữ không hợp lệ",
"Unknown error" : "Lỗi chưa biết",
- "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",
- "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.",
- "Error when creating the file" : "Lỗi khi tạo file",
- "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",
@@ -27,8 +22,8 @@ OC.L10N.register(
"Favorites" : "Ưa thích",
"Home" : "Nhà",
"Close" : "Đóng",
- "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",
+ "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",
"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.",
"Actions" : "Actions",
@@ -38,13 +33,6 @@ OC.L10N.register(
"Details" : "Chi tiết",
"Select" : "Chọn",
"Pending" : "Đang chờ",
- "Error moving file" : "Lỗi di chuyển tập tin",
- "Error" : "Lỗi",
- "{new_name} already exists" : "{new_name} đã tồn tại",
- "Could not rename file" : "Không thể đổi tên file",
- "Could not create file" : "Không thể tạo file",
- "Could not create folder" : "Không thể tạo thư mục",
- "Error deleting file." : "Lỗi xóa file,",
"Name" : "Tên",
"Size" : "Kích cỡ",
"Modified" : "Thay đổi",
@@ -58,11 +46,9 @@ OC.L10N.register(
"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}%)",
"Favorite" : "Ưu thích",
- "Upload" : "Tải lên",
- "Text file" : "Tập tin văn bản",
"Folder" : "Thư mục",
"New folder" : "Tạo thư mục",
- "%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 ",
"max. possible: " : "tối đa cho phép:",
@@ -74,6 +60,7 @@ OC.L10N.register(
"Select all" : "Chọn tất cả",
"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ờ."
+ "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ.",
+ "Text file" : "Tập tin văn bản"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json
index ac7a1f3828e..ebffb827525 100644
--- a/apps/files/l10n/vi.json
+++ b/apps/files/l10n/vi.json
@@ -2,11 +2,6 @@
"Storage not available" : "Lưu trữ không có sẵn",
"Storage invalid" : "Lưu trữ không hợp lệ",
"Unknown error" : "Lỗi chưa biết",
- "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",
- "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.",
- "Error when creating the file" : "Lỗi khi tạo file",
- "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",
@@ -25,8 +20,8 @@
"Favorites" : "Ưa thích",
"Home" : "Nhà",
"Close" : "Đóng",
- "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",
+ "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",
"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.",
"Actions" : "Actions",
@@ -36,13 +31,6 @@
"Details" : "Chi tiết",
"Select" : "Chọn",
"Pending" : "Đang chờ",
- "Error moving file" : "Lỗi di chuyển tập tin",
- "Error" : "Lỗi",
- "{new_name} already exists" : "{new_name} đã tồn tại",
- "Could not rename file" : "Không thể đổi tên file",
- "Could not create file" : "Không thể tạo file",
- "Could not create folder" : "Không thể tạo thư mục",
- "Error deleting file." : "Lỗi xóa file,",
"Name" : "Tên",
"Size" : "Kích cỡ",
"Modified" : "Thay đổi",
@@ -56,11 +44,9 @@
"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}%)",
"Favorite" : "Ưu thích",
- "Upload" : "Tải lên",
- "Text file" : "Tập tin văn bản",
"Folder" : "Thư mục",
"New folder" : "Tạo thư mục",
- "%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 ",
"max. possible: " : "tối đa cho phép:",
@@ -72,6 +58,7 @@
"Select all" : "Chọn tất cả",
"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ờ."
+ "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ.",
+ "Text file" : "Tập tin văn bản"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index d2b0989e35a..cadbeee3fc3 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "存储空间不可用",
"Storage invalid" : "存储空间无效",
"Unknown error" : "未知错误",
- "Could not move %s - File with this name already exists" : "无法移动 %s - 同名文件已存在",
- "Could not move %s" : "无法移动 %s",
- "Permission denied" : "拒绝访问",
- "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 中存在的名称。请使用其他名称。",
- "Error when creating the file" : "创建文件时出错",
- "Error when creating the folder" : "创建文件夹出错",
"Unable to set upload directory." : "无法设置上传文件夹。",
"Invalid Token" : "无效密匙",
"No file was uploaded. Unknown error" : "没有文件被上传。未知错误",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "缺少临时目录",
"Failed to write to disk" : "写入磁盘失败",
"Not enough storage available" : "没有足够的存储空间",
+ "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。",
"Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件",
"Upload failed. Could not get file info." : "上传失败。无法获取文件信息。",
"Invalid directory." : "无效文件夹。",
@@ -30,10 +24,10 @@ OC.L10N.register(
"Favorites" : "收藏",
"Home" : "家庭",
"Close" : "关闭",
+ "Upload cancelled." : "上传已取消",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
"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." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
"Actions" : "动作",
@@ -46,14 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "无法确定日期",
"This operation is forbidden" : "操作被禁止",
"This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Error moving file." : "移动文件出错。",
- "Error moving file" : "移动文件错误",
- "Error" : "错误",
- "{new_name} already exists" : "{new_name} 已存在",
- "Could not rename file" : "不能重命名文件",
- "Could not create file" : "不能创建文件",
- "Could not create folder" : "不能创建文件夹",
- "Error deleting file." : "删除文件出错。",
+ "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。",
+ "Could not move \"{file}\"" : "不能移动 \"{file}\"",
+ "{newName} already exists" : "{newname} 已经存在",
+ "Could not rename \"{fileName}\", it does not exist any more" : "不能重命名 \"{fileName}\",此文件已经不存在",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。",
+ "Could not rename \"{fileName}\"" : "不能重命名 \"{fileName}\"",
+ "Could not create file \"{file}\"" : "不能创建文件 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "不能创建文件 \"{file}\" ,因为它已经存在",
+ "Could not create folder \"{dir}\"" : "不能创建文件夹 \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在",
+ "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
"No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”",
"Name" : "名称",
"Size" : "大小",
@@ -75,12 +72,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
- "{newname} already exists" : "{newname} 已经存在",
- "Upload" : "上传",
- "Text file" : "文本文件",
- "New text file.txt" : "创建文本文件 .txt",
"Folder" : "文件夹",
"New folder" : "增加文件夹",
+ "{newname} already exists" : "{newname} 已经存在",
+ "Upload" : "上传",
"An error occurred while trying to update the tags" : "更新标签时出错",
"A new file or folder has been <strong>created</strong>" : "一个新的文件或文件夹已被<strong>创建</strong>",
"A file or folder has been <strong>changed</strong>" : "一个文件或文件夹已被<strong>修改</strong>",
@@ -99,15 +94,13 @@ OC.L10N.register(
"Changed by %2$s" : "被 %2$s 更改",
"Deleted by %2$s" : "被 %2$s 删除",
"Restored by %2$s" : "被 %2$s 恢复",
- "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ",
- "%s could not be renamed" : "%s 不能被重命名",
"Upload (max. %s)" : "上传 (最大 %s)",
"File handling" : "文件处理",
"Maximum upload size" : "最大上传大小",
"max. possible: " : "最大允许: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "对于 PHP-FPM 这个值保存后可能需要长达5分钟才会生效。",
"Save" : "保存",
- "Can not be edited from here due to insufficient permissions." : "由于权限不足无法在此编辑。",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。",
+ "Missing permissions to edit from here." : "没有从这里进行编辑的权限",
"Settings" : "设置",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\">通过 WebDAV 访问您的文件</a>",
@@ -121,6 +114,8 @@ OC.L10N.register(
"Files are being scanned, please wait." : "文件正在被扫描,请稍候。",
"Currently scanning" : "正在扫描",
"No favorites" : "无收藏",
- "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示"
+ "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
+ "Text file" : "文本文件",
+ "New text file.txt" : "创建文本文件 .txt"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 6eee0d3a765..b2883e5ea1d 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -2,13 +2,6 @@
"Storage not available" : "存储空间不可用",
"Storage invalid" : "存储空间无效",
"Unknown error" : "未知错误",
- "Could not move %s - File with this name already exists" : "无法移动 %s - 同名文件已存在",
- "Could not move %s" : "无法移动 %s",
- "Permission denied" : "拒绝访问",
- "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 中存在的名称。请使用其他名称。",
- "Error when creating the file" : "创建文件时出错",
- "Error when creating the folder" : "创建文件夹出错",
"Unable to set upload directory." : "无法设置上传文件夹。",
"Invalid Token" : "无效密匙",
"No file was uploaded. Unknown error" : "没有文件被上传。未知错误",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "缺少临时目录",
"Failed to write to disk" : "写入磁盘失败",
"Not enough storage available" : "没有足够的存储空间",
+ "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。",
"Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件",
"Upload failed. Could not get file info." : "上传失败。无法获取文件信息。",
"Invalid directory." : "无效文件夹。",
@@ -28,10 +22,10 @@
"Favorites" : "收藏",
"Home" : "家庭",
"Close" : "关闭",
+ "Upload cancelled." : "上传已取消",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
"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." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
"Actions" : "动作",
@@ -44,14 +38,17 @@
"Unable to determine date" : "无法确定日期",
"This operation is forbidden" : "操作被禁止",
"This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Error moving file." : "移动文件出错。",
- "Error moving file" : "移动文件错误",
- "Error" : "错误",
- "{new_name} already exists" : "{new_name} 已存在",
- "Could not rename file" : "不能重命名文件",
- "Could not create file" : "不能创建文件",
- "Could not create folder" : "不能创建文件夹",
- "Error deleting file." : "删除文件出错。",
+ "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。",
+ "Could not move \"{file}\"" : "不能移动 \"{file}\"",
+ "{newName} already exists" : "{newname} 已经存在",
+ "Could not rename \"{fileName}\", it does not exist any more" : "不能重命名 \"{fileName}\",此文件已经不存在",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。",
+ "Could not rename \"{fileName}\"" : "不能重命名 \"{fileName}\"",
+ "Could not create file \"{file}\"" : "不能创建文件 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "不能创建文件 \"{file}\" ,因为它已经存在",
+ "Could not create folder \"{dir}\"" : "不能创建文件夹 \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在",
+ "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
"No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”",
"Name" : "名称",
"Size" : "大小",
@@ -73,12 +70,10 @@
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
- "{newname} already exists" : "{newname} 已经存在",
- "Upload" : "上传",
- "Text file" : "文本文件",
- "New text file.txt" : "创建文本文件 .txt",
"Folder" : "文件夹",
"New folder" : "增加文件夹",
+ "{newname} already exists" : "{newname} 已经存在",
+ "Upload" : "上传",
"An error occurred while trying to update the tags" : "更新标签时出错",
"A new file or folder has been <strong>created</strong>" : "一个新的文件或文件夹已被<strong>创建</strong>",
"A file or folder has been <strong>changed</strong>" : "一个文件或文件夹已被<strong>修改</strong>",
@@ -97,15 +92,13 @@
"Changed by %2$s" : "被 %2$s 更改",
"Deleted by %2$s" : "被 %2$s 删除",
"Restored by %2$s" : "被 %2$s 恢复",
- "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ",
- "%s could not be renamed" : "%s 不能被重命名",
"Upload (max. %s)" : "上传 (最大 %s)",
"File handling" : "文件处理",
"Maximum upload size" : "最大上传大小",
"max. possible: " : "最大允许: ",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "对于 PHP-FPM 这个值保存后可能需要长达5分钟才会生效。",
"Save" : "保存",
- "Can not be edited from here due to insufficient permissions." : "由于权限不足无法在此编辑。",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。",
+ "Missing permissions to edit from here." : "没有从这里进行编辑的权限",
"Settings" : "设置",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\">通过 WebDAV 访问您的文件</a>",
@@ -119,6 +112,8 @@
"Files are being scanned, please wait." : "文件正在被扫描,请稍候。",
"Currently scanning" : "正在扫描",
"No favorites" : "无收藏",
- "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示"
+ "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
+ "Text file" : "文本文件",
+ "New text file.txt" : "创建文本文件 .txt"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js
index 421ae5dc92a..30b7e75a732 100644
--- a/apps/files/l10n/zh_HK.js
+++ b/apps/files/l10n/zh_HK.js
@@ -9,14 +9,13 @@ OC.L10N.register(
"Download" : "下載",
"Rename" : "重新命名",
"Delete" : "刪除",
- "Error" : "錯誤",
"Name" : "名稱",
"Size" : "大小",
"{dirs} and {files}" : "{dirs} 和 {files}",
"New" : "新增",
- "Upload" : "上戴",
"Folder" : "資料夾",
"New folder" : "新資料夾",
+ "Upload" : "上戴",
"A new file or folder has been <strong>created</strong>" : "新檔案或資料夾已被 <strong> 新增 </strong>",
"A file or folder has been <strong>changed</strong>" : "檔案或資料夾已被 <strong> 變成 </strong>",
"A file or folder has been <strong>deleted</strong>" : "新檔案或資料夾已被 <strong> 刪除 </strong>",
diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json
index 3d1af1593bd..213997044af 100644
--- a/apps/files/l10n/zh_HK.json
+++ b/apps/files/l10n/zh_HK.json
@@ -7,14 +7,13 @@
"Download" : "下載",
"Rename" : "重新命名",
"Delete" : "刪除",
- "Error" : "錯誤",
"Name" : "名稱",
"Size" : "大小",
"{dirs} and {files}" : "{dirs} 和 {files}",
"New" : "新增",
- "Upload" : "上戴",
"Folder" : "資料夾",
"New folder" : "新資料夾",
+ "Upload" : "上戴",
"A new file or folder has been <strong>created</strong>" : "新檔案或資料夾已被 <strong> 新增 </strong>",
"A file or folder has been <strong>changed</strong>" : "檔案或資料夾已被 <strong> 變成 </strong>",
"A file or folder has been <strong>deleted</strong>" : "新檔案或資料夾已被 <strong> 刪除 </strong>",
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index 432e167da83..09829db3bcc 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -4,13 +4,6 @@ OC.L10N.register(
"Storage not available" : "無法存取儲存空間",
"Storage invalid" : "無效的儲存空間",
"Unknown error" : "未知的錯誤",
- "Could not move %s - File with this name already exists" : "無法移動 %s ,同名的檔案已經存在",
- "Could not move %s" : "無法移動 %s",
- "Permission denied" : "存取被拒",
- "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 ,請換一個名字",
- "Error when creating the file" : "建立檔案失敗",
- "Error when creating the folder" : "建立資料夾失敗",
"Unable to set upload directory." : "無法設定上傳目錄",
"Invalid Token" : "無效的 token",
"No file was uploaded. Unknown error" : "沒有檔案被上傳,原因未知",
@@ -22,6 +15,7 @@ OC.L10N.register(
"Missing a temporary folder" : "找不到暫存資料夾",
"Failed to write to disk" : "寫入硬碟失敗",
"Not enough storage available" : "儲存空間不足",
+ "The target folder has been moved or deleted." : "目標資料夾已經被搬移或刪除",
"Upload failed. Could not find uploaded file" : "上傳失敗,找不到上傳的檔案",
"Upload failed. Could not get file info." : "上傳失敗,無法取得檔案資訊",
"Invalid directory." : "無效的資料夾",
@@ -46,14 +40,6 @@ OC.L10N.register(
"Unable to determine date" : "無法確定日期",
"This operation is forbidden" : "此動作被禁止",
"This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
- "Error moving file." : "移動檔案發生錯誤",
- "Error moving file" : "移動檔案失敗",
- "Error" : "錯誤",
- "{new_name} already exists" : "{new_name} 已經存在",
- "Could not rename file" : "無法重新命名",
- "Could not create file" : "無法建立檔案",
- "Could not create folder" : "無法建立資料夾",
- "Error deleting file." : "刪除檔案發生錯誤",
"No entries in this folder match '{filter}'" : "在此資料夾中沒有項目與 '{filter}' 相符",
"Name" : "名稱",
"Size" : "大小",
@@ -62,7 +48,7 @@ OC.L10N.register(
"_%n file_::_%n files_" : ["%n 個檔案"],
"{dirs} and {files}" : "{dirs} 和 {files}",
"You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案",
- "_Uploading %n file_::_Uploading %n files_" : ["%n 個檔案正在上傳"],
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
"New" : "新增",
"\"{name}\" is an invalid file name." : "{name} 是無效的檔名",
"File name cannot be empty." : "檔名不能為空",
@@ -75,8 +61,6 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n 位元組"],
"Favorited" : "已加入最愛",
"Favorite" : "我的最愛",
- "Text file" : "文字檔",
- "New text file.txt" : "新文字檔.txt",
"Folder" : "資料夾",
"New folder" : "新資料夾",
"{newname} already exists" : "{newname} 已經存在",
@@ -94,20 +78,16 @@ OC.L10N.register(
"%2$s changed %1$s" : "%2$s 已變更了 %1$s",
"You deleted %1$s" : "您刪除了 %1$s",
"%2$s deleted %1$s" : "%2$s 已刪除 %1$s",
- "You restored %1$s" : "您恢復了 %1$s",
- "%2$s restored %1$s" : "%2$s 已恢復了 %1$s",
+ "You restored %1$s" : "您還原了 %1$s",
+ "%2$s restored %1$s" : "%2$s 還原了 %1$s",
"Changed by %2$s" : "由 %2$s 改動",
"Deleted by %2$s" : "由 %2$s 刪除",
- "Restored by %2$s" : "由 %2$s 復原",
- "%s could not be renamed as it has been deleted" : "%s 已經被刪除了所以無法重新命名",
- "%s could not be renamed" : "無法重新命名 %s",
+ "Restored by %2$s" : "由 %2$s 還原",
"Upload (max. %s)" : "上傳(至多 %s)",
"File handling" : "檔案處理",
"Maximum upload size" : "上傳限制",
"max. possible: " : "最大允許:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "如果使用 PHP-FPM ,此設定值需要5分鐘左右才會生效",
"Save" : "儲存",
- "Can not be edited from here due to insufficient permissions." : "無法在這邊編輯,因為權限不足",
"Settings" : "設定",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個地址<a href=\"%s\" target=\"_blank\">來透過 WebDAV 存取檔案</a>",
@@ -117,10 +97,12 @@ OC.L10N.register(
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
"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." : "正在掃描檔案,請稍等。",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制",
+ "Files are being scanned, please wait." : "正在掃描檔案,請稍等",
"Currently scanning" : "正在掃描",
"No favorites" : "沒有最愛",
- "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡"
+ "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
+ "Text file" : "文字檔",
+ "New text file.txt" : "新文字檔.txt"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index b82dbfb1ffe..6f2c396ad18 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -2,13 +2,6 @@
"Storage not available" : "無法存取儲存空間",
"Storage invalid" : "無效的儲存空間",
"Unknown error" : "未知的錯誤",
- "Could not move %s - File with this name already exists" : "無法移動 %s ,同名的檔案已經存在",
- "Could not move %s" : "無法移動 %s",
- "Permission denied" : "存取被拒",
- "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 ,請換一個名字",
- "Error when creating the file" : "建立檔案失敗",
- "Error when creating the folder" : "建立資料夾失敗",
"Unable to set upload directory." : "無法設定上傳目錄",
"Invalid Token" : "無效的 token",
"No file was uploaded. Unknown error" : "沒有檔案被上傳,原因未知",
@@ -20,6 +13,7 @@
"Missing a temporary folder" : "找不到暫存資料夾",
"Failed to write to disk" : "寫入硬碟失敗",
"Not enough storage available" : "儲存空間不足",
+ "The target folder has been moved or deleted." : "目標資料夾已經被搬移或刪除",
"Upload failed. Could not find uploaded file" : "上傳失敗,找不到上傳的檔案",
"Upload failed. Could not get file info." : "上傳失敗,無法取得檔案資訊",
"Invalid directory." : "無效的資料夾",
@@ -44,14 +38,6 @@
"Unable to determine date" : "無法確定日期",
"This operation is forbidden" : "此動作被禁止",
"This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
- "Error moving file." : "移動檔案發生錯誤",
- "Error moving file" : "移動檔案失敗",
- "Error" : "錯誤",
- "{new_name} already exists" : "{new_name} 已經存在",
- "Could not rename file" : "無法重新命名",
- "Could not create file" : "無法建立檔案",
- "Could not create folder" : "無法建立資料夾",
- "Error deleting file." : "刪除檔案發生錯誤",
"No entries in this folder match '{filter}'" : "在此資料夾中沒有項目與 '{filter}' 相符",
"Name" : "名稱",
"Size" : "大小",
@@ -60,7 +46,7 @@
"_%n file_::_%n files_" : ["%n 個檔案"],
"{dirs} and {files}" : "{dirs} 和 {files}",
"You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案",
- "_Uploading %n file_::_Uploading %n files_" : ["%n 個檔案正在上傳"],
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
"New" : "新增",
"\"{name}\" is an invalid file name." : "{name} 是無效的檔名",
"File name cannot be empty." : "檔名不能為空",
@@ -73,8 +59,6 @@
"_%n byte_::_%n bytes_" : ["%n 位元組"],
"Favorited" : "已加入最愛",
"Favorite" : "我的最愛",
- "Text file" : "文字檔",
- "New text file.txt" : "新文字檔.txt",
"Folder" : "資料夾",
"New folder" : "新資料夾",
"{newname} already exists" : "{newname} 已經存在",
@@ -92,20 +76,16 @@
"%2$s changed %1$s" : "%2$s 已變更了 %1$s",
"You deleted %1$s" : "您刪除了 %1$s",
"%2$s deleted %1$s" : "%2$s 已刪除 %1$s",
- "You restored %1$s" : "您恢復了 %1$s",
- "%2$s restored %1$s" : "%2$s 已恢復了 %1$s",
+ "You restored %1$s" : "您還原了 %1$s",
+ "%2$s restored %1$s" : "%2$s 還原了 %1$s",
"Changed by %2$s" : "由 %2$s 改動",
"Deleted by %2$s" : "由 %2$s 刪除",
- "Restored by %2$s" : "由 %2$s 復原",
- "%s could not be renamed as it has been deleted" : "%s 已經被刪除了所以無法重新命名",
- "%s could not be renamed" : "無法重新命名 %s",
+ "Restored by %2$s" : "由 %2$s 還原",
"Upload (max. %s)" : "上傳(至多 %s)",
"File handling" : "檔案處理",
"Maximum upload size" : "上傳限制",
"max. possible: " : "最大允許:",
- "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "如果使用 PHP-FPM ,此設定值需要5分鐘左右才會生效",
"Save" : "儲存",
- "Can not be edited from here due to insufficient permissions." : "無法在這邊編輯,因為權限不足",
"Settings" : "設定",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個地址<a href=\"%s\" target=\"_blank\">來透過 WebDAV 存取檔案</a>",
@@ -115,10 +95,12 @@
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
"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." : "正在掃描檔案,請稍等。",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制",
+ "Files are being scanned, please wait." : "正在掃描檔案,請稍等",
"Currently scanning" : "正在掃描",
"No favorites" : "沒有最愛",
- "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡"
+ "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
+ "Text file" : "文字檔",
+ "New text file.txt" : "新文字檔.txt"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/lib/activity.php b/apps/files/lib/activity.php
index f3bbff48640..a941572ed15 100644
--- a/apps/files/lib/activity.php
+++ b/apps/files/lib/activity.php
@@ -22,7 +22,8 @@
namespace OCA\Files;
-use OC\L10N\Factory;
+use OCP\IDBConnection;
+use OCP\L10N\IFactory;
use OCP\Activity\IExtension;
use OCP\Activity\IManager;
use OCP\IConfig;
@@ -43,7 +44,7 @@ class Activity implements IExtension {
/** @var IL10N */
protected $l;
- /** @var Factory */
+ /** @var IFactory */
protected $languageFactory;
/** @var IURLGenerator */
@@ -52,6 +53,9 @@ class Activity implements IExtension {
/** @var \OCP\Activity\IManager */
protected $activityManager;
+ /** @var \OCP\IDBConnection */
+ protected $connection;
+
/** @var \OCP\IConfig */
protected $config;
@@ -59,18 +63,20 @@ class Activity implements IExtension {
protected $helper;
/**
- * @param Factory $languageFactory
+ * @param IFactory $languageFactory
* @param IURLGenerator $URLGenerator
* @param IManager $activityManager
* @param ActivityHelper $helper
+ * @param IDBConnection $connection
* @param IConfig $config
*/
- public function __construct(Factory $languageFactory, IURLGenerator $URLGenerator, IManager $activityManager, ActivityHelper $helper, IConfig $config) {
+ public function __construct(IFactory $languageFactory, IURLGenerator $URLGenerator, IManager $activityManager, ActivityHelper $helper, IDBConnection $connection, IConfig $config) {
$this->languageFactory = $languageFactory;
$this->URLGenerator = $URLGenerator;
$this->l = $this->getL10N();
$this->activityManager = $activityManager;
$this->helper = $helper;
+ $this->connection = $connection;
$this->config = $config;
}
@@ -160,7 +166,7 @@ class Activity implements IExtension {
* @param string $text
* @param IL10N $l
* @param array $params
- * @return bool|string
+ * @return string|false
*/
protected function translateLong($text, IL10N $l, array $params) {
switch ($text) {
@@ -192,7 +198,7 @@ class Activity implements IExtension {
* @param string $text
* @param IL10N $l
* @param array $params
- * @return bool|string
+ * @return string|false
*/
protected function translateShort($text, IL10N $l, array $params) {
switch ($text) {
@@ -379,6 +385,7 @@ class Activity implements IExtension {
*/
$parameters = $fileQueryList = [];
$parameters[] = self::APP_FILES;
+ $parameters[] = self::APP_FILES;
$fileQueryList[] = '(`type` <> ? AND `type` <> ?)';
$parameters[] = self::TYPE_SHARE_CREATED;
@@ -390,13 +397,15 @@ class Activity implements IExtension {
}
foreach ($favorites['folders'] as $favorite) {
$fileQueryList[] = '`file` LIKE ?';
- $parameters[] = $favorite . '/%';
+ $parameters[] = $this->connection->escapeLikeParameter($favorite) . '/%';
}
- $parameters[] = self::APP_FILES;
-
return [
- ' CASE WHEN `app` = ? THEN (' . implode(' OR ', $fileQueryList) . ') ELSE `app` <> ? END ',
+ ' CASE '
+ . 'WHEN `app` <> ? THEN 1 '
+ . 'WHEN `app` = ? AND (' . implode(' OR ', $fileQueryList) . ') THEN 1 '
+ . 'ELSE 0 '
+ . 'END = 1 ',
$parameters,
];
}
diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php
index 5bd8c127586..18813e224de 100644
--- a/apps/files/lib/app.php
+++ b/apps/files/lib/app.php
@@ -29,107 +29,21 @@ namespace OCA\Files;
class App {
/**
- * @var \OC_L10N
- */
- private $l10n;
-
- /**
* @var \OCP\INavigationManager
*/
private static $navigationManager;
/**
- * @var \OC\Files\View
- */
- private $view;
-
- public function __construct($view, $l10n) {
- $this->view = $view;
- $this->l10n = $l10n;
- }
-
- /**
* Returns the app's navigation manager
*
* @return \OCP\INavigationManager
*/
public static function getNavigationManager() {
+ // TODO: move this into a service in the Application class
if (self::$navigationManager === null) {
self::$navigationManager = new \OC\NavigationManager();
}
return self::$navigationManager;
}
- /**
- * rename a file
- *
- * @param string $dir
- * @param string $oldname
- * @param string $newname
- * @return array
- */
- public function rename($dir, $oldname, $newname) {
- $result = array(
- 'success' => false,
- 'data' => NULL
- );
-
- try {
- // check if the new name is conform to file name restrictions
- $this->view->verifyPath($dir, $newname);
- } catch (\OCP\Files\InvalidPathException $ex) {
- $result['data'] = array(
- 'message' => $this->l10n->t($ex->getMessage()),
- 'code' => 'invalidname',
- );
- return $result;
- }
-
- $normalizedOldPath = \OC\Files\Filesystem::normalizePath($dir . '/' . $oldname);
- $normalizedNewPath = \OC\Files\Filesystem::normalizePath($dir . '/' . $newname);
-
- // rename to non-existing folder is denied
- if (!$this->view->file_exists($normalizedOldPath)) {
- $result['data'] = array(
- 'message' => $this->l10n->t('%s could not be renamed as it has been deleted', array($oldname)),
- 'code' => 'sourcenotfound',
- 'oldname' => $oldname,
- 'newname' => $newname,
- );
- }else if (!$this->view->file_exists($dir)) {
- $result['data'] = array('message' => (string)$this->l10n->t(
- 'The target folder has been moved or deleted.',
- array($dir)),
- 'code' => 'targetnotfound'
- );
- // rename to existing file is denied
- } else if ($this->view->file_exists($normalizedNewPath)) {
-
- $result['data'] = array(
- 'message' => $this->l10n->t(
- "The name %s is already used in the folder %s. Please choose a different name.",
- array($newname, $dir))
- );
- } else if (
- // rename to "." is denied
- $newname !== '.' and
- // THEN try to rename
- $this->view->rename($normalizedOldPath, $normalizedNewPath)
- ) {
- // successful rename
- $meta = $this->view->getFileInfo($normalizedNewPath);
- $meta = \OCA\Files\Helper::populateTags(array($meta));
- $fileInfo = \OCA\Files\Helper::formatFileInfo(current($meta));
- $fileInfo['path'] = dirname($normalizedNewPath);
- $result['success'] = true;
- $result['data'] = $fileInfo;
- } else {
- // rename failed
- $result['data'] = array(
- 'message' => $this->l10n->t('%s could not be renamed', array($oldname))
- );
- }
- return $result;
- }
-
}
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index fb14cea731f..9a4e8d59786 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -139,9 +139,6 @@ class Helper {
$entry['parentId'] = $i['parent'];
$entry['mtime'] = $i['mtime'] * 1000;
// only pick out the needed attributes
- if (\OC::$server->getPreviewManager()->isAvailable($i)) {
- $entry['isPreviewAvailable'] = true;
- }
$entry['name'] = $i->getName();
$entry['permissions'] = $i['permissions'];
$entry['mimetype'] = $i['mimetype'];
diff --git a/apps/files/service/tagservice.php b/apps/files/service/tagservice.php
index 1999d97e1af..cf3f2bb7865 100644
--- a/apps/files/service/tagservice.php
+++ b/apps/files/service/tagservice.php
@@ -91,7 +91,7 @@ class TagService {
/**
* Get all files for the given tag
*
- * @param array $tagName tag name to filter by
+ * @param string $tagName tag name to filter by
* @return FileInfo[] list of matching files
* @throws \Exception if the tag does not exist
*/
diff --git a/apps/files/templates/admin.php b/apps/files/templates/admin.php
index 822fc779bd3..e5a6ecfc96e 100644
--- a/apps/files/templates/admin.php
+++ b/apps/files/templates/admin.php
@@ -7,14 +7,12 @@
<?php if($_['displayMaxPossibleUploadSize']):?>
(<?php p($l->t('max. possible: ')); p($_['maxPossibleUploadSize']) ?>)
<?php endif;?>
- <br/>
<input type="hidden" value="<?php p($_['requesttoken']); ?>" name="requesttoken" />
<?php if($_['uploadChangable']): ?>
- <?php p($l->t('With PHP-FPM this value may take up to 5 minutes to take effect after saving.')); ?>
- <br/>
<input type="submit" name="submitFilesAdminSettings" id="submitFilesAdminSettings"
value="<?php p($l->t( 'Save' )); ?>"/>
+ <p><em><?php p($l->t('With PHP-FPM it might take 5 minutes for changes to be applied.')); ?></em></p>
<?php else: ?>
- <?php p($l->t('Can not be edited from here due to insufficient permissions.')); ?>
+ <p><em><?php p($l->t('Missing permissions to edit from here.')); ?></em></p>
<?php endif; ?>
</form>
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index 512300e3a58..d05a02ee7db 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -16,9 +16,7 @@
</button>
</div>
<div id="app-settings-content">
- <h2>
- <label for="webdavurl"><?php p($l->t('WebDAV'));?></label>
- </h2>
+ <label for="webdavurl"><?php p($l->t('WebDAV'));?></label>
<input id="webdavurl" type="text" readonly="readonly" value="<?php p(\OCP\Util::linkToRemote('webdav')); ?>" />
<em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em>
</div>
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index 7ebf80ee8b2..04550f945b6 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -1,16 +1,5 @@
<div id="controls">
<div class="actions creatable hidden">
- <?php /*
- Only show upload button for public page
- */ ?>
- <?php if(isset($_['dirToken'])):?>
- <div id="upload" class="button upload"
- title="<?php isset($_['uploadMaxHumanFilesize']) ? p($l->t('Upload (max. %s)', array($_['uploadMaxHumanFilesize']))) : '' ?>">
- <label for="file_upload_start" class="svg icon-upload">
- <span class="hidden-visually"><?php p($l->t('Upload'))?></span>
- </label>
- </div>
- <?php endif; ?>
<div id="uploadprogresswrapper">
<div id="uploadprogressbar"></div>
<button class="stop icon-close" style="display:none">
diff --git a/apps/files/tests/activitytest.php b/apps/files/tests/activitytest.php
index cdb1d21bcd8..59c020c9042 100644
--- a/apps/files/tests/activitytest.php
+++ b/apps/files/tests/activitytest.php
@@ -25,24 +25,30 @@ namespace OCA\Files\Tests;
use OCA\Files\Activity;
use Test\TestCase;
+/**
+ * Class ActivityTest
+ *
+ * @group DB
+ * @package OCA\Files\Tests
+ */
class ActivityTest extends TestCase {
/** @var \OC\ActivityManager */
private $activityManager;
- /** @var \PHPUnit_Framework_MockObject_MockObject */
+ /** @var \OCP\IRequest|\PHPUnit_Framework_MockObject_MockObject */
protected $request;
- /** @var \PHPUnit_Framework_MockObject_MockObject */
+ /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */
protected $session;
- /** @var \PHPUnit_Framework_MockObject_MockObject */
+ /** @var \OCP\IConfig|\PHPUnit_Framework_MockObject_MockObject */
protected $config;
- /** @var \PHPUnit_Framework_MockObject_MockObject */
+ /** @var \OCA\Files\ActivityHelper|\PHPUnit_Framework_MockObject_MockObject */
protected $activityHelper;
- /** @var \PHPUnit_Framework_MockObject_MockObject */
+ /** @var \OCP\L10N\IFactory|\PHPUnit_Framework_MockObject_MockObject */
protected $l10nFactory;
/** @var \OCA\Files\Activity */
@@ -70,7 +76,7 @@ class ActivityTest extends TestCase {
$this->config
);
- $this->l10nFactory = $this->getMockBuilder('OC\L10N\Factory')
+ $this->l10nFactory = $this->getMockBuilder('OCP\L10N\IFactory')
->disableOriginalConstructor()
->getMock();
$deL10n = $this->getMockBuilder('OC_L10N')
@@ -95,6 +101,7 @@ class ActivityTest extends TestCase {
$this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(),
$this->activityManager,
$this->activityHelper,
+ \OC::$server->getDatabaseConnection(),
$this->config
);
@@ -290,16 +297,16 @@ class ActivityTest extends TestCase {
'items' => [],
'folders' => [],
],
- ' CASE WHEN `app` = ? THEN ((`type` <> ? AND `type` <> ?)) ELSE `app` <> ? END ',
- ['files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'files']
+ ' CASE WHEN `app` <> ? THEN 1 WHEN `app` = ? AND ((`type` <> ? AND `type` <> ?)) THEN 1 ELSE 0 END = 1 ',
+ ['files', 'files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED]
],
[
[
'items' => ['file.txt', 'folder'],
'folders' => ['folder'],
],
- ' CASE WHEN `app` = ? THEN ((`type` <> ? AND `type` <> ?) OR `file` = ? OR `file` = ? OR `file` LIKE ?) ELSE `app` <> ? END ',
- ['files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'file.txt', 'folder', 'folder/%', 'files']
+ ' CASE WHEN `app` <> ? THEN 1 WHEN `app` = ? AND ((`type` <> ? AND `type` <> ?) OR `file` = ? OR `file` = ? OR `file` LIKE ?) THEN 1 ELSE 0 END = 1 ',
+ ['files', 'files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'file.txt', 'folder', 'folder/%']
],
];
}
@@ -333,6 +340,21 @@ class ActivityTest extends TestCase {
$result = $this->activityExtension->getQueryForFilter('all');
$this->assertEquals([$query, $parameters], $result);
+
+ $this->executeQueryForFilter($result);
+ }
+
+ public function executeQueryForFilter(array $result) {
+ list($resultQuery, $resultParameters) = $result;
+ $resultQuery = str_replace('`file`', '`user`', $resultQuery);
+ $resultQuery = str_replace('`type`', '`key`', $resultQuery);
+
+ $connection = \OC::$server->getDatabaseConnection();
+ // Test the query on the privatedata table, because the activity table
+ // does not exist in core
+ $result = $connection->executeQuery('SELECT * FROM `*PREFIX*privatedata` WHERE ' . $resultQuery, $resultParameters);
+ $rows = $result->fetchAll();
+ $result->closeCursor();
}
protected function mockUserSession($user) {
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php
deleted file mode 100644
index 859c7042b89..00000000000
--- a/apps/files/tests/ajax_rename.php
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-class Test_OC_Files_App_Rename extends \Test\TestCase {
- private static $user;
-
- /**
- * @var PHPUnit_Framework_MockObject_MockObject
- */
- private $viewMock;
-
- /**
- * @var \OCA\Files\App
- */
- private $files;
-
- protected function setUp() {
- parent::setUp();
-
- // mock OC_L10n
- if (!self::$user) {
- self::$user = uniqid();
- }
- \OC_User::createUser(self::$user, 'password');
- $this->loginAsUser(self::$user);
-
- $l10nMock = $this->getMock('\OC_L10N', array('t'), array(), '', false);
- $l10nMock->expects($this->any())
- ->method('t')
- ->will($this->returnArgument(0));
- $viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath', 'getFileInfo', 'file_exists'), array(), '', false);
- $viewMock->expects($this->any())
- ->method('normalizePath')
- ->will($this->returnArgument(0));
- $viewMock->expects($this->any())
- ->method('rename')
- ->will($this->returnValue(true));
- $this->viewMock = $viewMock;
- $this->files = new \OCA\Files\App($viewMock, $l10nMock);
- }
-
- protected function tearDown() {
- $result = \OC_User::deleteUser(self::$user);
- $this->assertTrue($result);
-
- $this->logout();
- parent::tearDown();
- }
-
- /**
- * test rename of file/folder
- */
- function testRenameFolder() {
- $dir = '/';
- $oldname = 'oldname';
- $newname = 'newname';
-
- $this->viewMock->expects($this->any())
- ->method('file_exists')
- ->with($this->anything())
- ->will($this->returnValueMap(array(
- array('/', true),
- array('/oldname', true)
- )));
-
-
- $this->viewMock->expects($this->any())
- ->method('getFileInfo')
- ->will($this->returnValue(new \OC\Files\FileInfo(
- '/new_name',
- new \OC\Files\Storage\Local(array('datadir' => '/')),
- '/',
- array(
- 'fileid' => 123,
- 'type' => 'dir',
- 'mimetype' => 'httpd/unix-directory',
- 'mtime' => 0,
- 'permissions' => 31,
- 'size' => 18,
- 'etag' => 'abcdef',
- 'directory' => '/',
- 'name' => 'new_name',
- ), null)));
-
- $result = $this->files->rename($dir, $oldname, $newname);
-
- $this->assertTrue($result['success']);
- $this->assertEquals(123, $result['data']['id']);
- $this->assertEquals('new_name', $result['data']['name']);
- $this->assertEquals(18, $result['data']['size']);
- $this->assertEquals('httpd/unix-directory', $result['data']['mimetype']);
- $this->assertEquals('abcdef', $result['data']['etag']);
- $this->assertFalse(isset($result['data']['tags']));
- $this->assertEquals('/', $result['data']['path']);
- }
-
- /**
- * test rename of file with tag
- */
- function testRenameFileWithTag() {
- $taggerMock = $this->getMock('\OCP\ITags');
- $taggerMock->expects($this->any())
- ->method('getTagsForObjects')
- ->with(array(123))
- ->will($this->returnValue(array(123 => array('tag1', 'tag2'))));
- $tagManagerMock = $this->getMock('\OCP\ITagManager');
- $tagManagerMock->expects($this->any())
- ->method('load')
- ->with('files')
- ->will($this->returnValue($taggerMock));
- $oldTagManager = \OC::$server->query('TagManager');
- \OC::$server->registerService('TagManager', function ($c) use ($tagManagerMock) {
- return $tagManagerMock;
- });
-
- $dir = '/';
- $oldname = 'oldname.txt';
- $newname = 'newname.txt';
-
- $this->viewMock->expects($this->any())
- ->method('file_exists')
- ->with($this->anything())
- ->will($this->returnValueMap(array(
- array('/', true),
- array('/oldname.txt', true)
- )));
-
-
- $this->viewMock->expects($this->any())
- ->method('getFileInfo')
- ->will($this->returnValue(new \OC\Files\FileInfo(
- '/new_name.txt',
- new \OC\Files\Storage\Local(array('datadir' => '/')),
- '/',
- array(
- 'fileid' => 123,
- 'type' => 'file',
- 'mimetype' => 'text/plain',
- 'mtime' => 0,
- 'permissions' => 31,
- 'size' => 18,
- 'etag' => 'abcdef',
- 'directory' => '/',
- 'name' => 'new_name.txt',
- ), null)));
-
- $result = $this->files->rename($dir, $oldname, $newname);
-
- $this->assertTrue($result['success']);
- $this->assertEquals(123, $result['data']['id']);
- $this->assertEquals('new_name.txt', $result['data']['name']);
- $this->assertEquals(18, $result['data']['size']);
- $this->assertEquals('text/plain', $result['data']['mimetype']);
- $this->assertEquals('abcdef', $result['data']['etag']);
- $this->assertEquals(array('tag1', 'tag2'), $result['data']['tags']);
- $this->assertEquals('/', $result['data']['path']);
-
- \OC::$server->registerService('TagManager', function ($c) use ($oldTagManager) {
- return $oldTagManager;
- });
- }
-
- /**
- * Test rename inside a folder that doesn't exist any more
- */
- function testRenameInNonExistingFolder() {
- $dir = '/unexist';
- $oldname = 'oldname';
- $newname = 'newname';
-
- $this->viewMock->expects($this->at(0))
- ->method('file_exists')
- ->with('/unexist/oldname')
- ->will($this->returnValue(false));
-
- $this->viewMock->expects($this->any())
- ->method('getFileInfo')
- ->will($this->returnValue(array(
- 'fileid' => 123,
- 'type' => 'dir',
- 'mimetype' => 'httpd/unix-directory',
- 'size' => 18,
- 'etag' => 'abcdef',
- 'directory' => '/unexist',
- 'name' => 'new_name',
- )));
-
- $result = $this->files->rename($dir, $oldname, $newname);
-
- $this->assertFalse($result['success']);
- $this->assertEquals('sourcenotfound', $result['data']['code']);
- }
-
- /**
- * Test move to invalid name
- */
- function testRenameToInvalidName() {
- $dir = '/';
- $oldname = 'oldname';
- $newname = 'abc\\';
-
- $result = $this->files->rename($dir, $oldname, $newname);
-
- $this->assertFalse($result['success']);
- $this->assertEquals('File name contains at least one invalid character', $result['data']['message']);
- $this->assertEquals('invalidname', $result['data']['code']);
- }
-}
diff --git a/apps/files/tests/command/deleteorphanedfilestest.php b/apps/files/tests/command/deleteorphanedfilestest.php
index a667dba99fc..18f568036e4 100644
--- a/apps/files/tests/command/deleteorphanedfilestest.php
+++ b/apps/files/tests/command/deleteorphanedfilestest.php
@@ -25,6 +25,13 @@ namespace OCA\Files\Tests\Command;
use OCA\Files\Command\DeleteOrphanedFiles;
use OCP\Files\StorageNotAvailableException;
+/**
+ * Class DeleteOrphanedFilesTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files\Tests\Command
+ */
class DeleteOrphanedFilesTest extends \Test\TestCase {
/**
diff --git a/apps/files/tests/controller/ViewControllerTest.php b/apps/files/tests/controller/ViewControllerTest.php
new file mode 100644
index 00000000000..0e8ab5e752d
--- /dev/null
+++ b/apps/files/tests/controller/ViewControllerTest.php
@@ -0,0 +1,253 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files\Tests\Controller;
+
+use OCA\Files\Controller\ViewController;
+use OCP\AppFramework\Http;
+use OCP\Template;
+use Test\TestCase;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use OCP\AppFramework\Http\RedirectResponse;
+use OCP\INavigationManager;
+use OCP\IL10N;
+use OCP\IConfig;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Class ViewControllerTest
+ *
+ * @package OCA\Files\Tests\Controller
+ */
+class ViewControllerTest extends TestCase {
+ /** @var IRequest */
+ private $request;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+ /** @var INavigationManager */
+ private $navigationManager;
+ /** @var IL10N */
+ private $l10n;
+ /** @var IConfig */
+ private $config;
+ /** @var EventDispatcherInterface */
+ private $eventDispatcher;
+ /** @var ViewController */
+ private $viewController;
+
+ public function setUp() {
+ parent::setUp();
+ $this->request = $this->getMock('\OCP\IRequest');
+ $this->urlGenerator = $this->getMock('\OCP\IURLGenerator');
+ $this->navigationManager = $this->getMock('\OCP\INavigationManager');
+ $this->l10n = $this->getMock('\OCP\IL10N');
+ $this->config = $this->getMock('\OCP\IConfig');
+ $this->eventDispatcher = $this->getMock('\Symfony\Component\EventDispatcher\EventDispatcherInterface');
+ $this->viewController = $this->getMockBuilder('\OCA\Files\Controller\ViewController')
+ ->setConstructorArgs([
+ 'files',
+ $this->request,
+ $this->urlGenerator,
+ $this->navigationManager,
+ $this->l10n,
+ $this->config,
+ $this->eventDispatcher
+ ])
+ ->setMethods([
+ 'getStorageInfo',
+ 'renderScript'
+ ])
+ ->getMock();
+ }
+
+ public function testIndexWithIE8RedirectAndDirDefined() {
+ $this->request
+ ->expects($this->once())
+ ->method('isUserAgent')
+ ->with(['/MSIE 8.0/'])
+ ->will($this->returnValue(true));
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRoute')
+ ->with('files.view.index')
+ ->will($this->returnValue('/apps/files/'));
+
+ $expected = new Http\RedirectResponse('/apps/files/#?dir=MyDir');
+ $this->assertEquals($expected, $this->viewController->index('MyDir'));
+ }
+
+ public function testIndexWithIE8RedirectAndViewDefined() {
+ $this->request
+ ->expects($this->once())
+ ->method('isUserAgent')
+ ->with(['/MSIE 8.0/'])
+ ->will($this->returnValue(true));
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRoute')
+ ->with('files.view.index')
+ ->will($this->returnValue('/apps/files/'));
+
+ $expected = new Http\RedirectResponse('/apps/files/#?dir=/&view=MyView');
+ $this->assertEquals($expected, $this->viewController->index('', 'MyView'));
+ }
+
+ public function testIndexWithIE8RedirectAndViewAndDirDefined() {
+ $this->request
+ ->expects($this->once())
+ ->method('isUserAgent')
+ ->with(['/MSIE 8.0/'])
+ ->will($this->returnValue(true));
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRoute')
+ ->with('files.view.index')
+ ->will($this->returnValue('/apps/files/'));
+
+ $expected = new RedirectResponse('/apps/files/#?dir=MyDir&view=MyView');
+ $this->assertEquals($expected, $this->viewController->index('MyDir', 'MyView'));
+ }
+
+ public function testIndexWithRegularBrowser() {
+ $this->request
+ ->expects($this->once())
+ ->method('isUserAgent')
+ ->with(['/MSIE 8.0/'])
+ ->will($this->returnValue(false));
+ $this->viewController
+ ->expects($this->once())
+ ->method('getStorageInfo')
+ ->will($this->returnValue([
+ 'relative' => 123,
+ 'owner' => 'MyName',
+ 'ownerDisplayName' => 'MyDisplayName',
+ ]));
+
+ $this->config
+ ->expects($this->any())
+ ->method('getAppValue')
+ ->will($this->returnArgument(2));
+
+ $nav = new Template('files', 'appnavigation');
+ $nav->assign('navigationItems', [
+ 0 => [
+ 'id' => 'files',
+ 'appname' => 'files',
+ 'script' => 'list.php',
+ 'order' => 0,
+ 'name' => new \OC_L10N_String(new \OC_L10N('files'), 'All files', []),
+ 'active' => false,
+ 'icon' => '',
+ ],
+ 1 => [
+ 'id' => 'favorites',
+ 'appname' => 'files',
+ 'script' => 'simplelist.php',
+ 'order' => 5,
+ 'name' => null,
+ 'active' => false,
+ 'icon' => '',
+ ],
+ 2 => [
+ 'id' => 'sharingin',
+ 'appname' => 'files_sharing',
+ 'script' => 'list.php',
+ 'order' => 10,
+ 'name' => new \OC_L10N_String(new \OC_L10N('files_sharing'), 'Shared with you', []),
+ 'active' => false,
+ 'icon' => '',
+ ],
+ 3 => [
+ 'id' => 'sharingout',
+ 'appname' => 'files_sharing',
+ 'script' => 'list.php',
+ 'order' => 15,
+ 'name' => new \OC_L10N_String(new \OC_L10N('files_sharing'), 'Shared with others', []),
+ 'active' => false,
+ 'icon' => '',
+ ],
+ 4 => [
+ 'id' => 'sharinglinks',
+ 'appname' => 'files_sharing',
+ 'script' => 'list.php',
+ 'order' => 20,
+ 'name' => new \OC_L10N_String(new \OC_L10N('files_sharing'), 'Shared by link', []),
+ 'active' => false,
+ 'icon' => '',
+ ],
+ 5 => [
+ 'id' => 'trashbin',
+ 'appname' => 'files_trashbin',
+ 'script' => 'list.php',
+ 'order' => 50,
+ 'name' => new \OC_L10N_String(new \OC_L10N('files_trashbin'), 'Deleted files', []),
+ 'active' => false,
+ 'icon' => '',
+ ],
+ ]);
+
+ $expected = new Http\TemplateResponse(
+ 'files',
+ 'index',
+ [
+ 'usedSpacePercent' => 123,
+ 'owner' => 'MyName',
+ 'ownerDisplayName' => 'MyDisplayName',
+ 'isPublic' => false,
+ 'mailNotificationEnabled' => 'no',
+ 'mailPublicNotificationEnabled' => 'no',
+ 'allowShareWithLink' => 'yes',
+ 'appNavigation' => $nav,
+ 'appContents' => [
+ 0 => [
+ 'id' => 'files',
+ 'content' => null,
+ ],
+ 1 => [
+ 'id' => 'favorites',
+ 'content' => null,
+ ],
+ 2 => [
+ 'id' => 'sharingin',
+ 'content' => null,
+ ],
+ 3 => [
+ 'id' => 'sharingout',
+ 'content' => null,
+ ],
+ 4 => [
+ 'id' => 'sharinglinks',
+ 'content' => null,
+ ],
+ 5 => [
+ 'id' => 'trashbin',
+ 'content' => null,
+ ],
+ ],
+ ]
+ );
+ $policy = new Http\ContentSecurityPolicy();
+ $policy->addAllowedFrameDomain('\'self\'');
+ $expected->setContentSecurityPolicy($policy);
+ $this->assertEquals($expected, $this->viewController->index('MyDir', 'MyView'));
+ }
+}
diff --git a/apps/files/tests/js/favoritesfilelistspec.js b/apps/files/tests/js/favoritesfilelistspec.js
index 608ddaca18b..1c833d334e2 100644
--- a/apps/files/tests/js/favoritesfilelistspec.js
+++ b/apps/files/tests/js/favoritesfilelistspec.js
@@ -100,8 +100,7 @@ describe('OCA.Files.FavoritesFileList tests', function() {
expect($tr.attr('data-mtime')).toEqual('11111000');
expect($tr.find('a.name').attr('href')).toEqual(
OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Fsomedir&files=test.txt'
+ '/remote.php/webdav/somedir/test.txt'
);
expect($tr.find('.nametext').text().trim()).toEqual('test.txt');
});
diff --git a/apps/files/tests/js/fileUploadSpec.js b/apps/files/tests/js/fileUploadSpec.js
index a49a5d4e2e0..8a0d6b01952 100644
--- a/apps/files/tests/js/fileUploadSpec.js
+++ b/apps/files/tests/js/fileUploadSpec.js
@@ -19,6 +19,8 @@
*
*/
+/* global FileList */
+
describe('OC.Upload tests', function() {
var $dummyUploader;
var testFile;
diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js
index d29164c5136..a905a4d969d 100644
--- a/apps/files/tests/js/fileactionsSpec.js
+++ b/apps/files/tests/js/fileactionsSpec.js
@@ -584,7 +584,7 @@ describe('OCA.Files.FileActions tests', function() {
expect(busyStub.calledWith('testName.txt', true)).toEqual(true);
expect(handleDownloadStub.calledOnce).toEqual(true);
expect(handleDownloadStub.getCall(0).args[0]).toEqual(
- OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=testName.txt'
+ OC.webroot + '/remote.php/webdav/subdir/testName.txt'
);
busyStub.reset();
handleDownloadStub.yield();
diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js
index dee542458b6..747a746a602 100644
--- a/apps/files/tests/js/fileactionsmenuSpec.js
+++ b/apps/files/tests/js/fileactionsmenuSpec.js
@@ -237,8 +237,8 @@ describe('OCA.Files.FileActionsMenu tests', function() {
expect(redirectStub.calledOnce).toEqual(true);
expect(redirectStub.getCall(0).args[0]).toContain(
OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Fsubdir&files=testName.txt');
+ '/remote.php/webdav/subdir/testName.txt'
+ );
redirectStub.restore();
});
it('takes the file\'s path into account when clicking download', function() {
@@ -269,8 +269,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
expect(redirectStub.calledOnce).toEqual(true);
expect(redirectStub.getCall(0).args[0]).toContain(
- OC.webroot + '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Fanotherpath%2Fthere&files=testName.txt'
+ OC.webroot + '/remote.php/webdav/anotherpath/there/testName.txt'
);
redirectStub.restore();
});
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 05e6fcc6122..9f7ad50bc60 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -20,8 +20,11 @@
*/
describe('OCA.Files.FileList tests', function() {
- var testFiles, alertStub, notificationStub, fileList, pageSizeStub;
+ var FileInfo = OC.Files.FileInfo;
+ var testFiles, testRoot, notificationStub, fileList, pageSizeStub;
var bcResizeStub;
+ var filesClient;
+ var redirectStub;
/**
* Generate test file data
@@ -38,21 +41,29 @@ describe('OCA.Files.FileList tests', function() {
name += '0';
}
name += i + '.txt';
- files.push({
+ files.push(new FileInfo({
id: i,
type: 'file',
name: name,
mimetype: 'text/plain',
size: i * 2,
etag: 'abc'
- });
+ }));
}
return files;
}
beforeEach(function() {
- alertStub = sinon.stub(OC.dialogs, 'alert');
- notificationStub = sinon.stub(OC.Notification, 'show');
+ filesClient = new OC.Files.Client({
+ host: 'localhost',
+ port: 80,
+ // FIXME: uncomment after fixing the test OC.webroot
+ //root: OC.webroot + '/remote.php/webdav',
+ root: '/remote.php/webdav',
+ useHTTPS: false
+ });
+ redirectStub = sinon.stub(OC, 'redirect');
+ notificationStub = sinon.stub(OC.Notification, 'showTemporary');
// prevent resize algo to mess up breadcrumb order while
// testing
bcResizeStub = sinon.stub(OCA.Files.BreadCrumb.prototype, '_resize');
@@ -93,7 +104,17 @@ describe('OCA.Files.FileList tests', function() {
'</div>'
);
- testFiles = [{
+ testRoot = new FileInfo({
+ // root entry
+ id: 99,
+ type: 'dir',
+ name: '/subdir',
+ mimetype: 'httpd/unix-directory',
+ size: 1200000,
+ etag: 'a0b0c0d0',
+ permissions: OC.PERMISSION_ALL
+ });
+ testFiles = [new FileInfo({
id: 1,
type: 'file',
name: 'One.txt',
@@ -102,7 +123,7 @@ describe('OCA.Files.FileList tests', function() {
size: 12,
etag: 'abc',
permissions: OC.PERMISSION_ALL
- }, {
+ }), new FileInfo({
id: 2,
type: 'file',
name: 'Two.jpg',
@@ -111,7 +132,7 @@ describe('OCA.Files.FileList tests', function() {
size: 12049,
etag: 'def',
permissions: OC.PERMISSION_ALL
- }, {
+ }), new FileInfo({
id: 3,
type: 'file',
name: 'Three.pdf',
@@ -120,7 +141,7 @@ describe('OCA.Files.FileList tests', function() {
size: 58009,
etag: '123',
permissions: OC.PERMISSION_ALL
- }, {
+ }), new FileInfo({
id: 4,
type: 'dir',
name: 'somedir',
@@ -129,9 +150,11 @@ describe('OCA.Files.FileList tests', function() {
size: 250,
etag: '456',
permissions: OC.PERMISSION_ALL
- }];
+ })];
pageSizeStub = sinon.stub(OCA.Files.FileList.prototype, 'pageSize').returns(20);
- fileList = new OCA.Files.FileList($('#app-content-files'));
+ fileList = new OCA.Files.FileList($('#app-content-files'), {
+ filesClient: filesClient
+ });
});
afterEach(function() {
testFiles = undefined;
@@ -141,9 +164,9 @@ describe('OCA.Files.FileList tests', function() {
fileList = undefined;
notificationStub.restore();
- alertStub.restore();
bcResizeStub.restore();
pageSizeStub.restore();
+ redirectStub.restore();
});
describe('Getters', function() {
it('Returns the current directory', function() {
@@ -166,15 +189,14 @@ describe('OCA.Files.FileList tests', function() {
clock.restore();
});
it('generates file element with correct attributes when calling add() with file data', function() {
- var fileData = {
+ var fileData = new FileInfo({
id: 18,
- type: 'file',
name: 'testName.txt',
mimetype: 'text/plain',
- size: '1234',
+ size: 1234,
etag: 'a01234c',
- mtime: '123456'
- };
+ mtime: 123456
+ });
var $tr = fileList.add(fileData);
expect($tr).toBeDefined();
@@ -188,7 +210,7 @@ describe('OCA.Files.FileList tests', function() {
expect($tr.attr('data-mime')).toEqual('text/plain');
expect($tr.attr('data-mtime')).toEqual('123456');
expect($tr.find('a.name').attr('href'))
- .toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=testName.txt');
+ .toEqual(OC.webroot + '/remote.php/webdav/subdir/testName.txt');
expect($tr.find('.nametext').text().trim()).toEqual('testName.txt');
expect($tr.find('.filesize').text()).toEqual('1 kB');
@@ -196,15 +218,14 @@ describe('OCA.Files.FileList tests', function() {
expect(fileList.findFileEl('testName.txt')[0]).toEqual($tr[0]);
});
it('generates dir element with correct attributes when calling add() with dir data', function() {
- var fileData = {
+ var fileData = new FileInfo({
id: 19,
- type: 'dir',
name: 'testFolder',
mimetype: 'httpd/unix-directory',
- size: '1234',
+ size: 1234,
etag: 'a01234c',
- mtime: '123456'
- };
+ mtime: 123456
+ });
var $tr = fileList.add(fileData);
expect($tr).toBeDefined();
@@ -297,7 +318,6 @@ describe('OCA.Files.FileList tests', function() {
expect($tr.index()).toEqual(4);
});
it('inserts files in a sorted manner when insert option is enabled', function() {
- var $tr;
for (var i = 0; i < testFiles.length; i++) {
fileList.add(testFiles[i]);
}
@@ -423,28 +443,31 @@ describe('OCA.Files.FileList tests', function() {
});
});
describe('Deleting files', function() {
+ var deferredDelete;
+ var deleteStub;
+
+ beforeEach(function() {
+ deferredDelete = $.Deferred();
+ deleteStub = sinon.stub(filesClient, 'remove').returns(deferredDelete.promise());
+ });
+ afterEach(function() {
+ deleteStub.restore();
+ });
+
function doDelete() {
- var request, query;
// note: normally called from FileActions
fileList.do_delete(['One.txt', 'Two.jpg']);
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/delete.php');
-
- query = fakeServer.requests[0].requestBody;
- expect(OC.parseQueryString(query)).toEqual({'dir': '/subdir', files: '["One.txt","Two.jpg"]'});
+ expect(deleteStub.calledTwice).toEqual(true);
+ expect(deleteStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
+ expect(deleteStub.getCall(1).args[0]).toEqual('/subdir/Two.jpg');
}
it('calls delete.php, removes the deleted entries and updates summary', function() {
var $summary;
fileList.setFiles(testFiles);
doDelete();
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({status: 'success'})
- );
+ deferredDelete.resolve(200);
expect(fileList.findFileEl('One.txt').length).toEqual(0);
expect(fileList.findFileEl('Two.jpg').length).toEqual(0);
@@ -482,11 +505,7 @@ describe('OCA.Files.FileList tests', function() {
fileList.setFiles([testFiles[0], testFiles[1]]);
doDelete();
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({status: 'success'})
- );
+ deferredDelete.resolve(200);
expect(fileList.$fileList.find('tr').length).toEqual(0);
@@ -501,21 +520,41 @@ describe('OCA.Files.FileList tests', function() {
fileList.setFiles(testFiles);
doDelete();
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({status: 'error', data: {message: 'WOOT'}})
- );
+ deferredDelete.reject(403);
// files are still in the list
expect(fileList.findFileEl('One.txt').length).toEqual(1);
expect(fileList.findFileEl('Two.jpg').length).toEqual(1);
expect(fileList.$fileList.find('tr').length).toEqual(4);
- expect(notificationStub.calledOnce).toEqual(true);
+ expect(notificationStub.calledTwice).toEqual(true);
+ });
+ it('remove file from list if delete call returned 404 not found', function() {
+ fileList.setFiles(testFiles);
+ doDelete();
+
+ deferredDelete.reject(404);
+
+ // files are still in the list
+ expect(fileList.findFileEl('One.txt').length).toEqual(0);
+ expect(fileList.findFileEl('Two.jpg').length).toEqual(0);
+ expect(fileList.$fileList.find('tr').length).toEqual(2);
+
+ expect(notificationStub.notCalled).toEqual(true);
});
});
describe('Renaming files', function() {
+ var deferredRename;
+ var renameStub;
+
+ beforeEach(function() {
+ deferredRename = $.Deferred();
+ renameStub = sinon.stub(filesClient, 'move').returns(deferredRename.promise());
+ });
+ afterEach(function() {
+ renameStub.restore();
+ });
+
function doCancelRename() {
var $input;
for (var i = 0; i < testFiles.length; i++) {
@@ -530,10 +569,10 @@ describe('OCA.Files.FileList tests', function() {
// trigger submit because triggering blur doesn't work in all browsers
$input.closest('form').trigger('submit');
- expect(fakeServer.requests.length).toEqual(0);
+ expect(renameStub.notCalled).toEqual(true);
}
function doRename() {
- var $input, request;
+ var $input;
for (var i = 0; i < testFiles.length; i++) {
var file = testFiles[i];
@@ -548,83 +587,61 @@ describe('OCA.Files.FileList tests', function() {
// trigger submit because triggering blur doesn't work in all browsers
$input.closest('form').trigger('submit');
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url.substr(0, request.url.indexOf('?'))).toEqual(OC.webroot + '/index.php/apps/files/ajax/rename.php');
- expect(OC.parseQueryString(request.url)).toEqual({'dir': '/some/subdir', newname: 'Tu_after_three.txt', file: 'One.txt'});
+ expect(renameStub.calledOnce).toEqual(true);
+ expect(renameStub.getCall(0).args[0]).toEqual('/some/subdir/One.txt');
+ expect(renameStub.getCall(0).args[1]).toEqual('/some/subdir/Tu_after_three.txt');
}
it('Inserts renamed file entry at correct position if rename ajax call suceeded', function() {
doRename();
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'Tu_after_three.txt',
- type: 'file'
- }
- }));
+ deferredRename.resolve(201);
// element stays renamed
expect(fileList.findFileEl('One.txt').length).toEqual(0);
expect(fileList.findFileEl('Tu_after_three.txt').length).toEqual(1);
- expect(fileList.findFileEl('Tu_after_three.txt').index()).toEqual(2); // after Two.txt
+ expect(fileList.findFileEl('Tu_after_three.txt').index()).toEqual(2); // after Two.jpg
- expect(alertStub.notCalled).toEqual(true);
+ expect(notificationStub.notCalled).toEqual(true);
});
it('Reverts file entry if rename ajax call failed', function() {
doRename();
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'error',
- data: {
- message: 'Something went wrong'
- }
- }));
+ deferredRename.reject(403);
// element was reverted
expect(fileList.findFileEl('One.txt').length).toEqual(1);
expect(fileList.findFileEl('One.txt').index()).toEqual(1); // after somedir
expect(fileList.findFileEl('Tu_after_three.txt').length).toEqual(0);
- expect(alertStub.calledOnce).toEqual(true);
+ expect(notificationStub.calledOnce).toEqual(true);
});
it('Correctly updates file link after rename', function() {
var $tr;
doRename();
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'Tu_after_three.txt'
- }
- }));
+ deferredRename.resolve(201);
$tr = fileList.findFileEl('Tu_after_three.txt');
- expect($tr.find('a.name').attr('href')).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=Tu_after_three.txt');
+ expect($tr.find('a.name').attr('href'))
+ .toEqual(OC.webroot + '/remote.php/webdav/some/subdir/Tu_after_three.txt');
});
it('Triggers "fileActionsReady" event after rename', function() {
var handler = sinon.stub();
fileList.$fileList.on('fileActionsReady', handler);
doRename();
expect(handler.notCalled).toEqual(true);
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'Tu_after_three.txt'
- }
- }));
+
+ deferredRename.resolve(201);
+
expect(handler.calledOnce).toEqual(true);
expect(fileList.$fileList.find('.test').length).toEqual(0);
});
it('Leaves the summary alone when reinserting renamed element', function() {
var $summary = $('#filestable .summary');
doRename();
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'Tu_after_three.txt'
- }
- }));
+
+ deferredRename.resolve(201);
+
expect($summary.find('.info').text()).toEqual('1 folder and 3 files');
});
it('Leaves the summary alone when cancel renaming', function() {
@@ -668,7 +685,7 @@ describe('OCA.Files.FileList tests', function() {
// trigger submit does not send server request
$input.closest('form').trigger('submit');
- expect(fakeServer.requests.length).toEqual(0);
+ expect(renameStub.notCalled).toEqual(true);
// simulate escape key
$input.trigger(new $.Event('keyup', {keyCode: 27}));
@@ -694,12 +711,7 @@ describe('OCA.Files.FileList tests', function() {
expect(OC.TestUtil.getImageUrl(fileList.findFileEl('Tu_after_three.txt').find('.thumbnail')))
.toEqual(OC.imagePath('core', 'loading.gif'));
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'error',
- data: {
- message: 'Something went wrong'
- }
- }));
+ deferredRename.reject(409);
expect(fileList.findFileEl('One.txt').length).toEqual(1);
expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail')))
@@ -707,25 +719,27 @@ describe('OCA.Files.FileList tests', function() {
});
});
describe('Moving files', function() {
+ var deferredMove;
+ var moveStub;
+
beforeEach(function() {
+ deferredMove = $.Deferred();
+ moveStub = sinon.stub(filesClient, 'move').returns(deferredMove.promise());
+
fileList.setFiles(testFiles);
});
+ afterEach(function() {
+ moveStub.restore();
+ });
+
it('Moves single file to target folder', function() {
- var request;
fileList.move('One.txt', '/somedir');
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/move.php');
- expect(OC.parseQueryString(request.requestBody)).toEqual({dir: '/subdir', file: 'One.txt', target: '/somedir'});
+ expect(moveStub.calledOnce).toEqual(true);
+ expect(moveStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
+ expect(moveStub.getCall(0).args[1]).toEqual('/somedir/One.txt');
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'One.txt',
- type: 'file'
- }
- }));
+ deferredMove.resolve(201);
expect(fileList.findFileEl('One.txt').length).toEqual(0);
@@ -736,39 +750,28 @@ describe('OCA.Files.FileList tests', function() {
expect(notificationStub.notCalled).toEqual(true);
});
it('Moves list of files to target folder', function() {
- var request;
+ var deferredMove1 = $.Deferred();
+ var deferredMove2 = $.Deferred();
+ moveStub.onCall(0).returns(deferredMove1.promise());
+ moveStub.onCall(1).returns(deferredMove2.promise());
+
fileList.move(['One.txt', 'Two.jpg'], '/somedir');
- expect(fakeServer.requests.length).toEqual(2);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/move.php');
- expect(OC.parseQueryString(request.requestBody)).toEqual({dir: '/subdir', file: 'One.txt', target: '/somedir'});
+ expect(moveStub.calledTwice).toEqual(true);
+ expect(moveStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
+ expect(moveStub.getCall(0).args[1]).toEqual('/somedir/One.txt');
+ expect(moveStub.getCall(1).args[0]).toEqual('/subdir/Two.jpg');
+ expect(moveStub.getCall(1).args[1]).toEqual('/somedir/Two.jpg');
- request = fakeServer.requests[1];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/move.php');
- expect(OC.parseQueryString(request.requestBody)).toEqual({dir: '/subdir', file: 'Two.jpg', target: '/somedir'});
-
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'One.txt',
- type: 'file'
- }
- }));
+ deferredMove1.resolve(201);
expect(fileList.findFileEl('One.txt').length).toEqual(0);
- // folder size has increased
+ // folder size has increased during move
expect(fileList.findFileEl('somedir').data('size')).toEqual(262);
expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('262 B');
- fakeServer.requests[1].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'success',
- data: {
- name: 'Two.jpg',
- type: 'file'
- }
- }));
+ deferredMove2.resolve(201);
expect(fileList.findFileEl('Two.jpg').length).toEqual(0);
@@ -779,47 +782,31 @@ describe('OCA.Files.FileList tests', function() {
expect(notificationStub.notCalled).toEqual(true);
});
it('Shows notification if a file could not be moved', function() {
- var request;
fileList.move('One.txt', '/somedir');
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/move.php');
- expect(OC.parseQueryString(request.requestBody)).toEqual({dir: '/subdir', file: 'One.txt', target: '/somedir'});
+ expect(moveStub.calledOnce).toEqual(true);
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'error',
- data: {
- message: 'Error while moving file'
- }
- }));
+ deferredMove.reject(409);
expect(fileList.findFileEl('One.txt').length).toEqual(1);
expect(notificationStub.calledOnce).toEqual(true);
- expect(notificationStub.getCall(0).args[0]).toEqual('Error while moving file');
+ expect(notificationStub.getCall(0).args[0]).toEqual('Could not move "One.txt"');
});
it('Restores thumbnail if a file could not be moved', function() {
- var request;
fileList.move('One.txt', '/somedir');
expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail')))
.toEqual(OC.imagePath('core', 'loading.gif'));
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
+ expect(moveStub.calledOnce).toEqual(true);
- fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- status: 'error',
- data: {
- message: 'Error while moving file'
- }
- }));
+ deferredMove.reject(409);
expect(fileList.findFileEl('One.txt').length).toEqual(1);
expect(notificationStub.calledOnce).toEqual(true);
- expect(notificationStub.getCall(0).args[0]).toEqual('Error while moving file');
+ expect(notificationStub.getCall(0).args[0]).toEqual('Could not move "One.txt"');
expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail')))
.toEqual(OC.imagePath('core', 'filetypes/text.svg'));
@@ -878,7 +865,7 @@ describe('OCA.Files.FileList tests', function() {
name: 'testFile.txt',
directory: '/current dir'
};
- var $tr = fileList.add(fileData);
+ fileList.add(fileData);
expect(fileList.findFileEl('testFile.txt').length).toEqual(1);
});
it('triggers "fileActionsReady" event after update', function() {
@@ -1143,69 +1130,85 @@ describe('OCA.Files.FileList tests', function() {
afterEach(function() {
previewLoadStub.restore();
});
- it('renders default icon for file when none provided and no preview is available', function() {
+ it('renders default file icon when none provided and no mime type is set', function() {
var fileData = {
- type: 'file',
name: 'testFile.txt'
};
var $tr = fileList.add(fileData);
var $imgDiv = $tr.find('td.filename .thumbnail');
expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/file.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
+ // tries to load preview
+ expect(previewLoadStub.calledOnce).toEqual(true);
});
- it('renders default icon for dir when none provided and no preview is available', function() {
+ it('renders default icon for folder when none provided', function() {
var fileData = {
- type: 'dir',
- name: 'test dir'
+ name: 'test dir',
+ mimetype: 'httpd/unix-directory'
};
+
var $tr = fileList.add(fileData);
var $imgDiv = $tr.find('td.filename .thumbnail');
expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/folder.svg');
+ // no preview since it's a directory
expect(previewLoadStub.notCalled).toEqual(true);
});
it('renders provided icon for file when provided', function() {
- var fileData = {
+ var fileData = new FileInfo({
type: 'file',
name: 'test file',
icon: OC.webroot + '/core/img/filetypes/application-pdf.svg',
mimetype: 'application/pdf'
- };
+ });
var $tr = fileList.add(fileData);
var $imgDiv = $tr.find('td.filename .thumbnail');
expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/application-pdf.svg');
+ // try loading preview
+ expect(previewLoadStub.calledOnce).toEqual(true);
+ });
+ it('renders provided icon for file when provided', function() {
+ var fileData = new FileInfo({
+ name: 'somefile.pdf',
+ icon: OC.webroot + '/core/img/filetypes/application-pdf.svg'
+ });
+
+ var $tr = fileList.add(fileData);
+ var $imgDiv = $tr.find('td.filename .thumbnail');
+ expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/application-pdf.svg');
+ // try loading preview
+ expect(previewLoadStub.calledOnce).toEqual(true);
+ });
+ it('renders provided icon for folder when provided', function() {
+ var fileData = new FileInfo({
+ name: 'some folder',
+ mimetype: 'httpd/unix-directory',
+ icon: OC.webroot + '/core/img/filetypes/folder-alt.svg'
+ });
+
+ var $tr = fileList.add(fileData);
+ var $imgDiv = $tr.find('td.filename .thumbnail');
+ expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/folder-alt.svg');
+ // do not load preview for folders
expect(previewLoadStub.notCalled).toEqual(true);
});
- it('renders preview when no icon was provided and preview is available', function() {
+ it('renders preview when no icon was provided', function() {
var fileData = {
type: 'file',
- name: 'test file',
- isPreviewAvailable: true
+ name: 'test file'
};
var $tr = fileList.add(fileData);
var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/core/img/filetypes/file.svg');
+ expect(OC.TestUtil.getImageUrl($td.find('.thumbnail')))
+ .toEqual(OC.webroot + '/core/img/filetypes/file.svg');
expect(previewLoadStub.calledOnce).toEqual(true);
// third argument is callback
previewLoadStub.getCall(0).args[0].callback(OC.webroot + '/somepath.png');
expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/somepath.png');
});
- it('renders default file type icon when no icon was provided and no preview is available', function() {
- var fileData = {
- type: 'file',
- name: 'test file',
- isPreviewAvailable: false
- };
- var $tr = fileList.add(fileData);
- var $imgDiv = $tr.find('td.filename .thumbnail');
- expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/file.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
- });
it('does not render preview for directories', function() {
var fileData = {
type: 'dir',
mimetype: 'httpd/unix-directory',
- name: 'test dir',
- isPreviewAvailable: true
+ name: 'test dir'
};
var $tr = fileList.add(fileData);
var $td = $tr.find('td.filename');
@@ -1217,7 +1220,6 @@ describe('OCA.Files.FileList tests', function() {
type: 'dir',
mimetype: 'httpd/unix-directory',
name: 'test dir',
- isPreviewAvailable: true,
mountType: 'external-root'
};
var $tr = fileList.add(fileData);
@@ -1230,7 +1232,6 @@ describe('OCA.Files.FileList tests', function() {
type: 'dir',
mimetype: 'httpd/unix-directory',
name: 'test dir',
- isPreviewAvailable: true,
mountType: 'external'
};
var $tr = fileList.add(fileData);
@@ -1278,75 +1279,47 @@ describe('OCA.Files.FileList tests', function() {
});
});
describe('loading file list', function() {
+ var deferredList;
+ var getFolderContentsStub;
+
beforeEach(function() {
- var data = {
- status: 'success',
- data: {
- files: testFiles,
- permissions: 31
- }
- };
- fakeServer.respondWith(/\/index\.php\/apps\/files\/ajax\/list.php\?dir=%2F(subdir|anothersubdir)/, [
- 200, {
- "Content-Type": "application/json"
- },
- JSON.stringify(data)
- ]);
+ deferredList = $.Deferred();
+ getFolderContentsStub = sinon.stub(filesClient, 'getFolderContents').returns(deferredList.promise());
+ });
+ afterEach(function() {
+ getFolderContentsStub.restore();
});
it('fetches file list from server and renders it when reload() is called', function() {
fileList.reload();
- expect(fakeServer.requests.length).toEqual(1);
- var url = fakeServer.requests[0].url;
- var query = url.substr(url.indexOf('?') + 1);
- expect(OC.parseQueryString(query)).toEqual({'dir': '/subdir', sort: 'name', sortdirection: 'asc'});
- fakeServer.respond();
+ expect(getFolderContentsStub.calledOnce).toEqual(true);
+ expect(getFolderContentsStub.calledWith('/subdir')).toEqual(true);
+ deferredList.resolve(200, [testRoot].concat(testFiles));
expect($('#fileList tr').length).toEqual(4);
expect(fileList.findFileEl('One.txt').length).toEqual(1);
});
it('switches dir and fetches file list when calling changeDirectory()', function() {
fileList.changeDirectory('/anothersubdir');
expect(fileList.getCurrentDirectory()).toEqual('/anothersubdir');
- expect(fakeServer.requests.length).toEqual(1);
- var url = fakeServer.requests[0].url;
- var query = url.substr(url.indexOf('?') + 1);
- expect(OC.parseQueryString(query)).toEqual({'dir': '/anothersubdir', sort: 'name', sortdirection: 'asc'});
- fakeServer.respond();
+ expect(getFolderContentsStub.calledOnce).toEqual(true);
+ expect(getFolderContentsStub.calledWith('/anothersubdir')).toEqual(true);
});
it('converts backslashes to slashes when calling changeDirectory()', function() {
fileList.changeDirectory('/another\\subdir');
expect(fileList.getCurrentDirectory()).toEqual('/another/subdir');
});
it('switches to root dir when current directory does not exist', function() {
- fakeServer.respondWith(/\/index\.php\/apps\/files\/ajax\/list.php\?dir=%2funexist/, [
- 404, {
- "Content-Type": "application/json"
- },
- ''
- ]);
fileList.changeDirectory('/unexist');
- fakeServer.respond();
+ deferredList.reject(404);
expect(fileList.getCurrentDirectory()).toEqual('/');
});
it('switches to root dir when current directory is forbidden', function() {
- fakeServer.respondWith(/\/index\.php\/apps\/files\/ajax\/list.php\?dir=%2funexist/, [
- 403, {
- "Content-Type": "application/json"
- },
- ''
- ]);
fileList.changeDirectory('/unexist');
- fakeServer.respond();
+ deferredList.reject(403);
expect(fileList.getCurrentDirectory()).toEqual('/');
});
it('switches to root dir when current directory is unavailable', function() {
- fakeServer.respondWith(/\/index\.php\/apps\/files\/ajax\/list.php\?dir=%2funexist/, [
- 500, {
- "Content-Type": "application/json"
- },
- ''
- ]);
fileList.changeDirectory('/unexist');
- fakeServer.respond();
+ deferredList.reject(500);
expect(fileList.getCurrentDirectory()).toEqual('/');
});
it('shows mask before loading file list then hides it at the end', function() {
@@ -1355,7 +1328,7 @@ describe('OCA.Files.FileList tests', function() {
fileList.changeDirectory('/anothersubdir');
expect(showMaskStub.calledOnce).toEqual(true);
expect(hideMaskStub.calledOnce).toEqual(false);
- fakeServer.respond();
+ deferredList.resolve(200, [testRoot].concat(testFiles));
expect(showMaskStub.calledOnce).toEqual(true);
expect(hideMaskStub.calledOnce).toEqual(true);
showMaskStub.restore();
@@ -1365,6 +1338,7 @@ describe('OCA.Files.FileList tests', function() {
var handler = sinon.stub();
$('#app-content-files').on('changeDirectory', handler);
fileList.changeDirectory('/somedir');
+ deferredList.resolve(200, [testRoot].concat(testFiles));
expect(handler.calledOnce).toEqual(true);
expect(handler.getCall(0).args[0].dir).toEqual('/somedir');
});
@@ -1375,31 +1349,27 @@ describe('OCA.Files.FileList tests', function() {
it('refreshes breadcrumb after update', function() {
var setDirSpy = sinon.spy(fileList.breadcrumb, 'setDirectory');
fileList.changeDirectory('/anothersubdir');
- fakeServer.respond();
+ deferredList.resolve(200, [testRoot].concat(testFiles));
expect(fileList.breadcrumb.setDirectory.calledOnce).toEqual(true);
expect(fileList.breadcrumb.setDirectory.calledWith('/anothersubdir')).toEqual(true);
setDirSpy.restore();
+ getFolderContentsStub.restore();
});
});
describe('breadcrumb events', function() {
+ var deferredList;
+ var getFolderContentsStub;
+
beforeEach(function() {
- var data = {
- status: 'success',
- data: {
- files: testFiles,
- permissions: 31
- }
- };
- fakeServer.respondWith(/\/index\.php\/apps\/files\/ajax\/list.php\?dir=%2Fsubdir/, [
- 200, {
- "Content-Type": "application/json"
- },
- JSON.stringify(data)
- ]);
+ deferredList = $.Deferred();
+ getFolderContentsStub = sinon.stub(filesClient, 'getFolderContents').returns(deferredList.promise());
+ });
+ afterEach(function() {
+ getFolderContentsStub.restore();
});
it('clicking on root breadcrumb changes directory to root', function() {
fileList.changeDirectory('/subdir/two/three with space/four/five');
- fakeServer.respond();
+ deferredList.resolve(200, [testRoot].concat(testFiles));
var changeDirStub = sinon.stub(fileList, 'changeDirectory');
fileList.breadcrumb.$el.find('.crumb:eq(0)').trigger({type: 'click', which: 1});
@@ -1409,7 +1379,7 @@ describe('OCA.Files.FileList tests', function() {
});
it('clicking on breadcrumb changes directory', function() {
fileList.changeDirectory('/subdir/two/three with space/four/five');
- fakeServer.respond();
+ deferredList.resolve(200, [testRoot].concat(testFiles));
var changeDirStub = sinon.stub(fileList, 'changeDirectory');
fileList.breadcrumb.$el.find('.crumb:eq(3)').trigger({type: 'click', which: 1});
@@ -1418,9 +1388,10 @@ describe('OCA.Files.FileList tests', function() {
changeDirStub.restore();
});
it('dropping files on breadcrumb calls move operation', function() {
- var request, query, testDir = '/subdir/two/three with space/four/five';
+ var testDir = '/subdir/two/three with space/four/five';
+ var moveStub = sinon.stub(filesClient, 'move').returns($.Deferred().promise());
fileList.changeDirectory(testDir);
- fakeServer.respond();
+ deferredList.resolve(200, [testRoot].concat(testFiles));
var $crumb = fileList.breadcrumb.$el.find('.crumb:eq(3)');
// no idea what this is but is required by the handler
var ui = {
@@ -1436,33 +1407,18 @@ describe('OCA.Files.FileList tests', function() {
// simulate drop event
fileList._onDropOnBreadCrumb(new $.Event('drop', {target: $crumb}), ui);
- // will trigger two calls to move.php (first one was previous list.php)
- expect(fakeServer.requests.length).toEqual(3);
-
- request = fakeServer.requests[1];
- expect(request.method).toEqual('POST');
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/move.php');
- query = OC.parseQueryString(request.requestBody);
- expect(query).toEqual({
- target: '/subdir/two/three with space',
- dir: testDir,
- file: 'One.txt'
- });
-
- request = fakeServer.requests[2];
- expect(request.method).toEqual('POST');
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/move.php');
- query = OC.parseQueryString(request.requestBody);
- expect(query).toEqual({
- target: '/subdir/two/three with space',
- dir: testDir,
- file: 'Two.jpg'
- });
+ expect(moveStub.callCount).toEqual(2);
+ expect(moveStub.getCall(0).args[0]).toEqual(testDir + '/One.txt');
+ expect(moveStub.getCall(0).args[1]).toEqual('/subdir/two/three with space/One.txt');
+ expect(moveStub.getCall(1).args[0]).toEqual(testDir + '/Two.jpg');
+ expect(moveStub.getCall(1).args[1]).toEqual('/subdir/two/three with space/Two.jpg');
+ moveStub.restore();
});
it('dropping files on same dir breadcrumb does nothing', function() {
var testDir = '/subdir/two/three with space/four/five';
+ var moveStub = sinon.stub(filesClient, 'move').returns($.Deferred().promise());
fileList.changeDirectory(testDir);
- fakeServer.respond();
+ deferredList.resolve(200, [testRoot].concat(testFiles));
var $crumb = fileList.breadcrumb.$el.find('.crumb:last');
// no idea what this is but is required by the handler
var ui = {
@@ -1479,21 +1435,26 @@ describe('OCA.Files.FileList tests', function() {
fileList._onDropOnBreadCrumb(new $.Event('drop', {target: $crumb}), ui);
// no extra server request
- expect(fakeServer.requests.length).toEqual(1);
+ expect(moveStub.notCalled).toEqual(true);
});
});
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');
+ expect(fileList.getDownloadUrl('some file.txt'))
+ .toEqual(OC.webroot + '/remote.php/webdav/subdir/some%20file.txt');
+ expect(fileList.getDownloadUrl('some file.txt', '/anotherpath/abc'))
+ .toEqual(OC.webroot + '/remote.php/webdav/anotherpath/abc/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');
+ expect(fileList.getDownloadUrl('some file.txt'))
+ .toEqual(OC.webroot + '/remote.php/webdav/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');
+ 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');
});
it('returns the correct ajax URL', function() {
- expect(fileList.getAjaxUrl('test', {a:1, b:'x y'})).toEqual(OC.webroot + '/index.php/apps/files/ajax/test.php?a=1&b=x%20y');
+ expect(fileList.getAjaxUrl('test', {a:1, b:'x y'}))
+ .toEqual(OC.webroot + '/index.php/apps/files/ajax/test.php?a=1&b=x%20y');
});
});
describe('File selection', function() {
@@ -1672,24 +1633,17 @@ describe('OCA.Files.FileList tests', function() {
});
it('Selection is cleared when switching dirs', function() {
$('.select-all').click();
- var data = {
- status: 'success',
- data: {
- files: testFiles,
- permissions: 31
- }
- };
- fakeServer.respondWith(/\/index\.php\/apps\/files\/ajax\/list.php/, [
- 200, {
- "Content-Type": "application/json"
- },
- JSON.stringify(data)
- ]
- );
+ var deferredList = $.Deferred();
+ var getFolderContentsStub = sinon.stub(filesClient, 'getFolderContents').returns(deferredList.promise());
+
fileList.changeDirectory('/');
- fakeServer.respond();
+
+ deferredList.resolve(200, [testRoot].concat(testFiles));
+
expect($('.select-all').prop('checked')).toEqual(false);
expect(_.pluck(fileList.getSelectedFiles(), 'name')).toEqual([]);
+
+ getFolderContentsStub.restore();
});
it('getSelectedFiles returns the selected files even when they are on the next page', function() {
var selectedFiles;
@@ -1796,6 +1750,12 @@ describe('OCA.Files.FileList tests', function() {
etag: '456',
permissions: OC.PERMISSION_ALL
});
+ expect(files[0].id).toEqual(1);
+ expect(files[0].name).toEqual('One.txt');
+ expect(files[1].id).toEqual(3);
+ expect(files[1].name).toEqual('Three.pdf');
+ expect(files[2].id).toEqual(4);
+ expect(files[2].name).toEqual('somedir');
});
it('Removing a file removes it from the selection', function() {
fileList.remove('Three.pdf');
@@ -1824,7 +1784,6 @@ describe('OCA.Files.FileList tests', function() {
});
describe('Download', function() {
it('Opens download URL when clicking "Download"', function() {
- var redirectStub = sinon.stub(OC, 'redirect');
$('.selectedActions .download').click();
expect(redirectStub.calledOnce).toEqual(true);
expect(redirectStub.getCall(0).args[0]).toContain(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22One.txt%22%2C%22Three.pdf%22%2C%22somedir%22%5D');
@@ -1833,54 +1792,53 @@ describe('OCA.Files.FileList tests', function() {
it('Downloads root folder when all selected in root folder', function() {
$('#dir').val('/');
$('.select-all').click();
- var redirectStub = sinon.stub(OC, 'redirect');
$('.selectedActions .download').click();
expect(redirectStub.calledOnce).toEqual(true);
expect(redirectStub.getCall(0).args[0]).toContain(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=');
- redirectStub.restore();
});
it('Downloads parent folder when all selected in subfolder', function() {
$('.select-all').click();
- var redirectStub = sinon.stub(OC, 'redirect');
$('.selectedActions .download').click();
expect(redirectStub.calledOnce).toEqual(true);
expect(redirectStub.getCall(0).args[0]).toContain(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=subdir');
- redirectStub.restore();
});
});
describe('Delete', function() {
+ var deleteStub, deferredDelete;
+ beforeEach(function() {
+ deferredDelete = $.Deferred();
+ deleteStub = sinon.stub(filesClient, 'remove').returns(deferredDelete.promise());
+ });
+ afterEach(function() {
+ deleteStub.restore();
+ });
it('Deletes selected files when "Delete" clicked', function() {
- var request;
$('.selectedActions .delete-selected').click();
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/delete.php');
- expect(OC.parseQueryString(request.requestBody))
- .toEqual({'dir': '/subdir', files: '["One.txt","Three.pdf","somedir"]'});
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({status: 'success'})
- );
+
+ expect(deleteStub.callCount).toEqual(3);
+ expect(deleteStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
+ expect(deleteStub.getCall(1).args[0]).toEqual('/subdir/Three.pdf');
+ expect(deleteStub.getCall(2).args[0]).toEqual('/subdir/somedir');
+
+ deferredDelete.resolve(204);
+
expect(fileList.findFileEl('One.txt').length).toEqual(0);
expect(fileList.findFileEl('Three.pdf').length).toEqual(0);
expect(fileList.findFileEl('somedir').length).toEqual(0);
expect(fileList.findFileEl('Two.jpg').length).toEqual(1);
});
it('Deletes all files when all selected when "Delete" clicked', function() {
- var request;
$('.select-all').click();
$('.selectedActions .delete-selected').click();
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(OC.webroot + '/index.php/apps/files/ajax/delete.php');
- expect(OC.parseQueryString(request.requestBody))
- .toEqual({'dir': '/subdir', allfiles: 'true'});
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({status: 'success'})
- );
+
+ expect(deleteStub.callCount).toEqual(4);
+ expect(deleteStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
+ expect(deleteStub.getCall(1).args[0]).toEqual('/subdir/Two.jpg');
+ expect(deleteStub.getCall(2).args[0]).toEqual('/subdir/Three.pdf');
+ expect(deleteStub.getCall(3).args[0]).toEqual('/subdir/somedir');
+
+ deferredDelete.resolve(204);
+
expect(fileList.isEmpty).toEqual(true);
});
});
@@ -2118,30 +2076,6 @@ describe('OCA.Files.FileList tests', function() {
});
});
describe('Sorting files', function() {
- it('Sorts by name by default', function() {
- fileList.reload();
- expect(fakeServer.requests.length).toEqual(1);
- var url = fakeServer.requests[0].url;
- var query = OC.parseQueryString(url.substr(url.indexOf('?') + 1));
- expect(query.sort).toEqual('name');
- expect(query.sortdirection).toEqual('asc');
- });
- it('Reloads file list with a different sort when clicking on column header of unsorted column', function() {
- fileList.$el.find('.column-size .columntitle').click();
- expect(fakeServer.requests.length).toEqual(1);
- var url = fakeServer.requests[0].url;
- var query = OC.parseQueryString(url.substr(url.indexOf('?') + 1));
- expect(query.sort).toEqual('size');
- expect(query.sortdirection).toEqual('desc');
- });
- it('Toggles sort direction when clicking on already sorted column', function() {
- fileList.$el.find('.column-name .columntitle').click();
- expect(fakeServer.requests.length).toEqual(1);
- var url = fakeServer.requests[0].url;
- var query = OC.parseQueryString(url.substr(url.indexOf('?') + 1));
- expect(query.sort).toEqual('name');
- expect(query.sortdirection).toEqual('desc');
- });
it('Toggles the sort indicator when clicking on a column header', function() {
var ASC_CLASS = fileList.SORT_INDICATOR_ASC_CLASS;
var DESC_CLASS = fileList.SORT_INDICATOR_DESC_CLASS;
@@ -2191,28 +2125,15 @@ describe('OCA.Files.FileList tests', function() {
it('Uses correct sort comparator when inserting files', function() {
testFiles.sort(OCA.Files.FileList.Comparators.size);
testFiles.reverse(); //default is descending
- // this will make it reload the testFiles with the correct sorting
+ fileList.setFiles(testFiles);
fileList.$el.find('.column-size .columntitle').click();
- expect(fakeServer.requests.length).toEqual(1);
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({
- status: 'success',
- data: {
- files: testFiles,
- permissions: 31
- }
- })
- );
- var newFileData = {
+ var newFileData = new FileInfo({
id: 999,
- type: 'file',
name: 'new file.txt',
mimetype: 'text/plain',
size: 40001,
etag: '999'
- };
+ });
fileList.add(newFileData);
expect(fileList.findFileEl('Three.pdf').index()).toEqual(0);
expect(fileList.findFileEl('new file.txt').index()).toEqual(1);
@@ -2224,41 +2145,18 @@ describe('OCA.Files.FileList tests', function() {
});
it('Uses correct reversed sort comparator when inserting files', function() {
testFiles.sort(OCA.Files.FileList.Comparators.size);
- // this will make it reload the testFiles with the correct sorting
+ fileList.setFiles(testFiles);
fileList.$el.find('.column-size .columntitle').click();
- expect(fakeServer.requests.length).toEqual(1);
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({
- status: 'success',
- data: {
- files: testFiles,
- permissions: 31
- }
- })
- );
+
// reverse sort
fileList.$el.find('.column-size .columntitle').click();
- fakeServer.requests[1].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({
- status: 'success',
- data: {
- files: testFiles,
- permissions: 31
- }
- })
- );
- var newFileData = {
+ var newFileData = new FileInfo({
id: 999,
- type: 'file',
name: 'new file.txt',
mimetype: 'text/plain',
size: 40001,
etag: '999'
- };
+ });
fileList.add(newFileData);
expect(fileList.findFileEl('One.txt').index()).toEqual(0);
expect(fileList.findFileEl('somedir').index()).toEqual(1);
@@ -2290,87 +2188,96 @@ describe('OCA.Files.FileList tests', function() {
});
describe('create file', function() {
var deferredCreate;
+ var deferredInfo;
+ var createStub;
+ var getFileInfoStub;
beforeEach(function() {
deferredCreate = $.Deferred();
+ deferredInfo = $.Deferred();
+ createStub = sinon.stub(filesClient, 'putFileContents')
+ .returns(deferredCreate.promise());
+ getFileInfoStub = sinon.stub(filesClient, 'getFileInfo')
+ .returns(deferredInfo.promise());
+ });
+ afterEach(function() {
+ createStub.restore();
+ getFileInfoStub.restore();
});
it('creates file with given name and adds it to the list', function() {
- var deferred = fileList.createFile('test file.txt');
- var successStub = sinon.stub();
- var failureStub = sinon.stub();
+ fileList.createFile('test.txt');
- deferred.done(successStub);
- deferred.fail(failureStub);
+ expect(createStub.calledOnce).toEqual(true);
+ expect(createStub.getCall(0).args[0]).toEqual('/subdir/test.txt');
+ expect(createStub.getCall(0).args[2]).toEqual({
+ contentType: 'text/plain',
+ overwrite: true
+ });
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].url).toEqual(OC.generateUrl('/apps/files/ajax/newfile.php'));
+ deferredCreate.resolve(200);
- var query = fakeServer.requests[0].requestBody;
- expect(OC.parseQueryString(query)).toEqual({
- dir: '/subdir',
- filename: 'test file.txt'
- });
+ expect(getFileInfoStub.calledOnce).toEqual(true);
+ expect(getFileInfoStub.getCall(0).args[0]).toEqual('/subdir/test.txt');
- fakeServer.requests[0].respond(
+ deferredInfo.resolve(
200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({
- status: 'success',
- data: {
- path: '/subdir',
- name: 'test file.txt',
- mimetype: 'text/plain'
- }
+ new FileInfo({
+ path: '/subdir',
+ name: 'test.txt',
+ mimetype: 'text/plain'
})
);
- var $tr = fileList.findFileEl('test file.txt');
+ var $tr = fileList.findFileEl('test.txt');
expect($tr.length).toEqual(1);
expect($tr.attr('data-mime')).toEqual('text/plain');
-
- expect(successStub.calledOnce).toEqual(true);
- expect(failureStub.notCalled).toEqual(true);
});
// TODO: error cases
// TODO: unique name cases
});
- describe('create directory', function() {
- it('creates directory with given name and adds it to the list', function() {
- var deferred = fileList.createDirectory('test directory');
- var successStub = sinon.stub();
- var failureStub = sinon.stub();
-
- deferred.done(successStub);
- deferred.fail(failureStub);
-
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].url).toEqual(OC.generateUrl('/apps/files/ajax/newfolder.php'));
- var query = fakeServer.requests[0].requestBody;
- expect(OC.parseQueryString(query)).toEqual({
- dir: '/subdir',
- foldername: 'test directory'
- });
+ describe('create folder', function() {
+ var deferredCreate;
+ var deferredInfo;
+ var createStub;
+ var getFileInfoStub;
+
+ beforeEach(function() {
+ deferredCreate = $.Deferred();
+ deferredInfo = $.Deferred();
+ createStub = sinon.stub(filesClient, 'createDirectory')
+ .returns(deferredCreate.promise());
+ getFileInfoStub = sinon.stub(filesClient, 'getFileInfo')
+ .returns(deferredInfo.promise());
+ });
+ afterEach(function() {
+ createStub.restore();
+ getFileInfoStub.restore();
+ });
+
+ it('creates folder with given name and adds it to the list', function() {
+ fileList.createDirectory('sub dir');
+
+ expect(createStub.calledOnce).toEqual(true);
+ expect(createStub.getCall(0).args[0]).toEqual('/subdir/sub dir');
- fakeServer.requests[0].respond(
+ deferredCreate.resolve(200);
+
+ expect(getFileInfoStub.calledOnce).toEqual(true);
+ expect(getFileInfoStub.getCall(0).args[0]).toEqual('/subdir/sub dir');
+
+ deferredInfo.resolve(
200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({
- status: 'success',
- data: {
- path: '/subdir',
- name: 'test directory',
- mimetype: 'httpd/unix-directory'
- }
+ new FileInfo({
+ path: '/subdir',
+ name: 'sub dir',
+ mimetype: 'httpd/unix-directory'
})
);
- var $tr = fileList.findFileEl('test directory');
+ var $tr = fileList.findFileEl('sub dir');
expect($tr.length).toEqual(1);
expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
-
- expect(successStub.calledOnce).toEqual(true);
- expect(failureStub.notCalled).toEqual(true);
});
// TODO: error cases
// TODO: unique name cases
@@ -2481,14 +2388,14 @@ describe('OCA.Files.FileList tests', function() {
expect(ev.result).not.toEqual(false);
});
it('drop on a folder row inside the table triggers upload to target folder', function() {
- var ev, formData;
+ var ev;
ev = dropOn(fileList.findFileEl('somedir').find('td:eq(2)'), uploadData);
expect(ev.result).not.toEqual(false);
expect(uploadData.targetDir).toEqual('/subdir/somedir');
});
it('drop on a breadcrumb inside the table triggers upload to target folder', function() {
- var ev, formData;
+ var ev;
fileList.changeDirectory('a/b/c/d');
ev = dropOn(fileList.$el.find('.crumb:eq(2)'), uploadData);
@@ -2497,32 +2404,50 @@ describe('OCA.Files.FileList tests', function() {
});
});
});
- describe('Handeling errors', function () {
- var redirectStub;
+ describe('Handling errors', function () {
+ var deferredList;
+ var getFolderContentsStub;
- beforeEach(function () {
- redirectStub = sinon.stub(OC, 'redirect');
-
- fileList = new OCA.Files.FileList($('#app-content-files'));
+ beforeEach(function() {
+ deferredList = $.Deferred();
+ getFolderContentsStub =
+ sinon.stub(filesClient, 'getFolderContents');
+ getFolderContentsStub.onCall(0).returns(deferredList.promise());
+ getFolderContentsStub.onCall(1).returns($.Deferred().promise());
+ fileList.reload();
});
- afterEach(function () {
+ afterEach(function() {
+ getFolderContentsStub.restore();
fileList = undefined;
+ });
+ it('redirects to files app in case of auth error', function () {
+ deferredList.reject(401, 'Authentication error');
- redirectStub.restore();
+ expect(redirectStub.calledOnce).toEqual(true);
+ expect(redirectStub.getCall(0).args[0]).toEqual(OC.webroot + '/index.php/apps/files');
+ expect(getFolderContentsStub.calledOnce).toEqual(true);
});
- it('reloads the page on authentication errors', function () {
- fileList.reload();
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({
- status: 'error',
- data: {
- 'error': 'authentication_error'
- }
- })
- );
- expect(redirectStub.calledWith(OC.generateUrl('apps/files'))).toEqual(true);
+ it('redirects to root folder in case of forbidden access', function () {
+ deferredList.reject(403);
+
+ expect(fileList.getCurrentDirectory()).toEqual('/');
+ expect(getFolderContentsStub.calledTwice).toEqual(true);
+ });
+ it('redirects to root folder and shows notification in case of internal server error', function () {
+ expect(notificationStub.notCalled).toEqual(true);
+ deferredList.reject(500);
+
+ expect(fileList.getCurrentDirectory()).toEqual('/');
+ expect(getFolderContentsStub.calledTwice).toEqual(true);
+ expect(notificationStub.calledOnce).toEqual(true);
+ });
+ it('redirects to root folder and shows notification in case of storage not available', function () {
+ expect(notificationStub.notCalled).toEqual(true);
+ deferredList.reject(503, 'Storage not available');
+
+ expect(fileList.getCurrentDirectory()).toEqual('/');
+ expect(getFolderContentsStub.calledTwice).toEqual(true);
+ expect(notificationStub.calledOnce).toEqual(true);
});
});
describe('showFileBusyState', function() {
diff --git a/apps/files/tests/js/filesSpec.js b/apps/files/tests/js/filesSpec.js
index 30e6675c155..b7627d59fdf 100644
--- a/apps/files/tests/js/filesSpec.js
+++ b/apps/files/tests/js/filesSpec.js
@@ -76,11 +76,11 @@ describe('OCA.Files.Files tests', function() {
describe('getDownloadUrl', function() {
it('returns the ajax download URL when filename and dir specified', function() {
var url = Files.getDownloadUrl('test file.txt', '/subdir');
- expect(url).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=test%20file.txt');
+ expect(url).toEqual(OC.webroot + '/remote.php/webdav/subdir/test%20file.txt');
});
- it('returns the ajax download URL when filename and root dir specific', function() {
+ it('returns the webdav download URL when filename and root dir specified', function() {
var url = Files.getDownloadUrl('test file.txt', '/');
- expect(url).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=test%20file.txt');
+ expect(url).toEqual(OC.webroot + '/remote.php/webdav/test%20file.txt');
});
it('returns the ajax download URL when multiple files specified', function() {
var url = Files.getDownloadUrl(['test file.txt', 'abc.txt'], '/subdir');
diff --git a/apps/files/tests/js/newfilemenuSpec.js b/apps/files/tests/js/newfilemenuSpec.js
index 3d89a997eb2..20f617d24d6 100644
--- a/apps/files/tests/js/newfilemenuSpec.js
+++ b/apps/files/tests/js/newfilemenuSpec.js
@@ -46,7 +46,7 @@ describe('OCA.Files.NewFileMenu', function() {
describe('rendering', function() {
it('renders menu items', function() {
var $items = menu.$el.find('.menuitem');
- expect($items.length).toEqual(3);
+ expect($items.length).toEqual(2);
// label points to the file_upload_start item
var $item = $items.eq(0);
expect($item.is('label')).toEqual(true);
@@ -55,39 +55,26 @@ describe('OCA.Files.NewFileMenu', function() {
});
describe('New file/folder', function() {
var $input;
- var createFileStub;
var createDirectoryStub;
beforeEach(function() {
- createFileStub = sinon.stub(FileList.prototype, 'createFile');
createDirectoryStub = sinon.stub(FileList.prototype, 'createDirectory');
menu.$el.find('.menuitem').eq(1).click();
$input = menu.$el.find('form.filenameform input');
});
afterEach(function() {
- createFileStub.restore();
createDirectoryStub.restore();
});
it('sets default text in field', function() {
expect($input.length).toEqual(1);
- expect($input.val()).toEqual('New text file.txt');
- });
- it('creates file when enter is pressed', function() {
- $input.val('somefile.txt');
- $input.trigger(new $.Event('keyup', {keyCode: 13}));
- $input.parent('form').submit();
-
- expect(createFileStub.calledOnce).toEqual(true);
- expect(createFileStub.getCall(0).args[0]).toEqual('somefile.txt');
- expect(createDirectoryStub.notCalled).toEqual(true);
+ expect($input.val()).toEqual('New folder');
});
it('prevents entering invalid file names', function() {
$input.val('..');
$input.trigger(new $.Event('keyup', {keyCode: 13}));
$input.closest('form').submit();
- expect(createFileStub.notCalled).toEqual(true);
expect(createDirectoryStub.notCalled).toEqual(true);
});
it('prevents entering file names that already exist', function() {
@@ -96,16 +83,10 @@ describe('OCA.Files.NewFileMenu', function() {
$input.trigger(new $.Event('keyup', {keyCode: 13}));
$input.closest('form').submit();
- expect(createFileStub.notCalled).toEqual(true);
expect(createDirectoryStub.notCalled).toEqual(true);
inListStub.restore();
});
- it('switching fields removes the previous form', function() {
- menu.$el.find('.menuitem').eq(2).click();
- expect(menu.$el.find('form').length).toEqual(1);
- });
it('creates directory when clicking on create directory field', function() {
- menu.$el.find('.menuitem').eq(2).click();
$input = menu.$el.find('form.filenameform input');
$input.val('some folder');
$input.trigger(new $.Event('keyup', {keyCode: 13}));
@@ -113,7 +94,55 @@ describe('OCA.Files.NewFileMenu', function() {
expect(createDirectoryStub.calledOnce).toEqual(true);
expect(createDirectoryStub.getCall(0).args[0]).toEqual('some folder');
- expect(createFileStub.notCalled).toEqual(true);
+ });
+ });
+ describe('custom entries', function() {
+ var oldPlugins;
+ var plugin;
+ var actionStub;
+
+ beforeEach(function() {
+ oldPlugins = _.extend({}, OC.Plugins._plugins);
+ actionStub = sinon.stub();
+ plugin = {
+ attach: function(menu) {
+ menu.addMenuEntry({
+ id: 'file',
+ displayName: t('files_texteditor', 'Text file'),
+ templateName: t('files_texteditor', 'New text file.txt'),
+ iconClass: 'icon-filetype-text',
+ fileType: 'file',
+ actionHandler: actionStub
+ });
+ }
+ };
+
+ OC.Plugins.register('OCA.Files.NewFileMenu', plugin);
+ menu = new OCA.Files.NewFileMenu({
+ fileList: fileList
+ });
+ menu.showAt($trigger);
+ });
+ afterEach(function() {
+ OC.Plugins._plugins = oldPlugins;
+ });
+ it('renders custom menu items', function() {
+ expect(menu.$el.find('.menuitem').length).toEqual(3);
+ expect(menu.$el.find('.menuitem[data-action=file]').length).toEqual(1);
+ });
+ it('calls action handler when clicking on custom item', function() {
+ menu.$el.find('.menuitem').eq(2).click();
+ var $input = menu.$el.find('form.filenameform input');
+ $input.val('some name');
+ $input.trigger(new $.Event('keyup', {keyCode: 13}));
+ $input.closest('form').submit();
+
+ expect(actionStub.calledOnce).toEqual(true);
+ expect(actionStub.getCall(0).args[0]).toEqual('some name');
+ });
+ it('switching fields removes the previous form', function() {
+ menu.$el.find('.menuitem').eq(2).click();
+ expect(menu.$el.find('form').length).toEqual(1);
});
});
});
diff --git a/apps/files/tests/service/tagservice.php b/apps/files/tests/service/tagservice.php
index 147e698aaaa..36da3edc61e 100644
--- a/apps/files/tests/service/tagservice.php
+++ b/apps/files/tests/service/tagservice.php
@@ -22,6 +22,13 @@ namespace OCA\Files;
use \OCA\Files\Service\TagService;
+/**
+ * Class TagServiceTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files
+ */
class TagServiceTest extends \Test\TestCase {
/**
diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index a7d8f4f668d..1fcd09cca51 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -60,8 +60,5 @@ if (OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') == '
"name" => $l->t('External storage')
]);
-// connecting hooks
-OCP\Util::connectHook('OC_Filesystem', 'post_initMountPoints', '\OC_Mount_Config', 'initMountPointsHook');
-
$mountProvider = $appContainer->query('OCA\Files_External\Config\ConfigAdapter');
\OC::$server->getMountProviderCollection()->registerProvider($mountProvider);
diff --git a/apps/files_external/appinfo/register_command.php b/apps/files_external/appinfo/register_command.php
new file mode 100644
index 00000000000..183d965d1a1
--- /dev/null
+++ b/apps/files_external/appinfo/register_command.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+use OCA\Files_External\Command\ListCommand;
+use OCA\Files_External\Command\Config;
+use OCA\Files_External\Command\Option;
+
+$userManager = OC::$server->getUserManager();
+$userSession = OC::$server->getUserSession();
+
+$app = \OC_Mount_Config::$app;
+
+$globalStorageService = $app->getContainer()->query('\OCA\Files_external\Service\GlobalStoragesService');
+$userStorageService = $app->getContainer()->query('\OCA\Files_external\Service\UserStoragesService');
+
+/** @var Symfony\Component\Console\Application $application */
+$application->add(new ListCommand($globalStorageService, $userStorageService, $userSession, $userManager));
+$application->add(new Config($globalStorageService));
+$application->add(new Option($globalStorageService));
diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php
index 39ded1dc2ec..e66c010a8cf 100644
--- a/apps/files_external/appinfo/routes.php
+++ b/apps/files_external/appinfo/routes.php
@@ -36,6 +36,7 @@ namespace OCA\Files_External\AppInfo;
'resources' => array(
'global_storages' => array('url' => '/globalstorages'),
'user_storages' => array('url' => '/userstorages'),
+ 'user_global_storages' => array('url' => '/userglobalstorages'),
),
'routes' => array(
array(
diff --git a/apps/files_external/command/config.php b/apps/files_external/command/config.php
new file mode 100644
index 00000000000..6a57b2dd961
--- /dev/null
+++ b/apps/files_external/command/config.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files_external\Lib\StorageConfig;
+use OCA\Files_external\NotFoundException;
+use OCA\Files_external\Service\GlobalStoragesService;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Config extends Base {
+ /**
+ * @var GlobalStoragesService
+ */
+ protected $globalService;
+
+ function __construct(GlobalStoragesService $globalService) {
+ parent::__construct();
+ $this->globalService = $globalService;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('files_external:config')
+ ->setDescription('Manage backend configuration for a mount')
+ ->addArgument(
+ 'mount_id',
+ InputArgument::REQUIRED,
+ 'The id of the mount to edit'
+ )->addArgument(
+ 'key',
+ InputArgument::REQUIRED,
+ 'key of the config option to set/get'
+ )->addArgument(
+ 'value',
+ InputArgument::OPTIONAL,
+ 'value to set the config option to, when no value is provided the existing value will be printed'
+ );
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $mountId = $input->getArgument('mount_id');
+ $key = $input->getArgument('key');
+ try {
+ $mount = $this->globalService->getStorage($mountId);
+ } catch (NotFoundException $e) {
+ $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>');
+ return 404;
+ }
+
+ $value = $input->getArgument('value');
+ if ($value) {
+ $this->setOption($mount, $key, $value, $output);
+ } else {
+ $this->getOption($mount, $key, $output);
+ }
+ }
+
+ /**
+ * @param StorageConfig $mount
+ * @param string $key
+ * @param OutputInterface $output
+ */
+ protected function getOption(StorageConfig $mount, $key, OutputInterface $output) {
+ $value = $mount->getBackendOption($key);
+ if (!is_string($value)) { // show bools and objects correctly
+ $value = json_encode($value);
+ }
+ $output->writeln($value);
+ }
+
+ /**
+ * @param StorageConfig $mount
+ * @param string $key
+ * @param string $value
+ * @param OutputInterface $output
+ */
+ protected function setOption(StorageConfig $mount, $key, $value, OutputInterface $output) {
+ $decoded = json_decode($value, true);
+ if (!is_null($decoded)) {
+ $value = $decoded;
+ }
+ $mount->setBackendOption($key, $value);
+ $this->globalService->updateStorage($mount);
+ }
+}
diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php
new file mode 100644
index 00000000000..4c027ffcb8e
--- /dev/null
+++ b/apps/files_external/command/listcommand.php
@@ -0,0 +1,231 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files_external\Lib\StorageConfig;
+use OCA\Files_external\Service\GlobalStoragesService;
+use OCA\Files_external\Service\UserStoragesService;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ListCommand extends Base {
+ /**
+ * @var GlobalStoragesService
+ */
+ private $globalService;
+
+ /**
+ * @var UserStoragesService
+ */
+ private $userService;
+
+ /**
+ * @var IUserSession
+ */
+ private $userSession;
+
+ /**
+ * @var IUserManager
+ */
+ private $userManager;
+
+ function __construct(GlobalStoragesService $globalService, UserStoragesService $userService, IUserSession $userSession, IUserManager $userManager) {
+ parent::__construct();
+ $this->globalService = $globalService;
+ $this->userService = $userService;
+ $this->userSession = $userSession;
+ $this->userManager = $userManager;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('files_external:list')
+ ->setDescription('List configured mounts')
+ ->addArgument(
+ 'user_id',
+ InputArgument::OPTIONAL,
+ 'user id to list the personal mounts for, if no user is provided admin mounts will be listed'
+ )->addOption(
+ 'show-password',
+ null,
+ InputOption::VALUE_NONE,
+ 'show passwords and secrets'
+ )->addOption(
+ 'full',
+ null,
+ InputOption::VALUE_NONE,
+ 'don\'t truncate long values in table output'
+ );
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $userId = $input->getArgument('user_id');
+ if (!empty($userId)) {
+ $user = $this->userManager->get($userId);
+ if (is_null($user)) {
+ $output->writeln("<error>user $userId not found</error>");
+ return;
+ }
+ $this->userSession->setUser($user);
+ $storageService = $this->userService;
+ } else {
+ $storageService = $this->globalService;
+ }
+
+ /** @var $mounts StorageConfig[] */
+ $mounts = $storageService->getAllStorages();
+
+ if (count($mounts) === 0) {
+ if ($userId) {
+ $output->writeln("<info>No mounts configured by $userId</info>");
+ } else {
+ $output->writeln("<info>No admin mounts configured</info>");
+ }
+ return;
+ }
+
+ $headers = ['Mount ID', 'Mount Point', 'Storage', 'Authentication Type', 'Configuration', 'Options'];
+
+ if (!$userId) {
+ $headers[] = 'Applicable Users';
+ $headers[] = 'Applicable Groups';
+ }
+
+ if (!$input->getOption('show-password')) {
+ $hideKeys = ['password', 'refresh_token', 'token', 'client_secret', 'public_key', 'private_key'];
+ foreach ($mounts as $mount) {
+ $config = $mount->getBackendOptions();
+ foreach ($config as $key => $value) {
+ if (in_array($key, $hideKeys)) {
+ $mount->setBackendOption($key, '***');
+ }
+ }
+ }
+ }
+
+ $outputType = $input->getOption('output');
+ if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) {
+ $keys = array_map(function ($header) {
+ return strtolower(str_replace(' ', '_', $header));
+ }, $headers);
+
+ $pairs = array_map(function (StorageConfig $config) use ($keys, $userId) {
+ $values = [
+ $config->getId(),
+ $config->getMountPoint(),
+ $config->getBackend()->getStorageClass(),
+ $config->getAuthMechanism()->getScheme(),
+ $config->getBackendOptions(),
+ $config->getMountOptions()
+ ];
+ if (!$userId) {
+ $values[] = $config->getApplicableUsers();
+ $values[] = $config->getApplicableGroups();
+ }
+
+ return array_combine($keys, $values);
+ }, $mounts);
+ if ($outputType === self::OUTPUT_FORMAT_JSON) {
+ $output->writeln(json_encode(array_values($pairs)));
+ } else {
+ $output->writeln(json_encode(array_values($pairs), JSON_PRETTY_PRINT));
+ }
+ } else {
+ $full = $input->getOption('full');
+ $defaultMountOptions = [
+ 'encrypt' => true,
+ 'previews' => true,
+ 'filesystem_check_changes' => 1
+ ];
+ $rows = array_map(function (StorageConfig $config) use ($userId, $defaultMountOptions, $full) {
+ $storageConfig = $config->getBackendOptions();
+ $keys = array_keys($storageConfig);
+ $values = array_values($storageConfig);
+
+ if (!$full) {
+ $values = array_map(function ($value) {
+ if (is_string($value) && strlen($value) > 32) {
+ return substr($value, 0, 6) . '...' . substr($value, -6, 6);
+ } else {
+ return $value;
+ }
+ }, $values);
+ }
+
+ $configStrings = array_map(function ($key, $value) {
+ return $key . ': ' . json_encode($value);
+ }, $keys, $values);
+ $configString = implode(', ', $configStrings);
+
+ $mountOptions = $config->getMountOptions();
+ // hide defaults
+ foreach ($mountOptions as $key => $value) {
+ if ($value === $defaultMountOptions[$key]) {
+ unset($mountOptions[$key]);
+ }
+ }
+ $keys = array_keys($mountOptions);
+ $values = array_values($mountOptions);
+
+ $optionsStrings = array_map(function ($key, $value) {
+ return $key . ': ' . json_encode($value);
+ }, $keys, $values);
+ $optionsString = implode(', ', $optionsStrings);
+
+ $values = [
+ $config->getId(),
+ $config->getMountPoint(),
+ $config->getBackend()->getText(),
+ $config->getAuthMechanism()->getText(),
+ $configString,
+ $optionsString
+ ];
+
+ if (!$userId) {
+ $applicableUsers = implode(', ', $config->getApplicableUsers());
+ $applicableGroups = implode(', ', $config->getApplicableGroups());
+ if ($applicableUsers === '' && $applicableGroups === '') {
+ $applicableUsers = 'All';
+ }
+ $values[] = $applicableUsers;
+ $values[] = $applicableGroups;
+ }
+
+ return $values;
+ }, $mounts);
+
+ $table = new Table($output);
+ $table->setHeaders($headers);
+ $table->setRows($rows);
+ $table->render();
+ }
+ }
+}
diff --git a/apps/files_external/command/option.php b/apps/files_external/command/option.php
new file mode 100644
index 00000000000..64dafb8f6dc
--- /dev/null
+++ b/apps/files_external/command/option.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files_external\Lib\StorageConfig;
+use OCA\Files_external\Service\GlobalStoragesService;
+use OCA\Files_external\Service\UserStoragesService;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Option extends Config {
+ protected function configure() {
+ $this
+ ->setName('files_external:option')
+ ->setDescription('Manage mount options for a mount')
+ ->addArgument(
+ 'mount_id',
+ InputArgument::REQUIRED,
+ 'The id of the mount to edit'
+ )->addArgument(
+ 'key',
+ InputArgument::REQUIRED,
+ 'key of the mount option to set/get'
+ )->addArgument(
+ 'value',
+ InputArgument::OPTIONAL,
+ 'value to set the mount option to, when no value is provided the existing value will be printed'
+ );
+ }
+
+ /**
+ * @param StorageConfig $mount
+ * @param string $key
+ * @param OutputInterface $output
+ */
+ protected function getOption(StorageConfig $mount, $key, OutputInterface $output) {
+ $value = $mount->getMountOption($key);
+ if (!is_string($value)) { // show bools and objects correctly
+ $value = json_encode($value);
+ }
+ $output->writeln($value);
+ }
+
+ /**
+ * @param StorageConfig $mount
+ * @param string $key
+ * @param string $value
+ * @param OutputInterface $output
+ */
+ protected function setOption(StorageConfig $mount, $key, $value, OutputInterface $output) {
+ $decoded = json_decode($value, true);
+ if (!is_null($decoded)) {
+ $value = $decoded;
+ }
+ $mount->setMountOption($key, $value);
+ $this->globalService->updateStorage($mount);
+ }
+}
diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php
index 048f3588ed7..7712f9769c9 100644
--- a/apps/files_external/controller/storagescontroller.php
+++ b/apps/files_external/controller/storagescontroller.php
@@ -238,24 +238,38 @@ abstract class StoragesController extends Controller {
);
} catch (InsufficientDataForMeaningfulAnswerException $e) {
$storage->setStatus(
- \OC_Mount_Config::STATUS_INDETERMINATE,
+ StorageNotAvailableException::STATUS_INDETERMINATE,
$this->l10n->t('Insufficient data: %s', [$e->getMessage()])
);
} catch (StorageNotAvailableException $e) {
$storage->setStatus(
- \OC_Mount_Config::STATUS_ERROR,
- $e->getMessage()
+ $e->getCode(),
+ $this->l10n->t('%s', [$e->getMessage()])
);
} catch (\Exception $e) {
// FIXME: convert storage exceptions to StorageNotAvailableException
$storage->setStatus(
- \OC_Mount_Config::STATUS_ERROR,
+ StorageNotAvailableException::STATUS_ERROR,
get_class($e).': '.$e->getMessage()
);
}
}
/**
+ * Get all storage entries
+ *
+ * @return DataResponse
+ */
+ public function index() {
+ $storages = $this->service->getAllStorages();
+
+ return new DataResponse(
+ $storages,
+ Http::STATUS_OK
+ );
+ }
+
+ /**
* Get an external storage entry.
*
* @param int $id storage id
diff --git a/apps/files_external/controller/userglobalstoragescontroller.php b/apps/files_external/controller/userglobalstoragescontroller.php
new file mode 100644
index 00000000000..c6f777763e8
--- /dev/null
+++ b/apps/files_external/controller/userglobalstoragescontroller.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * @author Robin McCorkell <rmccorkell@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Controller;
+
+use \OCP\IRequest;
+use \OCP\IL10N;
+use \OCP\AppFramework\Http\DataResponse;
+use \OCP\AppFramework\Controller;
+use \OCP\AppFramework\Http;
+use \OCA\Files_external\Service\UserGlobalStoragesService;
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+use \OCA\Files_External\Lib\Backend\Backend;
+
+/**
+ * User global storages controller
+ */
+class UserGlobalStoragesController extends StoragesController {
+ /**
+ * Creates a new user global storages controller.
+ *
+ * @param string $AppName application name
+ * @param IRequest $request request object
+ * @param IL10N $l10n l10n service
+ * @param UserGlobalStoragesService $userGlobalStoragesService storage service
+ */
+ public function __construct(
+ $AppName,
+ IRequest $request,
+ IL10N $l10n,
+ UserGlobalStoragesService $userGlobalStoragesService
+ ) {
+ parent::__construct(
+ $AppName,
+ $request,
+ $l10n,
+ $userGlobalStoragesService
+ );
+ }
+
+ /**
+ * Get all storage entries
+ *
+ * @return DataResponse
+ *
+ * @NoAdminRequired
+ */
+ public function index() {
+ $storages = $this->service->getUniqueStorages();
+
+ // remove configuration data, this must be kept private
+ foreach ($storages as $storage) {
+ $this->sanitizeStorage($storage);
+ }
+
+ return new DataResponse(
+ $storages,
+ Http::STATUS_OK
+ );
+ }
+
+ /**
+ * Get an external storage entry.
+ *
+ * @param int $id storage id
+ * @return DataResponse
+ *
+ * @NoAdminRequired
+ */
+ public function show($id) {
+ try {
+ $storage = $this->service->getStorage($id);
+
+ $this->updateStorageStatus($storage);
+ } catch (NotFoundException $e) {
+ return new DataResponse(
+ [
+ 'message' => (string)$this->l10n->t('Storage with id "%i" not found', array($id))
+ ],
+ Http::STATUS_NOT_FOUND
+ );
+ }
+
+ $this->sanitizeStorage($storage);
+
+ return new DataResponse(
+ $storage,
+ Http::STATUS_OK
+ );
+ }
+
+ /**
+ * Remove sensitive data from a StorageConfig before returning it to the user
+ *
+ * @param StorageConfig $storage
+ */
+ protected function sanitizeStorage(StorageConfig $storage) {
+ $storage->setBackendOptions([]);
+ $storage->setMountOptions([]);
+ }
+
+}
diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css
index 35c7a395c58..c96c0cb97b9 100644
--- a/apps/files_external/css/settings.css
+++ b/apps/files_external/css/settings.css
@@ -1,4 +1,10 @@
-td.status > span {
+#externalStorage td.status {
+ /* overwrite conflicting core styles */
+ display: table-cell;
+ vertical-align: middle;
+}
+
+#externalStorage td.status > span {
display: inline-block;
height: 16px;
width: 16px;
diff --git a/apps/files_external/js/app.js b/apps/files_external/js/app.js
index 87507f93be3..d3ce2010ecd 100644
--- a/apps/files_external/js/app.js
+++ b/apps/files_external/js/app.js
@@ -54,7 +54,7 @@ OCA.External.App = {
// folder in the files app instead of opening it directly
fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
OCA.Files.App.setActiveView('files', {silent: true});
- OCA.Files.App.fileList.changeDirectory(context.$file.attr('data-path') + '/' + filename, true, true);
+ OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true);
});
fileActions.setDefault('dir', 'Open');
return fileActions;
diff --git a/apps/files_external/js/public_key.js b/apps/files_external/js/public_key.js
index a8546067452..5f9658381f0 100644
--- a/apps/files_external/js/public_key.js
+++ b/apps/files_external/js/public_key.js
@@ -1,10 +1,16 @@
$(document).ready(function() {
- OCA.External.Settings.mountConfig.whenSelectAuthMechanism(function($tr, authMechanism, scheme) {
+ OCA.External.Settings.mountConfig.whenSelectAuthMechanism(function($tr, authMechanism, scheme, onCompletion) {
if (scheme === 'publickey') {
var config = $tr.find('.configuration');
if ($(config).find('[name="public_key_generate"]').length === 0) {
setupTableRow($tr, config);
+ onCompletion.then(function() {
+ // If there's no private key, build one
+ if (0 === $(config).find('[data-parameter="private_key"]').val().length) {
+ generateKeys($tr);
+ }
+ });
}
}
});
@@ -22,10 +28,6 @@ $(document).ready(function() {
.attr('value', t('files_external', 'Generate keys'))
.attr('name', 'public_key_generate')
);
- // If there's no private key, build one
- if (0 === $(config).find('[data-parameter="private_key"]').val().length) {
- generateKeys(tr);
- }
}
function generateKeys(tr) {
@@ -33,7 +35,7 @@ $(document).ready(function() {
$.post(OC.filePath('files_external', 'ajax', 'public_key.php'), {}, function(result) {
if (result && result.status === 'success') {
- $(config).find('[data-parameter="public_key"]').val(result.data.public_key);
+ $(config).find('[data-parameter="public_key"]').val(result.data.public_key).keyup();
$(config).find('[data-parameter="private_key"]').val(result.data.private_key);
OCA.External.Settings.mountConfig.saveStorageConfig(tr, function() {
// Nothing to do
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index 22f18fc29e3..134db41fc32 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -460,7 +460,6 @@ MountOptionsDropdown.prototype = {
var $el = $(template());
this.$el = $el;
- $el.addClass('hidden');
this.setOptions(mountOptions, enabledOptions);
@@ -623,36 +622,7 @@ MountConfigListView.prototype = _.extend({
this._allBackends = this.$el.find('.selectBackend').data('configurations');
this._allAuthMechanisms = this.$el.find('#addMountPoint .authentication').data('mechanisms');
- //initialize hidden input field with list of users and groups
- this.$el.find('tr:not(#addMountPoint)').each(function(i,tr) {
- var $tr = $(tr);
- var $applicable = $tr.find('.applicable');
- if ($applicable.length > 0) {
- var groups = $applicable.data('applicable-groups');
- var groupsId = [];
- $.each(groups, function () {
- groupsId.push(this + '(group)');
- });
- var users = $applicable.data('applicable-users');
- if (users.indexOf('all') > -1 || users === '') {
- $tr.find('.applicableUsers').val('');
- } else {
- $tr.find('.applicableUsers').val(groupsId.concat(users).join(','));
- }
- }
- });
-
- addSelect2(this.$el.find('tr:not(#addMountPoint) .applicableUsers'), this._userListLimit);
- this.$el.tooltip({
- selector: '.status span',
- container: 'body'
- });
-
this._initEvents();
-
- this.$el.find('tbody tr:not(#addMountPoint)').each(function(i, tr) {
- self.recheckStorageConfig($(tr));
- });
},
/**
@@ -661,7 +631,7 @@ MountConfigListView.prototype = _.extend({
*/
whenSelectBackend: function(callback) {
this.$el.find('tbody tr:not(#addMountPoint)').each(function(i, tr) {
- var backend = $(tr).find('.backend').data('class');
+ var backend = $(tr).find('.backend').data('identifier');
callback($(tr), backend);
});
this.on('selectBackend', callback);
@@ -725,65 +695,41 @@ MountConfigListView.prototype = _.extend({
_onSelectBackend: function(event) {
var $target = $(event.target);
- var $el = this.$el;
var $tr = $target.closest('tr');
- $el.find('tbody').append($tr.clone());
- $el.find('tbody tr').last().find('.mountPoint input').val('');
- $tr.data('constructing', true);
- var selected = $target.find('option:selected').text();
- var backend = $target.val();
- $tr.find('.backend').text(selected);
- if ($tr.find('.mountPoint input').val() === '') {
- $tr.find('.mountPoint input').val(this._suggestMountPoint(selected));
- }
- $tr.addClass(backend);
- $tr.find('.backend').data('class', backend);
- var backendConfiguration = this._allBackends[backend];
-
- var selectAuthMechanism = $('<select class="selectAuthMechanism"></select>');
- $.each(this._allAuthMechanisms, function(authClass, authMechanism) {
- if (backendConfiguration['authSchemes'][authMechanism['scheme']]) {
- selectAuthMechanism.append(
- $('<option value="'+authClass+'" data-scheme="'+authMechanism['scheme']+'">'+authMechanism['name']+'</option>')
- );
- }
- });
- $tr.find('td.authentication').append(selectAuthMechanism);
-
- var $td = $tr.find('td.configuration');
- $.each(backendConfiguration['configuration'], _.partial(this.writeParameterInput, $td));
-
- this.trigger('selectBackend', $tr, backend);
-
- selectAuthMechanism.trigger('change'); // generate configuration parameters for auth mechanism
-
- var priorityEl = $('<input type="hidden" class="priority" value="' + backendConfiguration['priority'] + '" />');
- $tr.append(priorityEl);
- $td.children().not('[type=hidden]').first().focus();
- // FIXME default backend mount options
- $tr.find('input.mountOptions').val(JSON.stringify({
- 'encrypt': true,
- 'previews': true,
- 'filesystem_check_changes': 1
- }));
+ var storageConfig = new this._storageConfigClass();
+ storageConfig.mountPoint = $tr.find('.mountPoint input').val();
+ storageConfig.backend = $target.val();
+ $tr.find('.mountPoint input').val('');
- $tr.find('td').last().attr('class', 'remove');
- $tr.find('td.mountOptionsToggle').removeClass('hidden');
- $tr.find('td').last().removeAttr('style');
- $tr.removeAttr('id');
- $target.remove();
- addSelect2($tr.find('.applicableUsers'), this._userListLimit);
+ var onCompletion = jQuery.Deferred();
+ $tr = this.newStorage(storageConfig, onCompletion);
+ onCompletion.resolve();
- $tr.removeData('constructing');
+ $tr.find('td.configuration').children().not('[type=hidden]').first().focus();
this.saveStorageConfig($tr);
},
_onSelectAuthMechanism: function(event) {
var $target = $(event.target);
var $tr = $target.closest('tr');
-
var authMechanism = $target.val();
+
+ var onCompletion = jQuery.Deferred();
+ this.configureAuthMechanism($tr, authMechanism, onCompletion);
+ onCompletion.resolve();
+
+ this.saveStorageConfig($tr);
+ },
+
+ /**
+ * Configure the storage config with a new authentication mechanism
+ *
+ * @param {jQuery} $tr config row
+ * @param {string} authMechanism
+ * @param {jQuery.Deferred} onCompletion
+ */
+ configureAuthMechanism: function($tr, authMechanism, onCompletion) {
var authMechanismConfiguration = this._allAuthMechanisms[authMechanism];
var $td = $tr.find('td.configuration');
$td.find('.auth-param').remove();
@@ -793,15 +739,172 @@ MountConfigListView.prototype = _.extend({
));
this.trigger('selectAuthMechanism',
- $tr, authMechanism, authMechanismConfiguration['scheme']
+ $tr, authMechanism, authMechanismConfiguration['scheme'], onCompletion
);
+ },
+
+ /**
+ * Create a config row for a new storage
+ *
+ * @param {StorageConfig} storageConfig storage config to pull values from
+ * @param {jQuery.Deferred} onCompletion
+ * @return {jQuery} created row
+ */
+ newStorage: function(storageConfig, onCompletion) {
+ var mountPoint = storageConfig.mountPoint;
+ var backend = this._allBackends[storageConfig.backend];
+
+ // FIXME: Replace with a proper Handlebar template
+ var $tr = this.$el.find('tr#addMountPoint');
+ this.$el.find('tbody').append($tr.clone());
+
+ $tr.find('td').last().attr('class', 'remove');
+ $tr.find('td.mountOptionsToggle').removeClass('hidden');
+ $tr.find('td').last().removeAttr('style');
+ $tr.removeAttr('id');
+ $tr.find('select#selectBackend');
+ addSelect2($tr.find('.applicableUsers'), this._userListLimit);
+
+ if (storageConfig.id) {
+ $tr.data('id', storageConfig.id);
+ }
+
+ $tr.find('.backend').text(backend.name);
+ if (mountPoint === '') {
+ mountPoint = this._suggestMountPoint(backend.name);
+ }
+ $tr.find('.mountPoint input').val(mountPoint);
+ $tr.addClass(backend.identifier);
+ $tr.find('.backend').data('identifier', backend.identifier);
+
+ var selectAuthMechanism = $('<select class="selectAuthMechanism"></select>');
+ $.each(this._allAuthMechanisms, function(authIdentifier, authMechanism) {
+ if (backend.authSchemes[authMechanism.scheme]) {
+ selectAuthMechanism.append(
+ $('<option value="'+authMechanism.identifier+'" data-scheme="'+authMechanism.scheme+'">'+authMechanism.name+'</option>')
+ );
+ }
+ });
+ if (storageConfig.authMechanism) {
+ selectAuthMechanism.val(storageConfig.authMechanism);
+ } else {
+ storageConfig.authMechanism = selectAuthMechanism.val();
+ }
+ $tr.find('td.authentication').append(selectAuthMechanism);
+
+ var $td = $tr.find('td.configuration');
+ $.each(backend.configuration, _.partial(this.writeParameterInput, $td));
+
+ this.trigger('selectBackend', $tr, backend.identifier, onCompletion);
+ this.configureAuthMechanism($tr, storageConfig.authMechanism, onCompletion);
+
+ if (storageConfig.backendOptions) {
+ $td.children().each(function() {
+ var input = $(this);
+ var val = storageConfig.backendOptions[input.data('parameter')];
+ if (val !== undefined) {
+ input.val(storageConfig.backendOptions[input.data('parameter')]);
+ highlightInput(input);
+ }
+ });
+ }
+
+ var applicable = [];
+ if (storageConfig.applicableUsers) {
+ applicable = applicable.concat(storageConfig.applicableUsers);
+ }
+ if (storageConfig.applicableGroups) {
+ applicable = applicable.concat(
+ _.map(storageConfig.applicableGroups, function(group) {
+ return group+'(group)';
+ })
+ );
+ }
+ $tr.find('.applicableUsers').val(applicable).trigger('change');
+
+ var priorityEl = $('<input type="hidden" class="priority" value="' + backend.priority + '" />');
+ $tr.append(priorityEl);
- if ($tr.data('constructing') !== true) {
- // row is ready, trigger recheck
- this.saveStorageConfig($tr);
+ if (storageConfig.mountOptions) {
+ $tr.find('input.mountOptions').val(JSON.stringify(storageConfig.mountOptions));
+ } else {
+ // FIXME default backend mount options
+ $tr.find('input.mountOptions').val(JSON.stringify({
+ 'encrypt': true,
+ 'previews': true,
+ 'filesystem_check_changes': 1
+ }));
}
+
+ return $tr;
},
+ /**
+ * Load storages into config rows
+ */
+ loadStorages: function() {
+ var self = this;
+
+ if (this._isPersonal) {
+ // load userglobal storages
+ $.ajax({
+ type: 'GET',
+ url: OC.generateUrl('apps/files_external/userglobalstorages'),
+ contentType: 'application/json',
+ success: function(result) {
+ var onCompletion = jQuery.Deferred();
+ $.each(result, function(i, storageParams) {
+ storageParams.mountPoint = storageParams.mountPoint.substr(1); // trim leading slash
+ var storageConfig = new self._storageConfigClass();
+ _.extend(storageConfig, storageParams);
+ var $tr = self.newStorage(storageConfig, onCompletion);
+
+ // userglobal storages must be at the top of the list
+ $tr.detach();
+ self.$el.prepend($tr);
+
+ var $authentication = $tr.find('.authentication');
+ $authentication.text($authentication.find('select option:selected').text());
+
+ // userglobal storages do not expose configuration data
+ $tr.find('.configuration').text(t('files_external', 'Admin defined'));
+
+ // disable any other inputs
+ $tr.find('.mountOptionsToggle, .remove').empty();
+ $tr.find('input, select, button').attr('disabled', 'disabled');
+ });
+ onCompletion.resolve();
+ }
+ });
+ }
+
+ var url = this._storageConfigClass.prototype._url;
+
+ $.ajax({
+ type: 'GET',
+ url: OC.generateUrl(url),
+ contentType: 'application/json',
+ success: function(result) {
+ var onCompletion = jQuery.Deferred();
+ $.each(result, function(i, storageParams) {
+ storageParams.mountPoint = storageParams.mountPoint.substr(1); // trim leading slash
+ var storageConfig = new self._storageConfigClass();
+ _.extend(storageConfig, storageParams);
+ var $tr = self.newStorage(storageConfig, onCompletion);
+ self.recheckStorageConfig($tr);
+ });
+ onCompletion.resolve();
+ }
+ });
+ },
+
+ /**
+ * @param {jQuery} $td
+ * @param {string} parameter
+ * @param {string} placeholder
+ * @param {Array} classes
+ * @return {jQuery} newly created input
+ */
writeParameterInput: function($td, parameter, placeholder, classes) {
classes = $.isArray(classes) ? classes : [];
classes.push('added');
@@ -822,6 +925,7 @@ MountConfigListView.prototype = _.extend({
}
highlightInput(newElement);
$td.append(newElement);
+ return newElement;
},
/**
@@ -831,14 +935,14 @@ MountConfigListView.prototype = _.extend({
* @return {OCA.External.StorageConfig} storage model instance
*/
getStorageConfig: function($tr) {
- var storageId = parseInt($tr.attr('data-id'), 10);
+ var storageId = $tr.data('id');
if (!storageId) {
// new entry
storageId = null;
}
var storage = new this._storageConfigClass(storageId);
storage.mountPoint = $tr.find('.mountPoint input').val();
- storage.backend = $tr.find('.backend').data('class');
+ storage.backend = $tr.find('.backend').data('identifier');
storage.authMechanism = $tr.find('.selectAuthMechanism').val();
var classOptions = {};
@@ -951,8 +1055,8 @@ MountConfigListView.prototype = _.extend({
if (concurrentTimer === undefined
|| $tr.data('save-timer') === concurrentTimer
) {
- self.updateStatus($tr, result.status, result.statusMessage);
- $tr.attr('data-id', result.id);
+ self.updateStatus($tr, result.status);
+ $tr.data('id', result.id);
if (_.isFunction(callback)) {
callback(storage);
@@ -1106,6 +1210,7 @@ $(document).ready(function() {
var mountConfigListView = new MountConfigListView($('#externalStorage'), {
encryptionEnabled: encryptionEnabled
});
+ mountConfigListView.loadStorages();
$('#sslCertificate').on('click', 'td.remove>img', function() {
var $tr = $(this).closest('tr');
diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js
index b663657e029..f67309631e8 100644
--- a/apps/files_external/l10n/ast.js
+++ b/apps/files_external/l10n/ast.js
@@ -53,8 +53,8 @@ OC.L10N.register(
"Folder name" : "Nome de la carpeta",
"Configuration" : "Configuración",
"Available for" : "Disponible pa",
- "Delete" : "Desaniciar",
"Add storage" : "Amestar almacenamientu",
+ "Delete" : "Desaniciar",
"Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamientu esternu"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json
index 0e98fe5a24a..b4bc4355bc4 100644
--- a/apps/files_external/l10n/ast.json
+++ b/apps/files_external/l10n/ast.json
@@ -51,8 +51,8 @@
"Folder name" : "Nome de la carpeta",
"Configuration" : "Configuración",
"Available for" : "Disponible pa",
- "Delete" : "Desaniciar",
"Add storage" : "Amestar almacenamientu",
+ "Delete" : "Desaniciar",
"Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamientu esternu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/az.js b/apps/files_external/l10n/az.js
index 700e36a4aef..42c9a496185 100644
--- a/apps/files_external/l10n/az.js
+++ b/apps/files_external/l10n/az.js
@@ -57,9 +57,9 @@ OC.L10N.register(
"Folder name" : "Qovluq adı",
"Configuration" : "Konfiqurasiya",
"Available for" : "Üçün mövcuddur",
+ "Add storage" : "Deponu əlavə et",
"Advanced settings" : "İrəliləmiş quraşdırmalar",
"Delete" : "Sil",
- "Add storage" : "Deponu əlavə et",
"Allow users to mount the following external storage" : "Göstərilən kənar deponun bərkidilməsi üçün istifadəçilərə izin ver"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/az.json b/apps/files_external/l10n/az.json
index 6cccabb2dd6..4e01cdf954c 100644
--- a/apps/files_external/l10n/az.json
+++ b/apps/files_external/l10n/az.json
@@ -55,9 +55,9 @@
"Folder name" : "Qovluq adı",
"Configuration" : "Konfiqurasiya",
"Available for" : "Üçün mövcuddur",
+ "Add storage" : "Deponu əlavə et",
"Advanced settings" : "İrəliləmiş quraşdırmalar",
"Delete" : "Sil",
- "Add storage" : "Deponu əlavə et",
"Allow users to mount the following external storage" : "Göstərilən kənar deponun bərkidilməsi üçün istifadəçilərə izin ver"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/bg_BG.js b/apps/files_external/l10n/bg_BG.js
index f14b13d2a0e..cc52682f956 100644
--- a/apps/files_external/l10n/bg_BG.js
+++ b/apps/files_external/l10n/bg_BG.js
@@ -59,9 +59,9 @@ OC.L10N.register(
"Folder name" : "Име на папката",
"Configuration" : "Настройки",
"Available for" : "Достъпно за",
+ "Add storage" : "Добави дисково пространство",
"Advanced settings" : "Разширени настройки",
"Delete" : "Изтрий",
- "Add storage" : "Добави дисково пространство",
"Allow users to mount the following external storage" : "Разреши на потребителите да прикачват следното външно дисково пространство"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/bg_BG.json b/apps/files_external/l10n/bg_BG.json
index 6cce8fd5cfa..df3fe1c20e8 100644
--- a/apps/files_external/l10n/bg_BG.json
+++ b/apps/files_external/l10n/bg_BG.json
@@ -57,9 +57,9 @@
"Folder name" : "Име на папката",
"Configuration" : "Настройки",
"Available for" : "Достъпно за",
+ "Add storage" : "Добави дисково пространство",
"Advanced settings" : "Разширени настройки",
"Delete" : "Изтрий",
- "Add storage" : "Добави дисково пространство",
"Allow users to mount the following external storage" : "Разреши на потребителите да прикачват следното външно дисково пространство"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js
index b14057ea420..56c5f72abf9 100644
--- a/apps/files_external/l10n/ca.js
+++ b/apps/files_external/l10n/ca.js
@@ -66,9 +66,9 @@ OC.L10N.register(
"Folder name" : "Nom de la carpeta",
"Configuration" : "Configuració",
"Available for" : "Disponible per",
+ "Add storage" : "Afegeix emmagatzemament",
"Advanced settings" : "Configuració avançada",
"Delete" : "Esborra",
- "Add storage" : "Afegeix emmagatzemament",
"Allow users to mount the following external storage" : "Permet als usuaris muntar els dispositius externs següents"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json
index cce51970c18..7a166c3c011 100644
--- a/apps/files_external/l10n/ca.json
+++ b/apps/files_external/l10n/ca.json
@@ -64,9 +64,9 @@
"Folder name" : "Nom de la carpeta",
"Configuration" : "Configuració",
"Available for" : "Disponible per",
+ "Add storage" : "Afegeix emmagatzemament",
"Advanced settings" : "Configuració avançada",
"Delete" : "Esborra",
- "Add storage" : "Afegeix emmagatzemament",
"Allow users to mount the following external storage" : "Permet als usuaris muntar els dispositius externs següents"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js
index 3e9a14f9998..408d942a1c9 100644
--- a/apps/files_external/l10n/cs_CZ.js
+++ b/apps/files_external/l10n/cs_CZ.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Pokaždé když je použit souborový systém",
"All users. Type to select user or group." : "Všichni uživatelé. Začněte psát pro výběr uživatelů a skupin.",
"(group)" : "(skupina)",
+ "Admin defined" : "Nastaveno administrátorem",
"Saved" : "Uloženo",
"Access key" : "Přístupový klíč",
"Secret key" : "Tajný klíč",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "Ověření",
"Configuration" : "Nastavení",
"Available for" : "Dostupné pro",
+ "Add storage" : "Přidat úložiště",
"Advanced settings" : "Pokročilá nastavení",
"Delete" : "Smazat",
- "Add storage" : "Přidat úložiště",
"Allow users to mount external storage" : "Povolit uživatelům připojení externího úložiště",
"Allow users to mount the following external storage" : "Povolit uživatelů připojit následující externí úložiště"
},
diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json
index 4c6f940666e..746d5b5c2e6 100644
--- a/apps/files_external/l10n/cs_CZ.json
+++ b/apps/files_external/l10n/cs_CZ.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "Pokaždé když je použit souborový systém",
"All users. Type to select user or group." : "Všichni uživatelé. Začněte psát pro výběr uživatelů a skupin.",
"(group)" : "(skupina)",
+ "Admin defined" : "Nastaveno administrátorem",
"Saved" : "Uloženo",
"Access key" : "Přístupový klíč",
"Secret key" : "Tajný klíč",
@@ -97,9 +98,9 @@
"Authentication" : "Ověření",
"Configuration" : "Nastavení",
"Available for" : "Dostupné pro",
+ "Add storage" : "Přidat úložiště",
"Advanced settings" : "Pokročilá nastavení",
"Delete" : "Smazat",
- "Add storage" : "Přidat úložiště",
"Allow users to mount external storage" : "Povolit uživatelům připojení externího úložiště",
"Allow users to mount the following external storage" : "Povolit uživatelů připojit následující externí úložiště"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js
index ba5d572a206..dc86b6f1c06 100644
--- a/apps/files_external/l10n/da.js
+++ b/apps/files_external/l10n/da.js
@@ -98,9 +98,9 @@ OC.L10N.register(
"Authentication" : "Godkendelse",
"Configuration" : "Opsætning",
"Available for" : "Tilgængelig for",
+ "Add storage" : "Tilføj lager",
"Advanced settings" : "Avancerede indstillinger",
"Delete" : "Slet",
- "Add storage" : "Tilføj lager",
"Allow users to mount the following external storage" : "Tillad brugere at montere følgende som eksternt lager"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json
index c819040bc74..bb7961fbb2b 100644
--- a/apps/files_external/l10n/da.json
+++ b/apps/files_external/l10n/da.json
@@ -96,9 +96,9 @@
"Authentication" : "Godkendelse",
"Configuration" : "Opsætning",
"Available for" : "Tilgængelig for",
+ "Add storage" : "Tilføj lager",
"Advanced settings" : "Avancerede indstillinger",
"Delete" : "Slet",
- "Add storage" : "Tilføj lager",
"Allow users to mount the following external storage" : "Tillad brugere at montere følgende som eksternt lager"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index c26322495d6..8fbbee567a7 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -70,6 +70,7 @@ OC.L10N.register(
"SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
+ "Service name" : "Service Name",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich zur Installation an Deinen Systemadministrator.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.",
@@ -84,9 +85,10 @@ OC.L10N.register(
"Authentication" : "Authentifizierung",
"Configuration" : "Konfiguration",
"Available for" : "Verfügbar für",
+ "Add storage" : "Speicher hinzufügen",
"Advanced settings" : "Erweiterte Einstellungen",
"Delete" : "Löschen",
- "Add storage" : "Speicher hinzufügen",
- "Allow users to mount the following external storage" : "Erlaube es Benutzern, den folgenden externen Speicher einzubinden"
+ "Allow users to mount external storage" : "Benutzern erlauben, externen Speicher einzubinden",
+ "Allow users to mount the following external storage" : "Benutzern erlauben, den oder die folgenden externen Speicher einzubinden:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index adec32d072b..02e495251a8 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -68,6 +68,7 @@
"SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
+ "Service name" : "Service Name",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich zur Installation an Deinen Systemadministrator.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.",
@@ -82,9 +83,10 @@
"Authentication" : "Authentifizierung",
"Configuration" : "Konfiguration",
"Available for" : "Verfügbar für",
+ "Add storage" : "Speicher hinzufügen",
"Advanced settings" : "Erweiterte Einstellungen",
"Delete" : "Löschen",
- "Add storage" : "Speicher hinzufügen",
- "Allow users to mount the following external storage" : "Erlaube es Benutzern, den folgenden externen Speicher einzubinden"
+ "Allow users to mount external storage" : "Benutzern erlauben, externen Speicher einzubinden",
+ "Allow users to mount the following external storage" : "Benutzern erlauben, den oder die folgenden externen Speicher einzubinden:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index c30fcb95919..06ead3b9716 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -7,10 +7,12 @@ OC.L10N.register(
"Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden",
"Invalid mount point" : "Ungültiger mount point",
"Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“",
+ "Insufficient data: %s" : "Unzureichende Daten: %s",
"Personal" : "Persönlich",
"System" : "System",
"Grant access" : "Zugriff gestatten",
"Access granted" : "Zugriff gestattet",
+ "Error configuring OAuth1" : "Fehler beim Konfigurieren von OAuth1",
"Generate keys" : "Schlüssel erzeugen",
"Error generating key pair" : "Fehler beim Erzeugen des Schlüsselpaares",
"Enable encryption" : "Verschlüsselung aktivieren",
@@ -30,6 +32,7 @@ OC.L10N.register(
"Username" : "Benutzername",
"Password" : "Passwort",
"API key" : "API-Schlüssel",
+ "Username and password" : "Benutzername und Passwort",
"Public key" : "Öffentlicher Schlüssel",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
@@ -43,17 +46,23 @@ OC.L10N.register(
"Remote subfolder" : "Entfernter Unterordner",
"Secure https://" : "Sicheres https://",
"Dropbox" : "Dropbox",
+ "FTP" : "FTP",
"Host" : "Host",
"Secure ftps://" : "Sicheres ftps://",
+ "Google Drive" : "Google Drive",
"Local" : "Lokal",
"Location" : "Ort",
"ownCloud" : "ownCloud",
+ "SFTP" : "SFTP",
"Root" : "Root",
"SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel",
+ "SMB / CIFS" : "SMB / CIFS",
"Share" : "Share",
+ "Domain" : "Domain",
"SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
+ "Service name" : "Dienst Name",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.",
@@ -67,9 +76,10 @@ OC.L10N.register(
"Folder name" : "Ordnername",
"Configuration" : "Konfiguration",
"Available for" : "Verfügbar für",
+ "Add storage" : "Speicher hinzufügen",
"Advanced settings" : "Erweiterte Einstellungen",
"Delete" : "Löschen",
- "Add storage" : "Speicher hinzufügen",
- "Allow users to mount the following external storage" : "Erlauben Sie Benutzern, folgende externe Speicher einzubinden"
+ "Allow users to mount external storage" : "Erlauben Sie den Benutzern externen Speicher hinzuzufügen",
+ "Allow users to mount the following external storage" : "Benutzern erlauben, den oder die folgenden externen Speicher einzubinden:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index 7fec06bf90f..8e19cb9333d 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -5,10 +5,12 @@
"Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden",
"Invalid mount point" : "Ungültiger mount point",
"Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“",
+ "Insufficient data: %s" : "Unzureichende Daten: %s",
"Personal" : "Persönlich",
"System" : "System",
"Grant access" : "Zugriff gestatten",
"Access granted" : "Zugriff gestattet",
+ "Error configuring OAuth1" : "Fehler beim Konfigurieren von OAuth1",
"Generate keys" : "Schlüssel erzeugen",
"Error generating key pair" : "Fehler beim Erzeugen des Schlüsselpaares",
"Enable encryption" : "Verschlüsselung aktivieren",
@@ -28,6 +30,7 @@
"Username" : "Benutzername",
"Password" : "Passwort",
"API key" : "API-Schlüssel",
+ "Username and password" : "Benutzername und Passwort",
"Public key" : "Öffentlicher Schlüssel",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
@@ -41,17 +44,23 @@
"Remote subfolder" : "Entfernter Unterordner",
"Secure https://" : "Sicheres https://",
"Dropbox" : "Dropbox",
+ "FTP" : "FTP",
"Host" : "Host",
"Secure ftps://" : "Sicheres ftps://",
+ "Google Drive" : "Google Drive",
"Local" : "Lokal",
"Location" : "Ort",
"ownCloud" : "ownCloud",
+ "SFTP" : "SFTP",
"Root" : "Root",
"SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel",
+ "SMB / CIFS" : "SMB / CIFS",
"Share" : "Share",
+ "Domain" : "Domain",
"SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
+ "Service name" : "Dienst Name",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.",
@@ -65,9 +74,10 @@
"Folder name" : "Ordnername",
"Configuration" : "Konfiguration",
"Available for" : "Verfügbar für",
+ "Add storage" : "Speicher hinzufügen",
"Advanced settings" : "Erweiterte Einstellungen",
"Delete" : "Löschen",
- "Add storage" : "Speicher hinzufügen",
- "Allow users to mount the following external storage" : "Erlauben Sie Benutzern, folgende externe Speicher einzubinden"
+ "Allow users to mount external storage" : "Erlauben Sie den Benutzern externen Speicher hinzuzufügen",
+ "Allow users to mount the following external storage" : "Benutzern erlauben, den oder die folgenden externen Speicher einzubinden:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js
index a83c241af7a..294ec9da6ff 100644
--- a/apps/files_external/l10n/el.js
+++ b/apps/files_external/l10n/el.js
@@ -99,9 +99,9 @@ OC.L10N.register(
"Authentication" : "Πιστοποίηση",
"Configuration" : "Ρυθμίσεις",
"Available for" : "Διαθέσιμο για",
+ "Add storage" : "Προσθηκη αποθηκευσης",
"Advanced settings" : "Ρυθμίσεις για προχωρημένους",
"Delete" : "Διαγραφή",
- "Add storage" : "Προσθηκη αποθηκευσης",
"Allow users to mount external storage" : "Να επιτρέπεται στους χρήστες η σύνδεση εξωτερικού χώρου",
"Allow users to mount the following external storage" : "Χορήγηση άδειας στους χρήστες να συνδέσουν τα παρακάτω εξωτερικά μέσα αποθήκευσης"
},
diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json
index 32f223cf8c0..431e81c3d7a 100644
--- a/apps/files_external/l10n/el.json
+++ b/apps/files_external/l10n/el.json
@@ -97,9 +97,9 @@
"Authentication" : "Πιστοποίηση",
"Configuration" : "Ρυθμίσεις",
"Available for" : "Διαθέσιμο για",
+ "Add storage" : "Προσθηκη αποθηκευσης",
"Advanced settings" : "Ρυθμίσεις για προχωρημένους",
"Delete" : "Διαγραφή",
- "Add storage" : "Προσθηκη αποθηκευσης",
"Allow users to mount external storage" : "Να επιτρέπεται στους χρήστες η σύνδεση εξωτερικού χώρου",
"Allow users to mount the following external storage" : "Χορήγηση άδειας στους χρήστες να συνδέσουν τα παρακάτω εξωτερικά μέσα αποθήκευσης"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/en_GB.js b/apps/files_external/l10n/en_GB.js
index 9829bd3e8c7..9efc720eb18 100644
--- a/apps/files_external/l10n/en_GB.js
+++ b/apps/files_external/l10n/en_GB.js
@@ -67,9 +67,9 @@ OC.L10N.register(
"Folder name" : "Folder name",
"Configuration" : "Configuration",
"Available for" : "Available for",
+ "Add storage" : "Add storage",
"Advanced settings" : "Advanced settings",
"Delete" : "Delete",
- "Add storage" : "Add storage",
"Allow users to mount the following external storage" : "Allow users to mount the following external storage"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/en_GB.json b/apps/files_external/l10n/en_GB.json
index 88467528431..87deeec5989 100644
--- a/apps/files_external/l10n/en_GB.json
+++ b/apps/files_external/l10n/en_GB.json
@@ -65,9 +65,9 @@
"Folder name" : "Folder name",
"Configuration" : "Configuration",
"Available for" : "Available for",
+ "Add storage" : "Add storage",
"Advanced settings" : "Advanced settings",
"Delete" : "Delete",
- "Add storage" : "Add storage",
"Allow users to mount the following external storage" : "Allow users to mount the following external storage"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/eo.js b/apps/files_external/l10n/eo.js
index ce3dd21c012..ddab2360a6d 100644
--- a/apps/files_external/l10n/eo.js
+++ b/apps/files_external/l10n/eo.js
@@ -38,8 +38,8 @@ OC.L10N.register(
"Folder name" : "Dosierujnomo",
"Configuration" : "Agordo",
"Available for" : "Disponebla por",
- "Delete" : "Forigi",
"Add storage" : "Aldoni memorilon",
+ "Delete" : "Forigi",
"Allow users to mount the following external storage" : "Permesi uzantojn munti la jenajn malenajn memorilojn"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/eo.json b/apps/files_external/l10n/eo.json
index d8c620d24c2..ec91f40abac 100644
--- a/apps/files_external/l10n/eo.json
+++ b/apps/files_external/l10n/eo.json
@@ -36,8 +36,8 @@
"Folder name" : "Dosierujnomo",
"Configuration" : "Agordo",
"Available for" : "Disponebla por",
- "Delete" : "Forigi",
"Add storage" : "Aldoni memorilon",
+ "Delete" : "Forigi",
"Allow users to mount the following external storage" : "Permesi uzantojn munti la jenajn malenajn memorilojn"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js
index 5415e8963cd..46de520f55e 100644
--- a/apps/files_external/l10n/es.js
+++ b/apps/files_external/l10n/es.js
@@ -85,9 +85,9 @@ OC.L10N.register(
"Authentication" : "Autenticación",
"Configuration" : "Configuración",
"Available for" : "Disponible para",
+ "Add storage" : "Añadir almacenamiento",
"Advanced settings" : "Configuración avanzada",
"Delete" : "Eliminar",
- "Add storage" : "Añadir almacenamiento",
"Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamiento externo"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json
index 10cbf0c974a..3748040fdd4 100644
--- a/apps/files_external/l10n/es.json
+++ b/apps/files_external/l10n/es.json
@@ -83,9 +83,9 @@
"Authentication" : "Autenticación",
"Configuration" : "Configuración",
"Available for" : "Disponible para",
+ "Add storage" : "Añadir almacenamiento",
"Advanced settings" : "Configuración avanzada",
"Delete" : "Eliminar",
- "Add storage" : "Añadir almacenamiento",
"Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamiento externo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/es_AR.js b/apps/files_external/l10n/es_AR.js
index fd242104c8c..7fb87f1a1d3 100644
--- a/apps/files_external/l10n/es_AR.js
+++ b/apps/files_external/l10n/es_AR.js
@@ -22,7 +22,7 @@ OC.L10N.register(
"External Storage" : "Almacenamiento externo",
"Folder name" : "Nombre de la carpeta",
"Configuration" : "Configuración",
- "Delete" : "Borrar",
- "Add storage" : "Añadir almacenamiento"
+ "Add storage" : "Añadir almacenamiento",
+ "Delete" : "Borrar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/es_AR.json b/apps/files_external/l10n/es_AR.json
index d9e91a3af47..9fb735f7a3a 100644
--- a/apps/files_external/l10n/es_AR.json
+++ b/apps/files_external/l10n/es_AR.json
@@ -20,7 +20,7 @@
"External Storage" : "Almacenamiento externo",
"Folder name" : "Nombre de la carpeta",
"Configuration" : "Configuración",
- "Delete" : "Borrar",
- "Add storage" : "Añadir almacenamiento"
+ "Add storage" : "Añadir almacenamiento",
+ "Delete" : "Borrar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/es_MX.js b/apps/files_external/l10n/es_MX.js
index 9682e360a58..c805ce16662 100644
--- a/apps/files_external/l10n/es_MX.js
+++ b/apps/files_external/l10n/es_MX.js
@@ -21,7 +21,7 @@ OC.L10N.register(
"External Storage" : "Almacenamiento externo",
"Folder name" : "Nombre de la carpeta",
"Configuration" : "Configuración",
- "Delete" : "Eliminar",
- "Add storage" : "Añadir almacenamiento"
+ "Add storage" : "Añadir almacenamiento",
+ "Delete" : "Eliminar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/es_MX.json b/apps/files_external/l10n/es_MX.json
index 81b2f408d11..1df9bf70436 100644
--- a/apps/files_external/l10n/es_MX.json
+++ b/apps/files_external/l10n/es_MX.json
@@ -19,7 +19,7 @@
"External Storage" : "Almacenamiento externo",
"Folder name" : "Nombre de la carpeta",
"Configuration" : "Configuración",
- "Delete" : "Eliminar",
- "Add storage" : "Añadir almacenamiento"
+ "Add storage" : "Añadir almacenamiento",
+ "Delete" : "Eliminar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js
index ae66daa37a6..fa22b4c6591 100644
--- a/apps/files_external/l10n/et_EE.js
+++ b/apps/files_external/l10n/et_EE.js
@@ -77,9 +77,9 @@ OC.L10N.register(
"Authentication" : "Autentimine",
"Configuration" : "Seadistamine",
"Available for" : "Saadaval",
+ "Add storage" : "Lisa andmehoidla",
"Advanced settings" : "Lisavalikud",
"Delete" : "Kustuta",
- "Add storage" : "Lisa andmehoidla",
"Allow users to mount the following external storage" : "Võimalda kasutajatel ühendada järgmist välist andmehoidlat"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json
index f2cc31e46e1..37e7cc282ce 100644
--- a/apps/files_external/l10n/et_EE.json
+++ b/apps/files_external/l10n/et_EE.json
@@ -75,9 +75,9 @@
"Authentication" : "Autentimine",
"Configuration" : "Seadistamine",
"Available for" : "Saadaval",
+ "Add storage" : "Lisa andmehoidla",
"Advanced settings" : "Lisavalikud",
"Delete" : "Kustuta",
- "Add storage" : "Lisa andmehoidla",
"Allow users to mount the following external storage" : "Võimalda kasutajatel ühendada järgmist välist andmehoidlat"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/eu.js b/apps/files_external/l10n/eu.js
index 599229a92b3..58742552e76 100644
--- a/apps/files_external/l10n/eu.js
+++ b/apps/files_external/l10n/eu.js
@@ -52,8 +52,8 @@ OC.L10N.register(
"Folder name" : "Karpetaren izena",
"Configuration" : "Konfigurazioa",
"Available for" : "Hauentzat eskuragarri",
- "Delete" : "Ezabatu",
"Add storage" : "Gehitu biltegiratzea",
+ "Delete" : "Ezabatu",
"Allow users to mount the following external storage" : "Baimendu erabiltzaileak hurrengo kanpo biltegiratzeak muntatzen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/eu.json b/apps/files_external/l10n/eu.json
index 5a568893060..f039441b464 100644
--- a/apps/files_external/l10n/eu.json
+++ b/apps/files_external/l10n/eu.json
@@ -50,8 +50,8 @@
"Folder name" : "Karpetaren izena",
"Configuration" : "Konfigurazioa",
"Available for" : "Hauentzat eskuragarri",
- "Delete" : "Ezabatu",
"Add storage" : "Gehitu biltegiratzea",
+ "Delete" : "Ezabatu",
"Allow users to mount the following external storage" : "Baimendu erabiltzaileak hurrengo kanpo biltegiratzeak muntatzen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/fa.js b/apps/files_external/l10n/fa.js
index a18f7cdcf5c..0c1076fc994 100644
--- a/apps/files_external/l10n/fa.js
+++ b/apps/files_external/l10n/fa.js
@@ -57,8 +57,8 @@ OC.L10N.register(
"Authentication" : "احراز هویت",
"Configuration" : "پیکربندی",
"Available for" : "در دسترس برای",
+ "Add storage" : "اضافه کردن حافظه",
"Advanced settings" : "تنظیمات پیشرفته",
- "Delete" : "حذف",
- "Add storage" : "اضافه کردن حافظه"
+ "Delete" : "حذف"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/fa.json b/apps/files_external/l10n/fa.json
index 4bc16f72f54..056bad259a6 100644
--- a/apps/files_external/l10n/fa.json
+++ b/apps/files_external/l10n/fa.json
@@ -55,8 +55,8 @@
"Authentication" : "احراز هویت",
"Configuration" : "پیکربندی",
"Available for" : "در دسترس برای",
+ "Add storage" : "اضافه کردن حافظه",
"Advanced settings" : "تنظیمات پیشرفته",
- "Delete" : "حذف",
- "Add storage" : "اضافه کردن حافظه"
+ "Delete" : "حذف"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js
index f91dec93310..5a2c3a9aa66 100644
--- a/apps/files_external/l10n/fi_FI.js
+++ b/apps/files_external/l10n/fi_FI.js
@@ -76,9 +76,9 @@ OC.L10N.register(
"Authentication" : "Tunnistautuminen",
"Configuration" : "Asetukset",
"Available for" : "Saatavuus",
+ "Add storage" : "Lisää tallennustila",
"Advanced settings" : "Lisäasetukset",
"Delete" : "Poista",
- "Add storage" : "Lisää tallennustila",
"Allow users to mount external storage" : "Salli käyttäjien liittää erillisiä tallennustiloja",
"Allow users to mount the following external storage" : "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet"
},
diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json
index a2033b4c578..d2a8cf16278 100644
--- a/apps/files_external/l10n/fi_FI.json
+++ b/apps/files_external/l10n/fi_FI.json
@@ -74,9 +74,9 @@
"Authentication" : "Tunnistautuminen",
"Configuration" : "Asetukset",
"Available for" : "Saatavuus",
+ "Add storage" : "Lisää tallennustila",
"Advanced settings" : "Lisäasetukset",
"Delete" : "Poista",
- "Add storage" : "Lisää tallennustila",
"Allow users to mount external storage" : "Salli käyttäjien liittää erillisiä tallennustiloja",
"Allow users to mount the following external storage" : "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index 1389cd1233b..8ff4fcdfdd9 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Chaque fois que le système de fichiers est utilisé",
"All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.",
"(group)" : "(groupe)",
+ "Admin defined" : "Défini par l'administrateur",
"Saved" : "Sauvegardé",
"Access key" : "Clé d'accès",
"Secret key" : "Clé secrète",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "Authentification",
"Configuration" : "Configuration",
"Available for" : "Disponible pour",
+ "Add storage" : "Ajouter un support de stockage",
"Advanced settings" : "Paramètres avancés",
"Delete" : "Supprimer",
- "Add storage" : "Ajouter un support de stockage",
"Allow users to mount external storage" : "Autoriser les utilisateurs à monter des espaces de stockage externes",
"Allow users to mount the following external storage" : "Autoriser les utilisateurs à monter les stockages externes suivants"
},
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 9d078bf13fc..9a610bd964b 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "Chaque fois que le système de fichiers est utilisé",
"All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.",
"(group)" : "(groupe)",
+ "Admin defined" : "Défini par l'administrateur",
"Saved" : "Sauvegardé",
"Access key" : "Clé d'accès",
"Secret key" : "Clé secrète",
@@ -97,9 +98,9 @@
"Authentication" : "Authentification",
"Configuration" : "Configuration",
"Available for" : "Disponible pour",
+ "Add storage" : "Ajouter un support de stockage",
"Advanced settings" : "Paramètres avancés",
"Delete" : "Supprimer",
- "Add storage" : "Ajouter un support de stockage",
"Allow users to mount external storage" : "Autoriser les utilisateurs à monter des espaces de stockage externes",
"Allow users to mount the following external storage" : "Autoriser les utilisateurs à monter les stockages externes suivants"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js
index 5827a6ab57f..044b7c34df1 100644
--- a/apps/files_external/l10n/gl.js
+++ b/apps/files_external/l10n/gl.js
@@ -67,9 +67,9 @@ OC.L10N.register(
"Folder name" : "Nome do cartafol",
"Configuration" : "Configuración",
"Available for" : "Dispoñíbel para",
+ "Add storage" : "Engadir almacenamento",
"Advanced settings" : "Axustes avanzados",
"Delete" : "Eliminar",
- "Add storage" : "Engadir almacenamento",
"Allow users to mount the following external storage" : "Permitirlle aos usuarios montar o seguinte almacenamento externo"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json
index 29dde23c329..143b9a53b43 100644
--- a/apps/files_external/l10n/gl.json
+++ b/apps/files_external/l10n/gl.json
@@ -65,9 +65,9 @@
"Folder name" : "Nome do cartafol",
"Configuration" : "Configuración",
"Available for" : "Dispoñíbel para",
+ "Add storage" : "Engadir almacenamento",
"Advanced settings" : "Axustes avanzados",
"Delete" : "Eliminar",
- "Add storage" : "Engadir almacenamento",
"Allow users to mount the following external storage" : "Permitirlle aos usuarios montar o seguinte almacenamento externo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/hr.js b/apps/files_external/l10n/hr.js
index 4ab71f76ffb..8c632eba518 100644
--- a/apps/files_external/l10n/hr.js
+++ b/apps/files_external/l10n/hr.js
@@ -50,8 +50,8 @@ OC.L10N.register(
"Folder name" : "Naziv mape",
"Configuration" : "Konfiguracija",
"Available for" : "Dostupno za",
- "Delete" : "Izbrišite",
"Add storage" : "Dodajte spremište",
+ "Delete" : "Izbrišite",
"Allow users to mount the following external storage" : "Dopustite korisnicima postavljanje sljedećeg vanjskog spremišta"
},
"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_external/l10n/hr.json b/apps/files_external/l10n/hr.json
index e8b8dcd3f61..610a42d46e2 100644
--- a/apps/files_external/l10n/hr.json
+++ b/apps/files_external/l10n/hr.json
@@ -48,8 +48,8 @@
"Folder name" : "Naziv mape",
"Configuration" : "Konfiguracija",
"Available for" : "Dostupno za",
- "Delete" : "Izbrišite",
"Add storage" : "Dodajte spremište",
+ "Delete" : "Izbrišite",
"Allow users to mount the following external storage" : "Dopustite korisnicima postavljanje sljedećeg vanjskog spremišta"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/hu_HU.js b/apps/files_external/l10n/hu_HU.js
index 0a307f8a609..964c28285fd 100644
--- a/apps/files_external/l10n/hu_HU.js
+++ b/apps/files_external/l10n/hu_HU.js
@@ -39,7 +39,7 @@ OC.L10N.register(
"Folder name" : "Mappanév",
"Configuration" : "Beállítások",
"Available for" : "Elérhető számukra",
- "Delete" : "Törlés",
- "Add storage" : "Tároló becsatolása"
+ "Add storage" : "Tároló becsatolása",
+ "Delete" : "Törlés"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/hu_HU.json b/apps/files_external/l10n/hu_HU.json
index 4012c0eb490..7942028d038 100644
--- a/apps/files_external/l10n/hu_HU.json
+++ b/apps/files_external/l10n/hu_HU.json
@@ -37,7 +37,7 @@
"Folder name" : "Mappanév",
"Configuration" : "Beállítások",
"Available for" : "Elérhető számukra",
- "Delete" : "Törlés",
- "Add storage" : "Tároló becsatolása"
+ "Add storage" : "Tároló becsatolása",
+ "Delete" : "Törlés"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/hy.js b/apps/files_external/l10n/hy.js
index 9996681f88b..1092d48d575 100644
--- a/apps/files_external/l10n/hy.js
+++ b/apps/files_external/l10n/hy.js
@@ -2,11 +2,14 @@ OC.L10N.register(
"files_external",
{
"Personal" : "Անձնական",
+ "Never" : "Երբեք",
+ "Username" : "Օգտանուն",
"Password" : "Գաղտնաբառ",
"URL" : "URL",
"Dropbox" : "Dropbox",
"Share" : "Կիսվել",
"Name" : "Անուն",
+ "Folder name" : "Պանակի անուն",
"Delete" : "Ջնջել"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/hy.json b/apps/files_external/l10n/hy.json
index ac5a0edf013..1fecd4f3da1 100644
--- a/apps/files_external/l10n/hy.json
+++ b/apps/files_external/l10n/hy.json
@@ -1,10 +1,13 @@
{ "translations": {
"Personal" : "Անձնական",
+ "Never" : "Երբեք",
+ "Username" : "Օգտանուն",
"Password" : "Գաղտնաբառ",
"URL" : "URL",
"Dropbox" : "Dropbox",
"Share" : "Կիսվել",
"Name" : "Անուն",
+ "Folder name" : "Պանակի անուն",
"Delete" : "Ջնջել"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js
index b01e13e6085..1029ff8e3c7 100644
--- a/apps/files_external/l10n/id.js
+++ b/apps/files_external/l10n/id.js
@@ -98,9 +98,9 @@ OC.L10N.register(
"Authentication" : "Otentikasi",
"Configuration" : "Konfigurasi",
"Available for" : "Tersedia untuk",
+ "Add storage" : "Tambahkan penyimpanan",
"Advanced settings" : "Pengaturan Lanjutan",
"Delete" : "Hapus",
- "Add storage" : "Tambahkan penyimpanan",
"Allow users to mount the following external storage" : "Izinkan pengguna untuk mengaitkan penyimpanan eksternal berikut"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json
index 383850199ac..acaf37381bc 100644
--- a/apps/files_external/l10n/id.json
+++ b/apps/files_external/l10n/id.json
@@ -96,9 +96,9 @@
"Authentication" : "Otentikasi",
"Configuration" : "Konfigurasi",
"Available for" : "Tersedia untuk",
+ "Add storage" : "Tambahkan penyimpanan",
"Advanced settings" : "Pengaturan Lanjutan",
"Delete" : "Hapus",
- "Add storage" : "Tambahkan penyimpanan",
"Allow users to mount the following external storage" : "Izinkan pengguna untuk mengaitkan penyimpanan eksternal berikut"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js
index 8e126abe93b..2bc1d6db3c8 100644
--- a/apps/files_external/l10n/it.js
+++ b/apps/files_external/l10n/it.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Ogni volta che il filesystem viene utilizzato",
"All users. Type to select user or group." : "Tutti gli utenti. Digita per selezionare utente o gruppo.",
"(group)" : "(gruppo)",
+ "Admin defined" : "Definito dall'amministratore",
"Saved" : "Salvato",
"Access key" : "Chiave di accesso",
"Secret key" : "Chiave segreta",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "Autenticazione",
"Configuration" : "Configurazione",
"Available for" : "Disponibile per",
+ "Add storage" : "Aggiungi archiviazione",
"Advanced settings" : "Impostazioni avanzate",
"Delete" : "Elimina",
- "Add storage" : "Aggiungi archiviazione",
"Allow users to mount external storage" : "Consenti agli utenti di montare archiviazioni esterne",
"Allow users to mount the following external storage" : "Consenti agli utenti di montare la seguente archiviazione esterna"
},
diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json
index e21cf5973d2..e719f29dcd4 100644
--- a/apps/files_external/l10n/it.json
+++ b/apps/files_external/l10n/it.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "Ogni volta che il filesystem viene utilizzato",
"All users. Type to select user or group." : "Tutti gli utenti. Digita per selezionare utente o gruppo.",
"(group)" : "(gruppo)",
+ "Admin defined" : "Definito dall'amministratore",
"Saved" : "Salvato",
"Access key" : "Chiave di accesso",
"Secret key" : "Chiave segreta",
@@ -97,9 +98,9 @@
"Authentication" : "Autenticazione",
"Configuration" : "Configurazione",
"Available for" : "Disponibile per",
+ "Add storage" : "Aggiungi archiviazione",
"Advanced settings" : "Impostazioni avanzate",
"Delete" : "Elimina",
- "Add storage" : "Aggiungi archiviazione",
"Allow users to mount external storage" : "Consenti agli utenti di montare archiviazioni esterne",
"Allow users to mount the following external storage" : "Consenti agli utenti di montare la seguente archiviazione esterna"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js
index 4481c7fdd2e..5518f6afa78 100644
--- a/apps/files_external/l10n/ja.js
+++ b/apps/files_external/l10n/ja.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "ファイルシステム利用時には毎回",
"All users. Type to select user or group." : "すべてのユーザー。ユーザー、グループを追加",
"(group)" : "(グループ)",
+ "Admin defined" : "管理者設定済",
"Saved" : "保存されました",
"Access key" : "アクセスキー",
"Secret key" : "シークレットキー",
@@ -72,7 +73,7 @@ OC.L10N.register(
"Secure ftps://" : "Secure ftps://",
"Google Drive" : "Google Drive",
"Local" : "ローカル",
- "Location" : "位置",
+ "Location" : "場所",
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "ルート",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "認証",
"Configuration" : "設定",
"Available for" : "利用可能",
+ "Add storage" : "ストレージを追加",
"Advanced settings" : "詳細設定",
"Delete" : "削除",
- "Add storage" : "ストレージを追加",
"Allow users to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
"Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する"
},
diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json
index 5573c11fe84..8134ed16cd5 100644
--- a/apps/files_external/l10n/ja.json
+++ b/apps/files_external/l10n/ja.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "ファイルシステム利用時には毎回",
"All users. Type to select user or group." : "すべてのユーザー。ユーザー、グループを追加",
"(group)" : "(グループ)",
+ "Admin defined" : "管理者設定済",
"Saved" : "保存されました",
"Access key" : "アクセスキー",
"Secret key" : "シークレットキー",
@@ -70,7 +71,7 @@
"Secure ftps://" : "Secure ftps://",
"Google Drive" : "Google Drive",
"Local" : "ローカル",
- "Location" : "位置",
+ "Location" : "場所",
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "ルート",
@@ -97,9 +98,9 @@
"Authentication" : "認証",
"Configuration" : "設定",
"Available for" : "利用可能",
+ "Add storage" : "ストレージを追加",
"Advanced settings" : "詳細設定",
"Delete" : "削除",
- "Add storage" : "ストレージを追加",
"Allow users to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
"Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/files_external/l10n/ka_GE.js b/apps/files_external/l10n/ka_GE.js
index 824295cb93d..e82c778862e 100644
--- a/apps/files_external/l10n/ka_GE.js
+++ b/apps/files_external/l10n/ka_GE.js
@@ -21,7 +21,7 @@ OC.L10N.register(
"External Storage" : "ექსტერნალ საცავი",
"Folder name" : "ფოლდერის სახელი",
"Configuration" : "კონფიგურაცია",
- "Delete" : "წაშლა",
- "Add storage" : "საცავის დამატება"
+ "Add storage" : "საცავის დამატება",
+ "Delete" : "წაშლა"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/ka_GE.json b/apps/files_external/l10n/ka_GE.json
index 73ad2cfd0c5..a706d42225b 100644
--- a/apps/files_external/l10n/ka_GE.json
+++ b/apps/files_external/l10n/ka_GE.json
@@ -19,7 +19,7 @@
"External Storage" : "ექსტერნალ საცავი",
"Folder name" : "ფოლდერის სახელი",
"Configuration" : "კონფიგურაცია",
- "Delete" : "წაშლა",
- "Add storage" : "საცავის დამატება"
+ "Add storage" : "საცავის დამატება",
+ "Delete" : "წაშლა"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/km.js b/apps/files_external/l10n/km.js
index 7a5c6cb86c8..e5aad9697ae 100644
--- a/apps/files_external/l10n/km.js
+++ b/apps/files_external/l10n/km.js
@@ -19,7 +19,7 @@ OC.L10N.register(
"External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ",
"Folder name" : "ឈ្មោះ​ថត",
"Configuration" : "ការ​កំណត់​សណ្ឋាន",
- "Delete" : "លុប",
- "Add storage" : "បន្ថែម​ឃ្លាំងផ្ទុក"
+ "Add storage" : "បន្ថែម​ឃ្លាំងផ្ទុក",
+ "Delete" : "លុប"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/km.json b/apps/files_external/l10n/km.json
index 0375b5bfee2..71213394d53 100644
--- a/apps/files_external/l10n/km.json
+++ b/apps/files_external/l10n/km.json
@@ -17,7 +17,7 @@
"External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ",
"Folder name" : "ឈ្មោះ​ថត",
"Configuration" : "ការ​កំណត់​សណ្ឋាន",
- "Delete" : "លុប",
- "Add storage" : "បន្ថែម​ឃ្លាំងផ្ទុក"
+ "Add storage" : "បន្ថែម​ឃ្លាំងផ្ទុក",
+ "Delete" : "លុប"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js
index 9028a3e2986..0eaac8aee4d 100644
--- a/apps/files_external/l10n/ko.js
+++ b/apps/files_external/l10n/ko.js
@@ -99,9 +99,9 @@ OC.L10N.register(
"Authentication" : "인증",
"Configuration" : "설정",
"Available for" : "다음으로 사용 가능",
+ "Add storage" : "저장소 추가",
"Advanced settings" : "고급 설정",
"Delete" : "삭제",
- "Add storage" : "저장소 추가",
"Allow users to mount external storage" : "사용자가 외부 저장소를 마운트하도록 허용",
"Allow users to mount the following external storage" : "사용자가 다음 외부 저장소를 마운트할 수 있도록 허용"
},
diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json
index d27fdfcae30..7f63ba793e7 100644
--- a/apps/files_external/l10n/ko.json
+++ b/apps/files_external/l10n/ko.json
@@ -97,9 +97,9 @@
"Authentication" : "인증",
"Configuration" : "설정",
"Available for" : "다음으로 사용 가능",
+ "Add storage" : "저장소 추가",
"Advanced settings" : "고급 설정",
"Delete" : "삭제",
- "Add storage" : "저장소 추가",
"Allow users to mount external storage" : "사용자가 외부 저장소를 마운트하도록 허용",
"Allow users to mount the following external storage" : "사용자가 다음 외부 저장소를 마운트할 수 있도록 허용"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/files_external/l10n/lt_LT.js b/apps/files_external/l10n/lt_LT.js
index b6d334d792d..0efbfa333b8 100644
--- a/apps/files_external/l10n/lt_LT.js
+++ b/apps/files_external/l10n/lt_LT.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"files_external",
{
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Nepavyko atsiųsti užklausos žymės. Patikrinkite savo programos raktą ir paslaptį.",
"External storage" : "Išorinė saugykla",
"Personal" : "Asmeniniai",
"Grant access" : "Suteikti priėjimą",
@@ -22,7 +23,7 @@ OC.L10N.register(
"External Storage" : "Išorinės saugyklos",
"Folder name" : "Katalogo pavadinimas",
"Configuration" : "Konfigūracija",
- "Delete" : "Ištrinti",
- "Add storage" : "Pridėti saugyklą"
+ "Add storage" : "Pridėti saugyklą",
+ "Delete" : "Ištrinti"
},
"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_external/l10n/lt_LT.json b/apps/files_external/l10n/lt_LT.json
index f1c46b145ee..13c1543748f 100644
--- a/apps/files_external/l10n/lt_LT.json
+++ b/apps/files_external/l10n/lt_LT.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Nepavyko atsiųsti užklausos žymės. Patikrinkite savo programos raktą ir paslaptį.",
"External storage" : "Išorinė saugykla",
"Personal" : "Asmeniniai",
"Grant access" : "Suteikti priėjimą",
@@ -20,7 +21,7 @@
"External Storage" : "Išorinės saugyklos",
"Folder name" : "Katalogo pavadinimas",
"Configuration" : "Konfigūracija",
- "Delete" : "Ištrinti",
- "Add storage" : "Pridėti saugyklą"
+ "Add storage" : "Pridėti saugyklą",
+ "Delete" : "Ištrinti"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/lv.js b/apps/files_external/l10n/lv.js
index 6590706fa2a..d6733a1d9c0 100644
--- a/apps/files_external/l10n/lv.js
+++ b/apps/files_external/l10n/lv.js
@@ -21,7 +21,7 @@ OC.L10N.register(
"External Storage" : "Ārējā krātuve",
"Folder name" : "Mapes nosaukums",
"Configuration" : "Konfigurācija",
- "Delete" : "Dzēst",
- "Add storage" : "Pievienot krātuvi"
+ "Add storage" : "Pievienot krātuvi",
+ "Delete" : "Dzēst"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/files_external/l10n/lv.json b/apps/files_external/l10n/lv.json
index 4e27db77737..57fe7cbc048 100644
--- a/apps/files_external/l10n/lv.json
+++ b/apps/files_external/l10n/lv.json
@@ -19,7 +19,7 @@
"External Storage" : "Ārējā krātuve",
"Folder name" : "Mapes nosaukums",
"Configuration" : "Konfigurācija",
- "Delete" : "Dzēst",
- "Add storage" : "Pievienot krātuvi"
+ "Add storage" : "Pievienot krātuvi",
+ "Delete" : "Dzēst"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/nb_NO.js b/apps/files_external/l10n/nb_NO.js
index ecafac048c0..0e9e2dd24ce 100644
--- a/apps/files_external/l10n/nb_NO.js
+++ b/apps/files_external/l10n/nb_NO.js
@@ -98,9 +98,9 @@ OC.L10N.register(
"Authentication" : "Autentisering",
"Configuration" : "Konfigurasjon",
"Available for" : "Tilgjengelig for",
+ "Add storage" : "Legg til lagringsplass",
"Advanced settings" : "Avanserte innstillinger",
"Delete" : "Slett",
- "Add storage" : "Legg til lagringsplass",
"Allow users to mount the following external storage" : "Tillat brukere å koble opp følgende eksterne lagring"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/nb_NO.json b/apps/files_external/l10n/nb_NO.json
index 9a7a2ae6287..ddf5221e955 100644
--- a/apps/files_external/l10n/nb_NO.json
+++ b/apps/files_external/l10n/nb_NO.json
@@ -96,9 +96,9 @@
"Authentication" : "Autentisering",
"Configuration" : "Konfigurasjon",
"Available for" : "Tilgjengelig for",
+ "Add storage" : "Legg til lagringsplass",
"Advanced settings" : "Avanserte innstillinger",
"Delete" : "Slett",
- "Add storage" : "Legg til lagringsplass",
"Allow users to mount the following external storage" : "Tillat brukere å koble opp følgende eksterne lagring"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/nds.js b/apps/files_external/l10n/nds.js
index f7f1da30c60..b9417b4a4d5 100644
--- a/apps/files_external/l10n/nds.js
+++ b/apps/files_external/l10n/nds.js
@@ -93,9 +93,9 @@ OC.L10N.register(
"Authentication" : "Authentifizierung",
"Configuration" : "Konfiguration",
"Available for" : "Verfügbar für",
+ "Add storage" : "Speicher hinzufügen",
"Advanced settings" : "Erweiterte Einstellungen",
"Delete" : "Löschen",
- "Add storage" : "Speicher hinzufügen",
"Allow users to mount the following external storage" : "Erlaube Benutzern folgenden externen Speicher einzuhängen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/nds.json b/apps/files_external/l10n/nds.json
index bfadfc0c123..dd1ca770ebd 100644
--- a/apps/files_external/l10n/nds.json
+++ b/apps/files_external/l10n/nds.json
@@ -91,9 +91,9 @@
"Authentication" : "Authentifizierung",
"Configuration" : "Konfiguration",
"Available for" : "Verfügbar für",
+ "Add storage" : "Speicher hinzufügen",
"Advanced settings" : "Erweiterte Einstellungen",
"Delete" : "Löschen",
- "Add storage" : "Speicher hinzufügen",
"Allow users to mount the following external storage" : "Erlaube Benutzern folgenden externen Speicher einzuhängen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js
index 57481ce4176..05d1a3f6de5 100644
--- a/apps/files_external/l10n/nl.js
+++ b/apps/files_external/l10n/nl.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Elke keer bij gebruik bestandssysteem",
"All users. Type to select user or group." : "Alle gebruikers. Tikken om een gebruiker of groep te selecteren.",
"(group)" : "(groep)",
+ "Admin defined" : "Beheerder gedefinieerd",
"Saved" : "Bewaard",
"Access key" : "Access Key",
"Secret key" : "Geheime sleutel",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "Authenticatie",
"Configuration" : "Configuratie",
"Available for" : "Beschikbaar voor",
+ "Add storage" : "Toevoegen opslag",
"Advanced settings" : "Geavanceerde instellingen",
"Delete" : "Verwijder",
- "Add storage" : "Toevoegen opslag",
"Allow users to mount external storage" : "Sta gebruikers toe om een externe opslag aan te koppelen",
"Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen"
},
diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json
index fc80c3bbb2c..e30870e4ae1 100644
--- a/apps/files_external/l10n/nl.json
+++ b/apps/files_external/l10n/nl.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "Elke keer bij gebruik bestandssysteem",
"All users. Type to select user or group." : "Alle gebruikers. Tikken om een gebruiker of groep te selecteren.",
"(group)" : "(groep)",
+ "Admin defined" : "Beheerder gedefinieerd",
"Saved" : "Bewaard",
"Access key" : "Access Key",
"Secret key" : "Geheime sleutel",
@@ -97,9 +98,9 @@
"Authentication" : "Authenticatie",
"Configuration" : "Configuratie",
"Available for" : "Beschikbaar voor",
+ "Add storage" : "Toevoegen opslag",
"Advanced settings" : "Geavanceerde instellingen",
"Delete" : "Verwijder",
- "Add storage" : "Toevoegen opslag",
"Allow users to mount external storage" : "Sta gebruikers toe om een externe opslag aan te koppelen",
"Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/oc.js b/apps/files_external/l10n/oc.js
index a45aebf81ba..a212c9a5179 100644
--- a/apps/files_external/l10n/oc.js
+++ b/apps/files_external/l10n/oc.js
@@ -99,9 +99,9 @@ OC.L10N.register(
"Authentication" : "Autentificacion",
"Configuration" : "Configuracion",
"Available for" : "Disponible per",
+ "Add storage" : "Apondre un supòrt d'emmagazinatge",
"Advanced settings" : "Paramètres avançats",
"Delete" : "Suprimir",
- "Add storage" : "Apondre un supòrt d'emmagazinatge",
"Allow users to mount external storage" : "Autorizar los utilizaires a montar l'espaci d'emmagazinatge extèrne",
"Allow users to mount the following external storage" : "Autorizar los utilizaires a montar los emmagazinatges extèrnes seguents"
},
diff --git a/apps/files_external/l10n/oc.json b/apps/files_external/l10n/oc.json
index c49326a955f..a7d51dd8ad0 100644
--- a/apps/files_external/l10n/oc.json
+++ b/apps/files_external/l10n/oc.json
@@ -97,9 +97,9 @@
"Authentication" : "Autentificacion",
"Configuration" : "Configuracion",
"Available for" : "Disponible per",
+ "Add storage" : "Apondre un supòrt d'emmagazinatge",
"Advanced settings" : "Paramètres avançats",
"Delete" : "Suprimir",
- "Add storage" : "Apondre un supòrt d'emmagazinatge",
"Allow users to mount external storage" : "Autorizar los utilizaires a montar l'espaci d'emmagazinatge extèrne",
"Allow users to mount the following external storage" : "Autorizar los utilizaires a montar los emmagazinatges extèrnes seguents"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js
index 1f7cc6b1979..99de2703433 100644
--- a/apps/files_external/l10n/pl.js
+++ b/apps/files_external/l10n/pl.js
@@ -67,9 +67,9 @@ OC.L10N.register(
"Folder name" : "Nazwa folderu",
"Configuration" : "Konfiguracja",
"Available for" : "Dostępne przez",
+ "Add storage" : "Dodaj zasoby dyskowe",
"Advanced settings" : "Ustawienia zaawansowane",
"Delete" : "Usuń",
- "Add storage" : "Dodaj zasoby dyskowe",
"Allow users to mount the following external storage" : "Pozwól użytkownikom montować następujące zewnętrzne zasoby dyskowe"
},
"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_external/l10n/pl.json b/apps/files_external/l10n/pl.json
index 5b5059a5d18..258811f2d81 100644
--- a/apps/files_external/l10n/pl.json
+++ b/apps/files_external/l10n/pl.json
@@ -65,9 +65,9 @@
"Folder name" : "Nazwa folderu",
"Configuration" : "Konfiguracja",
"Available for" : "Dostępne przez",
+ "Add storage" : "Dodaj zasoby dyskowe",
"Advanced settings" : "Ustawienia zaawansowane",
"Delete" : "Usuń",
- "Add storage" : "Dodaj zasoby dyskowe",
"Allow users to mount the following external storage" : "Pozwól użytkownikom montować następujące zewnętrzne zasoby dyskowe"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js
index 92bc16355d3..0d4f04ae226 100644
--- a/apps/files_external/l10n/pt_BR.js
+++ b/apps/files_external/l10n/pt_BR.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Toda vez que o sistema de arquivos é usado",
"All users. Type to select user or group." : "Todos os usuários. Digite para selecionar usuário ou grupo.",
"(group)" : "(grupo)",
+ "Admin defined" : "Definido pelo administrador",
"Saved" : "Salvo",
"Access key" : "Chave da acesso",
"Secret key" : "Chave secreta",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
"Available for" : "Disponível para",
+ "Add storage" : "Adicionar Armazenamento",
"Advanced settings" : "Configurações avançadas",
"Delete" : "Excluir",
- "Add storage" : "Adicionar Armazenamento",
"Allow users to mount external storage" : "Permitir que usuários montem armazenamento externo",
"Allow users to mount the following external storage" : "Permitir que usuários montem o seguinte armazenamento externo"
},
diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json
index bb6e0a96cff..d49e818ea0f 100644
--- a/apps/files_external/l10n/pt_BR.json
+++ b/apps/files_external/l10n/pt_BR.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "Toda vez que o sistema de arquivos é usado",
"All users. Type to select user or group." : "Todos os usuários. Digite para selecionar usuário ou grupo.",
"(group)" : "(grupo)",
+ "Admin defined" : "Definido pelo administrador",
"Saved" : "Salvo",
"Access key" : "Chave da acesso",
"Secret key" : "Chave secreta",
@@ -97,9 +98,9 @@
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
"Available for" : "Disponível para",
+ "Add storage" : "Adicionar Armazenamento",
"Advanced settings" : "Configurações avançadas",
"Delete" : "Excluir",
- "Add storage" : "Adicionar Armazenamento",
"Allow users to mount external storage" : "Permitir que usuários montem armazenamento externo",
"Allow users to mount the following external storage" : "Permitir que usuários montem o seguinte armazenamento externo"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index 4e8b3245e66..f6c3254de0b 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -92,9 +92,9 @@ OC.L10N.register(
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
"Available for" : "Disponível para ",
+ "Add storage" : "Adicionar armazenamento",
"Advanced settings" : "Definições avançadas",
"Delete" : "Apagar",
- "Add storage" : "Adicionar armazenamento",
"Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index 51333429106..ec22394470e 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -90,9 +90,9 @@
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
"Available for" : "Disponível para ",
+ "Add storage" : "Adicionar armazenamento",
"Advanced settings" : "Definições avançadas",
"Delete" : "Apagar",
- "Add storage" : "Adicionar armazenamento",
"Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/ro.js b/apps/files_external/l10n/ro.js
index d8ba040824c..cc3a065a21d 100644
--- a/apps/files_external/l10n/ro.js
+++ b/apps/files_external/l10n/ro.js
@@ -29,8 +29,8 @@ OC.L10N.register(
"External Storage" : "Stocare externă",
"Folder name" : "Denumire director",
"Configuration" : "Configurație",
- "Delete" : "Șterge",
"Add storage" : "Adauga stocare",
+ "Delete" : "Șterge",
"Allow users to mount the following external storage" : "Permite utilizatorilor să monteze următoarea unitate de stocare"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/files_external/l10n/ro.json b/apps/files_external/l10n/ro.json
index cbe2826def4..2f1f8e32883 100644
--- a/apps/files_external/l10n/ro.json
+++ b/apps/files_external/l10n/ro.json
@@ -27,8 +27,8 @@
"External Storage" : "Stocare externă",
"Folder name" : "Denumire director",
"Configuration" : "Configurație",
- "Delete" : "Șterge",
"Add storage" : "Adauga stocare",
+ "Delete" : "Șterge",
"Allow users to mount the following external storage" : "Permite utilizatorilor să monteze următoarea unitate de stocare"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index 5550ea780ab..6fbfe273557 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Not permitted to use authentication mechanism \"%s\"" : "Не допускается использование механизма авторизации \"%s\"",
"Unsatisfied backend parameters" : "Недопустимые настройки бэкенда",
"Unsatisfied authentication mechanism parameters" : "Недопустимые настройки механизма авторизации",
+ "Insufficient data: %s" : "Недостаточно данных: %s",
"Personal" : "Личное",
"System" : "Система",
"Grant access" : "Предоставить доступ",
@@ -98,9 +99,10 @@ OC.L10N.register(
"Authentication" : "Авторизация",
"Configuration" : "Конфигурация",
"Available for" : "Доступно для",
+ "Add storage" : "Добавить хранилище",
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
- "Add storage" : "Добавить хранилище",
+ "Allow users to mount external storage" : "Разрешить пользователями монтировать внешние накопители",
"Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index 52792a3f09a..12a62259f50 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -14,6 +14,7 @@
"Not permitted to use authentication mechanism \"%s\"" : "Не допускается использование механизма авторизации \"%s\"",
"Unsatisfied backend parameters" : "Недопустимые настройки бэкенда",
"Unsatisfied authentication mechanism parameters" : "Недопустимые настройки механизма авторизации",
+ "Insufficient data: %s" : "Недостаточно данных: %s",
"Personal" : "Личное",
"System" : "Система",
"Grant access" : "Предоставить доступ",
@@ -96,9 +97,10 @@
"Authentication" : "Авторизация",
"Configuration" : "Конфигурация",
"Available for" : "Доступно для",
+ "Add storage" : "Добавить хранилище",
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
- "Add storage" : "Добавить хранилище",
+ "Allow users to mount external storage" : "Разрешить пользователями монтировать внешние накопители",
"Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/sk_SK.js b/apps/files_external/l10n/sk_SK.js
index 41f9c866196..7485625455c 100644
--- a/apps/files_external/l10n/sk_SK.js
+++ b/apps/files_external/l10n/sk_SK.js
@@ -97,9 +97,9 @@ OC.L10N.register(
"Authentication" : "Autentifikácia",
"Configuration" : "Nastavenia",
"Available for" : "K dispozícii pre",
+ "Add storage" : "Pridať úložisko",
"Advanced settings" : "Rozšírené nastavenia",
"Delete" : "Zmazať",
- "Add storage" : "Pridať úložisko",
"Allow users to mount the following external storage" : "Povoliť používateľom pripojiť tieto externé úložiská"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_external/l10n/sk_SK.json b/apps/files_external/l10n/sk_SK.json
index 4072136fa53..9ed60285b2d 100644
--- a/apps/files_external/l10n/sk_SK.json
+++ b/apps/files_external/l10n/sk_SK.json
@@ -95,9 +95,9 @@
"Authentication" : "Autentifikácia",
"Configuration" : "Nastavenia",
"Available for" : "K dispozícii pre",
+ "Add storage" : "Pridať úložisko",
"Advanced settings" : "Rozšírené nastavenia",
"Delete" : "Zmazať",
- "Add storage" : "Pridať úložisko",
"Allow users to mount the following external storage" : "Povoliť používateľom pripojiť tieto externé úložiská"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js
index f9513a5f11c..846f1d0095a 100644
--- a/apps/files_external/l10n/sl.js
+++ b/apps/files_external/l10n/sl.js
@@ -67,9 +67,9 @@ OC.L10N.register(
"Folder name" : "Ime mape",
"Configuration" : "Nastavitve",
"Available for" : "Na voljo za",
+ "Add storage" : "Dodaj shrambo",
"Advanced settings" : "Napredne nastavitve",
"Delete" : "Izbriši",
- "Add storage" : "Dodaj shrambo",
"Allow users to mount the following external storage" : "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb."
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json
index ca97f27b234..aa7145180e4 100644
--- a/apps/files_external/l10n/sl.json
+++ b/apps/files_external/l10n/sl.json
@@ -65,9 +65,9 @@
"Folder name" : "Ime mape",
"Configuration" : "Nastavitve",
"Available for" : "Na voljo za",
+ "Add storage" : "Dodaj shrambo",
"Advanced settings" : "Napredne nastavitve",
"Delete" : "Izbriši",
- "Add storage" : "Dodaj shrambo",
"Allow users to mount the following external storage" : "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb."
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/sq.js b/apps/files_external/l10n/sq.js
index f8e5c5a27dc..535831268b9 100644
--- a/apps/files_external/l10n/sq.js
+++ b/apps/files_external/l10n/sq.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Sa herë që përdoret sistemi i kartelave",
"All users. Type to select user or group." : "Krejt përdoruesit. Shtypni që të përzgjidhet përdorues ose grup.",
"(group)" : "(grup)",
+ "Admin defined" : "Përcaktuar nga përgjegjësi",
"Saved" : "U ruajt",
"Access key" : "Kyç hyrjesh",
"Secret key" : "Kyç i fshehtë",
@@ -47,6 +48,7 @@ OC.L10N.register(
"OpenStack" : "OpenStack",
"Username" : "Emër përdoruesi",
"Password" : "Fjalëkalim",
+ "Tenant name" : "Emër qiraxhiu",
"Rackspace" : "Rackspace",
"API key" : "Kyç API",
"Username and password" : "Emër përdoruesi dhe fjalëkalim",
@@ -97,9 +99,9 @@ OC.L10N.register(
"Authentication" : "Mirëfilltësim",
"Configuration" : "Formësim",
"Available for" : "E gatshme për",
+ "Add storage" : "Shtoni depozitë",
"Advanced settings" : "Rregullime të mëtejshme",
"Delete" : "Fshije",
- "Add storage" : "Shtoni depozitë",
"Allow users to mount external storage" : "Lejoju përdoruesve të montojnë depozita të jashtme",
"Allow users to mount the following external storage" : "Lejoju përdoruesve të montojnë depozitën e jashtme vijuese"
},
diff --git a/apps/files_external/l10n/sq.json b/apps/files_external/l10n/sq.json
index 0da8e9406bb..2acb3cbc606 100644
--- a/apps/files_external/l10n/sq.json
+++ b/apps/files_external/l10n/sq.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "Sa herë që përdoret sistemi i kartelave",
"All users. Type to select user or group." : "Krejt përdoruesit. Shtypni që të përzgjidhet përdorues ose grup.",
"(group)" : "(grup)",
+ "Admin defined" : "Përcaktuar nga përgjegjësi",
"Saved" : "U ruajt",
"Access key" : "Kyç hyrjesh",
"Secret key" : "Kyç i fshehtë",
@@ -45,6 +46,7 @@
"OpenStack" : "OpenStack",
"Username" : "Emër përdoruesi",
"Password" : "Fjalëkalim",
+ "Tenant name" : "Emër qiraxhiu",
"Rackspace" : "Rackspace",
"API key" : "Kyç API",
"Username and password" : "Emër përdoruesi dhe fjalëkalim",
@@ -95,9 +97,9 @@
"Authentication" : "Mirëfilltësim",
"Configuration" : "Formësim",
"Available for" : "E gatshme për",
+ "Add storage" : "Shtoni depozitë",
"Advanced settings" : "Rregullime të mëtejshme",
"Delete" : "Fshije",
- "Add storage" : "Shtoni depozitë",
"Allow users to mount external storage" : "Lejoju përdoruesve të montojnë depozita të jashtme",
"Allow users to mount the following external storage" : "Lejoju përdoruesve të montojnë depozitën e jashtme vijuese"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js
index 02596d8ab22..add0cc4dab7 100644
--- a/apps/files_external/l10n/sr.js
+++ b/apps/files_external/l10n/sr.js
@@ -66,9 +66,9 @@ OC.L10N.register(
"Folder name" : "Назив фасцикле",
"Configuration" : "Подешавање",
"Available for" : "Доступно за",
+ "Add storage" : "Додај складиште",
"Advanced settings" : "Напредне поставке",
"Delete" : "Обриши",
- "Add storage" : "Додај складиште",
"Allow users to mount the following external storage" : "Дозволи корисницима да монтирају следећа спољашња складишта"
},
"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_external/l10n/sr.json b/apps/files_external/l10n/sr.json
index f1c12eeb0f7..3e7ac487280 100644
--- a/apps/files_external/l10n/sr.json
+++ b/apps/files_external/l10n/sr.json
@@ -64,9 +64,9 @@
"Folder name" : "Назив фасцикле",
"Configuration" : "Подешавање",
"Available for" : "Доступно за",
+ "Add storage" : "Додај складиште",
"Advanced settings" : "Напредне поставке",
"Delete" : "Обриши",
- "Add storage" : "Додај складиште",
"Allow users to mount the following external storage" : "Дозволи корисницима да монтирају следећа спољашња складишта"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/sr@latin.js b/apps/files_external/l10n/sr@latin.js
index 880a33c1614..0420189571c 100644
--- a/apps/files_external/l10n/sr@latin.js
+++ b/apps/files_external/l10n/sr@latin.js
@@ -48,8 +48,8 @@ OC.L10N.register(
"Folder name" : "Ime fascikle",
"Configuration" : "Podešavanje",
"Available for" : "Dostupno za",
- "Delete" : "Obriši",
"Add storage" : "Dodaj skladište",
+ "Delete" : "Obriši",
"Allow users to mount the following external storage" : "Omogući korisnicima da namontiraju sledeće spoljašnje skladište"
},
"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_external/l10n/sr@latin.json b/apps/files_external/l10n/sr@latin.json
index 760100867eb..3320ab2c863 100644
--- a/apps/files_external/l10n/sr@latin.json
+++ b/apps/files_external/l10n/sr@latin.json
@@ -46,8 +46,8 @@
"Folder name" : "Ime fascikle",
"Configuration" : "Podešavanje",
"Available for" : "Dostupno za",
- "Delete" : "Obriši",
"Add storage" : "Dodaj skladište",
+ "Delete" : "Obriši",
"Allow users to mount the following external storage" : "Omogući korisnicima da namontiraju sledeće spoljašnje skladište"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js
index 09786533e87..f20b96caed8 100644
--- a/apps/files_external/l10n/sv.js
+++ b/apps/files_external/l10n/sv.js
@@ -53,8 +53,8 @@ OC.L10N.register(
"Folder name" : "Mappnamn",
"Configuration" : "Konfiguration",
"Available for" : "Tillgänglig för",
- "Delete" : "Radera",
"Add storage" : "Lägg till lagring",
+ "Delete" : "Radera",
"Allow users to mount the following external storage" : "Tillåt användare att montera följande extern lagring"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json
index ddb7439cb8d..cd3dc13296d 100644
--- a/apps/files_external/l10n/sv.json
+++ b/apps/files_external/l10n/sv.json
@@ -51,8 +51,8 @@
"Folder name" : "Mappnamn",
"Configuration" : "Konfiguration",
"Available for" : "Tillgänglig för",
- "Delete" : "Radera",
"Add storage" : "Lägg till lagring",
+ "Delete" : "Radera",
"Allow users to mount the following external storage" : "Tillåt användare att montera följande extern lagring"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js
index 55611a5531d..6c1efa5aacd 100644
--- a/apps/files_external/l10n/th_TH.js
+++ b/apps/files_external/l10n/th_TH.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "ทุกครั้งที่แฟ้มระบบถูกใช้งาน",
"All users. Type to select user or group." : "ผู้ใช้ทุกคน พิมพ์เพื่อเลือกผู้ใช้หรือกลุ่ม",
"(group)" : "(กลุ่ม)",
+ "Admin defined" : "ถูกกำหนดโดยผู้ดูแลระบบ",
"Saved" : "บันทึกแล้ว",
"Access key" : "คีย์การเข้าถึง",
"Secret key" : "คีย์ลับ",
@@ -99,9 +100,9 @@ OC.L10N.register(
"Authentication" : "รับรองความถูกต้อง",
"Configuration" : "การกำหนดค่า",
"Available for" : "สามารถใช้ได้สำหรับ",
+ "Add storage" : "เพิ่มพื้นที่จัดเก็บข้อมูล",
"Advanced settings" : "ตั้งค่าขั้นสูง",
"Delete" : "ลบ",
- "Add storage" : "เพิ่มพื้นที่จัดเก็บข้อมูล",
"Allow users to mount external storage" : "อนุญาตให้ผู้ใช้ติดตั้งการจัดเก็บข้อมูลภายนอก",
"Allow users to mount the following external storage" : "อนุญาตให้ผู้ใช้ติดตั้งจัดเก็บข้อมูลภายนอกต่อไปนี้"
},
diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json
index 2db63df9df2..3de48d733d3 100644
--- a/apps/files_external/l10n/th_TH.json
+++ b/apps/files_external/l10n/th_TH.json
@@ -31,6 +31,7 @@
"Every time the filesystem is used" : "ทุกครั้งที่แฟ้มระบบถูกใช้งาน",
"All users. Type to select user or group." : "ผู้ใช้ทุกคน พิมพ์เพื่อเลือกผู้ใช้หรือกลุ่ม",
"(group)" : "(กลุ่ม)",
+ "Admin defined" : "ถูกกำหนดโดยผู้ดูแลระบบ",
"Saved" : "บันทึกแล้ว",
"Access key" : "คีย์การเข้าถึง",
"Secret key" : "คีย์ลับ",
@@ -97,9 +98,9 @@
"Authentication" : "รับรองความถูกต้อง",
"Configuration" : "การกำหนดค่า",
"Available for" : "สามารถใช้ได้สำหรับ",
+ "Add storage" : "เพิ่มพื้นที่จัดเก็บข้อมูล",
"Advanced settings" : "ตั้งค่าขั้นสูง",
"Delete" : "ลบ",
- "Add storage" : "เพิ่มพื้นที่จัดเก็บข้อมูล",
"Allow users to mount external storage" : "อนุญาตให้ผู้ใช้ติดตั้งการจัดเก็บข้อมูลภายนอก",
"Allow users to mount the following external storage" : "อนุญาตให้ผู้ใช้ติดตั้งจัดเก็บข้อมูลภายนอกต่อไปนี้"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index 619e5975ed8..78f9df04ec6 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Not permitted to use authentication mechanism \"%s\"" : "\"%s\" kimlik doğrulama mekanizmasına izin verilmiyor",
"Unsatisfied backend parameters" : "Yetersiz arka uç parametreleri",
"Unsatisfied authentication mechanism parameters" : "Yetersiz kimlik doğrulama mekanizması parametreleri",
+ "Insufficient data: %s" : "Yetersiz veri: %s",
"Personal" : "Kişisel",
"System" : "Sistem",
"Grant access" : "Erişimi sağla",
@@ -98,9 +99,10 @@ OC.L10N.register(
"Authentication" : "Kimlik Doğrulama",
"Configuration" : "Yapılandırma",
"Available for" : "Kullanabilenler",
+ "Add storage" : "Depo ekle",
"Advanced settings" : "Gelişmiş ayarlar",
"Delete" : "Sil",
- "Add storage" : "Depo ekle",
+ "Allow users to mount external storage" : "Kullanıcılara harici depolama bağlama izin ver",
"Allow users to mount the following external storage" : "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index cb315a333c2..a798f4a7427 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -14,6 +14,7 @@
"Not permitted to use authentication mechanism \"%s\"" : "\"%s\" kimlik doğrulama mekanizmasına izin verilmiyor",
"Unsatisfied backend parameters" : "Yetersiz arka uç parametreleri",
"Unsatisfied authentication mechanism parameters" : "Yetersiz kimlik doğrulama mekanizması parametreleri",
+ "Insufficient data: %s" : "Yetersiz veri: %s",
"Personal" : "Kişisel",
"System" : "Sistem",
"Grant access" : "Erişimi sağla",
@@ -96,9 +97,10 @@
"Authentication" : "Kimlik Doğrulama",
"Configuration" : "Yapılandırma",
"Available for" : "Kullanabilenler",
+ "Add storage" : "Depo ekle",
"Advanced settings" : "Gelişmiş ayarlar",
"Delete" : "Sil",
- "Add storage" : "Depo ekle",
+ "Allow users to mount external storage" : "Kullanıcılara harici depolama bağlama izin ver",
"Allow users to mount the following external storage" : "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js
index f8ca8dc360c..702b3e328ce 100644
--- a/apps/files_external/l10n/uk.js
+++ b/apps/files_external/l10n/uk.js
@@ -61,9 +61,9 @@ OC.L10N.register(
"Folder name" : "Ім'я теки",
"Configuration" : "Налаштування",
"Available for" : "Доступний для",
+ "Add storage" : "Додати сховище",
"Advanced settings" : "Розширені налаштування",
"Delete" : "Видалити",
- "Add storage" : "Додати сховище",
"Allow users to mount the following external storage" : "Дозволити користувачам монтувати наступні зовнішні сховища"
},
"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_external/l10n/uk.json b/apps/files_external/l10n/uk.json
index c34d0d2c82f..cddda62118f 100644
--- a/apps/files_external/l10n/uk.json
+++ b/apps/files_external/l10n/uk.json
@@ -59,9 +59,9 @@
"Folder name" : "Ім'я теки",
"Configuration" : "Налаштування",
"Available for" : "Доступний для",
+ "Add storage" : "Додати сховище",
"Advanced settings" : "Розширені налаштування",
"Delete" : "Видалити",
- "Add storage" : "Додати сховище",
"Allow users to mount the following external storage" : "Дозволити користувачам монтувати наступні зовнішні сховища"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/vi.js b/apps/files_external/l10n/vi.js
index f3fdb39136c..65b3d492429 100644
--- a/apps/files_external/l10n/vi.js
+++ b/apps/files_external/l10n/vi.js
@@ -21,7 +21,7 @@ OC.L10N.register(
"External Storage" : "Lưu trữ ngoài",
"Folder name" : "Tên thư mục",
"Configuration" : "Cấu hình",
- "Delete" : "Xóa",
- "Add storage" : "Thêm bộ nhớ"
+ "Add storage" : "Thêm bộ nhớ",
+ "Delete" : "Xóa"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/vi.json b/apps/files_external/l10n/vi.json
index fdba39fc95e..031dddee8e3 100644
--- a/apps/files_external/l10n/vi.json
+++ b/apps/files_external/l10n/vi.json
@@ -19,7 +19,7 @@
"External Storage" : "Lưu trữ ngoài",
"Folder name" : "Tên thư mục",
"Configuration" : "Cấu hình",
- "Delete" : "Xóa",
- "Add storage" : "Thêm bộ nhớ"
+ "Add storage" : "Thêm bộ nhớ",
+ "Delete" : "Xóa"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/zh_CN.js b/apps/files_external/l10n/zh_CN.js
index 4b99fc170a2..ca35a97bb53 100644
--- a/apps/files_external/l10n/zh_CN.js
+++ b/apps/files_external/l10n/zh_CN.js
@@ -40,8 +40,8 @@ OC.L10N.register(
"Folder name" : "目录名称",
"Configuration" : "配置",
"Available for" : "可用于",
- "Delete" : "删除",
"Add storage" : "增加存储",
+ "Delete" : "删除",
"Allow users to mount the following external storage" : "允许用户挂载以下外部存储"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/zh_CN.json b/apps/files_external/l10n/zh_CN.json
index fddc688c5c2..53c1df78899 100644
--- a/apps/files_external/l10n/zh_CN.json
+++ b/apps/files_external/l10n/zh_CN.json
@@ -38,8 +38,8 @@
"Folder name" : "目录名称",
"Configuration" : "配置",
"Available for" : "可用于",
- "Delete" : "删除",
"Add storage" : "增加存储",
+ "Delete" : "删除",
"Allow users to mount the following external storage" : "允许用户挂载以下外部存储"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js
index 61f224e4ffe..56182dc68c2 100644
--- a/apps/files_external/l10n/zh_TW.js
+++ b/apps/files_external/l10n/zh_TW.js
@@ -93,9 +93,9 @@ OC.L10N.register(
"Authentication" : "驗證",
"Configuration" : "設定",
"Available for" : "可用的",
+ "Add storage" : "增加儲存區",
"Advanced settings" : "進階設定",
"Delete" : "刪除",
- "Add storage" : "增加儲存區",
"Allow users to mount external storage" : "允許使用者能自行掛載外部儲存",
"Allow users to mount the following external storage" : "允許使用者自行掛載以下的外部儲存"
},
diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json
index b9aa234e89e..629544bdaaf 100644
--- a/apps/files_external/l10n/zh_TW.json
+++ b/apps/files_external/l10n/zh_TW.json
@@ -91,9 +91,9 @@
"Authentication" : "驗證",
"Configuration" : "設定",
"Available for" : "可用的",
+ "Add storage" : "增加儲存區",
"Advanced settings" : "進階設定",
"Delete" : "刪除",
- "Add storage" : "增加儲存區",
"Allow users to mount external storage" : "允許使用者能自行掛載外部儲存",
"Allow users to mount the following external storage" : "允許使用者自行掛載以下的外部儲存"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 6c900f0f224..7a869847a63 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -33,10 +33,10 @@
use phpseclib\Crypt\AES;
use \OCA\Files_External\Appinfo\Application;
-use \OCA\Files_External\Lib\BackendConfig;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Backend\LegacyBackend;
use \OCA\Files_External\Lib\StorageConfig;
+use \OCA\Files_External\Lib\Backend\Backend;
+use \OCP\Files\StorageNotAvailableException;
/**
* Class to configure mount.json globally and for users
@@ -49,11 +49,6 @@ class OC_Mount_Config {
const MOUNT_TYPE_USER = 'user';
const MOUNT_TYPE_PERSONAL = 'personal';
- // getBackendStatus return types
- const STATUS_SUCCESS = 0;
- const STATUS_ERROR = 1;
- const STATUS_INDETERMINATE = 2;
-
// whether to skip backend test (for unit tests, as this static class is not mockable)
public static $skipTest = false;
@@ -75,36 +70,6 @@ class OC_Mount_Config {
return true;
}
- /*
- * Hook that mounts the given user's visible mount points
- *
- * @param array $data
- */
- public static function initMountPointsHook($data) {
- if ($data['user']) {
- $user = \OC::$server->getUserManager()->get($data['user']);
- if (!$user) {
- \OC::$server->getLogger()->warning(
- 'Cannot init external mount points for non-existant user "' . $data['user'] . '".',
- ['app' => 'files_external']
- );
- return;
- }
- $userView = new \OC\Files\View('/' . $user->getUID() . '/files');
- $changePropagator = new \OC\Files\Cache\ChangePropagator($userView);
- $etagPropagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, \OC::$server->getConfig());
- $etagPropagator->propagateDirtyMountPoints();
- \OCP\Util::connectHook(
- \OC\Files\Filesystem::CLASSNAME,
- \OC\Files\Filesystem::signal_create_mount,
- $etagPropagator, 'updateHook');
- \OCP\Util::connectHook(
- \OC\Files\Filesystem::CLASSNAME,
- \OC\Files\Filesystem::signal_delete_mount,
- $etagPropagator, 'updateHook');
- }
- }
-
/**
* Returns the mount points for the given user.
* The mount point is relative to the data directory.
@@ -244,24 +209,27 @@ class OC_Mount_Config {
*
* @param string $class backend class name
* @param array $options backend configuration options
+ * @param boolean $isPersonal
* @return int see self::STATUS_*
+ * @throws Exception
*/
public static function getBackendStatus($class, $options, $isPersonal) {
if (self::$skipTest) {
- return self::STATUS_SUCCESS;
+ return StorageNotAvailableException::STATUS_SUCCESS;
}
foreach ($options as &$option) {
$option = self::setUserVars(OCP\User::getUser(), $option);
}
if (class_exists($class)) {
try {
+ /** @var \OC\Files\Storage\Common $storage */
$storage = new $class($options);
try {
$result = $storage->test($isPersonal);
$storage->setAvailability($result);
if ($result) {
- return self::STATUS_SUCCESS;
+ return StorageNotAvailableException::STATUS_SUCCESS;
}
} catch (\Exception $e) {
$storage->setAvailability(false);
@@ -272,7 +240,7 @@ class OC_Mount_Config {
throw $exception;
}
}
- return self::STATUS_ERROR;
+ return StorageNotAvailableException::STATUS_ERROR;
}
/**
@@ -322,7 +290,7 @@ class OC_Mount_Config {
* Get backend dependency message
* TODO: move into AppFramework along with templates
*
- * @param BackendConfig[] $backends
+ * @param Backend[] $backends
* @return string
*/
public static function dependencyMessage($backends) {
@@ -361,11 +329,11 @@ class OC_Mount_Config {
private static function getSingleDependencyMessage(\OCP\IL10N $l, $module, $backend) {
switch (strtolower($module)) {
case 'curl':
- return $l->t('<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', $backend);
+ return (string)$l->t('<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', $backend);
case 'ftp':
- return $l->t('<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', $backend);
+ return (string)$l->t('<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', $backend);
default:
- return $l->t('<b>Note:</b> "%s" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it.', array($module, $backend));
+ return (string)$l->t('<b>Note:</b> "%s" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it.', array($module, $backend));
}
}
diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php
index 3a04512e8a8..f9640d53377 100644
--- a/apps/files_external/lib/config/configadapter.php
+++ b/apps/files_external/lib/config/configadapter.php
@@ -32,7 +32,6 @@ use OCP\IUser;
use OCA\Files_external\Service\UserStoragesService;
use OCA\Files_External\Service\UserGlobalStoragesService;
use OCA\Files_External\Lib\StorageConfig;
-use OCP\Files\StorageNotAvailableException;
use OCA\Files_External\Lib\FailedStorage;
/**
diff --git a/apps/files_external/lib/etagpropagator.php b/apps/files_external/lib/etagpropagator.php
deleted file mode 100644
index 772a11ea36f..00000000000
--- a/apps/files_external/lib/etagpropagator.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-/**
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_External;
-
-use OC\Files\Filesystem;
-
-/**
- * Updates the etag of parent folders whenever a new external storage mount
- * point has been created or deleted. Updates need to be triggered using
- * the updateHook() method.
- *
- * There are two modes of operation:
- * - for personal mount points, the etag is propagated directly
- * - for system mount points, a dirty flag is saved in the configuration and
- * the etag will be updated the next time propagateDirtyMountPoints() is called
- */
-class EtagPropagator {
- /**
- * @var \OCP\IUser
- */
- protected $user;
-
- /**
- * @var \OC\Files\Cache\ChangePropagator
- */
- protected $changePropagator;
-
- /**
- * @var \OCP\IConfig
- */
- protected $config;
-
- /**
- * @param \OCP\IUser $user current user, must match the propagator's
- * user
- * @param \OC\Files\Cache\ChangePropagator $changePropagator change propagator
- * initialized with a view for $user
- * @param \OCP\IConfig $config
- */
- public function __construct($user, $changePropagator, $config) {
- $this->user = $user;
- $this->changePropagator = $changePropagator;
- $this->config = $config;
- }
-
- /**
- * Propagate the etag changes for all mountpoints marked as dirty and mark the mountpoints as clean
- *
- * @param int $time
- */
- public function propagateDirtyMountPoints($time = null) {
- if ($time === null) {
- $time = time();
- }
- $mountPoints = $this->getDirtyMountPoints();
- foreach ($mountPoints as $mountPoint) {
- $this->changePropagator->addChange($mountPoint);
- $this->config->setUserValue($this->user->getUID(), 'files_external', $mountPoint, $time);
- }
- if (count($mountPoints)) {
- $this->changePropagator->propagateChanges($time);
- }
- }
-
- /**
- * Get all mountpoints we need to update the etag for
- *
- * @return string[]
- */
- protected function getDirtyMountPoints() {
- $dirty = array();
- $mountPoints = $this->config->getAppKeys('files_external');
- foreach ($mountPoints as $mountPoint) {
- if (substr($mountPoint, 0, 1) === '/') {
- $updateTime = $this->config->getAppValue('files_external', $mountPoint);
- $userTime = $this->config->getUserValue($this->user->getUID(), 'files_external', $mountPoint);
- if ($updateTime > $userTime) {
- $dirty[] = $mountPoint;
- }
- }
- }
- return $dirty;
- }
-
- /**
- * @param string $mountPoint
- * @param int $time
- */
- protected function markDirty($mountPoint, $time = null) {
- if ($time === null) {
- $time = time();
- }
- $this->config->setAppValue('files_external', $mountPoint, $time);
- }
-
- /**
- * Update etags for mount points for known user
- * For global or group mount points, updating the etag for every user is not feasible
- * instead we mark the mount point as dirty and update the etag when the filesystem is loaded for the user
- * For personal mount points, the change is propagated directly
- *
- * @param array $params hook parameters
- * @param int $time update time to use when marking a mount point as dirty
- */
- public function updateHook($params, $time = null) {
- if ($time === null) {
- $time = time();
- }
- $users = $params[Filesystem::signal_param_users];
- $type = $params[Filesystem::signal_param_mount_type];
- $mountPoint = $params[Filesystem::signal_param_path];
- $mountPoint = Filesystem::normalizePath($mountPoint);
- if ($type === \OC_Mount_Config::MOUNT_TYPE_GROUP or $users === 'all') {
- $this->markDirty($mountPoint, $time);
- } else {
- $this->changePropagator->addChange($mountPoint);
- $this->changePropagator->propagateChanges($time);
- }
- }
-}
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php
index 5dcc7686ca3..bcf3143736e 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/sftp.php
@@ -52,27 +52,37 @@ class SFTP extends \OC\Files\Storage\Common {
protected $client;
/**
+ * @param string $host protocol://server:port
+ * @return array [$server, $port]
+ */
+ private function splitHost($host) {
+ $input = $host;
+ if (strpos($host, '://') === false) {
+ // add a protocol to fix parse_url behavior with ipv6
+ $host = 'http://' . $host;
+ }
+
+ $parsed = parse_url($host);
+ if(is_array($parsed) && isset($parsed['port'])) {
+ return [$parsed['host'], $parsed['port']];
+ } else if (is_array($parsed)) {
+ return [$parsed['host'], 22];
+ } else {
+ return [$input, 22];
+ }
+ }
+
+ /**
* {@inheritdoc}
*/
public function __construct($params) {
// Register sftp://
Stream::register();
- $this->host = $params['host'];
+ $parsedHost = $this->splitHost($params['host']);
- //deals with sftp://server example
- $proto = strpos($this->host, '://');
- if ($proto != false) {
- $this->host = substr($this->host, $proto+3);
- }
-
- //deals with server:port
- $hasPort = strpos($this->host,':');
- if($hasPort != false) {
- $pieces = explode(":", $this->host);
- $this->host = $pieces[0];
- $this->port = $pieces[1];
- }
+ $this->host = $parsedHost[0];
+ $this->port = $parsedHost[1];
$this->user = $params['user'];
@@ -185,7 +195,7 @@ class SFTP extends \OC\Files\Storage\Common {
}
/**
- * @return bool|string
+ * @return string|false
*/
private function hostKeysPath() {
try {
diff --git a/apps/files_external/lib/storageconfig.php b/apps/files_external/lib/storageconfig.php
index 86a7e6ffa12..97e0386be73 100644
--- a/apps/files_external/lib/storageconfig.php
+++ b/apps/files_external/lib/storageconfig.php
@@ -302,6 +302,25 @@ class StorageConfig implements \JsonSerializable {
}
/**
+ * @param string $key
+ * @return mixed
+ */
+ public function getMountOption($key) {
+ if (isset($this->mountOptions[$key])) {
+ return $this->mountOptions[$key];
+ }
+ return null;
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $value
+ */
+ public function setMountOption($key, $value) {
+ $this->mountOptions[$key] = $value;
+ }
+
+ /**
* Gets the storage status, whether the config worked last time
*
* @return int $status status
diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php
index df15c3bd258..05196a58905 100644
--- a/apps/files_external/personal.php
+++ b/apps/files_external/personal.php
@@ -32,31 +32,11 @@ $appContainer = \OC_Mount_Config::$app->getContainer();
$backendService = $appContainer->query('OCA\Files_External\Service\BackendService');
$userStoragesService = $appContainer->query('OCA\Files_external\Service\UserStoragesService');
-OCP\Util::addScript('files_external', 'settings');
-OCP\Util::addStyle('files_external', 'settings');
-
-$backends = array_filter($backendService->getAvailableBackends(), function($backend) {
- return $backend->isVisibleFor(BackendService::VISIBILITY_PERSONAL);
-});
-$authMechanisms = array_filter($backendService->getAuthMechanisms(), function($authMechanism) {
- return $authMechanism->isVisibleFor(BackendService::VISIBILITY_PERSONAL);
-});
-foreach ($backends as $backend) {
- if ($backend->getCustomJs()) {
- \OCP\Util::addScript('files_external', $backend->getCustomJs());
- }
-}
-foreach ($authMechanisms as $authMechanism) {
- if ($authMechanism->getCustomJs()) {
- \OCP\Util::addScript('files_external', $authMechanism->getCustomJs());
- }
-}
-
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
-$tmpl->assign('isAdminPage', false);
+$tmpl->assign('visibilityType', BackendService::VISIBILITY_PERSONAL);
$tmpl->assign('storages', $userStoragesService->getStorages());
$tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
-$tmpl->assign('backends', $backends);
-$tmpl->assign('authMechanisms', $authMechanisms);
+$tmpl->assign('backends', $backendService->getAvailableBackends());
+$tmpl->assign('authMechanisms', $backendService->getAuthMechanisms());
return $tmpl->fetchPage();
diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php
index 41bb0ca9b80..c847930ba2d 100644
--- a/apps/files_external/service/storagesservice.php
+++ b/apps/files_external/service/storagesservice.php
@@ -31,6 +31,7 @@ use \OCA\Files_external\NotFoundException;
use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
+use \OCP\Files\StorageNotAvailableException;
/**
* Service class to manage external storages
@@ -221,17 +222,26 @@ abstract class StoragesService {
$currentStorage->setMountPoint($relativeMountPath);
}
- $this->populateStorageConfigWithLegacyOptions(
- $currentStorage,
- $mountType,
- $applicable,
- $storageOptions
- );
+ try {
+ $this->populateStorageConfigWithLegacyOptions(
+ $currentStorage,
+ $mountType,
+ $applicable,
+ $storageOptions
+ );
- if ($hasId) {
- $storages[$configId] = $currentStorage;
- } else {
- $storagesWithConfigHash[$configId] = $currentStorage;
+ if ($hasId) {
+ $storages[$configId] = $currentStorage;
+ } else {
+ $storagesWithConfigHash[$configId] = $currentStorage;
+ }
+ } catch (\UnexpectedValueException $e) {
+ // dont die if a storage backend doesn't exist
+ \OCP\Util::writeLog(
+ 'files_external',
+ 'Could not load storage: "' . $e->getMessage() . '"',
+ \OCP\Util::ERROR
+ );
}
}
}
@@ -402,7 +412,7 @@ abstract class StoragesService {
$this->triggerHooks($newStorage, Filesystem::signal_create_mount);
- $newStorage->setStatus(\OC_Mount_Config::STATUS_SUCCESS);
+ $newStorage->setStatus(StorageNotAvailableException::STATUS_SUCCESS);
return $newStorage;
}
diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php
index 03ed363bdb2..50d47d667fd 100644
--- a/apps/files_external/settings.php
+++ b/apps/files_external/settings.php
@@ -35,40 +35,15 @@ $appContainer = \OC_Mount_Config::$app->getContainer();
$backendService = $appContainer->query('OCA\Files_External\Service\BackendService');
$globalStoragesService = $appContainer->query('OCA\Files_external\Service\GlobalStoragesService');
-OCP\Util::addScript('files_external', 'settings');
-OCP\Util::addStyle('files_external', 'settings');
-
\OC_Util::addVendorScript('select2/select2');
\OC_Util::addVendorStyle('select2/select2');
-$backends = array_filter($backendService->getAvailableBackends(), function($backend) {
- return $backend->isVisibleFor(BackendService::VISIBILITY_ADMIN);
-});
-$authMechanisms = array_filter($backendService->getAuthMechanisms(), function($authMechanism) {
- return $authMechanism->isVisibleFor(BackendService::VISIBILITY_ADMIN);
-});
-foreach ($backends as $backend) {
- if ($backend->getCustomJs()) {
- \OCP\Util::addScript('files_external', $backend->getCustomJs());
- }
-}
-foreach ($authMechanisms as $authMechanism) {
- if ($authMechanism->getCustomJs()) {
- \OCP\Util::addScript('files_external', $authMechanism->getCustomJs());
- }
-}
-
-$userBackends = array_filter($backendService->getAvailableBackends(), function($backend) {
- return $backend->isAllowedVisibleFor(BackendService::VISIBILITY_PERSONAL);
-});
-
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
-$tmpl->assign('isAdminPage', true);
+$tmpl->assign('visibilityType', BackendService::VISIBILITY_ADMIN);
$tmpl->assign('storages', $globalStoragesService->getStorages());
-$tmpl->assign('backends', $backends);
-$tmpl->assign('authMechanisms', $authMechanisms);
-$tmpl->assign('userBackends', $userBackends);
+$tmpl->assign('backends', $backendService->getAvailableBackends());
+$tmpl->assign('authMechanisms', $backendService->getAuthMechanisms());
$tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
$tmpl->assign('allowUserMounting', $backendService->isUserMountingAllowed());
return $tmpl->fetchPage();
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index cebf6cc4de0..f7caf3d2caa 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -3,6 +3,21 @@
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Service\BackendService;
+ script('files_external', 'settings');
+ style('files_external', 'settings');
+
+ // load custom JS
+ foreach ($_['backends'] as $backend) {
+ if ($backend->getCustomJs()) {
+ script('files_external', $backend->getCustomJs());
+ }
+ }
+ foreach ($_['authMechanisms'] as $authMechanism) {
+ if ($authMechanism->getCustomJs()) {
+ script('files_external', $authMechanism->getCustomJs());
+ }
+ }
+
function writeParameterInput($parameter, $options, $classes = []) {
$value = '';
if (isset($options[$parameter->getName()])) {
@@ -56,7 +71,7 @@
<form id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
<h2><?php p($l->t('External Storage')); ?></h2>
<?php if (isset($_['dependencies']) and ($_['dependencies']<>'')) print_unescaped(''.$_['dependencies'].''); ?>
- <table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['isAdminPage'])); ?>'>
+ <table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['visibilityType'] === BackendService::VISIBILITY_ADMIN)); ?>'>
<thead>
<tr>
<th></th>
@@ -64,79 +79,12 @@
<th><?php p($l->t('External storage')); ?></th>
<th><?php p($l->t('Authentication')); ?></th>
<th><?php p($l->t('Configuration')); ?></th>
- <?php if ($_['isAdminPage']) print_unescaped('<th>'.$l->t('Available for').'</th>'); ?>
+ <?php if ($_['visibilityType'] === BackendService::VISIBILITY_ADMIN) print_unescaped('<th>'.$l->t('Available for').'</th>'); ?>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
- <?php foreach ($_['storages'] as $storage): ?>
- <tr class="<?php p($storage->getBackend()->getIdentifier()); ?>" data-id="<?php p($storage->getId()); ?>">
- <td class="status">
- <span></span>
- </td>
- <td class="mountPoint"><input type="text" name="mountPoint"
- value="<?php p(ltrim($storage->getMountPoint(), '/')); ?>"
- data-mountpoint="<?php p(ltrim($storage->getMountPoint(), '/')); ?>"
- placeholder="<?php p($l->t('Folder name')); ?>" />
- </td>
- <td class="backend" data-class="<?php p($storage->getBackend()->getIdentifier()); ?>"><?php p($storage->getBackend()->getText()); ?>
- </td>
- <td class="authentication">
- <select class="selectAuthMechanism">
- <?php
- $authSchemes = $storage->getBackend()->getAuthSchemes();
- $authMechanisms = array_filter($_['authMechanisms'], function($mech) use ($authSchemes) {
- return isset($authSchemes[$mech->getScheme()]);
- });
- ?>
- <?php foreach ($authMechanisms as $mech): ?>
- <option value="<?php p($mech->getIdentifier()); ?>" data-scheme="<?php p($mech->getScheme());?>"
- <?php if ($mech->getIdentifier() === $storage->getAuthMechanism()->getIdentifier()): ?>selected<?php endif; ?>
- ><?php p($mech->getText()); ?></option>
- <?php endforeach; ?>
- </select>
- </td>
- <td class="configuration">
- <?php
- $options = $storage->getBackendOptions();
- foreach ($storage->getBackend()->getParameters() as $parameter) {
- writeParameterInput($parameter, $options);
- }
- foreach ($storage->getAuthMechanism()->getParameters() as $parameter) {
- writeParameterInput($parameter, $options, ['auth-param']);
- }
- ?>
- </td>
- <?php if ($_['isAdminPage']): ?>
- <td class="applicable"
- align="right"
- data-applicable-groups='<?php print_unescaped(json_encode($storage->getApplicableGroups())); ?>'
- data-applicable-users='<?php print_unescaped(json_encode($storage->getApplicableUsers())); ?>'>
- <input type="hidden" class="applicableUsers" style="width:20em;" value=""/>
- </td>
- <?php endif; ?>
- <td class="mountOptionsToggle">
- <img
- class="svg action"
- title="<?php p($l->t('Advanced settings')); ?>"
- alt="<?php p($l->t('Advanced settings')); ?>"
- src="<?php print_unescaped(image_path('core', 'actions/settings.svg')); ?>"
- />
- <input type="hidden" class="mountOptions" value="<?php p(json_encode($storage->getMountOptions())); ?>" />
- <?php if ($_['isAdminPage']): ?>
- <input type="hidden" class="priority" value="<?php p($storage->getPriority()); ?>" />
- <?php endif; ?>
- </td>
- <td class="remove">
- <img alt="<?php p($l->t('Delete')); ?>"
- title="<?php p($l->t('Delete')); ?>"
- class="svg action"
- src="<?php print_unescaped(image_path('core', 'actions/delete.svg')); ?>"
- />
- </td>
- </tr>
- <?php endforeach; ?>
<tr id="addMountPoint">
<td class="status">
<span></span>
@@ -151,7 +99,9 @@
<?php p($l->t('Add storage')); ?>
</option>
<?php
- $sortedBackends = $_['backends'];
+ $sortedBackends = array_filter($_['backends'], function($backend) use ($_) {
+ return $backend->isVisibleFor($_['visibilityType']);
+ });
uasort($sortedBackends, function($a, $b) {
return strcasecmp($a->getText(), $b->getText());
});
@@ -164,7 +114,7 @@
</td>
<td class="authentication" data-mechanisms='<?php p(json_encode($_['authMechanisms'])); ?>'></td>
<td class="configuration"></td>
- <?php if ($_['isAdminPage']): ?>
+ <?php if ($_['visibilityType'] === BackendService::VISIBILITY_ADMIN): ?>
<td class="applicable" align="right">
<input type="hidden" class="applicableUsers" style="width:20em;" value="" />
</td>
@@ -189,7 +139,7 @@
</table>
<br />
- <?php if ($_['isAdminPage']): ?>
+ <?php if ($_['visibilityType'] === BackendService::VISIBILITY_ADMIN): ?>
<br />
<input type="checkbox" name="allowUserMounting" id="allowUserMounting" class="checkbox"
value="1" <?php if ($_['allowUserMounting'] == 'yes') print_unescaped(' checked="checked"'); ?> />
@@ -197,7 +147,12 @@
<p id="userMountingBackends"<?php if ($_['allowUserMounting'] != 'yes'): ?> class="hidden"<?php endif; ?>>
<?php p($l->t('Allow users to mount the following external storage')); ?><br />
- <?php $i = 0; foreach ($_['userBackends'] as $backend): ?>
+ <?php
+ $userBackends = array_filter($_['backends'], function($backend) {
+ return $backend->isAllowedVisibleFor(BackendService::VISIBILITY_PERSONAL);
+ });
+ ?>
+ <?php $i = 0; foreach ($userBackends as $backend): ?>
<?php if ($deprecateTo = $backend->getDeprecateTo()): ?>
<input type="hidden" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" data-deprecate-to="<?php p($deprecateTo->getIdentifier()); ?>" />
<?php else: ?>
diff --git a/apps/files_external/tests/amazons3migration.php b/apps/files_external/tests/amazons3migration.php
index 3eba5bca644..33fb6119a92 100644
--- a/apps/files_external/tests/amazons3migration.php
+++ b/apps/files_external/tests/amazons3migration.php
@@ -25,6 +25,13 @@
namespace Test\Files\Storage;
+/**
+ * Class AmazonS3Migration
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class AmazonS3Migration extends \Test\TestCase {
/**
diff --git a/apps/files_external/tests/backends/amazons3.php b/apps/files_external/tests/backends/amazons3.php
index c16581a4495..e1465b51125 100644
--- a/apps/files_external/tests/backends/amazons3.php
+++ b/apps/files_external/tests/backends/amazons3.php
@@ -25,6 +25,13 @@
namespace Test\Files\Storage;
+/**
+ * Class AmazonS3
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class AmazonS3 extends Storage {
private $config;
diff --git a/apps/files_external/tests/backends/dropbox.php b/apps/files_external/tests/backends/dropbox.php
index 8765011532c..8dd0e58adc1 100644
--- a/apps/files_external/tests/backends/dropbox.php
+++ b/apps/files_external/tests/backends/dropbox.php
@@ -25,6 +25,13 @@
namespace Test\Files\Storage;
+/**
+ * Class Dropbox
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class Dropbox extends Storage {
private $config;
diff --git a/apps/files_external/tests/backends/ftp.php b/apps/files_external/tests/backends/ftp.php
index 20a5c275d29..b715f0f780d 100644
--- a/apps/files_external/tests/backends/ftp.php
+++ b/apps/files_external/tests/backends/ftp.php
@@ -26,6 +26,13 @@
namespace Test\Files\Storage;
+/**
+ * Class FTP
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class FTP extends Storage {
private $config;
diff --git a/apps/files_external/tests/backends/google.php b/apps/files_external/tests/backends/google.php
index 6ff235ac6af..c9a5d48382c 100644
--- a/apps/files_external/tests/backends/google.php
+++ b/apps/files_external/tests/backends/google.php
@@ -28,6 +28,13 @@ namespace Test\Files\Storage;
require_once 'files_external/lib/google.php';
+/**
+ * Class Google
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class Google extends Storage {
private $config;
diff --git a/apps/files_external/tests/backends/owncloud.php b/apps/files_external/tests/backends/owncloud.php
index 47e27870be2..d51fa638c50 100644
--- a/apps/files_external/tests/backends/owncloud.php
+++ b/apps/files_external/tests/backends/owncloud.php
@@ -23,6 +23,13 @@
namespace Test\Files\Storage;
+/**
+ * Class OwnCloud
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class OwnCloud extends Storage {
private $config;
diff --git a/apps/files_external/tests/backends/sftp.php b/apps/files_external/tests/backends/sftp.php
index da2c0ac6ba2..03f2dcc0d77 100644
--- a/apps/files_external/tests/backends/sftp.php
+++ b/apps/files_external/tests/backends/sftp.php
@@ -25,7 +25,19 @@
namespace Test\Files\Storage;
+/**
+ * Class SFTP
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class SFTP extends Storage {
+ /**
+ * @var \OC\Files\Storage\SFTP instance
+ */
+ protected $instance;
+
private $config;
protected function setUp() {
@@ -103,6 +115,39 @@ class SFTP extends Storage {
],
'sftp::someuser@somehost:8822//remotedir/subdir/',
],
+ [
+ // ipv6 with port
+ [
+ 'run' => true,
+ 'host' => 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329',
+ 'user' => 'someuser',
+ 'password' => 'somepassword',
+ 'root' => 'remotedir/subdir/',
+ ],
+ 'sftp::someuser@FE80:0000:0000:0000:0202:B3FF:FE1E:8329//remotedir/subdir/',
+ ],
+ [
+ // ipv6 without port
+ [
+ 'run' => true,
+ 'host' => 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329:8822',
+ 'user' => 'someuser',
+ 'password' => 'somepassword',
+ 'root' => 'remotedir/subdir/',
+ ],
+ 'sftp::someuser@FE80:0000:0000:0000:0202:B3FF:FE1E:8329:8822//remotedir/subdir/',
+ ],
+ [
+ // collapsed ipv6 with port
+ [
+ 'run' => true,
+ 'host' => 'FE80::0202:B3FF:FE1E:8329:8822',
+ 'user' => 'someuser',
+ 'password' => 'somepassword',
+ 'root' => 'remotedir/subdir/',
+ ],
+ 'sftp::someuser@FE80::0202:B3FF:FE1E:8329:8822//remotedir/subdir/',
+ ],
];
}
}
diff --git a/apps/files_external/tests/backends/sftp_key.php b/apps/files_external/tests/backends/sftp_key.php
index 6e8ac9f7239..762cb0887c1 100644
--- a/apps/files_external/tests/backends/sftp_key.php
+++ b/apps/files_external/tests/backends/sftp_key.php
@@ -23,6 +23,13 @@
namespace Test\Files\Storage;
+/**
+ * Class SFTP_Key
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class SFTP_Key extends Storage {
private $config;
diff --git a/apps/files_external/tests/backends/smb.php b/apps/files_external/tests/backends/smb.php
index 0da86cb824f..0c43aba24dd 100644
--- a/apps/files_external/tests/backends/smb.php
+++ b/apps/files_external/tests/backends/smb.php
@@ -24,6 +24,13 @@
namespace Test\Files\Storage;
+/**
+ * Class SMB
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class SMB extends Storage {
protected function setUp() {
diff --git a/apps/files_external/tests/backends/swift.php b/apps/files_external/tests/backends/swift.php
index 2e6670f84f8..b71b4f77add 100644
--- a/apps/files_external/tests/backends/swift.php
+++ b/apps/files_external/tests/backends/swift.php
@@ -25,6 +25,13 @@
namespace Test\Files\Storage;
+/**
+ * Class Swift
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class Swift extends Storage {
private $config;
@@ -32,28 +39,35 @@ class Swift extends Storage {
protected function setUp() {
parent::setUp();
- $this->config = include('files_external/tests/config.php');
- if (!is_array($this->config) or !isset($this->config['swift'])
- or !$this->config['swift']['run']) {
+ $this->config = include('files_external/tests/config.swift.php');
+ if (!is_array($this->config) or !$this->config['run']) {
$this->markTestSkipped('OpenStack Object Storage backend not configured');
}
- $this->instance = new \OC\Files\Storage\Swift($this->config['swift']);
+ $this->instance = new \OC\Files\Storage\Swift($this->config);
}
protected function tearDown() {
if ($this->instance) {
- $connection = $this->instance->getConnection();
- $container = $connection->getContainer($this->config['swift']['bucket']);
+ try {
+ $connection = $this->instance->getConnection();
+ $container = $connection->getContainer($this->config['bucket']);
- $objects = $container->objectList();
- while($object = $objects->next()) {
- $object->setName(str_replace('#','%23',$object->getName()));
- $object->delete();
- }
+ $objects = $container->objectList();
+ while($object = $objects->next()) {
+ $object->setName(str_replace('#','%23',$object->getName()));
+ $object->delete();
+ }
- $container->delete();
+ $container->delete();
+ } catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) {
+ // container didn't exist, so we don't need to delete it
+ }
}
parent::tearDown();
}
+
+ public function testStat() {
+ $this->markTestSkipped('Swift doesn\'t update the parents folder mtime');
+ }
}
diff --git a/apps/files_external/tests/backends/webdav.php b/apps/files_external/tests/backends/webdav.php
index e2020da7c72..130e0c99cb3 100644
--- a/apps/files_external/tests/backends/webdav.php
+++ b/apps/files_external/tests/backends/webdav.php
@@ -24,6 +24,13 @@
namespace Test\Files\Storage;
+/**
+ * Class DAV
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class DAV extends Storage {
protected function setUp() {
diff --git a/apps/files_external/tests/env/start-amazons3-ceph.sh b/apps/files_external/tests/env/start-amazons3-ceph.sh
index 3b4a15da92a..20fa7e7bb2b 100755
--- a/apps/files_external/tests/env/start-amazons3-ceph.sh
+++ b/apps/files_external/tests/env/start-amazons3-ceph.sh
@@ -49,9 +49,12 @@ echo "${docker_image} container: $container"
# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host)
echo $container >> $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.amazons3
-# TODO find a way to determine the successful initialization inside the docker container
-echo "Waiting 20 seconds for ceph initialization ... "
-sleep 20
+echo -n "Waiting for ceph initialization"
+if ! "$thisFolder"/env/wait-for-connection ${host} ${port} 60; then
+ echo "[ERROR] Waited 60 seconds, no response" >&2
+ exit 1
+fi
+sleep 1
echo "Create ceph user"
docker exec $container radosgw-admin user create \
diff --git a/apps/files_external/tests/env/start-ftp-morrisjobke.sh b/apps/files_external/tests/env/start-ftp-morrisjobke.sh
index f1ab7f69952..3a5f6ffcb67 100755
--- a/apps/files_external/tests/env/start-ftp-morrisjobke.sh
+++ b/apps/files_external/tests/env/start-ftp-morrisjobke.sh
@@ -54,12 +54,16 @@ echo "ftp container: $container"
# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host)
echo $container >> $thisFolder/dockerContainerMorrisJobke.$EXECUTOR_NUMBER.ftp
+echo -n "Waiting for ftp initialization"
+if ! "$thisFolder"/env/wait-for-connection ${host} 21 60; then
+ echo "[ERROR] Waited 60 seconds, no response" >&2
+ exit 1
+fi
+sleep 1
+
if [ -n "$DEBUG" ]; then
cat $thisFolder/config.ftp.php
cat $thisFolder/dockerContainerMorrisJobke.$EXECUTOR_NUMBER.ftp
fi
-# TODO find a way to determine the successful initialization inside the docker container
-echo "Waiting 5 seconds for ftp initialization ... "
-sleep 5
diff --git a/apps/files_external/tests/env/start-sftp-atmoz.sh b/apps/files_external/tests/env/start-sftp-atmoz.sh
index bebc7289250..0fc0c5c427f 100755
--- a/apps/files_external/tests/env/start-sftp-atmoz.sh
+++ b/apps/files_external/tests/env/start-sftp-atmoz.sh
@@ -54,15 +54,18 @@ echo "sftp container: $container"
# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host)
echo $container >> $thisFolder/dockerContainerAtmoz.$EXECUTOR_NUMBER.sftp
+echo -n "Waiting for sftp initialization"
+if ! "$thisFolder"/env/wait-for-connection ${host} 22 60; then
+ echo "[ERROR] Waited 60 seconds, no response" >&2
+ exit 1
+fi
+sleep 1
+
if [ -n "$DEBUG" ]; then
cat $thisFolder/config.sftp.php
cat $thisFolder/dockerContainerAtmoz.$EXECUTOR_NUMBER.sftp
fi
-# TODO find a way to determine the successful initialization inside the docker container
-echo "Waiting 5 seconds for sftp initialization ... "
-sleep 5
-
# create folder "upload" with correct permissions
docker exec $container bash -c "mkdir /home/$user/upload && chown $user:users /home/$user/upload"
diff --git a/apps/files_external/tests/env/start-smb-silvershell.sh b/apps/files_external/tests/env/start-smb-silvershell.sh
index 41ba3b11a70..a7ff3f71eb1 100755
--- a/apps/files_external/tests/env/start-smb-silvershell.sh
+++ b/apps/files_external/tests/env/start-smb-silvershell.sh
@@ -52,12 +52,16 @@ echo "samba container: $container"
# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host)
echo $container >> $thisFolder/dockerContainerSilvershell.$EXECUTOR_NUMBER.smb
+echo -n "Waiting for samba initialization"
+if ! "$thisFolder"/env/wait-for-connection ${host} 445 60; then
+ echo "[ERROR] Waited 60 seconds, no response" >&2
+ exit 1
+fi
+sleep 1
+
if [ -n "$DEBUG" ]; then
cat $thisFolder/config.smb.php
cat $thisFolder/dockerContainerSilvershell.$EXECUTOR_NUMBER.smb
fi
-# TODO find a way to determine the successful initialization inside the docker container
-echo "Waiting 5 seconds for smbd initialization ... "
-sleep 5
diff --git a/apps/files_external/tests/env/start-smb-windows.sh b/apps/files_external/tests/env/start-smb-windows.sh
index 2143d7e7499..9453b4eb3e7 100755
--- a/apps/files_external/tests/env/start-smb-windows.sh
+++ b/apps/files_external/tests/env/start-smb-windows.sh
@@ -19,6 +19,11 @@ user=smb-test
password=!owncloud123
host=WIN-9GTFAS08C15
+if ! "$thisFolder"/env/wait-for-connection ${host} 445 0; then
+ echo "[ERROR] Server not reachable" >&2
+ exit 1
+fi
+
cat > $thisFolder/config.smb.php <<DELIM
<?php
diff --git a/apps/files_external/tests/env/start-swift-ceph.sh b/apps/files_external/tests/env/start-swift-ceph.sh
new file mode 100755
index 00000000000..936bb667e94
--- /dev/null
+++ b/apps/files_external/tests/env/start-swift-ceph.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+#
+# ownCloud
+#
+# This script start a docker container to test the files_external tests
+# against. It will also change the files_external config to use the docker
+# container as testing environment. This is reverted in the stop step.W
+#
+# Set environment variable DEBUG to print config file
+#
+# @author Morris Jobke
+# @author Robin McCorkell
+# @copyright 2015 ownCloud
+
+if ! command -v docker >/dev/null 2>&1; then
+ echo "No docker executable found - skipped docker setup"
+ exit 0;
+fi
+
+echo "Docker executable found - setup docker"
+
+docker_image=xenopathic/ceph-keystone
+
+echo "Fetch recent ${docker_image} docker image"
+docker pull ${docker_image}
+
+# retrieve current folder to place the config in the parent folder
+thisFolder=`echo $0 | replace "env/start-swift-ceph.sh" ""`
+
+if [ -z "$thisFolder" ]; then
+ thisFolder="."
+fi;
+
+port=5001
+
+user=test
+pass=testing
+tenant=testenant
+region=testregion
+service=testceph
+
+container=`docker run -d \
+ -e KEYSTONE_PUBLIC_PORT=${port} \
+ -e KEYSTONE_ADMIN_USER=${user} \
+ -e KEYSTONE_ADMIN_PASS=${pass} \
+ -e KEYSTONE_ADMIN_TENANT=${tenant} \
+ -e KEYSTONE_ENDPOINT_REGION=${region} \
+ -e KEYSTONE_SERVICE=${service} \
+ ${docker_image}`
+
+host=`docker inspect --format="{{.NetworkSettings.IPAddress}}" $container`
+
+
+echo "${docker_image} container: $container"
+
+# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host)
+echo $container >> $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift
+
+echo -n "Waiting for ceph initialization"
+if ! "$thisFolder"/env/wait-for-connection ${host} 80 60; then
+ echo "[ERROR] Waited 60 seconds, no response" >&2
+ exit 1
+fi
+sleep 1
+
+cat > $thisFolder/config.swift.php <<DELIM
+<?php
+
+return array(
+ 'run'=>true,
+ 'url'=>'http://$host:$port/v2.0',
+ 'user'=>'$user',
+ 'tenant'=>'$tenant',
+ 'password'=>'$pass',
+ 'service_name'=>'$service',
+ 'bucket'=>'swift',
+ 'region' => '$region',
+);
+
+DELIM
+
+if [ -n "$DEBUG" ]; then
+ cat $thisFolder/config.swift.php
+ cat $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift
+fi
diff --git a/apps/files_external/tests/env/start-webdav-ownCloud.sh b/apps/files_external/tests/env/start-webdav-ownCloud.sh
index 6bf9142ee53..d992516d7b1 100755
--- a/apps/files_external/tests/env/start-webdav-ownCloud.sh
+++ b/apps/files_external/tests/env/start-webdav-ownCloud.sh
@@ -46,20 +46,23 @@ fi
container=`docker run -P $parameter -d -e ADMINLOGIN=test -e ADMINPWD=test morrisjobke/owncloud`
-# TODO find a way to determine the successful initialization inside the docker container
-echo "Waiting 30 seconds for ownCloud initialization ... "
-sleep 30
+host=`docker inspect --format="{{.NetworkSettings.IPAddress}}" $container`
-# get mapped port on host for internal port 80 - output is IP:PORT - we need to extract the port with 'cut'
-port=`docker port $container 80 | cut -f 2 -d :`
+echo -n "Waiting for ownCloud initialization"
+if ! "$thisFolder"/env/wait-for-connection ${host} 80 60; then
+ echo "[ERROR] Waited 60 seconds, no response" >&2
+ exit 1
+fi
+# wait at least 5 more seconds - sometimes the webserver still needs some additional time
+sleep 5
cat > $thisFolder/config.webdav.php <<DELIM
<?php
return array(
'run'=>true,
- 'host'=>'localhost:$port/owncloud/remote.php/webdav/',
+ 'host'=>'${host}:80/owncloud/remote.php/webdav/',
'user'=>'test',
'password'=>'test',
'root'=>'',
diff --git a/apps/files_external/tests/env/stop-swift-ceph.sh b/apps/files_external/tests/env/stop-swift-ceph.sh
new file mode 100755
index 00000000000..edac1389a78
--- /dev/null
+++ b/apps/files_external/tests/env/stop-swift-ceph.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# ownCloud
+#
+# This script stops the docker container the files_external tests were run
+# against. It will also revert the config changes done in start step.
+#
+# @author Morris Jobke
+# @author Robin McCorkell
+# @copyright 2015 ownCloud
+
+if ! command -v docker >/dev/null 2>&1; then
+ echo "No docker executable found - skipped docker stop"
+ exit 0;
+fi
+
+echo "Docker executable found - stop and remove docker containers"
+
+# retrieve current folder to remove the config from the parent folder
+thisFolder=`echo $0 | replace "env/stop-swift-ceph.sh" ""`
+
+if [ -z "$thisFolder" ]; then
+ thisFolder="."
+fi;
+
+# stopping and removing docker containers
+for container in `cat $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift`; do
+ echo "Stopping and removing docker container $container"
+ # kills running container and removes it
+ docker rm -f $container
+done;
+
+# cleanup
+rm $thisFolder/config.swift.php
+rm $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift
+
diff --git a/apps/files_external/tests/env/wait-for-connection b/apps/files_external/tests/env/wait-for-connection
new file mode 100755
index 00000000000..2c480fb733e
--- /dev/null
+++ b/apps/files_external/tests/env/wait-for-connection
@@ -0,0 +1,45 @@
+#!/usr/bin/php
+<?php
+
+$timeout = 60;
+
+switch ($argc) {
+case 4:
+ $timeout = (float)$argv[3];
+case 3:
+ $host = $argv[1];
+ $port = (int)$argv[2];
+ break;
+default:
+ fwrite(STDERR, 'Usage: '.$argv[0].' host port [timeout]'."\n");
+ exit(2);
+}
+
+if ($timeout < 0) {
+ fwrite(STDERR, 'Timeout must be greater than zero'."\n");
+ exit(2);
+}
+if ($port < 1) {
+ fwrite(STDERR, 'Port must be an integer greater than zero'."\n");
+ exit(2);
+}
+
+$socketTimeout = (float)ini_get('default_socket_timeout');
+if ($socketTimeout > $timeout) {
+ $socketTimeout = $timeout;
+}
+
+$stopTime = time() + $timeout;
+do {
+ $sock = @fsockopen($host, $port, $errno, $errstr, $socketTimeout);
+ if ($sock !== false) {
+ fclose($sock);
+ fwrite(STDOUT, "\n");
+ exit(0);
+ }
+ sleep(1);
+ fwrite(STDOUT, '.');
+} while (time() < $stopTime);
+
+fwrite(STDOUT, "\n");
+exit(1);
diff --git a/apps/files_external/tests/etagpropagator.php b/apps/files_external/tests/etagpropagator.php
deleted file mode 100644
index d45982cb40c..00000000000
--- a/apps/files_external/tests/etagpropagator.php
+++ /dev/null
@@ -1,343 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace Tests\Files_External;
-
-use OC\Files\Filesystem;
-use OC\User\User;
-
-class EtagPropagator extends \Test\TestCase {
- protected function getUser() {
- return new User($this->getUniqueID(), null);
- }
-
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject | \OC\Files\Cache\ChangePropagator
- */
- protected function getChangePropagator() {
- return $this->getMockBuilder('\OC\Files\Cache\ChangePropagator')
- ->disableOriginalConstructor()
- ->getMock();
- }
-
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject | \OCP\IConfig
- */
- protected function getConfig() {
- $appConfig = array();
- $userConfig = array();
- $mock = $this->getMockBuilder('\OCP\IConfig')
- ->disableOriginalConstructor()
- ->getMock();
-
- $mock->expects($this->any())
- ->method('getAppValue')
- ->will($this->returnCallback(function ($appId, $key, $default = null) use (&$appConfig) {
- if (isset($appConfig[$appId]) and isset($appConfig[$appId][$key])) {
- return $appConfig[$appId][$key];
- } else {
- return $default;
- }
- }));
- $mock->expects($this->any())
- ->method('setAppValue')
- ->will($this->returnCallback(function ($appId, $key, $value) use (&$appConfig) {
- if (!isset($appConfig[$appId])) {
- $appConfig[$appId] = array();
- }
- $appConfig[$appId][$key] = $value;
- }));
- $mock->expects($this->any())
- ->method('getAppKeys')
- ->will($this->returnCallback(function ($appId) use (&$appConfig) {
- if (!isset($appConfig[$appId])) {
- $appConfig[$appId] = array();
- }
- return array_keys($appConfig[$appId]);
- }));
-
- $mock->expects($this->any())
- ->method('getUserValue')
- ->will($this->returnCallback(function ($userId, $appId, $key, $default = null) use (&$userConfig) {
- if (isset($userConfig[$userId]) and isset($userConfig[$userId][$appId]) and isset($userConfig[$userId][$appId][$key])) {
- return $userConfig[$userId][$appId][$key];
- } else {
- return $default;
- }
- }));
- $mock->expects($this->any())
- ->method('setUserValue')
- ->will($this->returnCallback(function ($userId, $appId, $key, $value) use (&$userConfig) {
- if (!isset($userConfig[$userId])) {
- $userConfig[$userId] = array();
- }
- if (!isset($userConfig[$userId][$appId])) {
- $userConfig[$userId][$appId] = array();
- }
- $userConfig[$userId][$appId][$key] = $value;
- }));
-
- return $mock;
- }
-
- public function testSingleUserMount() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $changePropagator->expects($this->once())
- ->method('addChange')
- ->with('/test');
- $changePropagator->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator->updateHook(array(
- Filesystem::signal_param_path => '/test',
- Filesystem::signal_param_mount_type => \OC_Mount_Config::MOUNT_TYPE_USER,
- Filesystem::signal_param_users => $user->getUID(),
- ), $time);
- }
-
- public function testGlobalMountNoDirectUpdate() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- // not updated directly
- $changePropagator->expects($this->never())
- ->method('addChange');
- $changePropagator->expects($this->never())
- ->method('propagateChanges');
-
- $propagator->updateHook(array(
- Filesystem::signal_param_path => '/test',
- Filesystem::signal_param_mount_type => \OC_Mount_Config::MOUNT_TYPE_USER,
- Filesystem::signal_param_users => 'all',
- ), $time);
-
- // mount point marked as dirty
- $this->assertEquals(array('/test'), $config->getAppKeys('files_external'));
- $this->assertEquals($time, $config->getAppValue('files_external', '/test'));
- }
-
- public function testGroupMountNoDirectUpdate() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- // not updated directly
- $changePropagator->expects($this->never())
- ->method('addChange');
- $changePropagator->expects($this->never())
- ->method('propagateChanges');
-
- $propagator->updateHook(array(
- Filesystem::signal_param_path => '/test',
- Filesystem::signal_param_mount_type => \OC_Mount_Config::MOUNT_TYPE_GROUP,
- Filesystem::signal_param_users => 'test',
- ), $time);
-
- // mount point marked as dirty
- $this->assertEquals(array('/test'), $config->getAppKeys('files_external'));
- $this->assertEquals($time, $config->getAppValue('files_external', '/test'));
- }
-
- public function testGlobalMountNoDirtyMountPoint() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $changePropagator->expects($this->never())
- ->method('addChange');
- $changePropagator->expects($this->never())
- ->method('propagateChanges');
-
- $propagator->propagateDirtyMountPoints($time);
-
- $this->assertEquals(0, $config->getUserValue($user->getUID(), 'files_external', '/test', 0));
- }
-
- public function testGlobalMountDirtyMountPointFirstTime() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $config->setAppValue('files_external', '/test', $time - 10);
-
- $changePropagator->expects($this->once())
- ->method('addChange')
- ->with('/test');
- $changePropagator->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time, $config->getUserValue($user->getUID(), 'files_external', '/test'));
- }
-
- public function testGlobalMountNonDirtyMountPoint() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $config->setAppValue('files_external', '/test', $time - 10);
- $config->setUserValue($user->getUID(), 'files_external', '/test', $time - 10);
-
- $changePropagator->expects($this->never())
- ->method('addChange');
- $changePropagator->expects($this->never())
- ->method('propagateChanges');
-
- $propagator->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time - 10, $config->getUserValue($user->getUID(), 'files_external', '/test'));
- }
-
- public function testGlobalMountNonDirtyMountPointOtherUser() {
- $time = time();
- $user = $this->getUser();
- $user2 = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $config->setAppValue('files_external', '/test', $time - 10);
- $config->setUserValue($user2->getUID(), 'files_external', '/test', $time - 10);
-
- $changePropagator->expects($this->once())
- ->method('addChange')
- ->with('/test');
- $changePropagator->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time, $config->getUserValue($user->getUID(), 'files_external', '/test'));
- }
-
- public function testGlobalMountDirtyMountPointSecondTime() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $config->setAppValue('files_external', '/test', $time - 10);
- $config->setUserValue($user->getUID(), 'files_external', '/test', $time - 20);
-
- $changePropagator->expects($this->once())
- ->method('addChange')
- ->with('/test');
- $changePropagator->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time, $config->getUserValue($user->getUID(), 'files_external', '/test'));
- }
-
- public function testGlobalMountMultipleUsers() {
- $time = time();
- $config = $this->getConfig();
- $user1 = $this->getUser();
- $user2 = $this->getUser();
- $user3 = $this->getUser();
- $changePropagator1 = $this->getChangePropagator();
- $changePropagator2 = $this->getChangePropagator();
- $changePropagator3 = $this->getChangePropagator();
- $propagator1 = new \OCA\Files_External\EtagPropagator($user1, $changePropagator1, $config);
- $propagator2 = new \OCA\Files_External\EtagPropagator($user2, $changePropagator2, $config);
- $propagator3 = new \OCA\Files_External\EtagPropagator($user3, $changePropagator3, $config);
-
- $config->setAppValue('files_external', '/test', $time - 10);
-
- $changePropagator1->expects($this->once())
- ->method('addChange')
- ->with('/test');
- $changePropagator1->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator1->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time, $config->getUserValue($user1->getUID(), 'files_external', '/test'));
- $this->assertEquals(0, $config->getUserValue($user2->getUID(), 'files_external', '/test', 0));
- $this->assertEquals(0, $config->getUserValue($user3->getUID(), 'files_external', '/test', 0));
-
- $changePropagator2->expects($this->once())
- ->method('addChange')
- ->with('/test');
- $changePropagator2->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator2->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time, $config->getUserValue($user1->getUID(), 'files_external', '/test'));
- $this->assertEquals($time, $config->getUserValue($user2->getUID(), 'files_external', '/test', 0));
- $this->assertEquals(0, $config->getUserValue($user3->getUID(), 'files_external', '/test', 0));
- }
-
- public function testGlobalMountMultipleDirtyMountPoints() {
- $time = time();
- $user = $this->getUser();
- $config = $this->getConfig();
- $changePropagator = $this->getChangePropagator();
- $propagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, $config);
-
- $config->setAppValue('files_external', '/test', $time - 10);
- $config->setAppValue('files_external', '/foo', $time - 50);
- $config->setAppValue('files_external', '/bar', $time - 70);
-
- $config->setUserValue($user->getUID(), 'files_external', '/foo', $time - 70);
- $config->setUserValue($user->getUID(), 'files_external', '/bar', $time - 70);
-
- $changePropagator->expects($this->exactly(2))
- ->method('addChange');
- $changePropagator->expects($this->once())
- ->method('propagateChanges')
- ->with($time);
-
- $propagator->propagateDirtyMountPoints($time);
-
- $this->assertEquals($time, $config->getUserValue($user->getUID(), 'files_external', '/test'));
- $this->assertEquals($time, $config->getUserValue($user->getUID(), 'files_external', '/foo'));
- $this->assertEquals($time - 70, $config->getUserValue($user->getUID(), 'files_external', '/bar'));
- }
-}
diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js
index 67a81277124..3d0168898ca 100644
--- a/apps/files_external/tests/js/settingsSpec.js
+++ b/apps/files_external/tests/js/settingsSpec.js
@@ -54,7 +54,8 @@ describe('OCA.External.Settings tests', function() {
// within the DOM by the server template
$('#externalStorage .selectBackend:first').data('configurations', {
'\\OC\\TestBackend': {
- 'backend': 'Test Backend Name',
+ 'identifier': '\\OC\\TestBackend',
+ 'name': 'Test Backend',
'configuration': {
'field1': 'Display Name 1',
'field2': '&Display Name 2'
@@ -65,7 +66,8 @@ describe('OCA.External.Settings tests', function() {
'priority': 11
},
'\\OC\\AnotherTestBackend': {
- 'backend': 'Another Test Backend Name',
+ 'identifier': '\\OC\\AnotherTestBackend',
+ 'name': 'Another Test Backend',
'configuration': {
'field1': 'Display Name 1',
'field2': '&Display Name 2'
@@ -80,6 +82,7 @@ describe('OCA.External.Settings tests', function() {
$('#externalStorage #addMountPoint .authentication:first').data('mechanisms', {
'mechanism1': {
+ 'identifier': 'mechanism1',
'name': 'Mechanism 1',
'configuration': {
},
diff --git a/apps/files_external/tests/owncloudfunctions.php b/apps/files_external/tests/owncloudfunctions.php
index 4cfe83db950..887dd91539b 100644
--- a/apps/files_external/tests/owncloudfunctions.php
+++ b/apps/files_external/tests/owncloudfunctions.php
@@ -24,6 +24,13 @@
namespace Test\Files\Storage;
+/**
+ * Class OwnCloudFunctions
+ *
+ * @group DB
+ *
+ * @package Test\Files\Storage
+ */
class OwnCloudFunctions extends \Test\TestCase {
function configUrlProvider() {
diff --git a/apps/files_sharing/ajax/list.php b/apps/files_sharing/ajax/list.php
deleted file mode 100644
index c7f0bde5d4a..00000000000
--- a/apps/files_sharing/ajax/list.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <rullzer@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-OCP\JSON::checkAppEnabled('files_sharing');
-
-if(!isset($_GET['t'])){
- \OC_Response::setStatus(\OC_Response::STATUS_BAD_REQUEST);
- \OCP\Util::writeLog('core-preview', 'No token parameter was passed', \OCP\Util::DEBUG);
- exit;
-}
-
-$token = $_GET['t'];
-
-$password = null;
-if (isset($_POST['password'])) {
- $password = $_POST['password'];
-}
-
-$relativePath = null;
-if (isset($_GET['dir'])) {
- $relativePath = $_GET['dir'];
-}
-
-$sortAttribute = isset( $_GET['sort'] ) ? $_GET['sort'] : 'name';
-$sortDirection = isset( $_GET['sortdirection'] ) ? ($_GET['sortdirection'] === 'desc') : false;
-
-$data = \OCA\Files_Sharing\Helper::setupFromToken($token, $relativePath, $password);
-
-$linkItem = $data['linkItem'];
-// Load the files
-$dir = $data['realPath'];
-
-$dir = \OC\Files\Filesystem::normalizePath($dir);
-if (!\OC\Files\Filesystem::is_dir($dir . '/')) {
- \OC_Response::setStatus(\OC_Response::STATUS_NOT_FOUND);
- \OCP\JSON::error(array('success' => false));
- exit();
-}
-
-$data = array();
-
-// make filelist
-$files = \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection);
-
-$formattedFiles = array();
-foreach ($files as $file) {
- $entry = \OCA\Files\Helper::formatFileInfo($file);
- // for now
- unset($entry['directory']);
- // do not disclose share owner
- unset($entry['shareOwner']);
- // do not disclose if something is a remote shares
- unset($entry['mountType']);
- unset($entry['icon']);
- $entry['permissions'] = \OCP\Constants::PERMISSION_READ;
- $formattedFiles[] = $entry;
-}
-
-$data['directory'] = $relativePath;
-$data['files'] = $formattedFiles;
-$data['dirToken'] = $linkItem['token'];
-
-$permissions = $linkItem['permissions'];
-
-// if globally disabled
-if (\OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_public_upload', 'yes') === 'no') {
- // only allow reading
- $permissions = \OCP\Constants::PERMISSION_READ;
-}
-
-$data['permissions'] = $permissions;
-
-OCP\JSON::success(array('data' => $data));
diff --git a/apps/files_sharing/api/local.php b/apps/files_sharing/api/local.php
index bb5136a0c99..aaafafb269f 100644
--- a/apps/files_sharing/api/local.php
+++ b/apps/files_sharing/api/local.php
@@ -233,6 +233,7 @@ class Local {
if (\OC::$server->getPreviewManager()->isMimeSupported($share['mimetype'])) {
$share['isPreviewAvailable'] = true;
}
+ unset($share['path']);
}
}
$result = new \OC_OCS_Result($shares);
diff --git a/apps/files_sharing/api/ocssharewrapper.php b/apps/files_sharing/api/ocssharewrapper.php
index 8c0d8f7d150..ca04c656c28 100644
--- a/apps/files_sharing/api/ocssharewrapper.php
+++ b/apps/files_sharing/api/ocssharewrapper.php
@@ -26,24 +26,23 @@ class OCSShareWrapper {
* @return Share20OCS
*/
private function getShare20OCS() {
- return new Share20OCS(new \OC\Share20\Manager(
- \OC::$server->getUserSession()->getUser(),
- \OC::$server->getUserManager(),
- \OC::$server->getGroupManager(),
- \OC::$server->getLogger(),
- \OC::$server->getAppConfig(),
- \OC::$server->getUserFolder(),
- new \OC\Share20\DefaultShareProvider(
- \OC::$server->getDatabaseConnection(),
- \OC::$server->getUserManager(),
- \OC::$server->getGroupManager(),
- \OC::$server->getUserFolder()
- )
- ),
- \OC::$server->getGroupManager(),
- \OC::$server->getUserManager(),
- \OC::$server->getRequest(),
- \OC::$server->getUserFolder());
+ return new Share20OCS(
+ new \OC\Share20\Manager(
+ \OC::$server->getLogger(),
+ \OC::$server->getAppConfig(),
+ new \OC\Share20\DefaultShareProvider(
+ \OC::$server->getDatabaseConnection(),
+ \OC::$server->getUserManager(),
+ \OC::$server->getGroupManager(),
+ \OC::$server->getRootFolder()
+ )
+ ),
+ \OC::$server->getGroupManager(),
+ \OC::$server->getUserManager(),
+ \OC::$server->getRequest(),
+ \OC::$server->getRootFolder(),
+ \OC::$server->getURLGenerator(),
+ \OC::$server->getUserSession()->getUser());
}
public function getAllShares($params) {
@@ -55,7 +54,8 @@ class OCSShareWrapper {
}
public function getShare($params) {
- return \OCA\Files_Sharing\API\Local::getShare($params);
+ $id = $params['id'];
+ return $this->getShare20OCS()->getShare($id);
}
public function updateShare($params) {
@@ -63,7 +63,7 @@ class OCSShareWrapper {
}
public function deleteShare($params) {
- $id = (int)$params['id'];
+ $id = $params['id'];
return $this->getShare20OCS()->deleteShare($id);
}
}
diff --git a/apps/files_sharing/api/remote.php b/apps/files_sharing/api/remote.php
index 41ebb6e2eab..fb692f8a9a6 100644
--- a/apps/files_sharing/api/remote.php
+++ b/apps/files_sharing/api/remote.php
@@ -98,7 +98,7 @@ class Remote {
*/
private static function extendShareInfo($share) {
$view = new \OC\Files\View('/' . \OC_User::getUser() . '/files/');
- $info = $view->getFileInfo($shares['mountpoint']);
+ $info = $view->getFileInfo($share['mountpoint']);
$share['mimetype'] = $info->getMimetype();
$share['mtime'] = $info->getMtime();
diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php
index 8a7f90c0023..6c25b4a4426 100644
--- a/apps/files_sharing/api/share20ocs.php
+++ b/apps/files_sharing/api/share20ocs.php
@@ -20,39 +20,147 @@
*/
namespace OCA\Files_Sharing\API;
+use OC\Share20\IShare;
+
+use OCP\IGroupManager;
+use OCP\IUserManager;
+use OCP\IRequest;
+use OCP\Files\Folder;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\Files\IRootFolder;
+
class Share20OCS {
- /** @var OC\Share20\Manager */
+ /** @var \OC\Share20\Manager */
private $shareManager;
- /** @var OCP\IGroupManager */
+ /** @var IGroupManager */
private $groupManager;
- /** @var OCP\IUserManager */
+ /** @var IUserManager */
private $userManager;
- /** @var OCP\IRequest */
+ /** @var IRequest */
private $request;
- /** @var OCP\Files\Folder */
- private $userFolder;
+ /** @var IRootFolder */
+ private $rootFolder;
+
+ /** @var IUrlGenerator */
+ private $urlGenerator;
- public function __construct(\OC\Share20\Manager $shareManager,
- \OCP\IGroupManager $groupManager,
- \OCP\IUserManager $userManager,
- \OCP\IRequest $request,
- \OCP\Files\Folder $userFolder) {
+ /** @var IUser */
+ private $currentUser;
+
+ public function __construct(
+ \OC\Share20\Manager $shareManager,
+ IGroupManager $groupManager,
+ IUserManager $userManager,
+ IRequest $request,
+ IRootFolder $rootFolder,
+ IURLGenerator $urlGenerator,
+ IUser $currentUser
+ ) {
$this->shareManager = $shareManager;
$this->userManager = $userManager;
$this->groupManager = $groupManager;
$this->request = $request;
- $this->userFolder = $userFolder;
+ $this->rootFolder = $rootFolder;
+ $this->urlGenerator = $urlGenerator;
+ $this->currentUser = $currentUser;
+ }
+
+ /**
+ * Convert an IShare to an array for OCS output
+ *
+ * @param IShare $share
+ * @return array
+ */
+ protected function formatShare($share) {
+ $result = [
+ 'id' => $share->getId(),
+ 'share_type' => $share->getShareType(),
+ 'uid_owner' => $share->getSharedBy()->getUID(),
+ 'displayname_owner' => $share->getSharedBy()->getDisplayName(),
+ 'permissions' => $share->getPermissions(),
+ 'stime' => $share->getShareTime(),
+ 'parent' => $share->getParent(),
+ 'expiration' => null,
+ 'token' => null,
+ ];
+
+ $path = $share->getPath();
+ $result['path'] = $this->rootFolder->getUserFolder($share->getShareOwner()->getUID())->getRelativePath($path->getPath());
+ if ($path instanceOf \OCP\Files\Folder) {
+ $result['item_type'] = 'folder';
+ } else {
+ $result['item_type'] = 'file';
+ }
+ $result['storage_id'] = $path->getStorage()->getId();
+ $result['storage'] = \OC\Files\Cache\Storage::getNumericStorageId($path->getStorage()->getId());
+ $result['item_source'] = $path->getId();
+ $result['file_source'] = $path->getId();
+ $result['file_parent'] = $path->getParent()->getId();
+ $result['file_target'] = $share->getTarget();
+
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
+ $sharedWith = $share->getSharedWith();
+ $result['share_with'] = $sharedWith->getUID();
+ $result['share_with_displayname'] = $sharedWith->getDisplayName();
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
+ $sharedWith = $share->getSharedWith();
+ $result['share_with'] = $sharedWith->getGID();
+ $result['share_with_displayname'] = $sharedWith->getGID();
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
+
+ $result['share_with'] = $share->getPassword();
+ $result['share_with_displayname'] = $share->getPassword();
+
+ $result['token'] = $share->getToken();
+ $result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]);
+
+ $expiration = $share->getExpirationDate();
+ if ($expiration !== null) {
+ $result['expiration'] = $expiration->format('Y-m-d 00:00:00');
+ }
+
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) {
+ $result['share_with'] = $share->getSharedWith();
+ $result['share_with_displayname'] = $share->getSharedWith();
+ $result['token'] = $share->getToken();
+ }
+
+ $result['mail_send'] = $share->getMailSend() ? 1 : 0;
+
+ return $result;
+ }
+
+ /**
+ * Get a specific share by id
+ *
+ * @param string $id
+ * @return \OC_OCS_Result
+ */
+ public function getShare($id) {
+ try {
+ $share = $this->shareManager->getShareById($id);
+ } catch (\OC\Share20\Exception\ShareNotFound $e) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
+
+ if ($this->canAccessShare($share)) {
+ $share = $this->formatShare($share);
+ return new \OC_OCS_Result($share);
+ } else {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
}
/**
* Delete a share
*
- * @param int $id
+ * @param string $id
* @return \OC_OCS_Result
*/
public function deleteShare($id) {
@@ -70,6 +178,10 @@ class Share20OCS {
\OCA\Files_Sharing\API\Local::deleteShare(['id' => $id]);
}
+ if (!$this->canAccessShare($share)) {
+ return new \OC_OCS_Result(null, 404, 'could not delete share');
+ }
+
try {
$this->shareManager->deleteShare($share);
} catch (\OC\Share20\Exception\BackendError $e) {
@@ -78,4 +190,30 @@ class Share20OCS {
return new \OC_OCS_Result();
}
+
+ /**
+ * @param IShare $share
+ * @return bool
+ */
+ protected function canAccessShare(IShare $share) {
+ // Owner of the file and the sharer of the file can always get share
+ if ($share->getShareOwner() === $this->currentUser ||
+ $share->getSharedBy() === $this->currentUser
+ ) {
+ return true;
+ }
+
+ // If the share is shared with you (or a group you are a member of)
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER &&
+ $share->getSharedWith() === $this->currentUser) {
+ return true;
+ }
+
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP &&
+ $share->getSharedWith()->inGroup($this->currentUser)) {
+ return true;
+ }
+
+ return false;
+ }
}
diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php
index 21f68d9b253..24b51d7afe4 100644
--- a/apps/files_sharing/api/sharees.php
+++ b/apps/files_sharing/api/sharees.php
@@ -120,6 +120,7 @@ class Sharees {
protected function getUsers($search) {
$this->result['users'] = $this->result['exact']['users'] = $users = [];
+ $userGroups = [];
if ($this->shareWithGroupOnly) {
// Search in all the groups this user is part of
$userGroups = $this->groupManager->getUserGroupIds($this->userSession->getUser());
@@ -171,13 +172,23 @@ class Sharees {
// user id and if so, we add that to the exact match list
$user = $this->userManager->get($search);
if ($user instanceof IUser) {
- array_push($this->result['exact']['users'], [
- 'label' => $user->getDisplayName(),
- 'value' => [
- 'shareType' => Share::SHARE_TYPE_USER,
- 'shareWith' => $user->getUID(),
- ],
- ]);
+ $addUser = true;
+
+ if ($this->shareWithGroupOnly) {
+ // Only add, if we have a common group
+ $commonGroups = array_intersect($userGroups, $this->groupManager->getUserGroupIds($user));
+ $addUser = !empty($commonGroups);
+ }
+
+ if ($addUser) {
+ array_push($this->result['exact']['users'], [
+ 'label' => $user->getDisplayName(),
+ 'value' => [
+ 'shareType' => Share::SHARE_TYPE_USER,
+ 'shareWith' => $user->getUID(),
+ ],
+ ]);
+ }
}
}
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index 03e448be0af..d7f3ba6e98d 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -42,7 +42,6 @@ $l = \OC::$server->getL10N('files_sharing');
$application = new Application();
$application->registerMountProviders();
-$application->setupPropagation();
\OCP\App::registerAdmin('files_sharing', 'settings-admin');
\OCP\App::registerPersonal('files_sharing', 'settings-personal');
@@ -58,7 +57,9 @@ $eventDispatcher->addListener(
function() {
\OCP\Util::addScript('files_sharing', 'share');
\OCP\Util::addScript('files_sharing', 'sharetabview');
- \OCP\Util::addScript('files_sharing', 'external');
+ if (\OC::$server->getConfig()->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') === 'yes') {
+ \OCP\Util::addScript('files_sharing', 'external');
+ }
\OCP\Util::addStyle('files_sharing', 'sharetabview');
}
);
diff --git a/apps/files_sharing/appinfo/application.php b/apps/files_sharing/appinfo/application.php
index 545a9425083..ffe3a6a513f 100644
--- a/apps/files_sharing/appinfo/application.php
+++ b/apps/files_sharing/appinfo/application.php
@@ -27,8 +27,6 @@ namespace OCA\Files_Sharing\AppInfo;
use OCA\Files_Sharing\Helper;
use OCA\Files_Sharing\MountProvider;
-use OCA\Files_Sharing\Propagation\PropagationManager;
-use OCA\Files_Sharing\Propagation\GroupPropagationManager;
use OCP\AppFramework\App;
use OC\AppFramework\Utility\SimpleContainer;
use OCA\Files_Sharing\Controllers\ExternalSharesController;
@@ -116,8 +114,7 @@ class Application extends App {
/** @var \OCP\IServerContainer $server */
$server = $c->query('ServerContainer');
return new MountProvider(
- $server->getConfig(),
- $c->query('PropagationManager')
+ $server->getConfig()
);
});
@@ -132,25 +129,6 @@ class Application extends App {
);
});
- $container->registerService('PropagationManager', function (IContainer $c) {
- /** @var \OCP\IServerContainer $server */
- $server = $c->query('ServerContainer');
- return new PropagationManager(
- $server->getUserSession(),
- $server->getConfig()
- );
- });
-
- $container->registerService('GroupPropagationManager', function (IContainer $c) {
- /** @var \OCP\IServerContainer $server */
- $server = $c->query('ServerContainer');
- return new GroupPropagationManager(
- $server->getUserSession(),
- $server->getGroupManager(),
- $c->query('PropagationManager')
- );
- });
-
/*
* Register capabilities
*/
@@ -164,11 +142,4 @@ class Application extends App {
$mountProviderCollection->registerProvider($this->getContainer()->query('MountProvider'));
$mountProviderCollection->registerProvider($this->getContainer()->query('ExternalMountProvider'));
}
-
- public function setupPropagation() {
- $propagationManager = $this->getContainer()->query('PropagationManager');
- \OCP\Util::connectHook('OC_Filesystem', 'setup', $propagationManager, 'globalSetup');
-
- $this->getContainer()->query('GroupPropagationManager')->globalSetup();
- }
}
diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css
index 7597004e684..642c0909af3 100644
--- a/apps/files_sharing/css/sharetabview.css
+++ b/apps/files_sharing/css/sharetabview.css
@@ -28,7 +28,7 @@
width: 94%;
margin-left: 0;
}
-.shareTabView #shareWith {
+.shareTabView input[type="text"].shareWithField {
width: 80%;
}
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js
index 3168e930829..af198208de2 100644
--- a/apps/files_sharing/js/app.js
+++ b/apps/files_sharing/js/app.js
@@ -142,7 +142,7 @@ OCA.Sharing.App = {
// folder in the files app instead of opening it directly
fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
OCA.Files.App.setActiveView('files', {silent: true});
- OCA.Files.App.fileList.changeDirectory(context.$file.attr('data-path') + '/' + filename, true, true);
+ OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true);
});
fileActions.setDefault('dir', 'Open');
return fileActions;
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 246b639f652..0b78d200b94 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -48,8 +48,20 @@ OCA.Sharing.PublicApp = {
this._initialized = true;
this.initialDir = $('#dir').val();
+ var token = $('#sharingToken').val();
+
// file list mode ?
if ($el.find('#filestable').length) {
+ var filesClient = new OC.Files.Client({
+ host: OC.getHost(),
+ port: OC.getPort(),
+ userName: token,
+ // note: password not be required, the endpoint
+ // will recognize previous validation from the session
+ root: OC.getRootPath() + '/public.php/webdav',
+ useHTTPS: OC.getProtocol() === 'https'
+ });
+
this.fileList = new OCA.Files.FileList(
$el,
{
@@ -58,7 +70,8 @@ OCA.Sharing.PublicApp = {
dragOptions: dragOptions,
folderDropOptions: folderDropOptions,
fileActions: fileActions,
- detailsViewEnabled: false
+ detailsViewEnabled: false,
+ filesClient: filesClient
}
);
this.files = OCA.Files.Files;
@@ -88,7 +101,6 @@ OCA.Sharing.PublicApp = {
// dynamically load image previews
- var token = $('#sharingToken').val();
var bottomMargin = 350;
var previewWidth = Math.ceil($(window).width() * window.devicePixelRatio);
var previewHeight = Math.ceil(($(window).height() - bottomMargin) * window.devicePixelRatio);
@@ -136,11 +148,14 @@ OCA.Sharing.PublicApp = {
if (this.fileList) {
// TODO: move this to a separate PublicFileList class that extends OCA.Files.FileList (+ unit tests)
- this.fileList.getDownloadUrl = function (filename, dir) {
- if ($.isArray(filename)) {
+ this.fileList.getDownloadUrl = function (filename, dir, isDir) {
+ var path = dir || this.getCurrentDirectory();
+ if (filename && !_.isArray(filename) && !isDir) {
+ return OC.getRootPath() + '/public.php/webdav' + OC.joinPaths(path, filename);
+ }
+ if (_.isArray(filename)) {
filename = JSON.stringify(filename);
}
- var path = dir || FileList.getCurrentDirectory();
var params = {
path: path,
files: filename
@@ -274,8 +289,12 @@ OCA.Sharing.PublicApp = {
_saveToOwnCloud: function (remote, token, owner, name, isProtected) {
var location = window.location.protocol + '//' + window.location.host + OC.webroot;
+
+ if(remote.substr(-1) !== '/') {
+ remote += '/'
+ };
- var url = remote + '/index.php/apps/files#' + 'remote=' + encodeURIComponent(location) // our location is the remote for the other server
+ var url = remote + 'index.php/apps/files#' + 'remote=' + encodeURIComponent(location) // our location is the remote for the other server
+ "&token=" + encodeURIComponent(token) + "&owner=" + encodeURIComponent(owner) + "&name=" + encodeURIComponent(name) + "&protected=" + isProtected;
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 63225a0d8ec..3d105f283d8 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -50,7 +50,7 @@
if (fileData.shareOwner) {
tr.attr('data-share-owner', fileData.shareOwner);
// user should always be able to rename a mount point
- if (fileData.isShareMountPoint) {
+ if (fileData.mountType === 'shared-root') {
tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
}
}
@@ -68,6 +68,26 @@
return fileInfo;
};
+ var NS_OC = 'http://owncloud.org/ns';
+
+ var oldGetWebdavProperties = fileList._getWebdavProperties;
+ fileList._getWebdavProperties = function() {
+ var props = oldGetWebdavProperties.apply(this, arguments);
+ props.push('{' + NS_OC + '}owner-display-name');
+ return props;
+ };
+
+ fileList.filesClient.addFileInfoParser(function(response) {
+ var data = {};
+ var props = response.propStat[0].properties;
+ var permissionsProp = props['{' + NS_OC + '}permissions'];
+
+ if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
+ data.shareOwner = props['{' + NS_OC + '}owner-display-name'];
+ }
+ return data;
+ });
+
// use delegate to catch the case with multiple file lists
fileList.$el.on('fileActionsReady', function(ev){
var fileList = ev.fileList;
diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index 68bfd63ec89..a799d4a94c2 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -231,6 +231,7 @@
files = _.chain(files)
// convert share data to file data
.map(function(share) {
+ // TODO: use OC.Files.FileInfo
var file = {
id: share.file_source,
icon: OC.MimeType.getIconUrl(share.mimetype),
@@ -242,9 +243,6 @@
}
else {
file.type = 'file';
- if (share.isPreviewAvailable) {
- file.isPreviewAvailable = true;
- }
}
file.share = {
id: share.id,
diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js
index 295c7cdbb76..1c5121fdde2 100644
--- a/apps/files_sharing/l10n/de.js
+++ b/apps/files_sharing/l10n/de.js
@@ -62,7 +62,7 @@ OC.L10N.register(
"Password" : "Passwort",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Name" : "Name",
- "Share time" : "Zeitpunkt der Freigabe",
+ "Share time" : "Freigabezeitpunkt",
"Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" : "Gründe könnten sein:",
"the item was removed" : "Das Element wurde entfernt",
diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json
index 690e7596ffc..48b2e81b681 100644
--- a/apps/files_sharing/l10n/de.json
+++ b/apps/files_sharing/l10n/de.json
@@ -60,7 +60,7 @@
"Password" : "Passwort",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Name" : "Name",
- "Share time" : "Zeitpunkt der Freigabe",
+ "Share time" : "Freigabezeitpunkt",
"Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" : "Gründe könnten sein:",
"the item was removed" : "Das Element wurde entfernt",
diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js
index 47243b8f81d..b1b4be9e5ad 100644
--- a/apps/files_sharing/l10n/de_DE.js
+++ b/apps/files_sharing/l10n/de_DE.js
@@ -40,8 +40,17 @@ OC.L10N.register(
"You shared %1$s with group %2$s" : "Sie haben %1$s mit der Gruppe %2$s geteilt",
"%2$s shared %1$s with you" : "%2$s hat %1$s mit Ihnen geteilt",
"You shared %1$s via link" : "Sie haben %1$s über einen Link geteilt",
+ "Downloaded via public link" : "Über den öffentlichen Link heruntergeladen",
+ "Shared with %2$s" : "Geteilt mit %2$s",
+ "Shared with group %2$s" : "Geteilt mit der Gruppe %2$s",
+ "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s",
+ "Shared with group %3$s by %2$s" : "Geteilt mit der Gruppe %3$s von %2$s",
+ "Shared via link by %2$s" : "Geteilt durch einen Link von %2$s",
+ "Shared by %2$s" : "Geteilt von %2$s",
+ "Shared via public link" : "Durch einen öffentlichen Link geteilt",
"Shares" : "Geteiltes",
"Accept" : "Akzeptieren",
+ "Decline" : "Ablehnen",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID",
"This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt",
@@ -49,7 +58,7 @@ OC.L10N.register(
"Password" : "Passwort",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Name" : "Name",
- "Share time" : "Zeitpunkt der Freigabe",
+ "Share time" : "Freigabezeitpunkt",
"Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" : "Gründe könnten sein:",
"the item was removed" : "Das Element wurde entfernt",
@@ -67,6 +76,7 @@ OC.L10N.register(
"Federated Cloud" : "Federated Cloud",
"Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
"Share it:" : "Zum Teilen:",
+ "Add to your website" : "Zu Ihrer Website hinzufügen",
"Share with me via ownCloud" : "Teilen Sie mit mir über ownCloud",
"HTML Code:" : "HTML-Code:"
},
diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json
index b63286de48d..7ed2c480284 100644
--- a/apps/files_sharing/l10n/de_DE.json
+++ b/apps/files_sharing/l10n/de_DE.json
@@ -38,8 +38,17 @@
"You shared %1$s with group %2$s" : "Sie haben %1$s mit der Gruppe %2$s geteilt",
"%2$s shared %1$s with you" : "%2$s hat %1$s mit Ihnen geteilt",
"You shared %1$s via link" : "Sie haben %1$s über einen Link geteilt",
+ "Downloaded via public link" : "Über den öffentlichen Link heruntergeladen",
+ "Shared with %2$s" : "Geteilt mit %2$s",
+ "Shared with group %2$s" : "Geteilt mit der Gruppe %2$s",
+ "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s",
+ "Shared with group %3$s by %2$s" : "Geteilt mit der Gruppe %3$s von %2$s",
+ "Shared via link by %2$s" : "Geteilt durch einen Link von %2$s",
+ "Shared by %2$s" : "Geteilt von %2$s",
+ "Shared via public link" : "Durch einen öffentlichen Link geteilt",
"Shares" : "Geteiltes",
"Accept" : "Akzeptieren",
+ "Decline" : "Ablehnen",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID",
"This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt",
@@ -47,7 +56,7 @@
"Password" : "Passwort",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Name" : "Name",
- "Share time" : "Zeitpunkt der Freigabe",
+ "Share time" : "Freigabezeitpunkt",
"Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" : "Gründe könnten sein:",
"the item was removed" : "Das Element wurde entfernt",
@@ -65,6 +74,7 @@
"Federated Cloud" : "Federated Cloud",
"Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
"Share it:" : "Zum Teilen:",
+ "Add to your website" : "Zu Ihrer Website hinzufügen",
"Share with me via ownCloud" : "Teilen Sie mit mir über ownCloud",
"HTML Code:" : "HTML-Code:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_sharing/l10n/es_AR.js b/apps/files_sharing/l10n/es_AR.js
index fac8b357506..f0e363b2f49 100644
--- a/apps/files_sharing/l10n/es_AR.js
+++ b/apps/files_sharing/l10n/es_AR.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"files_sharing",
{
+ "Server to server sharing is not enabled on this server" : "Compartir entre servidores no está habilitado en este servidor",
"Cancel" : "Cancelar",
"Shared by" : "Compartido por",
"Sharing" : "Compartiendo",
diff --git a/apps/files_sharing/l10n/es_AR.json b/apps/files_sharing/l10n/es_AR.json
index 6a7316bff8c..7a6441c7bdf 100644
--- a/apps/files_sharing/l10n/es_AR.json
+++ b/apps/files_sharing/l10n/es_AR.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Server to server sharing is not enabled on this server" : "Compartir entre servidores no está habilitado en este servidor",
"Cancel" : "Cancelar",
"Shared by" : "Compartido por",
"Sharing" : "Compartiendo",
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index b80be0c3315..e40acc0104a 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -26,9 +26,9 @@ OC.L10N.register(
"Invalid ownCloud url" : "無効なownCloud URL です",
"Shared by" : "共有者:",
"Sharing" : "共有",
- "A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーが<strong>共有</strong>されました。",
- "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されました。",
- "A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロード</strong>されました。",
+ "A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーが<strong>共有</strong>されたとき",
+ "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されたとき",
+ "A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロード</strong>されたとき",
"You received a new remote share %2$s from %1$s" : "%1$s から新しいリモート共有のリクエスト %2$s を受け取りました。",
"You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。",
"%1$s accepted remote share %2$s" : "%1$s は %2$s のリモート共有を承認しました。",
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index 8f9efffb782..989a723b2a8 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -24,9 +24,9 @@
"Invalid ownCloud url" : "無効なownCloud URL です",
"Shared by" : "共有者:",
"Sharing" : "共有",
- "A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーが<strong>共有</strong>されました。",
- "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されました。",
- "A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロード</strong>されました。",
+ "A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーが<strong>共有</strong>されたとき",
+ "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されたとき",
+ "A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロード</strong>されたとき",
"You received a new remote share %2$s from %1$s" : "%1$s から新しいリモート共有のリクエスト %2$s を受け取りました。",
"You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。",
"%1$s accepted remote share %2$s" : "%1$s は %2$s のリモート共有を承認しました。",
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 93e2cdb540b..020f55c5157 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -192,6 +192,8 @@ class Manager {
$acceptShare->execute(array(1, $mountPoint, $hash, $id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'accept');
+ \OC_Hook::emit('OCP\Share', 'federated_share_added', ['server' => $share['remote']]);
+
//FIXME $this->scrapNotification($share['remote_id']);
return true;
}
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 270d8b6d1b8..2a0d827e064 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -250,7 +250,7 @@ class Storage extends DAV implements ISharedStorage {
$response = $client->post($url, ['body' => ['password' => $password]]);
} catch (\GuzzleHttp\Exception\RequestException $e) {
if ($e->getCode() === 401 || $e->getCode() === 403) {
- throw new ForbiddenException();
+ throw new ForbiddenException();
}
// throw this to be on the safe side: the share will still be visible
// in the UI in case the failure is intermittent, and the user will
@@ -260,4 +260,9 @@ class Storage extends DAV implements ISharedStorage {
return json_decode($response->getBody(), true);
}
+
+ public function getOwner($path) {
+ list(, $remote) = explode('://', $this->remote, 2);
+ return $this->remoteUser . '@' . $remote;
+ }
}
diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index a804737c490..391b491e1ff 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -310,20 +310,4 @@ class Helper {
\OC::$server->getConfig()->setSystemValue('share_folder', $shareFolder);
}
- /**
- * remove protocol from URL
- *
- * @param string $url
- * @return string
- */
- public static function removeProtocolFromUrl($url) {
- if (strpos($url, 'https://') === 0) {
- return substr($url, strlen('https://'));
- } else if (strpos($url, 'http://') === 0) {
- return substr($url, strlen('http://'));
- }
-
- return $url;
- }
-
}
diff --git a/apps/files_sharing/lib/mountprovider.php b/apps/files_sharing/lib/mountprovider.php
index 458e7f2619b..74a2a3ff4d6 100644
--- a/apps/files_sharing/lib/mountprovider.php
+++ b/apps/files_sharing/lib/mountprovider.php
@@ -24,7 +24,6 @@ namespace OCA\Files_Sharing;
use OC\Files\Filesystem;
use OC\User\NoUserException;
-use OCA\Files_Sharing\Propagation\PropagationManager;
use OCP\Files\Config\IMountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IConfig;
@@ -37,17 +36,10 @@ class MountProvider implements IMountProvider {
protected $config;
/**
- * @var \OCA\Files_Sharing\Propagation\PropagationManager
- */
- protected $propagationManager;
-
- /**
* @param \OCP\IConfig $config
- * @param \OCA\Files_Sharing\Propagation\PropagationManager $propagationManager
*/
- public function __construct(IConfig $config, PropagationManager $propagationManager) {
+ public function __construct(IConfig $config) {
$this->config = $config;
- $this->propagationManager = $propagationManager;
}
@@ -60,21 +52,15 @@ class MountProvider implements IMountProvider {
*/
public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) {
$shares = \OCP\Share::getItemsSharedWithUser('file', $user->getUID());
- $propagator = $this->propagationManager->getSharePropagator($user->getUID());
- $propagator->propagateDirtyMountPoints($shares);
$shares = array_filter($shares, function ($share) {
return $share['permissions'] > 0;
});
$shares = array_map(function ($share) use ($user, $storageFactory) {
- // for updating etags for the share owner when we make changes to this share.
- $ownerPropagator = $this->propagationManager->getChangePropagator($share['uid_owner']);
return new SharedMount(
'\OC\Files\Storage\Shared',
'/' . $user->getUID() . '/' . $share['file_target'],
array(
- 'propagationManager' => $this->propagationManager,
- 'propagator' => $ownerPropagator,
'share' => $share,
'user' => $user->getUID()
),
diff --git a/apps/files_sharing/lib/propagation/changewatcher.php b/apps/files_sharing/lib/propagation/changewatcher.php
deleted file mode 100644
index e61c161da19..00000000000
--- a/apps/files_sharing/lib/propagation/changewatcher.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-/**
- * @author Robin Appelman <icewind@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing\Propagation;
-
-use OC\Files\Cache\ChangePropagator;
-use OC\Files\Filesystem;
-use OC\Files\View;
-use OCA\Files_Sharing\SharedMount;
-
-/**
- * Watch for changes made in a shared mount and propagate the changes to the share owner
- */
-class ChangeWatcher {
- /**
- * The user view for the logged in user
- *
- * @var \OC\Files\View
- */
- private $baseView;
-
- /**
- * @var RecipientPropagator
- */
- private $recipientPropagator;
-
- /**
- * @param \OC\Files\View $baseView the view for the logged in user
- * @param RecipientPropagator $recipientPropagator
- */
- public function __construct(View $baseView, RecipientPropagator $recipientPropagator) {
- $this->baseView = $baseView;
- $this->recipientPropagator = $recipientPropagator;
- }
-
-
- public function writeHook($params) {
- $path = $params['path'];
- $fullPath = $this->baseView->getAbsolutePath($path);
- $mount = $this->baseView->getMount($path);
- if ($mount instanceof SharedMount) {
- $this->propagateForOwner($mount->getShare(), $mount->getInternalPath($fullPath), $mount->getOwnerPropagator());
- }
- $info = $this->baseView->getFileInfo($path);
- if ($info) {
- // trigger propagation if the subject of the write hook is shared.
- // if a parent folder of $path is shared the propagation will be triggered from the change propagator hooks
- $this->recipientPropagator->propagateById($info->getId());
- }
- }
-
- public function renameHook($params) {
- $path1 = $params['oldpath'];
- $path2 = $params['newpath'];
- $fullPath1 = $this->baseView->getAbsolutePath($path1);
- $fullPath2 = $this->baseView->getAbsolutePath($path2);
- $mount1 = $this->baseView->getMount($path1);
- $mount2 = $this->baseView->getMount($path2);
- if ($mount1 instanceof SharedMount and $mount1->getInternalPath($fullPath1) !== '') {
- $this->propagateForOwner($mount1->getShare(), $mount1->getInternalPath($fullPath1), $mount1->getOwnerPropagator());
- }
- if ($mount1 !== $mount2 and $mount2 instanceof SharedMount and $mount2->getInternalPath($fullPath2) !== '') {
- $this->propagateForOwner($mount2->getShare(), $mount2->getInternalPath($fullPath2), $mount2->getOwnerPropagator());
- }
- }
-
- /**
- * @param array $share
- * @param string $internalPath
- * @param \OC\Files\Cache\ChangePropagator $propagator
- */
- private function propagateForOwner($share, $internalPath, ChangePropagator $propagator) {
- // note that we have already set up the filesystem for the owner when mounting the share
- $view = new View('/' . $share['uid_owner'] . '/files');
-
- $shareRootPath = $view->getPath($share['item_source']);
- if (!is_null($shareRootPath)) {
- $path = $shareRootPath . '/' . $internalPath;
- $path = Filesystem::normalizePath($path);
- $propagator->addChange($path);
- $propagator->propagateChanges();
- }
- }
-
- public function permissionsHook($params) {
- $share = $params['share'];
-
- if ($share['item_type'] === 'file' || $share['item_type'] === 'folder') {
- $this->recipientPropagator->markDirty($share, microtime(true));
- }
- }
-}
diff --git a/apps/files_sharing/lib/propagation/grouppropagationmanager.php b/apps/files_sharing/lib/propagation/grouppropagationmanager.php
deleted file mode 100644
index ba550dccec3..00000000000
--- a/apps/files_sharing/lib/propagation/grouppropagationmanager.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-/**
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing\Propagation;
-
-use OC\Files\Filesystem;
-use OC\Files\View;
-use OCP\IConfig;
-use OCP\IUserSession;
-use OCP\IGroup;
-use OCP\IUser;
-use OCP\IGroupManager;
-use OCA\Files_Sharing\Propagation\PropagationManager;
-
-/**
- * Propagate changes on group changes
- */
-class GroupPropagationManager {
- /**
- * @var \OCP\IUserSession
- */
- private $userSession;
-
- /**
- * @var \OCP\IGroupManager
- */
- private $groupManager;
-
- /**
- * @var PropagationManager
- */
- private $propagationManager;
-
- /**
- * Items shared with a given user.
- * Key is user id and value is an array of shares.
- *
- * @var array
- */
- private $userShares = [];
-
- public function __construct(IUserSession $userSession, IGroupManager $groupManager, PropagationManager $propagationManager) {
- $this->userSession = $userSession;
- $this->groupManager = $groupManager;
- $this->propagationManager = $propagationManager;
- }
-
- public function onPreProcessUser(IGroup $group, IUser $targetUser) {
- $this->userShares[$targetUser->getUID()] = $this->getUserShares($targetUser->getUID());
- }
-
- public function onPostAddUser(IGroup $group, IUser $targetUser) {
- $targetUserId = $targetUser->getUID();
- $sharesAfter = $this->getUserShares($targetUserId);
-
- $this->propagateSharesDiff($targetUserId, $sharesAfter, $this->userShares[$targetUserId]);
- unset($this->userShares[$targetUserId]);
- }
-
- public function onPostRemoveUser(IGroup $group, IUser $targetUser) {
- $targetUserId = $targetUser->getUID();
- $sharesAfter = $this->getUserShares($targetUserId);
-
- $this->propagateSharesDiff($targetUserId, $this->userShares[$targetUserId], $sharesAfter);
- unset($this->userShares[$targetUserId]);
- }
-
- private function getUserShares($targetUserId) {
- return \OCP\Share::getItemsSharedWithUser('file', $targetUserId);
- }
-
- /**
- * Propagate etag for the shares that are in $shares1 but not in $shares2.
- *
- * @param string $targetUserId user id for which to propagate shares
- * @param array $shares1
- * @param array $shares2
- */
- private function propagateSharesDiff($targetUserId, $shares1, $shares2) {
- $sharesToPropagate = array_udiff(
- $shares1,
- $shares2,
- function($share1, $share2) {
- return ($share2['id'] - $share1['id']);
- }
- );
-
- \OC\Files\Filesystem::initMountPoints($targetUserId);
- $this->propagationManager->propagateSharesToUser($sharesToPropagate, $targetUserId);
- }
-
- /**
- * To be called from setupFS trough a hook
- *
- * Sets up listening to changes made to shares owned by the current user
- */
- public function globalSetup() {
- $user = $this->userSession->getUser();
- if (!$user) {
- return;
- }
-
- $this->groupManager->listen('\OC\Group', 'preAddUser', [$this, 'onPreProcessUser']);
- $this->groupManager->listen('\OC\Group', 'postAddUser', [$this, 'onPostAddUser']);
- $this->groupManager->listen('\OC\Group', 'preRemoveUser', [$this, 'onPreProcessUser']);
- $this->groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'onPostRemoveUser']);
- }
-
- public function tearDown() {
- $this->groupManager->removeListener('\OC\Group', 'preAddUser', [$this, 'onPreProcessUser']);
- $this->groupManager->removeListener('\OC\Group', 'postAddUser', [$this, 'onPostAddUser']);
- $this->groupManager->removeListener('\OC\Group', 'preRemoveUser', [$this, 'onPreProcessUser']);
- $this->groupManager->removeListener('\OC\Group', 'postRemoveUser', [$this, 'onPostRemoveUser']);
- }
-}
diff --git a/apps/files_sharing/lib/propagation/propagationmanager.php b/apps/files_sharing/lib/propagation/propagationmanager.php
deleted file mode 100644
index aac9428240d..00000000000
--- a/apps/files_sharing/lib/propagation/propagationmanager.php
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-/**
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing\Propagation;
-
-use OC\Files\Filesystem;
-use OC\Files\View;
-use OCP\IConfig;
-use OCP\IUserSession;
-use OCP\Util;
-
-
-/**
- * Keep track of all change and share propagators by owner
- */
-class PropagationManager {
- /**
- * @var \OCP\IUserSession
- */
- private $userSession;
-
- /**
- * @var \OCP\IConfig
- */
- private $config;
-
- /**
- * Change propagators for share owner
- *
- * @var \OC\Files\Cache\ChangePropagator[]
- */
- private $changePropagators = [];
-
- /**
- * Recipient propagators
- *
- * @var \OCA\Files_Sharing\Propagation\RecipientPropagator[]
- */
- private $sharePropagators = [];
-
- public function __construct(IUserSession $userSession, IConfig $config) {
- $this->userSession = $userSession;
- $this->config = $config;
- }
-
- /**
- * @param string $user
- * @return \OC\Files\Cache\ChangePropagator
- */
- public function getChangePropagator($user) {
- $activeUser = $this->userSession->getUser();
-
- // for the local user we want to propagator from the active view, not any cached one
- if ($activeUser && $activeUser->getUID() === $user && Filesystem::getView() instanceof View) {
- // it's important that we take the existing propagator here to make sure we can listen to external changes
- $this->changePropagators[$user] = Filesystem::getView()->getUpdater()->getPropagator();
- }
- if (isset($this->changePropagators[$user])) {
- return $this->changePropagators[$user];
- }
- $view = new View('/' . $user . '/files');
- $this->changePropagators[$user] = $view->getUpdater()->getPropagator();
- return $this->changePropagators[$user];
- }
-
- /**
- * Propagates etag changes for the given shares to the given user
- *
- * @param array array of shares for which to trigger etag change
- * @param string $user
- */
- public function propagateSharesToUser($shares, $user) {
- $changePropagator = $this->getChangePropagator($user);
- foreach ($shares as $share) {
- $changePropagator->addChange($share['file_target']);
- }
- $time = microtime(true);
- $changePropagator->propagateChanges(floor($time));
- }
-
- /**
- * @param string $user
- * @return \OCA\Files_Sharing\Propagation\RecipientPropagator
- */
- public function getSharePropagator($user) {
- if (isset($this->sharePropagators[$user])) {
- return $this->sharePropagators[$user];
- }
- $this->sharePropagators[$user] = new RecipientPropagator($user, $this->getChangePropagator($user), $this->config, $this);
- return $this->sharePropagators[$user];
- }
-
- /**
- * Attach the recipient propagator for $user to the change propagator of a share owner to mark shares as dirty when the owner makes a change to a share
- *
- * @param string $shareOwner
- * @param string $user
- */
- public function listenToOwnerChanges($shareOwner, $user) {
- $sharePropagator = $this->getSharePropagator($user);
- $ownerPropagator = $this->getChangePropagator($shareOwner);
- $sharePropagator->attachToPropagator($ownerPropagator, $shareOwner);
- }
-
- /**
- * To be called from setupFS trough a hook
- *
- * Sets up listening to changes made to shares owned by the current user
- */
- public function globalSetup() {
- $user = $this->userSession->getUser();
- if (!$user) {
- return;
- }
- $recipientPropagator = $this->getSharePropagator($user->getUID());
- $watcher = new ChangeWatcher(Filesystem::getView(), $recipientPropagator);
-
- // for marking shares owned by the active user as dirty when a file inside them changes
- $this->listenToOwnerChanges($user->getUID(), $user->getUID());
- Util::connectHook('OC_Filesystem', 'post_write', $watcher, 'writeHook');
- Util::connectHook('OC_Filesystem', 'post_delete', $watcher, 'writeHook');
- Util::connectHook('OC_Filesystem', 'post_rename', $watcher, 'renameHook');
- Util::connectHook('OCP\Share', 'post_update_permissions', $watcher, 'permissionsHook');
- }
-}
diff --git a/apps/files_sharing/lib/propagation/recipientpropagator.php b/apps/files_sharing/lib/propagation/recipientpropagator.php
deleted file mode 100644
index 5eacf4c0f6e..00000000000
--- a/apps/files_sharing/lib/propagation/recipientpropagator.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing\Propagation;
-
-use OC\Files\Cache\ChangePropagator;
-use OC\Files\View;
-use OC\Share\Share;
-use OCP\Files\NotFoundException;
-
-/**
- * Propagate etags for share recipients
- */
-class RecipientPropagator {
- /**
- * @var string
- */
- protected $userId;
-
- /**
- * @var \OC\Files\Cache\ChangePropagator
- */
- protected $changePropagator;
-
- /**
- * @var \OCP\IConfig
- */
- protected $config;
-
- /**
- * @var PropagationManager
- */
- private $manager;
-
- /**
- * @param string $userId current user, must match the propagator's
- * user
- * @param \OC\Files\Cache\ChangePropagator $changePropagator change propagator
- * initialized with a view for $user
- * @param \OCP\IConfig $config
- * @param PropagationManager $manager
- */
- public function __construct($userId, $changePropagator, $config, PropagationManager $manager) {
- $this->userId = $userId;
- $this->changePropagator = $changePropagator;
- $this->config = $config;
- $this->manager = $manager;
- }
-
- /**
- * Propagate the etag changes for all shares marked as dirty and mark the shares as clean
- *
- * @param array $shares the shares for the users
- * @param int $time
- */
- public function propagateDirtyMountPoints(array $shares, $time = null) {
- if ($time === null) {
- $time = microtime(true);
- }
- $dirtyShares = $this->getDirtyShares($shares);
- foreach ($dirtyShares as $share) {
- $this->changePropagator->addChange($share['file_target']);
- }
- if (count($dirtyShares)) {
- $this->config->setUserValue($this->userId, 'files_sharing', 'last_propagate', $time);
- $this->changePropagator->propagateChanges(floor($time));
- }
- }
-
- /**
- * Get all shares we need to update the etag for
- *
- * @param array $shares the shares for the users
- * @return string[]
- */
- protected function getDirtyShares($shares) {
- $dirty = [];
- $userTime = $this->config->getUserValue($this->userId, 'files_sharing', 'last_propagate', 0);
- foreach ($shares as $share) {
- $updateTime = $this->config->getAppValue('files_sharing', $share['id'], 0);
- if ($updateTime >= $userTime) {
- $dirty[] = $share;
- }
- }
- return $dirty;
- }
-
- /**
- * @param array $share
- * @param float $time
- */
- public function markDirty($share, $time = null) {
- if ($time === null) {
- $time = microtime(true);
- }
- $this->config->setAppValue('files_sharing', $share['id'], $time);
- }
-
- /**
- * Listen on the propagator for updates made to shares owned by a user
- *
- * @param \OC\Files\Cache\ChangePropagator $propagator
- * @param string $owner
- */
- public function attachToPropagator(ChangePropagator $propagator, $owner) {
- $propagator->listen('\OC\Files', 'propagate', function ($path, $entry) use ($owner) {
- $this->propagateById($entry['fileid']);
- });
- }
-
- protected $propagatingIds = [];
-
- /**
- * @param int $id
- */
- public function propagateById($id) {
- if (isset($this->propagatingIds[$id])) {
- return;
- }
- $this->propagatingIds[$id] = true;
- $shares = Share::getAllSharesForFileId($id);
- foreach ($shares as $share) {
- // propagate down the share tree
- $this->markDirty($share, microtime(true));
-
- // propagate up the share tree
- if ($share['share_with'] === $this->userId) {
- $user = $share['uid_owner'];
- $view = new View('/' . $user . '/files');
-
- try {
- $path = $view->getPath($share['file_source']);
- } catch (NotFoundException $e) {
- $path = null;
- }
-
- $watcher = new ChangeWatcher($view, $this->manager->getSharePropagator($user));
- $watcher->writeHook(['path' => $path]);
- }
- }
-
- unset($this->propagatingIds[$id]);
- }
-}
diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php
index a1387957867..275fea97c7f 100644
--- a/apps/files_sharing/lib/sharedmount.php
+++ b/apps/files_sharing/lib/sharedmount.php
@@ -39,11 +39,6 @@ class SharedMount extends MountPoint implements MoveableMount {
protected $storage = null;
/**
- * @var \OC\Files\Cache\ChangePropagator
- */
- protected $ownerPropagator;
-
- /**
* @var \OC\Files\View
*/
private $recipientView;
@@ -54,8 +49,6 @@ class SharedMount extends MountPoint implements MoveableMount {
private $user;
public function __construct($storage, $mountpoint, $arguments = null, $loader = null) {
- // first update the mount point before creating the parent
- $this->ownerPropagator = $arguments['propagator'];
$this->user = $arguments['user'];
$this->recipientView = new View('/' . $this->user . '/files');
$newMountPoint = $this->verifyMountPoint($arguments['share']);
@@ -201,11 +194,4 @@ class SharedMount extends MountPoint implements MoveableMount {
public function getShare() {
return $this->getStorage()->getShare();
}
-
- /**
- * @return \OC\Files\Cache\ChangePropagator
- */
- public function getOwnerPropagator() {
- return $this->ownerPropagator;
- }
}
diff --git a/apps/files_sharing/lib/sharedpropagator.php b/apps/files_sharing/lib/sharedpropagator.php
new file mode 100644
index 00000000000..fcb4b92dd33
--- /dev/null
+++ b/apps/files_sharing/lib/sharedpropagator.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Sharing;
+
+use OC\Files\Cache\Propagator;
+
+class SharedPropagator extends Propagator {
+ /**
+ * @var \OC\Files\Storage\Shared
+ */
+ protected $storage;
+
+ /**
+ * @param string $internalPath
+ * @param int $time
+ * @return array[] all propagated entries
+ */
+ public function propagateChange($internalPath, $time) {
+ $source = $this->storage->getSourcePath($internalPath);
+ /** @var \OC\Files\Storage\Storage $storage */
+ list($storage, $sourceInternalPath) = \OC\Files\Filesystem::resolvePath($source);
+ return $storage->getPropagator()->propagateChange($sourceInternalPath, $time);
+ }
+}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 18e02844179..4807b5ee738 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -51,11 +51,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
private $ownerView;
/**
- * @var \OCA\Files_Sharing\Propagation\PropagationManager
- */
- private $propagationManager;
-
- /**
* @var string
*/
private $user;
@@ -65,7 +60,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
public function __construct($arguments) {
$this->share = $arguments['share'];
$this->ownerView = $arguments['ownerView'];
- $this->propagationManager = $arguments['propagationManager'];
$this->user = $arguments['user'];
}
@@ -75,9 +69,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
}
$this->initialized = true;
Filesystem::initMountPoints($this->share['uid_owner']);
-
- // for updating our etags when changes are made to the share from the owners side (probably indirectly by us trough another share)
- $this->propagationManager->listenToOwnerChanges($this->share['uid_owner'], $this->user);
}
/**
@@ -571,6 +562,13 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
return new \OC\Files\Cache\Shared_Watcher($storage);
}
+ public function getPropagator($storage = null) {
+ if (!$storage) {
+ $storage = $this;
+ }
+ return new \OCA\Files_Sharing\SharedPropagator($storage);
+ }
+
public function getOwner($path) {
if ($path == '') {
$path = $this->getMountPoint();
diff --git a/apps/files_sharing/settings-personal.php b/apps/files_sharing/settings-personal.php
index deaa7b92ac7..85fad9c3eaf 100644
--- a/apps/files_sharing/settings-personal.php
+++ b/apps/files_sharing/settings-personal.php
@@ -32,9 +32,7 @@ if (count($matches) > 0 && $matches[1] <= 9) {
$isIE8 = true;
}
-$uid = \OC::$server->getUserSession()->getUser()->getUID();
-$server = \OC::$server->getURLGenerator()->getAbsoluteURL('/');
-$cloudID = $uid . '@' . rtrim(\OCA\Files_Sharing\Helper::removeProtocolFromUrl($server), '/');
+$cloudID = \OC::$server->getUserSession()->getUser()->getCloudId();
$url = 'https://owncloud.org/federation#' . $cloudID;
$ownCloudLogoPath = \OC::$server->getURLGenerator()->imagePath('core', 'logo-icon.svg');
diff --git a/apps/files_sharing/tests/activity.php b/apps/files_sharing/tests/activity.php
index f7f324cdfc3..fa626749957 100644
--- a/apps/files_sharing/tests/activity.php
+++ b/apps/files_sharing/tests/activity.php
@@ -22,10 +22,15 @@
*/
namespace OCA\Files_sharing\Tests;
-use OCA\Files_sharing\Tests\TestCase;
-
-class Activity extends \OCA\Files_Sharing\Tests\TestCase{
+/**
+ * Class Activity
+ *
+ * @group DB
+ *
+ * @package OCA\Files_sharing\Tests
+ */
+class Activity extends \OCA\Files_Sharing\Tests\TestCase {
/**
* @var \OCA\Files_Sharing\Activity
diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php
index 760bc0591e5..36ae3398393 100644
--- a/apps/files_sharing/tests/api.php
+++ b/apps/files_sharing/tests/api.php
@@ -31,6 +31,8 @@ use OCA\Files_sharing\Tests\TestCase;
/**
* Class Test_Files_Sharing_Api
+ *
+ * @group DB
*/
class Test_Files_Sharing_Api extends TestCase {
diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php
index 9c4377a2a7f..b7c56fe17f6 100644
--- a/apps/files_sharing/tests/api/share20ocstest.php
+++ b/apps/files_sharing/tests/api/share20ocstest.php
@@ -20,50 +20,61 @@
*/
namespace OCA\Files_Sharing\Tests\API;
+use OC\Share20\IShare;
use OCA\Files_Sharing\API\Share20OCS;
+use OCP\IGroupManager;
+use OCP\IUserManager;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\Files\IRootFolder;
class Share20OCSTest extends \Test\TestCase {
- /** @var OC\Share20\Manager */
+ /** @var \OC\Share20\Manager */
private $shareManager;
- /** @var OCP\IGroupManager */
+ /** @var IGroupManager */
private $groupManager;
- /** @var OCP\IUserManager */
+ /** @var IUserManager */
private $userManager;
- /** @var OCP\IRequest */
+ /** @var IRequest */
private $request;
- /** @var OCP\Files\Folder */
- private $userFolder;
+ /** @var IRootFolder */
+ private $rootFolder;
- /** @var OCS */
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /** @var IUser */
+ private $currentUser;
+
+ /** @var Share20OCS */
private $ocs;
protected function setUp() {
$this->shareManager = $this->getMockBuilder('OC\Share20\Manager')
->disableOriginalConstructor()
->getMock();
- $this->groupManager = $this->getMockBuilder('OCP\IGroupManager')
- ->disableOriginalConstructor()
- ->getMock();
- $this->userManager = $this->getMockBuilder('OCP\IUserManager')
- ->disableOriginalConstructor()
- ->getMock();
- $this->request = $this->getMockBuilder('OCP\IRequest')
- ->disableOriginalConstructor()
- ->getMock();
- $this->userFolder = $this->getMockBuilder('OCP\Files\Folder')
- ->disableOriginalConstructor()
- ->getMock();
+ $this->groupManager = $this->getMock('OCP\IGroupManager');
+ $this->userManager = $this->getMock('OCP\IUserManager');
+ $this->request = $this->getMock('OCP\IRequest');
+ $this->rootFolder = $this->getMock('OCP\Files\IRootFolder');
+ $this->urlGenerator = $this->getMock('OCP\IURLGenerator');
+ $this->currentUser = $this->getMock('OCP\IUser');
- $this->ocs = new Share20OCS($this->shareManager,
- $this->groupManager,
- $this->userManager,
- $this->request,
- $this->userFolder);
+ $this->ocs = new Share20OCS(
+ $this->shareManager,
+ $this->groupManager,
+ $this->userManager,
+ $this->request,
+ $this->rootFolder,
+ $this->urlGenerator,
+ $this->currentUser
+ );
}
public function testDeleteShareShareNotFound() {
@@ -79,6 +90,7 @@ class Share20OCSTest extends \Test\TestCase {
public function testDeleteShareCouldNotDelete() {
$share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareOwner')->willReturn($this->currentUser);
$this->shareManager
->expects($this->once())
->method('getShareById')
@@ -97,6 +109,7 @@ class Share20OCSTest extends \Test\TestCase {
public function testDeleteShare() {
$share = $this->getMock('OC\Share20\IShare');
+ $share->method('getSharedBy')->willReturn($this->currentUser);
$this->shareManager
->expects($this->once())
->method('getShareById')
@@ -110,4 +123,272 @@ class Share20OCSTest extends \Test\TestCase {
$expected = new \OC_OCS_Result();
$this->assertEquals($expected, $this->ocs->deleteShare(42));
}
+
+ public function testGetGetShareNotExists() {
+ $this->shareManager
+ ->expects($this->once())
+ ->method('getShareById')
+ ->with(42)
+ ->will($this->throwException(new \OC\Share20\Exception\ShareNotFound()));
+
+ $expected = new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ $this->assertEquals($expected, $this->ocs->getShare(42));
+ }
+
+ public function createShare($id, $shareType, $sharedWith, $sharedBy, $shareOwner, $path, $permissions,
+ $shareTime, $expiration, $parent, $target, $mail_send, $token=null,
+ $password=null) {
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getId')->willReturn($id);
+ $share->method('getShareType')->willReturn($shareType);
+ $share->method('getSharedWith')->willReturn($sharedWith);
+ $share->method('getSharedBy')->willReturn($sharedBy);
+ $share->method('getShareOwner')->willReturn($shareOwner);
+ $share->method('getPath')->willReturn($path);
+ $share->method('getPermissions')->willReturn($permissions);
+ $share->method('getShareTime')->willReturn($shareTime);
+ $share->method('getExpirationDate')->willReturn($expiration);
+ $share->method('getParent')->willReturn($parent);
+ $share->method('getTarget')->willReturn($target);
+ $share->method('getMailSend')->willReturn($mail_send);
+ $share->method('getToken')->willReturn($token);
+ $share->method('getPassword')->willReturn($password);
+
+ return $share;
+ }
+
+ public function dataGetShare() {
+ $data = [];
+
+ $owner = $this->getMock('OCP\IUser');
+ $owner->method('getUID')->willReturn('ownerId');
+ $owner->method('getDisplayName')->willReturn('ownerDisplay');
+
+ $user = $this->getMock('OCP\IUser');
+ $user->method('getUID')->willReturn('userId');
+ $user->method('getDisplayName')->willReturn('userDisplay');
+
+ $group = $this->getMock('OCP\IGroup');
+ $group->method('getGID')->willReturn('groupId');
+
+ $storage = $this->getMock('OCP\Files\Storage');
+ $storage->method('getId')->willReturn('STORAGE');
+
+ $parentFolder = $this->getMock('OCP\Files\Folder');
+ $parentFolder->method('getId')->willReturn(3);
+
+ $file = $this->getMock('OCP\Files\File');
+ $file->method('getId')->willReturn(1);
+ $file->method('getPath')->willReturn('file');
+ $file->method('getStorage')->willReturn($storage);
+ $file->method('getParent')->willReturn($parentFolder);
+
+ $folder = $this->getMock('OCP\Files\Folder');
+ $folder->method('getId')->willReturn(2);
+ $folder->method('getPath')->willReturn('folder');
+ $folder->method('getStorage')->willReturn($storage);
+ $folder->method('getParent')->willReturn($parentFolder);
+
+ // File shared with user
+ $share = $this->createShare(
+ 100,
+ \OCP\Share::SHARE_TYPE_USER,
+ $user,
+ $owner,
+ $owner,
+ $file,
+ 4,
+ 5,
+ null,
+ 6,
+ 'target',
+ 0
+ );
+ $expected = [
+ 'id' => 100,
+ 'share_type' => \OCP\Share::SHARE_TYPE_USER,
+ 'share_with' => 'userId',
+ 'share_with_displayname' => 'userDisplay',
+ 'uid_owner' => 'ownerId',
+ 'displayname_owner' => 'ownerDisplay',
+ 'item_type' => 'file',
+ 'item_source' => 1,
+ 'file_source' => 1,
+ 'file_target' => 'target',
+ 'file_parent' => 3,
+ 'token' => null,
+ 'expiration' => null,
+ 'permissions' => 4,
+ 'stime' => 5,
+ 'parent' => 6,
+ 'storage_id' => 'STORAGE',
+ 'path' => 'file',
+ 'storage' => null, // HACK around static function
+ 'mail_send' => 0,
+ ];
+ $data[] = [$share, $expected];
+
+ // Folder shared with group
+ $share = $this->createShare(
+ 101,
+ \OCP\Share::SHARE_TYPE_GROUP,
+ $group,
+ $owner,
+ $owner,
+ $folder,
+ 4,
+ 5,
+ null,
+ 6,
+ 'target',
+ 0
+ );
+ $expected = [
+ 'id' => 101,
+ 'share_type' => \OCP\Share::SHARE_TYPE_GROUP,
+ 'share_with' => 'groupId',
+ 'share_with_displayname' => 'groupId',
+ 'uid_owner' => 'ownerId',
+ 'displayname_owner' => 'ownerDisplay',
+ 'item_type' => 'folder',
+ 'item_source' => 2,
+ 'file_source' => 2,
+ 'file_target' => 'target',
+ 'file_parent' => 3,
+ 'token' => null,
+ 'expiration' => null,
+ 'permissions' => 4,
+ 'stime' => 5,
+ 'parent' => 6,
+ 'storage_id' => 'STORAGE',
+ 'path' => 'folder',
+ 'storage' => null, // HACK around static function
+ 'mail_send' => 0,
+ ];
+ $data[] = [$share, $expected];
+
+ // File shared by link with Expire
+ $expire = \DateTime::createFromFormat('Y-m-d h:i:s', '2000-01-02 01:02:03');
+ $share = $this->createShare(
+ 101,
+ \OCP\Share::SHARE_TYPE_LINK,
+ null,
+ $owner,
+ $owner,
+ $folder,
+ 4,
+ 5,
+ $expire,
+ 6,
+ 'target',
+ 0,
+ 'token',
+ 'password'
+ );
+ $expected = [
+ 'id' => 101,
+ 'share_type' => \OCP\Share::SHARE_TYPE_LINK,
+ 'share_with' => 'password',
+ 'share_with_displayname' => 'password',
+ 'uid_owner' => 'ownerId',
+ 'displayname_owner' => 'ownerDisplay',
+ 'item_type' => 'folder',
+ 'item_source' => 2,
+ 'file_source' => 2,
+ 'file_target' => 'target',
+ 'file_parent' => 3,
+ 'token' => 'token',
+ 'expiration' => '2000-01-02 00:00:00',
+ 'permissions' => 4,
+ 'stime' => 5,
+ 'parent' => 6,
+ 'storage_id' => 'STORAGE',
+ 'path' => 'folder',
+ 'storage' => null, // HACK around static function
+ 'mail_send' => 0,
+ 'url' => 'url',
+ ];
+ $data[] = [$share, $expected];
+
+ return $data;
+ }
+
+ /**
+ * @dataProvider dataGetShare
+ */
+ public function testGetShare(\OC\Share20\IShare $share, array $result) {
+ $ocs = $this->getMockBuilder('OCA\Files_Sharing\API\Share20OCS')
+ ->setConstructorArgs([
+ $this->shareManager,
+ $this->groupManager,
+ $this->userManager,
+ $this->request,
+ $this->rootFolder,
+ $this->urlGenerator,
+ $this->currentUser
+ ])->setMethods(['canAccessShare'])
+ ->getMock();
+
+ $ocs->method('canAccessShare')->willReturn(true);
+
+ $this->shareManager
+ ->expects($this->once())
+ ->method('getShareById')
+ ->with($share->getId())
+ ->willReturn($share);
+
+ $userFolder = $this->getMock('OCP\Files\Folder');
+ $userFolder
+ ->method('getRelativePath')
+ ->will($this->returnArgument(0));
+
+ $this->rootFolder->method('getUserFolder')
+ ->with($share->getShareOwner()->getUID())
+ ->willReturn($userFolder);
+
+ $this->urlGenerator
+ ->method('linkToRouteAbsolute')
+ ->willReturn('url');
+
+ $expected = new \OC_OCS_Result($result);
+ $this->assertEquals($expected->getData(), $ocs->getShare($share->getId())->getData());
+ }
+
+ public function testCanAccessShare() {
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareOwner')->willReturn($this->currentUser);
+ $this->assertTrue($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getSharedBy')->willReturn($this->currentUser);
+ $this->assertTrue($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_USER);
+ $share->method('getSharedWith')->willReturn($this->currentUser);
+ $this->assertTrue($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_USER);
+ $share->method('getSharedWith')->willReturn($this->getMock('OCP\IUser'));
+ $this->assertFalse($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_GROUP);
+ $group = $this->getMock('OCP\IGroup');
+ $group->method('inGroup')->with($this->currentUser)->willReturn(true);
+ $share->method('getSharedWith')->willReturn($group);
+ $this->assertTrue($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_GROUP);
+ $group = $this->getMock('OCP\IGroup');
+ $group->method('inGroup')->with($this->currentUser)->willReturn(false);
+ $share->method('getSharedWith')->willReturn($group);
+ $this->assertFalse($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+
+ $share = $this->getMock('OC\Share20\IShare');
+ $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK);
+ $this->assertFalse($this->invokePrivate($this->ocs, 'canAccessShare', [$share]));
+ }
}
diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php
index 8a35350aeb5..a3e3a6dee6d 100644
--- a/apps/files_sharing/tests/api/shareestest.php
+++ b/apps/files_sharing/tests/api/shareestest.php
@@ -27,6 +27,13 @@ use OCA\Files_sharing\Tests\TestCase;
use OCP\AppFramework\Http;
use OCP\Share;
+/**
+ * Class ShareesTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Sharing\Tests\API
+ */
class ShareesTest extends TestCase {
/** @var Sharees */
protected $sharees;
@@ -129,12 +136,20 @@ class ShareesTest extends TestCase {
],
[
'test', true, true, [], [],
+ [], [], true, $this->getUserMock('test', 'Test')
+ ],
+ [
+ 'test', true, false, [], [],
+ [], [], true, $this->getUserMock('test', 'Test')
+ ],
+ [
+ 'test', true, true, ['test-group'], [['test-group', 'test', 2, 0, []]],
[
['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
], [], true, $this->getUserMock('test', 'Test')
],
[
- 'test', true, false, [], [],
+ 'test', true, false, ['test-group'], [['test-group', 'test', 2, 0, []]],
[
['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
], [], true, $this->getUserMock('test', 'Test')
@@ -383,10 +398,20 @@ class ShareesTest extends TestCase {
->with($searchTerm, $this->invokePrivate($this->sharees, 'limit'), $this->invokePrivate($this->sharees, 'offset'))
->willReturn($userResponse);
} else {
- $this->groupManager->expects($this->once())
- ->method('getUserGroupIds')
- ->with($user)
- ->willReturn($groupResponse);
+ if ($singleUser !== false) {
+ $this->groupManager->expects($this->exactly(2))
+ ->method('getUserGroupIds')
+ ->withConsecutive(
+ $user,
+ $singleUser
+ )
+ ->willReturn($groupResponse);
+ } else {
+ $this->groupManager->expects($this->once())
+ ->method('getUserGroupIds')
+ ->with($user)
+ ->willReturn($groupResponse);
+ }
$this->groupManager->expects($this->exactly(sizeof($groupResponse)))
->method('displayNamesInGroup')
diff --git a/apps/files_sharing/tests/backend.php b/apps/files_sharing/tests/backend.php
index 1332342c44b..57cdfc45115 100644
--- a/apps/files_sharing/tests/backend.php
+++ b/apps/files_sharing/tests/backend.php
@@ -27,6 +27,8 @@ use OCA\Files_sharing\Tests\TestCase;
/**
* Class Test_Files_Sharing
+ *
+ * @group DB
*/
class Test_Files_Sharing_Backend extends TestCase {
diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php
index 7e7e5ee26d5..df7f4fd19a3 100644
--- a/apps/files_sharing/tests/cache.php
+++ b/apps/files_sharing/tests/cache.php
@@ -47,6 +47,12 @@ use OCA\Files_sharing\Tests\TestCase;
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
+
+/**
+ * Class Test_Files_Sharing_Cache
+ *
+ * @group DB
+ */
class Test_Files_Sharing_Cache extends TestCase {
/**
diff --git a/apps/files_sharing/tests/capabilities.php b/apps/files_sharing/tests/capabilities.php
index 8bebde9f2d1..6fb76f10c24 100644
--- a/apps/files_sharing/tests/capabilities.php
+++ b/apps/files_sharing/tests/capabilities.php
@@ -26,6 +26,8 @@ use OCA\Files_Sharing\Tests\TestCase;
/**
* Class FilesSharingCapabilitiesTest
+ *
+ * @group DB
*/
class FilesSharingCapabilitiesTest extends \Test\TestCase {
diff --git a/apps/files_sharing/tests/controller/sharecontroller.php b/apps/files_sharing/tests/controller/sharecontroller.php
index db5eb75d761..ccef4263c2b 100644
--- a/apps/files_sharing/tests/controller/sharecontroller.php
+++ b/apps/files_sharing/tests/controller/sharecontroller.php
@@ -38,6 +38,8 @@ use OCP\Share;
use OC\URLGenerator;
/**
+ * @group DB
+ *
* @package OCA\Files_Sharing\Controllers
*/
class ShareControllerTest extends \Test\TestCase {
diff --git a/apps/files_sharing/tests/deleteorphanedsharesjobtest.php b/apps/files_sharing/tests/deleteorphanedsharesjobtest.php
index 124cb83e6f0..a2e3f36f6ac 100644
--- a/apps/files_sharing/tests/deleteorphanedsharesjobtest.php
+++ b/apps/files_sharing/tests/deleteorphanedsharesjobtest.php
@@ -23,6 +23,13 @@ namespace Test\BackgroundJob;
use OCA\Files_sharing\Lib\DeleteOrphanedSharesJob;
+/**
+ * Class DeleteOrphanedSharesJobTest
+ *
+ * @group DB
+ *
+ * @package Test\BackgroundJob
+ */
class DeleteOrphanedSharesJobTest extends \Test\TestCase {
/**
diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php
index 1abf04df84f..de9ce565394 100644
--- a/apps/files_sharing/tests/etagpropagation.php
+++ b/apps/files_sharing/tests/etagpropagation.php
@@ -27,6 +27,13 @@ namespace OCA\Files_sharing\Tests;
use OC\Files\Filesystem;
use OC\Files\View;
+/**
+ * Class EtagPropagation
+ *
+ * @group DB
+ *
+ * @package OCA\Files_sharing\Tests
+ */
class EtagPropagation extends TestCase {
/**
* @var \OC\Files\View
@@ -193,7 +200,8 @@ class EtagPropagation extends TestCase {
public function testOwnerWritesToSingleFileShare() {
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
- Filesystem::file_put_contents('/foo.txt', 'bar');
+ Filesystem::file_put_contents('/foo.txt', 'longer_bar');
+ Filesystem::touch('/foo.txt', time() - 1);
$this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4, self::TEST_FILES_SHARING_API_USER3]);
$this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2]);
diff --git a/apps/files_sharing/tests/expiresharesjobtest.php b/apps/files_sharing/tests/expiresharesjobtest.php
index 63a2c46f647..b21d095e6b1 100644
--- a/apps/files_sharing/tests/expiresharesjobtest.php
+++ b/apps/files_sharing/tests/expiresharesjobtest.php
@@ -23,6 +23,13 @@ namespace OCA\Files_Sharing\Tests;
use OCA\Files_Sharing\ExpireSharesJob;
+/**
+ * Class ExpireSharesJobTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Sharing\Tests
+ */
class ExpireSharesJobTest extends \Test\TestCase {
/**
diff --git a/apps/files_sharing/tests/external/cache.php b/apps/files_sharing/tests/external/cache.php
index aa3839899ce..e44c935d3fd 100644
--- a/apps/files_sharing/tests/external/cache.php
+++ b/apps/files_sharing/tests/external/cache.php
@@ -23,24 +23,11 @@ namespace OCA\Files_sharing\Tests\External;
use OCA\Files_sharing\Tests\TestCase;
/**
- * ownCloud
+ * Class Cache
*
- * @author Vincent Petry
- * @copyright 2015 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/>.
+ * @group DB
*
+ * @package OCA\Files_sharing\Tests\External
*/
class Cache extends TestCase {
diff --git a/apps/files_sharing/tests/external/managertest.php b/apps/files_sharing/tests/external/managertest.php
index 5b93b7494e9..015be47270e 100644
--- a/apps/files_sharing/tests/external/managertest.php
+++ b/apps/files_sharing/tests/external/managertest.php
@@ -28,6 +28,13 @@ use OCA\Files_Sharing\External\MountProvider;
use OCA\Files_Sharing\Tests\TestCase;
use Test\Traits\UserTrait;
+/**
+ * Class ManagerTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Sharing\Tests\External
+ */
class ManagerTest extends TestCase {
use UserTrait;
diff --git a/apps/files_sharing/tests/externalstorage.php b/apps/files_sharing/tests/externalstorage.php
index a549e093dc1..109545119ba 100644
--- a/apps/files_sharing/tests/externalstorage.php
+++ b/apps/files_sharing/tests/externalstorage.php
@@ -24,6 +24,8 @@
/**
* Tests for the external Storage class for remote shares.
+ *
+ * @group DB
*/
class Test_Files_Sharing_External_Storage extends \Test\TestCase {
diff --git a/apps/files_sharing/tests/grouppropagationmanager.php b/apps/files_sharing/tests/grouppropagationmanager.php
deleted file mode 100644
index ea32ca4f7ec..00000000000
--- a/apps/files_sharing/tests/grouppropagationmanager.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-/**
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_sharing\Tests;
-
-use OC\Files\View;
-use OCP\IGroupManager;
-use OCP\IGroup;
-use OCP\IUser;
-use OCP\Share;
-use OCA\Files_Sharing\Propagation\GroupPropagationManager;
-use OCA\Files_Sharing\Propagation\PropagationManager;
-
-class GroupPropagationManagerTest extends TestCase {
-
- /**
- * @var GroupPropagationManager
- */
- private $groupPropagationManager;
-
- /**
- * @var IGroupManager
- */
- private $groupManager;
-
- /**
- * @var PropagationManager
- */
- private $propagationManager;
-
- /**
- * @var IGroup
- */
- private $recipientGroup;
-
- /**
- * @var IUser
- */
- private $recipientUser;
-
- /**
- * @var array
- */
- private $fileInfo;
-
- protected function setUp() {
- parent::setUp();
-
- $user = $this->getMockBuilder('\OCP\IUser')
- ->disableOriginalConstructor()
- ->getMock();
- $user->method('getUID')->willReturn(self::TEST_FILES_SHARING_API_USER1);
- $userSession = $this->getMockBuilder('\OCP\IUserSession')
- ->disableOriginalConstructor()
- ->getMock();
- $userSession->method('getUser')->willReturn(selF::TEST_FILES_SHARING_API_USER1);
-
- $this->propagationManager = $this->getMockBuilder('OCA\Files_Sharing\Propagation\PropagationManager')
- ->disableOriginalConstructor()
- ->getMock();
-
- $this->groupManager = \OC::$server->getGroupManager();
- $this->groupPropagationManager = new GroupPropagationManager(
- $userSession,
- $this->groupManager,
- $this->propagationManager
- );
- $this->groupPropagationManager->globalSetup();
-
- // since the sharing code is not mockable, we have to create a real folder
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
- $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
- $view1->mkdir('/folder');
-
- $this->fileInfo = $view1->getFileInfo('/folder');
-
- $this->recipientGroup = $this->groupManager->get(self::TEST_FILES_SHARING_API_GROUP1);
- $this->recipientUser = \OC::$server->getUserManager()->get(self::TEST_FILES_SHARING_API_USER3);
-
- Share::shareItem(
- 'folder',
- $this->fileInfo['fileid'],
- Share::SHARE_TYPE_GROUP,
- $this->recipientGroup->getGID(),
- \OCP\Constants::PERMISSION_READ
- );
-
- $this->loginAsUser($this->recipientUser->getUID());
- }
-
- protected function tearDown() {
- $this->groupPropagationManager->tearDown();
- $this->recipientGroup->removeUser($this->recipientUser);
- parent::tearDown();
- }
-
- public function testPropagateWhenAddedToGroup() {
- $this->propagationManager->expects($this->once())
- ->method('propagateSharesToUser')
- ->with($this->callback(function($shares) {
- if (count($shares) !== 1) {
- return false;
- }
- $share = array_values($shares)[0];
- return $share['file_source'] === $this->fileInfo['fileid'] &&
- $share['share_with'] === $this->recipientGroup->getGID() &&
- $share['file_target'] === '/folder';
- }), $this->recipientUser->getUID());
-
- $this->recipientGroup->addUser($this->recipientUser);
- }
-
- public function testPropagateWhenRemovedFromGroup() {
- $this->recipientGroup->addUser($this->recipientUser);
-
- $this->propagationManager->expects($this->once())
- ->method('propagateSharesToUser')
- ->with($this->callback(function($shares) {
- if (count($shares) !== 1) {
- return false;
- }
- $share = array_values($shares)[0];
- return $share['file_source'] === $this->fileInfo['fileid'] &&
- $share['share_with'] === $this->recipientGroup->getGID() &&
- $share['file_target'] === '/folder';
- }), $this->recipientUser->getUID());
-
- $this->recipientGroup->removeUser($this->recipientUser);
- }
-
- public function testPropagateWhenRemovedFromGroupWithSubdirTarget() {
- $this->recipientGroup->addUser($this->recipientUser);
-
- // relogin to refresh mount points
- $this->loginAsUser($this->recipientUser->getUID());
- $recipientView = new View('/' . $this->recipientUser->getUID() . '/files');
-
- $this->assertTrue($recipientView->mkdir('sub'));
- $this->assertTrue($recipientView->rename('folder', 'sub/folder'));
-
- $this->propagationManager->expects($this->once())
- ->method('propagateSharesToUser')
- ->with($this->callback(function($shares) {
- if (count($shares) !== 1) {
- return false;
- }
- $share = array_values($shares)[0];
- return $share['file_source'] === $this->fileInfo['fileid'] &&
- $share['share_with'] === $this->recipientGroup->getGID() &&
- $share['file_target'] === '/sub/folder';
- }), $this->recipientUser->getUID());
-
- $this->recipientGroup->removeUser($this->recipientUser);
- }
-}
diff --git a/apps/files_sharing/tests/helper.php b/apps/files_sharing/tests/helper.php
index 34a1389db77..1a4a9ee7834 100644
--- a/apps/files_sharing/tests/helper.php
+++ b/apps/files_sharing/tests/helper.php
@@ -24,26 +24,10 @@
use OCA\Files_sharing\Tests\TestCase;
/**
- * ownCloud
- *
- * @author Bjoern Schiessle
- * @copyright 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/>.
+ * Class Test_Files_Sharing_Helper
*
+ * @group DB
*/
-
class Test_Files_Sharing_Helper extends TestCase {
/**
diff --git a/apps/files_sharing/tests/js/publicAppSpec.js b/apps/files_sharing/tests/js/publicAppSpec.js
index d496b78acfa..74f008025e1 100644
--- a/apps/files_sharing/tests/js/publicAppSpec.js
+++ b/apps/files_sharing/tests/js/publicAppSpec.js
@@ -21,11 +21,13 @@
describe('OCA.Sharing.PublicApp tests', function() {
var App = OCA.Sharing.PublicApp;
+ var hostStub, protocolStub, webrootStub;
var $preview;
- var fileListIn;
- var fileListOut;
beforeEach(function() {
+ protocolStub = sinon.stub(OC, 'getProtocol').returns('https');
+ hostStub = sinon.stub(OC, 'getHost').returns('example.com');
+ webrootStub = sinon.stub(OC, 'getRootPath').returns('/owncloud');
$preview = $('<div id="preview"></div>');
$('#testArea').append($preview);
$preview.append(
@@ -35,6 +37,12 @@ describe('OCA.Sharing.PublicApp tests', function() {
);
});
+ afterEach(function() {
+ protocolStub.restore();
+ hostStub.restore();
+ webrootStub.restore();
+ });
+
describe('File list', function() {
// TODO: this should be moved to a separate file once the PublicFileList is extracted from public.js
beforeEach(function() {
@@ -78,6 +86,12 @@ describe('OCA.Sharing.PublicApp tests', function() {
App._initialized = false;
});
+ it('Uses public webdav endpoint', function() {
+ expect(fakeServer.requests.length).toEqual(1);
+ expect(fakeServer.requests[0].method).toEqual('PROPFIND');
+ expect(fakeServer.requests[0].url).toEqual('https://sh4tok@example.com/owncloud/public.php/webdav/subdir');
+ });
+
describe('Download Url', function() {
var fileList;
@@ -87,12 +101,12 @@ describe('OCA.Sharing.PublicApp tests', function() {
it('returns correct download URL for single files', function() {
expect(fileList.getDownloadUrl('some file.txt'))
- .toEqual(OC.webroot + '/index.php/s/sh4tok/download?path=%2Fsubdir&files=some%20file.txt');
- expect(fileList.getDownloadUrl('some file.txt', '/anotherpath/abc'))
- .toEqual(OC.webroot + '/index.php/s/sh4tok/download?path=%2Fanotherpath%2Fabc&files=some%20file.txt');
+ .toEqual('/owncloud/public.php/webdav/subdir/some file.txt');
+ expect(fileList.getDownloadUrl('some file.txt', '/another path/abc'))
+ .toEqual('/owncloud/public.php/webdav/another path/abc/some file.txt');
fileList.changeDirectory('/');
expect(fileList.getDownloadUrl('some file.txt'))
- .toEqual(OC.webroot + '/index.php/s/sh4tok/download?path=%2F&files=some%20file.txt');
+ .toEqual('/owncloud/public.php/webdav/some file.txt');
});
it('returns correct download URL for multiple files', function() {
expect(fileList.getDownloadUrl(['a b c.txt', 'd e f.txt']))
diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js
index b4b6ac4954a..fdc9de49c17 100644
--- a/apps/files_sharing/tests/js/sharedfilelistSpec.js
+++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js
@@ -166,8 +166,7 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-id')).toEqual('7');
expect($tr.find('a.name').attr('href')).toEqual(
OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Flocal%20path&files=local%20name.txt'
+ '/remote.php/webdav/local%20path/local%20name.txt'
);
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
@@ -185,8 +184,7 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-id')).toEqual('8');
expect($tr.find('a.name').attr('href')).toEqual(
OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2F&files=b.txt'
+ '/remote.php/webdav/b.txt'
);
expect($tr.find('.nametext').text().trim()).toEqual('b.txt');
});
@@ -338,8 +336,7 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-id')).toEqual('7');
expect($tr.find('a.name').attr('href')).toEqual(
OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Flocal%20path&files=local%20name.txt'
+ '/remote.php/webdav/local%20path/local%20name.txt'
);
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
});
@@ -429,9 +426,8 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-owner')).not.toBeDefined();
expect($tr.attr('data-share-id')).toEqual('7');
expect($tr.find('a.name').attr('href')).toEqual(
- OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Flocal%20path&files=local%20name.txt');
+ OC.webroot + '/remote.php/webdav/local%20path/local%20name.txt'
+ );
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
});
@@ -498,9 +494,7 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-owner')).not.toBeDefined();
expect($tr.attr('data-share-id')).toEqual('7,8,9');
expect($tr.find('a.name').attr('href')).toEqual(
- OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Flocal%20path&files=local%20name.txt'
+ OC.webroot + '/remote.php/webdav/local%20path/local%20name.txt'
);
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
});
@@ -592,9 +586,8 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-owner')).not.toBeDefined();
expect($tr.attr('data-share-id')).toEqual('7');
expect($tr.find('a.name').attr('href')).toEqual(
- OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Flocal%20path&files=local%20name.txt');
+ OC.webroot + '/remote.php/webdav/local%20path/local%20name.txt'
+ );
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
});
@@ -634,8 +627,7 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.attr('data-share-id')).toEqual('7');
expect($tr.find('a.name').attr('href')).toEqual(
OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Flocal%20path&files=local%20name.txt');
+ '/remote.php/webdav/local%20path/local%20name.txt');
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
});
diff --git a/apps/files_sharing/tests/locking.php b/apps/files_sharing/tests/locking.php
index ae1fcf30a53..3b8900f2061 100644
--- a/apps/files_sharing/tests/locking.php
+++ b/apps/files_sharing/tests/locking.php
@@ -27,6 +27,13 @@ use OC\Files\View;
use OC\Lock\MemcacheLockingProvider;
use OCP\Lock\ILockingProvider;
+/**
+ * Class Locking
+ *
+ * @group DB
+ *
+ * @package OCA\Files_sharing\Tests
+ */
class Locking extends TestCase {
/**
* @var \Test\Util\User\Dummy
diff --git a/apps/files_sharing/tests/migrationtest.php b/apps/files_sharing/tests/migrationtest.php
index 522181fbb23..49d76126eb2 100644
--- a/apps/files_sharing/tests/migrationtest.php
+++ b/apps/files_sharing/tests/migrationtest.php
@@ -24,6 +24,11 @@
use OCA\Files_Sharing\Tests\TestCase;
use OCA\Files_Sharing\Migration;
+/**
+ * Class MigrationTest
+ *
+ * @group DB
+ */
class MigrationTest extends TestCase {
/**
diff --git a/apps/files_sharing/tests/permissions.php b/apps/files_sharing/tests/permissions.php
index 80e727b7178..4261ede7a76 100644
--- a/apps/files_sharing/tests/permissions.php
+++ b/apps/files_sharing/tests/permissions.php
@@ -26,7 +26,11 @@ use OC\Files\Cache\Cache;
use OC\Files\Storage\Storage;
use OC\Files\View;
-
+/**
+ * Class Test_Files_Sharing_Permissions
+ *
+ * @group DB
+ */
class Test_Files_Sharing_Permissions extends OCA\Files_sharing\Tests\TestCase {
/**
diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php
index 300c637c777..a0f0e18b769 100644
--- a/apps/files_sharing/tests/server2server.php
+++ b/apps/files_sharing/tests/server2server.php
@@ -26,6 +26,8 @@ use OCA\Files_Sharing\Tests\TestCase;
/**
* Class Test_Files_Sharing_Api
+ *
+ * @group DB
*/
class Test_Files_Sharing_S2S_OCS_API extends TestCase {
diff --git a/apps/files_sharing/tests/share.php b/apps/files_sharing/tests/share.php
index 896191dfe51..b5ba0e3ad51 100644
--- a/apps/files_sharing/tests/share.php
+++ b/apps/files_sharing/tests/share.php
@@ -27,6 +27,8 @@ use OCA\Files\Share;
/**
* Class Test_Files_Sharing
+ *
+ * @group DB
*/
class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
diff --git a/apps/files_sharing/tests/sharedmount.php b/apps/files_sharing/tests/sharedmount.php
index 94c0ad448bc..7b256588f93 100644
--- a/apps/files_sharing/tests/sharedmount.php
+++ b/apps/files_sharing/tests/sharedmount.php
@@ -27,6 +27,8 @@
/**
* Class Test_Files_Sharing_Api
+ *
+ * @group DB
*/
class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
diff --git a/apps/files_sharing/tests/sharedstorage.php b/apps/files_sharing/tests/sharedstorage.php
index 3361d2cbd12..0d4a6b56307 100644
--- a/apps/files_sharing/tests/sharedstorage.php
+++ b/apps/files_sharing/tests/sharedstorage.php
@@ -28,6 +28,8 @@ use OCA\Files\Share;
/**
* Class Test_Files_Sharing_Api
+ *
+ * @group DB
*/
class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
diff --git a/apps/files_sharing/tests/sizepropagation.php b/apps/files_sharing/tests/sizepropagation.php
index 1d09f69449f..535a475276c 100644
--- a/apps/files_sharing/tests/sizepropagation.php
+++ b/apps/files_sharing/tests/sizepropagation.php
@@ -24,6 +24,13 @@ namespace OCA\Files_sharing\Tests;
use OC\Files\View;
+/**
+ * Class SizePropagation
+ *
+ * @group DB
+ *
+ * @package OCA\Files_sharing\Tests
+ */
class SizePropagation extends TestCase {
public function testSizePropagationWhenOwnerChangesFile() {
diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php
index c91734a5b03..dc5b8ed79d9 100644
--- a/apps/files_sharing/tests/testcase.php
+++ b/apps/files_sharing/tests/testcase.php
@@ -36,6 +36,8 @@ use OCA\Files_Sharing\Appinfo\Application;
/**
* Class Test_Files_Sharing_Base
*
+ * @group DB
+ *
* Base class for sharing tests.
*/
abstract class TestCase extends \Test\TestCase {
@@ -61,7 +63,6 @@ abstract class TestCase extends \Test\TestCase {
$application = new Application();
$application->registerMountProviders();
- $application->setupPropagation();
// reset backend
\OC_User::clearBackends();
diff --git a/apps/files_sharing/tests/unsharechildren.php b/apps/files_sharing/tests/unsharechildren.php
index c57070ba641..8de735363d1 100644
--- a/apps/files_sharing/tests/unsharechildren.php
+++ b/apps/files_sharing/tests/unsharechildren.php
@@ -26,6 +26,13 @@ namespace OCA\Files_sharing\Tests;
use OCA\Files\Share;
+/**
+ * Class UnshareChildren
+ *
+ * @group DB
+ *
+ * @package OCA\Files_sharing\Tests
+ */
class UnshareChildren extends TestCase {
protected $subsubfolder;
diff --git a/apps/files_sharing/tests/updater.php b/apps/files_sharing/tests/updater.php
index 63ab452a5e1..312734523b5 100644
--- a/apps/files_sharing/tests/updater.php
+++ b/apps/files_sharing/tests/updater.php
@@ -25,6 +25,8 @@
/**
* Class Test_Files_Sharing_Updater
+ *
+ * @group DB
*/
class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php
index 5e96a3fe68e..6443be664a7 100644
--- a/apps/files_sharing/tests/watcher.php
+++ b/apps/files_sharing/tests/watcher.php
@@ -25,6 +25,11 @@
*
*/
+/**
+ * Class Test_Files_Sharing_Watcher
+ *
+ * @group DB
+ */
class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase {
/**
diff --git a/apps/files_trashbin/command/expire.php b/apps/files_trashbin/command/expire.php
index f34c63b718b..cb4e803ddc5 100644
--- a/apps/files_trashbin/command/expire.php
+++ b/apps/files_trashbin/command/expire.php
@@ -37,17 +37,10 @@ class Expire implements ICommand {
private $user;
/**
- * @var int
- */
- private $trashBinSize;
-
- /**
* @param string $user
- * @param int $trashBinSize
*/
- function __construct($user, $trashBinSize) {
+ function __construct($user) {
$this->user = $user;
- $this->trashBinSize = $trashBinSize;
}
public function handle() {
@@ -59,7 +52,7 @@ class Expire implements ICommand {
\OC_Util::tearDownFS();
\OC_Util::setupFS($this->user);
- Trashbin::expire($this->trashBinSize, $this->user);
+ Trashbin::expire($this->user);
\OC_Util::tearDownFS();
}
}
diff --git a/apps/files_trashbin/js/app.js b/apps/files_trashbin/js/app.js
index 1f46f568bf2..600a8ce2b03 100644
--- a/apps/files_trashbin/js/app.js
+++ b/apps/files_trashbin/js/app.js
@@ -38,10 +38,7 @@ OCA.Trashbin.App = {
var fileActions = new OCA.Files.FileActions();
fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
var dir = context.fileList.getCurrentDirectory();
- if (dir !== '/') {
- dir = dir + '/';
- }
- context.fileList.changeDirectory(dir + filename);
+ context.fileList.changeDirectory(OC.joinPaths(dir, filename));
});
fileActions.setDefault('dir', 'Open');
diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js
index 6b624e333a0..5812aff82f7 100644
--- a/apps/files_trashbin/js/filelist.js
+++ b/apps/files_trashbin/js/filelist.js
@@ -283,7 +283,77 @@
isSelectedDeletable: function() {
return true;
- }
+ },
+
+ /**
+ * Reloads the file list using ajax call
+ *
+ * @return ajax call object
+ */
+ reload: function() {
+ this._selectedFiles = {};
+ this._selectionSummary.clear();
+ this.$el.find('.select-all').prop('checked', false);
+ this.showMask();
+ if (this._reloadCall) {
+ this._reloadCall.abort();
+ }
+ this._reloadCall = $.ajax({
+ url: this.getAjaxUrl('list'),
+ data: {
+ dir : this.getCurrentDirectory(),
+ sort: this._sort,
+ sortdirection: this._sortDirection
+ }
+ });
+ var callBack = this.reloadCallback.bind(this);
+ return this._reloadCall.then(callBack, callBack);
+ },
+ reloadCallback: function(result) {
+ delete this._reloadCall;
+ this.hideMask();
+
+ if (!result || result.status === 'error') {
+ // if the error is not related to folder we're trying to load, reload the page to handle logout etc
+ if (result.data.error === 'authentication_error' ||
+ result.data.error === 'token_expired' ||
+ result.data.error === 'application_not_enabled'
+ ) {
+ OC.redirect(OC.generateUrl('apps/files'));
+ }
+ OC.Notification.show(result.data.message);
+ return false;
+ }
+
+ // Firewall Blocked request?
+ if (result.status === 403) {
+ // Go home
+ this.changeDirectory('/');
+ OC.Notification.show(t('files', 'This operation is forbidden'));
+ return false;
+ }
+
+ // Did share service die or something else fail?
+ if (result.status === 500) {
+ // Go home
+ this.changeDirectory('/');
+ OC.Notification.show(t('files', 'This directory is unavailable, please check the logs or contact the administrator'));
+ return false;
+ }
+
+ if (result.status === 404) {
+ // go back home
+ this.changeDirectory('/');
+ return false;
+ }
+ // aborted ?
+ if (result.status === 0){
+ return true;
+ }
+
+ this.setFiles(result.data.files);
+ return true;
+ },
});
diff --git a/apps/files_trashbin/l10n/ar.js b/apps/files_trashbin/l10n/ar.js
index 964d547c42a..8b78e9e017a 100644
--- a/apps/files_trashbin/l10n/ar.js
+++ b/apps/files_trashbin/l10n/ar.js
@@ -8,6 +8,7 @@ OC.L10N.register(
"Delete" : "إلغاء",
"Delete permanently" : "حذف بشكل دائم",
"Error" : "خطأ",
+ "This operation is forbidden" : "هذة العملية ممنوعة ",
"restored" : "تمت الاستعادة",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
"Select all" : "تحديد الكل ",
diff --git a/apps/files_trashbin/l10n/ar.json b/apps/files_trashbin/l10n/ar.json
index cb73176fda1..ac3552d79af 100644
--- a/apps/files_trashbin/l10n/ar.json
+++ b/apps/files_trashbin/l10n/ar.json
@@ -6,6 +6,7 @@
"Delete" : "إلغاء",
"Delete permanently" : "حذف بشكل دائم",
"Error" : "خطأ",
+ "This operation is forbidden" : "هذة العملية ممنوعة ",
"restored" : "تمت الاستعادة",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
"Select all" : "تحديد الكل ",
diff --git a/apps/files_trashbin/l10n/ast.js b/apps/files_trashbin/l10n/ast.js
index 5df7fb84547..f59457ad6d1 100644
--- a/apps/files_trashbin/l10n/ast.js
+++ b/apps/files_trashbin/l10n/ast.js
@@ -8,7 +8,11 @@ OC.L10N.register(
"Delete" : "Desaniciar",
"Delete permanently" : "Desaniciar dafechu",
"Error" : "Fallu",
+ "This operation is forbidden" : "La operación ta prohibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
"restored" : "recuperóse",
+ "No deleted files" : "Ensin ficheros desaniciaos",
+ "You will be able to recover deleted files from here" : "Dende equí podrás recureperar los ficheros desaniciaos",
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
"Select all" : "Esbillar too",
"Name" : "Nome",
diff --git a/apps/files_trashbin/l10n/ast.json b/apps/files_trashbin/l10n/ast.json
index 4268ef6bc21..65380e118d6 100644
--- a/apps/files_trashbin/l10n/ast.json
+++ b/apps/files_trashbin/l10n/ast.json
@@ -6,7 +6,11 @@
"Delete" : "Desaniciar",
"Delete permanently" : "Desaniciar dafechu",
"Error" : "Fallu",
+ "This operation is forbidden" : "La operación ta prohibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
"restored" : "recuperóse",
+ "No deleted files" : "Ensin ficheros desaniciaos",
+ "You will be able to recover deleted files from here" : "Dende equí podrás recureperar los ficheros desaniciaos",
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
"Select all" : "Esbillar too",
"Name" : "Nome",
diff --git a/apps/files_trashbin/l10n/az.js b/apps/files_trashbin/l10n/az.js
index a6b149dcbdb..7b3ab2ef04a 100644
--- a/apps/files_trashbin/l10n/az.js
+++ b/apps/files_trashbin/l10n/az.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Geri qaytarila bilmədi %s",
"Deleted files" : "Silinmiş fayllar",
"Restore" : "Geri qaytar",
+ "Delete" : "Sil",
"Delete permanently" : "Həmişəlik sil",
"Error" : "Səhv",
+ "This operation is forbidden" : "Bu əməliyyat qadağandır",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
"restored" : "geriqaytarılıb",
"No deleted files" : "Silinmiş fayllar mövcud deyil",
"You will be able to recover deleted files from here" : "Siz silinmiş faylları burdan bərpa edə bilərsiniz",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
"Name" : "Ad",
- "Deleted" : "Silinib",
- "Delete" : "Sil"
+ "Deleted" : "Silinib"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/az.json b/apps/files_trashbin/l10n/az.json
index 45d74ddbc9c..f9d23ea362a 100644
--- a/apps/files_trashbin/l10n/az.json
+++ b/apps/files_trashbin/l10n/az.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Geri qaytarila bilmədi %s",
"Deleted files" : "Silinmiş fayllar",
"Restore" : "Geri qaytar",
+ "Delete" : "Sil",
"Delete permanently" : "Həmişəlik sil",
"Error" : "Səhv",
+ "This operation is forbidden" : "Bu əməliyyat qadağandır",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
"restored" : "geriqaytarılıb",
"No deleted files" : "Silinmiş fayllar mövcud deyil",
"You will be able to recover deleted files from here" : "Siz silinmiş faylları burdan bərpa edə bilərsiniz",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
"Name" : "Ad",
- "Deleted" : "Silinib",
- "Delete" : "Sil"
+ "Deleted" : "Silinib"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/bg_BG.js b/apps/files_trashbin/l10n/bg_BG.js
index 9db73c98a6d..767f529a9a1 100644
--- a/apps/files_trashbin/l10n/bg_BG.js
+++ b/apps/files_trashbin/l10n/bg_BG.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Неуспешно възтановяване на %s.",
"Deleted files" : "Изтрити файлове",
"Restore" : "Възстановяви",
+ "Delete" : "Изтрий",
"Delete permanently" : "Изтрий завинаги",
"Error" : "Грешка",
"restored" : "възстановено",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
"Name" : "Име",
- "Deleted" : "Изтрито",
- "Delete" : "Изтрий"
+ "Deleted" : "Изтрито"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/bg_BG.json b/apps/files_trashbin/l10n/bg_BG.json
index 3f3b3e8b835..824d1e44254 100644
--- a/apps/files_trashbin/l10n/bg_BG.json
+++ b/apps/files_trashbin/l10n/bg_BG.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Неуспешно възтановяване на %s.",
"Deleted files" : "Изтрити файлове",
"Restore" : "Възстановяви",
+ "Delete" : "Изтрий",
"Delete permanently" : "Изтрий завинаги",
"Error" : "Грешка",
"restored" : "възстановено",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
"Name" : "Име",
- "Deleted" : "Изтрито",
- "Delete" : "Изтрий"
+ "Deleted" : "Изтрито"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/bn_BD.js b/apps/files_trashbin/l10n/bn_BD.js
index 6f6626b71cc..12537a14afb 100644
--- a/apps/files_trashbin/l10n/bn_BD.js
+++ b/apps/files_trashbin/l10n/bn_BD.js
@@ -5,10 +5,10 @@ OC.L10N.register(
"Couldn't restore %s" : "%s ফেরত আনা গেলনা",
"Deleted files" : "মুছে ফেলা ফাইলসমূহ",
"Restore" : "ফিরিয়ে দাও",
+ "Delete" : "মুছে",
"Error" : "সমস্যা",
"restored" : "পূণঃসংরক্ষিত",
"Name" : "নাম",
- "Deleted" : "মুছে ফেলা",
- "Delete" : "মুছে"
+ "Deleted" : "মুছে ফেলা"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/bn_BD.json b/apps/files_trashbin/l10n/bn_BD.json
index affc277fcda..3630d490455 100644
--- a/apps/files_trashbin/l10n/bn_BD.json
+++ b/apps/files_trashbin/l10n/bn_BD.json
@@ -3,10 +3,10 @@
"Couldn't restore %s" : "%s ফেরত আনা গেলনা",
"Deleted files" : "মুছে ফেলা ফাইলসমূহ",
"Restore" : "ফিরিয়ে দাও",
+ "Delete" : "মুছে",
"Error" : "সমস্যা",
"restored" : "পূণঃসংরক্ষিত",
"Name" : "নাম",
- "Deleted" : "মুছে ফেলা",
- "Delete" : "মুছে"
+ "Deleted" : "মুছে ফেলা"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/bn_IN.js b/apps/files_trashbin/l10n/bn_IN.js
index 5943177a923..7c3bb37553a 100644
--- a/apps/files_trashbin/l10n/bn_IN.js
+++ b/apps/files_trashbin/l10n/bn_IN.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "%s পুনরুদ্ধার করা যায়নি",
"Deleted files" : "ফাইলস মুছে ফেলা হয়েছে",
"Restore" : "পুনরুদ্ধার",
+ "Delete" : "মুছে ফেলা",
"Delete permanently" : "স্থায়ীভাবে মুছে দিন",
"Error" : "ভুল",
"restored" : "পুনরুদ্ধার করা হয়েছে",
"Name" : "নাম",
- "Deleted" : "মুছে ফেলা হয়েছে",
- "Delete" : "মুছে ফেলা"
+ "Deleted" : "মুছে ফেলা হয়েছে"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/bn_IN.json b/apps/files_trashbin/l10n/bn_IN.json
index 45a24ee7675..b7ae21692bf 100644
--- a/apps/files_trashbin/l10n/bn_IN.json
+++ b/apps/files_trashbin/l10n/bn_IN.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "%s পুনরুদ্ধার করা যায়নি",
"Deleted files" : "ফাইলস মুছে ফেলা হয়েছে",
"Restore" : "পুনরুদ্ধার",
+ "Delete" : "মুছে ফেলা",
"Delete permanently" : "স্থায়ীভাবে মুছে দিন",
"Error" : "ভুল",
"restored" : "পুনরুদ্ধার করা হয়েছে",
"Name" : "নাম",
- "Deleted" : "মুছে ফেলা হয়েছে",
- "Delete" : "মুছে ফেলা"
+ "Deleted" : "মুছে ফেলা হয়েছে"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/bs.js b/apps/files_trashbin/l10n/bs.js
index 0378a76f855..c02d88b07e4 100644
--- a/apps/files_trashbin/l10n/bs.js
+++ b/apps/files_trashbin/l10n/bs.js
@@ -2,9 +2,9 @@ OC.L10N.register(
"files_trashbin",
{
"Restore" : "Obnovi",
+ "Delete" : "Izbriši",
"Error" : "Greška",
"Select all" : "Označi sve",
- "Name" : "Ime",
- "Delete" : "Izbriši"
+ "Name" : "Ime"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_trashbin/l10n/bs.json b/apps/files_trashbin/l10n/bs.json
index 6f222ca37af..00f1105abc6 100644
--- a/apps/files_trashbin/l10n/bs.json
+++ b/apps/files_trashbin/l10n/bs.json
@@ -1,8 +1,8 @@
{ "translations": {
"Restore" : "Obnovi",
+ "Delete" : "Izbriši",
"Error" : "Greška",
"Select all" : "Označi sve",
- "Name" : "Ime",
- "Delete" : "Izbriši"
+ "Name" : "Ime"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ca.js b/apps/files_trashbin/l10n/ca.js
index 356e525b73c..d5f19e466c1 100644
--- a/apps/files_trashbin/l10n/ca.js
+++ b/apps/files_trashbin/l10n/ca.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "No s'ha pogut restaurar %s",
"Deleted files" : "Fitxers esborrats",
"Restore" : "Recupera",
+ "Delete" : "Esborra",
"Delete permanently" : "Esborra permanentment",
"Error" : "Error",
"restored" : "restaurat",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "No hi ha entrades en aquesta carpeta",
"Select all" : "Seleccionar tot",
"Name" : "Nom",
- "Deleted" : "Eliminat",
- "Delete" : "Esborra"
+ "Deleted" : "Eliminat"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/ca.json b/apps/files_trashbin/l10n/ca.json
index dfdec62d7d1..520ef5f2f74 100644
--- a/apps/files_trashbin/l10n/ca.json
+++ b/apps/files_trashbin/l10n/ca.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "No s'ha pogut restaurar %s",
"Deleted files" : "Fitxers esborrats",
"Restore" : "Recupera",
+ "Delete" : "Esborra",
"Delete permanently" : "Esborra permanentment",
"Error" : "Error",
"restored" : "restaurat",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "No hi ha entrades en aquesta carpeta",
"Select all" : "Seleccionar tot",
"Name" : "Nom",
- "Deleted" : "Eliminat",
- "Delete" : "Esborra"
+ "Deleted" : "Eliminat"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/cs_CZ.js b/apps/files_trashbin/l10n/cs_CZ.js
index 4d0f9b7018d..22c33690420 100644
--- a/apps/files_trashbin/l10n/cs_CZ.js
+++ b/apps/files_trashbin/l10n/cs_CZ.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Nelze obnovit %s",
"Deleted files" : "Odstraněné soubory",
"Restore" : "Obnovit",
+ "Delete" : "Smazat",
"Delete permanently" : "Trvale odstranit",
"Error" : "Chyba",
+ "This operation is forbidden" : "Tato operace je zakázána",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte prosím logy nebo kontaktujte svého správce systému",
"restored" : "obnoveno",
"No deleted files" : "Žádné smazané soubory",
"You will be able to recover deleted files from here" : "Odtud budete moci obnovovat odstraněné soubory",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
"Name" : "Název",
- "Deleted" : "Smazáno",
- "Delete" : "Smazat"
+ "Deleted" : "Smazáno"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_trashbin/l10n/cs_CZ.json b/apps/files_trashbin/l10n/cs_CZ.json
index cffa7b663fa..a4a13942fd1 100644
--- a/apps/files_trashbin/l10n/cs_CZ.json
+++ b/apps/files_trashbin/l10n/cs_CZ.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Nelze obnovit %s",
"Deleted files" : "Odstraněné soubory",
"Restore" : "Obnovit",
+ "Delete" : "Smazat",
"Delete permanently" : "Trvale odstranit",
"Error" : "Chyba",
+ "This operation is forbidden" : "Tato operace je zakázána",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte prosím logy nebo kontaktujte svého správce systému",
"restored" : "obnoveno",
"No deleted files" : "Žádné smazané soubory",
"You will be able to recover deleted files from here" : "Odtud budete moci obnovovat odstraněné soubory",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
"Name" : "Název",
- "Deleted" : "Smazáno",
- "Delete" : "Smazat"
+ "Deleted" : "Smazáno"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/cy_GB.js b/apps/files_trashbin/l10n/cy_GB.js
index cd20621625f..e689aa9b52c 100644
--- a/apps/files_trashbin/l10n/cy_GB.js
+++ b/apps/files_trashbin/l10n/cy_GB.js
@@ -5,10 +5,10 @@ OC.L10N.register(
"Couldn't restore %s" : "Methwyd adfer %s",
"Deleted files" : "Ffeiliau ddilewyd",
"Restore" : "Adfer",
+ "Delete" : "Dileu",
"Delete permanently" : "Dileu'n barhaol",
"Error" : "Gwall",
"Name" : "Enw",
- "Deleted" : "Wedi dileu",
- "Delete" : "Dileu"
+ "Deleted" : "Wedi dileu"
},
"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/apps/files_trashbin/l10n/cy_GB.json b/apps/files_trashbin/l10n/cy_GB.json
index 0f21da0c56d..c42ce3d10ea 100644
--- a/apps/files_trashbin/l10n/cy_GB.json
+++ b/apps/files_trashbin/l10n/cy_GB.json
@@ -3,10 +3,10 @@
"Couldn't restore %s" : "Methwyd adfer %s",
"Deleted files" : "Ffeiliau ddilewyd",
"Restore" : "Adfer",
+ "Delete" : "Dileu",
"Delete permanently" : "Dileu'n barhaol",
"Error" : "Gwall",
"Name" : "Enw",
- "Deleted" : "Wedi dileu",
- "Delete" : "Dileu"
+ "Deleted" : "Wedi dileu"
},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/da.js b/apps/files_trashbin/l10n/da.js
index dbcd566a9d2..6dcbd7040d1 100644
--- a/apps/files_trashbin/l10n/da.js
+++ b/apps/files_trashbin/l10n/da.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Kunne ikke gendanne %s",
"Deleted files" : "Slettede filer",
"Restore" : "Gendan",
+ "Delete" : "Slet",
"Delete permanently" : "Slet permanent",
"Error" : "Fejl",
+ "This operation is forbidden" : "Denne operation er forbudt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
"restored" : "Gendannet",
"No deleted files" : "Ingen slettede filer",
"You will be able to recover deleted files from here" : "Du vil kunne gendanne slettede filer herfra",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
"Name" : "Navn",
- "Deleted" : "Slettet",
- "Delete" : "Slet"
+ "Deleted" : "Slettet"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/da.json b/apps/files_trashbin/l10n/da.json
index 0f660d2e44d..456b1ab73b2 100644
--- a/apps/files_trashbin/l10n/da.json
+++ b/apps/files_trashbin/l10n/da.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Kunne ikke gendanne %s",
"Deleted files" : "Slettede filer",
"Restore" : "Gendan",
+ "Delete" : "Slet",
"Delete permanently" : "Slet permanent",
"Error" : "Fejl",
+ "This operation is forbidden" : "Denne operation er forbudt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
"restored" : "Gendannet",
"No deleted files" : "Ingen slettede filer",
"You will be able to recover deleted files from here" : "Du vil kunne gendanne slettede filer herfra",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
"Name" : "Navn",
- "Deleted" : "Slettet",
- "Delete" : "Slet"
+ "Deleted" : "Slettet"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/de.js b/apps/files_trashbin/l10n/de.js
index 96addde03b2..500205227c8 100644
--- a/apps/files_trashbin/l10n/de.js
+++ b/apps/files_trashbin/l10n/de.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Konnte %s nicht wiederherstellen",
"Deleted files" : "Gelöschte Dateien",
"Restore" : "Wiederherstellen",
+ "Delete" : "Löschen",
"Delete permanently" : "Endgültig löschen",
"Error" : "Fehler",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator",
"restored" : "Wiederhergestellt",
"No deleted files" : "Keine gelöschten Dateien",
"You will be able to recover deleted files from here" : "Du kannst hier gelöschte Dateien wiederherstellen",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Name" : "Name",
- "Deleted" : "gelöscht",
- "Delete" : "Löschen"
+ "Deleted" : "gelöscht"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/de.json b/apps/files_trashbin/l10n/de.json
index d7b9b07b87e..baa976b6ff3 100644
--- a/apps/files_trashbin/l10n/de.json
+++ b/apps/files_trashbin/l10n/de.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Konnte %s nicht wiederherstellen",
"Deleted files" : "Gelöschte Dateien",
"Restore" : "Wiederherstellen",
+ "Delete" : "Löschen",
"Delete permanently" : "Endgültig löschen",
"Error" : "Fehler",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator",
"restored" : "Wiederhergestellt",
"No deleted files" : "Keine gelöschten Dateien",
"You will be able to recover deleted files from here" : "Du kannst hier gelöschte Dateien wiederherstellen",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Name" : "Name",
- "Deleted" : "gelöscht",
- "Delete" : "Löschen"
+ "Deleted" : "gelöscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/de_AT.js b/apps/files_trashbin/l10n/de_AT.js
index db1e7544a5b..5d1a6cec445 100644
--- a/apps/files_trashbin/l10n/de_AT.js
+++ b/apps/files_trashbin/l10n/de_AT.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"files_trashbin",
{
- "Error" : "Fehler",
- "Delete" : "Löschen"
+ "Delete" : "Löschen",
+ "Error" : "Fehler"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/de_AT.json b/apps/files_trashbin/l10n/de_AT.json
index a854415701f..5452cc8972a 100644
--- a/apps/files_trashbin/l10n/de_AT.json
+++ b/apps/files_trashbin/l10n/de_AT.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Error" : "Fehler",
- "Delete" : "Löschen"
+ "Delete" : "Löschen",
+ "Error" : "Fehler"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/de_DE.js b/apps/files_trashbin/l10n/de_DE.js
index c25166efc80..84a2c382efa 100644
--- a/apps/files_trashbin/l10n/de_DE.js
+++ b/apps/files_trashbin/l10n/de_DE.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Konnte %s nicht wiederherstellen",
"Deleted files" : "Gelöschte Dateien",
"Restore" : "Wiederherstellen",
+ "Delete" : "Löschen",
"Delete permanently" : "Endgültig löschen",
"Error" : "Fehler",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator",
"restored" : "Wiederhergestellt",
"No deleted files" : "Keine gelöschten Dateien",
"You will be able to recover deleted files from here" : "Sie können hier gelöschte Dateien wiederherstellen",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Name" : "Name",
- "Deleted" : "Gelöscht",
- "Delete" : "Löschen"
+ "Deleted" : "Gelöscht"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/de_DE.json b/apps/files_trashbin/l10n/de_DE.json
index 9f4a895fa16..966461efee3 100644
--- a/apps/files_trashbin/l10n/de_DE.json
+++ b/apps/files_trashbin/l10n/de_DE.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Konnte %s nicht wiederherstellen",
"Deleted files" : "Gelöschte Dateien",
"Restore" : "Wiederherstellen",
+ "Delete" : "Löschen",
"Delete permanently" : "Endgültig löschen",
"Error" : "Fehler",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator",
"restored" : "Wiederhergestellt",
"No deleted files" : "Keine gelöschten Dateien",
"You will be able to recover deleted files from here" : "Sie können hier gelöschte Dateien wiederherstellen",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Name" : "Name",
- "Deleted" : "Gelöscht",
- "Delete" : "Löschen"
+ "Deleted" : "Gelöscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/el.js b/apps/files_trashbin/l10n/el.js
index 8abbdb85b48..d63dc09c745 100644
--- a/apps/files_trashbin/l10n/el.js
+++ b/apps/files_trashbin/l10n/el.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Αδυναμία επαναφοράς %s",
"Deleted files" : "Διεγραμμένα αρχεία",
"Restore" : "Επαναφορά",
+ "Delete" : "Διαγραφή",
"Delete permanently" : "Μόνιμη διαγραφή",
"Error" : "Σφάλμα",
+ "This operation is forbidden" : "Αυτή η ενέργεια δεν επιτρέπεται",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλώ ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
"restored" : "επαναφέρθηκαν",
"No deleted files" : "Κανένα διαγεγραμμένο αρχείο",
"You will be able to recover deleted files from here" : "Θα έχετε την δυνατότητα επαναφοράς διαγεγραμμένων αρχείων από εδώ",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
"Select all" : "Επιλογή όλων",
"Name" : "Όνομα",
- "Deleted" : "Διαγραμμένα",
- "Delete" : "Διαγραφή"
+ "Deleted" : "Διαγραμμένα"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/el.json b/apps/files_trashbin/l10n/el.json
index eb52020a3e1..5d0ad857d35 100644
--- a/apps/files_trashbin/l10n/el.json
+++ b/apps/files_trashbin/l10n/el.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Αδυναμία επαναφοράς %s",
"Deleted files" : "Διεγραμμένα αρχεία",
"Restore" : "Επαναφορά",
+ "Delete" : "Διαγραφή",
"Delete permanently" : "Μόνιμη διαγραφή",
"Error" : "Σφάλμα",
+ "This operation is forbidden" : "Αυτή η ενέργεια δεν επιτρέπεται",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλώ ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
"restored" : "επαναφέρθηκαν",
"No deleted files" : "Κανένα διαγεγραμμένο αρχείο",
"You will be able to recover deleted files from here" : "Θα έχετε την δυνατότητα επαναφοράς διαγεγραμμένων αρχείων από εδώ",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
"Select all" : "Επιλογή όλων",
"Name" : "Όνομα",
- "Deleted" : "Διαγραμμένα",
- "Delete" : "Διαγραφή"
+ "Deleted" : "Διαγραμμένα"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/en_GB.js b/apps/files_trashbin/l10n/en_GB.js
index e2ff4ac73fb..e3f3b78af57 100644
--- a/apps/files_trashbin/l10n/en_GB.js
+++ b/apps/files_trashbin/l10n/en_GB.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Couldn't restore %s",
"Deleted files" : "Deleted files",
"Restore" : "Restore",
+ "Delete" : "Delete",
"Delete permanently" : "Delete permanently",
"Error" : "Error",
"restored" : "restored",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "No entries found in this folder",
"Select all" : "Select all",
"Name" : "Name",
- "Deleted" : "Deleted",
- "Delete" : "Delete"
+ "Deleted" : "Deleted"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/en_GB.json b/apps/files_trashbin/l10n/en_GB.json
index 078bca97a49..9c533523889 100644
--- a/apps/files_trashbin/l10n/en_GB.json
+++ b/apps/files_trashbin/l10n/en_GB.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Couldn't restore %s",
"Deleted files" : "Deleted files",
"Restore" : "Restore",
+ "Delete" : "Delete",
"Delete permanently" : "Delete permanently",
"Error" : "Error",
"restored" : "restored",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "No entries found in this folder",
"Select all" : "Select all",
"Name" : "Name",
- "Deleted" : "Deleted",
- "Delete" : "Delete"
+ "Deleted" : "Deleted"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/eo.js b/apps/files_trashbin/l10n/eo.js
index 95edf8d3eb0..b4ab12d4bdd 100644
--- a/apps/files_trashbin/l10n/eo.js
+++ b/apps/files_trashbin/l10n/eo.js
@@ -5,12 +5,12 @@ OC.L10N.register(
"Couldn't restore %s" : "Ne povis restaŭriĝi %s",
"Deleted files" : "Forigitaj dosieroj",
"Restore" : "Restaŭri",
+ "Delete" : "Forigi",
"Delete permanently" : "Forigi por ĉiam",
"Error" : "Eraro",
"restored" : "restaŭrita",
"Select all" : "Elekti ĉion",
"Name" : "Nomo",
- "Deleted" : "Forigita",
- "Delete" : "Forigi"
+ "Deleted" : "Forigita"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/eo.json b/apps/files_trashbin/l10n/eo.json
index 7fd1d85ff7a..87a9b7d479b 100644
--- a/apps/files_trashbin/l10n/eo.json
+++ b/apps/files_trashbin/l10n/eo.json
@@ -3,12 +3,12 @@
"Couldn't restore %s" : "Ne povis restaŭriĝi %s",
"Deleted files" : "Forigitaj dosieroj",
"Restore" : "Restaŭri",
+ "Delete" : "Forigi",
"Delete permanently" : "Forigi por ĉiam",
"Error" : "Eraro",
"restored" : "restaŭrita",
"Select all" : "Elekti ĉion",
"Name" : "Nomo",
- "Deleted" : "Forigita",
- "Delete" : "Forigi"
+ "Deleted" : "Forigita"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/es.js b/apps/files_trashbin/l10n/es.js
index b7f1a52327a..7cc67ce1945 100644
--- a/apps/files_trashbin/l10n/es.js
+++ b/apps/files_trashbin/l10n/es.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "No se puede restaurar %s",
"Deleted files" : "Archivos eliminados",
"Restore" : "Recuperar",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Error",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador",
"restored" : "recuperado",
"No deleted files" : "No hay ningún archivo eliminado",
"You will be able to recover deleted files from here" : "Desde aquí se podrán recuperar archivos eliminados",
"No entries found in this folder" : "No hay entradas en esta carpeta",
"Select all" : "Seleccionar todo",
"Name" : "Nombre",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/es.json b/apps/files_trashbin/l10n/es.json
index c55ae652d55..05f3dfa20b8 100644
--- a/apps/files_trashbin/l10n/es.json
+++ b/apps/files_trashbin/l10n/es.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "No se puede restaurar %s",
"Deleted files" : "Archivos eliminados",
"Restore" : "Recuperar",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Error",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador",
"restored" : "recuperado",
"No deleted files" : "No hay ningún archivo eliminado",
"You will be able to recover deleted files from here" : "Desde aquí se podrán recuperar archivos eliminados",
"No entries found in this folder" : "No hay entradas en esta carpeta",
"Select all" : "Seleccionar todo",
"Name" : "Nombre",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/es_AR.js b/apps/files_trashbin/l10n/es_AR.js
index b9566c17f1f..e916fc98f04 100644
--- a/apps/files_trashbin/l10n/es_AR.js
+++ b/apps/files_trashbin/l10n/es_AR.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "No se pudo restaurar %s",
"Deleted files" : "Archivos borrados",
"Restore" : "Recuperar",
+ "Delete" : "Borrar",
"Delete permanently" : "Borrar permanentemente",
"Error" : "Error",
"restored" : "recuperado",
"Name" : "Nombre",
- "Deleted" : "Borrado",
- "Delete" : "Borrar"
+ "Deleted" : "Borrado"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/es_AR.json b/apps/files_trashbin/l10n/es_AR.json
index c3de7177ef6..41ad13d0ba2 100644
--- a/apps/files_trashbin/l10n/es_AR.json
+++ b/apps/files_trashbin/l10n/es_AR.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "No se pudo restaurar %s",
"Deleted files" : "Archivos borrados",
"Restore" : "Recuperar",
+ "Delete" : "Borrar",
"Delete permanently" : "Borrar permanentemente",
"Error" : "Error",
"restored" : "recuperado",
"Name" : "Nombre",
- "Deleted" : "Borrado",
- "Delete" : "Borrar"
+ "Deleted" : "Borrado"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/es_MX.js b/apps/files_trashbin/l10n/es_MX.js
index 0a53f9cffdf..109427e9d80 100644
--- a/apps/files_trashbin/l10n/es_MX.js
+++ b/apps/files_trashbin/l10n/es_MX.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "No se puede restaurar %s",
"Deleted files" : "Archivos eliminados",
"Restore" : "Recuperar",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Error",
"restored" : "recuperado",
"Name" : "Nombre",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/es_MX.json b/apps/files_trashbin/l10n/es_MX.json
index 56dce90e07d..a1bbba28cde 100644
--- a/apps/files_trashbin/l10n/es_MX.json
+++ b/apps/files_trashbin/l10n/es_MX.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "No se puede restaurar %s",
"Deleted files" : "Archivos eliminados",
"Restore" : "Recuperar",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Error",
"restored" : "recuperado",
"Name" : "Nombre",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/et_EE.js b/apps/files_trashbin/l10n/et_EE.js
index 9298fdd5b18..3f928dede8d 100644
--- a/apps/files_trashbin/l10n/et_EE.js
+++ b/apps/files_trashbin/l10n/et_EE.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "%s ei saa taastada",
"Deleted files" : "Kustutatud failid",
"Restore" : "Taasta",
+ "Delete" : "Kustuta",
"Delete permanently" : "Kustuta jäädavalt",
"Error" : "Viga",
+ "This operation is forbidden" : "See toiming on keelatud",
+ "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga",
"restored" : "taastatud",
"No deleted files" : "Kustutatud faile pole",
"You will be able to recover deleted files from here" : "Sa saad siit kustutatud faile taastada",
"No entries found in this folder" : "Selles kaustas ei leitud kirjeid",
"Select all" : "Vali kõik",
"Name" : "Nimi",
- "Deleted" : "Kustutatud",
- "Delete" : "Kustuta"
+ "Deleted" : "Kustutatud"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/et_EE.json b/apps/files_trashbin/l10n/et_EE.json
index 734c8f6f2ec..468a3bcb385 100644
--- a/apps/files_trashbin/l10n/et_EE.json
+++ b/apps/files_trashbin/l10n/et_EE.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "%s ei saa taastada",
"Deleted files" : "Kustutatud failid",
"Restore" : "Taasta",
+ "Delete" : "Kustuta",
"Delete permanently" : "Kustuta jäädavalt",
"Error" : "Viga",
+ "This operation is forbidden" : "See toiming on keelatud",
+ "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga",
"restored" : "taastatud",
"No deleted files" : "Kustutatud faile pole",
"You will be able to recover deleted files from here" : "Sa saad siit kustutatud faile taastada",
"No entries found in this folder" : "Selles kaustas ei leitud kirjeid",
"Select all" : "Vali kõik",
"Name" : "Nimi",
- "Deleted" : "Kustutatud",
- "Delete" : "Kustuta"
+ "Deleted" : "Kustutatud"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/eu.js b/apps/files_trashbin/l10n/eu.js
index 568fda14450..5db27f0a9c6 100644
--- a/apps/files_trashbin/l10n/eu.js
+++ b/apps/files_trashbin/l10n/eu.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Ezin izan da %s berreskuratu",
"Deleted files" : "Ezabatutako fitxategiak",
"Restore" : "Berrezarri",
+ "Delete" : "Ezabatu",
"Delete permanently" : "Ezabatu betirako",
"Error" : "Errorea",
"restored" : "Berrezarrita",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
"Select all" : "Hautatu dena",
"Name" : "Izena",
- "Deleted" : "Ezabatuta",
- "Delete" : "Ezabatu"
+ "Deleted" : "Ezabatuta"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/eu.json b/apps/files_trashbin/l10n/eu.json
index 890ff07a468..07591e6b5d6 100644
--- a/apps/files_trashbin/l10n/eu.json
+++ b/apps/files_trashbin/l10n/eu.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Ezin izan da %s berreskuratu",
"Deleted files" : "Ezabatutako fitxategiak",
"Restore" : "Berrezarri",
+ "Delete" : "Ezabatu",
"Delete permanently" : "Ezabatu betirako",
"Error" : "Errorea",
"restored" : "Berrezarrita",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
"Select all" : "Hautatu dena",
"Name" : "Izena",
- "Deleted" : "Ezabatuta",
- "Delete" : "Ezabatu"
+ "Deleted" : "Ezabatuta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/fa.js b/apps/files_trashbin/l10n/fa.js
index 28aa38a96a6..281851c65a0 100644
--- a/apps/files_trashbin/l10n/fa.js
+++ b/apps/files_trashbin/l10n/fa.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete" : "حذف",
"Delete permanently" : "حذف قطعی",
"Error" : "خطا",
+ "This operation is forbidden" : "این عملیات غیرمجاز است",
+ "This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید",
"restored" : "بازیابی شد",
"No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
"Select all" : "انتخاب همه",
diff --git a/apps/files_trashbin/l10n/fa.json b/apps/files_trashbin/l10n/fa.json
index d8641316f44..08bee906d38 100644
--- a/apps/files_trashbin/l10n/fa.json
+++ b/apps/files_trashbin/l10n/fa.json
@@ -6,6 +6,8 @@
"Delete" : "حذف",
"Delete permanently" : "حذف قطعی",
"Error" : "خطا",
+ "This operation is forbidden" : "این عملیات غیرمجاز است",
+ "This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید",
"restored" : "بازیابی شد",
"No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
"Select all" : "انتخاب همه",
diff --git a/apps/files_trashbin/l10n/fi_FI.js b/apps/files_trashbin/l10n/fi_FI.js
index be3fbad301f..a8758c77050 100644
--- a/apps/files_trashbin/l10n/fi_FI.js
+++ b/apps/files_trashbin/l10n/fi_FI.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Kohteen %s palautus epäonnistui",
"Deleted files" : "Poistetut tiedostot",
"Restore" : "Palauta",
+ "Delete" : "Poista",
"Delete permanently" : "Poista pysyvästi",
"Error" : "Virhe",
+ "This operation is forbidden" : "Tämä toiminto on kielletty",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.",
"restored" : "palautettu",
"No deleted files" : "Ei poistettuja tiedostoja",
"You will be able to recover deleted files from here" : "Voit palauttaa poistettuja tiedostoja tätä kautta",
"No entries found in this folder" : "Ei kohteita tässä kansiossa",
"Select all" : "Valitse kaikki",
"Name" : "Nimi",
- "Deleted" : "Poistettu",
- "Delete" : "Poista"
+ "Deleted" : "Poistettu"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/fi_FI.json b/apps/files_trashbin/l10n/fi_FI.json
index 3e22acdf2c9..c4ead30d036 100644
--- a/apps/files_trashbin/l10n/fi_FI.json
+++ b/apps/files_trashbin/l10n/fi_FI.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Kohteen %s palautus epäonnistui",
"Deleted files" : "Poistetut tiedostot",
"Restore" : "Palauta",
+ "Delete" : "Poista",
"Delete permanently" : "Poista pysyvästi",
"Error" : "Virhe",
+ "This operation is forbidden" : "Tämä toiminto on kielletty",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.",
"restored" : "palautettu",
"No deleted files" : "Ei poistettuja tiedostoja",
"You will be able to recover deleted files from here" : "Voit palauttaa poistettuja tiedostoja tätä kautta",
"No entries found in this folder" : "Ei kohteita tässä kansiossa",
"Select all" : "Valitse kaikki",
"Name" : "Nimi",
- "Deleted" : "Poistettu",
- "Delete" : "Poista"
+ "Deleted" : "Poistettu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/fr.js b/apps/files_trashbin/l10n/fr.js
index 573977570a7..402644ecdb2 100644
--- a/apps/files_trashbin/l10n/fr.js
+++ b/apps/files_trashbin/l10n/fr.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Impossible de restaurer %s",
"Deleted files" : "Fichiers supprimés",
"Restore" : "Restaurer",
+ "Delete" : "Supprimer",
"Delete permanently" : "Supprimer de façon définitive",
"Error" : "Erreur",
+ "This operation is forbidden" : "Cette opération est interdite",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur",
"restored" : "restauré",
"No deleted files" : "Aucun fichier supprimé",
"You will be able to recover deleted files from here" : "Vous pourrez restaurer vos fichiers supprimés ici",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
"Name" : "Nom",
- "Deleted" : "Effacé",
- "Delete" : "Supprimer"
+ "Deleted" : "Effacé"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_trashbin/l10n/fr.json b/apps/files_trashbin/l10n/fr.json
index f4525b9d079..029c6bab0b5 100644
--- a/apps/files_trashbin/l10n/fr.json
+++ b/apps/files_trashbin/l10n/fr.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Impossible de restaurer %s",
"Deleted files" : "Fichiers supprimés",
"Restore" : "Restaurer",
+ "Delete" : "Supprimer",
"Delete permanently" : "Supprimer de façon définitive",
"Error" : "Erreur",
+ "This operation is forbidden" : "Cette opération est interdite",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur",
"restored" : "restauré",
"No deleted files" : "Aucun fichier supprimé",
"You will be able to recover deleted files from here" : "Vous pourrez restaurer vos fichiers supprimés ici",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
"Name" : "Nom",
- "Deleted" : "Effacé",
- "Delete" : "Supprimer"
+ "Deleted" : "Effacé"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/gl.js b/apps/files_trashbin/l10n/gl.js
index a6ea37031a0..52ce23875a0 100644
--- a/apps/files_trashbin/l10n/gl.js
+++ b/apps/files_trashbin/l10n/gl.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Non foi posíbel restaurar %s",
"Deleted files" : "Ficheiros eliminados",
"Restore" : "Restabelecer",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Erro",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador",
"restored" : "restaurado",
"No deleted files" : "Non hai ficheiros eliminados",
"You will be able to recover deleted files from here" : "Poderá recuperar ficheiros borrados de aquí",
"No entries found in this folder" : "Non se atoparon entradas neste cartafol",
"Select all" : "Seleccionar todo",
"Name" : "Nome",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/gl.json b/apps/files_trashbin/l10n/gl.json
index da3aa55fa3f..89df0d2813f 100644
--- a/apps/files_trashbin/l10n/gl.json
+++ b/apps/files_trashbin/l10n/gl.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Non foi posíbel restaurar %s",
"Deleted files" : "Ficheiros eliminados",
"Restore" : "Restabelecer",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Erro",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador",
"restored" : "restaurado",
"No deleted files" : "Non hai ficheiros eliminados",
"You will be able to recover deleted files from here" : "Poderá recuperar ficheiros borrados de aquí",
"No entries found in this folder" : "Non se atoparon entradas neste cartafol",
"Select all" : "Seleccionar todo",
"Name" : "Nome",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/he.js b/apps/files_trashbin/l10n/he.js
index 95e5f391151..e63798008b5 100644
--- a/apps/files_trashbin/l10n/he.js
+++ b/apps/files_trashbin/l10n/he.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "לא ניתן לשחזר את %s",
"Deleted files" : "קבצים שנמחקו",
"Restore" : "שחזור",
+ "Delete" : "מחיקה",
"Delete permanently" : "מחיקה לצמיתות",
"Error" : "שגיאה",
"restored" : "שוחזר",
"Name" : "שם",
- "Deleted" : "נמחק",
- "Delete" : "מחיקה"
+ "Deleted" : "נמחק"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/he.json b/apps/files_trashbin/l10n/he.json
index 68f38e819ff..1f65ace6a90 100644
--- a/apps/files_trashbin/l10n/he.json
+++ b/apps/files_trashbin/l10n/he.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "לא ניתן לשחזר את %s",
"Deleted files" : "קבצים שנמחקו",
"Restore" : "שחזור",
+ "Delete" : "מחיקה",
"Delete permanently" : "מחיקה לצמיתות",
"Error" : "שגיאה",
"restored" : "שוחזר",
"Name" : "שם",
- "Deleted" : "נמחק",
- "Delete" : "מחיקה"
+ "Deleted" : "נמחק"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/hr.js b/apps/files_trashbin/l10n/hr.js
index 89db9a16b98..476b0938c77 100644
--- a/apps/files_trashbin/l10n/hr.js
+++ b/apps/files_trashbin/l10n/hr.js
@@ -5,13 +5,13 @@ OC.L10N.register(
"Couldn't restore %s" : "Nije moguće obnoviti %s",
"Deleted files" : "Izbrisane datoteke",
"Restore" : "Obnovite",
+ "Delete" : "Izbrišite",
"Delete permanently" : "Trajno izbrišite",
"Error" : "Pogreška",
"restored" : "Obnovljeno",
"No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ",
"Select all" : "Selektiraj sve",
"Name" : "Naziv",
- "Deleted" : "Izbrisano",
- "Delete" : "Izbrišite"
+ "Deleted" : "Izbrisano"
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
diff --git a/apps/files_trashbin/l10n/hr.json b/apps/files_trashbin/l10n/hr.json
index d74addf2ca7..877d486fb80 100644
--- a/apps/files_trashbin/l10n/hr.json
+++ b/apps/files_trashbin/l10n/hr.json
@@ -3,13 +3,13 @@
"Couldn't restore %s" : "Nije moguće obnoviti %s",
"Deleted files" : "Izbrisane datoteke",
"Restore" : "Obnovite",
+ "Delete" : "Izbrišite",
"Delete permanently" : "Trajno izbrišite",
"Error" : "Pogreška",
"restored" : "Obnovljeno",
"No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ",
"Select all" : "Selektiraj sve",
"Name" : "Naziv",
- "Deleted" : "Izbrisano",
- "Delete" : "Izbrišite"
+ "Deleted" : "Izbrisano"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/hu_HU.js b/apps/files_trashbin/l10n/hu_HU.js
index 0df2816a312..5fac34bbb2d 100644
--- a/apps/files_trashbin/l10n/hu_HU.js
+++ b/apps/files_trashbin/l10n/hu_HU.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Nem sikerült %s visszaállítása",
"Deleted files" : "Törölt fájlok",
"Restore" : "Visszaállítás",
+ "Delete" : "Törlés",
"Delete permanently" : "Végleges törlés",
"Error" : "Hiba",
+ "This operation is forbidden" : "Tiltott művelet",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem elérhető, kérem nézze meg a naplófájlokat vagy keresse az adminisztrátort",
"restored" : "visszaállítva",
"No deleted files" : "Nincs törölt fájl",
"You will be able to recover deleted files from here" : "Innen vissza tudja állítani a törölt fáljait.",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
"Select all" : "Összes kijelölése",
"Name" : "Név",
- "Deleted" : "Törölve",
- "Delete" : "Törlés"
+ "Deleted" : "Törölve"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/hu_HU.json b/apps/files_trashbin/l10n/hu_HU.json
index 331cd210721..866c885a5d8 100644
--- a/apps/files_trashbin/l10n/hu_HU.json
+++ b/apps/files_trashbin/l10n/hu_HU.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Nem sikerült %s visszaállítása",
"Deleted files" : "Törölt fájlok",
"Restore" : "Visszaállítás",
+ "Delete" : "Törlés",
"Delete permanently" : "Végleges törlés",
"Error" : "Hiba",
+ "This operation is forbidden" : "Tiltott művelet",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem elérhető, kérem nézze meg a naplófájlokat vagy keresse az adminisztrátort",
"restored" : "visszaállítva",
"No deleted files" : "Nincs törölt fájl",
"You will be able to recover deleted files from here" : "Innen vissza tudja állítani a törölt fáljait.",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
"Select all" : "Összes kijelölése",
"Name" : "Név",
- "Deleted" : "Törölve",
- "Delete" : "Törlés"
+ "Deleted" : "Törölve"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/hy.js b/apps/files_trashbin/l10n/hy.js
index 3cc05b39236..39e49b47ae1 100644
--- a/apps/files_trashbin/l10n/hy.js
+++ b/apps/files_trashbin/l10n/hy.js
@@ -5,8 +5,10 @@ OC.L10N.register(
"Restore" : "Վերականգնել",
"Delete" : "Ջնջել",
"Delete permanently" : "Ջնջել ընդմիշտ",
+ "Error" : "Սխալ",
"No deleted files" : "Ջնջված ֆայլեր չկան",
"Select all" : "Նշել բոլորը",
- "Name" : "Անուն"
+ "Name" : "Անուն",
+ "Deleted" : "Ջնջված"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/hy.json b/apps/files_trashbin/l10n/hy.json
index 994d6afaa58..4bd34056b3f 100644
--- a/apps/files_trashbin/l10n/hy.json
+++ b/apps/files_trashbin/l10n/hy.json
@@ -3,8 +3,10 @@
"Restore" : "Վերականգնել",
"Delete" : "Ջնջել",
"Delete permanently" : "Ջնջել ընդմիշտ",
+ "Error" : "Սխալ",
"No deleted files" : "Ջնջված ֆայլեր չկան",
"Select all" : "Նշել բոլորը",
- "Name" : "Անուն"
+ "Name" : "Անուն",
+ "Deleted" : "Ջնջված"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ia.js b/apps/files_trashbin/l10n/ia.js
index 1ae952f8c9b..04e773a81bc 100644
--- a/apps/files_trashbin/l10n/ia.js
+++ b/apps/files_trashbin/l10n/ia.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"files_trashbin",
{
+ "Delete" : "Deler",
"Error" : "Error",
- "Name" : "Nomine",
- "Delete" : "Deler"
+ "Name" : "Nomine"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/ia.json b/apps/files_trashbin/l10n/ia.json
index 909e6dfe769..fa4d526c849 100644
--- a/apps/files_trashbin/l10n/ia.json
+++ b/apps/files_trashbin/l10n/ia.json
@@ -1,6 +1,6 @@
{ "translations": {
+ "Delete" : "Deler",
"Error" : "Error",
- "Name" : "Nomine",
- "Delete" : "Deler"
+ "Name" : "Nomine"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/id.js b/apps/files_trashbin/l10n/id.js
index 53827980ea9..499e1211e59 100644
--- a/apps/files_trashbin/l10n/id.js
+++ b/apps/files_trashbin/l10n/id.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Tidak dapat memulihkan %s",
"Deleted files" : "Berkas yang dihapus",
"Restore" : "Pulihkan",
+ "Delete" : "Hapus",
"Delete permanently" : "Hapus secara permanen",
"Error" : "Galat",
+ "This operation is forbidden" : "Operasi ini dilarang",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak",
"restored" : "dipulihkan",
"No deleted files" : "Tidak ada berkas yang dihapus",
"You will be able to recover deleted files from here" : "Anda dapat memulihkan berkas yang dihapus dari sini",
"No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini",
"Select all" : "Pilih Semua",
"Name" : "Nama",
- "Deleted" : "Dihapus",
- "Delete" : "Hapus"
+ "Deleted" : "Dihapus"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/id.json b/apps/files_trashbin/l10n/id.json
index d0d107a9571..491aad79f16 100644
--- a/apps/files_trashbin/l10n/id.json
+++ b/apps/files_trashbin/l10n/id.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Tidak dapat memulihkan %s",
"Deleted files" : "Berkas yang dihapus",
"Restore" : "Pulihkan",
+ "Delete" : "Hapus",
"Delete permanently" : "Hapus secara permanen",
"Error" : "Galat",
+ "This operation is forbidden" : "Operasi ini dilarang",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak",
"restored" : "dipulihkan",
"No deleted files" : "Tidak ada berkas yang dihapus",
"You will be able to recover deleted files from here" : "Anda dapat memulihkan berkas yang dihapus dari sini",
"No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini",
"Select all" : "Pilih Semua",
"Name" : "Nama",
- "Deleted" : "Dihapus",
- "Delete" : "Hapus"
+ "Deleted" : "Dihapus"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/is.js b/apps/files_trashbin/l10n/is.js
index 38858a5a944..6c9250c21b6 100644
--- a/apps/files_trashbin/l10n/is.js
+++ b/apps/files_trashbin/l10n/is.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Gat ekki endurheimt %s",
"Deleted files" : "eyddar skrár",
"Restore" : "Endurheimta",
+ "Delete" : "Eyða",
"Delete permanently" : "Eyða varanlega",
"Error" : "Villa",
"restored" : "endurheimt",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Engar skrár fundust í þessari möppu",
"Select all" : "Velja allt",
"Name" : "Nafn",
- "Deleted" : "Eytt",
- "Delete" : "Eyða"
+ "Deleted" : "Eytt"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/files_trashbin/l10n/is.json b/apps/files_trashbin/l10n/is.json
index ea2257a68ad..04d746c488d 100644
--- a/apps/files_trashbin/l10n/is.json
+++ b/apps/files_trashbin/l10n/is.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Gat ekki endurheimt %s",
"Deleted files" : "eyddar skrár",
"Restore" : "Endurheimta",
+ "Delete" : "Eyða",
"Delete permanently" : "Eyða varanlega",
"Error" : "Villa",
"restored" : "endurheimt",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Engar skrár fundust í þessari möppu",
"Select all" : "Velja allt",
"Name" : "Nafn",
- "Deleted" : "Eytt",
- "Delete" : "Eyða"
+ "Deleted" : "Eytt"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/it.js b/apps/files_trashbin/l10n/it.js
index 01840a9907c..2f98cd25e07 100644
--- a/apps/files_trashbin/l10n/it.js
+++ b/apps/files_trashbin/l10n/it.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Impossibile ripristinare %s",
"Deleted files" : "File eliminati",
"Restore" : "Ripristina",
+ "Delete" : "Elimina",
"Delete permanently" : "Elimina definitivamente",
"Error" : "Errore",
+ "This operation is forbidden" : "Questa operazione è vietata",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
"restored" : "ripristinati",
"No deleted files" : "Nessun file eliminato",
"You will be able to recover deleted files from here" : "Potrai ripristinare i file eliminati da qui",
"No entries found in this folder" : "Nessuna voce trovata in questa cartella",
"Select all" : "Seleziona tutto",
"Name" : "Nome",
- "Deleted" : "Eliminati",
- "Delete" : "Elimina"
+ "Deleted" : "Eliminati"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/it.json b/apps/files_trashbin/l10n/it.json
index 89ee8efad16..3164a763c18 100644
--- a/apps/files_trashbin/l10n/it.json
+++ b/apps/files_trashbin/l10n/it.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Impossibile ripristinare %s",
"Deleted files" : "File eliminati",
"Restore" : "Ripristina",
+ "Delete" : "Elimina",
"Delete permanently" : "Elimina definitivamente",
"Error" : "Errore",
+ "This operation is forbidden" : "Questa operazione è vietata",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
"restored" : "ripristinati",
"No deleted files" : "Nessun file eliminato",
"You will be able to recover deleted files from here" : "Potrai ripristinare i file eliminati da qui",
"No entries found in this folder" : "Nessuna voce trovata in questa cartella",
"Select all" : "Seleziona tutto",
"Name" : "Nome",
- "Deleted" : "Eliminati",
- "Delete" : "Elimina"
+ "Deleted" : "Eliminati"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ja.js b/apps/files_trashbin/l10n/ja.js
index 6fdb9f3738e..880f391fbc9 100644
--- a/apps/files_trashbin/l10n/ja.js
+++ b/apps/files_trashbin/l10n/ja.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "%s を復元できませんでした",
"Deleted files" : "ゴミ箱",
"Restore" : "復元",
+ "Delete" : "削除",
"Delete permanently" : "完全に削除する",
"Error" : "エラー",
+ "This operation is forbidden" : "この操作は禁止されています",
+ "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
"restored" : "復元済",
"No deleted files" : "削除されたファイルはありません",
"You will be able to recover deleted files from here" : "ここから削除されたファイルを元に戻すことができます。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
"Select all" : "すべて選択",
"Name" : "名前",
- "Deleted" : "削除日時",
- "Delete" : "削除"
+ "Deleted" : "削除日時"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/ja.json b/apps/files_trashbin/l10n/ja.json
index 1d07e8dd960..14172a324f2 100644
--- a/apps/files_trashbin/l10n/ja.json
+++ b/apps/files_trashbin/l10n/ja.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "%s を復元できませんでした",
"Deleted files" : "ゴミ箱",
"Restore" : "復元",
+ "Delete" : "削除",
"Delete permanently" : "完全に削除する",
"Error" : "エラー",
+ "This operation is forbidden" : "この操作は禁止されています",
+ "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
"restored" : "復元済",
"No deleted files" : "削除されたファイルはありません",
"You will be able to recover deleted files from here" : "ここから削除されたファイルを元に戻すことができます。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
"Select all" : "すべて選択",
"Name" : "名前",
- "Deleted" : "削除日時",
- "Delete" : "削除"
+ "Deleted" : "削除日時"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ka_GE.js b/apps/files_trashbin/l10n/ka_GE.js
index cd578d4117a..71f465fe5b1 100644
--- a/apps/files_trashbin/l10n/ka_GE.js
+++ b/apps/files_trashbin/l10n/ka_GE.js
@@ -5,10 +5,10 @@ OC.L10N.register(
"Couldn't restore %s" : "%s–ის აღდგენა ვერ მოხერხდა",
"Deleted files" : "წაშლილი ფაილები",
"Restore" : "აღდგენა",
+ "Delete" : "წაშლა",
"Delete permanently" : "სრულად წაშლა",
"Error" : "შეცდომა",
"Name" : "სახელი",
- "Deleted" : "წაშლილი",
- "Delete" : "წაშლა"
+ "Deleted" : "წაშლილი"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/ka_GE.json b/apps/files_trashbin/l10n/ka_GE.json
index 11fc08b1255..e1721d96f29 100644
--- a/apps/files_trashbin/l10n/ka_GE.json
+++ b/apps/files_trashbin/l10n/ka_GE.json
@@ -3,10 +3,10 @@
"Couldn't restore %s" : "%s–ის აღდგენა ვერ მოხერხდა",
"Deleted files" : "წაშლილი ფაილები",
"Restore" : "აღდგენა",
+ "Delete" : "წაშლა",
"Delete permanently" : "სრულად წაშლა",
"Error" : "შეცდომა",
"Name" : "სახელი",
- "Deleted" : "წაშლილი",
- "Delete" : "წაშლა"
+ "Deleted" : "წაშლილი"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/km.js b/apps/files_trashbin/l10n/km.js
index fafbff1e665..b568abde589 100644
--- a/apps/files_trashbin/l10n/km.js
+++ b/apps/files_trashbin/l10n/km.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "មិន​អាច​ស្ដារ %s ឡើង​វិញ​បាន​ទេ",
"Deleted files" : "ឯកសារ​ដែល​បាន​លុប",
"Restore" : "ស្ដារ​មក​វិញ",
+ "Delete" : "លុប",
"Delete permanently" : "លុប​ជា​អចិន្ត្រៃយ៍",
"Error" : "កំហុស",
"restored" : "បាន​ស្ដារ​វិញ",
"Name" : "ឈ្មោះ",
- "Deleted" : "បាន​លុប",
- "Delete" : "លុប"
+ "Deleted" : "បាន​លុប"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/km.json b/apps/files_trashbin/l10n/km.json
index 0b291a61eb2..14481c4f2e7 100644
--- a/apps/files_trashbin/l10n/km.json
+++ b/apps/files_trashbin/l10n/km.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "មិន​អាច​ស្ដារ %s ឡើង​វិញ​បាន​ទេ",
"Deleted files" : "ឯកសារ​ដែល​បាន​លុប",
"Restore" : "ស្ដារ​មក​វិញ",
+ "Delete" : "លុប",
"Delete permanently" : "លុប​ជា​អចិន្ត្រៃយ៍",
"Error" : "កំហុស",
"restored" : "បាន​ស្ដារ​វិញ",
"Name" : "ឈ្មោះ",
- "Deleted" : "បាន​លុប",
- "Delete" : "លុប"
+ "Deleted" : "បាន​លុប"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/kn.js b/apps/files_trashbin/l10n/kn.js
index 4e918b5f06f..c9e17d94c58 100644
--- a/apps/files_trashbin/l10n/kn.js
+++ b/apps/files_trashbin/l10n/kn.js
@@ -2,9 +2,9 @@ OC.L10N.register(
"files_trashbin",
{
"Restore" : "ಮರುಸ್ಥಾಪಿಸು",
+ "Delete" : "ಅಳಿಸಿ",
"Error" : "ತಪ್ಪಾಗಿದೆ",
"Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ",
- "Name" : "ಹೆಸರು",
- "Delete" : "ಅಳಿಸಿ"
+ "Name" : "ಹೆಸರು"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/kn.json b/apps/files_trashbin/l10n/kn.json
index 174306ce04a..3bd9118dfce 100644
--- a/apps/files_trashbin/l10n/kn.json
+++ b/apps/files_trashbin/l10n/kn.json
@@ -1,8 +1,8 @@
{ "translations": {
"Restore" : "ಮರುಸ್ಥಾಪಿಸು",
+ "Delete" : "ಅಳಿಸಿ",
"Error" : "ತಪ್ಪಾಗಿದೆ",
"Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ",
- "Name" : "ಹೆಸರು",
- "Delete" : "ಅಳಿಸಿ"
+ "Name" : "ಹೆಸರು"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ko.js b/apps/files_trashbin/l10n/ko.js
index d93dca056bb..36cb40288a3 100644
--- a/apps/files_trashbin/l10n/ko.js
+++ b/apps/files_trashbin/l10n/ko.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "%s을(를) 복원할 수 없습니다",
"Deleted files" : "삭제된 파일",
"Restore" : "복원",
+ "Delete" : "삭제",
"Delete permanently" : "영구히 삭제",
"Error" : "오류",
+ "This operation is forbidden" : "이 작업이 금지됨",
+ "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
"restored" : "복원됨",
"No deleted files" : "삭제된 파일 없음",
"You will be able to recover deleted files from here" : "삭제된 파일을 여기에서 복구할 수 있습니다",
"No entries found in this folder" : "이 폴더에 항목 없음",
"Select all" : "모두 선택",
"Name" : "이름",
- "Deleted" : "삭제됨",
- "Delete" : "삭제"
+ "Deleted" : "삭제됨"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/ko.json b/apps/files_trashbin/l10n/ko.json
index 25d1c888550..e95101dfce5 100644
--- a/apps/files_trashbin/l10n/ko.json
+++ b/apps/files_trashbin/l10n/ko.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "%s을(를) 복원할 수 없습니다",
"Deleted files" : "삭제된 파일",
"Restore" : "복원",
+ "Delete" : "삭제",
"Delete permanently" : "영구히 삭제",
"Error" : "오류",
+ "This operation is forbidden" : "이 작업이 금지됨",
+ "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
"restored" : "복원됨",
"No deleted files" : "삭제된 파일 없음",
"You will be able to recover deleted files from here" : "삭제된 파일을 여기에서 복구할 수 있습니다",
"No entries found in this folder" : "이 폴더에 항목 없음",
"Select all" : "모두 선택",
"Name" : "이름",
- "Deleted" : "삭제됨",
- "Delete" : "삭제"
+ "Deleted" : "삭제됨"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/lb.js b/apps/files_trashbin/l10n/lb.js
index c83d9a3a28b..9b2aad6d8b0 100644
--- a/apps/files_trashbin/l10n/lb.js
+++ b/apps/files_trashbin/l10n/lb.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Konnt %s net erëmhierstellen",
"Deleted files" : "Geläscht Fichieren",
"Restore" : "Erëmhierstellen",
+ "Delete" : "Läschen",
"Delete permanently" : "Permanent läschen",
"Error" : "Fehler",
"restored" : "erëmhiergestallt",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
"Select all" : "All auswielen",
"Name" : "Numm",
- "Deleted" : "Geläscht",
- "Delete" : "Läschen"
+ "Deleted" : "Geläscht"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/lb.json b/apps/files_trashbin/l10n/lb.json
index ca13342cb3b..f9c13ce017f 100644
--- a/apps/files_trashbin/l10n/lb.json
+++ b/apps/files_trashbin/l10n/lb.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Konnt %s net erëmhierstellen",
"Deleted files" : "Geläscht Fichieren",
"Restore" : "Erëmhierstellen",
+ "Delete" : "Läschen",
"Delete permanently" : "Permanent läschen",
"Error" : "Fehler",
"restored" : "erëmhiergestallt",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
"Select all" : "All auswielen",
"Name" : "Numm",
- "Deleted" : "Geläscht",
- "Delete" : "Läschen"
+ "Deleted" : "Geläscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/lt_LT.js b/apps/files_trashbin/l10n/lt_LT.js
index afe317ca20a..1548afcc2ee 100644
--- a/apps/files_trashbin/l10n/lt_LT.js
+++ b/apps/files_trashbin/l10n/lt_LT.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Nepavyko atkurti %s",
"Deleted files" : "Ištrinti failai",
"Restore" : "Atstatyti",
+ "Delete" : "Ištrinti",
"Delete permanently" : "Ištrinti negrįžtamai",
"Error" : "Klaida",
+ "This operation is forbidden" : "Ši operacija yra uždrausta",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi",
"restored" : "atstatyta",
"No deleted files" : "Nėra ištrintų failų",
"You will be able to recover deleted files from here" : "Jūs galėsite atkurti ištrintus failus iš čia",
"No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Name" : "Pavadinimas",
- "Deleted" : "Ištrinti",
- "Delete" : "Ištrinti"
+ "Deleted" : "Ištrinti"
},
"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_trashbin/l10n/lt_LT.json b/apps/files_trashbin/l10n/lt_LT.json
index bf2cb31b588..51fab92428f 100644
--- a/apps/files_trashbin/l10n/lt_LT.json
+++ b/apps/files_trashbin/l10n/lt_LT.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Nepavyko atkurti %s",
"Deleted files" : "Ištrinti failai",
"Restore" : "Atstatyti",
+ "Delete" : "Ištrinti",
"Delete permanently" : "Ištrinti negrįžtamai",
"Error" : "Klaida",
+ "This operation is forbidden" : "Ši operacija yra uždrausta",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi",
"restored" : "atstatyta",
"No deleted files" : "Nėra ištrintų failų",
"You will be able to recover deleted files from here" : "Jūs galėsite atkurti ištrintus failus iš čia",
"No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Name" : "Pavadinimas",
- "Deleted" : "Ištrinti",
- "Delete" : "Ištrinti"
+ "Deleted" : "Ištrinti"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/lv.js b/apps/files_trashbin/l10n/lv.js
index 813ddd314e1..5629ba6af06 100644
--- a/apps/files_trashbin/l10n/lv.js
+++ b/apps/files_trashbin/l10n/lv.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Nevarēja atjaunot %s",
"Deleted files" : "Dzēstās datnes",
"Restore" : "Atjaunot",
+ "Delete" : "Dzēst",
"Delete permanently" : "Dzēst pavisam",
"Error" : "Kļūda",
"restored" : "atjaunots",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Šajā mapē nekas nav atrasts",
"Select all" : "Atzīmēt visu",
"Name" : "Nosaukums",
- "Deleted" : "Dzēsts",
- "Delete" : "Dzēst"
+ "Deleted" : "Dzēsts"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/files_trashbin/l10n/lv.json b/apps/files_trashbin/l10n/lv.json
index 9c0ad01ce9a..4cf941bd21e 100644
--- a/apps/files_trashbin/l10n/lv.json
+++ b/apps/files_trashbin/l10n/lv.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Nevarēja atjaunot %s",
"Deleted files" : "Dzēstās datnes",
"Restore" : "Atjaunot",
+ "Delete" : "Dzēst",
"Delete permanently" : "Dzēst pavisam",
"Error" : "Kļūda",
"restored" : "atjaunots",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Šajā mapē nekas nav atrasts",
"Select all" : "Atzīmēt visu",
"Name" : "Nosaukums",
- "Deleted" : "Dzēsts",
- "Delete" : "Dzēst"
+ "Deleted" : "Dzēsts"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/mk.js b/apps/files_trashbin/l10n/mk.js
index f5286eac043..6acb933aa80 100644
--- a/apps/files_trashbin/l10n/mk.js
+++ b/apps/files_trashbin/l10n/mk.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "Не можеше да се поврати %s",
"Deleted files" : "Избришани датотеки",
"Restore" : "Поврати",
+ "Delete" : "Избриши",
"Delete permanently" : "Трајно избришани",
"Error" : "Грешка",
"restored" : "повратени",
"Name" : "Име",
- "Deleted" : "Избришан",
- "Delete" : "Избриши"
+ "Deleted" : "Избришан"
},
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/files_trashbin/l10n/mk.json b/apps/files_trashbin/l10n/mk.json
index 119a6c4f954..a9948f49ff6 100644
--- a/apps/files_trashbin/l10n/mk.json
+++ b/apps/files_trashbin/l10n/mk.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "Не можеше да се поврати %s",
"Deleted files" : "Избришани датотеки",
"Restore" : "Поврати",
+ "Delete" : "Избриши",
"Delete permanently" : "Трајно избришани",
"Error" : "Грешка",
"restored" : "повратени",
"Name" : "Име",
- "Deleted" : "Избришан",
- "Delete" : "Избриши"
+ "Deleted" : "Избришан"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ms_MY.js b/apps/files_trashbin/l10n/ms_MY.js
index 1441ab03bf9..22680ff254d 100644
--- a/apps/files_trashbin/l10n/ms_MY.js
+++ b/apps/files_trashbin/l10n/ms_MY.js
@@ -5,10 +5,10 @@ OC.L10N.register(
"Couldn't restore %s" : "Tidak dapat memulihkan %s",
"Deleted files" : "Fail dipadam",
"Restore" : "Pulihkan",
+ "Delete" : "Padam",
"Error" : "Ralat",
"restored" : "dipulihkan",
"Name" : "Nama",
- "Deleted" : "Dipadam",
- "Delete" : "Padam"
+ "Deleted" : "Dipadam"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/ms_MY.json b/apps/files_trashbin/l10n/ms_MY.json
index a2b674d23d5..340b46e78a1 100644
--- a/apps/files_trashbin/l10n/ms_MY.json
+++ b/apps/files_trashbin/l10n/ms_MY.json
@@ -3,10 +3,10 @@
"Couldn't restore %s" : "Tidak dapat memulihkan %s",
"Deleted files" : "Fail dipadam",
"Restore" : "Pulihkan",
+ "Delete" : "Padam",
"Error" : "Ralat",
"restored" : "dipulihkan",
"Name" : "Nama",
- "Deleted" : "Dipadam",
- "Delete" : "Padam"
+ "Deleted" : "Dipadam"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/nb_NO.js b/apps/files_trashbin/l10n/nb_NO.js
index 2c1fd5396ef..644ad102ae4 100644
--- a/apps/files_trashbin/l10n/nb_NO.js
+++ b/apps/files_trashbin/l10n/nb_NO.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Kunne ikke gjenopprette %s",
"Deleted files" : "Slettede filer",
"Restore" : "Gjenopprett",
+ "Delete" : "Slett",
"Delete permanently" : "Slett permanent",
"Error" : "Feil",
+ "This operation is forbidden" : "Operasjonen er forbudt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
"restored" : "gjenopprettet",
"No deleted files" : "Ingen slettede filer",
"You will be able to recover deleted files from here" : "Du vil kunne gjenopprette slettede filer herfra",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
"Name" : "Navn",
- "Deleted" : "Slettet",
- "Delete" : "Slett"
+ "Deleted" : "Slettet"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/nb_NO.json b/apps/files_trashbin/l10n/nb_NO.json
index 44e6161fe18..442221a2c8c 100644
--- a/apps/files_trashbin/l10n/nb_NO.json
+++ b/apps/files_trashbin/l10n/nb_NO.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Kunne ikke gjenopprette %s",
"Deleted files" : "Slettede filer",
"Restore" : "Gjenopprett",
+ "Delete" : "Slett",
"Delete permanently" : "Slett permanent",
"Error" : "Feil",
+ "This operation is forbidden" : "Operasjonen er forbudt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
"restored" : "gjenopprettet",
"No deleted files" : "Ingen slettede filer",
"You will be able to recover deleted files from here" : "Du vil kunne gjenopprette slettede filer herfra",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
"Name" : "Navn",
- "Deleted" : "Slettet",
- "Delete" : "Slett"
+ "Deleted" : "Slettet"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/nds.js b/apps/files_trashbin/l10n/nds.js
index b2dd9ff4ca6..8212e5210a9 100644
--- a/apps/files_trashbin/l10n/nds.js
+++ b/apps/files_trashbin/l10n/nds.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_trashbin",
{
"Delete" : "Löschen",
+ "Error" : "Fehler",
"Name" : "Name"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/nds.json b/apps/files_trashbin/l10n/nds.json
index 45b0caa74ac..d15a7c583ac 100644
--- a/apps/files_trashbin/l10n/nds.json
+++ b/apps/files_trashbin/l10n/nds.json
@@ -1,5 +1,6 @@
{ "translations": {
"Delete" : "Löschen",
+ "Error" : "Fehler",
"Name" : "Name"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/nl.js b/apps/files_trashbin/l10n/nl.js
index 4b9227b563f..1b536860ce6 100644
--- a/apps/files_trashbin/l10n/nl.js
+++ b/apps/files_trashbin/l10n/nl.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Kon %s niet herstellen",
"Deleted files" : "Verwijderde bestanden",
"Restore" : "Herstellen",
+ "Delete" : "Verwijder",
"Delete permanently" : "Definitief verwijderen",
"Error" : "Fout",
+ "This operation is forbidden" : "Deze taak is verboden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
"restored" : "hersteld",
"No deleted files" : "Geen verwijderde bestanden",
"You will be able to recover deleted files from here" : "U kunt verwijderde bestanden hier vandaan weer terugzetten",
"No entries found in this folder" : "Niets gevonden in deze map",
"Select all" : "Alles selecteren",
"Name" : "Naam",
- "Deleted" : "Verwijderd",
- "Delete" : "Verwijder"
+ "Deleted" : "Verwijderd"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/nl.json b/apps/files_trashbin/l10n/nl.json
index 7e78dde9baa..a80e1d8e1a9 100644
--- a/apps/files_trashbin/l10n/nl.json
+++ b/apps/files_trashbin/l10n/nl.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Kon %s niet herstellen",
"Deleted files" : "Verwijderde bestanden",
"Restore" : "Herstellen",
+ "Delete" : "Verwijder",
"Delete permanently" : "Definitief verwijderen",
"Error" : "Fout",
+ "This operation is forbidden" : "Deze taak is verboden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
"restored" : "hersteld",
"No deleted files" : "Geen verwijderde bestanden",
"You will be able to recover deleted files from here" : "U kunt verwijderde bestanden hier vandaan weer terugzetten",
"No entries found in this folder" : "Niets gevonden in deze map",
"Select all" : "Alles selecteren",
"Name" : "Naam",
- "Deleted" : "Verwijderd",
- "Delete" : "Verwijder"
+ "Deleted" : "Verwijderd"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/nn_NO.js b/apps/files_trashbin/l10n/nn_NO.js
index fc4a6a5cc37..c97071b9c66 100644
--- a/apps/files_trashbin/l10n/nn_NO.js
+++ b/apps/files_trashbin/l10n/nn_NO.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Couldn't restore %s" : "Klarte ikkje gjenoppretta %s",
"Deleted files" : "Sletta filer",
"Restore" : "Gjenopprett",
+ "Delete" : "Slett",
"Delete permanently" : "Slett for godt",
"Error" : "Feil",
"restored" : "gjenoppretta",
"Name" : "Namn",
- "Deleted" : "Sletta",
- "Delete" : "Slett"
+ "Deleted" : "Sletta"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/nn_NO.json b/apps/files_trashbin/l10n/nn_NO.json
index f8cf76ca3f4..acecd932b77 100644
--- a/apps/files_trashbin/l10n/nn_NO.json
+++ b/apps/files_trashbin/l10n/nn_NO.json
@@ -3,11 +3,11 @@
"Couldn't restore %s" : "Klarte ikkje gjenoppretta %s",
"Deleted files" : "Sletta filer",
"Restore" : "Gjenopprett",
+ "Delete" : "Slett",
"Delete permanently" : "Slett for godt",
"Error" : "Feil",
"restored" : "gjenoppretta",
"Name" : "Namn",
- "Deleted" : "Sletta",
- "Delete" : "Slett"
+ "Deleted" : "Sletta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/oc.js b/apps/files_trashbin/l10n/oc.js
index 390ccaea050..762d7a9b424 100644
--- a/apps/files_trashbin/l10n/oc.js
+++ b/apps/files_trashbin/l10n/oc.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete" : "Suprimir",
"Delete permanently" : "Suprimir de faiçon definitiva",
"Error" : "Error",
+ "This operation is forbidden" : "L'operacion es interdicha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
"restored" : "restablit",
"No deleted files" : "Cap de fichièr pas suprimit",
"You will be able to recover deleted files from here" : "Poiretz restablir vòstres fichièrs suprimits aicí",
diff --git a/apps/files_trashbin/l10n/oc.json b/apps/files_trashbin/l10n/oc.json
index e2add0b3cdb..a48b12e0c6e 100644
--- a/apps/files_trashbin/l10n/oc.json
+++ b/apps/files_trashbin/l10n/oc.json
@@ -6,6 +6,8 @@
"Delete" : "Suprimir",
"Delete permanently" : "Suprimir de faiçon definitiva",
"Error" : "Error",
+ "This operation is forbidden" : "L'operacion es interdicha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
"restored" : "restablit",
"No deleted files" : "Cap de fichièr pas suprimit",
"You will be able to recover deleted files from here" : "Poiretz restablir vòstres fichièrs suprimits aicí",
diff --git a/apps/files_trashbin/l10n/pa.js b/apps/files_trashbin/l10n/pa.js
index 301d8f08c15..7c2bd3674dd 100644
--- a/apps/files_trashbin/l10n/pa.js
+++ b/apps/files_trashbin/l10n/pa.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"files_trashbin",
{
- "Error" : "ਗਲਤੀ",
- "Delete" : "ਹਟਾਓ"
+ "Delete" : "ਹਟਾਓ",
+ "Error" : "ਗਲਤੀ"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/pa.json b/apps/files_trashbin/l10n/pa.json
index 6ad75a4c997..aa150965640 100644
--- a/apps/files_trashbin/l10n/pa.json
+++ b/apps/files_trashbin/l10n/pa.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Error" : "ਗਲਤੀ",
- "Delete" : "ਹਟਾਓ"
+ "Delete" : "ਹਟਾਓ",
+ "Error" : "ਗਲਤੀ"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/pl.js b/apps/files_trashbin/l10n/pl.js
index ba0a2e93bd3..0c11dab91d4 100644
--- a/apps/files_trashbin/l10n/pl.js
+++ b/apps/files_trashbin/l10n/pl.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Nie można przywrócić %s",
"Deleted files" : "Usunięte pliki",
"Restore" : "Przywróć",
+ "Delete" : "Usuń",
"Delete permanently" : "Trwale usuń",
"Error" : "Błąd",
"restored" : "przywrócony",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Brak wpisów w tym folderze",
"Select all" : "Wybierz wszystko",
"Name" : "Nazwa",
- "Deleted" : "Usunięte",
- "Delete" : "Usuń"
+ "Deleted" : "Usunięte"
},
"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_trashbin/l10n/pl.json b/apps/files_trashbin/l10n/pl.json
index 4fa8debaf29..8b56be020fb 100644
--- a/apps/files_trashbin/l10n/pl.json
+++ b/apps/files_trashbin/l10n/pl.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Nie można przywrócić %s",
"Deleted files" : "Usunięte pliki",
"Restore" : "Przywróć",
+ "Delete" : "Usuń",
"Delete permanently" : "Trwale usuń",
"Error" : "Błąd",
"restored" : "przywrócony",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Brak wpisów w tym folderze",
"Select all" : "Wybierz wszystko",
"Name" : "Nazwa",
- "Deleted" : "Usunięte",
- "Delete" : "Usuń"
+ "Deleted" : "Usunięte"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/pt_BR.js b/apps/files_trashbin/l10n/pt_BR.js
index 737a522eea1..b1a3768a3bd 100644
--- a/apps/files_trashbin/l10n/pt_BR.js
+++ b/apps/files_trashbin/l10n/pt_BR.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Não foi possível restaurar %s",
"Deleted files" : "Arquivos apagados",
"Restore" : "Restaurar",
+ "Delete" : "Excluir",
"Delete permanently" : "Excluir permanentemente",
"Error" : "Erro",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador",
"restored" : "restaurado",
"No deleted files" : "Aquivos não removidos",
"You will be able to recover deleted files from here" : "Você pode recuperar arquivos removidos daqui",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
"Name" : "Nome",
- "Deleted" : "Excluído",
- "Delete" : "Excluir"
+ "Deleted" : "Excluído"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_trashbin/l10n/pt_BR.json b/apps/files_trashbin/l10n/pt_BR.json
index 25ee0439d67..db2dc331d5d 100644
--- a/apps/files_trashbin/l10n/pt_BR.json
+++ b/apps/files_trashbin/l10n/pt_BR.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Não foi possível restaurar %s",
"Deleted files" : "Arquivos apagados",
"Restore" : "Restaurar",
+ "Delete" : "Excluir",
"Delete permanently" : "Excluir permanentemente",
"Error" : "Erro",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador",
"restored" : "restaurado",
"No deleted files" : "Aquivos não removidos",
"You will be able to recover deleted files from here" : "Você pode recuperar arquivos removidos daqui",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
"Name" : "Nome",
- "Deleted" : "Excluído",
- "Delete" : "Excluir"
+ "Deleted" : "Excluído"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/pt_PT.js b/apps/files_trashbin/l10n/pt_PT.js
index 8124af21751..8bcc248d948 100644
--- a/apps/files_trashbin/l10n/pt_PT.js
+++ b/apps/files_trashbin/l10n/pt_PT.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Não foi possível restaurar %s",
"Deleted files" : "Ficheiros eliminados",
"Restore" : "Restaurar",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Erro",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
"restored" : "Restaurado",
"No deleted files" : "Sem ficheiros eliminados",
"You will be able to recover deleted files from here" : "Poderá recuperar ficheiros apagados aqui",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
"Select all" : "Seleccionar todos",
"Name" : "Nome",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/pt_PT.json b/apps/files_trashbin/l10n/pt_PT.json
index f1fb924af59..e8bed1ea891 100644
--- a/apps/files_trashbin/l10n/pt_PT.json
+++ b/apps/files_trashbin/l10n/pt_PT.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Não foi possível restaurar %s",
"Deleted files" : "Ficheiros eliminados",
"Restore" : "Restaurar",
+ "Delete" : "Eliminar",
"Delete permanently" : "Eliminar permanentemente",
"Error" : "Erro",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
"restored" : "Restaurado",
"No deleted files" : "Sem ficheiros eliminados",
"You will be able to recover deleted files from here" : "Poderá recuperar ficheiros apagados aqui",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
"Select all" : "Seleccionar todos",
"Name" : "Nome",
- "Deleted" : "Eliminado",
- "Delete" : "Eliminar"
+ "Deleted" : "Eliminado"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ro.js b/apps/files_trashbin/l10n/ro.js
index 89fb577014e..1c0df1c5157 100644
--- a/apps/files_trashbin/l10n/ro.js
+++ b/apps/files_trashbin/l10n/ro.js
@@ -5,13 +5,13 @@ OC.L10N.register(
"Couldn't restore %s" : "Nu se poate recupera %s",
"Deleted files" : "Sterge fisierele",
"Restore" : "Restabilire",
+ "Delete" : "Șterge",
"Delete permanently" : "Șterge permanent",
"Error" : "Eroare",
"restored" : "restaurat",
"No deleted files" : "Nu sunt fișiere șterse",
"Select all" : "Selectează tot",
"Name" : "Nume",
- "Deleted" : "A fost șters.",
- "Delete" : "Șterge"
+ "Deleted" : "A fost șters."
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/files_trashbin/l10n/ro.json b/apps/files_trashbin/l10n/ro.json
index 6a68abae7fa..d7f01caca38 100644
--- a/apps/files_trashbin/l10n/ro.json
+++ b/apps/files_trashbin/l10n/ro.json
@@ -3,13 +3,13 @@
"Couldn't restore %s" : "Nu se poate recupera %s",
"Deleted files" : "Sterge fisierele",
"Restore" : "Restabilire",
+ "Delete" : "Șterge",
"Delete permanently" : "Șterge permanent",
"Error" : "Eroare",
"restored" : "restaurat",
"No deleted files" : "Nu sunt fișiere șterse",
"Select all" : "Selectează tot",
"Name" : "Nume",
- "Deleted" : "A fost șters.",
- "Delete" : "Șterge"
+ "Deleted" : "A fost șters."
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ru.js b/apps/files_trashbin/l10n/ru.js
index b51486b6eb0..337d0b0a575 100644
--- a/apps/files_trashbin/l10n/ru.js
+++ b/apps/files_trashbin/l10n/ru.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "%s не может быть восстановлен",
"Deleted files" : "Удалённые файлы",
"Restore" : "Восстановить",
+ "Delete" : "Удалить",
"Delete permanently" : "Удалить окончательно",
"Error" : "Ошибка",
+ "This operation is forbidden" : "Операция запрещена",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором",
"restored" : "восстановлен",
"No deleted files" : "Нет удалённых файлов",
"You will be able to recover deleted files from here" : "Здесь вы сможете восстановить удалённые файлы",
"No entries found in this folder" : "Нет элементов в этом каталоге",
"Select all" : "Выделить все",
"Name" : "Имя",
- "Deleted" : "Удалён",
- "Delete" : "Удалить"
+ "Deleted" : "Удалён"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_trashbin/l10n/ru.json b/apps/files_trashbin/l10n/ru.json
index 9fecb3a9641..2ab8d48476d 100644
--- a/apps/files_trashbin/l10n/ru.json
+++ b/apps/files_trashbin/l10n/ru.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "%s не может быть восстановлен",
"Deleted files" : "Удалённые файлы",
"Restore" : "Восстановить",
+ "Delete" : "Удалить",
"Delete permanently" : "Удалить окончательно",
"Error" : "Ошибка",
+ "This operation is forbidden" : "Операция запрещена",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором",
"restored" : "восстановлен",
"No deleted files" : "Нет удалённых файлов",
"You will be able to recover deleted files from here" : "Здесь вы сможете восстановить удалённые файлы",
"No entries found in this folder" : "Нет элементов в этом каталоге",
"Select all" : "Выделить все",
"Name" : "Имя",
- "Deleted" : "Удалён",
- "Delete" : "Удалить"
+ "Deleted" : "Удалён"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/si_LK.js b/apps/files_trashbin/l10n/si_LK.js
index 2f8a62ccab8..84d0f86a7f6 100644
--- a/apps/files_trashbin/l10n/si_LK.js
+++ b/apps/files_trashbin/l10n/si_LK.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"files_trashbin",
{
+ "Delete" : "මකා දමන්න",
"Error" : "දෝෂයක්",
- "Name" : "නම",
- "Delete" : "මකා දමන්න"
+ "Name" : "නම"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/si_LK.json b/apps/files_trashbin/l10n/si_LK.json
index c46fb9adcbc..467fc3e058c 100644
--- a/apps/files_trashbin/l10n/si_LK.json
+++ b/apps/files_trashbin/l10n/si_LK.json
@@ -1,6 +1,6 @@
{ "translations": {
+ "Delete" : "මකා දමන්න",
"Error" : "දෝෂයක්",
- "Name" : "නම",
- "Delete" : "මකා දමන්න"
+ "Name" : "නම"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/sk_SK.js b/apps/files_trashbin/l10n/sk_SK.js
index 483691acf99..b4168ec5440 100644
--- a/apps/files_trashbin/l10n/sk_SK.js
+++ b/apps/files_trashbin/l10n/sk_SK.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Nemožno obnoviť %s",
"Deleted files" : "Zmazané súbory",
"Restore" : "Obnoviť",
+ "Delete" : "Zmazať",
"Delete permanently" : "Zmazať natrvalo",
"Error" : "Chyba",
+ "This operation is forbidden" : "Táto operácia je zakázaná",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
"restored" : "obnovené",
"No deleted files" : "Žiadne zmazané súbory",
"You will be able to recover deleted files from here" : "Tu budete mať možnosť obnoviť zmazané súbory",
"No entries found in this folder" : "V tomto priečinku nebolo nič nájdené",
"Select all" : "Vybrať všetko",
"Name" : "Názov",
- "Deleted" : "Zmazané",
- "Delete" : "Zmazať"
+ "Deleted" : "Zmazané"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_trashbin/l10n/sk_SK.json b/apps/files_trashbin/l10n/sk_SK.json
index 90b91cd92be..b02227c7064 100644
--- a/apps/files_trashbin/l10n/sk_SK.json
+++ b/apps/files_trashbin/l10n/sk_SK.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Nemožno obnoviť %s",
"Deleted files" : "Zmazané súbory",
"Restore" : "Obnoviť",
+ "Delete" : "Zmazať",
"Delete permanently" : "Zmazať natrvalo",
"Error" : "Chyba",
+ "This operation is forbidden" : "Táto operácia je zakázaná",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
"restored" : "obnovené",
"No deleted files" : "Žiadne zmazané súbory",
"You will be able to recover deleted files from here" : "Tu budete mať možnosť obnoviť zmazané súbory",
"No entries found in this folder" : "V tomto priečinku nebolo nič nájdené",
"Select all" : "Vybrať všetko",
"Name" : "Názov",
- "Deleted" : "Zmazané",
- "Delete" : "Zmazať"
+ "Deleted" : "Zmazané"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/sl.js b/apps/files_trashbin/l10n/sl.js
index 4287b3d860c..53654fe9504 100644
--- a/apps/files_trashbin/l10n/sl.js
+++ b/apps/files_trashbin/l10n/sl.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Ni mogoče obnoviti %s",
"Deleted files" : "Izbrisane datoteke",
"Restore" : "Obnovi",
+ "Delete" : "Izbriši",
"Delete permanently" : "Izbriši dokončno",
"Error" : "Napaka",
"restored" : "obnovljeno",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
"Name" : "Ime",
- "Deleted" : "Izbrisano",
- "Delete" : "Izbriši"
+ "Deleted" : "Izbrisano"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/files_trashbin/l10n/sl.json b/apps/files_trashbin/l10n/sl.json
index 0e996a2495b..4fbd296e3f6 100644
--- a/apps/files_trashbin/l10n/sl.json
+++ b/apps/files_trashbin/l10n/sl.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Ni mogoče obnoviti %s",
"Deleted files" : "Izbrisane datoteke",
"Restore" : "Obnovi",
+ "Delete" : "Izbriši",
"Delete permanently" : "Izbriši dokončno",
"Error" : "Napaka",
"restored" : "obnovljeno",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
"Name" : "Ime",
- "Deleted" : "Izbrisano",
- "Delete" : "Izbriši"
+ "Deleted" : "Izbrisano"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/sq.js b/apps/files_trashbin/l10n/sq.js
index 3a1d0fed3bb..45348ca24b3 100644
--- a/apps/files_trashbin/l10n/sq.js
+++ b/apps/files_trashbin/l10n/sq.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete" : "Fshije",
"Delete permanently" : "Fshije përgjithmonë",
"Error" : "Gabim",
+ "This operation is forbidden" : "Ky veprim është i ndaluar",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin",
"restored" : "u rikthye",
"No deleted files" : "Pa kartela të fshira",
"You will be able to recover deleted files from here" : "Që këtu do të jeni në gjendje të rimerrni kartela të fshira",
diff --git a/apps/files_trashbin/l10n/sq.json b/apps/files_trashbin/l10n/sq.json
index 4f2c429cb75..a28078058c9 100644
--- a/apps/files_trashbin/l10n/sq.json
+++ b/apps/files_trashbin/l10n/sq.json
@@ -6,6 +6,8 @@
"Delete" : "Fshije",
"Delete permanently" : "Fshije përgjithmonë",
"Error" : "Gabim",
+ "This operation is forbidden" : "Ky veprim është i ndaluar",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin",
"restored" : "u rikthye",
"No deleted files" : "Pa kartela të fshira",
"You will be able to recover deleted files from here" : "Që këtu do të jeni në gjendje të rimerrni kartela të fshira",
diff --git a/apps/files_trashbin/l10n/sr.js b/apps/files_trashbin/l10n/sr.js
index e9a4f79f94e..dc3c8b46bc7 100644
--- a/apps/files_trashbin/l10n/sr.js
+++ b/apps/files_trashbin/l10n/sr.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "Не могу да вратим %s",
"Deleted files" : "Обрисани фајлови",
"Restore" : "Врати",
+ "Delete" : "Обриши",
"Delete permanently" : "Обриши заувек",
"Error" : "Грешка",
+ "This operation is forbidden" : "Ова радња је забрањена",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
"restored" : "враћено",
"No deleted files" : "Нема обрисаних фајлова",
"You will be able to recover deleted files from here" : "Одавде ћете моћи да повратите обрисане фајлове",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
"Name" : "Назив",
- "Deleted" : "Обрисано",
- "Delete" : "Обриши"
+ "Deleted" : "Обрисано"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_trashbin/l10n/sr.json b/apps/files_trashbin/l10n/sr.json
index e572b6a3e85..c57bbdb83d4 100644
--- a/apps/files_trashbin/l10n/sr.json
+++ b/apps/files_trashbin/l10n/sr.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "Не могу да вратим %s",
"Deleted files" : "Обрисани фајлови",
"Restore" : "Врати",
+ "Delete" : "Обриши",
"Delete permanently" : "Обриши заувек",
"Error" : "Грешка",
+ "This operation is forbidden" : "Ова радња је забрањена",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
"restored" : "враћено",
"No deleted files" : "Нема обрисаних фајлова",
"You will be able to recover deleted files from here" : "Одавде ћете моћи да повратите обрисане фајлове",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
"Name" : "Назив",
- "Deleted" : "Обрисано",
- "Delete" : "Обриши"
+ "Deleted" : "Обрисано"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/sr@latin.js b/apps/files_trashbin/l10n/sr@latin.js
index 24b57789fdb..e6eb817ccf3 100644
--- a/apps/files_trashbin/l10n/sr@latin.js
+++ b/apps/files_trashbin/l10n/sr@latin.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Ne mogu da vratim %s",
"Deleted files" : "Obrisani fajlovi",
"Restore" : "Vrati",
+ "Delete" : "Obriši",
"Delete permanently" : "Obriši zauvek",
"Error" : "Greška",
"restored" : "vraćeno",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Nema ničega u ovoj fascikli",
"Select all" : "Označi sve",
"Name" : "Naziv",
- "Deleted" : "Obrisano",
- "Delete" : "Obriši"
+ "Deleted" : "Obrisano"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_trashbin/l10n/sr@latin.json b/apps/files_trashbin/l10n/sr@latin.json
index 9351affd2a9..462e2f21e2a 100644
--- a/apps/files_trashbin/l10n/sr@latin.json
+++ b/apps/files_trashbin/l10n/sr@latin.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Ne mogu da vratim %s",
"Deleted files" : "Obrisani fajlovi",
"Restore" : "Vrati",
+ "Delete" : "Obriši",
"Delete permanently" : "Obriši zauvek",
"Error" : "Greška",
"restored" : "vraćeno",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Nema ničega u ovoj fascikli",
"Select all" : "Označi sve",
"Name" : "Naziv",
- "Deleted" : "Obrisano",
- "Delete" : "Obriši"
+ "Deleted" : "Obrisano"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/sv.js b/apps/files_trashbin/l10n/sv.js
index d21f1418073..923d9cdd7db 100644
--- a/apps/files_trashbin/l10n/sv.js
+++ b/apps/files_trashbin/l10n/sv.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete" : "Radera",
"Delete permanently" : "Radera permanent",
"Error" : "Fel",
+ "This operation is forbidden" : "Denna operation är förbjuden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
"restored" : "återställd",
"No deleted files" : "Inga borttagna filer",
"You will be able to recover deleted files from here" : "Du kommer kunna återfå raderade filer härifrån",
diff --git a/apps/files_trashbin/l10n/sv.json b/apps/files_trashbin/l10n/sv.json
index 0b9052ea713..f9ae83cabd2 100644
--- a/apps/files_trashbin/l10n/sv.json
+++ b/apps/files_trashbin/l10n/sv.json
@@ -6,6 +6,8 @@
"Delete" : "Radera",
"Delete permanently" : "Radera permanent",
"Error" : "Fel",
+ "This operation is forbidden" : "Denna operation är förbjuden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
"restored" : "återställd",
"No deleted files" : "Inga borttagna filer",
"You will be able to recover deleted files from here" : "Du kommer kunna återfå raderade filer härifrån",
diff --git a/apps/files_trashbin/l10n/ta_LK.js b/apps/files_trashbin/l10n/ta_LK.js
index cd53239625e..c5514d9d218 100644
--- a/apps/files_trashbin/l10n/ta_LK.js
+++ b/apps/files_trashbin/l10n/ta_LK.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"files_trashbin",
{
+ "Delete" : "நீக்குக",
"Error" : "வழு",
- "Name" : "பெயர்",
- "Delete" : "நீக்குக"
+ "Name" : "பெயர்"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/ta_LK.json b/apps/files_trashbin/l10n/ta_LK.json
index ade1c7f13e0..c46481e9da9 100644
--- a/apps/files_trashbin/l10n/ta_LK.json
+++ b/apps/files_trashbin/l10n/ta_LK.json
@@ -1,6 +1,6 @@
{ "translations": {
+ "Delete" : "நீக்குக",
"Error" : "வழு",
- "Name" : "பெயர்",
- "Delete" : "நீக்குக"
+ "Name" : "பெயர்"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/te.js b/apps/files_trashbin/l10n/te.js
index e851ec86421..d9972912e61 100644
--- a/apps/files_trashbin/l10n/te.js
+++ b/apps/files_trashbin/l10n/te.js
@@ -1,9 +1,9 @@
OC.L10N.register(
"files_trashbin",
{
+ "Delete" : "తొలగించు",
"Delete permanently" : "శాశ్వతంగా తొలగించు",
"Error" : "పొరపాటు",
- "Name" : "పేరు",
- "Delete" : "తొలగించు"
+ "Name" : "పేరు"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/te.json b/apps/files_trashbin/l10n/te.json
index 4df06631a0c..0e6c6557355 100644
--- a/apps/files_trashbin/l10n/te.json
+++ b/apps/files_trashbin/l10n/te.json
@@ -1,7 +1,7 @@
{ "translations": {
+ "Delete" : "తొలగించు",
"Delete permanently" : "శాశ్వతంగా తొలగించు",
"Error" : "పొరపాటు",
- "Name" : "పేరు",
- "Delete" : "తొలగించు"
+ "Name" : "పేరు"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/th_TH.js b/apps/files_trashbin/l10n/th_TH.js
index e294f592e84..487b457deb3 100644
--- a/apps/files_trashbin/l10n/th_TH.js
+++ b/apps/files_trashbin/l10n/th_TH.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "ไม่สามารถกู้คืน %s",
"Deleted files" : "ไฟล์ที่ถูกลบ",
"Restore" : "คืนค่า",
+ "Delete" : "ลบ",
"Delete permanently" : "ลบแบบถาวร",
"Error" : "ข้อผิดพลาด",
+ "This operation is forbidden" : "การดำเนินการนี้ถูกห้าม",
+ "This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ",
"restored" : "การเรียกคืน",
"No deleted files" : "ไม่มีไฟล์ที่ถูกลบ",
"You will be able to recover deleted files from here" : "คุณจะสามารถกู้คืนไฟล์ที่ถูกลบจากที่นี่",
"No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
"Select all" : "เลือกทั้งหมด",
"Name" : "ชื่อ",
- "Deleted" : "ลบแล้ว",
- "Delete" : "ลบ"
+ "Deleted" : "ลบแล้ว"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/th_TH.json b/apps/files_trashbin/l10n/th_TH.json
index 7dc7546f55b..db4bd2de209 100644
--- a/apps/files_trashbin/l10n/th_TH.json
+++ b/apps/files_trashbin/l10n/th_TH.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "ไม่สามารถกู้คืน %s",
"Deleted files" : "ไฟล์ที่ถูกลบ",
"Restore" : "คืนค่า",
+ "Delete" : "ลบ",
"Delete permanently" : "ลบแบบถาวร",
"Error" : "ข้อผิดพลาด",
+ "This operation is forbidden" : "การดำเนินการนี้ถูกห้าม",
+ "This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ",
"restored" : "การเรียกคืน",
"No deleted files" : "ไม่มีไฟล์ที่ถูกลบ",
"You will be able to recover deleted files from here" : "คุณจะสามารถกู้คืนไฟล์ที่ถูกลบจากที่นี่",
"No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
"Select all" : "เลือกทั้งหมด",
"Name" : "ชื่อ",
- "Deleted" : "ลบแล้ว",
- "Delete" : "ลบ"
+ "Deleted" : "ลบแล้ว"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/tr.js b/apps/files_trashbin/l10n/tr.js
index c6c73929555..e3f55f29aae 100644
--- a/apps/files_trashbin/l10n/tr.js
+++ b/apps/files_trashbin/l10n/tr.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "%s geri yüklenemedi",
"Deleted files" : "Silinmiş dosyalar",
"Restore" : "Geri yükle",
+ "Delete" : "Sil",
"Delete permanently" : "Kalıcı olarak sil",
"Error" : "Hata",
+ "This operation is forbidden" : "Bu işlem yasak",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü kontrol edin veya yönetici ile iletişime geçin",
"restored" : "geri yüklendi",
"No deleted files" : "Silinen dosya yok",
"You will be able to recover deleted files from here" : "Silinen dosyalarınızı buradan kurtarabileceksiniz",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Select all" : "Tümünü seç",
"Name" : "İsim",
- "Deleted" : "Silinme",
- "Delete" : "Sil"
+ "Deleted" : "Silinme"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_trashbin/l10n/tr.json b/apps/files_trashbin/l10n/tr.json
index 64f14af6674..d0f21497b5a 100644
--- a/apps/files_trashbin/l10n/tr.json
+++ b/apps/files_trashbin/l10n/tr.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "%s geri yüklenemedi",
"Deleted files" : "Silinmiş dosyalar",
"Restore" : "Geri yükle",
+ "Delete" : "Sil",
"Delete permanently" : "Kalıcı olarak sil",
"Error" : "Hata",
+ "This operation is forbidden" : "Bu işlem yasak",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü kontrol edin veya yönetici ile iletişime geçin",
"restored" : "geri yüklendi",
"No deleted files" : "Silinen dosya yok",
"You will be able to recover deleted files from here" : "Silinen dosyalarınızı buradan kurtarabileceksiniz",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Select all" : "Tümünü seç",
"Name" : "İsim",
- "Deleted" : "Silinme",
- "Delete" : "Sil"
+ "Deleted" : "Silinme"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ug.js b/apps/files_trashbin/l10n/ug.js
index 329a04416c2..244c0d92c17 100644
--- a/apps/files_trashbin/l10n/ug.js
+++ b/apps/files_trashbin/l10n/ug.js
@@ -2,10 +2,10 @@ OC.L10N.register(
"files_trashbin",
{
"Deleted files" : "ئۆچۈرۈلگەن ھۆججەتلەر",
+ "Delete" : "ئۆچۈر",
"Delete permanently" : "مەڭگۈلۈك ئۆچۈر",
"Error" : "خاتالىق",
"Name" : "ئاتى",
- "Deleted" : "ئۆچۈرۈلدى",
- "Delete" : "ئۆچۈر"
+ "Deleted" : "ئۆچۈرۈلدى"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/ug.json b/apps/files_trashbin/l10n/ug.json
index 60a915b2ee5..3c11d802b5f 100644
--- a/apps/files_trashbin/l10n/ug.json
+++ b/apps/files_trashbin/l10n/ug.json
@@ -1,9 +1,9 @@
{ "translations": {
"Deleted files" : "ئۆچۈرۈلگەن ھۆججەتلەر",
+ "Delete" : "ئۆچۈر",
"Delete permanently" : "مەڭگۈلۈك ئۆچۈر",
"Error" : "خاتالىق",
"Name" : "ئاتى",
- "Deleted" : "ئۆچۈرۈلدى",
- "Delete" : "ئۆچۈر"
+ "Deleted" : "ئۆچۈرۈلدى"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/uk.js b/apps/files_trashbin/l10n/uk.js
index 656a6f7b50b..eb3aca343d7 100644
--- a/apps/files_trashbin/l10n/uk.js
+++ b/apps/files_trashbin/l10n/uk.js
@@ -5,15 +5,16 @@ OC.L10N.register(
"Couldn't restore %s" : "Неможливо відновити %s",
"Deleted files" : "Видалені файли",
"Restore" : "Відновити",
+ "Delete" : "Видалити",
"Delete permanently" : "Видалити назавжди",
"Error" : "Помилка",
+ "This operation is forbidden" : "Ця операція заборонена",
"restored" : "відновлено",
"No deleted files" : "Немає видалених файлів",
"You will be able to recover deleted files from here" : "Ви зможете відновлювати видалені файли звідси",
"No entries found in this folder" : "Записів не знайдено в цій папці",
"Select all" : "Вибрати всі",
"Name" : "Ім'я",
- "Deleted" : "Видалено",
- "Delete" : "Видалити"
+ "Deleted" : "Видалено"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_trashbin/l10n/uk.json b/apps/files_trashbin/l10n/uk.json
index bfd6860252e..47c17cd1d65 100644
--- a/apps/files_trashbin/l10n/uk.json
+++ b/apps/files_trashbin/l10n/uk.json
@@ -3,15 +3,16 @@
"Couldn't restore %s" : "Неможливо відновити %s",
"Deleted files" : "Видалені файли",
"Restore" : "Відновити",
+ "Delete" : "Видалити",
"Delete permanently" : "Видалити назавжди",
"Error" : "Помилка",
+ "This operation is forbidden" : "Ця операція заборонена",
"restored" : "відновлено",
"No deleted files" : "Немає видалених файлів",
"You will be able to recover deleted files from here" : "Ви зможете відновлювати видалені файли звідси",
"No entries found in this folder" : "Записів не знайдено в цій папці",
"Select all" : "Вибрати всі",
"Name" : "Ім'я",
- "Deleted" : "Видалено",
- "Delete" : "Видалити"
+ "Deleted" : "Видалено"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/ur_PK.js b/apps/files_trashbin/l10n/ur_PK.js
index 2dbe75b304e..eaa9dca8e34 100644
--- a/apps/files_trashbin/l10n/ur_PK.js
+++ b/apps/files_trashbin/l10n/ur_PK.js
@@ -5,10 +5,10 @@ OC.L10N.register(
"Couldn't restore %s" : "بحال نہيں کيا جا سکتا %s",
"Deleted files" : "حذف شدہ فائليں",
"Restore" : "بحال",
+ "Delete" : "حذف کریں",
"Error" : "ایرر",
"restored" : "بحال شدہ",
"Name" : "اسم",
- "Deleted" : "حذف شدہ ",
- "Delete" : "حذف کریں"
+ "Deleted" : "حذف شدہ "
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/ur_PK.json b/apps/files_trashbin/l10n/ur_PK.json
index d7ec3662998..fd88573d62a 100644
--- a/apps/files_trashbin/l10n/ur_PK.json
+++ b/apps/files_trashbin/l10n/ur_PK.json
@@ -3,10 +3,10 @@
"Couldn't restore %s" : "بحال نہيں کيا جا سکتا %s",
"Deleted files" : "حذف شدہ فائليں",
"Restore" : "بحال",
+ "Delete" : "حذف کریں",
"Error" : "ایرر",
"restored" : "بحال شدہ",
"Name" : "اسم",
- "Deleted" : "حذف شدہ ",
- "Delete" : "حذف کریں"
+ "Deleted" : "حذف شدہ "
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/vi.js b/apps/files_trashbin/l10n/vi.js
index c0ff36d90c3..660c8cf321b 100644
--- a/apps/files_trashbin/l10n/vi.js
+++ b/apps/files_trashbin/l10n/vi.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Không thể khôi phục %s",
"Deleted files" : "File đã bị xóa",
"Restore" : "Khôi phục",
+ "Delete" : "Xóa",
"Delete permanently" : "Xóa vĩnh vễn",
"Error" : "Lỗi",
"restored" : "khôi phục",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Chưa có mục nào trong thư mục",
"Select all" : "Chọn tất cả",
"Name" : "Tên",
- "Deleted" : "Đã xóa",
- "Delete" : "Xóa"
+ "Deleted" : "Đã xóa"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/vi.json b/apps/files_trashbin/l10n/vi.json
index a8b2c4a055e..ed25e642538 100644
--- a/apps/files_trashbin/l10n/vi.json
+++ b/apps/files_trashbin/l10n/vi.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Không thể khôi phục %s",
"Deleted files" : "File đã bị xóa",
"Restore" : "Khôi phục",
+ "Delete" : "Xóa",
"Delete permanently" : "Xóa vĩnh vễn",
"Error" : "Lỗi",
"restored" : "khôi phục",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Chưa có mục nào trong thư mục",
"Select all" : "Chọn tất cả",
"Name" : "Tên",
- "Deleted" : "Đã xóa",
- "Delete" : "Xóa"
+ "Deleted" : "Đã xóa"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/zh_CN.js b/apps/files_trashbin/l10n/zh_CN.js
index 0ef17e35d62..be1eeab9348 100644
--- a/apps/files_trashbin/l10n/zh_CN.js
+++ b/apps/files_trashbin/l10n/zh_CN.js
@@ -5,15 +5,17 @@ OC.L10N.register(
"Couldn't restore %s" : "无法恢复%s",
"Deleted files" : "已删除文件",
"Restore" : "恢复",
+ "Delete" : "删除",
"Delete permanently" : "永久删除",
"Error" : "错误",
+ "This operation is forbidden" : "操作被禁止",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
"restored" : "已恢复",
"No deleted files" : "无已删除文件",
"You will be able to recover deleted files from here" : "你可以在此处恢复已删除的文件",
"No entries found in this folder" : "此文件夹中无项目",
"Select all" : "全部选择",
"Name" : "名称",
- "Deleted" : "已删除",
- "Delete" : "删除"
+ "Deleted" : "已删除"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/zh_CN.json b/apps/files_trashbin/l10n/zh_CN.json
index 0349f643555..5d458254b87 100644
--- a/apps/files_trashbin/l10n/zh_CN.json
+++ b/apps/files_trashbin/l10n/zh_CN.json
@@ -3,15 +3,17 @@
"Couldn't restore %s" : "无法恢复%s",
"Deleted files" : "已删除文件",
"Restore" : "恢复",
+ "Delete" : "删除",
"Delete permanently" : "永久删除",
"Error" : "错误",
+ "This operation is forbidden" : "操作被禁止",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
"restored" : "已恢复",
"No deleted files" : "无已删除文件",
"You will be able to recover deleted files from here" : "你可以在此处恢复已删除的文件",
"No entries found in this folder" : "此文件夹中无项目",
"Select all" : "全部选择",
"Name" : "名称",
- "Deleted" : "已删除",
- "Delete" : "删除"
+ "Deleted" : "已删除"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/zh_HK.js b/apps/files_trashbin/l10n/zh_HK.js
index 78811bbdd2c..8c3f5bda38a 100644
--- a/apps/files_trashbin/l10n/zh_HK.js
+++ b/apps/files_trashbin/l10n/zh_HK.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"files_trashbin",
{
+ "Delete" : "刪除",
"Error" : "錯誤",
- "Name" : "名稱",
- "Delete" : "刪除"
+ "Name" : "名稱"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/zh_HK.json b/apps/files_trashbin/l10n/zh_HK.json
index eaa123c49f4..559081426a0 100644
--- a/apps/files_trashbin/l10n/zh_HK.json
+++ b/apps/files_trashbin/l10n/zh_HK.json
@@ -1,6 +1,6 @@
{ "translations": {
+ "Delete" : "刪除",
"Error" : "錯誤",
- "Name" : "名稱",
- "Delete" : "刪除"
+ "Name" : "名稱"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/zh_TW.js b/apps/files_trashbin/l10n/zh_TW.js
index e0ad6dbd723..76273723073 100644
--- a/apps/files_trashbin/l10n/zh_TW.js
+++ b/apps/files_trashbin/l10n/zh_TW.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete" : "刪除",
"Delete permanently" : "永久刪除",
"Error" : "錯誤",
+ "This operation is forbidden" : "此動作被禁止",
+ "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
"restored" : "已還原",
"No deleted files" : "沒有已刪除的檔案",
"You will be able to recover deleted files from here" : "您可以從這裡還原已刪除的檔案",
diff --git a/apps/files_trashbin/l10n/zh_TW.json b/apps/files_trashbin/l10n/zh_TW.json
index 6a313220b58..18a8bb872f8 100644
--- a/apps/files_trashbin/l10n/zh_TW.json
+++ b/apps/files_trashbin/l10n/zh_TW.json
@@ -6,6 +6,8 @@
"Delete" : "刪除",
"Delete permanently" : "永久刪除",
"Error" : "錯誤",
+ "This operation is forbidden" : "此動作被禁止",
+ "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
"restored" : "已還原",
"No deleted files" : "沒有已刪除的檔案",
"You will be able to recover deleted files from here" : "您可以從這裡還原已刪除的檔案",
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index 8f0fe745a45..d492810b95f 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -186,7 +186,6 @@ class Trashbin {
// get the user for which the filesystem is setup
$root = Filesystem::getRoot();
list(, $user) = explode('/', $root);
- $size = 0;
list($owner, $ownerPath) = self::getUidAndFilename($file_path);
$ownerView = new \OC\Files\View('/' . $owner);
@@ -207,8 +206,6 @@ class Trashbin {
$location = $path_parts['dirname'];
$timestamp = time();
- $userTrashSize = self::getTrashbinSize($user);
-
// disable proxy to prevent recursive calls
$trashPath = '/files_trashbin/files/' . $filename . '.d' . $timestamp;
@@ -235,10 +232,9 @@ class Trashbin {
return false;
}
- $ownerView->getUpdater()->rename('/files/' . $ownerPath, $trashPath);
+ $trashStorage->getUpdater()->renameFromStorage($sourceStorage, $sourceInternalPath, $trashInternalPath);
if ($sizeOfAddedFiles !== false) {
- $size = $sizeOfAddedFiles;
$query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)");
$result = $query->execute(array($filename, $timestamp, $location, $owner));
if (!$result) {
@@ -247,7 +243,7 @@ class Trashbin {
\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)));
- $size += self::retainVersions($filename, $owner, $ownerPath, $timestamp);
+ self::retainVersions($filename, $owner, $ownerPath, $timestamp);
// if owner !== user we need to also add a copy to the owners trash
if ($user !== $owner) {
@@ -255,14 +251,11 @@ class Trashbin {
}
}
- $userTrashSize += $size;
- self::scheduleExpire($userTrashSize, $user);
+ self::scheduleExpire($user);
// if owner !== user we also need to update the owners trash size
if ($owner !== $user) {
- $ownerTrashSize = self::getTrashbinSize($owner);
- $ownerTrashSize += $size;
- self::scheduleExpire($ownerTrashSize, $owner);
+ self::scheduleExpire($owner);
}
return ($sizeOfAddedFiles === false) ? false : true;
@@ -323,7 +316,7 @@ class Trashbin {
$result = $targetStorage->moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
if ($result) {
- $view->getUpdater()->rename($source, $target);
+ $targetStorage->getUpdater()->renameFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
}
return $result;
}
@@ -345,7 +338,7 @@ class Trashbin {
$result = $targetStorage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
if ($result) {
- $view->getUpdater()->update($target);
+ $targetStorage->getUpdater()->update($targetInternalPath);
}
return $result;
}
@@ -628,17 +621,17 @@ class Trashbin {
$freeSpace = self::calculateFreeSpace($size, $user);
if ($freeSpace < 0) {
- self::scheduleExpire($size, $user);
+ self::scheduleExpire($user);
}
}
/**
* clean up the trash bin
*
- * @param int $trashBinSize current size of the trash bin
* @param string $user
*/
- public static function expire($trashBinSize, $user) {
+ public static function expire($user) {
+ $trashBinSize = self::getTrashbinSize($user);
$availableSpace = self::calculateFreeSpace($trashBinSize, $user);
$size = 0;
@@ -654,15 +647,15 @@ class Trashbin {
$size += self::deleteFiles(array_slice($dirContent, $count), $user, $availableSpace);
}
- /**@param int $trashBinSize current size of the trash bin
+ /**
* @param string $user
*/
- private static function scheduleExpire($trashBinSize, $user) {
+ private static function scheduleExpire($user) {
// let the admin disable auto expire
$application = new Application();
$expiration = $application->getContainer()->query('Expiration');
if ($expiration->isEnabled()) {
- \OC::$server->getCommandBus()->push(new Expire($user, $trashBinSize));
+ \OC::$server->getCommandBus()->push(new Expire($user));
}
}
diff --git a/apps/files_trashbin/tests/command/cleanuptest.php b/apps/files_trashbin/tests/command/cleanuptest.php
index e928f55eb8b..82084a2d525 100644
--- a/apps/files_trashbin/tests/command/cleanuptest.php
+++ b/apps/files_trashbin/tests/command/cleanuptest.php
@@ -29,6 +29,13 @@ use Test\TestCase;
use OC\User\Manager;
use OCP\Files\IRootFolder;
+/**
+ * Class CleanUpTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Trashbin\Tests\Command
+ */
class CleanUpTest extends TestCase {
/** @var CleanUp */
diff --git a/apps/files_trashbin/tests/command/expiretest.php b/apps/files_trashbin/tests/command/expiretest.php
index a6a8a6d53a8..463fca6080e 100644
--- a/apps/files_trashbin/tests/command/expiretest.php
+++ b/apps/files_trashbin/tests/command/expiretest.php
@@ -24,9 +24,16 @@ namespace OCA\Files_Trashbin\Tests\Command;
use OCA\Files_Trashbin\Command\Expire;
use Test\TestCase;
+/**
+ * Class ExpireTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Trashbin\Tests\Command
+ */
class ExpireTest extends TestCase {
public function testExpireNonExistingUser() {
- $command = new Expire('test', 0);
+ $command = new Expire('test');
$command->handle();
$this->assertTrue(true);
diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php
index 44b680f265c..3ebbbc3ec9d 100644
--- a/apps/files_trashbin/tests/storage.php
+++ b/apps/files_trashbin/tests/storage.php
@@ -27,6 +27,13 @@ namespace OCA\Files_trashbin\Tests\Storage;
use OC\Files\Storage\Temporary;
use OC\Files\Filesystem;
+/**
+ * Class Storage
+ *
+ * @group DB
+ *
+ * @package OCA\Files_trashbin\Tests\Storage
+ */
class Storage extends \Test\TestCase {
/**
* @var string
diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php
index e28b854ca1f..c53ed8d8a9b 100644
--- a/apps/files_trashbin/tests/trashbin.php
+++ b/apps/files_trashbin/tests/trashbin.php
@@ -29,6 +29,8 @@ use OCA\Files_Trashbin;
/**
* Class Test_Encryption
+ *
+ * @group DB
*/
class Test_Trashbin extends \Test\TestCase {
@@ -65,14 +67,14 @@ class Test_Trashbin extends \Test\TestCase {
\OC::registerShareHooks();
$application = new \OCA\Files_Sharing\AppInfo\Application();
$application->registerMountProviders();
- $application->setupPropagation();
//disable encryption
\OC_App::disable('encryption');
+ $config = \OC::$server->getConfig();
//configure trashbin
- self::$rememberRetentionObligation = \OC_Config::getValue('trashbin_retention_obligation', Files_Trashbin\Expiration::DEFAULT_RETENTION_OBLIGATION);
- \OC_Config::setValue('trashbin_retention_obligation', 'auto, 2');
+ self::$rememberRetentionObligation = $config->getSystemValue('trashbin_retention_obligation', Files_Trashbin\Expiration::DEFAULT_RETENTION_OBLIGATION);
+ $config->setSystemValue('trashbin_retention_obligation', 'auto, 2');
// register hooks
Files_Trashbin\Trashbin::registerHooks();
@@ -88,7 +90,7 @@ class Test_Trashbin extends \Test\TestCase {
// cleanup test user
\OC_User::deleteUser(self::TEST_TRASHBIN_USER1);
- \OC_Config::setValue('trashbin_retention_obligation', self::$rememberRetentionObligation);
+ \OC::$server->getConfig()->setSystemValue('trashbin_retention_obligation', self::$rememberRetentionObligation);
\OC_Hook::clear();
diff --git a/apps/files_versions/l10n/hy.js b/apps/files_versions/l10n/hy.js
index 3924810e149..d48487a9a84 100644
--- a/apps/files_versions/l10n/hy.js
+++ b/apps/files_versions/l10n/hy.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_versions",
{
"Versions" : "Տարբերակներ",
- "Restore" : "Վերականգնել"
+ "Restore" : "Վերականգնել",
+ "No other versions available" : "Այլ տարբերակներ չկան"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_versions/l10n/hy.json b/apps/files_versions/l10n/hy.json
index 7f61c267c7c..579b9240310 100644
--- a/apps/files_versions/l10n/hy.json
+++ b/apps/files_versions/l10n/hy.json
@@ -1,5 +1,6 @@
{ "translations": {
"Versions" : "Տարբերակներ",
- "Restore" : "Վերականգնել"
+ "Restore" : "Վերականգնել",
+ "No other versions available" : "Այլ տարբերակներ չկան"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_versions/tests/command/cleanuptest.php b/apps/files_versions/tests/command/cleanuptest.php
index bfde25d75ce..141213774c0 100644
--- a/apps/files_versions/tests/command/cleanuptest.php
+++ b/apps/files_versions/tests/command/cleanuptest.php
@@ -28,6 +28,13 @@ use Test\TestCase;
use OC\User\Manager;
use OCP\Files\IRootFolder;
+/**
+ * Class CleanupTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Versions\Tests\Command
+ */
class CleanupTest extends TestCase {
/** @var CleanUp */
diff --git a/apps/files_versions/tests/command/expiretest.php b/apps/files_versions/tests/command/expiretest.php
index eccc1f4c2ad..5048ab1ef31 100644
--- a/apps/files_versions/tests/command/expiretest.php
+++ b/apps/files_versions/tests/command/expiretest.php
@@ -25,6 +25,13 @@ namespace OCA\Files_Versions\Tests\Command;
use OCA\Files_Versions\Command\Expire;
use Test\TestCase;
+/**
+ * Class ExpireTest
+ *
+ * @group DB
+ *
+ * @package OCA\Files_Versions\Tests\Command
+ */
class ExpireTest extends TestCase {
public function testExpireNonExistingUser() {
$command = new Expire($this->getUniqueID('test'), '');
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index b9bc0932a84..ffc98c2e98c 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -34,6 +34,8 @@ use OC\Files\Storage\Temporary;
/**
* Class Test_Files_versions
* this class provide basic files versions test
+ *
+ * @group DB
*/
class Test_Files_Versioning extends \Test\TestCase {
@@ -51,7 +53,6 @@ class Test_Files_Versioning extends \Test\TestCase {
$application = new \OCA\Files_Sharing\AppInfo\Application();
$application->registerMountProviders();
- $application->setupPropagation();
// create test user
self::loginHelper(self::TEST_VERSIONS_USER2, true);
diff --git a/apps/provisioning_api/appinfo/routes.php b/apps/provisioning_api/appinfo/routes.php
index dcf18e0e53b..22a923f5c20 100644
--- a/apps/provisioning_api/appinfo/routes.php
+++ b/apps/provisioning_api/appinfo/routes.php
@@ -37,7 +37,7 @@ $users = new \OCA\Provisioning_API\Users(
\OC::$server->getLogger()
);
API::register('get', '/cloud/users', [$users, 'getUsers'], 'provisioning_api', API::SUBADMIN_AUTH);
-API::register('post', '/cloud/users', [$users, 'addUser'], 'provisioning_api', API::ADMIN_AUTH);
+API::register('post', '/cloud/users', [$users, 'addUser'], 'provisioning_api', API::SUBADMIN_AUTH);
API::register('get', '/cloud/users/{userid}', [$users, 'getUser'], 'provisioning_api', API::USER_AUTH);
API::register('put', '/cloud/users/{userid}', [$users, 'editUser'], 'provisioning_api', API::USER_AUTH);
API::register('delete', '/cloud/users/{userid}', [$users, 'deleteUser'], 'provisioning_api', API::SUBADMIN_AUTH);
@@ -51,7 +51,8 @@ API::register('get', '/cloud/users/{userid}/subadmins', [$users, 'getUserSubAdmi
// Groups
$groups = new \OCA\Provisioning_API\Groups(
\OC::$server->getGroupManager(),
- \OC::$server->getUserSession()
+ \OC::$server->getUserSession(),
+ \OC::$server->getRequest()
);
API::register('get', '/cloud/groups', [$groups, 'getGroups'], 'provisioning_api', API::SUBADMIN_AUTH);
API::register('post', '/cloud/groups', [$groups, 'addGroup'], 'provisioning_api', API::SUBADMIN_AUTH);
diff --git a/apps/provisioning_api/lib/groups.php b/apps/provisioning_api/lib/groups.php
index c28db35972f..7a6e6150782 100644
--- a/apps/provisioning_api/lib/groups.php
+++ b/apps/provisioning_api/lib/groups.php
@@ -37,14 +37,20 @@ class Groups{
/** @var \OCP\IUserSession */
private $userSession;
+ /** @var \OCP\IRequest */
+ private $request;
+
/**
* @param \OCP\IGroupManager $groupManager
* @param \OCP\IUserSession $userSession
+ * @param \OCP\IRequest $request
*/
public function __construct(\OCP\IGroupManager $groupManager,
- \OCP\IUserSession $userSession) {
+ \OCP\IUserSession $userSession,
+ \OCP\IRequest $request) {
$this->groupManager = $groupManager;
$this->userSession = $userSession;
+ $this->request = $request;
}
/**
@@ -54,9 +60,16 @@ class Groups{
* @return OC_OCS_Result
*/
public function getGroups($parameters) {
- $search = !empty($_GET['search']) ? $_GET['search'] : '';
- $limit = !empty($_GET['limit']) ? $_GET['limit'] : null;
- $offset = !empty($_GET['offset']) ? $_GET['offset'] : null;
+ $search = $this->request->getParam('search', '');
+ $limit = $this->request->getParam('limit');
+ $offset = $this->request->getParam('offset');
+
+ if ($limit !== null) {
+ $limit = (int)$limit;
+ }
+ if ($offset !== null) {
+ $offset = (int)$offset;
+ }
$groups = $this->groupManager->search($search, $limit, $offset);
$groups = array_map(function($group) {
@@ -80,21 +93,23 @@ class Groups{
return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
}
+ $groupId = $parameters['groupid'];
+
// Check the group exists
- if(!$this->groupManager->groupExists($parameters['groupid'])) {
+ if(!$this->groupManager->groupExists($groupId)) {
return new OC_OCS_Result(null, \OCP\API::RESPOND_NOT_FOUND, 'The requested group could not be found');
}
$isSubadminOfGroup = false;
- $targetGroupObject =$this->groupManager->get($parameters['groupid']);
- if($targetGroupObject !== null) {
- $isSubadminOfGroup =$this->groupManager->getSubAdmin()->isSubAdminofGroup($user, $targetGroupObject);
+ $group = $this->groupManager->get($groupId);
+ if ($group !== null) {
+ $isSubadminOfGroup =$this->groupManager->getSubAdmin()->isSubAdminofGroup($user, $group);
}
// Check subadmin has access to this group
if($this->groupManager->isAdmin($user->getUID())
|| $isSubadminOfGroup) {
- $users = $this->groupManager->get($parameters['groupid'])->getUsers();
+ $users = $this->groupManager->get($groupId)->getUsers();
$users = array_map(function($user) {
/** @var IUser $user */
return $user->getUID();
@@ -114,7 +129,7 @@ class Groups{
*/
public function addGroup($parameters) {
// Validate name
- $groupId = isset($_POST['groupid']) ? $_POST['groupid'] : '';
+ $groupId = $this->request->getParam('groupid', '');
if( preg_match( '/[^a-zA-Z0-9 _\.@\-]/', $groupId ) || empty($groupId)){
\OCP\Util::writeLog('provisioning_api', 'Attempt made to create group using invalid characters.', \OCP\Util::ERROR);
return new OC_OCS_Result(null, 101, 'Invalid group name');
@@ -161,14 +176,8 @@ class Groups{
foreach ($subadmins as $user) {
$uids[] = $user->getUID();
}
- $subadmins = $uids;
- // Go
- if(!$subadmins) {
- return new OC_OCS_Result(null, 102, 'Unknown error occured');
- } else {
- return new OC_OCS_Result($subadmins);
- }
+ return new OC_OCS_Result($uids);
}
}
diff --git a/apps/provisioning_api/lib/users.php b/apps/provisioning_api/lib/users.php
index 304fe901cfd..ad067b03cfd 100644
--- a/apps/provisioning_api/lib/users.php
+++ b/apps/provisioning_api/lib/users.php
@@ -117,19 +117,50 @@ class Users {
public function addUser() {
$userId = isset($_POST['userid']) ? $_POST['userid'] : null;
$password = isset($_POST['password']) ? $_POST['password'] : null;
+ $groups = isset($_POST['groups']) ? $_POST['groups'] : null;
+ $user = $this->userSession->getUser();
+ $isAdmin = $this->groupManager->isAdmin($user->getUID());
+ $subAdminManager = $this->groupManager->getSubAdmin();
+
+ if (!$isAdmin && !$subAdminManager->isSubAdmin($user)) {
+ return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ }
+
if($this->userManager->userExists($userId)) {
$this->logger->error('Failed addUser attempt: User already exists.', ['app' => 'ocs_api']);
return new OC_OCS_Result(null, 102, 'User already exists');
+ }
+
+ if(is_array($groups)) {
+ foreach ($groups as $group) {
+ if(!$this->groupManager->groupExists($group)){
+ return new OC_OCS_Result(null, 104, 'group '.$group.' does not exist');
+ }
+ if(!$isAdmin && !$subAdminManager->isSubAdminofGroup($user, $this->groupManager->get($group))) {
+ return new OC_OCS_Result(null, 105, 'insufficient privileges for group '. $group);
+ }
+ }
} else {
- try {
- $this->userManager->createUser($userId, $password);
- $this->logger->info('Successful addUser call with userid: '.$_POST['userid'], ['app' => 'ocs_api']);
- return new OC_OCS_Result(null, 100);
- } catch (\Exception $e) {
- $this->logger->error('Failed addUser attempt with exception: '.$e->getMessage(), ['app' => 'ocs_api']);
- return new OC_OCS_Result(null, 101, 'Bad request');
+ if(!$isAdmin) {
+ return new OC_OCS_Result(null, 106, 'no group specified (required for subadmins)');
}
}
+
+ try {
+ $newUser = $this->userManager->createUser($userId, $password);
+ $this->logger->info('Successful addUser call with userid: '.$userId, ['app' => 'ocs_api']);
+
+ if (is_array($groups)) {
+ foreach ($groups as $group) {
+ $this->groupManager->get($group)->addUser($newUser);
+ $this->logger->info('Added userid '.$userId.' to group '.$group, ['app' => 'ocs_api']);
+ }
+ }
+ return new OC_OCS_Result(null, 100);
+ } catch (\Exception $e) {
+ $this->logger->error('Failed addUser attempt with exception: '.$e->getMessage(), ['app' => 'ocs_api']);
+ return new OC_OCS_Result(null, 101, 'Bad request');
+ }
}
/**
@@ -168,7 +199,7 @@ class Users {
// Find the data
$data['quota'] = $this->fillStorageInfo($userId);
- $data['email'] = $this->config->getUserValue($userId, 'settings', 'email');
+ $data['email'] = $targetUserObject->getEMailAddress();
$data['displayname'] = $targetUserObject->getDisplayName();
return new OC_OCS_Result($data);
diff --git a/apps/provisioning_api/tests/appstest.php b/apps/provisioning_api/tests/appstest.php
index 2e1a86025c2..4ccba704a3a 100644
--- a/apps/provisioning_api/tests/appstest.php
+++ b/apps/provisioning_api/tests/appstest.php
@@ -23,15 +23,35 @@
*/
namespace OCA\Provisioning_API\Tests;
+use OCA\Provisioning_API\Apps;
+use OCP\API;
+use OCP\App\IAppManager;
+use OCP\IUserSession;
+/**
+ * Class AppsTest
+ *
+ * @group DB
+ *
+ * @package OCA\Provisioning_API\Tests
+ */
class AppsTest extends TestCase {
-
+
+ /** @var IAppManager */
+ private $appManager;
+
+ /** @var Apps */
+ private $api;
+
+ /** @var IUserSession */
+ private $userSession;
+
public function setup() {
parent::setup();
$this->appManager = \OC::$server->getAppManager();
$this->groupManager = \OC::$server->getGroupManager();
$this->userSession = \OC::$server->getUserSession();
- $this->api = new \OCA\Provisioning_API\Apps($this->appManager);
+ $this->api = new Apps($this->appManager);
}
public function testGetAppInfo() {
@@ -46,7 +66,7 @@ class AppsTest extends TestCase {
$result = $this->api->getAppInfo(['appid' => 'not_provisioning_api']);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertFalse($result->succeeded());
- $this->assertEquals(\OCP\API::RESPOND_NOT_FOUND, $result->getStatusCode());
+ $this->assertEquals(API::RESPOND_NOT_FOUND, $result->getStatusCode());
}
diff --git a/apps/provisioning_api/tests/groupstest.php b/apps/provisioning_api/tests/groupstest.php
index f67ed1c36ae..d37f4412e20 100644
--- a/apps/provisioning_api/tests/groupstest.php
+++ b/apps/provisioning_api/tests/groupstest.php
@@ -25,79 +25,131 @@
namespace OCA\Provisioning_API\Tests;
-use OCP\IUserManager;
use OCP\IGroupManager;
use OCP\IUserSession;
+use OCP\IRequest;
-class GroupsTest extends TestCase {
- /** @var IUserManager */
- protected $userManager;
+class GroupsTest extends \Test\TestCase {
/** @var IGroupManager */
protected $groupManager;
/** @var IUserSession */
protected $userSession;
+ /** @var IRequest */
+ protected $request;
+ /** @var \OC\SubAdmin */
+ protected $subAdminManager;
/** @var \OCA\Provisioning_API\Groups */
protected $api;
protected function setup() {
- parent::setup();
+ $this->subAdminManager = $this->getMockBuilder('OC\SubAdmin')->disableOriginalConstructor()->getMock();
- $this->userManager = \OC::$server->getUserManager();
- $this->groupManager = \OC::$server->getGroupManager();
- $this->userSession = \OC::$server->getUserSession();
+ $this->groupManager = $this->getMockBuilder('OC\Group\Manager')->disableOriginalConstructor()->getMock();
+ $this->groupManager
+ ->method('getSubAdmin')
+ ->willReturn($this->subAdminManager);
+
+ $this->userSession = $this->getMock('OCP\IUserSession');
+ $this->request = $this->getMock('OCP\IRequest');
$this->api = new \OCA\Provisioning_API\Groups(
$this->groupManager,
- $this->userSession
+ $this->userSession,
+ $this->request
);
}
- public function testGetGroups() {
- $groups = [];
- $id = $this->getUniqueID();
+ private function createGroup($gid) {
+ $group = $this->getMock('OCP\IGroup');
+ $group
+ ->method('getGID')
+ ->willReturn($gid);
+ return $group;
+ }
- for ($i=0; $i < 10; $i++) {
- $groups[] = $this->groupManager->createGroup($id . '_' . $i);
- }
+ private function createUser($uid) {
+ $user = $this->getMock('OCP\IUser');
+ $user
+ ->method('getUID')
+ ->willReturn($uid);
+ return $user;
+ }
- $_GET = [];
- $result = $this->api->getGroups([]);
- $this->assertInstanceOf('OC_OCS_Result', $result);
- $this->assertTrue($result->succeeded());
- $this->assertCount(count($this->groupManager->search('')), $result->getData()['groups']);
- $this->assertContains('admin', $result->getData()['groups']);
- foreach ($groups as $group) {
- $this->assertContains($group->getGID(), $result->getData()['groups']);
- }
-
- $_GET = [
- 'search' => $id,
- 'limit' => 5,
- 'offset' => 2
+ private function asUser() {
+ $user = $this->createUser('user');
+ $this->userSession
+ ->method('getUser')
+ ->willReturn($user);
+ }
+
+ private function asAdmin() {
+ $user = $this->createUser('admin');
+ $this->userSession
+ ->method('getUser')
+ ->willReturn($user);
+
+ $this->groupManager
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+ }
+
+ private function asSubAdminOfGroup($group) {
+ $user = $this->createUser('subAdmin');
+ $this->userSession
+ ->method('getUser')
+ ->willReturn($user);
+
+ $this->subAdminManager
+ ->method('isSubAdminOfGroup')
+ ->will($this->returnCallback(function($_user, $_group) use ($user, $group) {
+ if ($_user === $user && $_group === $group) {
+ return true;
+ }
+ return false;
+ }));
+ }
+
+ public function dataGetGroups() {
+ return [
+ [null, null, null],
+ ['foo', null, null],
+ [null, 1, null],
+ [null, null, 2],
+ ['foo', 1, 2],
];
+ }
+
+ /**
+ * @dataProvider dataGetGroups
+ */
+ public function testGetGroups($search, $limit, $offset) {
+ $this->request
+ ->expects($this->exactly(3))
+ ->method('getParam')
+ ->will($this->returnValueMap([
+ ['search', '', $search],
+ ['limit', null, $limit],
+ ['offset', null, $offset],
+ ]));
+
+ $groups = [$this->createGroup('group1'), $this->createGroup('group2')];
+
+ $search = $search === null ? '' : $search;
+
+ $this->groupManager
+ ->expects($this->once())
+ ->method('search')
+ ->with($search, $limit, $offset)
+ ->willReturn($groups);
+
$result = $this->api->getGroups([]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
- $this->assertCount(5, $result->getData()['groups']);
- foreach (array_splice($groups, 2, 5) as $group) {
- $this->assertContains($group->getGID(), $result->getData()['groups']);
- }
-
- foreach ($groups as $group) {
- $group->delete();
- }
+ $this->assertEquals(['group1', 'group2'], $result->getData()['groups']);
}
public function testGetGroupAsUser() {
-
- $users = $this->generateUsers(2);
- $this->userSession->setUser($users[0]);
-
- $group = $this->groupManager->createGroup($this->getUniqueID());
- $group->addUser($users[1]);
-
- $result = $this->api->getGroup(array(
- 'groupid' => $group->getGID(),
- ));
+ $result = $this->api->getGroup([]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertFalse($result->succeeded());
@@ -106,80 +158,91 @@ class GroupsTest extends TestCase {
}
public function testGetGroupAsSubadmin() {
-
- $users = $this->generateUsers(2);
- $this->userSession->setUser($users[0]);
-
- $group = $this->groupManager->createGroup($this->getUniqueID());
- $group->addUser($users[0]);
- $group->addUser($users[1]);
-
- $this->groupManager->getSubAdmin()->createSubAdmin($users[0], $group);
+ $group = $this->createGroup('group');
+ $this->asSubAdminOfGroup($group);
+
+ $this->groupManager
+ ->method('get')
+ ->with('group')
+ ->willReturn($group);
+ $this->groupManager
+ ->method('groupExists')
+ ->with('group')
+ ->willReturn(true);
+ $group
+ ->method('getUsers')
+ ->willReturn([
+ $this->createUser('user1'),
+ $this->createUser('user2')
+ ]);
$result = $this->api->getGroup([
- 'groupid' => $group->getGID(),
+ 'groupid' => 'group',
]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
$this->assertEquals(1, sizeof($result->getData()), 'Asserting the result data array only has the "users" key');
$this->assertArrayHasKey('users', $result->getData());
- $resultData = $result->getData();
- $resultData = $resultData['users'];
-
- $users = array_map(function($user) {
- return $user->getUID();
- }, $users);
-
- sort($users);
- sort($resultData);
- $this->assertEquals($users, $resultData);
-
+ $this->assertEquals(['user1', 'user2'], $result->getData()['users']);
}
public function testGetGroupAsIrrelevantSubadmin() {
-
- $users = $this->generateUsers(2);
- $this->userSession->setUser($users[0]);
-
- $group1 = $this->groupManager->createGroup($this->getUniqueID());
- $group2 = $this->groupManager->createGroup($this->getUniqueID());
- $group1->addUser($users[1]);
- $group2->addUser($users[0]);
-
- $this->groupManager->getSubAdmin()->createSubAdmin($users[0], $group2);
+ $group = $this->createGroup('group');
+ $otherGroup = $this->createGroup('otherGroup');
+ $this->asSubAdminOfGroup($otherGroup);
+
+ $this->groupManager
+ ->method('get')
+ ->with('group')
+ ->willReturn($group);
+ $this->groupManager
+ ->method('groupExists')
+ ->with('group')
+ ->willReturn(true);
$result = $this->api->getGroup([
- 'groupid' => $group1->getGID(),
+ 'groupid' => 'group',
]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertFalse($result->succeeded());
$this->assertEquals(\OCP\API::RESPOND_UNAUTHORISED, $result->getStatusCode());
-
}
public function testGetGroupAsAdmin() {
-
- $users = $this->generateUsers(2);
- $this->userSession->setUser($users[0]);
-
- $group = $this->groupManager->createGroup($this->getUniqueID());
-
- $group->addUser($users[1]);
- $this->groupManager->get('admin')->addUser($users[0]);
+ $group = $this->createGroup('group');
+ $this->asAdmin();
+
+ $this->groupManager
+ ->method('get')
+ ->with('group')
+ ->willReturn($group);
+ $this->groupManager
+ ->method('groupExists')
+ ->with('group')
+ ->willReturn(true);
+ $group
+ ->method('getUsers')
+ ->willReturn([
+ $this->createUser('user1'),
+ $this->createUser('user2')
+ ]);
$result = $this->api->getGroup([
- 'groupid' => $group->getGID(),
+ 'groupid' => 'group',
]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
- $this->assertEquals(['users' => [$users[1]->getUID()]], $result->getData());
-
+ $this->assertEquals(1, sizeof($result->getData()), 'Asserting the result data array only has the "users" key');
+ $this->assertArrayHasKey('users', $result->getData());
+ $this->assertEquals(['user1', 'user2'], $result->getData()['users']);
}
public function testGetGroupNonExisting() {
+ $this->asUser();
+
$result = $this->api->getGroup([
'groupid' => $this->getUniqueId()
]);
@@ -190,35 +253,71 @@ class GroupsTest extends TestCase {
$this->assertEquals('The requested group could not be found', $result->getMeta()['message']);
}
+ public function testGetSubAdminsOfGroupsNotExists() {
+ $result = $this->api->getSubAdminsOfGroup([
+ 'groupid' => 'NonExistingGroup',
+ ]);
+
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ $this->assertFalse($result->succeeded());
+ $this->assertEquals(101, $result->getStatusCode());
+ $this->assertEquals('Group does not exist', $result->getMeta()['message']);
+ }
+
public function testGetSubAdminsOfGroup() {
- $user1 = $this->generateUsers();
- $user2 = $this->generateUsers();
- $this->userSession->setUser($user1);
- $this->groupManager->get('admin')->addUser($user1);
- $group1 = $this->groupManager->createGroup($this->getUniqueID());
- $this->groupManager->getSubAdmin()->createSubAdmin($user2, $group1);
+ $group = $this->createGroup('GroupWithSubAdmins');
+ $this->groupManager
+ ->method('get')
+ ->with('GroupWithSubAdmins')
+ ->willReturn($group);
+
+ $this->subAdminManager
+ ->expects($this->once())
+ ->method('getGroupsSubAdmins')
+ ->with($group)
+ ->willReturn([
+ $this->createUser('SubAdmin1'),
+ $this->createUser('SubAdmin2'),
+ ]);
+
$result = $this->api->getSubAdminsOfGroup([
- 'groupid' => $group1->getGID(),
+ 'groupid' => 'GroupWithSubAdmins',
]);
+
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
- $data = $result->getData();
- $this->assertEquals($user2->getUID(), reset($data));
- $group1->delete();
+ $this->assertEquals(['SubAdmin1', 'SubAdmin2'], $result->getData());
+ }
+
+ public function testGetSubAdminsOfGroupEmptyList() {
+ $group = $this->createGroup('GroupWithOutSubAdmins');
+ $this->groupManager
+ ->method('get')
+ ->with('GroupWithOutSubAdmins')
+ ->willReturn($group);
+
+ $this->subAdminManager
+ ->expects($this->once())
+ ->method('getGroupsSubAdmins')
+ ->with($group)
+ ->willReturn([
+ ]);
- $user1 = $this->generateUsers();
- $this->userSession->setUser($user1);
- $this->groupManager->get('admin')->addUser($user1);
$result = $this->api->getSubAdminsOfGroup([
- 'groupid' => $this->getUniqueID(),
+ 'groupid' => 'GroupWithOutSubAdmins',
]);
+
$this->assertInstanceOf('OC_OCS_Result', $result);
- $this->assertFalse($result->succeeded());
- $this->assertEquals(101, $result->getStatusCode());
+ $this->assertTrue($result->succeeded());
+ $this->assertEquals([], $result->getData());
}
public function testAddGroupEmptyGroup() {
- $_POST = [];
+ $this->request
+ ->method('getParam')
+ ->with('groupid')
+ ->willReturn('');
+
$result = $this->api->addGroup([]);
$this->assertInstanceOf('OC_OCS_Result', $result);
@@ -228,40 +327,47 @@ class GroupsTest extends TestCase {
}
public function testAddGroupExistingGroup() {
- $group = $this->groupManager->createGroup($this->getUniqueID());
+ $this->request
+ ->method('getParam')
+ ->with('groupid')
+ ->willReturn('ExistingGroup');
+
+ $this->groupManager
+ ->method('groupExists')
+ ->with('ExistingGroup')
+ ->willReturn(true);
- $_POST = [
- 'groupid' => $group->getGID()
- ];
$result = $this->api->addGroup([]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertFalse($result->succeeded());
$this->assertEquals(102, $result->getStatusCode());
-
- $group->delete();
}
public function testAddGroup() {
- $group = $this->getUniqueId();
+ $this->request
+ ->method('getParam')
+ ->with('groupid')
+ ->willReturn('NewGroup');
- $_POST = [
- 'groupid' => $group
- ];
+ $this->groupManager
+ ->method('groupExists')
+ ->with('NewGroup')
+ ->willReturn(false);
+
+ $this->groupManager
+ ->expects($this->once())
+ ->method('createGroup')
+ ->with('NewGroup');
$result = $this->api->addGroup([]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
- $this->assertTrue($this->groupManager->groupExists($group));
-
- $this->groupManager->get($group)->delete();
}
public function testDeleteGroupNonExisting() {
- $group = $this->getUniqueId();
-
$result = $this->api->deleteGroup([
- 'groupid' => $group
+ 'groupid' => 'NonExistingGroup'
]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertFalse($result->succeeded());
@@ -269,6 +375,11 @@ class GroupsTest extends TestCase {
}
public function testDeleteAdminGroup() {
+ $this->groupManager
+ ->method('groupExists')
+ ->with('admin')
+ ->willReturn('true');
+
$result = $this->api->deleteGroup([
'groupid' => 'admin'
]);
@@ -278,13 +389,25 @@ class GroupsTest extends TestCase {
}
public function testDeleteGroup() {
- $group = $this->groupManager->createGroup($this->getUniqueId());
+ $this->groupManager
+ ->method('groupExists')
+ ->with('ExistingGroup')
+ ->willReturn('true');
+
+ $group = $this->createGroup('ExistingGroup');
+ $this->groupManager
+ ->method('get')
+ ->with('ExistingGroup')
+ ->willReturn($group);
+ $group
+ ->expects($this->once())
+ ->method('delete')
+ ->willReturn(true);
$result = $this->api->deleteGroup([
- 'groupid' => $group->getGID()
+ 'groupid' => 'ExistingGroup',
]);
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
- $this->assertFalse($this->groupManager->groupExists($group->getGID()));
}
}
diff --git a/apps/provisioning_api/tests/testcase.php b/apps/provisioning_api/tests/testcase.php
index 113bc512243..0cbe0d89f86 100644
--- a/apps/provisioning_api/tests/testcase.php
+++ b/apps/provisioning_api/tests/testcase.php
@@ -23,10 +23,13 @@
namespace OCA\Provisioning_API\Tests;
+use OCP\IUser;
use OCP\IUserManager;
use OCP\IGroupManager;
abstract class TestCase extends \Test\TestCase {
+
+ /** @var IUser[] */
protected $users = array();
/** @var IUserManager */
@@ -46,7 +49,7 @@ abstract class TestCase extends \Test\TestCase {
/**
* Generates a temp user
* @param int $num number of users to generate
- * @return IUser[]|Iuser
+ * @return IUser[]|IUser
*/
protected function generateUsers($num = 1) {
$users = array();
diff --git a/apps/provisioning_api/tests/userstest.php b/apps/provisioning_api/tests/userstest.php
index ba4ed8a2e2f..72c76326ac5 100644
--- a/apps/provisioning_api/tests/userstest.php
+++ b/apps/provisioning_api/tests/userstest.php
@@ -27,26 +27,27 @@
namespace OCA\Provisioning_API\Tests;
use OCA\Provisioning_API\Users;
+use OCP\API;
use OCP\IUserManager;
use OCP\IConfig;
-use OCP\IGroupManager;
use OCP\IUserSession;
+use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase as OriginalTest;
use OCP\ILogger;
class UsersTest extends OriginalTest {
- /** @var IUserManager */
+ /** @var IUserManager | PHPUnit_Framework_MockObject_MockObject */
protected $userManager;
- /** @var IConfig */
+ /** @var IConfig | PHPUnit_Framework_MockObject_MockObject */
protected $config;
- /** @var \OC\Group\Manager */
+ /** @var \OC\Group\Manager | PHPUnit_Framework_MockObject_MockObject */
protected $groupManager;
- /** @var IUserSession */
+ /** @var IUserSession | PHPUnit_Framework_MockObject_MockObject */
protected $userSession;
- /** @var ILogger */
+ /** @var ILogger | PHPUnit_Framework_MockObject_MockObject */
protected $logger;
- /** @var Users */
+ /** @var Users | PHPUnit_Framework_MockObject_MockObject */
protected $api;
protected function tearDown() {
@@ -83,7 +84,7 @@ class UsersTest extends OriginalTest {
->method('getUser')
->will($this->returnValue(null));
- $expected = new \OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ $expected = new \OC_OCS_Result(null, API::RESPOND_UNAUTHORISED);
$this->assertEquals($expected, $this->api->getUsers());
}
@@ -203,7 +204,7 @@ class UsersTest extends OriginalTest {
->method('getSubAdmin')
->will($this->returnValue($subAdminManager));
- $expected = new \OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ $expected = new \OC_OCS_Result(null, API::RESPOND_UNAUTHORISED);
$this->assertEquals($expected, $this->api->getUsers());
}
@@ -218,11 +219,95 @@ class UsersTest extends OriginalTest {
->expects($this->once())
->method('error')
->with('Failed addUser attempt: User already exists.', ['app' => 'ocs_api']);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('adminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('adminUser')
+ ->willReturn(true);
$expected = new \OC_OCS_Result(null, 102, 'User already exists');
$this->assertEquals($expected, $this->api->addUser());
}
+ public function testAddUserNonExistingGroup() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['groups'] = ['NonExistingGroup'];
+ $this->userManager
+ ->expects($this->once())
+ ->method('userExists')
+ ->with('NewUser')
+ ->willReturn(false);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('adminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('adminUser')
+ ->willReturn(true);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('groupExists')
+ ->with('NonExistingGroup')
+ ->willReturn(false);
+
+ $expected = new \OC_OCS_Result(null, 104, 'group NonExistingGroup does not exist');
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
+ public function testAddUserExistingGroupNonExistingGroup() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['groups'] = ['ExistingGroup', 'NonExistingGroup'];
+ $this->userManager
+ ->expects($this->once())
+ ->method('userExists')
+ ->with('NewUser')
+ ->willReturn(false);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('adminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('adminUser')
+ ->willReturn(true);
+ $this->groupManager
+ ->expects($this->exactly(2))
+ ->method('groupExists')
+ ->withConsecutive(
+ ['ExistingGroup'],
+ ['NonExistingGroup']
+ )
+ ->will($this->returnValueMap([
+ ['ExistingGroup', true],
+ ['NonExistingGroup', false]
+ ]));
+
+ $expected = new \OC_OCS_Result(null, 104, 'group NonExistingGroup does not exist');
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
public function testAddUserSuccessful() {
$_POST['userid'] = 'NewUser';
$_POST['password'] = 'PasswordOfTheNewUser';
@@ -239,6 +324,76 @@ class UsersTest extends OriginalTest {
->expects($this->once())
->method('info')
->with('Successful addUser call with userid: NewUser', ['app' => 'ocs_api']);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('adminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('adminUser')
+ ->willReturn(true);
+
+ $expected = new \OC_OCS_Result(null, 100);
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
+ public function testAddUserExistingGroup() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['password'] = 'PasswordOfTheNewUser';
+ $_POST['groups'] = ['ExistingGroup'];
+ $this->userManager
+ ->expects($this->once())
+ ->method('userExists')
+ ->with('NewUser')
+ ->willReturn(false);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('adminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('adminUser')
+ ->willReturn(true);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('groupExists')
+ ->with('ExistingGroup')
+ ->willReturn(true);
+ $user = $this->getMock('\OCP\IUser');
+ $this->userManager
+ ->expects($this->once())
+ ->method('createUser')
+ ->with('NewUser', 'PasswordOfTheNewUser')
+ ->willReturn($user);
+ $group = $this->getMock('\OCP\IGroup');
+ $group
+ ->expects($this->once())
+ ->method('addUser')
+ ->with($user);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('ExistingGroup')
+ ->willReturn($group);
+ $this->logger
+ ->expects($this->exactly(2))
+ ->method('info')
+ ->withConsecutive(
+ ['Successful addUser call with userid: NewUser', ['app' => 'ocs_api']],
+ ['Added userid NewUser to group ExistingGroup', ['app' => 'ocs_api']]
+ );
$expected = new \OC_OCS_Result(null, 100);
$this->assertEquals($expected, $this->api->addUser());
@@ -261,18 +416,245 @@ class UsersTest extends OriginalTest {
->expects($this->once())
->method('error')
->with('Failed addUser attempt with exception: User backend not found.', ['app' => 'ocs_api']);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('adminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('adminUser')
+ ->willReturn(true);
$expected = new \OC_OCS_Result(null, 101, 'Bad request');
$this->assertEquals($expected, $this->api->addUser());
}
+ public function testAddUserAsRegularUser() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['password'] = 'PasswordOfTheNewUser';
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('regularUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('regularUser')
+ ->willReturn(false);
+ $subAdminManager = $this->getMockBuilder('\OC\Subadmin')
+ ->disableOriginalConstructor()->getMock();
+ $subAdminManager
+ ->expects($this->once())
+ ->method('isSubAdmin')
+ ->with($loggedInUser)
+ ->willReturn(false);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('getSubAdmin')
+ ->with()
+ ->willReturn($subAdminManager);
+
+ $expected = new \OC_OCS_Result(null, API::RESPOND_UNAUTHORISED);
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
+ public function testAddUserAsSubAdminNoGroup() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['password'] = 'PasswordOfTheNewUser';
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('regularUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('regularUser')
+ ->willReturn(false);
+ $subAdminManager = $this->getMockBuilder('\OC\Subadmin')
+ ->disableOriginalConstructor()->getMock();
+ $subAdminManager
+ ->expects($this->once())
+ ->method('isSubAdmin')
+ ->with($loggedInUser)
+ ->willReturn(true);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('getSubAdmin')
+ ->with()
+ ->willReturn($subAdminManager);
+
+ $expected = new \OC_OCS_Result(null, 106, 'no group specified (required for subadmins)');
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
+ public function testAddUserAsSubAdminValidGroupNotSubAdmin() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['password'] = 'PasswordOfTheNewUser';
+ $_POST['groups'] = ['ExistingGroup'];
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('regularUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('regularUser')
+ ->willReturn(false);
+ $existingGroup = $this->getMock('\OCP\IGroup');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('ExistingGroup')
+ ->willReturn($existingGroup);
+ $subAdminManager = $this->getMockBuilder('\OC\Subadmin')
+ ->disableOriginalConstructor()->getMock();
+ $subAdminManager
+ ->expects($this->once())
+ ->method('isSubAdmin')
+ ->with($loggedInUser)
+ ->willReturn(true);
+ $subAdminManager
+ ->expects($this->once())
+ ->method('isSubAdminOfGroup')
+ ->with($loggedInUser, $existingGroup)
+ ->wilLReturn(false);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('getSubAdmin')
+ ->with()
+ ->willReturn($subAdminManager);
+ $this->groupManager
+ ->expects($this->once())
+ ->method('groupExists')
+ ->with('ExistingGroup')
+ ->willReturn(true);
+
+ $expected = new \OC_OCS_Result(null, 105, 'insufficient privileges for group ExistingGroup');
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
+ public function testAddUserAsSubAdminExistingGroups() {
+ $_POST['userid'] = 'NewUser';
+ $_POST['password'] = 'PasswordOfTheNewUser';
+ $_POST['groups'] = ['ExistingGroup1', 'ExistingGroup2'];
+ $this->userManager
+ ->expects($this->once())
+ ->method('userExists')
+ ->with('NewUser')
+ ->willReturn(false);
+ $loggedInUser = $this->getMock('\OCP\IUser');
+ $loggedInUser
+ ->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('subAdminUser'));
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($loggedInUser));
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('subAdminUser')
+ ->willReturn(false);
+ $this->groupManager
+ ->expects($this->exactly(2))
+ ->method('groupExists')
+ ->withConsecutive(
+ ['ExistingGroup1'],
+ ['ExistingGroup2']
+ )
+ ->willReturn(true);
+ $user = $this->getMock('\OCP\IUser');
+ $this->userManager
+ ->expects($this->once())
+ ->method('createUser')
+ ->with('NewUser', 'PasswordOfTheNewUser')
+ ->willReturn($user);
+ $existingGroup1 = $this->getMock('\OCP\IGroup');
+ $existingGroup2 = $this->getMock('\OCP\IGroup');
+ $existingGroup1
+ ->expects($this->once())
+ ->method('addUser')
+ ->with($user);
+ $existingGroup2
+ ->expects($this->once())
+ ->method('addUser')
+ ->with($user);
+ $this->groupManager
+ ->expects($this->exactly(4))
+ ->method('get')
+ ->withConsecutive(
+ ['ExistingGroup1'],
+ ['ExistingGroup2'],
+ ['ExistingGroup1'],
+ ['ExistingGroup2']
+ )
+ ->will($this->returnValueMap([
+ ['ExistingGroup1', $existingGroup1],
+ ['ExistingGroup2', $existingGroup2]
+ ]));
+ $this->logger
+ ->expects($this->exactly(3))
+ ->method('info')
+ ->withConsecutive(
+ ['Successful addUser call with userid: NewUser', ['app' => 'ocs_api']],
+ ['Added userid NewUser to group ExistingGroup1', ['app' => 'ocs_api']],
+ ['Added userid NewUser to group ExistingGroup2', ['app' => 'ocs_api']]
+ );
+ $subAdminManager = $this->getMockBuilder('\OC\Subadmin')
+ ->disableOriginalConstructor()->getMock();
+ $this->groupManager
+ ->expects($this->once())
+ ->method('getSubAdmin')
+ ->willReturn($subAdminManager);
+ $subAdminManager
+ ->expects($this->once())
+ ->method('isSubAdmin')
+ ->with($loggedInUser)
+ ->willReturn(true);
+ $subAdminManager
+ ->expects($this->exactly(2))
+ ->method('isSubAdminOfGroup')
+ ->withConsecutive(
+ [$loggedInUser, $existingGroup1],
+ [$loggedInUser, $existingGroup2]
+ )
+ ->wilLReturn(true);
+
+
+ $expected = new \OC_OCS_Result(null, 100);
+ $this->assertEquals($expected, $this->api->addUser());
+ }
+
+
public function testGetUserNotLoggedIn() {
$this->userSession
->expects($this->once())
->method('getUser')
->will($this->returnValue(null));
- $expected = new \OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ $expected = new \OC_OCS_Result(null, API::RESPOND_UNAUTHORISED);
$this->assertEquals($expected, $this->api->getUser(['userid' => 'UserToGet']));
}
@@ -288,7 +670,7 @@ class UsersTest extends OriginalTest {
->with('UserToGet')
->will($this->returnValue(null));
- $expected = new \OC_OCS_Result(null, \OCP\API::RESPOND_NOT_FOUND, 'The requested user could not be found');
+ $expected = new \OC_OCS_Result(null, API::RESPOND_NOT_FOUND, 'The requested user could not be found');
$this->assertEquals($expected, $this->api->getUser(['userid' => 'UserToGet']));
}
@@ -299,6 +681,9 @@ class UsersTest extends OriginalTest {
->method('getUID')
->will($this->returnValue('admin'));
$targetUser = $this->getMock('\OCP\IUser');
+ $targetUser->expects($this->once())
+ ->method('getEMailAddress')
+ ->willReturn('demo@owncloud.org');
$this->userSession
->expects($this->once())
->method('getUser')
@@ -323,11 +708,6 @@ class UsersTest extends OriginalTest {
->method('fillStorageInfo')
->with('UserToGet')
->will($this->returnValue(['DummyValue']));
- $this->config
- ->expects($this->at(1))
- ->method('getUserValue')
- ->with('UserToGet', 'settings', 'email')
- ->will($this->returnValue('demo@owncloud.org'));
$targetUser
->expects($this->once())
->method('getDisplayName')
@@ -351,6 +731,10 @@ class UsersTest extends OriginalTest {
->method('getUID')
->will($this->returnValue('subadmin'));
$targetUser = $this->getMock('\OCP\IUser');
+ $targetUser
+ ->expects($this->once())
+ ->method('getEMailAddress')
+ ->willReturn('demo@owncloud.org');
$this->userSession
->expects($this->once())
->method('getUser')
@@ -387,11 +771,6 @@ class UsersTest extends OriginalTest {
->method('fillStorageInfo')
->with('UserToGet')
->will($this->returnValue(['DummyValue']));
- $this->config
- ->expects($this->at(1))
- ->method('getUserValue')
- ->with('UserToGet', 'settings', 'email')
- ->will($this->returnValue('demo@owncloud.org'));
$targetUser
->expects($this->once())
->method('getDisplayName')
@@ -442,7 +821,7 @@ class UsersTest extends OriginalTest {
->method('getSubAdmin')
->will($this->returnValue($subAdminManager));
- $expected = new \OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ $expected = new \OC_OCS_Result(null, API::RESPOND_UNAUTHORISED);
$this->assertEquals($expected, $this->api->getUser(['userid' => 'UserToGet']));
}
@@ -484,15 +863,14 @@ class UsersTest extends OriginalTest {
->method('fillStorageInfo')
->with('subadmin')
->will($this->returnValue(['DummyValue']));
- $this->config
- ->expects($this->once())
- ->method('getUserValue')
- ->with('subadmin', 'settings', 'email')
- ->will($this->returnValue('subadmin@owncloud.org'));
$targetUser
->expects($this->once())
->method('getDisplayName')
->will($this->returnValue('Subadmin User'));
+ $targetUser
+ ->expects($this->once())
+ ->method('getEMailAddress')
+ ->will($this->returnValue('subadmin@owncloud.org'));
$expected = new \OC_OCS_Result([
'quota' => ['DummyValue'],
@@ -508,7 +886,7 @@ class UsersTest extends OriginalTest {
->method('getUser')
->will($this->returnValue(null));
- $expected = new \OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ $expected = new \OC_OCS_Result(null, API::RESPOND_UNAUTHORISED);
$this->assertEquals($expected, $this->api->editUser(['userid' => 'UserToEdit']));
}
diff --git a/apps/user_ldap/js/wizard/wizardTabElementary.js b/apps/user_ldap/js/wizard/wizardTabElementary.js
index f5232e91010..c8cb308952b 100644
--- a/apps/user_ldap/js/wizard/wizardTabElementary.js
+++ b/apps/user_ldap/js/wizard/wizardTabElementary.js
@@ -275,7 +275,7 @@ OCA = OCA || {};
if(objectsFound < 1) {
message = t('user_ldap', 'No object found in the given Base DN. Please revise.');
} else if(objectsFound > 1000) {
- message = t('user_ldap', 'More than 1.000 directory entries available.');
+ message = t('user_ldap', 'More than 1,000 directory entries available.');
} else {
message = t('user_ldap', objectsFound + ' entries available within the provided Base DN');
}
diff --git a/apps/user_ldap/l10n/cs_CZ.js b/apps/user_ldap/l10n/cs_CZ.js
index 77fef537f0a..e78755719b7 100644
--- a/apps/user_ldap/l10n/cs_CZ.js
+++ b/apps/user_ldap/l10n/cs_CZ.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Nelze automaticky detekovat Base DN, zadejte prosím ručně.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "V zadané Base DN nebyl objekt nalezen. Ověřte.",
- "More than 1.000 directory entries available." : "Je dostupných více než 1000 adresářů.",
+ "More than 1,000 directory entries available." : "Je dostupných více než 1000 adresářů.",
" entries available within the provided Base DN" : "záznamů dostupných v zadané Base DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Došlo k chybě. Ověře prosím Base DN společně s nastavením připojení a přihlašovacími údaji.",
"Do you really want to delete the current Server Configuration?" : "Opravdu si přejete smazat současné nastavení serveru?",
diff --git a/apps/user_ldap/l10n/cs_CZ.json b/apps/user_ldap/l10n/cs_CZ.json
index b1ffce2e029..37e56cda1a7 100644
--- a/apps/user_ldap/l10n/cs_CZ.json
+++ b/apps/user_ldap/l10n/cs_CZ.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Nelze automaticky detekovat Base DN, zadejte prosím ručně.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "V zadané Base DN nebyl objekt nalezen. Ověřte.",
- "More than 1.000 directory entries available." : "Je dostupných více než 1000 adresářů.",
+ "More than 1,000 directory entries available." : "Je dostupných více než 1000 adresářů.",
" entries available within the provided Base DN" : "záznamů dostupných v zadané Base DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Došlo k chybě. Ověře prosím Base DN společně s nastavením připojení a přihlašovacími údaji.",
"Do you really want to delete the current Server Configuration?" : "Opravdu si přejete smazat současné nastavení serveru?",
diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js
index 7b9222d3abd..c01d3efa018 100644
--- a/apps/user_ldap/l10n/da.js
+++ b/apps/user_ldap/l10n/da.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Kunne ikke registrere Base DN - angiv den venligst manuelt.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne Base DN. Gennemse venligst.",
- "More than 1.000 directory entries available." : "Mere end 1.000 opslag tilgængelige",
" entries available within the provided Base DN" : "poster tilgængelige inden for det angivne Base DN.",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN, såvel som forbindelsesindstillingerne og brugeroplysningerne.",
"Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?",
diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json
index 5c0c3ad1d0c..db61541ef73 100644
--- a/apps/user_ldap/l10n/da.json
+++ b/apps/user_ldap/l10n/da.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Kunne ikke registrere Base DN - angiv den venligst manuelt.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne Base DN. Gennemse venligst.",
- "More than 1.000 directory entries available." : "Mere end 1.000 opslag tilgængelige",
" entries available within the provided Base DN" : "poster tilgængelige inden for det angivne Base DN.",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN, såvel som forbindelsesindstillingerne og brugeroplysningerne.",
"Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?",
diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js
index 8a944590c6d..107fd24d802 100644
--- a/apps/user_ldap/l10n/de.js
+++ b/apps/user_ldap/l10n/de.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Die Base DN konnte nicht erkannt werden, bitte manuell eingeben.",
"{nthServer}. Server" : "{nthServer}. - Server",
"No object found in the given Base DN. Please revise." : "Keine Objekte in der Base DN gefunden, bitte überprüfen.",
- "More than 1.000 directory entries available." : "Mehr als 1.000 Verzeichniseinträge verfügbar.",
" entries available within the provided Base DN" : "Einträge in der Vorgesehenen Base DN verfügbar",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ein Fehler ist aufgetreten. Bitte prüfe die Base DN und auch die Verbindungs- und Anmeldeeinstellungen.",
"Do you really want to delete the current Server Configuration?" : "Soll die aktuelle Serverkonfiguration wirklich gelöscht werden?",
diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json
index 99fa4b39151..8d30e7d4f2f 100644
--- a/apps/user_ldap/l10n/de.json
+++ b/apps/user_ldap/l10n/de.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Die Base DN konnte nicht erkannt werden, bitte manuell eingeben.",
"{nthServer}. Server" : "{nthServer}. - Server",
"No object found in the given Base DN. Please revise." : "Keine Objekte in der Base DN gefunden, bitte überprüfen.",
- "More than 1.000 directory entries available." : "Mehr als 1.000 Verzeichniseinträge verfügbar.",
" entries available within the provided Base DN" : "Einträge in der Vorgesehenen Base DN verfügbar",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ein Fehler ist aufgetreten. Bitte prüfe die Base DN und auch die Verbindungs- und Anmeldeeinstellungen.",
"Do you really want to delete the current Server Configuration?" : "Soll die aktuelle Serverkonfiguration wirklich gelöscht werden?",
diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js
index 5a8903d574a..b72b41ea293 100644
--- a/apps/user_ldap/l10n/de_DE.js
+++ b/apps/user_ldap/l10n/de_DE.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Die Base DN konnte nicht erkannt werden, bitte geben Sie sie manuell ein.",
"{nthServer}. Server" : "{nthServer}. - Server",
"No object found in the given Base DN. Please revise." : "Keine Objekte in der angegebenen Base DN gefunden, bitte überprüfen.",
- "More than 1.000 directory entries available." : "Mehr als 1.000 Verzeichniseinträge verfügbar.",
+ "More than 1,000 directory entries available." : "Es sind mehr als 1.000 Verzeichniseinträge verfügbar.",
" entries available within the provided Base DN" : "Einträge in der angegebenen Base DN verfügbar",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfen Sie die Base DN wie auch die Verbindungseinstellungen und Anmeldeinformationen.",
"Do you really want to delete the current Server Configuration?" : "Soll die aktuelle Serverkonfiguration wirklich gelöscht werden?",
diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json
index 0485094c345..58ccaa400c9 100644
--- a/apps/user_ldap/l10n/de_DE.json
+++ b/apps/user_ldap/l10n/de_DE.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Die Base DN konnte nicht erkannt werden, bitte geben Sie sie manuell ein.",
"{nthServer}. Server" : "{nthServer}. - Server",
"No object found in the given Base DN. Please revise." : "Keine Objekte in der angegebenen Base DN gefunden, bitte überprüfen.",
- "More than 1.000 directory entries available." : "Mehr als 1.000 Verzeichniseinträge verfügbar.",
+ "More than 1,000 directory entries available." : "Es sind mehr als 1.000 Verzeichniseinträge verfügbar.",
" entries available within the provided Base DN" : "Einträge in der angegebenen Base DN verfügbar",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfen Sie die Base DN wie auch die Verbindungseinstellungen und Anmeldeinformationen.",
"Do you really want to delete the current Server Configuration?" : "Soll die aktuelle Serverkonfiguration wirklich gelöscht werden?",
diff --git a/apps/user_ldap/l10n/el.js b/apps/user_ldap/l10n/el.js
index fc9d96aa61a..7ea629e673d 100644
--- a/apps/user_ldap/l10n/el.js
+++ b/apps/user_ldap/l10n/el.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Αδυναμία ανίχνευσης Base DN, παρακαλώ να το εισάγετε χειροκίνητα.",
"{nthServer}. Server" : "{nthServer}. Διακομιστής",
"No object found in the given Base DN. Please revise." : "Δεν βρέθηκε αντικείμενο στο δηλωθέν Base DN. Παρακαλώ αναθεωρήστε.",
- "More than 1.000 directory entries available." : "Περισσότερες από 1.000 εγγραφές καταλόγων διαθέσιμες.",
+ "More than 1,000 directory entries available." : "Είναι διαθέσιμες περισσότερες από 1.000 εγγραφές καταλόγου.",
" entries available within the provided Base DN" : "διαθέσιμες καταχωρήσεις εντός του δηλωθέντος ",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Παρουσιάστηκε σφάλμα. Παρακαλούμε ελέγξτε το Base DN καθώς και τις ρυθμίσεις και τα διαπιστευτήρια σύνδεσης.",
"Do you really want to delete the current Server Configuration?" : "Θέλετε να διαγράψετε τις τρέχουσες ρυθμίσεις του διακομιστή;",
diff --git a/apps/user_ldap/l10n/el.json b/apps/user_ldap/l10n/el.json
index bd5924586b6..338b0b8bad9 100644
--- a/apps/user_ldap/l10n/el.json
+++ b/apps/user_ldap/l10n/el.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Αδυναμία ανίχνευσης Base DN, παρακαλώ να το εισάγετε χειροκίνητα.",
"{nthServer}. Server" : "{nthServer}. Διακομιστής",
"No object found in the given Base DN. Please revise." : "Δεν βρέθηκε αντικείμενο στο δηλωθέν Base DN. Παρακαλώ αναθεωρήστε.",
- "More than 1.000 directory entries available." : "Περισσότερες από 1.000 εγγραφές καταλόγων διαθέσιμες.",
+ "More than 1,000 directory entries available." : "Είναι διαθέσιμες περισσότερες από 1.000 εγγραφές καταλόγου.",
" entries available within the provided Base DN" : "διαθέσιμες καταχωρήσεις εντός του δηλωθέντος ",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Παρουσιάστηκε σφάλμα. Παρακαλούμε ελέγξτε το Base DN καθώς και τις ρυθμίσεις και τα διαπιστευτήρια σύνδεσης.",
"Do you really want to delete the current Server Configuration?" : "Θέλετε να διαγράψετε τις τρέχουσες ρυθμίσεις του διακομιστή;",
diff --git a/apps/user_ldap/l10n/en_GB.js b/apps/user_ldap/l10n/en_GB.js
index 976e8a7e062..3d3acff70bd 100644
--- a/apps/user_ldap/l10n/en_GB.js
+++ b/apps/user_ldap/l10n/en_GB.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Could not detect Base DN, please enter it manually.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "No object found in the given Base DN. Please revise.",
- "More than 1.000 directory entries available." : "More than 1,000 directory entries available.",
" entries available within the provided Base DN" : " entries available within the provided Base DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.",
"Do you really want to delete the current Server Configuration?" : "Do you really want to delete the current Server Configuration?",
diff --git a/apps/user_ldap/l10n/en_GB.json b/apps/user_ldap/l10n/en_GB.json
index 8e0212f35ca..606ca9b7922 100644
--- a/apps/user_ldap/l10n/en_GB.json
+++ b/apps/user_ldap/l10n/en_GB.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Could not detect Base DN, please enter it manually.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "No object found in the given Base DN. Please revise.",
- "More than 1.000 directory entries available." : "More than 1,000 directory entries available.",
" entries available within the provided Base DN" : " entries available within the provided Base DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.",
"Do you really want to delete the current Server Configuration?" : "Do you really want to delete the current Server Configuration?",
diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js
index 5171628428d..e457978bcd7 100644
--- a/apps/user_ldap/l10n/es.js
+++ b/apps/user_ldap/l10n/es.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "No se pudo detectar Base DN, por favor ingrésela manualmente.",
"{nthServer}. Server" : "{nthServer}. servidor",
"No object found in the given Base DN. Please revise." : "No se encuentra ningún objeto en la Base DN dada. Por favor revisar.",
- "More than 1.000 directory entries available." : "Más de 1.000 directorios disponibles.",
+ "More than 1,000 directory entries available." : "Más de 1.000 entradas de directorios disponibles.",
" entries available within the provided Base DN" : "entradas disponibles dentro de la BaseDN provista",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Un error ocurrió. Por favor revise la Base DN, también como la configuración de la conexión y credenciales.",
"Do you really want to delete the current Server Configuration?" : "¿Realmente desea eliminar la configuración actual del servidor?",
diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json
index 8a896a9bda2..ebce66270f1 100644
--- a/apps/user_ldap/l10n/es.json
+++ b/apps/user_ldap/l10n/es.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "No se pudo detectar Base DN, por favor ingrésela manualmente.",
"{nthServer}. Server" : "{nthServer}. servidor",
"No object found in the given Base DN. Please revise." : "No se encuentra ningún objeto en la Base DN dada. Por favor revisar.",
- "More than 1.000 directory entries available." : "Más de 1.000 directorios disponibles.",
+ "More than 1,000 directory entries available." : "Más de 1.000 entradas de directorios disponibles.",
" entries available within the provided Base DN" : "entradas disponibles dentro de la BaseDN provista",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Un error ocurrió. Por favor revise la Base DN, también como la configuración de la conexión y credenciales.",
"Do you really want to delete the current Server Configuration?" : "¿Realmente desea eliminar la configuración actual del servidor?",
diff --git a/apps/user_ldap/l10n/et_EE.js b/apps/user_ldap/l10n/et_EE.js
index 1fc38d62d9d..aa0727c9bc1 100644
--- a/apps/user_ldap/l10n/et_EE.js
+++ b/apps/user_ldap/l10n/et_EE.js
@@ -19,7 +19,6 @@ OC.L10N.register(
"Select object classes" : "Vali objekti klassid",
"Please check the credentials, they seem to be wrong." : "Palu nkontrolli kasutajaandmeid, need näivad olevat valed.",
"{nthServer}. Server" : "{nthServer}. Server",
- "More than 1.000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogi sissekannet.",
"Do you really want to delete the current Server Configuration?" : "Oled kindel, et tahad kustutada praegust serveri seadistust?",
"Confirm Deletion" : "Kinnita kustutamine",
"Mode switch" : "Režiimi lüliti",
diff --git a/apps/user_ldap/l10n/et_EE.json b/apps/user_ldap/l10n/et_EE.json
index 46c7de96524..5d8fbe2f81b 100644
--- a/apps/user_ldap/l10n/et_EE.json
+++ b/apps/user_ldap/l10n/et_EE.json
@@ -17,7 +17,6 @@
"Select object classes" : "Vali objekti klassid",
"Please check the credentials, they seem to be wrong." : "Palu nkontrolli kasutajaandmeid, need näivad olevat valed.",
"{nthServer}. Server" : "{nthServer}. Server",
- "More than 1.000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogi sissekannet.",
"Do you really want to delete the current Server Configuration?" : "Oled kindel, et tahad kustutada praegust serveri seadistust?",
"Confirm Deletion" : "Kinnita kustutamine",
"Mode switch" : "Režiimi lüliti",
diff --git a/apps/user_ldap/l10n/fi_FI.js b/apps/user_ldap/l10n/fi_FI.js
index 5091cb1d88e..96ed6a00c7d 100644
--- a/apps/user_ldap/l10n/fi_FI.js
+++ b/apps/user_ldap/l10n/fi_FI.js
@@ -22,6 +22,8 @@ OC.L10N.register(
"Available groups" : "Käytettävissä olevat ryhmät",
"Selected groups" : "Valitut ryhmät",
"LDAP Filter:" : "LDAP-suodatin:",
+ "LDAP / AD Username:" : "LDAP-/AD-käyttäjätunnus:",
+ "LDAP / AD Email Address:" : "LDAP-/AD-sähköpostiosoite:",
"Verify settings" : "Vahvista asetukset",
"1. Server" : "1. Palvelin",
"%s. Server:" : "%s. Palvelin:",
@@ -34,6 +36,7 @@ OC.L10N.register(
"Password" : "Salasana",
"For anonymous access, leave DN and Password empty." : "Jos haluat mahdollistaa anonyymin pääsyn, jätä DN ja Salasana tyhjäksi ",
"You can specify Base DN for users and groups in the Advanced tab" : "Voit määrittää käyttäjien ja ryhmien oletus DN:n (distinguished name) 'tarkemmat asetukset'-välilehdeltä ",
+ "Verify settings and count users" : "Vahvista asetukset ja laske käyttäjät",
"Saving" : "Tallennetaan",
"Back" : "Takaisin",
"Continue" : "Jatka",
diff --git a/apps/user_ldap/l10n/fi_FI.json b/apps/user_ldap/l10n/fi_FI.json
index 54e12650166..e34fefaf93d 100644
--- a/apps/user_ldap/l10n/fi_FI.json
+++ b/apps/user_ldap/l10n/fi_FI.json
@@ -20,6 +20,8 @@
"Available groups" : "Käytettävissä olevat ryhmät",
"Selected groups" : "Valitut ryhmät",
"LDAP Filter:" : "LDAP-suodatin:",
+ "LDAP / AD Username:" : "LDAP-/AD-käyttäjätunnus:",
+ "LDAP / AD Email Address:" : "LDAP-/AD-sähköpostiosoite:",
"Verify settings" : "Vahvista asetukset",
"1. Server" : "1. Palvelin",
"%s. Server:" : "%s. Palvelin:",
@@ -32,6 +34,7 @@
"Password" : "Salasana",
"For anonymous access, leave DN and Password empty." : "Jos haluat mahdollistaa anonyymin pääsyn, jätä DN ja Salasana tyhjäksi ",
"You can specify Base DN for users and groups in the Advanced tab" : "Voit määrittää käyttäjien ja ryhmien oletus DN:n (distinguished name) 'tarkemmat asetukset'-välilehdeltä ",
+ "Verify settings and count users" : "Vahvista asetukset ja laske käyttäjät",
"Saving" : "Tallennetaan",
"Back" : "Takaisin",
"Continue" : "Jatka",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index 9e863ada3b5..a013589cff2 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Impossible de détecter le DN de base, veuillez le spécifier manuellement",
"{nthServer}. Server" : "{nthServer}. Serveur",
"No object found in the given Base DN. Please revise." : "Aucun objet trouvé dans le DN de base spécifié. Veuillez le vérifier.",
- "More than 1.000 directory entries available." : "Il y a plus de 1000 entrées de répertoire disponibles.",
+ "More than 1,000 directory entries available." : "Il y a plus de 1 000 entrées de répertoire disponibles.",
" entries available within the provided Base DN" : "entrées disponibles dans le DN de base spécifié",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Une erreur est survenue. Veuillez vérifier le DN de base, ainsi que les paramètres de connexion et les informations d'identification",
"Do you really want to delete the current Server Configuration?" : "Êtes-vous sûr de vouloir effacer la configuration serveur actuelle ?",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index a26710c340b..0b6c076f0d3 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Impossible de détecter le DN de base, veuillez le spécifier manuellement",
"{nthServer}. Server" : "{nthServer}. Serveur",
"No object found in the given Base DN. Please revise." : "Aucun objet trouvé dans le DN de base spécifié. Veuillez le vérifier.",
- "More than 1.000 directory entries available." : "Il y a plus de 1000 entrées de répertoire disponibles.",
+ "More than 1,000 directory entries available." : "Il y a plus de 1 000 entrées de répertoire disponibles.",
" entries available within the provided Base DN" : "entrées disponibles dans le DN de base spécifié",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Une erreur est survenue. Veuillez vérifier le DN de base, ainsi que les paramètres de connexion et les informations d'identification",
"Do you really want to delete the current Server Configuration?" : "Êtes-vous sûr de vouloir effacer la configuration serveur actuelle ?",
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index fac8aedc4aa..ea7aa9674fe 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Non foi posíbel detectar o DN base, introdúzao manualmente.",
"{nthServer}. Server" : "{nthServer}. Servidor",
"No object found in the given Base DN. Please revise." : "Non se atopou o obxecto no DN base solicitado. Revíseo.",
- "More than 1.000 directory entries available." : "Dispoñíbeis máis de 1.000 entradas de directorio.",
" entries available within the provided Base DN" : "entradas dispoñíbeis no DN base fornecido",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Produciuse un erro. Comprobe o DN base, os axustes de conexión e as credenciais.",
"Do you really want to delete the current Server Configuration?" : "Confirma que quere eliminar a configuración actual do servidor?",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index b168f9d3058..53c96103238 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Non foi posíbel detectar o DN base, introdúzao manualmente.",
"{nthServer}. Server" : "{nthServer}. Servidor",
"No object found in the given Base DN. Please revise." : "Non se atopou o obxecto no DN base solicitado. Revíseo.",
- "More than 1.000 directory entries available." : "Dispoñíbeis máis de 1.000 entradas de directorio.",
" entries available within the provided Base DN" : "entradas dispoñíbeis no DN base fornecido",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Produciuse un erro. Comprobe o DN base, os axustes de conexión e as credenciais.",
"Do you really want to delete the current Server Configuration?" : "Confirma que quere eliminar a configuración actual do servidor?",
diff --git a/apps/user_ldap/l10n/id.js b/apps/user_ldap/l10n/id.js
index 402219f12bc..282b1a8181d 100644
--- a/apps/user_ldap/l10n/id.js
+++ b/apps/user_ldap/l10n/id.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Tidak dapat mendeteksi Base DN, mohon masukkan secara manual.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "Tidak ada obyek ditemukan di Base DN yang diberikan. Mohon diperiksa kembali.",
- "More than 1.000 directory entries available." : "Lebih dari 1.000 entri direktori yang tersedia.",
" entries available within the provided Base DN" : "entri tersedia didalam Base DN yang diberikan",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Terjadi kesalahan. Silakan periksa Base DN, serta pengaturan sambungan dan kredensial.",
"Do you really want to delete the current Server Configuration?" : "Apakan Anda ingin menghapus Konfigurasi Server saat ini?",
diff --git a/apps/user_ldap/l10n/id.json b/apps/user_ldap/l10n/id.json
index bf8f0509fab..556c5fd6970 100644
--- a/apps/user_ldap/l10n/id.json
+++ b/apps/user_ldap/l10n/id.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Tidak dapat mendeteksi Base DN, mohon masukkan secara manual.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "Tidak ada obyek ditemukan di Base DN yang diberikan. Mohon diperiksa kembali.",
- "More than 1.000 directory entries available." : "Lebih dari 1.000 entri direktori yang tersedia.",
" entries available within the provided Base DN" : "entri tersedia didalam Base DN yang diberikan",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Terjadi kesalahan. Silakan periksa Base DN, serta pengaturan sambungan dan kredensial.",
"Do you really want to delete the current Server Configuration?" : "Apakan Anda ingin menghapus Konfigurasi Server saat ini?",
diff --git a/apps/user_ldap/l10n/it.js b/apps/user_ldap/l10n/it.js
index 608bc3ebf27..8bb42e1a72a 100644
--- a/apps/user_ldap/l10n/it.js
+++ b/apps/user_ldap/l10n/it.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Impossibile rilevare il DN base, digitalo manualmente.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Nessun oggetto trovato nel DN base specificato. Controlla.",
- "More than 1.000 directory entries available." : "Più di 1.000 cartelle disponibili.",
+ "More than 1,000 directory entries available." : "Più di 1.000 cartelle disponibili.",
" entries available within the provided Base DN" : "voci disponibili all'interno del DN base",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Si è verificato un errore. Controlla il DN base, così come le impostazioni di connessione e le credenziali.",
"Do you really want to delete the current Server Configuration?" : "Vuoi davvero eliminare la configurazione attuale del server?",
diff --git a/apps/user_ldap/l10n/it.json b/apps/user_ldap/l10n/it.json
index 93bc5522d37..73234261016 100644
--- a/apps/user_ldap/l10n/it.json
+++ b/apps/user_ldap/l10n/it.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Impossibile rilevare il DN base, digitalo manualmente.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Nessun oggetto trovato nel DN base specificato. Controlla.",
- "More than 1.000 directory entries available." : "Più di 1.000 cartelle disponibili.",
+ "More than 1,000 directory entries available." : "Più di 1.000 cartelle disponibili.",
" entries available within the provided Base DN" : "voci disponibili all'interno del DN base",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Si è verificato un errore. Controlla il DN base, così come le impostazioni di connessione e le credenziali.",
"Do you really want to delete the current Server Configuration?" : "Vuoi davvero eliminare la configurazione attuale del server?",
diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js
index 2db99acf7af..e138c46e08e 100644
--- a/apps/user_ldap/l10n/ja.js
+++ b/apps/user_ldap/l10n/ja.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "ベース DN を検出できませんでした。手動で入力してください。",
"{nthServer}. Server" : "{nthServer}. サーバー",
"No object found in the given Base DN. Please revise." : "指定されたベース DN でオブジェクトを見つけることができませんでした。修正をお願いします。",
- "More than 1.000 directory entries available." : "1000 以上のディレクトリエントリが利用可能です。",
+ "More than 1,000 directory entries available." : "1,000以上のディレクトリエントリが利用可能です。",
" entries available within the provided Base DN" : "入力されたベースDNでエントリーが利用可能",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "エラーが発生しました。ベースDNをチェックし、接続設定と権限についても同様に確認してください。",
"Do you really want to delete the current Server Configuration?" : "現在のサーバー設定を本当に削除してもよろしいですか?",
diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json
index 3a9475699ae..ef69c48adcc 100644
--- a/apps/user_ldap/l10n/ja.json
+++ b/apps/user_ldap/l10n/ja.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "ベース DN を検出できませんでした。手動で入力してください。",
"{nthServer}. Server" : "{nthServer}. サーバー",
"No object found in the given Base DN. Please revise." : "指定されたベース DN でオブジェクトを見つけることができませんでした。修正をお願いします。",
- "More than 1.000 directory entries available." : "1000 以上のディレクトリエントリが利用可能です。",
+ "More than 1,000 directory entries available." : "1,000以上のディレクトリエントリが利用可能です。",
" entries available within the provided Base DN" : "入力されたベースDNでエントリーが利用可能",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "エラーが発生しました。ベースDNをチェックし、接続設定と権限についても同様に確認してください。",
"Do you really want to delete the current Server Configuration?" : "現在のサーバー設定を本当に削除してもよろしいですか?",
diff --git a/apps/user_ldap/l10n/ko.js b/apps/user_ldap/l10n/ko.js
index 6a14df58855..c08dd0e2a93 100644
--- a/apps/user_ldap/l10n/ko.js
+++ b/apps/user_ldap/l10n/ko.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "기본 DN을 자동으로 감지할 수 없습니다. 직접 입력하십시오.",
"{nthServer}. Server" : "{nthServer}. 서버",
"No object found in the given Base DN. Please revise." : "입력한 기본 DN에서 객체를 찾을 수 없습니다. 다시 입력하십시오.",
- "More than 1.000 directory entries available." : "디렉터리 항목이 1,000개 이상 존재합니다.",
" entries available within the provided Base DN" : "개(지정한 DN의 기본 항목 수)",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "오류가 발생했습니다. 기본 DN, 연결 설정, 인증 정보를 확인하십시오.",
"Do you really want to delete the current Server Configuration?" : "현재 서버 설정을 지우시겠습니까?",
diff --git a/apps/user_ldap/l10n/ko.json b/apps/user_ldap/l10n/ko.json
index 40fd85ca809..59037ab0a2b 100644
--- a/apps/user_ldap/l10n/ko.json
+++ b/apps/user_ldap/l10n/ko.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "기본 DN을 자동으로 감지할 수 없습니다. 직접 입력하십시오.",
"{nthServer}. Server" : "{nthServer}. 서버",
"No object found in the given Base DN. Please revise." : "입력한 기본 DN에서 객체를 찾을 수 없습니다. 다시 입력하십시오.",
- "More than 1.000 directory entries available." : "디렉터리 항목이 1,000개 이상 존재합니다.",
" entries available within the provided Base DN" : "개(지정한 DN의 기본 항목 수)",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "오류가 발생했습니다. 기본 DN, 연결 설정, 인증 정보를 확인하십시오.",
"Do you really want to delete the current Server Configuration?" : "현재 서버 설정을 지우시겠습니까?",
diff --git a/apps/user_ldap/l10n/lt_LT.js b/apps/user_ldap/l10n/lt_LT.js
index e9429c0de2a..e27dcc3e8de 100644
--- a/apps/user_ldap/l10n/lt_LT.js
+++ b/apps/user_ldap/l10n/lt_LT.js
@@ -4,9 +4,13 @@ OC.L10N.register(
"Failed to clear the mappings." : "Nepavyko išvalyti sąsajų.",
"Failed to delete the server configuration" : "Nepavyko pašalinti serverio konfigūracijos",
"The configuration is valid and the connection could be established!" : "Konfigūracija yra tinkama bei prisijungta sėkmingai!",
+ "No action specified" : "Nepasirinktas veiksmas",
"Select groups" : "Pasirinkti grupes",
"Do you really want to delete the current Server Configuration?" : "Ar tikrai norite ištrinti dabartinę serverio konfigūraciją?",
"Confirm Deletion" : "Patvirtinkite trynimą",
+ "Select attributes" : "Pasirink atributus",
+ "_%s group found_::_%s groups found_" : ["Rasta %s grupė","Rastos %s grupės","Rastos %s grupės"],
+ "_%s user found_::_%s users found_" : ["Rastas %s vartotojas","Rasti %s vartotojai","Rasti %s vartotojai"],
"Server" : "Serveris",
"Users" : "Vartotojai",
"Groups" : "Grupės",
diff --git a/apps/user_ldap/l10n/lt_LT.json b/apps/user_ldap/l10n/lt_LT.json
index 19ca042b62f..fa1526c0632 100644
--- a/apps/user_ldap/l10n/lt_LT.json
+++ b/apps/user_ldap/l10n/lt_LT.json
@@ -2,9 +2,13 @@
"Failed to clear the mappings." : "Nepavyko išvalyti sąsajų.",
"Failed to delete the server configuration" : "Nepavyko pašalinti serverio konfigūracijos",
"The configuration is valid and the connection could be established!" : "Konfigūracija yra tinkama bei prisijungta sėkmingai!",
+ "No action specified" : "Nepasirinktas veiksmas",
"Select groups" : "Pasirinkti grupes",
"Do you really want to delete the current Server Configuration?" : "Ar tikrai norite ištrinti dabartinę serverio konfigūraciją?",
"Confirm Deletion" : "Patvirtinkite trynimą",
+ "Select attributes" : "Pasirink atributus",
+ "_%s group found_::_%s groups found_" : ["Rasta %s grupė","Rastos %s grupės","Rastos %s grupės"],
+ "_%s user found_::_%s users found_" : ["Rastas %s vartotojas","Rasti %s vartotojai","Rasti %s vartotojai"],
"Server" : "Serveris",
"Users" : "Vartotojai",
"Groups" : "Grupės",
diff --git a/apps/user_ldap/l10n/nb_NO.js b/apps/user_ldap/l10n/nb_NO.js
index f92e3613193..8770dfa0841 100644
--- a/apps/user_ldap/l10n/nb_NO.js
+++ b/apps/user_ldap/l10n/nb_NO.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Klarte ikke å påvise basis-DN. Det må skrives inn manuelt.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Intet objekt funnet i angitt basis-DN. Revider oppsettet.",
- "More than 1.000 directory entries available." : "Mer enn 1000 katalogoppføringer tilgjengelig.",
" entries available within the provided Base DN" : "oppføringer tilgjengelig innenfor angitt basis-DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Det oppstod en feil. Sjekk basis-DN, tilkoblingsoppsett og påloggingsdetaljer.",
"Do you really want to delete the current Server Configuration?" : "Er du sikker på at du vil slette aktiv tjener-konfigurasjon?",
diff --git a/apps/user_ldap/l10n/nb_NO.json b/apps/user_ldap/l10n/nb_NO.json
index 268faa899c5..9cc0e4964dd 100644
--- a/apps/user_ldap/l10n/nb_NO.json
+++ b/apps/user_ldap/l10n/nb_NO.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Klarte ikke å påvise basis-DN. Det må skrives inn manuelt.",
"{nthServer}. Server" : "{nthServer}. server",
"No object found in the given Base DN. Please revise." : "Intet objekt funnet i angitt basis-DN. Revider oppsettet.",
- "More than 1.000 directory entries available." : "Mer enn 1000 katalogoppføringer tilgjengelig.",
" entries available within the provided Base DN" : "oppføringer tilgjengelig innenfor angitt basis-DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Det oppstod en feil. Sjekk basis-DN, tilkoblingsoppsett og påloggingsdetaljer.",
"Do you really want to delete the current Server Configuration?" : "Er du sikker på at du vil slette aktiv tjener-konfigurasjon?",
diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js
index 1606f1de128..27f6dd9ffc7 100644
--- a/apps/user_ldap/l10n/nl.js
+++ b/apps/user_ldap/l10n/nl.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Kon basis DN niet vaststellen, voer de gegevens handmatig in.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "Geen object gevonden in de basis DN. Review instellingen.",
- "More than 1.000 directory entries available." : "Meer dan 1000 directory namen beschikbaar.",
+ "More than 1,000 directory entries available." : "Meer dan 1000 directory namen beschikbaar.",
" entries available within the provided Base DN" : "accounts beschikbaar binnen de provider Basis DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Er trad een fout op. Controleer de Basis DN en de verbindingsinstellingen en inloggegevens.",
"Do you really want to delete the current Server Configuration?" : "Wilt u werkelijk de huidige Serverconfiguratie verwijderen?",
diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json
index 4b930d7b4c9..c98d7aa64dc 100644
--- a/apps/user_ldap/l10n/nl.json
+++ b/apps/user_ldap/l10n/nl.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Kon basis DN niet vaststellen, voer de gegevens handmatig in.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "Geen object gevonden in de basis DN. Review instellingen.",
- "More than 1.000 directory entries available." : "Meer dan 1000 directory namen beschikbaar.",
+ "More than 1,000 directory entries available." : "Meer dan 1000 directory namen beschikbaar.",
" entries available within the provided Base DN" : "accounts beschikbaar binnen de provider Basis DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Er trad een fout op. Controleer de Basis DN en de verbindingsinstellingen en inloggegevens.",
"Do you really want to delete the current Server Configuration?" : "Wilt u werkelijk de huidige Serverconfiguratie verwijderen?",
diff --git a/apps/user_ldap/l10n/oc.js b/apps/user_ldap/l10n/oc.js
index 16a136649d7..77cb592e402 100644
--- a/apps/user_ldap/l10n/oc.js
+++ b/apps/user_ldap/l10n/oc.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de basa, especificatz-lo manualament",
"{nthServer}. Server" : "{nthServer}. Servidor",
"No object found in the given Base DN. Please revise." : "Cap d'objècte pas trobat dins lo DN de basa especificat. Verificatz-lo.",
- "More than 1.000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.",
+ "More than 1,000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.",
" entries available within the provided Base DN" : "entradas disponiblas dins lo DN de basa especificat",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error s'es produsida. Verificatz lo DN de basa, e tanben los paramètres de connexion e las informacions d'identificacion.",
"Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?",
diff --git a/apps/user_ldap/l10n/oc.json b/apps/user_ldap/l10n/oc.json
index c7489f3f2b4..aa8d2b41861 100644
--- a/apps/user_ldap/l10n/oc.json
+++ b/apps/user_ldap/l10n/oc.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de basa, especificatz-lo manualament",
"{nthServer}. Server" : "{nthServer}. Servidor",
"No object found in the given Base DN. Please revise." : "Cap d'objècte pas trobat dins lo DN de basa especificat. Verificatz-lo.",
- "More than 1.000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.",
+ "More than 1,000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.",
" entries available within the provided Base DN" : "entradas disponiblas dins lo DN de basa especificat",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error s'es produsida. Verificatz lo DN de basa, e tanben los paramètres de connexion e las informacions d'identificacion.",
"Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?",
diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js
index f2ad0ca8a3a..e027c930ceb 100644
--- a/apps/user_ldap/l10n/pt_BR.js
+++ b/apps/user_ldap/l10n/pt_BR.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Não foi possível detectar a Base DN, por favor entre manualmente.",
"{nthServer}. Server" : "Servidor {nthServer}.",
"No object found in the given Base DN. Please revise." : "Nenhum objeto encontrado ba Base DN informada. Por favor revise.",
- "More than 1.000 directory entries available." : "Mais de 1.000 entradas de diretórios disponíveis.",
+ "More than 1,000 directory entries available." : "Mais de 1.000 entradas disponíveis no diretório.",
" entries available within the provided Base DN" : "entradas disponíveis na Base DN disponibilizada",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Um erro ocorreu. Por favor verifique a Base DN, e também a conexção e credenciais.",
"Do you really want to delete the current Server Configuration?" : "Você quer realmente deletar as atuais Configurações de Servidor?",
diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json
index 752fd653884..8251fa082a6 100644
--- a/apps/user_ldap/l10n/pt_BR.json
+++ b/apps/user_ldap/l10n/pt_BR.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Não foi possível detectar a Base DN, por favor entre manualmente.",
"{nthServer}. Server" : "Servidor {nthServer}.",
"No object found in the given Base DN. Please revise." : "Nenhum objeto encontrado ba Base DN informada. Por favor revise.",
- "More than 1.000 directory entries available." : "Mais de 1.000 entradas de diretórios disponíveis.",
+ "More than 1,000 directory entries available." : "Mais de 1.000 entradas disponíveis no diretório.",
" entries available within the provided Base DN" : "entradas disponíveis na Base DN disponibilizada",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Um erro ocorreu. Por favor verifique a Base DN, e também a conexção e credenciais.",
"Do you really want to delete the current Server Configuration?" : "Você quer realmente deletar as atuais Configurações de Servidor?",
diff --git a/apps/user_ldap/l10n/pt_PT.js b/apps/user_ldap/l10n/pt_PT.js
index 7288c683303..3863326e6c3 100644
--- a/apps/user_ldap/l10n/pt_PT.js
+++ b/apps/user_ldap/l10n/pt_PT.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Não foi possível detetar o ND de base, por favor introduza-o manualmente.",
"{nthServer}. Server" : "{nthServer}. Servidor",
"No object found in the given Base DN. Please revise." : "Nenhum objecto encontrado na Base DN fornecida. Por favor verifique.",
- "More than 1.000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.",
" entries available within the provided Base DN" : "entradas disponíveis no ND de base fornecido",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor verifique o ND de base, bem como as definições de ligação e as credenciais.",
"Do you really want to delete the current Server Configuration?" : "Deseja realmente apagar as configurações de servidor actuais?",
diff --git a/apps/user_ldap/l10n/pt_PT.json b/apps/user_ldap/l10n/pt_PT.json
index 5de030281b3..729674e0b2c 100644
--- a/apps/user_ldap/l10n/pt_PT.json
+++ b/apps/user_ldap/l10n/pt_PT.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Não foi possível detetar o ND de base, por favor introduza-o manualmente.",
"{nthServer}. Server" : "{nthServer}. Servidor",
"No object found in the given Base DN. Please revise." : "Nenhum objecto encontrado na Base DN fornecida. Por favor verifique.",
- "More than 1.000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.",
" entries available within the provided Base DN" : "entradas disponíveis no ND de base fornecido",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor verifique o ND de base, bem como as definições de ligação e as credenciais.",
"Do you really want to delete the current Server Configuration?" : "Deseja realmente apagar as configurações de servidor actuais?",
diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js
index 81078d595f0..40705449edf 100644
--- a/apps/user_ldap/l10n/ru.js
+++ b/apps/user_ldap/l10n/ru.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Не возможно обнаружить Base DN, пожалуйста задайте в ручную.",
"{nthServer}. Server" : "Сервер {nthServer}.",
"No object found in the given Base DN. Please revise." : "Не найдено объектов в Base DN. Пожалуйста перепроверьте.",
- "More than 1.000 directory entries available." : "В каталоге доступно более 1.000 записей.",
" entries available within the provided Base DN" : "элементы доступные в Базе",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Произошла ошибка. Пожалуйста проверьте базу поиска DN, а также настройки подключения и учетные данные.",
"Do you really want to delete the current Server Configuration?" : "Вы действительно хотите удалить существующую конфигурацию сервера?",
diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json
index 834a9b7c05f..4a6f9ea52d0 100644
--- a/apps/user_ldap/l10n/ru.json
+++ b/apps/user_ldap/l10n/ru.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Не возможно обнаружить Base DN, пожалуйста задайте в ручную.",
"{nthServer}. Server" : "Сервер {nthServer}.",
"No object found in the given Base DN. Please revise." : "Не найдено объектов в Base DN. Пожалуйста перепроверьте.",
- "More than 1.000 directory entries available." : "В каталоге доступно более 1.000 записей.",
" entries available within the provided Base DN" : "элементы доступные в Базе",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Произошла ошибка. Пожалуйста проверьте базу поиска DN, а также настройки подключения и учетные данные.",
"Do you really want to delete the current Server Configuration?" : "Вы действительно хотите удалить существующую конфигурацию сервера?",
diff --git a/apps/user_ldap/l10n/sk_SK.js b/apps/user_ldap/l10n/sk_SK.js
index 4a41059ff3e..6eca3c2735b 100644
--- a/apps/user_ldap/l10n/sk_SK.js
+++ b/apps/user_ldap/l10n/sk_SK.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Nemožno automaticky detekovať základnú DN, zadajte ručne prosím.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "Objekt nebol nájdený v zadanej základnej DN. Overte to prosím.",
- "More than 1.000 directory entries available." : "K dispozícii je viac ako 1.000 priečinkov.",
" entries available within the provided Base DN" : "dostupných záznamov v zadanej základnej DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Nastala chyba. Overte základnú DN, nastavenia pripojenia a prihlasovacie údaje.",
"Do you really want to delete the current Server Configuration?" : "Naozaj chcete zmazať súčasné nastavenie servera?",
diff --git a/apps/user_ldap/l10n/sk_SK.json b/apps/user_ldap/l10n/sk_SK.json
index 126c86c8c3b..ca7275af8e6 100644
--- a/apps/user_ldap/l10n/sk_SK.json
+++ b/apps/user_ldap/l10n/sk_SK.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Nemožno automaticky detekovať základnú DN, zadajte ručne prosím.",
"{nthServer}. Server" : "{nthServer}. Server",
"No object found in the given Base DN. Please revise." : "Objekt nebol nájdený v zadanej základnej DN. Overte to prosím.",
- "More than 1.000 directory entries available." : "K dispozícii je viac ako 1.000 priečinkov.",
" entries available within the provided Base DN" : "dostupných záznamov v zadanej základnej DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Nastala chyba. Overte základnú DN, nastavenia pripojenia a prihlasovacie údaje.",
"Do you really want to delete the current Server Configuration?" : "Naozaj chcete zmazať súčasné nastavenie servera?",
diff --git a/apps/user_ldap/l10n/sl.js b/apps/user_ldap/l10n/sl.js
index 86a372efd9f..d3712c273f0 100644
--- a/apps/user_ldap/l10n/sl.js
+++ b/apps/user_ldap/l10n/sl.js
@@ -17,7 +17,6 @@ OC.L10N.register(
"Select groups" : "Izberi skupine",
"Select object classes" : "Izbor razredov predmeta",
"{nthServer}. Server" : "{nthServer}. strežnik",
- "More than 1.000 directory entries available." : "Na voljo je več kot 1.000 elementov imenika.",
"Do you really want to delete the current Server Configuration?" : "Ali res želite izbrisati trenutne nastavitve strežnika?",
"Confirm Deletion" : "Potrdi brisanje",
"Mode switch" : "Preklop načina",
diff --git a/apps/user_ldap/l10n/sl.json b/apps/user_ldap/l10n/sl.json
index 268d5f09c91..14e73e628a0 100644
--- a/apps/user_ldap/l10n/sl.json
+++ b/apps/user_ldap/l10n/sl.json
@@ -15,7 +15,6 @@
"Select groups" : "Izberi skupine",
"Select object classes" : "Izbor razredov predmeta",
"{nthServer}. Server" : "{nthServer}. strežnik",
- "More than 1.000 directory entries available." : "Na voljo je več kot 1.000 elementov imenika.",
"Do you really want to delete the current Server Configuration?" : "Ali res želite izbrisati trenutne nastavitve strežnika?",
"Confirm Deletion" : "Potrdi brisanje",
"Mode switch" : "Preklop načina",
diff --git a/apps/user_ldap/l10n/sq.js b/apps/user_ldap/l10n/sq.js
index 0c46ff72a98..4f0d1d3697c 100644
--- a/apps/user_ldap/l10n/sq.js
+++ b/apps/user_ldap/l10n/sq.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "S’u zbulua dot DN Bazë, ju lutemi, jepeni dorazi.",
"{nthServer}. Server" : "{nthServer}. Shërbyes",
"No object found in the given Base DN. Please revise." : "Në DN Bazë të dhën s’u gjet objekt. Ju lutemi, rishikojeni.",
- "More than 1.000 directory entries available." : "Më tepër se 1.000 zëra drejtorie gati.",
+ "More than 1,000 directory entries available." : "Më shumë se 1000 zëra të gatshëm.",
" entries available within the provided Base DN" : " zëra të gatshëm brenda DN-së Bazë të dhënë",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ndodhi një gabim. Ju lutemi, kontrolloni DN-në Bazë, sie dhe rregullimet për lidhjen dhe kredencialet.",
"Do you really want to delete the current Server Configuration?" : "Doni vërtet të fshihet Formësimi i tanishëm i Shërbyesit?",
diff --git a/apps/user_ldap/l10n/sq.json b/apps/user_ldap/l10n/sq.json
index 246adb316c2..6045b61f57d 100644
--- a/apps/user_ldap/l10n/sq.json
+++ b/apps/user_ldap/l10n/sq.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "S’u zbulua dot DN Bazë, ju lutemi, jepeni dorazi.",
"{nthServer}. Server" : "{nthServer}. Shërbyes",
"No object found in the given Base DN. Please revise." : "Në DN Bazë të dhën s’u gjet objekt. Ju lutemi, rishikojeni.",
- "More than 1.000 directory entries available." : "Më tepër se 1.000 zëra drejtorie gati.",
+ "More than 1,000 directory entries available." : "Më shumë se 1000 zëra të gatshëm.",
" entries available within the provided Base DN" : " zëra të gatshëm brenda DN-së Bazë të dhënë",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ndodhi një gabim. Ju lutemi, kontrolloni DN-në Bazë, sie dhe rregullimet për lidhjen dhe kredencialet.",
"Do you really want to delete the current Server Configuration?" : "Doni vërtet të fshihet Formësimi i tanishëm i Shërbyesit?",
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index e95d656d680..1ccfefcb7a8 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Не могу да откријем базни ДН. Унесите га ручно.",
"{nthServer}. Server" : "{nthServer}. Сервер",
"No object found in the given Base DN. Please revise." : "Нема објекта за дати базни ДН. Проверите.",
- "More than 1.000 directory entries available." : "Више од 1000 уноса је доступно.",
" entries available within the provided Base DN" : "уноса доступно за дати базни ДН",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Грешка. Проверите базни ДН као и поставке везе и акредитиве.",
"Do you really want to delete the current Server Configuration?" : "Да ли стварно желите да обришете тренутну конфигурацију сервера?",
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index a52d7184b3a..658edafc77b 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "Не могу да откријем базни ДН. Унесите га ручно.",
"{nthServer}. Server" : "{nthServer}. Сервер",
"No object found in the given Base DN. Please revise." : "Нема објекта за дати базни ДН. Проверите.",
- "More than 1.000 directory entries available." : "Више од 1000 уноса је доступно.",
" entries available within the provided Base DN" : "уноса доступно за дати базни ДН",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Грешка. Проверите базни ДН као и поставке везе и акредитиве.",
"Do you really want to delete the current Server Configuration?" : "Да ли стварно желите да обришете тренутну конфигурацију сервера?",
diff --git a/apps/user_ldap/l10n/th_TH.js b/apps/user_ldap/l10n/th_TH.js
index d088d01f6c6..8b155dcfe23 100644
--- a/apps/user_ldap/l10n/th_TH.js
+++ b/apps/user_ldap/l10n/th_TH.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "ไม่สามารถตรวจสอบ Base DN โปรดเลือกด้วยตนเอง",
"{nthServer}. Server" : "เซิร์ฟเวอร์ {nthServer}",
"No object found in the given Base DN. Please revise." : "ไม่พบวัตถุที่กำหนดใน Base DN กรุณาแก้ไข",
- "More than 1.000 directory entries available." : "มีรายการไดเรกทอรีมากกว่า 1,000 รายการ",
+ "More than 1,000 directory entries available." : "ไดเรกทอรีมีอยู่มากกว่า 1,000 รายการ",
" entries available within the provided Base DN" : "รายการที่มีอยู่ใน Base DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "เกิดข้อผิดพลาด กรุณาตรวจสอบ Base DN เช่นเดียวกับการตั้งค่าการเชื่อมต่อและข้อมูลที่สำคัญ",
"Do you really want to delete the current Server Configuration?" : "คุณแน่ใจแล้วหรือว่าต้องการลบการกำหนดค่าเซิร์ฟเวอร์ปัจจุบันทิ้งไป?",
diff --git a/apps/user_ldap/l10n/th_TH.json b/apps/user_ldap/l10n/th_TH.json
index 87afedbeeb5..9787ba10037 100644
--- a/apps/user_ldap/l10n/th_TH.json
+++ b/apps/user_ldap/l10n/th_TH.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "ไม่สามารถตรวจสอบ Base DN โปรดเลือกด้วยตนเอง",
"{nthServer}. Server" : "เซิร์ฟเวอร์ {nthServer}",
"No object found in the given Base DN. Please revise." : "ไม่พบวัตถุที่กำหนดใน Base DN กรุณาแก้ไข",
- "More than 1.000 directory entries available." : "มีรายการไดเรกทอรีมากกว่า 1,000 รายการ",
+ "More than 1,000 directory entries available." : "ไดเรกทอรีมีอยู่มากกว่า 1,000 รายการ",
" entries available within the provided Base DN" : "รายการที่มีอยู่ใน Base DN",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "เกิดข้อผิดพลาด กรุณาตรวจสอบ Base DN เช่นเดียวกับการตั้งค่าการเชื่อมต่อและข้อมูลที่สำคัญ",
"Do you really want to delete the current Server Configuration?" : "คุณแน่ใจแล้วหรือว่าต้องการลบการกำหนดค่าเซิร์ฟเวอร์ปัจจุบันทิ้งไป?",
diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js
index 944d39928d0..c9798c5382d 100644
--- a/apps/user_ldap/l10n/tr.js
+++ b/apps/user_ldap/l10n/tr.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "Base DN tespit edilemedi, lütfen elle girin.",
"{nthServer}. Server" : "{nthServer}. Sunucu",
"No object found in the given Base DN. Please revise." : "Girilen Base DN içerisinde nesne bulunamadı. Lütfen gözden geçirin.",
- "More than 1.000 directory entries available." : "1.000'den fazla dizin girdisi mevcut.",
+ "More than 1,000 directory entries available." : "1000'den fazla dizin şuan müsait durumdadır.",
" entries available within the provided Base DN" : " girdi sağlanan Base DN içerisinde mevcut",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Bir hata oluştu. Lütfen Base DN ile birlikte bağlantı ayarlarını ve kimlik bilgilerini denetleyin.",
"Do you really want to delete the current Server Configuration?" : "Şu anki sunucu yapılandırmasını silmek istediğinizden emin misiniz?",
diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json
index 553dfe6cdbd..c60842078a7 100644
--- a/apps/user_ldap/l10n/tr.json
+++ b/apps/user_ldap/l10n/tr.json
@@ -22,7 +22,7 @@
"Could not detect Base DN, please enter it manually." : "Base DN tespit edilemedi, lütfen elle girin.",
"{nthServer}. Server" : "{nthServer}. Sunucu",
"No object found in the given Base DN. Please revise." : "Girilen Base DN içerisinde nesne bulunamadı. Lütfen gözden geçirin.",
- "More than 1.000 directory entries available." : "1.000'den fazla dizin girdisi mevcut.",
+ "More than 1,000 directory entries available." : "1000'den fazla dizin şuan müsait durumdadır.",
" entries available within the provided Base DN" : " girdi sağlanan Base DN içerisinde mevcut",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Bir hata oluştu. Lütfen Base DN ile birlikte bağlantı ayarlarını ve kimlik bilgilerini denetleyin.",
"Do you really want to delete the current Server Configuration?" : "Şu anki sunucu yapılandırmasını silmek istediğinizden emin misiniz?",
diff --git a/apps/user_ldap/l10n/zh_TW.js b/apps/user_ldap/l10n/zh_TW.js
index c6830f96a83..244206927ba 100644
--- a/apps/user_ldap/l10n/zh_TW.js
+++ b/apps/user_ldap/l10n/zh_TW.js
@@ -24,7 +24,6 @@ OC.L10N.register(
"Could not detect Base DN, please enter it manually." : "無法偵測到Base DN,請手動輸入",
"{nthServer}. Server" : "{nthServer}. 伺服器",
"No object found in the given Base DN. Please revise." : "在Base DN中找不到物件,請重新修改",
- "More than 1.000 directory entries available." : "目前有超過 1.000 個資料夾項目是可以使用的",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "產生錯誤,請檢查Base DN,以及連線設定和驗證",
"Do you really want to delete the current Server Configuration?" : "您真的要刪除現在的伺服器設定嗎?",
"Confirm Deletion" : "確認刪除",
diff --git a/apps/user_ldap/l10n/zh_TW.json b/apps/user_ldap/l10n/zh_TW.json
index 0661836bac2..35b5b5bad27 100644
--- a/apps/user_ldap/l10n/zh_TW.json
+++ b/apps/user_ldap/l10n/zh_TW.json
@@ -22,7 +22,6 @@
"Could not detect Base DN, please enter it manually." : "無法偵測到Base DN,請手動輸入",
"{nthServer}. Server" : "{nthServer}. 伺服器",
"No object found in the given Base DN. Please revise." : "在Base DN中找不到物件,請重新修改",
- "More than 1.000 directory entries available." : "目前有超過 1.000 個資料夾項目是可以使用的",
"An error occurred. Please check the Base DN, as well as connection settings and credentials." : "產生錯誤,請檢查Base DN,以及連線設定和驗證",
"Do you really want to delete the current Server Configuration?" : "您真的要刪除現在的伺服器設定嗎?",
"Confirm Deletion" : "確認刪除",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 7be91186c16..42e57e8296e 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -864,14 +864,13 @@ class Access extends LDAPUtility implements user\IUserTools {
* @param bool $pagedSearchOK whether a paged search has been executed
* @param bool $skipHandling required for paged search when cookies to
* prior results need to be gained
- * @return array|false array with the search result as first value and pagedSearchOK as
- * second | false if not successful
+ * @return bool cookie validity, true if we have more pages, false otherwise.
*/
private function processPagedSearchStatus($sr, $filter, $base, $iFoundItems, $limit, $offset, $pagedSearchOK, $skipHandling) {
+ $cookie = null;
if($pagedSearchOK) {
$cr = $this->connection->getConnectionResource();
foreach($sr as $key => $res) {
- $cookie = null;
if($this->ldap->controlPagedResultResponse($cr, $res, $cookie)) {
$this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie);
}
@@ -892,6 +891,12 @@ class Access extends LDAPUtility implements user\IUserTools {
\OCP\Util::writeLog('user_ldap', 'Paged search was not available', \OCP\Util::INFO);
}
}
+ /* ++ Fixing RHDS searches with pages with zero results ++
+ * Return cookie status. If we don't have more pages, with RHDS
+ * cookie is null, with openldap cookie is an empty string and
+ * to 386ds '0' is a valid cookie. Even if $iFoundItems == 0
+ */
+ return !empty($cookie) || $cookie === '0';
}
/**
@@ -920,7 +925,6 @@ class Access extends LDAPUtility implements user\IUserTools {
$this->connection->getConnectionResource();
do {
- $continue = false;
$search = $this->executeSearch($filter, $base, $attr,
$limitPerPage, $offset);
if($search === false) {
@@ -928,12 +932,20 @@ class Access extends LDAPUtility implements user\IUserTools {
}
list($sr, $pagedSearchOK) = $search;
- $count = $this->countEntriesInSearchResults($sr, $limitPerPage, $continue);
+ /* ++ Fixing RHDS searches with pages with zero results ++
+ * countEntriesInSearchResults() method signature changed
+ * by removing $limit and &$hasHitLimit parameters
+ */
+ $count = $this->countEntriesInSearchResults($sr);
$counter += $count;
- $this->processPagedSearchStatus($sr, $filter, $base, $count, $limitPerPage,
+ $hasMorePages = $this->processPagedSearchStatus($sr, $filter, $base, $count, $limitPerPage,
$offset, $pagedSearchOK, $skipHandling);
$offset += $limitPerPage;
+ /* ++ Fixing RHDS searches with pages with zero results ++
+ * Continue now depends on $hasMorePages value
+ */
+ $continue = $pagedSearchOK && $hasMorePages;
} while($continue && (is_null($limit) || $limit <= 0 || $limit > $counter));
return $counter;
@@ -941,20 +953,15 @@ class Access extends LDAPUtility implements user\IUserTools {
/**
* @param array $searchResults
- * @param int $limit
- * @param bool $hasHitLimit
* @return int
*/
- private function countEntriesInSearchResults($searchResults, $limit, &$hasHitLimit) {
+ private function countEntriesInSearchResults($searchResults) {
$cr = $this->connection->getConnectionResource();
$counter = 0;
foreach($searchResults as $res) {
$count = intval($this->ldap->countEntries($cr, $res));
$counter += $count;
- if($count > 0 && $count === $limit) {
- $hasHitLimit = true;
- }
}
return $counter;
@@ -975,38 +982,53 @@ class Access extends LDAPUtility implements user\IUserTools {
//otherwise search will fail
$limit = null;
}
- $search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
- if($search === false) {
- return array();
- }
- list($sr, $pagedSearchOK) = $search;
- $cr = $this->connection->getConnectionResource();
- if($skipHandling) {
- //i.e. result do not need to be fetched, we just need the cookie
- //thus pass 1 or any other value as $iFoundItems because it is not
- //used
- $this->processPagedSearchStatus($sr, $filter, $base, 1, $limit,
- $offset, $pagedSearchOK,
- $skipHandling);
- return array();
- }
+ /* ++ Fixing RHDS searches with pages with zero results ++
+ * As we can have pages with zero results and/or pages with less
+ * than $limit results but with a still valid server 'cookie',
+ * loops through until we get $continue equals true and
+ * $findings['count'] < $limit
+ */
+ $findings = array();
+ $savedoffset = $offset;
+ do {
+ $continue = false;
+ $search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
+ if($search === false) {
+ return array();
+ }
+ list($sr, $pagedSearchOK) = $search;
+ $cr = $this->connection->getConnectionResource();
- // Do the server-side sorting
- foreach(array_reverse($attr) as $sortAttr){
- foreach($sr as $searchResource) {
- $this->ldap->sort($cr, $searchResource, $sortAttr);
+ if($skipHandling) {
+ //i.e. result do not need to be fetched, we just need the cookie
+ //thus pass 1 or any other value as $iFoundItems because it is not
+ //used
+ $this->processPagedSearchStatus($sr, $filter, $base, 1, $limit,
+ $offset, $pagedSearchOK,
+ $skipHandling);
+ return array();
}
- }
- $findings = array();
- foreach($sr as $res) {
- $findings = array_merge($findings, $this->ldap->getEntries($cr , $res ));
- }
+ // Do the server-side sorting
+ foreach(array_reverse($attr) as $sortAttr){
+ foreach($sr as $searchResource) {
+ $this->ldap->sort($cr, $searchResource, $sortAttr);
+ }
+ }
+
+
+ foreach($sr as $res) {
+ $findings = array_merge($findings, $this->ldap->getEntries($cr , $res ));
+ }
- $this->processPagedSearchStatus($sr, $filter, $base, $findings['count'],
- $limit, $offset, $pagedSearchOK,
+ $continue = $this->processPagedSearchStatus($sr, $filter, $base, $findings['count'],
+ $limit, $offset, $pagedSearchOK,
$skipHandling);
+ $offset += $limit;
+ } while ($continue && $pagedSearchOK && $findings['count'] < $limit);
+ // reseting offset
+ $offset = $savedoffset;
// if we're here, probably no connection resource is returned.
// to make ownCloud behave nicely, we simply give back an empty array.
@@ -1594,7 +1616,13 @@ class Access extends LDAPUtility implements user\IUserTools {
}
}
- } else if($this->connection->hasPagedResultSupport && $limit === 0) {
+ /* ++ Fixing RHDS searches with pages with zero results ++
+ * We coudn't get paged searches working with our RHDS for login ($limit = 0),
+ * due to pages with zero results.
+ * So we added "&& !empty($this->lastCookie)" to this test to ignore pagination
+ * if we don't have a previous paged search.
+ */
+ } else if($this->connection->hasPagedResultSupport && $limit === 0 && !empty($this->lastCookie)) {
// a search without limit was requested. However, if we do use
// Paged Search once, we always must do it. This requires us to
// initialize it with the configured page size.
diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php
index 25e871d9b3d..ef31a1037dd 100644
--- a/apps/user_ldap/tests/access.php
+++ b/apps/user_ldap/tests/access.php
@@ -28,6 +28,13 @@ use \OCA\user_ldap\lib\Access;
use \OCA\user_ldap\lib\Connection;
use \OCA\user_ldap\lib\ILDAPWrapper;
+/**
+ * Class Test_Access
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_Access extends \Test\TestCase {
private function getConnectorAndLdapMock() {
static $conMethods;
diff --git a/apps/user_ldap/tests/connection.php b/apps/user_ldap/tests/connection.php
index b0b4b78ce4d..10a299a61b1 100644
--- a/apps/user_ldap/tests/connection.php
+++ b/apps/user_ldap/tests/connection.php
@@ -23,6 +23,13 @@
namespace OCA\user_ldap\tests;
+/**
+ * Class Test_Connection
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_Connection extends \Test\TestCase {
public function testOriginalAgentUnchangedOnClone() {
@@ -52,4 +59,4 @@ class Test_Connection extends \Test\TestCase {
$this->assertSame($agentPawd, $agent['ldapAgentPassword']);
}
-} \ No newline at end of file
+}
diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php
index 6a6d5bc7ca1..5362b97f216 100644
--- a/apps/user_ldap/tests/group_ldap.php
+++ b/apps/user_ldap/tests/group_ldap.php
@@ -30,6 +30,13 @@ use \OCA\user_ldap\lib\Access;
use \OCA\user_ldap\lib\Connection;
use \OCA\user_ldap\lib\ILDAPWrapper;
+/**
+ * Class Test_Group_Ldap
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_Group_Ldap extends \Test\TestCase {
private function getAccessMock() {
static $conMethods;
diff --git a/apps/user_ldap/tests/mapping/groupmapping.php b/apps/user_ldap/tests/mapping/groupmapping.php
index e8fe655630d..f9136cf5290 100644
--- a/apps/user_ldap/tests/mapping/groupmapping.php
+++ b/apps/user_ldap/tests/mapping/groupmapping.php
@@ -24,6 +24,13 @@ namespace OCA\user_ldap\tests\mapping;
use OCA\User_LDAP\Mapping\GroupMapping;
+/**
+ * Class Test_GroupMapping
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests\mapping
+ */
class Test_GroupMapping extends AbstractMappingTest {
public function getMapper(\OCP\IDBConnection $dbMock) {
return new GroupMapping($dbMock);
diff --git a/apps/user_ldap/tests/mapping/usermapping.php b/apps/user_ldap/tests/mapping/usermapping.php
index fa9311b405a..e84f5020231 100644
--- a/apps/user_ldap/tests/mapping/usermapping.php
+++ b/apps/user_ldap/tests/mapping/usermapping.php
@@ -24,6 +24,13 @@ namespace OCA\user_ldap\tests\mapping;
use OCA\User_LDAP\Mapping\UserMapping;
+/**
+ * Class Test_UserMapping
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests\mapping
+ */
class Test_UserMapping extends AbstractMappingTest {
public function getMapper(\OCP\IDBConnection $dbMock) {
return new UserMapping($dbMock);
diff --git a/apps/user_ldap/tests/user/manager.php b/apps/user_ldap/tests/user/manager.php
index 98e48638d8b..d8602978a9d 100644
--- a/apps/user_ldap/tests/user/manager.php
+++ b/apps/user_ldap/tests/user/manager.php
@@ -26,6 +26,13 @@ namespace OCA\user_ldap\tests;
use OCA\user_ldap\lib\user\Manager;
+/**
+ * Class Test_User_Manager
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_User_Manager extends \Test\TestCase {
private function getTestInstances() {
diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php
index 19581d835d1..a5bb459d6fd 100644
--- a/apps/user_ldap/tests/user/user.php
+++ b/apps/user_ldap/tests/user/user.php
@@ -25,6 +25,13 @@ namespace OCA\user_ldap\tests;
use OCA\user_ldap\lib\user\User;
+/**
+ * Class Test_User_User
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_User_User extends \Test\TestCase {
private function getTestInstances() {
diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php
index 0f70c43fc11..7593371d85d 100644
--- a/apps/user_ldap/tests/user_ldap.php
+++ b/apps/user_ldap/tests/user_ldap.php
@@ -31,6 +31,13 @@ use \OCA\user_ldap\lib\Access;
use \OCA\user_ldap\lib\Connection;
use \OCA\user_ldap\lib\ILDAPWrapper;
+/**
+ * Class Test_User_Ldap_Direct
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_User_Ldap_Direct extends \Test\TestCase {
protected $backend;
protected $access;
diff --git a/apps/user_ldap/tests/wizard.php b/apps/user_ldap/tests/wizard.php
index 7b046187831..c29361096a1 100644
--- a/apps/user_ldap/tests/wizard.php
+++ b/apps/user_ldap/tests/wizard.php
@@ -31,6 +31,13 @@ use \OCA\user_ldap\lib\Wizard;
// use \OCA\user_ldap\lib\Configuration;
// use \OCA\user_ldap\lib\ILDAPWrapper;
+/**
+ * Class Test_Wizard
+ *
+ * @group DB
+ *
+ * @package OCA\user_ldap\tests
+ */
class Test_Wizard extends \Test\TestCase {
protected function setUp() {
parent::setUp();