aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files/appinfo/app.php39
-rw-r--r--apps/files/css/files.css25
-rw-r--r--apps/files/js/file-upload.js9
-rw-r--r--apps/files/l10n/cs_CZ.js1
-rw-r--r--apps/files/l10n/cs_CZ.json1
-rw-r--r--apps/files/l10n/da.js1
-rw-r--r--apps/files/l10n/da.json1
-rw-r--r--apps/files/l10n/de.js1
-rw-r--r--apps/files/l10n/de.json1
-rw-r--r--apps/files/l10n/de_DE.js1
-rw-r--r--apps/files/l10n/de_DE.json1
-rw-r--r--apps/files/l10n/es.js1
-rw-r--r--apps/files/l10n/es.json1
-rw-r--r--apps/files/l10n/fi_FI.js1
-rw-r--r--apps/files/l10n/fi_FI.json1
-rw-r--r--apps/files/l10n/fr.js1
-rw-r--r--apps/files/l10n/fr.json1
-rw-r--r--apps/files/l10n/gl.js1
-rw-r--r--apps/files/l10n/gl.json1
-rw-r--r--apps/files/l10n/hu_HU.js2
-rw-r--r--apps/files/l10n/hu_HU.json2
-rw-r--r--apps/files/l10n/it.js1
-rw-r--r--apps/files/l10n/it.json1
-rw-r--r--apps/files/l10n/lo.js7
-rw-r--r--apps/files/l10n/lo.json7
-rw-r--r--apps/files/l10n/nl.js1
-rw-r--r--apps/files/l10n/nl.json1
-rw-r--r--apps/files/l10n/pl.js2
-rw-r--r--apps/files/l10n/pl.json2
-rw-r--r--apps/files/l10n/pt_BR.js1
-rw-r--r--apps/files/l10n/pt_BR.json1
-rw-r--r--apps/files/l10n/pt_PT.js1
-rw-r--r--apps/files/l10n/pt_PT.json1
-rw-r--r--apps/files/l10n/ro.js29
-rw-r--r--apps/files/l10n/ro.json29
-rw-r--r--apps/files/l10n/ru.js1
-rw-r--r--apps/files/l10n/ru.json1
-rw-r--r--apps/files/l10n/sr.js1
-rw-r--r--apps/files/l10n/sr.json1
-rw-r--r--apps/files/l10n/tr.js1
-rw-r--r--apps/files/l10n/tr.json1
-rw-r--r--apps/files/l10n/uk.js17
-rw-r--r--apps/files/l10n/uk.json17
-rw-r--r--apps/files/service/tagservice.php25
-rw-r--r--apps/files/templates/list.php2
-rw-r--r--apps/files_encryption/l10n/fr.js2
-rw-r--r--apps/files_encryption/l10n/fr.json2
-rw-r--r--apps/files_encryption/l10n/lo.js6
-rw-r--r--apps/files_encryption/l10n/lo.json4
-rw-r--r--apps/files_encryption/l10n/sr.js4
-rw-r--r--apps/files_encryption/l10n/sr.json4
-rw-r--r--apps/files_encryption/lib/stream.php290
-rw-r--r--apps/files_external/ajax/addMountPoint.php26
-rw-r--r--apps/files_external/ajax/removeMountPoint.php23
-rw-r--r--apps/files_external/appinfo/app.php2
-rw-r--r--apps/files_external/appinfo/application.php7
-rw-r--r--apps/files_external/appinfo/routes.php37
-rw-r--r--apps/files_external/controller/globalstoragescontroller.php156
-rw-r--r--apps/files_external/controller/storagescontroller.php167
-rw-r--r--apps/files_external/controller/userstoragescontroller.php191
-rw-r--r--apps/files_external/js/dropbox.js4
-rw-r--r--apps/files_external/js/google.js4
-rw-r--r--apps/files_external/js/settings.js1080
-rw-r--r--apps/files_external/js/sftp_key.js2
-rw-r--r--apps/files_external/l10n/ca.js6
-rw-r--r--apps/files_external/l10n/ca.json6
-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/de.js3
-rw-r--r--apps/files_external/l10n/de.json3
-rw-r--r--apps/files_external/l10n/de_DE.js3
-rw-r--r--apps/files_external/l10n/de_DE.json3
-rw-r--r--apps/files_external/l10n/fi_FI.js1
-rw-r--r--apps/files_external/l10n/fi_FI.json1
-rw-r--r--apps/files_external/l10n/fr.js9
-rw-r--r--apps/files_external/l10n/fr.json9
-rw-r--r--apps/files_external/l10n/gl.js3
-rw-r--r--apps/files_external/l10n/gl.json3
-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/nl.js3
-rw-r--r--apps/files_external/l10n/nl.json3
-rw-r--r--apps/files_external/l10n/pt_PT.js3
-rw-r--r--apps/files_external/l10n/pt_PT.json3
-rw-r--r--apps/files_external/l10n/tr.js3
-rw-r--r--apps/files_external/l10n/tr.json3
-rw-r--r--apps/files_external/l10n/uk.js5
-rw-r--r--apps/files_external/l10n/uk.json5
-rw-r--r--apps/files_external/lib/config.php90
-rw-r--r--apps/files_external/lib/dropbox.php7
-rw-r--r--apps/files_external/lib/notfoundexception.php15
-rw-r--r--apps/files_external/lib/storageconfig.php292
-rw-r--r--apps/files_external/personal.php22
-rw-r--r--apps/files_external/service/globalstoragesservice.php191
-rw-r--r--apps/files_external/service/storagesservice.php389
-rw-r--r--apps/files_external/service/userstoragesservice.php150
-rw-r--r--apps/files_external/settings.php22
-rw-r--r--apps/files_external/templates/settings.php18
-rw-r--r--apps/files_external/tests/controller/globalstoragescontrollertest.php (renamed from lib/private/fileproxy/fileoperations.php)30
-rw-r--r--apps/files_external/tests/controller/storagescontrollertest.php225
-rw-r--r--apps/files_external/tests/controller/userstoragescontrollertest.php114
-rw-r--r--apps/files_external/tests/js/settingsSpec.js167
-rw-r--r--apps/files_external/tests/mountconfig.php58
-rw-r--r--apps/files_external/tests/service/globalstoragesservicetest.php815
-rw-r--r--apps/files_external/tests/service/storagesservicetest.php183
-rw-r--r--apps/files_external/tests/service/userstoragesservicetest.php254
-rw-r--r--apps/files_external/tests/storageconfigtest.php52
-rw-r--r--apps/files_sharing/application.php5
-rw-r--r--apps/files_sharing/l10n/pl.js8
-rw-r--r--apps/files_sharing/l10n/pl.json8
-rw-r--r--apps/files_sharing/l10n/uk.js13
-rw-r--r--apps/files_sharing/l10n/uk.json13
-rw-r--r--apps/files_sharing/lib/controllers/sharecontroller.php41
-rw-r--r--apps/files_sharing/lib/external/storage.php2
-rw-r--r--apps/files_sharing/lib/middleware/sharingcheckmiddleware.php3
-rw-r--r--apps/files_sharing/public.php2
-rw-r--r--apps/files_sharing/templates/public.php7
-rw-r--r--apps/files_sharing/tests/api.php18
-rw-r--r--apps/files_sharing/tests/controller/sharecontroller.php63
-rw-r--r--apps/files_sharing/tests/external/manager.php142
-rw-r--r--apps/files_sharing/tests/sharedstorage.php3
-rw-r--r--apps/files_trashbin/l10n/pl.js4
-rw-r--r--apps/files_trashbin/l10n/pl.json4
-rw-r--r--apps/user_ldap/appinfo/register_command.php6
-rw-r--r--apps/user_ldap/command/createemptyconfig.php13
-rw-r--r--apps/user_ldap/command/deleteconfig.php15
-rw-r--r--apps/user_ldap/command/showconfig.php13
-rw-r--r--apps/user_ldap/group_ldap.php2
-rw-r--r--apps/user_ldap/l10n/gl.js2
-rw-r--r--apps/user_ldap/l10n/gl.json2
-rw-r--r--apps/user_ldap/l10n/sr.js5
-rw-r--r--apps/user_ldap/l10n/sr.json5
-rw-r--r--apps/user_ldap/l10n/uk.js1
-rw-r--r--apps/user_ldap/l10n/uk.json1
-rw-r--r--apps/user_ldap/tests/group_ldap.php14
-rwxr-xr-xautotest.sh39
-rw-r--r--build/.ci-conf/pr-oci0
-rw-r--r--config/config.sample.php2
-rw-r--r--core/ajax/preview.php5
-rw-r--r--core/avatar/avatarcontroller.php2
-rw-r--r--core/css/apps.css1
-rw-r--r--core/css/header.css25
-rw-r--r--core/css/jquery-ui-fixes.css2
-rw-r--r--core/css/jquery.ocdialog.css2
-rw-r--r--core/css/mobile.css4
-rw-r--r--core/css/share.css8
-rw-r--r--core/css/styles.css30
-rw-r--r--core/js/js.js2
-rw-r--r--core/js/share.js18
-rw-r--r--core/js/tests/specHelper.js5
-rw-r--r--core/l10n/af_ZA.js3
-rw-r--r--core/l10n/af_ZA.json3
-rw-r--r--core/l10n/cs_CZ.js1
-rw-r--r--core/l10n/cs_CZ.json1
-rw-r--r--core/l10n/da.js5
-rw-r--r--core/l10n/da.json5
-rw-r--r--core/l10n/de.js1
-rw-r--r--core/l10n/de.json1
-rw-r--r--core/l10n/de_DE.js1
-rw-r--r--core/l10n/de_DE.json1
-rw-r--r--core/l10n/fi_FI.js1
-rw-r--r--core/l10n/fi_FI.json1
-rw-r--r--core/l10n/fr.js3
-rw-r--r--core/l10n/fr.json3
-rw-r--r--core/l10n/gl.js1
-rw-r--r--core/l10n/gl.json1
-rw-r--r--core/l10n/hu_HU.js3
-rw-r--r--core/l10n/hu_HU.json3
-rw-r--r--core/l10n/it.js1
-rw-r--r--core/l10n/it.json1
-rw-r--r--core/l10n/ja.js3
-rw-r--r--core/l10n/ja.json3
-rw-r--r--core/l10n/nl.js1
-rw-r--r--core/l10n/nl.json1
-rw-r--r--core/l10n/pl.js5
-rw-r--r--core/l10n/pl.json5
-rw-r--r--core/l10n/pt_BR.js5
-rw-r--r--core/l10n/pt_BR.json5
-rw-r--r--core/l10n/pt_PT.js1
-rw-r--r--core/l10n/pt_PT.json1
-rw-r--r--core/l10n/sr.js8
-rw-r--r--core/l10n/sr.json8
-rw-r--r--core/l10n/tr.js6
-rw-r--r--core/l10n/tr.json6
-rw-r--r--core/l10n/uk.js88
-rw-r--r--core/l10n/uk.json88
-rw-r--r--core/search/css/results.css8
-rw-r--r--core/search/js/search.js9
-rw-r--r--core/shipped.json35
-rw-r--r--core/templates/403.php2
-rw-r--r--core/templates/404.php2
-rw-r--r--core/templates/error.php2
-rw-r--r--core/templates/exception.php3
-rw-r--r--core/templates/installation.php30
-rw-r--r--core/templates/layout.base.php20
-rw-r--r--core/templates/layout.guest.php29
-rw-r--r--core/templates/layout.user.php47
-rw-r--r--core/templates/login.php12
-rw-r--r--core/templates/message.html2
-rw-r--r--core/templates/singleuser.user.php8
-rw-r--r--core/templates/tags.html4
-rw-r--r--core/templates/untrustedDomain.php6
-rw-r--r--core/templates/update.user.php8
-rw-r--r--lib/base.php32
-rw-r--r--lib/l10n/cs_CZ.js2
-rw-r--r--lib/l10n/cs_CZ.json2
-rw-r--r--lib/l10n/da.js3
-rw-r--r--lib/l10n/da.json3
-rw-r--r--lib/l10n/de.js1
-rw-r--r--lib/l10n/de.json1
-rw-r--r--lib/l10n/de_DE.js1
-rw-r--r--lib/l10n/de_DE.json1
-rw-r--r--lib/l10n/es.js4
-rw-r--r--lib/l10n/es.json4
-rw-r--r--lib/l10n/fi_FI.js1
-rw-r--r--lib/l10n/fi_FI.json1
-rw-r--r--lib/l10n/fr.js2
-rw-r--r--lib/l10n/fr.json2
-rw-r--r--lib/l10n/gl.js2
-rw-r--r--lib/l10n/gl.json2
-rw-r--r--lib/l10n/it.js2
-rw-r--r--lib/l10n/it.json2
-rw-r--r--lib/l10n/ja.js6
-rw-r--r--lib/l10n/ja.json6
-rw-r--r--lib/l10n/nl.js2
-rw-r--r--lib/l10n/nl.json2
-rw-r--r--lib/l10n/pl.js6
-rw-r--r--lib/l10n/pl.json6
-rw-r--r--lib/l10n/pt_BR.js2
-rw-r--r--lib/l10n/pt_BR.json2
-rw-r--r--lib/l10n/pt_PT.js2
-rw-r--r--lib/l10n/pt_PT.json2
-rw-r--r--lib/l10n/ru.js1
-rw-r--r--lib/l10n/ru.json1
-rw-r--r--lib/l10n/sr.js42
-rw-r--r--lib/l10n/sr.json42
-rw-r--r--lib/l10n/tr.js7
-rw-r--r--lib/l10n/tr.json7
-rw-r--r--lib/l10n/uk.js62
-rw-r--r--lib/l10n/uk.json62
-rw-r--r--lib/private/app.php60
-rw-r--r--lib/private/avatar.php6
-rw-r--r--lib/private/cache/fileglobalgc.php10
-rw-r--r--lib/private/connector/sabre/custompropertiesbackend.php20
-rw-r--r--lib/private/connector/sabre/filesplugin.php14
-rw-r--r--lib/private/db/connection.php2
-rw-r--r--lib/private/files/cache/cache.php3
-rw-r--r--lib/private/files/cache/watcher.php7
-rw-r--r--lib/private/files/mount/mountpoint.php17
-rw-r--r--lib/private/files/storage/common.php23
-rw-r--r--lib/private/files/storage/storagefactory.php11
-rw-r--r--lib/private/files/view.php2
-rw-r--r--lib/private/image.php7
-rw-r--r--lib/private/mail/mailer.php17
-rw-r--r--lib/private/memcache/cache.php3
-rw-r--r--lib/private/mimetypes.list.php2
-rw-r--r--lib/private/preview.php261
-rw-r--r--lib/private/preview/movie.php2
-rw-r--r--lib/private/preview/mp3.php3
-rw-r--r--lib/private/preview/provider.php19
-rw-r--r--lib/private/preview/txt.php2
-rw-r--r--lib/private/previewmanager.php274
-rw-r--r--lib/private/server.php34
-rw-r--r--lib/private/session/internal.php8
-rw-r--r--lib/private/share/share.php10
-rw-r--r--lib/private/tags.php5
-rw-r--r--lib/private/template.php1
-rw-r--r--lib/private/templatelayout.php6
-rw-r--r--lib/private/updater.php22
-rw-r--r--lib/private/urlgenerator.php50
-rw-r--r--lib/private/util.php11
-rw-r--r--lib/public/app.php17
-rw-r--r--lib/public/appframework/db/mapper.php73
-rw-r--r--lib/public/appframework/http/notfoundresponse.php43
-rw-r--r--lib/public/files/mount/imountpoint.php7
-rw-r--r--lib/public/files/storage/istoragefactory.php5
-rw-r--r--lib/public/iavatar.php4
-rw-r--r--lib/public/iimage.php146
-rw-r--r--lib/public/ipreview.php34
-rw-r--r--lib/public/preview/iprovider.php39
-rw-r--r--lib/repair/repairmimetypes.php57
-rw-r--r--settings/admin.php1
-rw-r--r--settings/controller/appsettingscontroller.php1
-rw-r--r--settings/controller/userscontroller.php9
-rw-r--r--settings/css/settings.css78
-rw-r--r--settings/js/apps.js28
-rw-r--r--settings/js/users/groups.js13
-rw-r--r--settings/l10n/ar.js4
-rw-r--r--settings/l10n/ar.json4
-rw-r--r--settings/l10n/ast.js7
-rw-r--r--settings/l10n/ast.json7
-rw-r--r--settings/l10n/az.js7
-rw-r--r--settings/l10n/az.json7
-rw-r--r--settings/l10n/bg_BG.js7
-rw-r--r--settings/l10n/bg_BG.json7
-rw-r--r--settings/l10n/bn_BD.js3
-rw-r--r--settings/l10n/bn_BD.json3
-rw-r--r--settings/l10n/bs.js7
-rw-r--r--settings/l10n/bs.json7
-rw-r--r--settings/l10n/ca.js7
-rw-r--r--settings/l10n/ca.json7
-rw-r--r--settings/l10n/cs_CZ.js12
-rw-r--r--settings/l10n/cs_CZ.json12
-rw-r--r--settings/l10n/da.js9
-rw-r--r--settings/l10n/da.json9
-rw-r--r--settings/l10n/de.js11
-rw-r--r--settings/l10n/de.json11
-rw-r--r--settings/l10n/de_DE.js11
-rw-r--r--settings/l10n/de_DE.json11
-rw-r--r--settings/l10n/el.js8
-rw-r--r--settings/l10n/el.json8
-rw-r--r--settings/l10n/en_GB.js7
-rw-r--r--settings/l10n/en_GB.json7
-rw-r--r--settings/l10n/eo.js4
-rw-r--r--settings/l10n/eo.json4
-rw-r--r--settings/l10n/es.js8
-rw-r--r--settings/l10n/es.json8
-rw-r--r--settings/l10n/es_AR.js5
-rw-r--r--settings/l10n/es_AR.json5
-rw-r--r--settings/l10n/es_MX.js4
-rw-r--r--settings/l10n/es_MX.json4
-rw-r--r--settings/l10n/et_EE.js7
-rw-r--r--settings/l10n/et_EE.json7
-rw-r--r--settings/l10n/eu.js7
-rw-r--r--settings/l10n/eu.json7
-rw-r--r--settings/l10n/fa.js4
-rw-r--r--settings/l10n/fa.json4
-rw-r--r--settings/l10n/fi_FI.js11
-rw-r--r--settings/l10n/fi_FI.json11
-rw-r--r--settings/l10n/fr.js13
-rw-r--r--settings/l10n/fr.json13
-rw-r--r--settings/l10n/gl.js11
-rw-r--r--settings/l10n/gl.json11
-rw-r--r--settings/l10n/he.js2
-rw-r--r--settings/l10n/he.json2
-rw-r--r--settings/l10n/hr.js5
-rw-r--r--settings/l10n/hr.json5
-rw-r--r--settings/l10n/hu_HU.js5
-rw-r--r--settings/l10n/hu_HU.json5
-rw-r--r--settings/l10n/ia.js2
-rw-r--r--settings/l10n/ia.json2
-rw-r--r--settings/l10n/id.js7
-rw-r--r--settings/l10n/id.json7
-rw-r--r--settings/l10n/is.js1
-rw-r--r--settings/l10n/is.json1
-rw-r--r--settings/l10n/it.js11
-rw-r--r--settings/l10n/it.json11
-rw-r--r--settings/l10n/ja.js7
-rw-r--r--settings/l10n/ja.json7
-rw-r--r--settings/l10n/ka_GE.js2
-rw-r--r--settings/l10n/ka_GE.json2
-rw-r--r--settings/l10n/km.js2
-rw-r--r--settings/l10n/km.json2
-rw-r--r--settings/l10n/kn.js6
-rw-r--r--settings/l10n/kn.json6
-rw-r--r--settings/l10n/ko.js7
-rw-r--r--settings/l10n/ko.json7
-rw-r--r--settings/l10n/lo.js10
-rw-r--r--settings/l10n/lo.json8
-rw-r--r--settings/l10n/lt_LT.js4
-rw-r--r--settings/l10n/lt_LT.json4
-rw-r--r--settings/l10n/lv.js7
-rw-r--r--settings/l10n/lv.json7
-rw-r--r--settings/l10n/mk.js4
-rw-r--r--settings/l10n/mk.json4
-rw-r--r--settings/l10n/mn.js1
-rw-r--r--settings/l10n/mn.json1
-rw-r--r--settings/l10n/nb_NO.js7
-rw-r--r--settings/l10n/nb_NO.json7
-rw-r--r--settings/l10n/nl.js11
-rw-r--r--settings/l10n/nl.json11
-rw-r--r--settings/l10n/nn_NO.js1
-rw-r--r--settings/l10n/nn_NO.json1
-rw-r--r--settings/l10n/pl.js7
-rw-r--r--settings/l10n/pl.json7
-rw-r--r--settings/l10n/pt_BR.js9
-rw-r--r--settings/l10n/pt_BR.json9
-rw-r--r--settings/l10n/pt_PT.js11
-rw-r--r--settings/l10n/pt_PT.json11
-rw-r--r--settings/l10n/ro.js13
-rw-r--r--settings/l10n/ro.json13
-rw-r--r--settings/l10n/ru.js8
-rw-r--r--settings/l10n/ru.json8
-rw-r--r--settings/l10n/si_LK.js1
-rw-r--r--settings/l10n/si_LK.json1
-rw-r--r--settings/l10n/sk_SK.js7
-rw-r--r--settings/l10n/sk_SK.json7
-rw-r--r--settings/l10n/sl.js7
-rw-r--r--settings/l10n/sl.json7
-rw-r--r--settings/l10n/sq.js3
-rw-r--r--settings/l10n/sq.json3
-rw-r--r--settings/l10n/sr.js40
-rw-r--r--settings/l10n/sr.json40
-rw-r--r--settings/l10n/sv.js7
-rw-r--r--settings/l10n/sv.json7
-rw-r--r--settings/l10n/ta_LK.js1
-rw-r--r--settings/l10n/ta_LK.json1
-rw-r--r--settings/l10n/th_TH.js1
-rw-r--r--settings/l10n/th_TH.json1
-rw-r--r--settings/l10n/tr.js12
-rw-r--r--settings/l10n/tr.json12
-rw-r--r--settings/l10n/ug.js1
-rw-r--r--settings/l10n/ug.json1
-rw-r--r--settings/l10n/uk.js36
-rw-r--r--settings/l10n/uk.json36
-rw-r--r--settings/l10n/vi.js3
-rw-r--r--settings/l10n/vi.json3
-rw-r--r--settings/l10n/zh_CN.js5
-rw-r--r--settings/l10n/zh_CN.json5
-rw-r--r--settings/l10n/zh_HK.js1
-rw-r--r--settings/l10n/zh_HK.json1
-rw-r--r--settings/l10n/zh_TW.js5
-rw-r--r--settings/l10n/zh_TW.json5
-rw-r--r--settings/personal.php5
-rw-r--r--settings/templates/admin.php15
-rw-r--r--settings/templates/apps.php42
-rw-r--r--settings/templates/personal.php8
-rw-r--r--tests/karma.config.js3
-rw-r--r--tests/lib/appframework/db/mappertest.php10
-rw-r--r--tests/lib/appframework/db/mappertestutility.php69
-rw-r--r--tests/lib/cache/fileglobalgc.php34
-rw-r--r--tests/lib/connector/sabre/custompropertiesbackend.php38
-rw-r--r--tests/lib/files/cache/cache.php22
-rw-r--r--tests/lib/files/pathverificationtest.php26
-rw-r--r--tests/lib/files/storage/storagefactory.php45
-rw-r--r--tests/lib/files/view.php18
-rw-r--r--tests/lib/image.php4
-rw-r--r--tests/lib/repair/repairmimetypes.php532
-rw-r--r--tests/lib/share/share.php35
-rw-r--r--tests/lib/urlgenerator.php17
-rw-r--r--tests/lib/util.php4
-rw-r--r--tests/preseed-config.php40
432 files changed, 7765 insertions, 2403 deletions
diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index 87791e2558e..528156e1a28 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -1,32 +1,37 @@
<?php
-$l = \OC::$server->getL10N('files');
-OCP\App::registerAdmin('files', 'admin');
+\OCP\App::registerAdmin('files', 'admin');
-OCP\App::addNavigationEntry(array("id" => "files_index",
- "order" => 0,
- "href" => OCP\Util::linkTo("files", "index.php"),
- "icon" => OCP\Util::imagePath("core", "places/files.svg"),
- "name" => $l->t("Files")));
+\OC::$server->getNavigationManager()->add(function () {
+ $l = \OC::$server->getL10N('files');
+ return [
+ 'id' => 'files_index',
+ 'order' => 0,
+ 'href' => \OCP\Util::linkTo('files', 'index.php'),
+ 'icon' => \OCP\Util::imagePath('core', 'places/files.svg'),
+ 'name' => $l->t('Files'),
+ ];
+});
\OC::$server->getSearch()->registerProvider('OC\Search\Provider\File', array('apps' => array('files')));
-$templateManager = OC_Helper::getFileTemplateManager();
+$templateManager = \OC_Helper::getFileTemplateManager();
$templateManager->registerTemplate('text/html', 'core/templates/filetemplates/template.html');
$templateManager->registerTemplate('application/vnd.oasis.opendocument.presentation', 'core/templates/filetemplates/template.odp');
$templateManager->registerTemplate('application/vnd.oasis.opendocument.text', 'core/templates/filetemplates/template.odt');
$templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadsheet', 'core/templates/filetemplates/template.ods');
-\OCA\Files\App::getNavigationManager()->add(
- array(
- "id" => 'files',
- "appname" => 'files',
- "script" => 'list.php',
- "order" => 0,
- "name" => $l->t('All files')
- )
-);
+\OCA\Files\App::getNavigationManager()->add(function () {
+ $l = \OC::$server->getL10N('files');
+ return [
+ 'id' => 'files',
+ 'appname' => 'files',
+ 'script' => 'list.php',
+ 'order' => 0,
+ 'name' => $l->t('All files'),
+ ];
+});
\OC::$server->getActivityManager()->registerExtension(function() {
return new \OCA\Files\Activity(
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 1d6b4ad9e07..d546f346ce0 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -488,7 +488,7 @@ table td.filename .uploadtext {
#fileList img.move2trash { display:inline; margin:-8px 0; padding:16px 8px 16px 8px !important; float:right; }
#fileList a.action.delete {
position: absolute;
- right: 0;
+ right: 15px;
padding: 17px 14px;
}
@@ -625,26 +625,3 @@ table.dragshadow td.size {
.mask.transparent{
opacity: 0;
}
-
-.nofilterresults {
- font-size: 16px;
- color: #888;
- position: absolute;
- text-align: center;
- top: 30%;
- width: 100%;
-}
-.nofilterresults h2 {
- font-size: 22px;
- margin-bottom: 10px;
-}
-.nofilterresults [class^="icon-"],
-.nofilterresults [class*=" icon-"] {
- background-size: 64px;
- height: 64px;
- width: 64px;
- margin: 0 auto 15px;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
- opacity: .5;
-}
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 4e0b9e0e6d1..6b0cae209c2 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -266,11 +266,20 @@ OC.Upload = {
// in case folder drag and drop is not supported file will point to a directory
// http://stackoverflow.com/a/20448357
if ( ! file.type && file.size%4096 === 0 && file.size <= 102400) {
+ var dirUploadFailure = false;
try {
var reader = new FileReader();
reader.readAsBinaryString(file);
} catch (NS_ERROR_FILE_ACCESS_DENIED) {
//file is a directory
+ dirUploadFailure = true;
+ }
+ if (file.size === 0) {
+ // file is empty or a directory
+ dirUploadFailure = true;
+ }
+
+ if (dirUploadFailure) {
data.textStatus = 'dirorzero';
data.errorThrown = t('files',
'Unable to upload {filename} as it is a directory or has 0 bytes',
diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js
index e840fb43623..50965e0c1b9 100644
--- a/apps/files/l10n/cs_CZ.js
+++ b/apps/files/l10n/cs_CZ.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Maximální velikost pro odesílání",
"max. possible: " : "největší možná: ",
"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í.",
"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>",
diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json
index c1beb3f627a..118002a6e8d 100644
--- a/apps/files/l10n/cs_CZ.json
+++ b/apps/files/l10n/cs_CZ.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Maximální velikost pro odesílání",
"max. possible: " : "největší možná: ",
"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í.",
"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>",
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index e5c6bb3ace8..026c284a396 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Maksimal upload-størrelse",
"max. possible: " : "max. mulige: ",
"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>",
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index 857da1ff9eb..f56ab672562 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Maksimal upload-størrelse",
"max. possible: " : "max. mulige: ",
"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>",
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 3d9df8f2601..5e741f26d21 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"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>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Deine Dateien zuzugreifen</a>",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 9e19268fe7a..2b27f3b2374 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -89,6 +89,7 @@
"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>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Deine Dateien zuzugreifen</a>",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 93085d4670d..152ffcc0e20 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"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>",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index de7ba13200b..2c11f0183bb 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -89,6 +89,7 @@
"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>",
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 3d74b3fad34..4341129a1c7 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
"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>",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 52a67ae8738..356c1da2169 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Tamaño máximo de subida",
"max. possible: " : "máx. posible:",
"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>",
diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js
index 1d9cad7b2b2..06975ffff0b 100644
--- a/apps/files/l10n/fi_FI.js
+++ b/apps/files/l10n/fi_FI.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko",
"max. possible: " : "suurin mahdollinen:",
"Save" : "Tallenna",
+ "Can not be edited from here due to insufficient permissions." : "Ei muokattavissa täällä puutteellisten oikeuksien vuoksi.",
"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>",
diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json
index a3b4f490e46..e21d7566ed1 100644
--- a/apps/files/l10n/fi_FI.json
+++ b/apps/files/l10n/fi_FI.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko",
"max. possible: " : "suurin mahdollinen:",
"Save" : "Tallenna",
+ "Can not be edited from here due to insufficient permissions." : "Ei muokattavissa täällä puutteellisten oikeuksien vuoksi.",
"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>",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index cc54db6ca6d..5f68d603569 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Taille max. d'envoi",
"max. possible: " : "Max. possible :",
"Save" : "Sauvegarder",
+ "Can not be edited from here due to insufficient permissions." : "Ne peut être modifié ici à cause de permissions insufisantes.",
"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>",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index d37e4dc4ade..a104d6d8424 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Taille max. d'envoi",
"max. possible: " : "Max. possible :",
"Save" : "Sauvegarder",
+ "Can not be edited from here due to insufficient permissions." : "Ne peut être modifié ici à cause de permissions insufisantes.",
"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>",
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index 731d44a3cb5..6371a1f1522 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"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>",
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index 6bf27fe1557..570f5e22bac 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -89,6 +89,7 @@
"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>",
diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js
index bd640df8519..0cbf81347f9 100644
--- a/apps/files/l10n/hu_HU.js
+++ b/apps/files/l10n/hu_HU.js
@@ -70,6 +70,7 @@ OC.L10N.register(
"{dirs} and {files}" : "{dirs} és {files}",
"Favorited" : "Kedvenc",
"Favorite" : "Kedvenc",
+ "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>",
"A file or folder has been <strong>deleted</strong>" : "Fájl vagy könyvtár <strong>törlése</strong>",
@@ -90,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Maximális feltölthető fájlméret",
"max. possible: " : "max. lehetséges: ",
"Save" : "Mentés",
+ "Can not be edited from here due to insufficient permissions." : "Innen nem lehet szerkeszteni az elégtelen 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>",
diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json
index 2332e7720a7..e4cceb381f8 100644
--- a/apps/files/l10n/hu_HU.json
+++ b/apps/files/l10n/hu_HU.json
@@ -68,6 +68,7 @@
"{dirs} and {files}" : "{dirs} és {files}",
"Favorited" : "Kedvenc",
"Favorite" : "Kedvenc",
+ "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>",
"A file or folder has been <strong>deleted</strong>" : "Fájl vagy könyvtár <strong>törlése</strong>",
@@ -88,6 +89,7 @@
"Maximum upload size" : "Maximális feltölthető fájlméret",
"max. possible: " : "max. lehetséges: ",
"Save" : "Mentés",
+ "Can not be edited from here due to insufficient permissions." : "Innen nem lehet szerkeszteni az elégtelen 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>",
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index 8783699c41b..8a9338e3bcf 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Dimensione massima caricamento",
"max. possible: " : "numero mass.: ",
"Save" : "Salva",
+ "Can not be edited from here due to insufficient permissions." : "Non può essere modificato da qui a causa della mancanza di permessi.",
"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>",
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 010f739585d..dfa64cbd284 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Dimensione massima caricamento",
"max. possible: " : "numero mass.: ",
"Save" : "Salva",
+ "Can not be edited from here due to insufficient permissions." : "Non può essere modificato da qui a causa della mancanza di permessi.",
"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>",
diff --git a/apps/files/l10n/lo.js b/apps/files/l10n/lo.js
index 91d52801985..cbe7fcc4a7c 100644
--- a/apps/files/l10n/lo.js
+++ b/apps/files/l10n/lo.js
@@ -1,6 +1,13 @@
OC.L10N.register(
"files",
{
+ "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." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ",
"_%n folder_::_%n folders_" : [""],
"_%n file_::_%n files_" : [""],
"_Uploading %n file_::_Uploading %n files_" : [""],
diff --git a/apps/files/l10n/lo.json b/apps/files/l10n/lo.json
index 82cca5a0661..98b398e7840 100644
--- a/apps/files/l10n/lo.json
+++ b/apps/files/l10n/lo.json
@@ -1,4 +1,11 @@
{ "translations": {
+ "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." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ",
"_%n folder_::_%n folders_" : [""],
"_%n file_::_%n files_" : [""],
"_Uploading %n file_::_Uploading %n files_" : [""],
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index b525ee3ce4e..e6039698a66 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Maximale bestandsgrootte voor uploads",
"max. possible: " : "max. mogelijk: ",
"Save" : "Bewaren",
+ "Can not be edited from here due to insufficient permissions." : "Kan hier niet worden bewerkt wegens onvoldoende permissies.",
"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>",
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index f2dd21e19e9..da7bfa12cf4 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Maximale bestandsgrootte voor uploads",
"max. possible: " : "max. mogelijk: ",
"Save" : "Bewaren",
+ "Can not be edited from here due to insufficient permissions." : "Kan hier niet worden bewerkt wegens onvoldoende permissies.",
"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>",
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index 31ba29d6ad2..f468310169b 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -97,6 +97,8 @@ OC.L10N.register(
"Folder" : "Folder",
"Upload" : "Wyślij",
"Cancel upload" : "Anuluj wysyłanie",
+ "No entries found in this folder" : "Brak wpisów w tym folderze",
+ "Select all" : "Wybierz wszystko",
"Upload too large" : "Ładowany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.",
"Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.",
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index 123650e6aa8..f88c6608f6a 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -95,6 +95,8 @@
"Folder" : "Folder",
"Upload" : "Wyślij",
"Cancel upload" : "Anuluj wysyłanie",
+ "No entries found in this folder" : "Brak wpisów w tym folderze",
+ "Select all" : "Wybierz wszystko",
"Upload too large" : "Ładowany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.",
"Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index bf29fc46d59..151da33a388 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Tamanho máximo para envio",
"max. possible: " : "max. possível:",
"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.",
"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>",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index 57fe2e8d5ed..6c390ed5137 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Tamanho máximo para envio",
"max. possible: " : "max. possível:",
"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.",
"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>",
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index db383fd70da..3bed206883c 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Tamanho máximo de envio",
"max. possible: " : "Máx. possível: ",
"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>",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index d229427ceda..76c123492fb 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Tamanho máximo de envio",
"max. possible: " : "Máx. possível: ",
"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>",
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 93a2e143f16..a6a0e4ad058 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -9,9 +9,9 @@ OC.L10N.register(
"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 fisierului",
- "Error when creating the folder" : "Eroare la crearea folderului",
- "Unable to set upload directory." : "Imposibil de a seta directorul pentru incărcare.",
+ "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ă",
"There is no error, the file uploaded with success" : "Nu a apărut nici o eroare, fișierul a fost încărcat cu succes",
@@ -40,16 +40,16 @@ OC.L10N.register(
"Could not create folder" : "Nu s-a putut crea folderul",
"Rename" : "Redenumește",
"Delete" : "Șterge",
- "Disconnect storage" : "Stocare deconectata",
- "Unshare" : "Anulare",
+ "Disconnect storage" : "Deconectează stocarea",
+ "Unshare" : "Nu mai partaja",
"Download" : "Descarcă",
- "Select" : "Selectează",
+ "Select" : "Alege",
"Pending" : "În așteptare",
"Error moving file." : "Eroare la mutarea fișierului.",
"Error moving file" : "Eroare la mutarea fișierului",
"Error" : "Eroare",
- "Could not rename file" : "Nu s-a putut redenumi fisierul",
- "Error deleting file." : "Eroare la ștergerea fisierului.",
+ "Could not rename file" : "Nu s-a putut redenumi fișierul",
+ "Error deleting file." : "Eroare la ștergerea fișierului.",
"Name" : "Nume",
"Size" : "Mărime",
"Modified" : "Modificat",
@@ -67,13 +67,13 @@ OC.L10N.register(
"_matches '{filter}'_::_match '{filter}'_" : ["","",""],
"{dirs} and {files}" : "{dirs} și {files}",
"Favorite" : "Favorit",
- "A new file or folder has been <strong>created</strong>" : "Un nou fișier sau director a fost <strong>creat</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un nou fișier sau director a fost <strong>modificat</strong>",
- "A file or folder has been <strong>deleted</strong>" : "Un nou fișier sau director a fost <strong>șters</strong>",
- "A file or folder has been <strong>restored</strong>" : "Un fișier sau director a fost <strong>restaurat</strong>",
+ "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>",
+ "A file or folder has been <strong>restored</strong>" : "Un fișier sau dosar a fost <strong>restaurat</strong>",
"You created %1$s" : "Ai creat %1$s",
"%2$s created %1$s" : "%2$s a creat %1$s",
- "%1$s was created in a public folder" : "%1$s a fost creat în directorul public",
+ "%1$s was created in a public folder" : "%1$s a fost creat în dosarul public",
"You changed %1$s" : "Ai schimbat %1$s",
"%2$s changed %1$s" : "%2$s a schimbat %1$s",
"You deleted %1$s" : "Ai şters %1$s",
@@ -97,9 +97,10 @@ OC.L10N.register(
"Folder" : "Dosar",
"Upload" : "Încărcă",
"Cancel upload" : "Anulează încărcarea",
+ "No files yet" : "Niciun fișier încă",
"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 scaneaza"
+ "Currently scanning" : "Acum scanează"
},
"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 42242042988..fc44e5bf312 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -7,9 +7,9 @@
"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 fisierului",
- "Error when creating the folder" : "Eroare la crearea folderului",
- "Unable to set upload directory." : "Imposibil de a seta directorul pentru incărcare.",
+ "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ă",
"There is no error, the file uploaded with success" : "Nu a apărut nici o eroare, fișierul a fost încărcat cu succes",
@@ -38,16 +38,16 @@
"Could not create folder" : "Nu s-a putut crea folderul",
"Rename" : "Redenumește",
"Delete" : "Șterge",
- "Disconnect storage" : "Stocare deconectata",
- "Unshare" : "Anulare",
+ "Disconnect storage" : "Deconectează stocarea",
+ "Unshare" : "Nu mai partaja",
"Download" : "Descarcă",
- "Select" : "Selectează",
+ "Select" : "Alege",
"Pending" : "În așteptare",
"Error moving file." : "Eroare la mutarea fișierului.",
"Error moving file" : "Eroare la mutarea fișierului",
"Error" : "Eroare",
- "Could not rename file" : "Nu s-a putut redenumi fisierul",
- "Error deleting file." : "Eroare la ștergerea fisierului.",
+ "Could not rename file" : "Nu s-a putut redenumi fișierul",
+ "Error deleting file." : "Eroare la ștergerea fișierului.",
"Name" : "Nume",
"Size" : "Mărime",
"Modified" : "Modificat",
@@ -65,13 +65,13 @@
"_matches '{filter}'_::_match '{filter}'_" : ["","",""],
"{dirs} and {files}" : "{dirs} și {files}",
"Favorite" : "Favorit",
- "A new file or folder has been <strong>created</strong>" : "Un nou fișier sau director a fost <strong>creat</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un nou fișier sau director a fost <strong>modificat</strong>",
- "A file or folder has been <strong>deleted</strong>" : "Un nou fișier sau director a fost <strong>șters</strong>",
- "A file or folder has been <strong>restored</strong>" : "Un fișier sau director a fost <strong>restaurat</strong>",
+ "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>",
+ "A file or folder has been <strong>restored</strong>" : "Un fișier sau dosar a fost <strong>restaurat</strong>",
"You created %1$s" : "Ai creat %1$s",
"%2$s created %1$s" : "%2$s a creat %1$s",
- "%1$s was created in a public folder" : "%1$s a fost creat în directorul public",
+ "%1$s was created in a public folder" : "%1$s a fost creat în dosarul public",
"You changed %1$s" : "Ai schimbat %1$s",
"%2$s changed %1$s" : "%2$s a schimbat %1$s",
"You deleted %1$s" : "Ai şters %1$s",
@@ -95,9 +95,10 @@
"Folder" : "Dosar",
"Upload" : "Încărcă",
"Cancel upload" : "Anulează încărcarea",
+ "No files yet" : "Niciun fișier încă",
"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 scaneaza"
+ "Currently scanning" : "Acum scanează"
},"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 162910ca152..b81df425d6c 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"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>",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 40350d08bc2..6292bb28d14 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -89,6 +89,7 @@
"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>",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 4a2fa8950c7..790d95f78a0 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Највећа величина отпремања",
"max. possible: " : "највише могуће:",
"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>",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index dee14e6218e..bb2e392a3f1 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Највећа величина отпремања",
"max. possible: " : "највише могуће:",
"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>",
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 06196181fc4..4dc78965996 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Azami yükleme boyutu",
"max. possible: " : "mümkün olan en fazla: ",
"Save" : "Kaydet",
+ "Can not be edited from here due to insufficient permissions." : "Yetersiz izinler buradan düzenlenemez.",
"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",
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index b3d3adfba23..693edb782e5 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Azami yükleme boyutu",
"max. possible: " : "mümkün olan en fazla: ",
"Save" : "Kaydet",
+ "Can not be edited from here due to insufficient permissions." : "Yetersiz izinler buradan düzenlenemez.",
"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",
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index cc4f89fe7cb..3e83db2aa58 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -4,7 +4,7 @@ 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 - File with this name already exists" : "Не вдалося перемістити %s - файл з таким ім'ям вже існує",
"Could not move %s" : "Не вдалося перемістити %s",
"Permission denied" : "Доступ заборонено",
"The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.",
@@ -12,15 +12,15 @@ OC.L10N.register(
"Error when creating the file" : "Помилка створення файлу",
"Error when creating the folder" : "Помилка створення теки",
"Unable to set upload directory." : "Не вдалося встановити каталог завантаження.",
- "Invalid Token" : "Невірний Маркер",
- "No file was uploaded. Unknown error" : "Не завантажено жодного файлу. Невідома помилка",
- "There is no error, the file uploaded with success" : "Файл успішно вивантажено без помилок.",
+ "Invalid Token" : "Неприпустимий маркер",
+ "No file was uploaded. Unknown error" : "Файл не був завантажений. Невідома помилка",
+ "There is no error, the file uploaded with success" : "Файл успішно завантажений. Помилок немає.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Розмір звантаження перевищує upload_max_filesize параметра в php.ini: ",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Розмір відвантаженого файлу перевищує директиву MAX_FILE_SIZE вказану в HTML формі",
- "The uploaded file was only partially uploaded" : "Файл відвантажено лише частково",
- "No file was uploaded" : "Не відвантажено жодного файлу",
+ "The uploaded file was only partially uploaded" : "Файл завантажений лише частково",
+ "No file was uploaded" : "Не завантажено жодного файлу",
"Missing a temporary folder" : "Відсутній тимчасовий каталог",
- "Failed to write to disk" : "Невдалося записати на диск",
+ "Failed to write to disk" : "Помилка запису на диск",
"Not enough storage available" : "Місця більше немає",
"Upload failed. Could not find uploaded file" : "Завантаження не вдалося. Неможливо знайти завантажений файл.",
"Upload failed. Could not get file info." : "Завантаження не вдалося. Неможливо отримати інформацію про файл.",
@@ -91,6 +91,7 @@ OC.L10N.register(
"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 +111,6 @@ 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" : "Файли і папки, які ви помітили як улюблені з’являться тут"
},
"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 2229f97ef77..cf4eb0eb5cb 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -2,7 +2,7 @@
"Storage not available" : "Сховище не доступне",
"Storage invalid" : "Неправильне сховище",
"Unknown error" : "Невідома помилка",
- "Could not move %s - File with this name already exists" : "Не вдалося перемістити %s - Файл з таким ім'ям вже існує",
+ "Could not move %s - File with this name already exists" : "Не вдалося перемістити %s - файл з таким ім'ям вже існує",
"Could not move %s" : "Не вдалося перемістити %s",
"Permission denied" : "Доступ заборонено",
"The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.",
@@ -10,15 +10,15 @@
"Error when creating the file" : "Помилка створення файлу",
"Error when creating the folder" : "Помилка створення теки",
"Unable to set upload directory." : "Не вдалося встановити каталог завантаження.",
- "Invalid Token" : "Невірний Маркер",
- "No file was uploaded. Unknown error" : "Не завантажено жодного файлу. Невідома помилка",
- "There is no error, the file uploaded with success" : "Файл успішно вивантажено без помилок.",
+ "Invalid Token" : "Неприпустимий маркер",
+ "No file was uploaded. Unknown error" : "Файл не був завантажений. Невідома помилка",
+ "There is no error, the file uploaded with success" : "Файл успішно завантажений. Помилок немає.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Розмір звантаження перевищує upload_max_filesize параметра в php.ini: ",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Розмір відвантаженого файлу перевищує директиву MAX_FILE_SIZE вказану в HTML формі",
- "The uploaded file was only partially uploaded" : "Файл відвантажено лише частково",
- "No file was uploaded" : "Не відвантажено жодного файлу",
+ "The uploaded file was only partially uploaded" : "Файл завантажений лише частково",
+ "No file was uploaded" : "Не завантажено жодного файлу",
"Missing a temporary folder" : "Відсутній тимчасовий каталог",
- "Failed to write to disk" : "Невдалося записати на диск",
+ "Failed to write to disk" : "Помилка запису на диск",
"Not enough storage available" : "Місця більше немає",
"Upload failed. Could not find uploaded file" : "Завантаження не вдалося. Неможливо знайти завантажений файл.",
"Upload failed. Could not get file info." : "Завантаження не вдалося. Неможливо отримати інформацію про файл.",
@@ -89,6 +89,7 @@
"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 +109,6 @@
"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" : "Файли і папки, які ви помітили як улюблені з’являться тут"
},"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/service/tagservice.php b/apps/files/service/tagservice.php
index fe26838552a..cdd51d27f4a 100644
--- a/apps/files/service/tagservice.php
+++ b/apps/files/service/tagservice.php
@@ -48,7 +48,7 @@ class TagService {
* @param string $path path
* @param array $tags array of tags
* @return array list of tags
- * @throws \OCP\NotFoundException if the file does not exist
+ * @throws \OCP\Files\NotFoundException if the file does not exist
*/
public function updateFileTags($path, $tags) {
$fileId = $this->homeFolder->get($path)->getId();
@@ -74,30 +74,27 @@ class TagService {
}
/**
- * Updates the tags of the specified file path.
- * The passed tags are absolute, which means they will
- * replace the actual tag selection.
+ * Get all files for the given tag
*
* @param array $tagName tag name to filter by
* @return FileInfo[] list of matching files
* @throws \Exception if the tag does not exist
*/
public function getFilesByTag($tagName) {
- $nodes = $this->homeFolder->searchByTag(
- $tagName, $this->userSession->getUser()->getUId()
- );
+ try {
+ $fileIds = $this->tagger->getIdsForTag($tagName);
+ } catch (\Exception $e) {
+ return [];
+ }
+
$fileInfos = [];
- foreach ($nodes as $node) {
- try {
+ foreach ($fileIds as $fileId) {
+ $nodes = $this->homeFolder->getById((int) $fileId);
+ foreach ($nodes as $node) {
/** @var \OC\Files\Node\Node $node */
$fileInfos[] = $node->getFileInfo();
- } catch (\Exception $e) {
- // FIXME Should notify the user, when this happens
- // Can not get FileInfo, maybe the connection to the external
- // storage is interrupted.
}
}
-
return $fileInfos;
}
}
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index f2292bfae36..47f15d8a148 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -57,7 +57,7 @@
<p><?php p($l->t('Upload some content or sync with your devices!')); ?></p>
</div>
-<div class="nofilterresults hidden">
+<div class="nofilterresults emptycontent hidden">
<div class="icon-search"></div>
<h2><?php p($l->t('No entries found in this folder')); ?></h2>
<p></p>
diff --git a/apps/files_encryption/l10n/fr.js b/apps/files_encryption/l10n/fr.js
index 64a600500eb..09ddd64cb40 100644
--- a/apps/files_encryption/l10n/fr.js
+++ b/apps/files_encryption/l10n/fr.js
@@ -21,7 +21,7 @@ OC.L10N.register(
"Could not update file recovery" : "Impossible de mettre à jour les fichiers de récupération",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée n'est pas valide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire de ce fichier de le repartager avec vous.",
+ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier : il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le partager à nouveau avec vous.",
"Unknown error. Please check your system settings or contact your administrator" : "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter un administrateur.",
"Initial encryption started... This can take some time. Please wait." : "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.",
"Initial encryption running... Please try again later." : "Chiffrement initial en cours... Veuillez ré-essayer ultérieurement.",
diff --git a/apps/files_encryption/l10n/fr.json b/apps/files_encryption/l10n/fr.json
index 1c64ab1f3c0..3b439872250 100644
--- a/apps/files_encryption/l10n/fr.json
+++ b/apps/files_encryption/l10n/fr.json
@@ -19,7 +19,7 @@
"Could not update file recovery" : "Impossible de mettre à jour les fichiers de récupération",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée n'est pas valide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire de ce fichier de le repartager avec vous.",
+ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier : il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le partager à nouveau avec vous.",
"Unknown error. Please check your system settings or contact your administrator" : "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter un administrateur.",
"Initial encryption started... This can take some time. Please wait." : "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.",
"Initial encryption running... Please try again later." : "Chiffrement initial en cours... Veuillez ré-essayer ultérieurement.",
diff --git a/apps/files_encryption/l10n/lo.js b/apps/files_encryption/l10n/lo.js
new file mode 100644
index 00000000000..b5b586d1028
--- /dev/null
+++ b/apps/files_encryption/l10n/lo.js
@@ -0,0 +1,6 @@
+OC.L10N.register(
+ "files_encryption",
+ {
+ "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ"
+},
+"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/lo.json b/apps/files_encryption/l10n/lo.json
new file mode 100644
index 00000000000..1a02813027d
--- /dev/null
+++ b/apps/files_encryption/l10n/lo.json
@@ -0,0 +1,4 @@
+{ "translations": {
+ "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sr.js b/apps/files_encryption/l10n/sr.js
index 51070c207a5..dec2970e359 100644
--- a/apps/files_encryption/l10n/sr.js
+++ b/apps/files_encryption/l10n/sr.js
@@ -25,7 +25,8 @@ OC.L10N.register(
"Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Проверите поставке вашег система или контактирајте администратора.",
"Initial encryption started... This can take some time. Please wait." : "Почетно шифровање је покренуто... Ово може потрајати. Молим, сачекајте.",
"Initial encryption running... Please try again later." : "Почетно шифровање ради... Покушајте касније.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Проверите да је „OpenSSL“ заједно са „PHP“ проширењем, укључен и прописно подешен. За сада, шифровање је искључено.",
+ "Missing requirements." : "Захтеви нису испуњени.",
+ "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Проверите да је ОпенССЛ заједно са ПХП проширењем, укључен и прописно подешен. За сада, шифровање је искључено.",
"Following users are not set up for encryption:" : "Следећи корисници нису подешени за шифровање:",
"Go directly to your %spersonal settings%s." : "Идите право на ваше %sличне поставке%s.",
"Server-side Encryption" : "Шифровање на страни сервера",
@@ -41,6 +42,7 @@ OC.L10N.register(
"Repeat New Recovery key password" : "Поновите лозинку кључа опоравка",
"Change Password" : "Измени лозинку",
"Your private key password no longer matches your log-in password." : "Лозинка вашег личног кључа више није иста као ваша лозинка за пријаву.",
+ "Set your old private key password to your current log-in password:" : "Промените ваш стари приватни кључ-лозинку у вашу тренутну улазну лозинку:",
" If you don't remember your old password you can ask your administrator to recover your files." : "Ако се не сећате старе лозинке, можете затражити од администратора да опорави ваше фајлове.",
"Old log-in password" : "Стара лозинка за пријаву",
"Current log-in password" : "Тренутна лозинка за пријаву",
diff --git a/apps/files_encryption/l10n/sr.json b/apps/files_encryption/l10n/sr.json
index 125302e9531..6c39d417e38 100644
--- a/apps/files_encryption/l10n/sr.json
+++ b/apps/files_encryption/l10n/sr.json
@@ -23,7 +23,8 @@
"Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Проверите поставке вашег система или контактирајте администратора.",
"Initial encryption started... This can take some time. Please wait." : "Почетно шифровање је покренуто... Ово може потрајати. Молим, сачекајте.",
"Initial encryption running... Please try again later." : "Почетно шифровање ради... Покушајте касније.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Проверите да је „OpenSSL“ заједно са „PHP“ проширењем, укључен и прописно подешен. За сада, шифровање је искључено.",
+ "Missing requirements." : "Захтеви нису испуњени.",
+ "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Проверите да је ОпенССЛ заједно са ПХП проширењем, укључен и прописно подешен. За сада, шифровање је искључено.",
"Following users are not set up for encryption:" : "Следећи корисници нису подешени за шифровање:",
"Go directly to your %spersonal settings%s." : "Идите право на ваше %sличне поставке%s.",
"Server-side Encryption" : "Шифровање на страни сервера",
@@ -39,6 +40,7 @@
"Repeat New Recovery key password" : "Поновите лозинку кључа опоравка",
"Change Password" : "Измени лозинку",
"Your private key password no longer matches your log-in password." : "Лозинка вашег личног кључа више није иста као ваша лозинка за пријаву.",
+ "Set your old private key password to your current log-in password:" : "Промените ваш стари приватни кључ-лозинку у вашу тренутну улазну лозинку:",
" If you don't remember your old password you can ask your administrator to recover your files." : "Ако се не сећате старе лозинке, можете затражити од администратора да опорави ваше фајлове.",
"Old log-in password" : "Стара лозинка за пријаву",
"Current log-in password" : "Тренутна лозинка за пријаву",
diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php
index 644ac895a8f..7a60f0d685b 100644
--- a/apps/files_encryption/lib/stream.php
+++ b/apps/files_encryption/lib/stream.php
@@ -64,15 +64,17 @@ class Stream {
private $keyId;
private $handle; // Resource returned by fopen
private $meta = array(); // Header / meta for source stream
- private $writeCache;
+ private $cache; // Current block unencrypted
+ private $position; // Current pointer position in the unencrypted stream
+ private $writeFlag; // Flag to write current block when leaving it
private $size;
+ private $headerSize = 0; // Size of header
private $unencryptedSize;
private $publicKey;
private $encKeyfile;
private $newFile; // helper var, we only need to write the keyfile for new files
private $isLocalTmpFile = false; // do we operate on a local tmp file
private $localTmpFile; // path of local tmp file
- private $headerWritten = false;
private $containHeader = false; // the file contain a header
private $cipher; // cipher used for encryption/decryption
/** @var \OCA\Files_Encryption\Util */
@@ -158,6 +160,17 @@ class Stream {
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
+ $this->position = 0;
+ $this->cache = '';
+ $this->writeFlag = 0;
+
+ // Setting handle so it can be used for reading the header
+ if ($this->isLocalTmpFile) {
+ $this->handle = fopen($this->localTmpFile, $mode);
+ } else {
+ $this->handle = $this->rootView->fopen($this->rawPath, $mode);
+ }
+
if (
$mode === 'w'
or $mode === 'w+'
@@ -169,15 +182,12 @@ class Stream {
$this->unencryptedSize = 0;
} else {
$this->size = $this->rootView->filesize($this->rawPath);
+ \OC_FileProxy::$enabled = true;
+ $this->unencryptedSize = $this->rootView->filesize($this->rawPath);
+ \OC_FileProxy::$enabled = false;
$this->readHeader();
}
- if ($this->isLocalTmpFile) {
- $this->handle = fopen($this->localTmpFile, $mode);
- } else {
- $this->handle = $this->rootView->fopen($this->rawPath, $mode);
- }
-
\OC_FileProxy::$enabled = $proxyStatus;
if (!is_resource($this->handle)) {
@@ -200,14 +210,8 @@ class Stream {
private function readHeader() {
- if ($this->isLocalTmpFile) {
- $handle = fopen($this->localTmpFile, 'r');
- } else {
- $handle = $this->rootView->fopen($this->rawPath, 'r');
- }
-
- if (is_resource($handle)) {
- $data = fread($handle, Crypt::BLOCKSIZE);
+ if (is_resource($this->handle)) {
+ $data = fread($this->handle, Crypt::BLOCKSIZE);
$header = Crypt::parseHeader($data);
$this->cipher = Crypt::getCipher($header);
@@ -215,9 +219,16 @@ class Stream {
// remeber that we found a header
if (!empty($header)) {
$this->containHeader = true;
+ $this->headerSize = Crypt::BLOCKSIZE;
+ // if there's no header then decrypt the block and store it in the cache
+ } else {
+ if (!$this->getKey()) {
+ throw new \Exception('Encryption key not found for "' . $this->rawPath . '" during attempted read via stream');
+ } else {
+ $this->cache = Crypt::symmetricDecryptFileContent($data, $this->plainKey, $this->cipher);
+ }
}
- fclose($handle);
}
}
@@ -226,7 +237,7 @@ class Stream {
* @return int position of the file pointer
*/
public function stream_tell() {
- return ftell($this->handle);
+ return $this->position;
}
/**
@@ -234,18 +245,41 @@ class Stream {
* @param int $whence
* @return bool true if fseek was successful, otherwise false
*/
+
+ // seeking the stream tries to move the pointer on the encrypted stream to the beginning of the target block
+ // if that works, it flushes the current block and changes the position in the unencrypted stream
public function stream_seek($offset, $whence = SEEK_SET) {
+ // this wrapper needs to return "true" for success.
+ // the fseek call itself returns 0 on succeess
- $this->flush();
+ $return=false;
- // ignore the header and just overstep it
- if ($this->containHeader) {
- $offset += Crypt::BLOCKSIZE;
+ switch($whence) {
+ case SEEK_SET:
+ if($offset < $this->unencryptedSize && $offset >= 0) {
+ $newPosition=$offset;
+ }
+ break;
+ case SEEK_CUR:
+ if($offset>=0) {
+ $newPosition=$offset+$this->position;
+ }
+ break;
+ case SEEK_END:
+ if($this->unencryptedSize + $offset >= 0) {
+ $newPosition=$this->unencryptedSize+$offset;
+ }
+ break;
+ default:
+ return $return;
}
-
- // this wrapper needs to return "true" for success.
- // the fseek call itself returns 0 on succeess
- return !fseek($this->handle, $offset, $whence);
+ $newFilePosition=floor($newPosition/6126)*Crypt::BLOCKSIZE+$this->headerSize;
+ if (fseek($this->handle, $newFilePosition)===0) {
+ $this->flush();
+ $this->position=$newPosition;
+ $return=true;
+ }
+ return $return;
}
@@ -256,35 +290,33 @@ class Stream {
*/
public function stream_read($count) {
- $this->writeCache = '';
+ $result = '';
- if ($count !== Crypt::BLOCKSIZE) {
- \OCP\Util::writeLog('Encryption library', 'PHP "bug" 21641 no longer holds, decryption system requires refactoring', \OCP\Util::FATAL);
- throw new EncryptionException('expected a block size of 8192 byte', EncryptionException::UNEXPECTED_BLOCK_SIZE);
- }
-
- // Get the data from the file handle
- $data = fread($this->handle, $count);
-
- // if this block contained the header we move on to the next block
- if (Crypt::isHeader($data)) {
- $data = fread($this->handle, $count);
- }
-
- $result = null;
+ // limit to the end of the unencrypted file; otherwise getFileSize will fail and it is good practise anyway
+ $count=min($count,$this->unencryptedSize - $this->position);
- if (strlen($data)) {
+ // loop over the 6126 sized unencrypted blocks
+ while ($count > 0) {
- if (!$this->getKey()) {
+ $remainingLength = $count;
- // Error! We don't have a key to decrypt the file with
- throw new \Exception(
- 'Encryption key not found for "' . $this->rawPath . '" during attempted read via stream');
+ // update the cache of the current block
+ $this->readCache();
+
+ // determine the relative position in the current block
+ $blockPosition=($this->position % 6126);
+ // if entire read inside current block then only position needs to be updated
+ if ($remainingLength<(6126 - $blockPosition)) {
+ $result .= substr($this->cache,$blockPosition,$remainingLength);
+ $this->position += $remainingLength;
+ $count=0;
+ // otherwise remainder of current block is fetched, the block is flushed and the position updated
} else {
-
- // Decrypt data
- $result = Crypt::symmetricDecryptFileContent($data, $this->plainKey, $this->cipher);
+ $result .= substr($this->cache,$blockPosition);
+ $this->flush();
+ $this->position += (6126 - $blockPosition);
+ $count -= (6126 - $blockPosition);
}
}
@@ -328,16 +360,14 @@ class Stream {
}
- $util = new Util($this->rootView, $this->userId);
-
// Fetch and decrypt keyfile
// Fetch existing keyfile
- $this->encKeyfile = Keymanager::getFileKey($this->rootView, $util, $this->relPath);
+ $this->encKeyfile = Keymanager::getFileKey($this->rootView, $this->util, $this->relPath);
// If a keyfile already exists
if ($this->encKeyfile) {
- $shareKey = Keymanager::getShareKey($this->rootView, $this->keyId, $util, $this->relPath);
+ $shareKey = Keymanager::getShareKey($this->rootView, $this->keyId, $this->util, $this->relPath);
// if there is no valid private key return false
if ($this->privateKey === false) {
@@ -383,6 +413,9 @@ class Stream {
fwrite($this->handle, $paddedHeader);
$this->headerWritten = true;
+ $this->containHeader = true;
+ $this->headerSize = Crypt::BLOCKSIZE;
+ $this->size += $this->headerSize;
}
/**
@@ -390,7 +423,7 @@ class Stream {
* @param string $data data to be written to disk
* @note the data will be written to the path stored in the stream handle, set in stream_open()
* @note $data is only ever be a maximum of 8192 bytes long. This is set by PHP internally. stream_write() is called multiple times in a loop on data larger than 8192 bytes
- * @note Because the encryption process used increases the length of $data, a writeCache is used to carry over data which would not fit in the required block size
+ * @note Because the encryption process used increases the length of $data, a cache is used to carry over data which would not fit in the required block size
* @note Padding is added to each encrypted block to ensure that the resulting block is exactly 8192 bytes. This is removed during stream_read
* @note PHP automatically updates the file pointer after writing data to reflect it's length. There is generally no need to update the poitner manually using fseek
*/
@@ -402,24 +435,10 @@ class Stream {
return strlen($data);
}
- if ($this->headerWritten === false) {
+ if ($this->size === 0) {
$this->writeHeader();
}
- // Disable the file proxies so that encryption is not
- // automatically attempted when the file is written to disk -
- // we are handling that separately here and we don't want to
- // get into an infinite loop
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Get the length of the unencrypted data that we are handling
- $length = strlen($data);
-
- // Find out where we are up to in the writing of data to the
- // file
- $pointer = ftell($this->handle);
-
// Get / generate the keyfile for the file we're handling
// If we're writing a new file (not overwriting an existing
// one), save the newly generated keyfile
@@ -429,68 +448,51 @@ class Stream {
}
- // If extra data is left over from the last round, make sure it
- // is integrated into the next 6126 / 8192 block
- if ($this->writeCache) {
-
- // Concat writeCache to start of $data
- $data = $this->writeCache . $data;
-
- // Clear the write cache, ready for reuse - it has been
- // flushed and its old contents processed
- $this->writeCache = '';
+ $length=0;
- }
-
- // While there still remains some data to be processed & written
+ // loop over $data to fit it in 6126 sized unencrypted blocks
while (strlen($data) > 0) {
- // Remaining length for this iteration, not of the
- // entire file (may be greater than 8192 bytes)
$remainingLength = strlen($data);
- // If data remaining to be written is less than the
- // size of 1 6126 byte block
- if ($remainingLength < 6126) {
-
- // Set writeCache to contents of $data
- // The writeCache will be carried over to the
- // next write round, and added to the start of
- // $data to ensure that written blocks are
- // always the correct length. If there is still
- // data in writeCache after the writing round
- // has finished, then the data will be written
- // to disk by $this->flush().
- $this->writeCache = $data;
-
- // Clear $data ready for next round
- $data = '';
+ // set the cache to the current 6126 block
+ $this->readCache();
+
+ // only allow writes on seekable streams, or at the end of the encrypted stream
+ // for seekable streams the pointer is moved back to the beginning of the encrypted block
+ // flush will start writing there when the position moves to another block
+ if((fseek($this->handle, floor($this->position/6126)*Crypt::BLOCKSIZE + $this->headerSize) === 0) || (floor($this->position/6126)*Crypt::BLOCKSIZE + $this->headerSize === $this->size)) {
+
+ // switch the writeFlag so flush() will write the block
+ $this->writeFlag=1;
+
+ // determine the relative position in the current block
+ $blockPosition=($this->position % 6126);
+
+ // check if $data fits in current block
+ // if so, overwrite existing data (if any)
+ // update position and liberate $data
+ if ($remainingLength<(6126 - $blockPosition)) {
+ $this->cache=substr($this->cache,0,$blockPosition).$data.substr($this->cache,$blockPosition+$remainingLength);
+ $this->position += $remainingLength;
+ $length += $remainingLength;
+ $data = '';
+ // if $data doens't fit the current block, the fill the current block and reiterate
+ // after the block is filled, it is flushed and $data is updated
+ } else {
+ $this->cache=substr($this->cache,0,$blockPosition).substr($data,0,6126-$blockPosition);
+ $this->flush();
+ $this->position += (6126 - $blockPosition);
+ $length += (6126 - $blockPosition);
+ $data = substr($data, 6126 - $blockPosition);
+ }
} else {
-
- // Read the chunk from the start of $data
- $chunk = substr($data, 0, 6126);
-
- $encrypted = $this->preWriteEncrypt($chunk, $this->plainKey);
-
- // Write the data chunk to disk. This will be
- // attended to the last data chunk if the file
- // being handled totals more than 6126 bytes
- fwrite($this->handle, $encrypted);
-
- // Remove the chunk we just processed from
- // $data, leaving only unprocessed data in $data
- // var, for handling on the next round
- $data = substr($data, 6126);
-
+ $data='';
}
-
}
- $this->size = max($this->size, $pointer + $length);
- $this->unencryptedSize += $length;
-
- \OC_FileProxy::$enabled = $proxyStatus;
+ $this->unencryptedSize = max($this->unencryptedSize,$this->position);
return $length;
@@ -537,6 +539,7 @@ class Stream {
*/
public function stream_flush() {
+ $this->flush();
return fflush($this->handle);
// Not a typo: http://php.net/manual/en/function.fflush.php
@@ -546,21 +549,48 @@ class Stream {
* @return bool
*/
public function stream_eof() {
- return feof($this->handle);
+ return ($this->position>=$this->unencryptedSize);
}
private function flush() {
- if ($this->writeCache) {
-
+ // write to disk only when writeFlag was set to 1
+ if ($this->writeFlag === 1) {
+ // Disable the file proxies so that encryption is not
+ // automatically attempted when the file is written to disk -
+ // we are handling that separately here and we don't want to
+ // get into an infinite loop
+ $proxyStatus = \OC_FileProxy::$enabled;
+ \OC_FileProxy::$enabled = false;
// Set keyfile property for file in question
$this->getKey();
-
- $encrypted = $this->preWriteEncrypt($this->writeCache, $this->plainKey);
-
+ $encrypted = $this->preWriteEncrypt($this->cache, $this->plainKey);
fwrite($this->handle, $encrypted);
+ $this->writeFlag = 0;
+ $this->size = max($this->size,ftell($this->handle));
+ \OC_FileProxy::$enabled = $proxyStatus;
+ }
+ // always empty the cache (otherwise readCache() will not fill it with the new block)
+ $this->cache = '';
+ }
- $this->writeCache = '';
+ private function readCache() {
+ // cache should always be empty string when this function is called
+ // don't try to fill the cache when trying to write at the end of the unencrypted file when it coincides with new block
+ if ($this->cache === '' && !($this->position===$this->unencryptedSize && ($this->position % 6126)===0)) {
+ // Get the data from the file handle
+ $data = fread($this->handle, Crypt::BLOCKSIZE);
+ $result = '';
+ if (strlen($data)) {
+ if (!$this->getKey()) {
+ // Error! We don't have a key to decrypt the file with
+ throw new \Exception('Encryption key not found for "'. $this->rawPath . '" during attempted read via stream');
+ } else {
+ // Decrypt data
+ $result = Crypt::symmetricDecryptFileContent($data, $this->plainKey, $this->cipher);
+ }
+ }
+ $this->cache = $result;
}
}
@@ -581,7 +611,7 @@ class Stream {
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
- if ($this->rootView->file_exists($this->rawPath) && $this->size === 0) {
+ if ($this->rootView->file_exists($this->rawPath) && $this->size === $this->headerSize) {
fclose($this->handle);
$this->rootView->unlink($this->rawPath);
}
@@ -598,7 +628,7 @@ class Stream {
$this->meta['mode'] !== 'r' &&
$this->meta['mode'] !== 'rb' &&
$this->isLocalTmpFile === false &&
- $this->size > 0 &&
+ $this->size > $this->headerSize &&
$this->unencryptedSize > 0
) {
diff --git a/apps/files_external/ajax/addMountPoint.php b/apps/files_external/ajax/addMountPoint.php
deleted file mode 100644
index 4e27ef98756..00000000000
--- a/apps/files_external/ajax/addMountPoint.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-OCP\JSON::checkAppEnabled('files_external');
-OCP\JSON::callCheck();
-
-if ($_POST['isPersonal'] == 'true') {
- OCP\JSON::checkLoggedIn();
- $isPersonal = true;
-} else {
- OCP\JSON::checkAdminUser();
- $isPersonal = false;
-}
-
-$mountPoint = (string)$_POST['mountPoint'];
-$oldMountPoint = (string)$_POST['oldMountPoint'];
-$class = (string)$_POST['class'];
-$options = (array)$_POST['classOptions'];
-$type = (string)$_POST['mountType'];
-$applicable = (string)$_POST['applicable'];
-
-if ($oldMountPoint and $oldMountPoint !== $mountPoint) {
- OC_Mount_Config::removeMountPoint($oldMountPoint, $type, $applicable, $isPersonal);
-}
-
-$status = OC_Mount_Config::addMountPoint($mountPoint, $class, $options, $type, $applicable, $isPersonal);
-OCP\JSON::success(array('data' => array('message' => $status)));
diff --git a/apps/files_external/ajax/removeMountPoint.php b/apps/files_external/ajax/removeMountPoint.php
deleted file mode 100644
index 0870911544b..00000000000
--- a/apps/files_external/ajax/removeMountPoint.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-OCP\JSON::checkAppEnabled('files_external');
-OCP\JSON::callCheck();
-
-if (!isset($_POST['isPersonal']))
- return;
-if (!isset($_POST['mountPoint']))
- return;
-if (!isset($_POST['mountType']))
- return;
-if (!isset($_POST['applicable']))
- return;
-
-if ($_POST['isPersonal'] == 'true') {
- OCP\JSON::checkLoggedIn();
- $isPersonal = true;
-} else {
- OCP\JSON::checkAdminUser();
- $isPersonal = false;
-}
-
-OC_Mount_Config::removeMountPoint((string)$_POST['mountPoint'], (string)$_POST['mountType'], (string)$_POST['applicable'], $isPersonal);
diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index e74ce3594c1..7ea1e96bf2f 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -6,6 +6,8 @@
* later.
* See the COPYING-README file.
*/
+$app = new \OCA\Files_external\Appinfo\Application();
+
$l = \OC::$server->getL10N('files_external');
OC::$CLASSPATH['OC\Files\Storage\StreamWrapper'] = 'files_external/lib/streamwrapper.php';
diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php
index b1605bb98a8..3e6b80ccb48 100644
--- a/apps/files_external/appinfo/application.php
+++ b/apps/files_external/appinfo/application.php
@@ -12,12 +12,13 @@ use \OCA\Files_External\Controller\AjaxController;
use \OCP\AppFramework\App;
use \OCP\IContainer;
- /**
- * @package OCA\Files_External\Appinfo
- */
+/**
+ * @package OCA\Files_External\Appinfo
+ */
class Application extends App {
public function __construct(array $urlParams=array()) {
parent::__construct('files_external', $urlParams);
+
$container = $this->getContainer();
/**
diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php
index 5c7c4eca909..a090fca20ea 100644
--- a/apps/files_external/appinfo/routes.php
+++ b/apps/files_external/appinfo/routes.php
@@ -22,28 +22,29 @@
namespace OCA\Files_External\Appinfo;
+/**
+ * @var $this \OC\Route\Router
+ **/
$application = new Application();
$application->registerRoutes(
- $this,
- array(
- 'routes' => array(
- array(
- 'name' => 'Ajax#getSshKeys',
- 'url' => '/ajax/sftp_key.php',
- 'verb' => 'POST',
- 'requirements' => array()
- )
- )
- )
+ $this,
+ array(
+ 'resources' => array(
+ 'global_storages' => array('url' => '/globalstorages'),
+ 'user_storages' => array('url' => '/userstorages'),
+ ),
+ 'routes' => array(
+ array(
+ 'name' => 'Ajax#getSshKeys',
+ 'url' => '/ajax/sftp_key.php',
+ 'verb' => 'POST',
+ 'requirements' => array()
+ )
+ )
+ )
);
-/** @var $this OC\Route\Router */
-
-$this->create('files_external_add_mountpoint', 'ajax/addMountPoint.php')
- ->actionInclude('files_external/ajax/addMountPoint.php');
-$this->create('files_external_remove_mountpoint', 'ajax/removeMountPoint.php')
- ->actionInclude('files_external/ajax/removeMountPoint.php');
-
+// TODO: move these to app framework
$this->create('files_external_add_root_certificate', 'ajax/addRootCertificate.php')
->actionInclude('files_external/ajax/addRootCertificate.php');
$this->create('files_external_remove_root_certificate', 'ajax/removeRootCertificate.php')
diff --git a/apps/files_external/controller/globalstoragescontroller.php b/apps/files_external/controller/globalstoragescontroller.php
new file mode 100644
index 00000000000..819cccdbde8
--- /dev/null
+++ b/apps/files_external/controller/globalstoragescontroller.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * ownCloud - files_external
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Vincent Petry <pvince81@owncloud.com>
+ * @copyright Vincent Petry 2015
+ */
+
+namespace OCA\Files_External\Controller;
+
+
+use \OCP\IConfig;
+use \OCP\IUserSession;
+use \OCP\IRequest;
+use \OCP\IL10N;
+use \OCP\AppFramework\Http\DataResponse;
+use \OCP\AppFramework\Controller;
+use \OCP\AppFramework\Http;
+use \OCA\Files_external\Service\GlobalStoragesService;
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+
+/**
+ * Global storages controller
+ */
+class GlobalStoragesController extends StoragesController {
+ /**
+ * Creates a new global storages controller.
+ *
+ * @param string $AppName application name
+ * @param IRequest $request request object
+ * @param IL10N $l10n l10n service
+ * @param GlobalStoragesService $globalStoragesService storage service
+ */
+ public function __construct(
+ $AppName,
+ IRequest $request,
+ IL10N $l10n,
+ GlobalStoragesService $globalStoragesService
+ ) {
+ parent::__construct(
+ $AppName,
+ $request,
+ $l10n,
+ $globalStoragesService
+ );
+ }
+
+ /**
+ * Create an external storage entry.
+ *
+ * @param string $mountPoint storage mount point
+ * @param string $backendClass backend class name
+ * @param array $backendOptions backend-specific options
+ * @param array $mountOptions mount-specific options
+ * @param array $applicableUsers users for which to mount the storage
+ * @param array $applicableGroups groups for which to mount the storage
+ * @param int $priority priority
+ *
+ * @return DataResponse
+ */
+ public function create(
+ $mountPoint,
+ $backendClass,
+ $backendOptions,
+ $mountOptions,
+ $applicableUsers,
+ $applicableGroups,
+ $priority
+ ) {
+ $newStorage = new StorageConfig();
+ $newStorage->setMountPoint($mountPoint);
+ $newStorage->setBackendClass($backendClass);
+ $newStorage->setBackendOptions($backendOptions);
+ $newStorage->setMountOptions($mountOptions);
+ $newStorage->setApplicableUsers($applicableUsers);
+ $newStorage->setApplicableGroups($applicableGroups);
+ $newStorage->setPriority($priority);
+
+ $response = $this->validate($newStorage);
+ if (!empty($response)) {
+ return $response;
+ }
+
+ $newStorage = $this->service->addStorage($newStorage);
+
+ $this->updateStorageStatus($newStorage);
+
+ return new DataResponse(
+ $newStorage,
+ Http::STATUS_CREATED
+ );
+ }
+
+ /**
+ * Update an external storage entry.
+ *
+ * @param int $id storage id
+ * @param string $mountPoint storage mount point
+ * @param string $backendClass backend class name
+ * @param array $backendOptions backend-specific options
+ * @param array $mountOptions mount-specific options
+ * @param array $applicableUsers users for which to mount the storage
+ * @param array $applicableGroups groups for which to mount the storage
+ * @param int $priority priority
+ *
+ * @return DataResponse
+ */
+ public function update(
+ $id,
+ $mountPoint,
+ $backendClass,
+ $backendOptions,
+ $mountOptions,
+ $applicableUsers,
+ $applicableGroups,
+ $priority
+ ) {
+ $storage = new StorageConfig($id);
+ $storage->setMountPoint($mountPoint);
+ $storage->setBackendClass($backendClass);
+ $storage->setBackendOptions($backendOptions);
+ $storage->setMountOptions($mountOptions);
+ $storage->setApplicableUsers($applicableUsers);
+ $storage->setApplicableGroups($applicableGroups);
+ $storage->setPriority($priority);
+
+ $response = $this->validate($storage);
+ if (!empty($response)) {
+ return $response;
+ }
+
+ try {
+ $storage = $this->service->updateStorage($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->updateStorageStatus($storage);
+
+ return new DataResponse(
+ $storage,
+ Http::STATUS_OK
+ );
+
+ }
+
+}
diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php
new file mode 100644
index 00000000000..b454dff7027
--- /dev/null
+++ b/apps/files_external/controller/storagescontroller.php
@@ -0,0 +1,167 @@
+<?php
+/**
+ * ownCloud - files_external
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Vincent Petry <pvince81@owncloud.com>
+ * @copyright Vincent Petry 2014
+ */
+
+namespace OCA\Files_External\Controller;
+
+
+use \OCP\IConfig;
+use \OCP\IUserSession;
+use \OCP\IRequest;
+use \OCP\IL10N;
+use \OCP\AppFramework\Http\DataResponse;
+use \OCP\AppFramework\Controller;
+use \OCP\AppFramework\Http;
+use \OCA\Files_external\Service\StoragesService;
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+
+/**
+ * Base class for storages controllers
+ */
+abstract class StoragesController extends Controller {
+
+ /**
+ * L10N service
+ *
+ * @var IL10N
+ */
+ protected $l10n;
+
+ /**
+ * Storages service
+ *
+ * @var StoragesService
+ */
+ protected $service;
+
+ /**
+ * Creates a new storages controller.
+ *
+ * @param string $AppName application name
+ * @param IRequest $request request object
+ * @param IL10N $l10n l10n service
+ * @param StoragesService $storagesService storage service
+ */
+ public function __construct(
+ $AppName,
+ IRequest $request,
+ IL10N $l10n,
+ StoragesService $storagesService
+ ) {
+ parent::__construct($AppName, $request);
+ $this->l10n = $l10n;
+ $this->service = $storagesService;
+ }
+
+ /**
+ * Validate storage config
+ *
+ * @param StorageConfig $storage storage config
+ *
+ * @return DataResponse|null returns response in case of validation error
+ */
+ protected function validate(StorageConfig $storage) {
+ $mountPoint = $storage->getMountPoint();
+ if ($mountPoint === '' || $mountPoint === '/') {
+ return new DataResponse(
+ array(
+ 'message' => (string)$this->l10n->t('Invalid mount point')
+ ),
+ Http::STATUS_UNPROCESSABLE_ENTITY
+ );
+ }
+
+ // TODO: validate that other attrs are set
+
+ $backends = \OC_Mount_Config::getBackends();
+ if (!isset($backends[$storage->getBackendClass()])) {
+ // invalid backend
+ return new DataResponse(
+ array(
+ 'message' => (string)$this->l10n->t('Invalid storage backend "%s"', array($storage->getBackendClass()))
+ ),
+ Http::STATUS_UNPROCESSABLE_ENTITY
+ );
+ }
+
+ return null;
+ }
+
+ /**
+ * Check whether the given storage is available / valid.
+ *
+ * Note that this operation can be time consuming depending
+ * on whether the remote storage is available or not.
+ *
+ * @param StorageConfig $storage storage configuration
+ */
+ protected function updateStorageStatus(StorageConfig &$storage) {
+ // update status (can be time-consuming)
+ $storage->setStatus(
+ \OC_Mount_Config::getBackendStatus(
+ $storage->getBackendClass(),
+ $storage->getBackendOptions(),
+ false
+ )
+ );
+ }
+
+ /**
+ * Get an external storage entry.
+ *
+ * @param int $id storage id
+ *
+ * @return DataResponse
+ */
+ 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
+ );
+ }
+
+ return new DataResponse(
+ $storage,
+ Http::STATUS_OK
+ );
+ }
+
+ /**
+ * Deletes the storage with the given id.
+ *
+ * @param int $id storage id
+ *
+ * @return DataResponse
+ */
+ public function destroy($id) {
+ try {
+ $this->service->removeStorage($id);
+ } catch (NotFoundException $e) {
+ return new DataResponse(
+ [
+ 'message' => (string)$this->l10n->t('Storage with id "%i" not found', array($id))
+ ],
+ Http::STATUS_NOT_FOUND
+ );
+ }
+
+ return new DataResponse([], Http::STATUS_NO_CONTENT);
+ }
+
+}
+
diff --git a/apps/files_external/controller/userstoragescontroller.php b/apps/files_external/controller/userstoragescontroller.php
new file mode 100644
index 00000000000..86557988ea3
--- /dev/null
+++ b/apps/files_external/controller/userstoragescontroller.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * ownCloud - files_external
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Vincent Petry <pvince81@owncloud.com>
+ * @copyright Vincent Petry 2015
+ */
+
+namespace OCA\Files_External\Controller;
+
+
+use \OCP\IConfig;
+use \OCP\IUserSession;
+use \OCP\IRequest;
+use \OCP\IL10N;
+use \OCP\AppFramework\Http\DataResponse;
+use \OCP\AppFramework\Controller;
+use \OCP\AppFramework\Http;
+use \OCA\Files_external\Service\UserStoragesService;
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+
+/**
+ * User storages controller
+ */
+class UserStoragesController extends StoragesController {
+ /**
+ * Creates a new user storages controller.
+ *
+ * @param string $AppName application name
+ * @param IRequest $request request object
+ * @param IL10N $l10n l10n service
+ * @param UserStoragesService $userStoragesService storage service
+ */
+ public function __construct(
+ $AppName,
+ IRequest $request,
+ IL10N $l10n,
+ UserStoragesService $userStoragesService
+ ) {
+ parent::__construct(
+ $AppName,
+ $request,
+ $l10n,
+ $userStoragesService
+ );
+ }
+
+ /**
+ * Validate storage config
+ *
+ * @param StorageConfig $storage storage config
+ *
+ * @return DataResponse|null returns response in case of validation error
+ */
+ protected function validate(StorageConfig $storage) {
+ $result = parent::validate($storage);
+
+ if ($result != null) {
+ return $result;
+ }
+
+ // Verify that the mount point applies for the current user
+ // Prevent non-admin users from mounting local storage and other disabled backends
+ $allowedBackends = \OC_Mount_Config::getPersonalBackends();
+ if (!isset($allowedBackends[$storage->getBackendClass()])) {
+ return new DataResponse(
+ array(
+ 'message' => (string)$this->l10n->t('Invalid storage backend "%s"', array($storage->getBackendClass()))
+ ),
+ Http::STATUS_UNPROCESSABLE_ENTITY
+ );
+ }
+
+ return null;
+ }
+
+ /**
+ * Return storage
+ *
+ * @NoAdminRequired
+ *
+ * {@inheritdoc}
+ */
+ public function show($id) {
+ return parent::show($id);
+ }
+
+ /**
+ * Create an external storage entry.
+ *
+ * @param string $mountPoint storage mount point
+ * @param string $backendClass backend class name
+ * @param array $backendOptions backend-specific options
+ * @param array $mountOptions backend-specific mount options
+ *
+ * @return DataResponse
+ *
+ * @NoAdminRequired
+ */
+ public function create(
+ $mountPoint,
+ $backendClass,
+ $backendOptions,
+ $mountOptions
+ ) {
+ $newStorage = new StorageConfig();
+ $newStorage->setMountPoint($mountPoint);
+ $newStorage->setBackendClass($backendClass);
+ $newStorage->setBackendOptions($backendOptions);
+ $newStorage->setMountOptions($mountOptions);
+
+ $response = $this->validate($newStorage);
+ if (!empty($response)) {
+ return $response;
+ }
+
+ $newStorage = $this->service->addStorage($newStorage);
+ $this->updateStorageStatus($newStorage);
+
+ return new DataResponse(
+ $newStorage,
+ Http::STATUS_CREATED
+ );
+ }
+
+ /**
+ * Update an external storage entry.
+ *
+ * @param int $id storage id
+ * @param string $mountPoint storage mount point
+ * @param string $backendClass backend class name
+ * @param array $backendOptions backend-specific options
+ * @param array $mountOptions backend-specific mount options
+ *
+ * @return DataResponse
+ *
+ * @NoAdminRequired
+ */
+ public function update(
+ $id,
+ $mountPoint,
+ $backendClass,
+ $backendOptions,
+ $mountOptions
+ ) {
+ $storage = new StorageConfig($id);
+ $storage->setMountPoint($mountPoint);
+ $storage->setBackendClass($backendClass);
+ $storage->setBackendOptions($backendOptions);
+ $storage->setMountOptions($mountOptions);
+
+ $response = $this->validate($storage);
+ if (!empty($response)) {
+ return $response;
+ }
+
+ try {
+ $storage = $this->service->updateStorage($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->updateStorageStatus($storage);
+
+ return new DataResponse(
+ $storage,
+ Http::STATUS_OK
+ );
+
+ }
+
+ /**
+ * Delete storage
+ *
+ * @NoAdminRequired
+ *
+ * {@inheritdoc}
+ */
+ public function destroy($id) {
+ return parent::destroy($id);
+ }
+}
diff --git a/apps/files_external/js/dropbox.js b/apps/files_external/js/dropbox.js
index 2880e910f2c..53b5d5d666f 100644
--- a/apps/files_external/js/dropbox.js
+++ b/apps/files_external/js/dropbox.js
@@ -23,7 +23,7 @@ $(document).ready(function() {
$(token).val(result.access_token);
$(token_secret).val(result.access_token_secret);
$(configured).val('true');
- OC.MountConfig.saveStorage(tr, function(status) {
+ OCA.External.Settings.mountConfig.saveStorageConfig(tr, function(status) {
if (status) {
$(tr).find('.configuration input').attr('disabled', 'disabled');
$(tr).find('.configuration').append('<span id="access" style="padding-left:0.5em;">'+t('files_external', 'Access granted')+'</span>');
@@ -93,7 +93,7 @@ $(document).ready(function() {
$(configured).val('false');
$(token).val(result.data.request_token);
$(token_secret).val(result.data.request_token_secret);
- OC.MountConfig.saveStorage(tr, function() {
+ OCA.External.Settings.mountConfig.saveStorageConfig(tr, function() {
window.location = result.data.url;
});
} else {
diff --git a/apps/files_external/js/google.js b/apps/files_external/js/google.js
index b9a5e66b800..648538f8028 100644
--- a/apps/files_external/js/google.js
+++ b/apps/files_external/js/google.js
@@ -32,7 +32,7 @@ $(document).ready(function() {
if (result && result.status == 'success') {
$(token).val(result.data.token);
$(configured).val('true');
- OC.MountConfig.saveStorage(tr, function(status) {
+ OCA.External.Settings.mountConfig.saveStorageConfig(tr, function(status) {
if (status) {
$(tr).find('.configuration input').attr('disabled', 'disabled');
$(tr).find('.configuration').append($('<span/>')
@@ -115,7 +115,7 @@ $(document).ready(function() {
if (result && result.status == 'success') {
$(configured).val('false');
$(token).val('false');
- OC.MountConfig.saveStorage(tr, function(status) {
+ OCA.External.Settings.mountConfig.saveStorageConfig(tr, function(status) {
window.location = result.data.url;
});
} else {
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index ee3d0b736da..9e4d026980f 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -1,20 +1,24 @@
+/*
+ * Copyright (c) 2014
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
(function(){
-function updateStatus(statusEl, result){
- statusEl.removeClass('success error loading-small');
- if (result && result.status === 'success' && result.data.message) {
- statusEl.addClass('success');
- return true;
- } else {
- statusEl.addClass('error');
- return false;
- }
-}
-
+/**
+ * Returns the selection of applicable users in the given configuration row
+ *
+ * @param $row configuration row
+ * @return array array of user names
+ */
function getSelection($row) {
var values = $row.find('.applicableUsers').select2('val');
if (!values || values.length === 0) {
- values = ['all'];
+ values = [];
}
return values;
}
@@ -31,298 +35,515 @@ function highlightInput($input) {
}
}
-OC.MountConfig={
- saveStorage:function($tr, callback) {
- var mountPoint = $tr.find('.mountPoint input').val();
- var oldMountPoint = $tr.find('.mountPoint input').data('mountpoint');
- if (mountPoint === '') {
- return false;
- }
- var statusSpan = $tr.find('.status span');
- var backendClass = $tr.find('.backend').data('class');
- var configuration = $tr.find('.configuration input');
- var addMountPoint = true;
- if (configuration.length < 1) {
- return false;
- }
- var classOptions = {};
- $.each(configuration, function(index, input) {
- if ($(input).val() === '' && !$(input).hasClass('optional')) {
- addMountPoint = false;
- return false;
- }
- if ($(input).is(':checkbox')) {
- if ($(input).is(':checked')) {
- classOptions[$(input).data('parameter')] = true;
+/**
+ * Initialize select2 plugin on the given elements
+ *
+ * @param {Array<Object>} array of jQuery elements
+ * @param {int} userListLimit page size for result list
+ */
+function addSelect2 ($elements, userListLimit) {
+ if (!$elements.length) {
+ return;
+ }
+ $elements.select2({
+ placeholder: t('files_external', 'All users. Type to select user or group.'),
+ allowClear: true,
+ multiple: true,
+ //minimumInputLength: 1,
+ ajax: {
+ url: OC.generateUrl('apps/files_external/applicable'),
+ dataType: 'json',
+ quietMillis: 100,
+ data: function (term, page) { // page is the one-based page number tracked by Select2
+ return {
+ pattern: term, //search term
+ limit: userListLimit, // page size
+ offset: userListLimit*(page-1) // page number starts with 0
+ };
+ },
+ results: function (data) {
+ if (data.status === 'success') {
+
+ var results = [];
+ var userCount = 0; // users is an object
+
+ // add groups
+ $.each(data.groups, function(i, group) {
+ results.push({name:group+'(group)', displayname:group, type:'group' });
+ });
+ // add users
+ $.each(data.users, function(id, user) {
+ userCount++;
+ results.push({name:id, displayname:user, type:'user' });
+ });
+
+
+ var more = (userCount >= userListLimit) || (data.groups.length >= userListLimit);
+ return {results: results, more: more};
} else {
- classOptions[$(input).data('parameter')] = false;
+ //FIXME add error handling
}
- } else {
- classOptions[$(input).data('parameter')] = $(input).val();
}
- });
- if ($('#externalStorage').data('admin') === true) {
- var multiselect = getSelection($tr);
- }
- if (addMountPoint) {
- var status = false;
- if ($('#externalStorage').data('admin') === true) {
- var isPersonal = false;
- var oldGroups = $tr.find('.applicable').data('applicable-groups');
- var oldUsers = $tr.find('.applicable').data('applicable-users');
- var groups = [];
- var users = [];
- $.each(multiselect, function(index, value) {
- var pos = value.indexOf('(group)');
- if (pos != -1) {
- var mountType = 'group';
- var applicable = value.substr(0, pos);
- if ($.inArray(applicable, oldGroups) != -1) {
- oldGroups.splice($.inArray(applicable, oldGroups), 1);
- }
- groups.push(applicable);
- } else {
- var mountType = 'user';
- var applicable = value;
- if ($.inArray(applicable, oldUsers) != -1) {
- oldUsers.splice($.inArray(applicable, oldUsers), 1);
- }
- users.push(applicable);
- }
- statusSpan.addClass('loading-small').removeClass('error success');
- $.ajax({type: 'POST',
- url: OC.filePath('files_external', 'ajax', 'addMountPoint.php'),
- data: {
- mountPoint: mountPoint,
- 'class': backendClass,
- classOptions: classOptions,
- mountType: mountType,
- applicable: applicable,
- isPersonal: isPersonal,
- oldMountPoint: oldMountPoint
- },
- success: function(result) {
- $tr.find('.mountPoint input').data('mountpoint', mountPoint);
- status = updateStatus(statusSpan, result);
- if (callback) {
- callback(status);
- }
- },
- error: function(result){
- status = updateStatus(statusSpan, result);
- if (callback) {
- callback(status);
- }
- }
- });
- });
- $tr.find('.applicable').data('applicable-groups', groups);
- $tr.find('.applicable').data('applicable-users', users);
- var mountType = 'group';
- $.each(oldGroups, function(index, applicable) {
- $.ajax({type: 'POST',
- url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'),
- data: {
- mountPoint: mountPoint,
- 'class': backendClass,
- classOptions: classOptions,
- mountType: mountType,
- applicable: applicable,
- isPersonal: isPersonal
- }
- });
- });
- var mountType = 'user';
- $.each(oldUsers, function(index, applicable) {
- $.ajax({type: 'POST',
- url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'),
- data: {
- mountPoint: mountPoint,
- 'class': backendClass,
- classOptions: classOptions,
- mountType: mountType,
- applicable: applicable,
- isPersonal: isPersonal
+ },
+ initSelection: function(element, callback) {
+ var users = {};
+ users['users'] = [];
+ var toSplit = element.val().split(",");
+ for (var i = 0; i < toSplit.length; i++) {
+ users['users'].push(toSplit[i]);
+ }
+
+ $.ajax(OC.generateUrl('displaynames'), {
+ type: 'POST',
+ contentType: 'application/json',
+ data: JSON.stringify(users),
+ dataType: 'json'
+ }).done(function(data) {
+ var results = [];
+ if (data.status === 'success') {
+ $.each(data.users, function(user, displayname) {
+ if (displayname !== false) {
+ results.push({name:user, displayname:displayname, type:'user'});
}
});
- });
+ callback(results);
+ } else {
+ //FIXME add error handling
+ }
+ });
+ },
+ id: function(element) {
+ return element.name;
+ },
+ formatResult: function (element) {
+ var $result = $('<span><div class="avatardiv"/><span>'+escapeHTML(element.displayname)+'</span></span>');
+ var $div = $result.find('.avatardiv')
+ .attr('data-type', element.type)
+ .attr('data-name', element.name)
+ .attr('data-displayname', element.displayname);
+ if (element.type === 'group') {
+ var url = OC.imagePath('core','places/contacts-dark'); // TODO better group icon
+ $div.html('<img width="32" height="32" src="'+url+'">');
+ }
+ return $result.get(0).outerHTML;
+ },
+ formatSelection: function (element) {
+ if (element.type === 'group') {
+ return '<span title="'+escapeHTML(element.name)+'" class="group">'+escapeHTML(element.displayname+' '+t('files_external', '(group)'))+'</span>';
} else {
- var isPersonal = true;
- var mountType = 'user';
- var applicable = OC.currentUser;
- statusSpan.addClass('loading-small').removeClass('error success');
- $.ajax({type: 'POST',
- url: OC.filePath('files_external', 'ajax', 'addMountPoint.php'),
- data: {
- mountPoint: mountPoint,
- 'class': backendClass,
- classOptions: classOptions,
- mountType: mountType,
- applicable: applicable,
- isPersonal: isPersonal,
- oldMountPoint: oldMountPoint
- },
- success: function(result) {
- $tr.find('.mountPoint input').data('mountpoint', mountPoint);
- status = updateStatus(statusSpan, result);
- if (callback) {
- callback(status);
- }
- },
- error: function(result){
- status = updateStatus(statusSpan, result);
- if (callback) {
- callback(status);
- }
- }
- });
+ return '<span title="'+escapeHTML(element.name)+'" class="user">'+escapeHTML(element.displayname)+'</span>';
}
- return status;
- }
- }
+ },
+ escapeMarkup: function (m) { return m; } // we escape the markup in formatResult and formatSelection
+ }).on('select2-loaded', function() {
+ $.each($('.avatardiv'), function(i, div) {
+ var $div = $(div);
+ if ($div.data('type') === 'user') {
+ $div.avatar($div.data('name'),32);
+ }
+ });
+ });
+}
+
+/**
+ * @class OCA.External.Settings.StorageConfig
+ *
+ * @classdesc External storage config
+ */
+var StorageConfig = function(id) {
+ this.id = id;
+ this.backendOptions = {};
+};
+// Keep this in sync with \OC_Mount_Config::STATUS_*
+StorageConfig.Status = {
+ IN_PROGRESS: -1,
+ SUCCESS: 0,
+ ERROR: 1
};
+/**
+ * @memberof OCA.External.Settings
+ */
+StorageConfig.prototype = {
+ _url: null,
-$(document).ready(function() {
- var $externalStorage = $('#externalStorage');
-
- //initialize hidden input field with list of users and groups
- $externalStorage.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) {
- $tr.find('.applicableUsers').val('');
- } else {
- $tr.find('.applicableUsers').val(groupsId.concat(users).join(','));
+ /**
+ * Storage id
+ *
+ * @type int
+ */
+ id: null,
+
+ /**
+ * Mount point
+ *
+ * @type string
+ */
+ mountPoint: '',
+
+ /**
+ * Backend class name
+ *
+ * @type string
+ */
+ backendClass: null,
+
+ /**
+ * Backend-specific configuration
+ *
+ * @type Object.<string,object>
+ */
+ backendOptions: null,
+
+ /**
+ * Mount-specific options
+ *
+ * @type Object.<string,object>
+ */
+ mountOptions: null,
+
+ /**
+ * Creates or saves the storage.
+ *
+ * @param {Function} [options.success] success callback, receives result as argument
+ * @param {Function} [options.error] error callback
+ */
+ save: function(options) {
+ var self = this;
+ var url = OC.generateUrl(this._url);
+ var method = 'POST';
+ if (_.isNumber(this.id)) {
+ method = 'PUT';
+ url = OC.generateUrl(this._url + '/{id}', {id: this.id});
+ }
+
+ $.ajax({
+ type: method,
+ url: url,
+ data: this.getData(),
+ success: function(result) {
+ self.id = result.id;
+ if (_.isFunction(options.success)) {
+ options.success(result);
+ }
+ },
+ error: options.error
+ });
+ },
+
+ /**
+ * Returns the data from this object
+ *
+ * @return {Array} JSON array of the data
+ */
+ getData: function() {
+ var data = {
+ mountPoint: this.mountPoint,
+ backendClass: this.backendClass,
+ backendOptions: this.backendOptions
+ };
+ if (this.id) {
+ data.id = this.id;
+ }
+ if (this.mountOptions) {
+ data.mountOptions = this.mountOptions;
+ }
+ return data;
+ },
+
+ /**
+ * Recheck the storage
+ *
+ * @param {Function} [options.success] success callback, receives result as argument
+ * @param {Function} [options.error] error callback
+ */
+ recheck: function(options) {
+ if (!_.isNumber(this.id)) {
+ if (_.isFunction(options.error)) {
+ options.error();
}
+ return;
}
- });
+ $.ajax({
+ type: 'GET',
+ url: OC.generateUrl(this._url + '/{id}', {id: this.id}),
+ success: options.success,
+ error: options.error
+ });
+ },
- var userListLimit = 30;
- function addSelect2 ($elements) {
- if ($elements.length > 0) {
- $elements.select2({
- placeholder: t('files_external', 'All users. Type to select user or group.'),
- allowClear: true,
- multiple: true,
- //minimumInputLength: 1,
- ajax: {
- url: OC.generateUrl('apps/files_external/applicable'),
- dataType: 'json',
- quietMillis: 100,
- data: function (term, page) { // page is the one-based page number tracked by Select2
- return {
- pattern: term, //search term
- limit: userListLimit, // page size
- offset: userListLimit*(page-1) // page number starts with 0
- };
- },
- results: function (data, page) {
- if (data.status === 'success') {
-
- var results = [];
- var userCount = 0; // users is an object
-
- // add groups
- $.each(data.groups, function(i, group) {
- results.push({name:group+'(group)', displayname:group, type:'group' });
- });
- // add users
- $.each(data.users, function(id, user) {
- userCount++;
- results.push({name:id, displayname:user, type:'user' });
- });
-
-
- var more = (userCount >= userListLimit) || (data.groups.length >= userListLimit);
- return {results: results, more: more};
- } else {
- //FIXME add error handling
- }
- }
- },
- initSelection: function(element, callback) {
- var users = {};
- users['users'] = [];
- var toSplit = element.val().split(",");
- for (var i = 0; i < toSplit.length; i++) {
- users['users'].push(toSplit[i]);
- }
+ /**
+ * Deletes the storage
+ *
+ * @param {Function} [options.success] success callback
+ * @param {Function} [options.error] error callback
+ */
+ destroy: function(options) {
+ if (!_.isNumber(this.id)) {
+ // the storage hasn't even been created => success
+ if (_.isFunction(options.success)) {
+ options.success();
+ }
+ return;
+ }
+ var self = this;
+ $.ajax({
+ type: 'DELETE',
+ url: OC.generateUrl(this._url + '/{id}', {id: this.id}),
+ success: options.success,
+ error: options.error
+ });
+ },
- $.ajax(OC.generateUrl('displaynames'), {
- type: 'POST',
- contentType: 'application/json',
- data: JSON.stringify(users),
- dataType: 'json'
- }).done(function(data) {
- var results = [];
- if (data.status === 'success') {
- $.each(data.users, function(user, displayname) {
- if (displayname !== false) {
- results.push({name:user, displayname:displayname, type:'user'});
- }
- });
- callback(results);
- } else {
- //FIXME add error handling
- }
- });
- },
- id: function(element) {
- return element.name;
- },
- formatResult: function (element) {
- var $result = $('<span><div class="avatardiv"/><span>'+escapeHTML(element.displayname)+'</span></span>');
- var $div = $result.find('.avatardiv')
- .attr('data-type', element.type)
- .attr('data-name', element.name)
- .attr('data-displayname', element.displayname);
- if (element.type === 'group') {
- var url = OC.imagePath('core','places/contacts-dark'); // TODO better group icon
- $div.html('<img width="32" height="32" src="'+url+'">');
- }
- return $result.get(0).outerHTML;
- },
- formatSelection: function (element) {
- if (element.type === 'group') {
- return '<span title="'+escapeHTML(element.name)+'" class="group">'+escapeHTML(element.displayname+' '+t('files_external', '(group)'))+'</span>';
- } else {
- return '<span title="'+escapeHTML(element.name)+'" class="user">'+escapeHTML(element.displayname)+'</span>';
- }
- },
- escapeMarkup: function (m) { return m; } // we escape the markup in formatResult and formatSelection
- }).on('select2-loaded', function() {
- $.each($('.avatardiv'), function(i, div) {
- var $div = $(div);
- if ($div.data('type') === 'user') {
- $div.avatar($div.data('name'),32);
- }
- })
- });
+ /**
+ * Validate this model
+ *
+ * @return {boolean} false if errors exist, true otherwise
+ */
+ validate: function() {
+ if (this.mountPoint === '') {
+ return false;
}
+ if (this.errors) {
+ return false;
+ }
+ return true;
}
- addSelect2($('tr:not(#addMountPoint) .applicableUsers'));
-
- $externalStorage.on('change', '#selectBackend', function() {
- var $tr = $(this).closest('tr');
- $externalStorage.find('tbody').append($tr.clone());
- $externalStorage.find('tbody tr').last().find('.mountPoint input').val('');
- var selected = $(this).find('option:selected').text();
- var backendClass = $(this).val();
+};
+
+/**
+ * @class OCA.External.Settings.GlobalStorageConfig
+ * @augments OCA.External.Settings.StorageConfig
+ *
+ * @classdesc Global external storage config
+ */
+var GlobalStorageConfig = function(id) {
+ this.id = id;
+ this.applicableUsers = [];
+ this.applicableGroups = [];
+};
+/**
+ * @memberOf OCA.External.Settings
+ */
+GlobalStorageConfig.prototype = _.extend({}, StorageConfig.prototype,
+ /** @lends OCA.External.Settings.GlobalStorageConfig.prototype */ {
+ _url: 'apps/files_external/globalstorages',
+
+ /**
+ * Applicable users
+ *
+ * @type Array.<string>
+ */
+ applicableUsers: null,
+
+ /**
+ * Applicable groups
+ *
+ * @type Array.<string>
+ */
+ applicableGroups: null,
+
+ /**
+ * Storage priority
+ *
+ * @type int
+ */
+ priority: null,
+
+ /**
+ * Returns the data from this object
+ *
+ * @return {Array} JSON array of the data
+ */
+ getData: function() {
+ var data = StorageConfig.prototype.getData.apply(this, arguments);
+ return _.extend(data, {
+ applicableUsers: this.applicableUsers,
+ applicableGroups: this.applicableGroups,
+ priority: this.priority,
+ });
+ }
+});
+
+/**
+ * @class OCA.External.Settings.UserStorageConfig
+ * @augments OCA.External.Settings.StorageConfig
+ *
+ * @classdesc User external storage config
+ */
+var UserStorageConfig = function(id) {
+ this.id = id;
+};
+UserStorageConfig.prototype = _.extend({}, StorageConfig.prototype,
+ /** @lends OCA.External.Settings.UserStorageConfig.prototype */ {
+ _url: 'apps/files_external/userstorages'
+});
+
+/**
+ * @class OCA.External.Settings.MountConfigListView
+ *
+ * @classdesc Mount configuration list view
+ *
+ * @param {Object} $el DOM object containing the list
+ * @param {Object} [options]
+ * @param {int} [options.userListLimit] page size in applicable users dropdown
+ */
+var MountConfigListView = function($el, options) {
+ this.initialize($el, options);
+};
+/**
+ * @memberOf OCA.External.Settings
+ */
+MountConfigListView.prototype = {
+
+ /**
+ * jQuery element containing the config list
+ *
+ * @type Object
+ */
+ $el: null,
+
+ /**
+ * Storage config class
+ *
+ * @type Class
+ */
+ _storageConfigClass: null,
+
+ /**
+ * Flag whether the list is about user storage configs (true)
+ * or global storage configs (false)
+ *
+ * @type bool
+ */
+ _isPersonal: false,
+
+ /**
+ * Page size in applicable users dropdown
+ *
+ * @type int
+ */
+ _userListLimit: 30,
+
+ /**
+ * List of supported backends
+ *
+ * @type Object.<string,Object>
+ */
+ _allBackends: null,
+
+ /**
+ * @param {Object} $el DOM object containing the list
+ * @param {Object} [options]
+ * @param {int} [options.userListLimit] page size in applicable users dropdown
+ */
+ initialize: function($el, options) {
+ var self = this;
+ this.$el = $el;
+ this._isPersonal = ($el.data('admin') !== true);
+ if (this._isPersonal) {
+ this._storageConfigClass = OCA.External.Settings.UserStorageConfig;
+ } else {
+ this._storageConfigClass = OCA.External.Settings.GlobalStorageConfig;
+ }
+
+ if (options && !_.isUndefined(options.userListLimit)) {
+ this._userListLimit = options.userListLimit;
+ }
+
+ // read the backend config that was carefully crammed
+ // into the data-configurations attribute of the select
+ this._allBackends = this.$el.find('.selectBackend').data('configurations');
+
+ //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.find('tr:not(#addMountPoint)').each(function(i, tr) {
+ self.recheckStorageConfig($(tr));
+ });
+
+ this._initEvents();
+ },
+
+ /**
+ * Initialize DOM event handlers
+ */
+ _initEvents: function() {
+ var self = this;
+
+ this.$el.on('paste', 'td input', function() {
+ var $me = $(this);
+ var $tr = $me.closest('tr');
+ setTimeout(function() {
+ highlightInput($me);
+ self.saveStorageConfig($tr);
+ }, 20);
+ });
+
+ var timer;
+
+ this.$el.on('keyup', 'td input', function() {
+ clearTimeout(timer);
+ var $tr = $(this).closest('tr');
+ highlightInput($(this));
+ if ($(this).val) {
+ timer = setTimeout(function() {
+ self.saveStorageConfig($tr);
+ }, 2000);
+ }
+ });
+
+ this.$el.on('change', 'td input:checkbox', function() {
+ self.saveStorageConfig($(this).closest('tr'));
+ });
+
+ this.$el.on('change', '.applicable', function() {
+ self.saveStorageConfig($(this).closest('tr'));
+ });
+
+ this.$el.on('click', '.status>span', function() {
+ self.recheckStorageConfig($(this).closest('tr'));
+ });
+
+ this.$el.on('click', 'td.remove>img', function() {
+ self.deleteStorageConfig($(this).closest('tr'));
+ });
+
+ this.$el.on('change', '.selectBackend', _.bind(this._onSelectBackend, this));
+ },
+
+ _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('');
+ var selected = $target.find('option:selected').text();
+ var backendClass = $target.val();
$tr.find('.backend').text(selected);
if ($tr.find('.mountPoint input').val() === '') {
- $tr.find('.mountPoint input').val(suggestMountPoint(selected));
+ $tr.find('.mountPoint input').val(this._suggestMountPoint(selected));
}
$tr.addClass(backendClass);
- $tr.find('.status').append('<span></span>');
$tr.find('.backend').data('class', backendClass);
- var configurations = $(this).data('configurations');
+ var configurations = this._allBackends;
var $td = $tr.find('td.configuration');
$.each(configurations, function(backend, parameters) {
if (backend === backendClass) {
@@ -347,7 +568,9 @@ $(document).ready(function() {
highlightInput(newElement);
$td.append(newElement);
});
- if (parameters['custom'] && $externalStorage.find('tbody tr.'+backendClass.replace(/\\/g, '\\\\')).length === 1) {
+ var priorityEl = $('<input type="hidden" class="priority" value="' + parameters['priority'] + '" />');
+ $tr.append(priorityEl);
+ if (parameters['custom'] && $el.find('tbody tr.'+backendClass.replace(/\\/g, '\\\\')).length === 1) {
OC.addScript('files_external', parameters['custom']);
}
$td.children().not('[type=hidden]').first().focus();
@@ -357,11 +580,197 @@ $(document).ready(function() {
$tr.find('td').last().attr('class', 'remove');
$tr.find('td').last().removeAttr('style');
$tr.removeAttr('id');
- $(this).remove();
- addSelect2($tr.find('.applicableUsers'));
- });
+ $target.remove();
+ addSelect2($tr.find('.applicableUsers'), this._userListLimit);
+ },
+
+ /**
+ * Gets the storage model from the given row
+ *
+ * @param $tr row element
+ * @return {OCA.External.StorageConfig} storage model instance
+ */
+ getStorageConfig: function($tr) {
+ var storageId = parseInt($tr.attr('data-id'), 10);
+ if (!storageId) {
+ // new entry
+ storageId = null;
+ }
+ var storage = new this._storageConfigClass(storageId);
+ storage.mountPoint = $tr.find('.mountPoint input').val();
+ storage.backendClass = $tr.find('.backend').data('class');
- function suggestMountPoint(defaultMountPoint) {
+ var classOptions = {};
+ var configuration = $tr.find('.configuration input');
+ var missingOptions = [];
+ $.each(configuration, function(index, input) {
+ var $input = $(input);
+ var parameter = $input.data('parameter');
+ if ($input.attr('type') === 'button') {
+ return;
+ }
+ if ($input.val() === '' && !$input.hasClass('optional')) {
+ missingOptions.push(parameter);
+ return;
+ }
+ if ($(input).is(':checkbox')) {
+ if ($(input).is(':checked')) {
+ classOptions[parameter] = true;
+ } else {
+ classOptions[parameter] = false;
+ }
+ } else {
+ classOptions[parameter] = $(input).val();
+ }
+ });
+
+ storage.backendOptions = classOptions;
+ if (missingOptions.length) {
+ storage.errors = {
+ backendOptions: missingOptions
+ };
+ }
+
+ // gather selected users and groups
+ if (!this._isPersonal) {
+ var groups = [];
+ var users = [];
+ var multiselect = getSelection($tr);
+ $.each(multiselect, function(index, value) {
+ var pos = value.indexOf('(group)');
+ if (pos !== -1) {
+ groups.push(value.substr(0, pos));
+ } else {
+ users.push(value);
+ }
+ });
+ // FIXME: this should be done in the multiselect change event instead
+ $tr.find('.applicable')
+ .data('applicable-groups', groups)
+ .data('applicable-users', users);
+
+ storage.applicableUsers = users;
+ storage.applicableGroups = groups;
+
+ storage.priority = $tr.find('input.priority').val();
+ }
+
+ var mountOptions = $tr.find('input.mountOptions').val();
+ if (mountOptions) {
+ storage.mountOptions = JSON.parse(mountOptions);
+ }
+
+ return storage;
+ },
+
+ /**
+ * Deletes the storage from the given tr
+ *
+ * @param $tr storage row
+ * @param Function callback callback to call after save
+ */
+ deleteStorageConfig: function($tr) {
+ var self = this;
+ var configId = $tr.data('id');
+ if (!_.isNumber(configId)) {
+ // deleting unsaved storage
+ $tr.remove();
+ return;
+ }
+ var storage = new this._storageConfigClass(configId);
+ this.updateStatus($tr, StorageConfig.Status.IN_PROGRESS);
+
+ storage.destroy({
+ success: function() {
+ $tr.remove();
+ },
+ error: function() {
+ self.updateStatus($tr, StorageConfig.Status.ERROR);
+ }
+ });
+ },
+
+ /**
+ * Saves the storage from the given tr
+ *
+ * @param $tr storage row
+ * @param Function callback callback to call after save
+ */
+ saveStorageConfig:function($tr, callback) {
+ var self = this;
+ var storage = this.getStorageConfig($tr);
+ if (!storage.validate()) {
+ return false;
+ }
+
+ this.updateStatus($tr, StorageConfig.Status.IN_PROGRESS);
+ storage.save({
+ success: function(result) {
+ self.updateStatus($tr, result.status);
+ $tr.attr('data-id', result.id);
+
+ if (_.isFunction(callback)) {
+ callback(storage);
+ }
+ },
+ error: function() {
+ self.updateStatus($tr, StorageConfig.Status.ERROR);
+ }
+ });
+ },
+
+ /**
+ * Recheck storage availability
+ *
+ * @param {jQuery} $tr storage row
+ * @return {boolean} success
+ */
+ recheckStorageConfig: function($tr) {
+ var self = this;
+ var storage = this.getStorageConfig($tr);
+ if (!storage.validate()) {
+ return false;
+ }
+
+ this.updateStatus($tr, StorageConfig.Status.IN_PROGRESS);
+ storage.recheck({
+ success: function(result) {
+ self.updateStatus($tr, result.status);
+ },
+ error: function() {
+ self.updateStatus($tr, StorageConfig.Status.ERROR);
+ }
+ });
+ },
+
+ /**
+ * Update status display
+ *
+ * @param {jQuery} $tr
+ * @param {int} status
+ */
+ updateStatus: function($tr, status) {
+ var $statusSpan = $tr.find('.status span');
+ $statusSpan.removeClass('success error loading-small');
+ switch (status) {
+ case StorageConfig.Status.IN_PROGRESS:
+ $statusSpan.addClass('loading-small');
+ break;
+ case StorageConfig.Status.SUCCESS:
+ $statusSpan.addClass('success');
+ break;
+ default:
+ $statusSpan.addClass('error');
+ }
+ },
+
+ /**
+ * Suggest mount point name that doesn't conflict with the existing names in the list
+ *
+ * @param {string} defaultMountPoint default name
+ */
+ _suggestMountPoint: function(defaultMountPoint) {
+ var $el = this.$el;
var pos = defaultMountPoint.indexOf('/');
if (pos !== -1) {
defaultMountPoint = defaultMountPoint.substring(0, pos);
@@ -372,7 +781,7 @@ $(document).ready(function() {
var match = true;
while (match && i < 20) {
match = false;
- $externalStorage.find('tbody td.mountPoint input').each(function(index, mountPoint) {
+ $el.find('tbody td.mountPoint input').each(function(index, mountPoint) {
if ($(mountPoint).val() === defaultMountPoint+append) {
match = true;
return false;
@@ -385,42 +794,12 @@ $(document).ready(function() {
break;
}
}
- return defaultMountPoint+append;
+ return defaultMountPoint + append;
}
+};
- $externalStorage.on('paste', 'td input', function() {
- var $me = $(this);
- var $tr = $me.closest('tr');
- setTimeout(function() {
- highlightInput($me);
- OC.MountConfig.saveStorage($tr);
- }, 20);
- });
-
- var timer;
-
- $externalStorage.on('keyup', 'td input', function() {
- clearTimeout(timer);
- var $tr = $(this).closest('tr');
- highlightInput($(this));
- if ($(this).val) {
- timer = setTimeout(function() {
- OC.MountConfig.saveStorage($tr);
- }, 2000);
- }
- });
-
- $externalStorage.on('change', 'td input:checkbox', function() {
- OC.MountConfig.saveStorage($(this).closest('tr'));
- });
-
- $externalStorage.on('change', '.applicable', function() {
- OC.MountConfig.saveStorage($(this).closest('tr'));
- });
-
- $externalStorage.on('click', '.status>span', function() {
- OC.MountConfig.saveStorage($(this).closest('tr'));
- });
+$(document).ready(function() {
+ var mountConfigListView = new MountConfigListView($('#externalStorage'));
$('#sslCertificate').on('click', 'td.remove>img', function() {
var $tr = $(this).closest('tr');
@@ -429,33 +808,7 @@ $(document).ready(function() {
return true;
});
- $externalStorage.on('click', 'td.remove>img', function() {
- var $tr = $(this).closest('tr');
- var mountPoint = $tr.find('.mountPoint input').val();
-
- if ($externalStorage.data('admin') === true) {
- var isPersonal = false;
- var multiselect = getSelection($tr);
- $.each(multiselect, function(index, value) {
- var pos = value.indexOf('(group)');
- if (pos != -1) {
- var mountType = 'group';
- var applicable = value.substr(0, pos);
- } else {
- var mountType = 'user';
- var applicable = value;
- }
- $.post(OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), { mountPoint: mountPoint, mountType: mountType, applicable: applicable, isPersonal: isPersonal });
- });
- } else {
- var mountType = 'user';
- var applicable = OC.currentUser;
- var isPersonal = true;
- $.post(OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), { mountPoint: mountPoint, mountType: mountType, applicable: applicable, isPersonal: isPersonal });
- }
- $tr.remove();
- });
-
+ // TODO: move this into its own View class
var $allowUserMounting = $('#allowUserMounting');
$allowUserMounting.bind('change', function() {
OC.msg.startSaving('#userMountingMsg');
@@ -484,6 +837,31 @@ $(document).ready(function() {
}
});
+
+ // global instance
+ OCA.External.Settings.mountConfig = mountConfigListView;
+
+ /**
+ * Legacy
+ *
+ * @namespace
+ * @deprecated use OCA.External.Settings.mountConfig instead
+ */
+ OC.MountConfig = {
+ saveStorage: _.bind(mountConfigListView.saveStorageConfig, mountConfigListView)
+ };
});
+// export
+
+OCA.External = OCA.External || {};
+/**
+ * @namespace
+ */
+OCA.External.Settings = OCA.External.Settings || {};
+
+OCA.External.Settings.GlobalStorageConfig = GlobalStorageConfig;
+OCA.External.Settings.UserStorageConfig = UserStorageConfig;
+OCA.External.Settings.MountConfigListView = MountConfigListView;
+
})();
diff --git a/apps/files_external/js/sftp_key.js b/apps/files_external/js/sftp_key.js
index 2b39628247c..55b11b1fac9 100644
--- a/apps/files_external/js/sftp_key.js
+++ b/apps/files_external/js/sftp_key.js
@@ -42,7 +42,7 @@ $(document).ready(function() {
if (result && result.status === 'success') {
$(config).find('[data-parameter="public_key"]').val(result.data.public_key);
$(config).find('[data-parameter="private_key"]').val(result.data.private_key);
- OC.MountConfig.saveStorage(tr, function() {
+ OCA.External.mountConfig.saveStorageConfig(tr, function() {
// Nothing to do
});
} else {
diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js
index 78aa5ad5b8d..2786753444a 100644
--- a/apps/files_external/l10n/ca.js
+++ b/apps/files_external/l10n/ca.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"Username as share" : "Nom d'usuari per compartir",
"URL" : "URL",
"Secure https://" : "Protocol segur https://",
+ "Public key" : "Clau pública",
"Access granted" : "S'ha concedit l'accés",
"Error configuring Dropbox storage" : "Error en configurar l'emmagatzemament Dropbox",
"Grant access" : "Concedeix accés",
@@ -52,10 +53,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Tots els usuaris. Escriu per seleccionar un usuari o grup.",
"(group)" : "(grup)",
"Saved" : "Desat",
+ "Generate keys" : "Generar claus",
+ "Error generating key pair" : "Error en generar el parell de claus",
"<b>Note:</b> " : "<b>Nota:</b> ",
+ "and" : "i",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport cURL no està activat o instal·lat a PHP. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> %s no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.",
+ "No external storage configured" : "Sense emmagatzematge extern configurat",
+ "You can configure external storages in the personal settings" : "Pot configurar emmagatzematges externs en els ajustos personals",
"Name" : "Nom",
"Storage type" : "Tipus d'emmagatzemament",
"Scope" : "Abast",
diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json
index 01f63676b59..a13a9d2335f 100644
--- a/apps/files_external/l10n/ca.json
+++ b/apps/files_external/l10n/ca.json
@@ -41,6 +41,7 @@
"Username as share" : "Nom d'usuari per compartir",
"URL" : "URL",
"Secure https://" : "Protocol segur https://",
+ "Public key" : "Clau pública",
"Access granted" : "S'ha concedit l'accés",
"Error configuring Dropbox storage" : "Error en configurar l'emmagatzemament Dropbox",
"Grant access" : "Concedeix accés",
@@ -50,10 +51,15 @@
"All users. Type to select user or group." : "Tots els usuaris. Escriu per seleccionar un usuari o grup.",
"(group)" : "(grup)",
"Saved" : "Desat",
+ "Generate keys" : "Generar claus",
+ "Error generating key pair" : "Error en generar el parell de claus",
"<b>Note:</b> " : "<b>Nota:</b> ",
+ "and" : "i",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport cURL no està activat o instal·lat a PHP. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> %s no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.",
+ "No external storage configured" : "Sense emmagatzematge extern configurat",
+ "You can configure external storages in the personal settings" : "Pot configurar emmagatzematges externs en els ajustos personals",
"Name" : "Nom",
"Storage type" : "Tipus d'emmagatzemament",
"Scope" : "Abast",
diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js
index 17884664e6b..c5284a8a791 100644
--- a/apps/files_external/l10n/cs_CZ.js
+++ b/apps/files_external/l10n/cs_CZ.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Zabezpečené https://",
"Public key" : "Veřejný klíč",
+ "Storage with id \"%i\" not found" : "Úložiště s id \"%i\" nebylo nalezeno",
+ "Invalid mount point" : "Neplatný přípojný bod",
+ "Invalid storage backend \"%s\"" : "Neplatná služba úložiště \"%s\"",
"Access granted" : "Přístup povolen",
"Error configuring Dropbox storage" : "Chyba při nastavení úložiště Dropbox",
"Grant access" : "Povolit přístup",
diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json
index 602ff4f4c5e..5118b8e9680 100644
--- a/apps/files_external/l10n/cs_CZ.json
+++ b/apps/files_external/l10n/cs_CZ.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Zabezpečené https://",
"Public key" : "Veřejný klíč",
+ "Storage with id \"%i\" not found" : "Úložiště s id \"%i\" nebylo nalezeno",
+ "Invalid mount point" : "Neplatný přípojný bod",
+ "Invalid storage backend \"%s\"" : "Neplatná služba úložiště \"%s\"",
"Access granted" : "Přístup povolen",
"Error configuring Dropbox storage" : "Chyba při nastavení úložiště Dropbox",
"Grant access" : "Povolit přístup",
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index f840bbbd0b5..dee266bbf39 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Sicherer HTTPS://",
"Public key" : "Öffentlicher Schlüssel",
+ "Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden",
+ "Invalid mount point" : "Ungültiger Einhängepunkt",
+ "Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“",
"Access granted" : "Zugriff gestattet",
"Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox",
"Grant access" : "Zugriff gestatten",
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index 7382a19fe1e..fa7fe02aca0 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Sicherer HTTPS://",
"Public key" : "Öffentlicher Schlüssel",
+ "Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden",
+ "Invalid mount point" : "Ungültiger Einhängepunkt",
+ "Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“",
"Access granted" : "Zugriff gestattet",
"Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox",
"Grant access" : "Zugriff gestatten",
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index 422ce3df5d2..af50a569790 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "Adresse",
"Secure https://" : "Sicheres https://",
"Public key" : "Öffentlicher Schlüssel",
+ "Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden",
+ "Invalid mount point" : "Ungültiger Einhängepunkt",
+ "Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“",
"Access granted" : "Zugriff gestattet",
"Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox",
"Grant access" : "Zugriff gestatten",
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index c783b0ab78f..ac5b4d87139 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -42,6 +42,9 @@
"URL" : "Adresse",
"Secure https://" : "Sicheres https://",
"Public key" : "Öffentlicher Schlüssel",
+ "Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden",
+ "Invalid mount point" : "Ungültiger Einhängepunkt",
+ "Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“",
"Access granted" : "Zugriff gestattet",
"Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox",
"Grant access" : "Zugriff gestatten",
diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js
index 291077b3533..af893902edb 100644
--- a/apps/files_external/l10n/fi_FI.js
+++ b/apps/files_external/l10n/fi_FI.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"URL" : "Verkko-osoite",
"Secure https://" : "Salattu https://",
"Public key" : "Julkinen avain",
+ "Invalid mount point" : "Virheellinen liitoskohta",
"Access granted" : "Pääsy sallittu",
"Error configuring Dropbox storage" : "Virhe Dropbox levyn asetuksia tehtäessä",
"Grant access" : "Salli pääsy",
diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json
index 2b8ba851f37..a4b0068e087 100644
--- a/apps/files_external/l10n/fi_FI.json
+++ b/apps/files_external/l10n/fi_FI.json
@@ -36,6 +36,7 @@
"URL" : "Verkko-osoite",
"Secure https://" : "Salattu https://",
"Public key" : "Julkinen avain",
+ "Invalid mount point" : "Virheellinen liitoskohta",
"Access granted" : "Pääsy sallittu",
"Error configuring Dropbox storage" : "Virhe Dropbox levyn asetuksia tehtäessä",
"Grant access" : "Salli pääsy",
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index 00be27114a0..b4142e0839e 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -20,9 +20,9 @@ OC.L10N.register(
"Port" : "Port",
"Region" : "Région",
"Enable SSL" : "Activer SSL",
- "Enable Path Style" : "Activer le style de chemin",
- "App key" : "Clé App",
- "App secret" : "Secret de l'application",
+ "Enable Path Style" : "Accès par path",
+ "App key" : "App key",
+ "App secret" : "App secret",
"Host" : "Hôte",
"Username" : "Nom d'utilisateur",
"Password" : "Mot de passe",
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Sécurisation https://",
"Public key" : "Clef publique",
+ "Storage with id \"%i\" not found" : "Stockage avec l'id \"%i\" non trouvé",
+ "Invalid mount point" : "Point de montage invalide",
+ "Invalid storage backend \"%s\"" : "Service de stockage invalide : \"%s\"",
"Access granted" : "Accès autorisé",
"Error configuring Dropbox storage" : "Erreur lors de la configuration du support de stockage Dropbox",
"Grant access" : "Autoriser l'accès",
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 21a2925b2aa..12662f5a46c 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -18,9 +18,9 @@
"Port" : "Port",
"Region" : "Région",
"Enable SSL" : "Activer SSL",
- "Enable Path Style" : "Activer le style de chemin",
- "App key" : "Clé App",
- "App secret" : "Secret de l'application",
+ "Enable Path Style" : "Accès par path",
+ "App key" : "App key",
+ "App secret" : "App secret",
"Host" : "Hôte",
"Username" : "Nom d'utilisateur",
"Password" : "Mot de passe",
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Sécurisation https://",
"Public key" : "Clef publique",
+ "Storage with id \"%i\" not found" : "Stockage avec l'id \"%i\" non trouvé",
+ "Invalid mount point" : "Point de montage invalide",
+ "Invalid storage backend \"%s\"" : "Service de stockage invalide : \"%s\"",
"Access granted" : "Accès autorisé",
"Error configuring Dropbox storage" : "Erreur lors de la configuration du support de stockage Dropbox",
"Grant access" : "Autoriser l'accès",
diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js
index 6b0afadb1cd..328c793ce85 100644
--- a/apps/files_external/l10n/gl.js
+++ b/apps/files_external/l10n/gl.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "https:// seguro",
"Public key" : "Chave pública",
+ "Storage with id \"%i\" not found" : "Non se atopa o almacenamento co ID «%i» ",
+ "Invalid mount point" : "Punto de montaxe incorrecto",
+ "Invalid storage backend \"%s\"" : "Infraestrutura de almacenamento «%s» incorrecta",
"Access granted" : "Concedeuse acceso",
"Error configuring Dropbox storage" : "Produciuse un erro ao configurar o almacenamento en Dropbox",
"Grant access" : "Permitir o acceso",
diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json
index a729cee4887..6d54298e752 100644
--- a/apps/files_external/l10n/gl.json
+++ b/apps/files_external/l10n/gl.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "https:// seguro",
"Public key" : "Chave pública",
+ "Storage with id \"%i\" not found" : "Non se atopa o almacenamento co ID «%i» ",
+ "Invalid mount point" : "Punto de montaxe incorrecto",
+ "Invalid storage backend \"%s\"" : "Infraestrutura de almacenamento «%s» incorrecta",
"Access granted" : "Concedeuse acceso",
"Error configuring Dropbox storage" : "Produciuse un erro ao configurar o almacenamento en Dropbox",
"Grant access" : "Permitir o acceso",
diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js
index b80378b31ea..c679f644541 100644
--- a/apps/files_external/l10n/it.js
+++ b/apps/files_external/l10n/it.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Sicuro https://",
"Public key" : "Chiave pubblica",
+ "Storage with id \"%i\" not found" : "Archiviazione con ID \"%i\" non trovata",
+ "Invalid mount point" : "Punto di mount non valido",
+ "Invalid storage backend \"%s\"" : "Motore di archiviazione \"%s\" non valido",
"Access granted" : "Accesso consentito",
"Error configuring Dropbox storage" : "Errore durante la configurazione dell'archivio Dropbox",
"Grant access" : "Concedi l'accesso",
diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json
index 721a2a31d72..7e56ebf13fd 100644
--- a/apps/files_external/l10n/it.json
+++ b/apps/files_external/l10n/it.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Sicuro https://",
"Public key" : "Chiave pubblica",
+ "Storage with id \"%i\" not found" : "Archiviazione con ID \"%i\" non trovata",
+ "Invalid mount point" : "Punto di mount non valido",
+ "Invalid storage backend \"%s\"" : "Motore di archiviazione \"%s\" non valido",
"Access granted" : "Accesso consentito",
"Error configuring Dropbox storage" : "Errore durante la configurazione dell'archivio Dropbox",
"Grant access" : "Concedi l'accesso",
diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js
index fc155288f1e..ce27e982abf 100644
--- a/apps/files_external/l10n/nl.js
+++ b/apps/files_external/l10n/nl.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Secure https://",
"Public key" : "Publieke sleutel",
+ "Storage with id \"%i\" not found" : "Opslag met id \"%i\" niet gevonden",
+ "Invalid mount point" : "Ongeldig aankoppelpunt",
+ "Invalid storage backend \"%s\"" : "Ongeldig opslagsysteem \"%s\"",
"Access granted" : "Toegang toegestaan",
"Error configuring Dropbox storage" : "Fout tijdens het configureren van Dropbox opslag",
"Grant access" : "Sta toegang toe",
diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json
index ece7db68987..cfe375fdd57 100644
--- a/apps/files_external/l10n/nl.json
+++ b/apps/files_external/l10n/nl.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Secure https://",
"Public key" : "Publieke sleutel",
+ "Storage with id \"%i\" not found" : "Opslag met id \"%i\" niet gevonden",
+ "Invalid mount point" : "Ongeldig aankoppelpunt",
+ "Invalid storage backend \"%s\"" : "Ongeldig opslagsysteem \"%s\"",
"Access granted" : "Toegang toegestaan",
"Error configuring Dropbox storage" : "Fout tijdens het configureren van Dropbox opslag",
"Grant access" : "Sta toegang toe",
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index fe1472741db..ba0ce4f417f 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "https:// Seguro",
"Public key" : "Chave pública",
+ "Storage with id \"%i\" not found" : "Armazenamento com ID \"%i\" não encontrado",
+ "Invalid mount point" : "Ponto de montagem inválido",
+ "Invalid storage backend \"%s\"" : "Backend de armazenamento inválido \"%s\"",
"Access granted" : "Acesso autorizado",
"Error configuring Dropbox storage" : "Erro ao configurar o armazenamento do Dropbox",
"Grant access" : "Conceder acesso",
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index b5a08ccd654..c4823dea4b6 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "https:// Seguro",
"Public key" : "Chave pública",
+ "Storage with id \"%i\" not found" : "Armazenamento com ID \"%i\" não encontrado",
+ "Invalid mount point" : "Ponto de montagem inválido",
+ "Invalid storage backend \"%s\"" : "Backend de armazenamento inválido \"%s\"",
"Access granted" : "Acesso autorizado",
"Error configuring Dropbox storage" : "Erro ao configurar o armazenamento do Dropbox",
"Grant access" : "Conceder acesso",
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index 1a6ad558570..d081cea91ee 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Güvenli https://",
"Public key" : "Ortak anahtar",
+ "Storage with id \"%i\" not found" : "\"%i\" kimliği ile bir depolama bulunamadı",
+ "Invalid mount point" : "Geçersiz bağlama noktası",
+ "Invalid storage backend \"%s\"" : "Geçersiz depolama arka ucu \"%s\"",
"Access granted" : "Giriş kabul edildi",
"Error configuring Dropbox storage" : "Dropbox depo yapılandırma hatası",
"Grant access" : "Erişimi sağla",
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index a790ae3a113..1684c68c80c 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Güvenli https://",
"Public key" : "Ortak anahtar",
+ "Storage with id \"%i\" not found" : "\"%i\" kimliği ile bir depolama bulunamadı",
+ "Invalid mount point" : "Geçersiz bağlama noktası",
+ "Invalid storage backend \"%s\"" : "Geçersiz depolama arka ucu \"%s\"",
"Access granted" : "Giriş kabul edildi",
"Error configuring Dropbox storage" : "Dropbox depo yapılandırma hatası",
"Grant access" : "Erişimi sağla",
diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js
index 438359cd979..bb42457452d 100644
--- a/apps/files_external/l10n/uk.js
+++ b/apps/files_external/l10n/uk.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Захищений https://",
"Public key" : "Відкритий ключ",
+ "Storage with id \"%i\" not found" : "Сховище з id \"%i\" не знайдено",
+ "Invalid mount point" : "Невірна точка монтування",
+ "Invalid storage backend \"%s\"" : "Невірне сховище \"%s\"",
"Access granted" : "Доступ дозволено",
"Error configuring Dropbox storage" : "Помилка при налаштуванні сховища Dropbox",
"Grant access" : "Дозволити доступ",
@@ -53,6 +56,8 @@ OC.L10N.register(
"All users. Type to select user or group." : "Всі користувачі. Введіть ім'я користувача або групи.",
"(group)" : "(група)",
"Saved" : "Збереженно",
+ "Generate keys" : "Створити ключі",
+ "Error generating key pair" : "Помилка створення ключової пари",
"<b>Note:</b> " : "<b>Примітка:</b>",
"and" : "і",
"<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>Примітка:</b> Підтримку cURL в PHP не ввімкнено чи не встановлена. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.",
diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json
index 2df70501365..00c6b04088b 100644
--- a/apps/files_external/l10n/uk.json
+++ b/apps/files_external/l10n/uk.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Захищений https://",
"Public key" : "Відкритий ключ",
+ "Storage with id \"%i\" not found" : "Сховище з id \"%i\" не знайдено",
+ "Invalid mount point" : "Невірна точка монтування",
+ "Invalid storage backend \"%s\"" : "Невірне сховище \"%s\"",
"Access granted" : "Доступ дозволено",
"Error configuring Dropbox storage" : "Помилка при налаштуванні сховища Dropbox",
"Grant access" : "Дозволити доступ",
@@ -51,6 +54,8 @@
"All users. Type to select user or group." : "Всі користувачі. Введіть ім'я користувача або групи.",
"(group)" : "(група)",
"Saved" : "Збереженно",
+ "Generate keys" : "Створити ключі",
+ "Error generating key pair" : "Помилка створення ключової пари",
"<b>Note:</b> " : "<b>Примітка:</b>",
"and" : "і",
"<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>Примітка:</b> Підтримку cURL в PHP не ввімкнено чи не встановлена. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.",
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index ddfab439879..85a93a779ae 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -32,6 +32,10 @@ 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;
+
// whether to skip backend test (for unit tests, as this static class is not mockable)
public static $skipTest = false;
@@ -143,15 +147,9 @@ class OC_Mount_Config {
$mountPoints = array();
$datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
- $mount_file = \OC_Config::getValue("mount_file", $datadir . "/mount.json");
$backends = self::getBackends();
- //move config file to it's new position
- if (is_file(\OC::$SERVERROOT . '/config/mount.json')) {
- rename(\OC::$SERVERROOT . '/config/mount.json', $mount_file);
- }
-
// Load system mount points
$mountConfig = self::readData();
@@ -354,9 +352,17 @@ class OC_Mount_Config {
'backend' => $backends[$mount['class']]['backend'],
'priority' => $mount['priority'],
'options' => $mount['options'],
- 'applicable' => array('groups' => array($group), 'users' => array()),
- 'status' => self::getBackendStatus($mount['class'], $mount['options'], false)
+ 'applicable' => array('groups' => array($group), 'users' => array())
);
+ if (isset($mount['id'])) {
+ $config['id'] = (int)$mount['id'];
+ }
+ if (isset($mount['storage_id'])) {
+ $config['storage_id'] = (int)$mount['storage_id'];
+ }
+ if (isset($mount['mountOptions'])) {
+ $config['mountOptions'] = $mount['mountOptions'];
+ }
$hash = self::makeConfigHash($config);
// If an existing config exists (with same class, mountpoint and options)
if (isset($system[$hash])) {
@@ -388,9 +394,17 @@ class OC_Mount_Config {
'backend' => $backends[$mount['class']]['backend'],
'priority' => $mount['priority'],
'options' => $mount['options'],
- 'applicable' => array('groups' => array(), 'users' => array($user)),
- 'status' => self::getBackendStatus($mount['class'], $mount['options'], false)
+ 'applicable' => array('groups' => array(), 'users' => array($user))
);
+ if (isset($mount['id'])) {
+ $config['id'] = (int)$mount['id'];
+ }
+ if (isset($mount['storage_id'])) {
+ $config['storage_id'] = (int)$mount['storage_id'];
+ }
+ if (isset($mount['mountOptions'])) {
+ $config['mountOptions'] = $mount['mountOptions'];
+ }
$hash = self::makeConfigHash($config);
// If an existing config exists (with same class, mountpoint and options)
if (isset($system[$hash])) {
@@ -424,14 +438,23 @@ class OC_Mount_Config {
$mount['class'] = '\OC\Files\Storage\\' . substr($mount['class'], 15);
}
$mount['options'] = self::decryptPasswords($mount['options']);
- $personal[] = array(
+ $config = array(
'class' => $mount['class'],
// Remove '/uid/files/' from mount point
'mountpoint' => substr($mountPoint, strlen($uid) + 8),
'backend' => $backEnds[$mount['class']]['backend'],
- 'options' => $mount['options'],
- 'status' => self::getBackendStatus($mount['class'], $mount['options'], true)
+ 'options' => $mount['options']
);
+ if (isset($mount['id'])) {
+ $config['id'] = (int)$mount['id'];
+ }
+ if (isset($mount['storage_id'])) {
+ $config['storage_id'] = (int)$mount['storage_id'];
+ }
+ if (isset($mount['mountOptions'])) {
+ $config['mountOptions'] = $mount['mountOptions'];
+ }
+ $personal[] = $config;
}
}
return $personal;
@@ -442,11 +465,11 @@ class OC_Mount_Config {
*
* @param string $class backend class name
* @param array $options backend configuration options
- * @return bool true if the connection succeeded, false otherwise
+ * @return int see self::STATUS_*
*/
- private static function getBackendStatus($class, $options, $isPersonal) {
+ public static function getBackendStatus($class, $options, $isPersonal) {
if (self::$skipTest) {
- return true;
+ return self::STATUS_SUCCESS;
}
foreach ($options as &$option) {
$option = self::setUserVars(OCP\User::getUser(), $option);
@@ -454,13 +477,14 @@ class OC_Mount_Config {
if (class_exists($class)) {
try {
$storage = new $class($options);
- return $storage->test($isPersonal);
+ if ($storage->test($isPersonal)) {
+ return self::STATUS_SUCCESS;
+ }
} catch (Exception $exception) {
\OCP\Util::logException('files_external', $exception);
- return false;
}
}
- return false;
+ return self::STATUS_ERROR;
}
/**
@@ -474,6 +498,8 @@ class OC_Mount_Config {
* @param bool $isPersonal Personal or system mount point i.e. is this being called from the personal or admin page
* @param int|null $priority Mount point priority, null for default
* @return boolean
+ *
+ * @deprecated use StoragesService#addStorage() instead
*/
public static function addMountPoint($mountPoint,
$class,
@@ -537,7 +563,7 @@ class OC_Mount_Config {
self::writeData($isPersonal ? OCP\User::getUser() : null, $mountPoints);
$result = self::getBackendStatus($class, $classOptions, $isPersonal);
- if ($result && $isNew) {
+ if ($result === self::STATUS_SUCCESS && $isNew) {
\OC_Hook::emit(
\OC\Files\Filesystem::CLASSNAME,
\OC\Files\Filesystem::signal_create_mount,
@@ -558,6 +584,8 @@ class OC_Mount_Config {
* @param string $applicable User or group to remove mount from
* @param bool $isPersonal Personal or system mount point
* @return bool
+ *
+ * @deprecated use StoragesService#removeStorage() instead
*/
public static function removeMountPoint($mountPoint, $mountType, $applicable, $isPersonal = false) {
// Verify that the mount point applies for the current user
@@ -622,13 +650,10 @@ class OC_Mount_Config {
* @param string|null $user If not null, personal for $user, otherwise system
* @return array
*/
- private static function readData($user = null) {
- $parser = new \OC\ArrayParser();
+ public static function readData($user = null) {
if (isset($user)) {
- $phpFile = OC_User::getHome($user) . '/mount.php';
$jsonFile = OC_User::getHome($user) . '/mount.json';
} else {
- $phpFile = OC::$SERVERROOT . '/config/mount.php';
$datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/');
$jsonFile = \OC_Config::getValue('mount_file', $datadir . '/mount.json');
}
@@ -637,11 +662,6 @@ class OC_Mount_Config {
if (is_array($mountPoints)) {
return $mountPoints;
}
- } elseif (is_file($phpFile)) {
- $mountPoints = $parser->parsePHP(file_get_contents($phpFile));
- if (is_array($mountPoints)) {
- return $mountPoints;
- }
}
return array();
}
@@ -652,7 +672,7 @@ class OC_Mount_Config {
* @param string|null $user If not null, personal for $user, otherwise system
* @param array $data Mount points
*/
- private static function writeData($user, $data) {
+ public static function writeData($user, $data) {
if (isset($user)) {
$file = OC_User::getHome($user) . '/mount.json';
} else {
@@ -769,7 +789,7 @@ class OC_Mount_Config {
* @param array $options mount options
* @return array updated options
*/
- private static function encryptPasswords($options) {
+ public static function encryptPasswords($options) {
if (isset($options['password'])) {
$options['password_encrypted'] = self::encryptPassword($options['password']);
// do not unset the password, we want to keep the keys order
@@ -785,7 +805,7 @@ class OC_Mount_Config {
* @param array $options mount options
* @return array updated options
*/
- private static function decryptPasswords($options) {
+ public static function decryptPasswords($options) {
// note: legacy options might still have the unencrypted password in the "password" field
if (isset($options['password_encrypted'])) {
$options['password'] = self::decryptPassword($options['password_encrypted']);
@@ -871,12 +891,14 @@ class OC_Mount_Config {
* This is mostly used to find out whether configurations
* are the same.
*/
- private static function makeConfigHash($config) {
+ public static function makeConfigHash($config) {
$data = json_encode(
array(
'c' => $config['class'],
'm' => $config['mountpoint'],
- 'o' => $config['options']
+ 'o' => $config['options'],
+ 'p' => isset($config['priority']) ? $config['priority'] : -1,
+ 'mo' => isset($config['mountOptions']) ? $config['mountOptions'] : [],
)
);
return hash('md5', $data);
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index 3dea8515b7b..af0a81e58d5 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -100,7 +100,12 @@ class Dropbox extends \OC\Files\Storage\Common {
return $contents;
} else {
try {
- $response = $this->dropbox->getMetaData($path, 'false');
+ $requestPath = $path;
+ if ($path === '.') {
+ $requestPath = '';
+ }
+
+ $response = $this->dropbox->getMetaData($requestPath, 'false');
if (!isset($response['is_deleted']) || !$response['is_deleted']) {
$this->metaData[$path] = $response;
return $response;
diff --git a/apps/files_external/lib/notfoundexception.php b/apps/files_external/lib/notfoundexception.php
new file mode 100644
index 00000000000..d1d15309d5b
--- /dev/null
+++ b/apps/files_external/lib/notfoundexception.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_external;
+
+/**
+ * Storage is not found
+ */
+class NotFoundException extends \Exception {
+}
diff --git a/apps/files_external/lib/storageconfig.php b/apps/files_external/lib/storageconfig.php
new file mode 100644
index 00000000000..80d0152db8c
--- /dev/null
+++ b/apps/files_external/lib/storageconfig.php
@@ -0,0 +1,292 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_external\Lib;
+
+/**
+ * External storage configuration
+ */
+class StorageConfig implements \JsonSerializable {
+
+ /**
+ * Storage config id
+ *
+ * @var int
+ */
+ private $id;
+
+ /**
+ * Backend class name
+ *
+ * @var string
+ */
+ private $backendClass;
+
+ /**
+ * Backend options
+ *
+ * @var array
+ */
+ private $backendOptions = [];
+
+ /**
+ * Mount point path, relative to the user's "files" folder
+ *
+ * @var string
+ */
+ private $mountPoint;
+
+ /**
+ * Storage status
+ *
+ * @var int
+ */
+ private $status;
+
+ /**
+ * Priority
+ *
+ * @var int
+ */
+ private $priority;
+
+ /**
+ * List of users who have access to this storage
+ *
+ * @var array
+ */
+ private $applicableUsers = [];
+
+ /**
+ * List of groups that have access to this storage
+ *
+ * @var array
+ */
+ private $applicableGroups = [];
+
+ /**
+ * Mount-specific options
+ *
+ * @var array
+ */
+ private $mountOptions = [];
+
+ /**
+ * Creates a storage config
+ *
+ * @param int|null $id config id or null for a new config
+ */
+ public function __construct($id = null) {
+ $this->id = $id;
+ }
+
+ /**
+ * Returns the configuration id
+ *
+ * @return int
+ */
+ public function getId() {
+ return $this->id;
+ }
+
+ /**
+ * Sets the configuration id
+ *
+ * @param int $id configuration id
+ */
+ public function setId($id) {
+ $this->id = $id;
+ }
+
+ /**
+ * Returns mount point path relative to the user's
+ * "files" folder.
+ *
+ * @return string path
+ */
+ public function getMountPoint() {
+ return $this->mountPoint;
+ }
+
+ /**
+ * Sets mount point path relative to the user's
+ * "files" folder.
+ * The path will be normalized.
+ *
+ * @param string $mountPoint path
+ */
+ public function setMountPoint($mountPoint) {
+ $this->mountPoint = \OC\Files\Filesystem::normalizePath($mountPoint);
+ }
+
+ /**
+ * Returns the external storage backend class name
+ *
+ * @return string external storage backend class name
+ */
+ public function getBackendClass() {
+ return $this->backendClass;
+ }
+
+ /**
+ * Sets the external storage backend class name
+ *
+ * @param string external storage backend class name
+ */
+ public function setBackendClass($backendClass) {
+ $this->backendClass = $backendClass;
+ }
+
+ /**
+ * Returns the external storage backend-specific options
+ *
+ * @return array backend options
+ */
+ public function getBackendOptions() {
+ return $this->backendOptions;
+ }
+
+ /**
+ * Sets the external storage backend-specific options
+ *
+ * @param array $backendOptions backend options
+ */
+ public function setBackendOptions($backendOptions) {
+ $this->backendOptions = $backendOptions;
+ }
+
+ /**
+ * Returns the mount priority
+ *
+ * @return int priority
+ */
+ public function getPriority() {
+ return $this->priority;
+ }
+
+ /**
+ * Sets the mount priotity
+ *
+ * @param int $priority priority
+ */
+ public function setPriority($priority) {
+ $this->priority = $priority;
+ }
+
+ /**
+ * Returns the users for which to mount this storage
+ *
+ * @return array applicable users
+ */
+ public function getApplicableUsers() {
+ return $this->applicableUsers;
+ }
+
+ /**
+ * Sets the users for which to mount this storage
+ *
+ * @param array|null $applicableUsers applicable users
+ */
+ public function setApplicableUsers($applicableUsers) {
+ if (is_null($applicableUsers)) {
+ $applicableUsers = [];
+ }
+ $this->applicableUsers = $applicableUsers;
+ }
+
+ /**
+ * Returns the groups for which to mount this storage
+ *
+ * @return array applicable groups
+ */
+ public function getApplicableGroups() {
+ return $this->applicableGroups;
+ }
+
+ /**
+ * Sets the groups for which to mount this storage
+ *
+ * @param array|null $applicableGroups applicable groups
+ */
+ public function setApplicableGroups($applicableGroups) {
+ if (is_null($applicableGroups)) {
+ $applicableGroups = [];
+ }
+ $this->applicableGroups = $applicableGroups;
+ }
+
+ /**
+ * Returns the mount-specific options
+ *
+ * @return array mount specific options
+ */
+ public function getMountOptions() {
+ return $this->mountOptions;
+ }
+
+ /**
+ * Sets the mount-specific options
+ *
+ * @param array $mountOptions applicable groups
+ */
+ public function setMountOptions($mountOptions) {
+ if (is_null($mountOptions)) {
+ $mountOptions = [];
+ }
+ $this->mountOptions = $mountOptions;
+ }
+
+ /**
+ * Sets the storage status, whether the config worked last time
+ *
+ * @return int $status status
+ */
+ public function getStatus() {
+ return $this->status;
+ }
+
+ /**
+ * Sets the storage status, whether the config worked last time
+ *
+ * @param int $status status
+ */
+ public function setStatus($status) {
+ $this->status = $status;
+ }
+
+ /**
+ * Serialize config to JSON
+ *
+ * @return array
+ */
+ public function jsonSerialize() {
+ $result = [];
+ if (!is_null($this->id)) {
+ $result['id'] = $this->id;
+ }
+ $result['mountPoint'] = $this->mountPoint;
+ $result['backendClass'] = $this->backendClass;
+ $result['backendOptions'] = $this->backendOptions;
+ if (!is_null($this->priority)) {
+ $result['priority'] = $this->priority;
+ }
+ if (!empty($this->applicableUsers)) {
+ $result['applicableUsers'] = $this->applicableUsers;
+ }
+ if (!empty($this->applicableGroups)) {
+ $result['applicableGroups'] = $this->applicableGroups;
+ }
+ if (!empty($this->mountOptions)) {
+ $result['mountOptions'] = $this->mountOptions;
+ }
+ if (!is_null($this->status)) {
+ $result['status'] = $this->status;
+ }
+ return $result;
+ }
+}
diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php
index a279163ff70..8b435442259 100644
--- a/apps/files_external/personal.php
+++ b/apps/files_external/personal.php
@@ -24,9 +24,29 @@ OCP\Util::addScript('files_external', 'settings');
OCP\Util::addStyle('files_external', 'settings');
$backends = OC_Mount_Config::getPersonalBackends();
+$mounts = OC_Mount_Config::getPersonalMountPoints();
+$hasId = true;
+foreach ($mounts as $mount) {
+ if (!isset($mount['id'])) {
+ // some mount points are missing ids
+ $hasId = false;
+ break;
+ }
+}
+
+if (!$hasId) {
+ $service = new \OCA\Files_external\Service\UserStoragesService(\OC::$server->getUserSession());
+ // this will trigger the new storage code which will automatically
+ // generate storage config ids
+ $service->getAllStorages();
+ // re-read updated config
+ $mounts = OC_Mount_Config::getPersonalMountPoints();
+ // TODO: use the new storage config format in the template
+}
+
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('isAdminPage', false);
-$tmpl->assign('mounts', OC_Mount_Config::getPersonalMountPoints());
+$tmpl->assign('mounts', $mounts);
$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies());
$tmpl->assign('backends', $backends);
return $tmpl->fetchPage();
diff --git a/apps/files_external/service/globalstoragesservice.php b/apps/files_external/service/globalstoragesservice.php
new file mode 100644
index 00000000000..b024824c469
--- /dev/null
+++ b/apps/files_external/service/globalstoragesservice.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_external\Service;
+
+use \OCP\IUserSession;
+use \OC\Files\Filesystem;
+
+use \OCA\Files_external\Lib\StorageConfig;
+use \OCA\Files_external\NotFoundException;
+
+/**
+ * Service class to manage global external storages
+ */
+class GlobalStoragesService extends StoragesService {
+
+ /**
+ * Write the storages to the configuration.
+ *
+ * @param array $storages map of storage id to storage config
+ */
+ public function writeConfig($storages) {
+ // let the horror begin
+ $mountPoints = [];
+ foreach ($storages as $storageConfig) {
+ $mountPoint = $storageConfig->getMountPoint();
+ $oldBackendOptions = $storageConfig->getBackendOptions();
+ $storageConfig->setBackendOptions(
+ \OC_Mount_Config::encryptPasswords(
+ $oldBackendOptions
+ )
+ );
+
+ // system mount
+ $rootMountPoint = '/$user/files/' . ltrim($mountPoint, '/');
+
+ $applicableUsers = $storageConfig->getApplicableUsers();
+ $applicableGroups = $storageConfig->getApplicableGroups();
+ foreach ($applicableUsers as $applicable) {
+ $this->addMountPoint(
+ $mountPoints,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $applicable,
+ $rootMountPoint,
+ $storageConfig
+ );
+ }
+
+ foreach ($applicableGroups as $applicable) {
+ $this->addMountPoint(
+ $mountPoints,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ $applicable,
+ $rootMountPoint,
+ $storageConfig
+ );
+ }
+
+ // if neither "applicableGroups" or "applicableUsers" were set, use "all" user
+ if (empty($applicableUsers) && empty($applicableGroups)) {
+ $this->addMountPoint(
+ $mountPoints,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'all',
+ $rootMountPoint,
+ $storageConfig
+ );
+ }
+
+ // restore old backend options where the password was not encrypted,
+ // because we don't want to change the state of the original object
+ $storageConfig->setBackendOptions($oldBackendOptions);
+ }
+
+ \OC_Mount_Config::writeData(null, $mountPoints);
+ }
+
+ /**
+ * Triggers $signal for all applicable users of the given
+ * storage
+ *
+ * @param StorageConfig $storage storage data
+ * @param string $signal signal to trigger
+ */
+ protected function triggerHooks(StorageConfig $storage, $signal) {
+ $applicableUsers = $storage->getApplicableUsers();
+ $applicableGroups = $storage->getApplicableGroups();
+ if (empty($applicableUsers) && empty($applicableGroups)) {
+ // raise for user "all"
+ $this->triggerApplicableHooks(
+ $signal,
+ $storage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ ['all']
+ );
+ return;
+ }
+
+ $this->triggerApplicableHooks(
+ $signal,
+ $storage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $applicableUsers
+ );
+ $this->triggerApplicableHooks(
+ $signal,
+ $storage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ $applicableGroups
+ );
+ }
+
+ /**
+ * Triggers signal_create_mount or signal_delete_mount to
+ * accomodate for additions/deletions in applicableUsers
+ * and applicableGroups fields.
+ *
+ * @param StorageConfig $oldStorage old storage config
+ * @param StorageConfig $newStorage new storage config
+ */
+ protected function triggerChangeHooks(StorageConfig $oldStorage, StorageConfig $newStorage) {
+ // if mount point changed, it's like a deletion + creation
+ if ($oldStorage->getMountPoint() !== $newStorage->getMountPoint()) {
+ $this->triggerHooks($oldStorage, Filesystem::signal_delete_mount);
+ $this->triggerHooks($newStorage, Filesystem::signal_create_mount);
+ return;
+ }
+
+ $userAdditions = array_diff($newStorage->getApplicableUsers(), $oldStorage->getApplicableUsers());
+ $userDeletions = array_diff($oldStorage->getApplicableUsers(), $newStorage->getApplicableUsers());
+ $groupAdditions = array_diff($newStorage->getApplicableGroups(), $oldStorage->getApplicableGroups());
+ $groupDeletions = array_diff($oldStorage->getApplicableGroups(), $newStorage->getApplicableGroups());
+
+ // if no applicable were set, raise a signal for "all"
+ if (empty($oldStorage->getApplicableUsers()) && empty($oldStorage->getApplicableGroups())) {
+ $this->triggerApplicableHooks(
+ Filesystem::signal_delete_mount,
+ $oldStorage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ ['all']
+ );
+ }
+
+ // trigger delete for removed users
+ $this->triggerApplicableHooks(
+ Filesystem::signal_delete_mount,
+ $oldStorage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $userDeletions
+ );
+
+ // trigger delete for removed groups
+ $this->triggerApplicableHooks(
+ Filesystem::signal_delete_mount,
+ $oldStorage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ $groupDeletions
+ );
+
+ // and now add the new users
+ $this->triggerApplicableHooks(
+ Filesystem::signal_create_mount,
+ $newStorage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $userAdditions
+ );
+
+ // and now add the new groups
+ $this->triggerApplicableHooks(
+ Filesystem::signal_create_mount,
+ $newStorage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ $groupAdditions
+ );
+
+ // if no applicable, raise a signal for "all"
+ if (empty($newStorage->getApplicableUsers()) && empty($newStorage->getApplicableGroups())) {
+ $this->triggerApplicableHooks(
+ Filesystem::signal_create_mount,
+ $newStorage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ ['all']
+ );
+ }
+ }
+}
diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php
new file mode 100644
index 00000000000..6800474126f
--- /dev/null
+++ b/apps/files_external/service/storagesservice.php
@@ -0,0 +1,389 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_external\Service;
+
+use \OCP\IUserSession;
+use \OC\Files\Filesystem;
+
+use \OCA\Files_external\Lib\StorageConfig;
+use \OCA\Files_external\NotFoundException;
+
+/**
+ * Service class to manage external storages
+ */
+abstract class StoragesService {
+
+ /**
+ * Read legacy config data
+ *
+ * @return array list of mount configs
+ */
+ protected function readLegacyConfig() {
+ // read global config
+ return \OC_Mount_Config::readData();
+ }
+
+ /**
+ * Copy legacy storage options into the given storage config object.
+ *
+ * @param StorageConfig $storageConfig storage config to populate
+ * @param string $mountType mount type
+ * @param string $applicable applicable user or group
+ * @param array $storageOptions legacy storage options
+ *
+ * @return StorageConfig populated storage config
+ */
+ protected function populateStorageConfigWithLegacyOptions(
+ &$storageConfig,
+ $mountType,
+ $applicable,
+ $storageOptions
+ ) {
+ $storageConfig->setBackendClass($storageOptions['class']);
+ $storageConfig->setBackendOptions($storageOptions['options']);
+ if (isset($storageOptions['mountOptions'])) {
+ $storageConfig->setMountOptions($storageOptions['mountOptions']);
+ }
+ if (isset($storageOptions['priority'])) {
+ $storageConfig->setPriority($storageOptions['priority']);
+ }
+
+ if ($mountType === \OC_Mount_Config::MOUNT_TYPE_USER) {
+ $applicableUsers = $storageConfig->getApplicableUsers();
+ if ($applicable !== 'all') {
+ $applicableUsers[] = $applicable;
+ $storageConfig->setApplicableUsers($applicableUsers);
+ }
+ } else if ($mountType === \OC_Mount_Config::MOUNT_TYPE_GROUP) {
+ $applicableGroups = $storageConfig->getApplicableGroups();
+ $applicableGroups[] = $applicable;
+ $storageConfig->setApplicableGroups($applicableGroups);
+ }
+ return $storageConfig;
+ }
+
+ /**
+ * Read the external storages config
+ *
+ * @return array map of storage id to storage config
+ */
+ protected function readConfig() {
+ $mountPoints = $this->readLegacyConfig();
+
+ /**
+ * Here is the how the horribly messy mount point array looks like
+ * from the mount.json file:
+ *
+ * $storageOptions = $mountPoints[$mountType][$applicable][$mountPath]
+ *
+ * - $mountType is either "user" or "group"
+ * - $applicable is the name of a user or group (or the current user for personal mounts)
+ * - $mountPath is the mount point path (where the storage must be mounted)
+ * - $storageOptions is a map of storage options:
+ * - "priority": storage priority
+ * - "backend": backend class name
+ * - "options": backend-specific options
+ * - "mountOptions": mount-specific options (ex: disable previews, scanner, etc)
+ */
+
+ // group by storage id
+ $storages = [];
+
+ // for storages without id (legacy), group by config hash for
+ // later processing
+ $storagesWithConfigHash = [];
+
+ foreach ($mountPoints as $mountType => $applicables) {
+ foreach ($applicables as $applicable => $mountPaths) {
+ foreach ($mountPaths as $rootMountPath => $storageOptions) {
+ $currentStorage = null;
+
+ /**
+ * Flag whether the config that was read already has an id.
+ * If not, it will use a config hash instead and generate
+ * a proper id later
+ *
+ * @var boolean
+ */
+ $hasId = false;
+
+ // the root mount point is in the format "/$user/files/the/mount/point"
+ // we remove the "/$user/files" prefix
+ $parts = explode('/', trim($rootMountPath, '/'), 3);
+ if (count($parts) < 3) {
+ // something went wrong, skip
+ \OCP\Util::writeLog(
+ 'files_external',
+ 'Could not parse mount point "' . $rootMountPath . '"',
+ \OCP\Util::ERROR
+ );
+ continue;
+ }
+
+ $relativeMountPath = $parts[2];
+
+ // note: we cannot do this after the loop because the decrypted config
+ // options might be needed for the config hash
+ $storageOptions['options'] = \OC_Mount_Config::decryptPasswords($storageOptions['options']);
+
+ if (isset($storageOptions['id'])) {
+ $configId = (int)$storageOptions['id'];
+ if (isset($storages[$configId])) {
+ $currentStorage = $storages[$configId];
+ }
+ $hasId = true;
+ } else {
+ // missing id in legacy config, need to generate
+ // but at this point we don't know the max-id, so use
+ // first group it by config hash
+ $storageOptions['mountpoint'] = $rootMountPath;
+ $configId = \OC_Mount_Config::makeConfigHash($storageOptions);
+ if (isset($storagesWithConfigHash[$configId])) {
+ $currentStorage = $storagesWithConfigHash[$configId];
+ }
+ }
+
+ if (is_null($currentStorage)) {
+ // create new
+ $currentStorage = new StorageConfig($configId);
+ $currentStorage->setMountPoint($relativeMountPath);
+ }
+
+ $this->populateStorageConfigWithLegacyOptions(
+ $currentStorage,
+ $mountType,
+ $applicable,
+ $storageOptions
+ );
+
+ if ($hasId) {
+ $storages[$configId] = $currentStorage;
+ } else {
+ $storagesWithConfigHash[$configId] = $currentStorage;
+ }
+ }
+ }
+ }
+
+ // process storages with config hash, they must get a real id
+ if (!empty($storagesWithConfigHash)) {
+ $nextId = $this->generateNextId($storages);
+ foreach ($storagesWithConfigHash as $storage) {
+ $storage->setId($nextId);
+ $storages[$nextId] = $storage;
+ $nextId++;
+ }
+
+ // re-save the config with the generated ids
+ $this->writeConfig($storages);
+ }
+
+ return $storages;
+ }
+
+ /**
+ * Add mount point into the messy mount point structure
+ *
+ * @param array $mountPoints messy array of mount points
+ * @param string $mountType mount type
+ * @param string $applicable single applicable user or group
+ * @param string $rootMountPoint root mount point to use
+ * @param array $storageConfig storage config to set to the mount point
+ */
+ protected function addMountPoint(&$mountPoints, $mountType, $applicable, $rootMountPoint, $storageConfig) {
+ if (!isset($mountPoints[$mountType])) {
+ $mountPoints[$mountType] = [];
+ }
+
+ if (!isset($mountPoints[$mountType][$applicable])) {
+ $mountPoints[$mountType][$applicable] = [];
+ }
+
+ $options = [
+ 'id' => $storageConfig->getId(),
+ 'class' => $storageConfig->getBackendClass(),
+ 'options' => $storageConfig->getBackendOptions(),
+ ];
+
+ if (!is_null($storageConfig->getPriority())) {
+ $options['priority'] = $storageConfig->getPriority();
+ }
+ if (!empty($storageConfig->getMountOptions())) {
+ $options['mountOptions'] = $storageConfig->getMountOptions();
+ }
+
+ $mountPoints[$mountType][$applicable][$rootMountPoint] = $options;
+ }
+
+ /**
+ * Write the storages to the configuration.
+ *
+ * @param array $storages map of storage id to storage config
+ */
+ abstract protected function writeConfig($storages);
+
+ /**
+ * Get a storage with status
+ *
+ * @param int $id storage id
+ *
+ * @return StorageConfig
+ * @throws NotFoundException if the storage with the given id was not found
+ */
+ public function getStorage($id) {
+ $allStorages = $this->readConfig();
+
+ if (!isset($allStorages[$id])) {
+ throw new NotFoundException('Storage with id "' . $id . '" not found');
+ }
+
+ return $allStorages[$id];
+ }
+
+ /**
+ * Gets all storages
+ *
+ * @return array array of storage configs
+ */
+ public function getAllStorages() {
+ return $this->readConfig();
+ }
+
+ /**
+ * Add new storage to the configuration
+ *
+ * @param array $newStorage storage attributes
+ *
+ * @return StorageConfig storage config, with added id
+ */
+ public function addStorage(StorageConfig $newStorage) {
+ $allStorages = $this->readConfig();
+
+ $configId = $this->generateNextId($allStorages);
+ $newStorage->setId($configId);
+
+ // add new storage
+ $allStorages[$configId] = $newStorage;
+
+ $this->writeConfig($allStorages);
+
+ $this->triggerHooks($newStorage, Filesystem::signal_create_mount);
+
+ $newStorage->setStatus(\OC_Mount_Config::STATUS_SUCCESS);
+ return $newStorage;
+ }
+
+ /**
+ * Triggers the given hook signal for all the applicables given
+ *
+ * @param string $signal signal
+ * @param string $mountPoint hook mount pount param
+ * @param string $mountType hook mount type param
+ * @param array $applicableArray array of applicable users/groups for which to trigger the hook
+ */
+ protected function triggerApplicableHooks($signal, $mountPoint, $mountType, $applicableArray) {
+ foreach ($applicableArray as $applicable) {
+ \OC_Hook::emit(
+ Filesystem::CLASSNAME,
+ $signal,
+ [
+ Filesystem::signal_param_path => $mountPoint,
+ Filesystem::signal_param_mount_type => $mountType,
+ Filesystem::signal_param_users => $applicable,
+ ]
+ );
+ }
+ }
+
+ /**
+ * Triggers $signal for all applicable users of the given
+ * storage
+ *
+ * @param StorageConfig $storage storage data
+ * @param string $signal signal to trigger
+ */
+ abstract protected function triggerHooks(StorageConfig $storage, $signal);
+
+ /**
+ * Triggers signal_create_mount or signal_delete_mount to
+ * accomodate for additions/deletions in applicableUsers
+ * and applicableGroups fields.
+ *
+ * @param StorageConfig $oldStorage old storage data
+ * @param StorageConfig $newStorage new storage data
+ */
+ abstract protected function triggerChangeHooks(StorageConfig $oldStorage, StorageConfig $newStorage);
+
+ /**
+ * Update storage to the configuration
+ *
+ * @param StorageConfig $updatedStorage storage attributes
+ *
+ * @return StorageConfig storage config
+ * @throws NotFoundException if the given storage does not exist in the config
+ */
+ public function updateStorage(StorageConfig $updatedStorage) {
+ $allStorages = $this->readConfig();
+
+ $id = $updatedStorage->getId();
+ if (!isset($allStorages[$id])) {
+ throw new NotFoundException('Storage with id "' . $id . '" not found');
+ }
+
+ $oldStorage = $allStorages[$id];
+ $allStorages[$id] = $updatedStorage;
+
+ $this->writeConfig($allStorages);
+
+ $this->triggerChangeHooks($oldStorage, $updatedStorage);
+
+ return $this->getStorage($id);
+ }
+
+ /**
+ * Delete the storage with the given id.
+ *
+ * @param int $id storage id
+ *
+ * @throws NotFoundException if no storage was found with the given id
+ */
+ public function removeStorage($id) {
+ $allStorages = $this->readConfig();
+
+ if (!isset($allStorages[$id])) {
+ throw new NotFoundException('Storage with id "' . $id . '" not found');
+ }
+
+ $deletedStorage = $allStorages[$id];
+ unset($allStorages[$id]);
+
+ $this->writeConfig($allStorages);
+
+ $this->triggerHooks($deletedStorage, Filesystem::signal_delete_mount);
+ }
+
+ /**
+ * Generates a configuration id to use for a new configuration entry.
+ *
+ * @param array $allStorages array of all storage configs
+ *
+ * @return int id
+ */
+ protected function generateNextId($allStorages) {
+ if (empty($allStorages)) {
+ return 1;
+ }
+ // note: this will mess up with with concurrency,
+ // but so did the mount.json. This horribly hack
+ // will disappear once we move to DB tables to
+ // store the config
+ return (max(array_keys($allStorages)) + 1);
+ }
+
+}
diff --git a/apps/files_external/service/userstoragesservice.php b/apps/files_external/service/userstoragesservice.php
new file mode 100644
index 00000000000..df452a48126
--- /dev/null
+++ b/apps/files_external/service/userstoragesservice.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_external\Service;
+
+use \OCP\IUserSession;
+use \OC\Files\Filesystem;
+
+use \OCA\Files_external\Lib\StorageConfig;
+use \OCA\Files_external\NotFoundException;
+
+/**
+ * Service class to manage user external storages
+ * (aka personal storages)
+ */
+class UserStoragesService extends StoragesService {
+
+ /**
+ * User session
+ *
+ * @var IUserSession
+ */
+ private $userSession;
+
+ /**
+ * Create a user storages service
+ *
+ * @param IUserSession $userSession user session
+ */
+ public function __construct(
+ IUserSession $userSession
+ ) {
+ $this->userSession = $userSession;
+ }
+
+ /**
+ * Read legacy config data
+ *
+ * @return array list of storage configs
+ */
+ protected function readLegacyConfig() {
+ // read user config
+ $user = $this->userSession->getUser()->getUID();
+ return \OC_Mount_Config::readData($user);
+ }
+
+ /**
+ * Read the external storages config
+ *
+ * @return array map of storage id to storage config
+ */
+ protected function readConfig() {
+ $user = $this->userSession->getUser()->getUID();
+ // TODO: in the future don't rely on the global config reading code
+ $storages = parent::readConfig();
+
+ $filteredStorages = [];
+ foreach ($storages as $configId => $storage) {
+ // filter out all bogus storages that aren't for the current user
+ if (!in_array($user, $storage->getApplicableUsers())) {
+ continue;
+ }
+
+ // clear applicable users, should not be used
+ $storage->setApplicableUsers([]);
+
+ // strip out unneeded applicableUser fields
+ $filteredStorages[$configId] = $storage;
+ }
+
+ return $filteredStorages;
+ }
+
+ /**
+ * Write the storages to the user's configuration.
+ *
+ * @param array $storages map of storage id to storage config
+ */
+ public function writeConfig($storages) {
+ $user = $this->userSession->getUser()->getUID();
+
+ // let the horror begin
+ $mountPoints = [];
+ foreach ($storages as $storageConfig) {
+ $mountPoint = $storageConfig->getMountPoint();
+ $oldBackendOptions = $storageConfig->getBackendOptions();
+ $storageConfig->setBackendOptions(
+ \OC_Mount_Config::encryptPasswords(
+ $oldBackendOptions
+ )
+ );
+
+ $rootMountPoint = '/' . $user . '/files/' . ltrim($mountPoint, '/');
+
+ $this->addMountPoint(
+ $mountPoints,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $user,
+ $rootMountPoint,
+ $storageConfig
+ );
+
+ // restore old backend options where the password was not encrypted,
+ // because we don't want to change the state of the original object
+ $storageConfig->setBackendOptions($oldBackendOptions);
+ }
+
+ \OC_Mount_Config::writeData($user, $mountPoints);
+ }
+
+ /**
+ * Triggers $signal for all applicable users of the given
+ * storage
+ *
+ * @param StorageConfig $storage storage data
+ * @param string $signal signal to trigger
+ */
+ protected function triggerHooks(StorageConfig $storage, $signal) {
+ $user = $this->userSession->getUser()->getUID();
+
+ // trigger hook for the current user
+ $this->triggerApplicableHooks(
+ $signal,
+ $storage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ [$user]
+ );
+ }
+
+ /**
+ * Triggers signal_create_mount or signal_delete_mount to
+ * accomodate for additions/deletions in applicableUsers
+ * and applicableGroups fields.
+ *
+ * @param StorageConfig $oldStorage old storage data
+ * @param StorageConfig $newStorage new storage data
+ */
+ protected function triggerChangeHooks(StorageConfig $oldStorage, StorageConfig $newStorage) {
+ // if mount point changed, it's like a deletion + creation
+ if ($oldStorage->getMountPoint() !== $newStorage->getMountPoint()) {
+ $this->triggerHooks($oldStorage, Filesystem::signal_delete_mount);
+ $this->triggerHooks($newStorage, Filesystem::signal_create_mount);
+ }
+ }
+}
diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php
index dec329e82a2..3144e1a2ab6 100644
--- a/apps/files_external/settings.php
+++ b/apps/files_external/settings.php
@@ -42,9 +42,29 @@ foreach ($backends as $class => $backend)
}
}
+$mounts = OC_Mount_Config::getSystemMountPoints();
+$hasId = true;
+foreach ($mounts as $mount) {
+ if (!isset($mount['id'])) {
+ // some mount points are missing ids
+ $hasId = false;
+ break;
+ }
+}
+
+if (!$hasId) {
+ $service = new \OCA\Files_external\Service\GlobalStoragesService();
+ // this will trigger the new storage code which will automatically
+ // generate storage config ids
+ $service->getAllStorages();
+ // re-read updated config
+ $mounts = OC_Mount_Config::getSystemMountPoints();
+ // TODO: use the new storage config format in the template
+}
+
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('isAdminPage', true);
-$tmpl->assign('mounts', OC_Mount_Config::getSystemMountPoints());
+$tmpl->assign('mounts', $mounts);
$tmpl->assign('backends', $backends);
$tmpl->assign('personal_backends', $personal_backends);
$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies());
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 79950f30385..4866d177634 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -13,13 +13,11 @@
</tr>
</thead>
<tbody>
- <?php $_['mounts'] = array_merge($_['mounts'], array('' => array())); ?>
+ <?php $_['mounts'] = array_merge($_['mounts'], array('' => array('id' => ''))); ?>
<?php foreach ($_['mounts'] as $mount): ?>
- <tr <?php print_unescaped(isset($mount['mountpoint']) ? 'class="'.OC_Util::sanitizeHTML($mount['class']).'"' : 'id="addMountPoint"'); ?>>
+ <tr <?php print_unescaped(isset($mount['mountpoint']) ? 'class="'.OC_Util::sanitizeHTML($mount['class']).'"' : 'id="addMountPoint"'); ?> data-id="<?php p($mount['id']) ?>">
<td class="status">
- <?php if (isset($mount['status'])): ?>
- <span class="<?php p(($mount['status']) ? 'success' : 'error'); ?>"></span>
- <?php endif; ?>
+ <span></span>
</td>
<td class="mountPoint"><input type="text" name="mountPoint"
value="<?php p(isset($mount['mountpoint']) ? $mount['mountpoint'] : ''); ?>"
@@ -28,7 +26,7 @@
</td>
<?php if (!isset($mount['mountpoint'])): ?>
<td class="backend">
- <select id="selectBackend" data-configurations='<?php p(json_encode($_['backends'])); ?>'>
+ <select id="selectBackend" class="selectBackend" data-configurations='<?php p(json_encode($_['backends'])); ?>'>
<option value="" disabled selected
style="display:none;"><?php p($l->t('Add storage')); ?></option>
<?php foreach ($_['backends'] as $class => $backend): ?>
@@ -80,6 +78,14 @@
<?php OCP\Util::addScript('files_external', $_['backends'][$mount['class']]['custom']); ?>
<?php endif; ?>
<?php endif; ?>
+ <?php if (isset($mount['mountOptions'])): ?>
+ <input type="hidden" class="mountOptions" value="<?php p(json_encode($mount['mountOptions'])) ?>" />
+ <?php endif; ?>
+ <?php if ($_['isAdminPage']): ?>
+ <?php if (isset($mount['priority'])): ?>
+ <input type="hidden" class="priority" value="<?php p($mount['priority']) ?>" />
+ <?php endif; ?>
+ <?php endif; ?>
</td>
<?php if ($_['isAdminPage']): ?>
<td class="applicable"
diff --git a/lib/private/fileproxy/fileoperations.php b/apps/files_external/tests/controller/globalstoragescontrollertest.php
index b2ff2e7e5e9..7ba4d16a7e9 100644
--- a/lib/private/fileproxy/fileoperations.php
+++ b/apps/files_external/tests/controller/globalstoragescontrollertest.php
@@ -2,8 +2,8 @@
/**
* ownCloud
*
- * @author Bjoern Schiessle
- * @copyright 2012 Bjoern Schiessle <schiessle@owncloud.com>
+ * @author Vincent Petry
+ * Copyright (c) 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
@@ -19,19 +19,23 @@
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
+namespace OCA\Files_external\Tests\Controller;
-/**
- * check if standard file operations
- */
+use \OCA\Files_external\Controller\GlobalStoragesController;
+use \OCA\Files_external\Service\GlobalStoragesService;
+use \OCP\AppFramework\Http;
+use \OCA\Files_external\NotFoundException;
-class OC_FileProxy_FileOperations extends OC_FileProxy{
- static $rootView;
+class GlobalStoragesControllerTest extends StoragesControllerTest {
+ public function setUp() {
+ parent::setUp();
+ $this->service = $this->getMock('\OCA\Files_external\Service\GlobalStoragesService');
- public function premkdir($path) {
- if(!self::$rootView) {
- self::$rootView = new \OC\Files\View('');
- }
- return !self::$rootView->file_exists($path);
+ $this->controller = new GlobalStoragesController(
+ 'files_external',
+ $this->getMock('\OCP\IRequest'),
+ $this->getMock('\OCP\IL10N'),
+ $this->service
+ );
}
-
}
diff --git a/apps/files_external/tests/controller/storagescontrollertest.php b/apps/files_external/tests/controller/storagescontrollertest.php
new file mode 100644
index 00000000000..853b4a86f03
--- /dev/null
+++ b/apps/files_external/tests/controller/storagescontrollertest.php
@@ -0,0 +1,225 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry
+ * Copyright (c) 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/>.
+ *
+ */
+namespace OCA\Files_external\Tests\Controller;
+
+use \OCP\AppFramework\Http;
+
+use \OCA\Files_external\Controller\GlobalStoragesController;
+use \OCA\Files_external\Service\GlobalStoragesService;
+use \OCA\Files_external\Lib\StorageConfig;
+use \OCA\Files_external\NotFoundException;
+
+abstract class StoragesControllerTest extends \Test\TestCase {
+
+ /**
+ * @var GlobalStoragesController
+ */
+ protected $controller;
+
+ /**
+ * @var GlobalStoragesService
+ */
+ protected $service;
+
+ public function setUp() {
+ \OC_Mount_Config::$skipTest = true;
+ }
+
+ public function tearDown() {
+ \OC_Mount_Config::$skipTest = false;
+ }
+
+ public function testAddStorage() {
+ $storageConfig = new StorageConfig(1);
+ $storageConfig->setMountPoint('mount');
+
+ $this->service->expects($this->once())
+ ->method('addStorage')
+ ->will($this->returnValue($storageConfig));
+
+ $response = $this->controller->create(
+ 'mount',
+ '\OC\Files\Storage\SMB',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $data = $response->getData();
+ $this->assertEquals($storageConfig, $data);
+ $this->assertEquals(Http::STATUS_CREATED, $response->getStatus());
+ }
+
+ public function testUpdateStorage() {
+ $storageConfig = new StorageConfig(1);
+ $storageConfig->setMountPoint('mount');
+
+ $this->service->expects($this->once())
+ ->method('updateStorage')
+ ->will($this->returnValue($storageConfig));
+
+ $response = $this->controller->update(
+ 1,
+ 'mount',
+ '\OC\Files\Storage\SMB',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $data = $response->getData();
+ $this->assertEquals($storageConfig, $data);
+ $this->assertEquals(Http::STATUS_OK, $response->getStatus());
+ }
+
+ function mountPointNamesProvider() {
+ return array(
+ array(''),
+ array('/'),
+ array('//'),
+ );
+ }
+
+ /**
+ * @dataProvider mountPointNamesProvider
+ */
+ public function testAddOrUpdateStorageInvalidMountPoint($mountPoint) {
+ $this->service->expects($this->never())
+ ->method('addStorage');
+ $this->service->expects($this->never())
+ ->method('updateStorage');
+
+ $response = $this->controller->create(
+ $mountPoint,
+ '\OC\Files\Storage\SMB',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
+
+ $response = $this->controller->update(
+ 1,
+ $mountPoint,
+ '\OC\Files\Storage\SMB',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
+ }
+
+ public function testAddOrUpdateStorageInvalidBackend() {
+ $this->service->expects($this->never())
+ ->method('addStorage');
+ $this->service->expects($this->never())
+ ->method('updateStorage');
+
+ $response = $this->controller->create(
+ 'mount',
+ '\OC\Files\Storage\InvalidStorage',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
+
+ $response = $this->controller->update(
+ 1,
+ 'mount',
+ '\OC\Files\Storage\InvalidStorage',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
+ }
+
+ public function testUpdateStorageNonExisting() {
+ $this->service->expects($this->once())
+ ->method('updateStorage')
+ ->will($this->throwException(new NotFoundException()));
+
+ $response = $this->controller->update(
+ 255,
+ 'mount',
+ '\OC\Files\Storage\SMB',
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_NOT_FOUND, $response->getStatus());
+ }
+
+ public function testDeleteStorage() {
+ $this->service->expects($this->once())
+ ->method('removeStorage');
+
+ $response = $this->controller->destroy(1);
+ $this->assertEquals(Http::STATUS_NO_CONTENT, $response->getStatus());
+ }
+
+ public function testDeleteStorageNonExisting() {
+ $this->service->expects($this->once())
+ ->method('removeStorage')
+ ->will($this->throwException(new NotFoundException()));
+
+ $response = $this->controller->destroy(255);
+ $this->assertEquals(Http::STATUS_NOT_FOUND, $response->getStatus());
+ }
+
+ public function testGetStorage() {
+ $storageConfig = new StorageConfig(1);
+ $storageConfig->setMountPoint('test');
+ $storageConfig->setBackendClass('\OC\Files\Storage\SMB');
+ $storageConfig->setBackendOptions(['user' => 'test', 'password', 'password123']);
+ $storageConfig->setMountOptions(['priority' => false]);
+
+ $this->service->expects($this->once())
+ ->method('getStorage')
+ ->with(1)
+ ->will($this->returnValue($storageConfig));
+ $response = $this->controller->show(1);
+
+ $this->assertEquals(Http::STATUS_OK, $response->getStatus());
+ $this->assertEquals($storageConfig, $response->getData());
+ }
+}
diff --git a/apps/files_external/tests/controller/userstoragescontrollertest.php b/apps/files_external/tests/controller/userstoragescontrollertest.php
new file mode 100644
index 00000000000..0ba413f6959
--- /dev/null
+++ b/apps/files_external/tests/controller/userstoragescontrollertest.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry
+ * Copyright (c) 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/>.
+ *
+ */
+namespace OCA\Files_external\Tests\Controller;
+
+use \OCA\Files_external\Controller\UserStoragesController;
+use \OCA\Files_external\Service\UserStoragesService;
+use \OCP\AppFramework\Http;
+use \OCA\Files_external\NotFoundException;
+
+class UserStoragesControllerTest extends StoragesControllerTest {
+
+ /**
+ * @var array
+ */
+ private $oldAllowedBackends;
+
+ public function setUp() {
+ parent::setUp();
+ $this->service = $this->getMockBuilder('\OCA\Files_external\Service\UserStoragesService')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->controller = new UserStoragesController(
+ 'files_external',
+ $this->getMock('\OCP\IRequest'),
+ $this->getMock('\OCP\IL10N'),
+ $this->service
+ );
+
+ $config = \OC::$server->getConfig();
+
+ $this->oldAllowedBackends = $config->getAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ ''
+ );
+ $config->setAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ '\OC\Files\Storage\SMB'
+ );
+ }
+
+ public function tearDown() {
+ $config = \OC::$server->getConfig();
+ $config->setAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ $this->oldAllowedBackends
+ );
+ parent::tearDown();
+ }
+
+ function disallowedBackendClassProvider() {
+ return array(
+ array('\OC\Files\Storage\Local'),
+ array('\OC\Files\Storage\FTP'),
+ );
+ }
+ /**
+ * @dataProvider disallowedBackendClassProvider
+ */
+ public function testAddOrUpdateStorageDisallowedBackend($backendClass) {
+ $this->service->expects($this->never())
+ ->method('addStorage');
+ $this->service->expects($this->never())
+ ->method('updateStorage');
+
+ $response = $this->controller->create(
+ 'mount',
+ $backendClass,
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
+
+ $response = $this->controller->update(
+ 1,
+ 'mount',
+ $backendClass,
+ array(),
+ [],
+ [],
+ [],
+ null
+ );
+
+ $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
+ }
+
+}
diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js
new file mode 100644
index 00000000000..5a3ee2cb5f1
--- /dev/null
+++ b/apps/files_external/tests/js/settingsSpec.js
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+describe('OCA.External.Settings tests', function() {
+ var clock;
+ var select2Stub;
+ var select2ApplicableUsers;
+
+ beforeEach(function() {
+ clock = sinon.useFakeTimers();
+ select2Stub = sinon.stub($.fn, 'select2', function(args) {
+ if (args === 'val') {
+ return select2ApplicableUsers;
+ }
+ return {
+ on: function() {}
+ };
+ });
+
+ // view still requires an existing DOM table
+ $('#testArea').append(
+ '<table id="externalStorage" data-admin="true">' +
+ '<thead></thead>' +
+ '<tbody>' +
+ '<tr id="addMountPoint" data-id="">' +
+ '<td class="status"></td>' +
+ '<td class="mountPoint"><input type="text" name="mountPoint"/></td>' +
+ '<td class="backend">' +
+ '<select class="selectBackend">' +
+ '<option disable selected>Add storage</option>' +
+ '<option value="\\OC\\TestBackend">Test Backend</option>' +
+ '<option value="\\OC\\AnotherTestBackend">Another Test Backend</option>' +
+ '</select>' +
+ '</td>' +
+ '<td class="configuration"></td>' +
+ '<td class="applicable">' +
+ '<input type="hidden" class="applicableUsers">' +
+ '</td>' +
+ '<td><img alt="Delete" title="Delete" class="svg action"/></td>' +
+ '</tr>' +
+ '</tbody>' +
+ '</table>'
+ );
+ // these are usually appended into the data attribute
+ // within the DOM by the server template
+ $('#externalStorage .selectBackend:first').data('configurations', {
+ '\\OC\\TestBackend': {
+ 'backend': 'Test Backend Name',
+ 'configuration': {
+ 'field1': 'Display Name 1',
+ 'field2': '&Display Name 2'
+ },
+ 'priority': 11
+ },
+ '\\OC\\AnotherTestBackend': {
+ 'backend': 'Another Test Backend Name',
+ 'configuration': {
+ 'field1': 'Display Name 1',
+ 'field2': '&Display Name 2'
+ },
+ 'priority': 12
+ }
+ }
+ );
+ });
+ afterEach(function() {
+ select2Stub.restore();
+ clock.restore();
+ });
+
+ describe('storage configuration', function() {
+ var view;
+
+ function selectBackend(backendName) {
+ view.$el.find('.selectBackend:first').val('\\OC\\TestBackend').trigger('change');
+ }
+
+ beforeEach(function() {
+ var $el = $('#externalStorage');
+ view = new OCA.External.Settings.MountConfigListView($el);
+ });
+ afterEach(function() {
+ view = null;
+ });
+ describe('selecting backend', function() {
+ it('populates the row and creates a new empty one', function() {
+ var $firstRow = view.$el.find('tr:first');
+ selectBackend('\\OC\\TestBackend');
+ expect($firstRow.find('.backend').text()).toEqual('Test Backend');
+ expect($firstRow.find('.selectBackend').length).toEqual(0);
+
+ // TODO: check "remove" button visibility
+
+ // the suggested mount point name
+ expect($firstRow.find('[name=mountPoint]').val()).toEqual('TestBackend');
+
+ // TODO: check that the options have been created
+
+ // TODO: check select2 call on the ".applicableUsers" element
+
+ var $emptyRow = $firstRow.next('tr');
+ expect($emptyRow.length).toEqual(1);
+ expect($emptyRow.find('.selectBackend').length).toEqual(1);
+ expect($emptyRow.find('.applicable select').length).toEqual(0);
+
+ // TODO: check "remove" button visibility
+ });
+ // TODO: test with personal mounts (no applicable fields)
+ // TODO: test suggested mount point logic
+ });
+ describe('saving storages', function() {
+ it('saves storage after editing config', function() {
+ var $tr = view.$el.find('tr:first');
+ selectBackend('\\OC\\TestBackend');
+
+ var $field1 = $tr.find('input[data-parameter=field1]');
+ expect($field1.length).toEqual(1);
+ $field1.val('test');
+ $field1.trigger(new $.Event('keyup', {keyCode: 97}));
+
+ clock.tick(4000);
+
+ expect(fakeServer.requests.length).toEqual(1);
+ var request = fakeServer.requests[0];
+ expect(request.url).toEqual(OC.webroot + '/index.php/apps/files_external/globalstorages');
+ expect(OC.parseQueryString(request.requestBody)).toEqual({
+ backendClass: '\\OC\\TestBackend',
+ 'backendOptions[field1]': 'test',
+ 'backendOptions[field2]': '',
+ mountPoint: 'TestBackend',
+ priority: '11'
+ });
+
+ // TODO: respond and check data-id
+ });
+ // TODO: tests with "applicableUsers" and "applicableGroups"
+ // TODO: test with non-optional config parameters
+ // TODO: test with missing mount point value
+ // TODO: test with personal mounts (no applicable fields)
+ // TODO: test save triggers: paste, keyup, checkbox
+ // TODO: test "custom" field with addScript
+ // TODO: status indicator
+ });
+ describe('update storage', function() {
+ // TODO
+ });
+ describe('delete storage', function() {
+ // TODO
+ });
+ describe('recheck storages', function() {
+ // TODO
+ });
+ });
+ describe('applicable user list', function() {
+ // TODO: test select2 retrieval logic
+ });
+ describe('allow user mounts section', function() {
+ // TODO: test allowUserMounting section
+ });
+});
diff --git a/apps/files_external/tests/mountconfig.php b/apps/files_external/tests/mountconfig.php
index f00812c5671..645f0c64e11 100644
--- a/apps/files_external/tests/mountconfig.php
+++ b/apps/files_external/tests/mountconfig.php
@@ -252,7 +252,7 @@ class Test_Mount_Config extends \Test\TestCase {
'password' => '12345',
);
- $this->assertEquals(true, OC_Mount_Config::addMountPoint('/ext', 'Test_Mount_Config_Dummy_Storage', $storageOptions, $mountType, $applicable, $isPersonal));
+ $this->assertEquals(0, OC_Mount_Config::addMountPoint('/ext', 'Test_Mount_Config_Dummy_Storage', $storageOptions, $mountType, $applicable, $isPersonal));
$config = $this->readGlobalConfig();
$this->assertEquals(1, count($config));
@@ -279,7 +279,7 @@ class Test_Mount_Config extends \Test\TestCase {
'password' => '12345',
);
- $this->assertEquals(true, OC_Mount_Config::addMountPoint('/ext', 'Test_Mount_Config_Dummy_Storage', $storageOptions, $mountType, $applicable, $isPersonal));
+ $this->assertEquals(0, OC_Mount_Config::addMountPoint('/ext', 'Test_Mount_Config_Dummy_Storage', $storageOptions, $mountType, $applicable, $isPersonal));
$config = $this->readUserConfig();
$this->assertEquals(1, count($config));
@@ -382,7 +382,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -422,7 +423,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -459,7 +461,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
$mountPoint,
'Test_Mount_Config_Dummy_Storage',
@@ -492,7 +495,8 @@ class Test_Mount_Config extends \Test\TestCase {
// edit
$mountConfig['host'] = 'anothersmbhost';
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
$mountPoint,
'Test_Mount_Config_Dummy_Storage',
@@ -557,7 +561,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -598,7 +603,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -707,7 +713,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// add mount point as "test" user
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -750,7 +757,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -761,7 +769,8 @@ class Test_Mount_Config extends \Test\TestCase {
)
);
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -772,7 +781,8 @@ class Test_Mount_Config extends \Test\TestCase {
)
);
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -783,7 +793,8 @@ class Test_Mount_Config extends \Test\TestCase {
)
);
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -821,7 +832,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// write config
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -839,7 +851,8 @@ class Test_Mount_Config extends \Test\TestCase {
'share' => 'anothersmbshare',
'root' => 'anothersmbroot'
);
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -952,7 +965,8 @@ class Test_Mount_Config extends \Test\TestCase {
// Add mount points
foreach($mounts as $i => $mount) {
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -987,7 +1001,8 @@ class Test_Mount_Config extends \Test\TestCase {
'share' => '',
);
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
$class,
@@ -1005,7 +1020,8 @@ class Test_Mount_Config extends \Test\TestCase {
$mountPoints['/'.self::TEST_USER1.'/files/ext']['priority']);
// Simulate changed mount options (without priority set)
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
$class,
@@ -1035,7 +1051,8 @@ class Test_Mount_Config extends \Test\TestCase {
);
// Create personal mount point
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
'Test_Mount_Config_Dummy_Storage',
@@ -1066,7 +1083,8 @@ class Test_Mount_Config extends \Test\TestCase {
$applicable = 'all';
$isPersonal = false;
- $this->assertTrue(
+ $this->assertEquals(
+ 0,
OC_Mount_Config::addMountPoint(
'/ext',
$storageClass,
diff --git a/apps/files_external/tests/service/globalstoragesservicetest.php b/apps/files_external/tests/service/globalstoragesservicetest.php
new file mode 100644
index 00000000000..4c038bc489e
--- /dev/null
+++ b/apps/files_external/tests/service/globalstoragesservicetest.php
@@ -0,0 +1,815 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry
+ * Copyright (c) 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/>.
+ *
+ */
+namespace OCA\Files_external\Tests\Service;
+
+use \OC\Files\Filesystem;
+
+use \OCA\Files_external\Service\GlobalStoragesService;
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+
+class GlobalStoragesServiceTest extends StoragesServiceTest {
+ public function setUp() {
+ parent::setUp();
+ $this->service = new GlobalStoragesService();
+ }
+
+ public function tearDown() {
+ @unlink($this->dataDir . '/mount.json');
+ parent::tearDown();
+ }
+
+ protected function makeTestStorageData() {
+ return $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'applicableUsers' => [],
+ 'applicableGroups' => [],
+ 'priority' => 15,
+ 'mountOptions' => [
+ 'preview' => false,
+ ]
+ ]);
+ }
+
+ function storageDataProvider() {
+ return [
+ // all users
+ [
+ $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'applicableUsers' => [],
+ 'applicableGroups' => [],
+ 'priority' => 15,
+ ]),
+ ],
+ // some users
+ [
+ $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'applicableUsers' => ['user1', 'user2'],
+ 'applicableGroups' => [],
+ 'priority' => 15,
+ ]),
+ ],
+ // some groups
+ [
+ $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'applicableUsers' => [],
+ 'applicableGroups' => ['group1', 'group2'],
+ 'priority' => 15,
+ ]),
+ ],
+ // both users and groups
+ [
+ $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'applicableUsers' => ['user1', 'user2'],
+ 'applicableGroups' => ['group1', 'group2'],
+ 'priority' => 15,
+ ]),
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider storageDataProvider
+ */
+ public function testAddStorage($storage) {
+ $newStorage = $this->service->addStorage($storage);
+
+ $this->assertEquals(1, $newStorage->getId());
+
+
+ $newStorage = $this->service->getStorage(1);
+
+ $this->assertEquals($storage->getMountPoint(), $newStorage->getMountPoint());
+ $this->assertEquals($storage->getBackendClass(), $newStorage->getBackendClass());
+ $this->assertEquals($storage->getBackendOptions(), $newStorage->getBackendOptions());
+ $this->assertEquals($storage->getApplicableUsers(), $newStorage->getApplicableUsers());
+ $this->assertEquals($storage->getApplicableGroups(), $newStorage->getApplicableGroups());
+ $this->assertEquals($storage->getPriority(), $newStorage->getPriority());
+ $this->assertEquals(1, $newStorage->getId());
+ $this->assertEquals(0, $newStorage->getStatus());
+
+ // next one gets id 2
+ $nextStorage = $this->service->addStorage($storage);
+ $this->assertEquals(2, $nextStorage->getId());
+ }
+
+ /**
+ * @dataProvider storageDataProvider
+ */
+ public function testUpdateStorage($updatedStorage) {
+ $storage = $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'applicableUsers' => [],
+ 'applicableGroups' => [],
+ 'priority' => 15,
+ ]);
+
+ $newStorage = $this->service->addStorage($storage);
+ $this->assertEquals(1, $newStorage->getId());
+
+ $updatedStorage->setId(1);
+
+ $this->service->updateStorage($updatedStorage);
+ $newStorage = $this->service->getStorage(1);
+
+ $this->assertEquals($updatedStorage->getMountPoint(), $newStorage->getMountPoint());
+ $this->assertEquals($updatedStorage->getBackendOptions()['password'], $newStorage->getBackendOptions()['password']);
+ $this->assertEquals($updatedStorage->getApplicableUsers(), $newStorage->getApplicableUsers());
+ $this->assertEquals($updatedStorage->getApplicableGroups(), $newStorage->getApplicableGroups());
+ $this->assertEquals($updatedStorage->getPriority(), $newStorage->getPriority());
+ $this->assertEquals(1, $newStorage->getId());
+ $this->assertEquals(0, $newStorage->getStatus());
+ }
+
+ function hooksAddStorageDataProvider() {
+ return [
+ // applicable all
+ [
+ [],
+ [],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'all'
+ ],
+ ],
+ ],
+ // single user
+ [
+ ['user1'],
+ [],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ ],
+ ],
+ // single group
+ [
+ [],
+ ['group1'],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1',
+ ],
+ ],
+ ],
+ // multiple users
+ [
+ ['user1', 'user2'],
+ [],
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ ],
+ ],
+ // multiple groups
+ [
+ [],
+ ['group1', 'group2'],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1'
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2'
+ ],
+ ],
+ ],
+ // mixed groups and users
+ [
+ ['user1', 'user2'],
+ ['group1', 'group2'],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1'
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2'
+ ],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider hooksAddStorageDataProvider
+ */
+ public function testHooksAddStorage($applicableUsers, $applicableGroups, $expectedCalls) {
+ $storage = $this->makeTestStorageData();
+ $storage->setApplicableUsers($applicableUsers);
+ $storage->setApplicableGroups($applicableGroups);
+ $this->service->addStorage($storage);
+
+ $this->assertCount(count($expectedCalls), self::$hookCalls);
+
+ foreach ($expectedCalls as $index => $call) {
+ $this->assertHookCall(
+ self::$hookCalls[$index],
+ $call[0],
+ $storage->getMountPoint(),
+ $call[1],
+ $call[2]
+ );
+ }
+ }
+
+ function hooksUpdateStorageDataProvider() {
+ return [
+ [
+ // nothing to multiple users and groups
+ [],
+ [],
+ ['user1', 'user2'],
+ ['group1', 'group2'],
+ // expected hook calls
+ [
+ // delete the "all entry"
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'all',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1'
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2'
+ ],
+ ],
+ ],
+ [
+ // adding a user and a group
+ ['user1'],
+ ['group1'],
+ ['user1', 'user2'],
+ ['group1', 'group2'],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2'
+ ],
+ ],
+ ],
+ [
+ // removing a user and a group
+ ['user1', 'user2'],
+ ['group1', 'group2'],
+ ['user1'],
+ ['group1'],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2'
+ ],
+ ],
+ ],
+ [
+ // removing all
+ ['user1'],
+ ['group1'],
+ [],
+ [],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1'
+ ],
+ // create the "all" entry
+ [
+ Filesystem::signal_create_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'all'
+ ],
+ ],
+ ],
+ [
+ // no changes
+ ['user1'],
+ ['group1'],
+ ['user1'],
+ ['group1'],
+ // no hook calls
+ []
+ ]
+ ];
+ }
+
+ /**
+ * @dataProvider hooksUpdateStorageDataProvider
+ */
+ public function testHooksUpdateStorage(
+ $sourceApplicableUsers,
+ $sourceApplicableGroups,
+ $updatedApplicableUsers,
+ $updatedApplicableGroups,
+ $expectedCalls) {
+
+ $storage = $this->makeTestStorageData();
+ $storage->setApplicableUsers($sourceApplicableUsers);
+ $storage->setApplicableGroups($sourceApplicableGroups);
+ $storage = $this->service->addStorage($storage);
+
+ $storage->setapplicableUsers($updatedApplicableUsers);
+ $storage->setapplicableGroups($updatedApplicableGroups);
+
+ // reset calls
+ self::$hookCalls = [];
+
+ $this->service->updateStorage($storage);
+
+ $this->assertCount(count($expectedCalls), self::$hookCalls);
+
+ foreach ($expectedCalls as $index => $call) {
+ $this->assertHookCall(
+ self::$hookCalls[$index],
+ $call[0],
+ '/mountpoint',
+ $call[1],
+ $call[2]
+ );
+ }
+ }
+
+ /**
+ */
+ public function testHooksRenameMountPoint() {
+ $storage = $this->makeTestStorageData();
+ $storage->setApplicableUsers(['user1', 'user2']);
+ $storage->setApplicableGroups(['group1', 'group2']);
+ $storage = $this->service->addStorage($storage);
+
+ $storage->setMountPoint('renamedMountpoint');
+
+ // reset calls
+ self::$hookCalls = [];
+
+ $this->service->updateStorage($storage);
+
+ $expectedCalls = [
+ // deletes old mount
+ [
+ Filesystem::signal_delete_mount,
+ '/mountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ '/mountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ '/mountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ '/mountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2',
+ ],
+ // creates new one
+ [
+ Filesystem::signal_create_mount,
+ '/renamedMountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ '/renamedMountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ '/renamedMountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1',
+ ],
+ [
+ Filesystem::signal_create_mount,
+ '/renamedMountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2',
+ ],
+ ];
+
+ $this->assertCount(count($expectedCalls), self::$hookCalls);
+
+ foreach ($expectedCalls as $index => $call) {
+ $this->assertHookCall(
+ self::$hookCalls[$index],
+ $call[0],
+ $call[1],
+ $call[2],
+ $call[3]
+ );
+ }
+ }
+
+ function hooksDeleteStorageDataProvider() {
+ return [
+ [
+ ['user1', 'user2'],
+ ['group1', 'group2'],
+ // expected hook calls
+ [
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user1',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'user2',
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group1'
+ ],
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ 'group2'
+ ],
+ ],
+ ],
+ [
+ // deleting "all" entry
+ [],
+ [],
+ [
+ [
+ Filesystem::signal_delete_mount,
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ 'all',
+ ],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider hooksDeleteStorageDataProvider
+ */
+ public function testHooksDeleteStorage(
+ $sourceApplicableUsers,
+ $sourceApplicableGroups,
+ $expectedCalls) {
+
+ $storage = $this->makeTestStorageData();
+ $storage->setApplicableUsers($sourceApplicableUsers);
+ $storage->setApplicableGroups($sourceApplicableGroups);
+ $storage = $this->service->addStorage($storage);
+
+ // reset calls
+ self::$hookCalls = [];
+
+ $this->service->removeStorage($storage->getId());
+
+ $this->assertCount(count($expectedCalls), self::$hookCalls);
+
+ foreach ($expectedCalls as $index => $call) {
+ $this->assertHookCall(
+ self::$hookCalls[$index],
+ $call[0],
+ '/mountpoint',
+ $call[1],
+ $call[2]
+ );
+ }
+ }
+
+ /**
+ * Make sure it uses the correct format when reading/writing
+ * the legacy config
+ */
+ public function testLegacyConfigConversionApplicableAll() {
+ $configFile = $this->dataDir . '/mount.json';
+
+ $storage = $this->makeTestStorageData();
+ $storage = $this->service->addStorage($storage);
+
+ $json = json_decode(file_get_contents($configFile), true);
+
+ $this->assertCount(1, $json);
+
+ $this->assertEquals([\OC_Mount_Config::MOUNT_TYPE_USER], array_keys($json));
+ $this->assertEquals(['all'], array_keys($json[\OC_Mount_config::MOUNT_TYPE_USER]));
+
+ $mountPointData = $json[\OC_Mount_config::MOUNT_TYPE_USER]['all'];
+ $this->assertEquals(['/$user/files/mountpoint'], array_keys($mountPointData));
+
+ $mountPointOptions = current($mountPointData);
+ $this->assertEquals(1, $mountPointOptions['id']);
+ $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']);
+ $this->assertEquals(15, $mountPointOptions['priority']);
+ $this->assertEquals(false, $mountPointOptions['mountOptions']['preview']);
+
+ $backendOptions = $mountPointOptions['options'];
+ $this->assertEquals('value1', $backendOptions['option1']);
+ $this->assertEquals('value2', $backendOptions['option2']);
+ $this->assertEquals('', $backendOptions['password']);
+ $this->assertNotEmpty($backendOptions['password_encrypted']);
+ }
+
+ /**
+ * Make sure it uses the correct format when reading/writing
+ * the legacy config
+ */
+ public function testLegacyConfigConversionApplicableUserAndGroup() {
+ $configFile = $this->dataDir . '/mount.json';
+
+ $storage = $this->makeTestStorageData();
+ $storage->setApplicableUsers(['user1', 'user2']);
+ $storage->setApplicableGroups(['group1', 'group2']);
+
+ $storage = $this->service->addStorage($storage);
+
+ $json = json_decode(file_get_contents($configFile), true);
+
+ $this->assertCount(2, $json);
+
+ $this->assertTrue(isset($json[\OC_Mount_Config::MOUNT_TYPE_USER]));
+ $this->assertTrue(isset($json[\OC_Mount_Config::MOUNT_TYPE_GROUP]));
+ $this->assertEquals(['user1', 'user2'], array_keys($json[\OC_Mount_config::MOUNT_TYPE_USER]));
+ $this->assertEquals(['group1', 'group2'], array_keys($json[\OC_Mount_config::MOUNT_TYPE_GROUP]));
+
+ // check that all options are the same for both users and both groups
+ foreach ($json[\OC_Mount_Config::MOUNT_TYPE_USER] as $mountPointData) {
+ $this->assertEquals(['/$user/files/mountpoint'], array_keys($mountPointData));
+
+ $mountPointOptions = current($mountPointData);
+
+ $this->assertEquals(1, $mountPointOptions['id']);
+ $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']);
+ $this->assertEquals(15, $mountPointOptions['priority']);
+ $this->assertEquals(false, $mountPointOptions['mountOptions']['preview']);
+
+ $backendOptions = $mountPointOptions['options'];
+ $this->assertEquals('value1', $backendOptions['option1']);
+ $this->assertEquals('value2', $backendOptions['option2']);
+ $this->assertEquals('', $backendOptions['password']);
+ $this->assertNotEmpty($backendOptions['password_encrypted']);
+ }
+
+ foreach ($json[\OC_Mount_Config::MOUNT_TYPE_GROUP] as $mountPointData) {
+ $this->assertEquals(['/$user/files/mountpoint'], array_keys($mountPointData));
+
+ $mountPointOptions = current($mountPointData);
+
+ $this->assertEquals(1, $mountPointOptions['id']);
+ $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']);
+ $this->assertEquals(15, $mountPointOptions['priority']);
+ $this->assertEquals(false, $mountPointOptions['mountOptions']['preview']);
+
+ $backendOptions = $mountPointOptions['options'];
+ $this->assertEquals('value1', $backendOptions['option1']);
+ $this->assertEquals('value2', $backendOptions['option2']);
+ $this->assertEquals('', $backendOptions['password']);
+ $this->assertNotEmpty($backendOptions['password_encrypted']);
+ }
+ }
+
+ /**
+ * Test reading in a legacy config and generating config ids.
+ */
+ public function testReadLegacyConfigAndGenerateConfigId() {
+ $configFile = $this->dataDir . '/mount.json';
+
+ $legacyBackendOptions = [
+ 'user' => 'someuser',
+ 'password' => 'somepassword',
+ ];
+ $legacyBackendOptions = \OC_Mount_Config::encryptPasswords($legacyBackendOptions);
+
+ $legacyConfig = [
+ 'class' => '\OC\Files\Storage\SMB',
+ 'options' => $legacyBackendOptions,
+ 'mountOptions' => ['preview' => false],
+ ];
+ // different mount options
+ $legacyConfig2 = [
+ 'class' => '\OC\Files\Storage\SMB',
+ 'options' => $legacyBackendOptions,
+ 'mountOptions' => ['preview' => true],
+ ];
+
+ $legacyBackendOptions2 = $legacyBackendOptions;
+ $legacyBackendOptions2 = ['user' => 'someuser2', 'password' => 'somepassword2'];
+ $legacyBackendOptions2 = \OC_Mount_Config::encryptPasswords($legacyBackendOptions2);
+
+ // different config
+ $legacyConfig3 = [
+ 'class' => '\OC\Files\Storage\SMB',
+ 'options' => $legacyBackendOptions2,
+ 'mountOptions' => ['preview' => true],
+ ];
+
+ $json = [
+ 'user' => [
+ 'user1' => [
+ '/$user/files/somemount' => $legacyConfig,
+ ],
+ // same config
+ 'user2' => [
+ '/$user/files/somemount' => $legacyConfig,
+ ],
+ // different mountOptions
+ 'user3' => [
+ '/$user/files/somemount' => $legacyConfig2,
+ ],
+ // different mount point
+ 'user4' => [
+ '/$user/files/anothermount' => $legacyConfig,
+ ],
+ // different storage config
+ 'user5' => [
+ '/$user/files/somemount' => $legacyConfig3,
+ ],
+ ],
+ 'group' => [
+ 'group1' => [
+ // will get grouped with user configs
+ '/$user/files/somemount' => $legacyConfig,
+ ],
+ ],
+ ];
+
+ file_put_contents($configFile, json_encode($json));
+
+ $allStorages = $this->service->getAllStorages();
+
+ $this->assertCount(4, $allStorages);
+
+ $storage1 = $allStorages[1];
+ $storage2 = $allStorages[2];
+ $storage3 = $allStorages[3];
+ $storage4 = $allStorages[4];
+
+ $this->assertEquals('/somemount', $storage1->getMountPoint());
+ $this->assertEquals('someuser', $storage1->getBackendOptions()['user']);
+ $this->assertEquals('somepassword', $storage1->getBackendOptions()['password']);
+ $this->assertEquals(['user1', 'user2'], $storage1->getApplicableUsers());
+ $this->assertEquals(['group1'], $storage1->getApplicableGroups());
+ $this->assertEquals(['preview' => false], $storage1->getMountOptions());
+
+ $this->assertEquals('/somemount', $storage2->getMountPoint());
+ $this->assertEquals('someuser', $storage2->getBackendOptions()['user']);
+ $this->assertEquals('somepassword', $storage2->getBackendOptions()['password']);
+ $this->assertEquals(['user3'], $storage2->getApplicableUsers());
+ $this->assertEquals([], $storage2->getApplicableGroups());
+ $this->assertEquals(['preview' => true], $storage2->getMountOptions());
+
+ $this->assertEquals('/anothermount', $storage3->getMountPoint());
+ $this->assertEquals('someuser', $storage3->getBackendOptions()['user']);
+ $this->assertEquals('somepassword', $storage3->getBackendOptions()['password']);
+ $this->assertEquals(['user4'], $storage3->getApplicableUsers());
+ $this->assertEquals([], $storage3->getApplicableGroups());
+ $this->assertEquals(['preview' => false], $storage3->getMountOptions());
+
+ $this->assertEquals('/somemount', $storage4->getMountPoint());
+ $this->assertEquals('someuser2', $storage4->getBackendOptions()['user']);
+ $this->assertEquals('somepassword2', $storage4->getBackendOptions()['password']);
+ $this->assertEquals(['user5'], $storage4->getApplicableUsers());
+ $this->assertEquals([], $storage4->getApplicableGroups());
+ $this->assertEquals(['preview' => true], $storage4->getMountOptions());
+ }
+}
diff --git a/apps/files_external/tests/service/storagesservicetest.php b/apps/files_external/tests/service/storagesservicetest.php
new file mode 100644
index 00000000000..445e86d4117
--- /dev/null
+++ b/apps/files_external/tests/service/storagesservicetest.php
@@ -0,0 +1,183 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry
+ * Copyright (c) 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/>.
+ *
+ */
+namespace OCA\Files_external\Tests\Service;
+
+use \OC\Files\Filesystem;
+
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+
+abstract class StoragesServiceTest extends \Test\TestCase {
+
+ /**
+ * @var StoragesService
+ */
+ protected $service;
+
+ /**
+ * Data directory
+ *
+ * @var string
+ */
+ protected $dataDir;
+
+ /**
+ * Hook calls
+ *
+ * @var array
+ */
+ protected static $hookCalls;
+
+ public function setUp() {
+ self::$hookCalls = array();
+ $config = \OC::$server->getConfig();
+ $this->dataDir = $config->getSystemValue(
+ 'datadirectory',
+ \OC::$SERVERROOT . '/data/'
+ );
+ \OC_Mount_Config::$skipTest = true;
+
+ \OCP\Util::connectHook(
+ Filesystem::CLASSNAME,
+ Filesystem::signal_create_mount,
+ get_class($this), 'createHookCallback');
+ \OCP\Util::connectHook(
+ Filesystem::CLASSNAME,
+ Filesystem::signal_delete_mount,
+ get_class($this), 'deleteHookCallback');
+
+ }
+
+ public function tearDown() {
+ \OC_Mount_Config::$skipTest = false;
+ self::$hookCalls = array();
+ }
+
+ /**
+ * Creates a StorageConfig instance based on array data
+ *
+ * @param array data
+ *
+ * @return StorageConfig storage config instance
+ */
+ protected function makeStorageConfig($data) {
+ $storage = new StorageConfig();
+ if (isset($data['id'])) {
+ $storage->setId($data['id']);
+ }
+ $storage->setMountPoint($data['mountPoint']);
+ $storage->setBackendClass($data['backendClass']);
+ $storage->setBackendOptions($data['backendOptions']);
+ if (isset($data['applicableUsers'])) {
+ $storage->setApplicableUsers($data['applicableUsers']);
+ }
+ if (isset($data['applicableGroups'])) {
+ $storage->setApplicableGroups($data['applicableGroups']);
+ }
+ if (isset($data['priority'])) {
+ $storage->setPriority($data['priority']);
+ }
+ if (isset($data['mountOptions'])) {
+ $storage->setMountOptions($data['mountOptions']);
+ }
+ return $storage;
+ }
+
+
+ /**
+ * @expectedException \OCA\Files_external\NotFoundException
+ */
+ public function testNonExistingStorage() {
+ $storage = new StorageConfig(255);
+ $storage->setMountPoint('mountpoint');
+ $storage->setBackendClass('\OC\Files\Storage\SMB');
+ $this->service->updateStorage($storage);
+ }
+
+ public function testDeleteStorage() {
+ $storage = new StorageConfig(255);
+ $storage->setMountPoint('mountpoint');
+ $storage->setBackendClass('\OC\Files\Storage\SMB');
+ $storage->setBackendOptions(['password' => 'testPassword']);
+
+ $newStorage = $this->service->addStorage($storage);
+ $this->assertEquals(1, $newStorage->getId());
+
+ $newStorage = $this->service->removeStorage(1);
+
+ $caught = false;
+ try {
+ $this->service->getStorage(1);
+ } catch (NotFoundException $e) {
+ $caught = true;
+ }
+
+ $this->assertTrue($caught);
+ }
+
+ /**
+ * @expectedException \OCA\Files_external\NotFoundException
+ */
+ public function testDeleteUnexistingStorage() {
+ $this->service->removeStorage(255);
+ }
+
+ public static function createHookCallback($params) {
+ self::$hookCalls[] = array(
+ 'signal' => Filesystem::signal_create_mount,
+ 'params' => $params
+ );
+ }
+
+ public static function deleteHookCallback($params) {
+ self::$hookCalls[] = array(
+ 'signal' => Filesystem::signal_delete_mount,
+ 'params' => $params
+ );
+ }
+
+ /**
+ * Asserts hook call
+ *
+ * @param array $callData hook call data to check
+ * @param string $signal signal name
+ * @param string $mountPath mount path
+ * @param string $mountType mount type
+ * @param string $applicable applicable users
+ */
+ protected function assertHookCall($callData, $signal, $mountPath, $mountType, $applicable) {
+ $this->assertEquals($signal, $callData['signal']);
+ $params = $callData['params'];
+ $this->assertEquals(
+ $mountPath,
+ $params[Filesystem::signal_param_path]
+ );
+ $this->assertEquals(
+ $mountType,
+ $params[Filesystem::signal_param_mount_type]
+ );
+ $this->assertEquals(
+ $applicable,
+ $params[Filesystem::signal_param_users]
+ );
+ }
+}
diff --git a/apps/files_external/tests/service/userstoragesservicetest.php b/apps/files_external/tests/service/userstoragesservicetest.php
new file mode 100644
index 00000000000..dd3f9e1b92c
--- /dev/null
+++ b/apps/files_external/tests/service/userstoragesservicetest.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry
+ * Copyright (c) 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/>.
+ *
+ */
+namespace OCA\Files_external\Tests\Service;
+
+use \OC\Files\Filesystem;
+
+use \OCA\Files_external\Service\UserStoragesService;
+use \OCA\Files_external\NotFoundException;
+use \OCA\Files_external\Lib\StorageConfig;
+
+class UserStoragesServiceTest extends StoragesServiceTest {
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->userId = $this->getUniqueID('user_');
+
+ $this->user = new \OC\User\User($this->userId, null);
+ $userSession = $this->getMock('\OCP\IUserSession');
+ $userSession
+ ->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($this->user));
+
+ $this->service = new UserStoragesService($userSession);
+
+ // create home folder
+ mkdir($this->dataDir . '/' . $this->userId . '/');
+ }
+
+ public function tearDown() {
+ @unlink($this->dataDir . '/' . $this->userId . '/mount.json');
+ parent::tearDown();
+ }
+
+ private function makeTestStorageData() {
+ return $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ 'mountOptions' => [
+ 'preview' => false,
+ ]
+ ]);
+ }
+
+ public function testAddStorage() {
+ $storage = $this->makeTestStorageData();
+
+ $newStorage = $this->service->addStorage($storage);
+
+ $this->assertEquals(1, $newStorage->getId());
+
+ $newStorage = $this->service->getStorage(1);
+
+ $this->assertEquals($storage->getMountPoint(), $newStorage->getMountPoint());
+ $this->assertEquals($storage->getBackendClass(), $newStorage->getBackendClass());
+ $this->assertEquals($storage->getBackendOptions(), $newStorage->getBackendOptions());
+ $this->assertEquals(1, $newStorage->getId());
+ $this->assertEquals(0, $newStorage->getStatus());
+
+ // hook called once for user
+ $this->assertHookCall(
+ current(self::$hookCalls),
+ Filesystem::signal_create_mount,
+ $storage->getMountPoint(),
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $this->userId
+ );
+
+ // next one gets id 2
+ $nextStorage = $this->service->addStorage($storage);
+ $this->assertEquals(2, $nextStorage->getId());
+ }
+
+ public function testUpdateStorage() {
+ $storage = $this->makeStorageConfig([
+ 'mountPoint' => 'mountpoint',
+ 'backendClass' => '\OC\Files\Storage\SMB',
+ 'backendOptions' => [
+ 'option1' => 'value1',
+ 'option2' => 'value2',
+ 'password' => 'testPassword',
+ ],
+ ]);
+
+ $newStorage = $this->service->addStorage($storage);
+ $this->assertEquals(1, $newStorage->getId());
+
+ $backendOptions = $newStorage->getBackendOptions();
+ $backendOptions['password'] = 'anotherPassword';
+ $newStorage->setBackendOptions($backendOptions);
+
+ self::$hookCalls = [];
+
+ $newStorage = $this->service->updateStorage($newStorage);
+
+ $this->assertEquals('anotherPassword', $newStorage->getBackendOptions()['password']);
+ // these attributes are unused for user storages
+ $this->assertEmpty($newStorage->getApplicableUsers());
+ $this->assertEmpty($newStorage->getApplicableGroups());
+ $this->assertEquals(1, $newStorage->getId());
+ $this->assertEquals(0, $newStorage->getStatus());
+
+ // no hook calls
+ $this->assertEmpty(self::$hookCalls);
+ }
+
+ public function testDeleteStorage() {
+ parent::testDeleteStorage();
+
+ // hook called once for user (first one was during test creation)
+ $this->assertHookCall(
+ self::$hookCalls[1],
+ Filesystem::signal_delete_mount,
+ '/mountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $this->userId
+ );
+ }
+
+ public function testHooksRenameMountPoint() {
+ $storage = $this->makeTestStorageData();
+ $storage = $this->service->addStorage($storage);
+
+ $storage->setMountPoint('renamedMountpoint');
+
+ // reset calls
+ self::$hookCalls = [];
+
+ $this->service->updateStorage($storage);
+
+ // hook called twice
+ $this->assertHookCall(
+ self::$hookCalls[0],
+ Filesystem::signal_delete_mount,
+ '/mountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $this->userId
+ );
+ $this->assertHookCall(
+ self::$hookCalls[1],
+ Filesystem::signal_create_mount,
+ '/renamedMountpoint',
+ \OC_Mount_Config::MOUNT_TYPE_USER,
+ $this->userId
+ );
+ }
+
+ /**
+ * Make sure it uses the correct format when reading/writing
+ * the legacy config
+ */
+ public function testLegacyConfigConversion() {
+ $configFile = $this->dataDir . '/' . $this->userId . '/mount.json';
+
+ $storage = $this->makeTestStorageData();
+ $storage = $this->service->addStorage($storage);
+
+ $json = json_decode(file_get_contents($configFile), true);
+
+ $this->assertCount(1, $json);
+
+ $this->assertEquals([\OC_Mount_Config::MOUNT_TYPE_USER], array_keys($json));
+ $this->assertEquals([$this->userId], array_keys($json[\OC_Mount_config::MOUNT_TYPE_USER]));
+
+ $mountPointData = $json[\OC_Mount_config::MOUNT_TYPE_USER][$this->userId];
+ $this->assertEquals(['/' . $this->userId . '/files/mountpoint'], array_keys($mountPointData));
+
+ $mountPointOptions = current($mountPointData);
+ $this->assertEquals(1, $mountPointOptions['id']);
+ $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']);
+ $this->assertEquals(false, $mountPointOptions['mountOptions']['preview']);
+
+ $backendOptions = $mountPointOptions['options'];
+ $this->assertEquals('value1', $backendOptions['option1']);
+ $this->assertEquals('value2', $backendOptions['option2']);
+ $this->assertEquals('', $backendOptions['password']);
+ $this->assertNotEmpty($backendOptions['password_encrypted']);
+ }
+
+ /**
+ * Test reading in a legacy config and generating config ids.
+ */
+ public function testReadLegacyConfigAndGenerateConfigId() {
+ $configFile = $this->dataDir . '/' . $this->userId . '/mount.json';
+
+ $legacyBackendOptions = [
+ 'user' => 'someuser',
+ 'password' => 'somepassword',
+ ];
+ $legacyBackendOptions = \OC_Mount_Config::encryptPasswords($legacyBackendOptions);
+
+ $legacyConfig = [
+ 'class' => '\OC\Files\Storage\SMB',
+ 'options' => $legacyBackendOptions,
+ 'mountOptions' => ['preview' => false],
+ ];
+ // different mount options
+ $legacyConfig2 = [
+ 'class' => '\OC\Files\Storage\SMB',
+ 'options' => $legacyBackendOptions,
+ 'mountOptions' => ['preview' => true],
+ ];
+
+ $json = ['user' => []];
+ $json['user'][$this->userId] = [
+ '/$user/files/somemount' => $legacyConfig,
+ '/$user/files/anothermount' => $legacyConfig2,
+ ];
+
+ file_put_contents($configFile, json_encode($json));
+
+ $allStorages = $this->service->getAllStorages();
+
+ $this->assertCount(2, $allStorages);
+
+ $storage1 = $allStorages[1];
+ $storage2 = $allStorages[2];
+
+ $this->assertEquals('/somemount', $storage1->getMountPoint());
+ $this->assertEquals('someuser', $storage1->getBackendOptions()['user']);
+ $this->assertEquals('somepassword', $storage1->getBackendOptions()['password']);
+ $this->assertEquals(['preview' => false], $storage1->getMountOptions());
+
+ $this->assertEquals('/anothermount', $storage2->getMountPoint());
+ $this->assertEquals('someuser', $storage2->getBackendOptions()['user']);
+ $this->assertEquals('somepassword', $storage2->getBackendOptions()['password']);
+ $this->assertEquals(['preview' => true], $storage2->getMountOptions());
+ }
+}
diff --git a/apps/files_external/tests/storageconfigtest.php b/apps/files_external/tests/storageconfigtest.php
new file mode 100644
index 00000000000..ec79b1bf306
--- /dev/null
+++ b/apps/files_external/tests/storageconfigtest.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry
+ * Copyright (c) 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/>.
+ *
+ */
+
+namespace OCA\Files_external\Tests;
+
+use \OCA\Files_external\Lib\StorageConfig;
+
+class StorageConfigTest extends \Test\TestCase {
+
+ public function testJsonSerialization() {
+ $storageConfig = new StorageConfig(1);
+ $storageConfig->setMountPoint('test');
+ $storageConfig->setBackendClass('\OC\Files\Storage\SMB');
+ $storageConfig->setBackendOptions(['user' => 'test', 'password' => 'password123']);
+ $storageConfig->setPriority(128);
+ $storageConfig->setApplicableUsers(['user1', 'user2']);
+ $storageConfig->setApplicableGroups(['group1', 'group2']);
+ $storageConfig->setMountOptions(['preview' => false]);
+
+ $json = $storageConfig->jsonSerialize();
+
+ $this->assertEquals(1, $json['id']);
+ $this->assertEquals('/test', $json['mountPoint']);
+ $this->assertEquals('\OC\Files\Storage\SMB', $json['backendClass']);
+ $this->assertEquals('test', $json['backendOptions']['user']);
+ $this->assertEquals('password123', $json['backendOptions']['password']);
+ $this->assertEquals(128, $json['priority']);
+ $this->assertEquals(['user1', 'user2'], $json['applicableUsers']);
+ $this->assertEquals(['group1', 'group2'], $json['applicableGroups']);
+ $this->assertEquals(['preview' => false], $json['mountOptions']);
+ }
+
+}
diff --git a/apps/files_sharing/application.php b/apps/files_sharing/application.php
index 3302848106f..e23960cf2bb 100644
--- a/apps/files_sharing/application.php
+++ b/apps/files_sharing/application.php
@@ -42,7 +42,7 @@ class Application extends App {
$server->getAppConfig(),
$server->getConfig(),
$c->query('URLGenerator'),
- $server->getUserManager(),
+ $c->query('UserManager'),
$server->getLogger(),
$server->getActivityManager()
);
@@ -65,6 +65,9 @@ class Application extends App {
$container->registerService('URLGenerator', function(SimpleContainer $c) use ($server){
return $server->getUrlGenerator();
});
+ $container->registerService('UserManager', function(SimpleContainer $c) use ($server){
+ return $server->getUserManager();
+ });
$container->registerService('IsIncomingShareEnabled', function(SimpleContainer $c) {
return Helper::isIncomingServer2serverShareEnabled();
});
diff --git a/apps/files_sharing/l10n/pl.js b/apps/files_sharing/l10n/pl.js
index e546533240d..2a8fd58dfd5 100644
--- a/apps/files_sharing/l10n/pl.js
+++ b/apps/files_sharing/l10n/pl.js
@@ -4,11 +4,18 @@ OC.L10N.register(
"Server to server sharing is not enabled on this server" : "Współdzielenie między serwerami nie jest uruchomione na tym serwerze",
"The mountpoint name contains invalid characters." : "Nazwa zamontowanego zasobu zawiera niedozwolone znaki.",
"Invalid or untrusted SSL certificate" : "Niewłaściwy lub niezaufany certyfikat SSL",
+ "Could not authenticate to remote share, password might be wrong" : "Nie można zalogować do zdalnego zasobu, hasło może być niepoprawne",
+ "Storage not valid" : "Zasób nie jest prawidłowy",
"Couldn't add remote share" : "Nie można dodać zdalnego folderu",
"Shared with you" : "Współdzielony z Tobą",
"Shared with others" : "Współdzielony z innymi",
"Shared by link" : "Współdzielony linkiem",
+ "Nothing shared with you yet" : "Nie masz jeszcze nic udostępnionego",
+ "Files and folders others share with you will show up here" : "Pliki i foldery udostępnione Tobie przez innych wyświetlą się tutaj",
+ "Nothing shared yet" : "Jeszcze nic nie udostępniono",
+ "Files and folders you share will show up here" : "Plik i foldery, które udostępniasz, pokażą się tutaj",
"No shared links" : "Brak udostępnionych odnośników",
+ "Files and folders you share by link will show up here" : "Plik i foldery, które udostępniasz, pokażą się tutaj",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać udział zdalny {name} od {owner}@{remote}?",
"Remote share" : "Zdalny zasób",
"Remote share password" : "Hasło do zdalnego zasobu",
@@ -26,6 +33,7 @@ OC.L10N.register(
"This share is password-protected" : "Udział ten jest chroniony hasłem",
"The password is wrong. Try again." : "To hasło jest niewłaściwe. Spróbuj ponownie.",
"Password" : "Hasło",
+ "No entries found in this folder" : "Brak wpisów w tym folderze",
"Name" : "Nazwa",
"Share time" : "Czas współdzielenia",
"Sorry, this link doesn’t seem to work anymore." : "Przepraszamy ale wygląda na to, że ten link już nie działa.",
diff --git a/apps/files_sharing/l10n/pl.json b/apps/files_sharing/l10n/pl.json
index 75b345e2f7c..5071051a96f 100644
--- a/apps/files_sharing/l10n/pl.json
+++ b/apps/files_sharing/l10n/pl.json
@@ -2,11 +2,18 @@
"Server to server sharing is not enabled on this server" : "Współdzielenie między serwerami nie jest uruchomione na tym serwerze",
"The mountpoint name contains invalid characters." : "Nazwa zamontowanego zasobu zawiera niedozwolone znaki.",
"Invalid or untrusted SSL certificate" : "Niewłaściwy lub niezaufany certyfikat SSL",
+ "Could not authenticate to remote share, password might be wrong" : "Nie można zalogować do zdalnego zasobu, hasło może być niepoprawne",
+ "Storage not valid" : "Zasób nie jest prawidłowy",
"Couldn't add remote share" : "Nie można dodać zdalnego folderu",
"Shared with you" : "Współdzielony z Tobą",
"Shared with others" : "Współdzielony z innymi",
"Shared by link" : "Współdzielony linkiem",
+ "Nothing shared with you yet" : "Nie masz jeszcze nic udostępnionego",
+ "Files and folders others share with you will show up here" : "Pliki i foldery udostępnione Tobie przez innych wyświetlą się tutaj",
+ "Nothing shared yet" : "Jeszcze nic nie udostępniono",
+ "Files and folders you share will show up here" : "Plik i foldery, które udostępniasz, pokażą się tutaj",
"No shared links" : "Brak udostępnionych odnośników",
+ "Files and folders you share by link will show up here" : "Plik i foldery, które udostępniasz, pokażą się tutaj",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać udział zdalny {name} od {owner}@{remote}?",
"Remote share" : "Zdalny zasób",
"Remote share password" : "Hasło do zdalnego zasobu",
@@ -24,6 +31,7 @@
"This share is password-protected" : "Udział ten jest chroniony hasłem",
"The password is wrong. Try again." : "To hasło jest niewłaściwe. Spróbuj ponownie.",
"Password" : "Hasło",
+ "No entries found in this folder" : "Brak wpisów w tym folderze",
"Name" : "Nazwa",
"Share time" : "Czas współdzielenia",
"Sorry, this link doesn’t seem to work anymore." : "Przepraszamy ale wygląda na to, że ten link już nie działa.",
diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js
index 8df743791e1..657954a5de5 100644
--- a/apps/files_sharing/l10n/uk.js
+++ b/apps/files_sharing/l10n/uk.js
@@ -2,18 +2,20 @@ OC.L10N.register(
"files_sharing",
{
"Server to server sharing is not enabled on this server" : "На даному сервері вимкнута можливість передачі даних між серверами",
- "The mountpoint name contains invalid characters." : "Ім'я точки монтування містить неприпустимі символи.",
+ "The mountpoint name contains invalid characters." : "Ім’я точки монтування містить неприпустимі символи.",
"Invalid or untrusted SSL certificate" : "Недійсній або не довірений SSL-сертифікат",
+ "Could not authenticate to remote share, password might be wrong" : "Не вдалося провести аутентифікацію для доступу до віддаленого сховища, можливо неправильно вказано пароль",
+ "Storage not valid" : "Cховище недоступне",
"Couldn't add remote share" : "Неможливо додати віддалену загальну теку",
"Shared with you" : "Доступне для вас",
"Shared with others" : "Доступне для інших",
"Shared by link" : "Доступне за посиланням",
"Nothing shared with you yet" : "Ніхто з вами ще не поділився файлами",
- "Files and folders others share with you will show up here" : "Розшарені для вас файли і папки з'являться тут",
+ "Files and folders others share with you will show up here" : "Розшарені для вас файли і папки з’являться тут",
"Nothing shared yet" : "Немає нічого розшареного",
- "Files and folders you share will show up here" : "Файли і папки, які розшарені для вас відображатимуться тут",
+ "Files and folders you share will show up here" : "Файли і папки, які розшарені вами відображатимуться тут",
"No shared links" : "Немає опублікованих посилань",
- "Files and folders you share by link will show up here" : "Файли і папки, якими ви поділитися по посиланню будуть відображатися тут",
+ "Files and folders you share by link will show up here" : "Файли і папки, якими ви поділилися за посиланням будуть відображатися тут",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Додати віддалену загальну теку {name} з {owner}@{remote}?",
"Remote share" : "Віддалена загальна тека",
"Remote share password" : "Пароль для віддаленої загальної теки",
@@ -41,7 +43,7 @@ OC.L10N.register(
"The password is wrong. Try again." : "Невірний пароль. Спробуйте ще раз.",
"Password" : "Пароль",
"No entries found in this folder" : "Записів не знайдено в цій папці",
- "Name" : "Ім'я",
+ "Name" : "Ім’я",
"Share time" : "Дата публікації",
"Sorry, this link doesn’t seem to work anymore." : "На жаль, посилання більше не працює.",
"Reasons might be:" : "Можливі причини:",
@@ -53,6 +55,7 @@ OC.L10N.register(
"Download" : "Завантажити",
"Download %s" : "Завантажити %s",
"Direct link" : "Пряме посилання",
+ "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
"Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах",
"Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів"
},
diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json
index 7cfb0f98ade..d4fb8c7dfe5 100644
--- a/apps/files_sharing/l10n/uk.json
+++ b/apps/files_sharing/l10n/uk.json
@@ -1,17 +1,19 @@
{ "translations": {
"Server to server sharing is not enabled on this server" : "На даному сервері вимкнута можливість передачі даних між серверами",
- "The mountpoint name contains invalid characters." : "Ім'я точки монтування містить неприпустимі символи.",
+ "The mountpoint name contains invalid characters." : "Ім’я точки монтування містить неприпустимі символи.",
"Invalid or untrusted SSL certificate" : "Недійсній або не довірений SSL-сертифікат",
+ "Could not authenticate to remote share, password might be wrong" : "Не вдалося провести аутентифікацію для доступу до віддаленого сховища, можливо неправильно вказано пароль",
+ "Storage not valid" : "Cховище недоступне",
"Couldn't add remote share" : "Неможливо додати віддалену загальну теку",
"Shared with you" : "Доступне для вас",
"Shared with others" : "Доступне для інших",
"Shared by link" : "Доступне за посиланням",
"Nothing shared with you yet" : "Ніхто з вами ще не поділився файлами",
- "Files and folders others share with you will show up here" : "Розшарені для вас файли і папки з'являться тут",
+ "Files and folders others share with you will show up here" : "Розшарені для вас файли і папки з’являться тут",
"Nothing shared yet" : "Немає нічого розшареного",
- "Files and folders you share will show up here" : "Файли і папки, які розшарені для вас відображатимуться тут",
+ "Files and folders you share will show up here" : "Файли і папки, які розшарені вами відображатимуться тут",
"No shared links" : "Немає опублікованих посилань",
- "Files and folders you share by link will show up here" : "Файли і папки, якими ви поділитися по посиланню будуть відображатися тут",
+ "Files and folders you share by link will show up here" : "Файли і папки, якими ви поділилися за посиланням будуть відображатися тут",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Додати віддалену загальну теку {name} з {owner}@{remote}?",
"Remote share" : "Віддалена загальна тека",
"Remote share password" : "Пароль для віддаленої загальної теки",
@@ -39,7 +41,7 @@
"The password is wrong. Try again." : "Невірний пароль. Спробуйте ще раз.",
"Password" : "Пароль",
"No entries found in this folder" : "Записів не знайдено в цій папці",
- "Name" : "Ім'я",
+ "Name" : "Ім’я",
"Share time" : "Дата публікації",
"Sorry, this link doesn’t seem to work anymore." : "На жаль, посилання більше не працює.",
"Reasons might be:" : "Можливі причини:",
@@ -51,6 +53,7 @@
"Download" : "Завантажити",
"Download %s" : "Завантажити %s",
"Direct link" : "Пряме посилання",
+ "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
"Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах",
"Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів"
},"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);"
diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php
index ebc54265bf0..2f69583b412 100644
--- a/apps/files_sharing/lib/controllers/sharecontroller.php
+++ b/apps/files_sharing/lib/controllers/sharecontroller.php
@@ -17,12 +17,12 @@ use OC_Files;
use OC_Util;
use OCP;
use OCP\Template;
-use OCP\JSON;
use OCP\Share;
use OCP\AppFramework\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\NotFoundResponse;
use OC\URLGenerator;
use OC\AppConfig;
use OCP\ILogger;
@@ -60,7 +60,7 @@ class ShareController extends Controller {
* @param AppConfig $appConfig
* @param OCP\IConfig $config
* @param URLGenerator $urlGenerator
- * @param OC\User\Manager $userManager
+ * @param OCP\IUserManager $userManager
* @param ILogger $logger
* @param OCP\Activity\IManager $activityManager
*/
@@ -70,7 +70,7 @@ class ShareController extends Controller {
AppConfig $appConfig,
OCP\IConfig $config,
URLGenerator $urlGenerator,
- OC\User\Manager $userManager,
+ OCP\IUserManager $userManager,
ILogger $logger,
OCP\Activity\IManager $activityManager) {
parent::__construct($appName, $request);
@@ -113,7 +113,7 @@ class ShareController extends Controller {
public function authenticate($token, $password = '') {
$linkItem = Share::getShareByToken($token, false);
if($linkItem === false) {
- return new TemplateResponse('core', '404', array(), 'guest');
+ return new NotFoundResponse();
}
$authenticate = Helper::authenticate($linkItem, $password);
@@ -139,18 +139,11 @@ class ShareController extends Controller {
// Check whether share exists
$linkItem = Share::getShareByToken($token, false);
if($linkItem === false) {
- return new TemplateResponse('core', '404', array(), 'guest');
+ return new NotFoundResponse();
}
$shareOwner = $linkItem['uid_owner'];
- $originalSharePath = null;
- $rootLinkItem = OCP\Share::resolveReShare($linkItem);
- if (isset($rootLinkItem['uid_owner'])) {
- OCP\JSON::checkUserExists($rootLinkItem['uid_owner']);
- OC_Util::tearDownFS();
- OC_Util::setupFS($rootLinkItem['uid_owner']);
- $originalSharePath = Filesystem::getPath($linkItem['file_source']);
- }
+ $originalSharePath = $this->getPath($token);
// Share is password protected - check whether the user is permitted to access the share
if (isset($linkItem['share_with']) && !Helper::authenticate($linkItem)) {
@@ -161,15 +154,18 @@ class ShareController extends Controller {
if (Filesystem::isReadable($originalSharePath . $path)) {
$getPath = Filesystem::normalizePath($path);
$originalSharePath .= $path;
+ } else {
+ throw new OCP\Files\NotFoundException();
}
$file = basename($originalSharePath);
- $shareTmpl = array();
+ $shareTmpl = [];
$shareTmpl['displayName'] = User::getDisplayName($shareOwner);
$shareTmpl['filename'] = $file;
$shareTmpl['directory_path'] = $linkItem['file_target'];
$shareTmpl['mimetype'] = Filesystem::getMimeType($originalSharePath);
+ $shareTmpl['previewSupported'] = \OC::$server->getPreviewManager()->isMimeSupported($shareTmpl['mimetype']);
$shareTmpl['dirToken'] = $linkItem['token'];
$shareTmpl['sharingToken'] = $token;
$shareTmpl['server2serversharing'] = Helper::isOutgoingServer2serverShareEnabled();
@@ -288,22 +284,29 @@ class ShareController extends Controller {
}
/**
- * @param $token
- * @return null|string
+ * @param string $token
+ * @return string Resolved file path of the token
+ * @throws \Exception In case share could not get properly resolved
*/
private function getPath($token) {
$linkItem = Share::getShareByToken($token, false);
- $path = null;
if (is_array($linkItem) && isset($linkItem['uid_owner'])) {
// seems to be a valid share
$rootLinkItem = Share::resolveReShare($linkItem);
if (isset($rootLinkItem['uid_owner'])) {
- JSON::checkUserExists($rootLinkItem['uid_owner']);
+ if(!$this->userManager->userExists($rootLinkItem['uid_owner'])) {
+ throw new \Exception('Owner of the share does not exist anymore');
+ }
OC_Util::tearDownFS();
OC_Util::setupFS($rootLinkItem['uid_owner']);
$path = Filesystem::getPath($linkItem['file_source']);
+
+ if(!empty($path) && Filesystem::isReadable($path)) {
+ return $path;
+ }
}
}
- return $path;
+
+ throw new \Exception('No file found belonging to file.');
}
}
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 648376e8cb5..51c4a36029e 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -70,7 +70,7 @@ class Storage extends DAV implements ISharedStorage {
'host' => $host,
'root' => $root,
'user' => $options['token'],
- 'password' => $options['password']
+ 'password' => (string)$options['password']
));
}
diff --git a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php
index 3508407f2a0..3e7cdf4aa34 100644
--- a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php
+++ b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php
@@ -11,6 +11,7 @@
namespace OCA\Files_Sharing\Middleware;
use OCP\App\IAppManager;
+use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Middleware;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
@@ -59,7 +60,7 @@ class SharingCheckMiddleware extends Middleware {
* @return TemplateResponse
*/
public function afterException($controller, $methodName, \Exception $exception){
- return new TemplateResponse('core', '404', array(), 'guest');
+ return new NotFoundResponse();
}
/**
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index 50a6432dd95..9e4e8d23151 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -10,7 +10,7 @@
// This file is just used to redirect the legacy sharing URLs (< ownCloud 8) to the new ones
-$urlGenerator = new \OC\URLGenerator(\OC::$server->getConfig());
+$urlGenerator = \OC::$server->getURLGenerator();
$token = isset($_GET['t']) ? $_GET['t'] : '';
$route = isset($_GET['download']) ? 'files_sharing.sharecontroller.downloadShare' : 'files_sharing.sharecontroller.showShare';
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index 4ec4d264b31..fa349f29811 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -19,11 +19,10 @@ OCP\Util::addScript('files', 'files');
OCP\Util::addScript('files', 'filelist');
OCP\Util::addscript('files', 'keyboardshortcuts');
-$thumbSize=1024;
-$previewSupported = OC\Preview::isMimeSupported($_['mimetype']) ? 'true' : 'false';
+$thumbSize = 1024;
?>
-<?php if ( \OC\Preview::isMimeSupported($_['mimetype'])): /* This enables preview images for links (e.g. on Facebook, Google+, ...)*/?>
+<?php if ($_['previewSupported']): /* This enables preview images for links (e.g. on Facebook, Google+, ...)*/?>
<link rel="image_src" href="<?php p(OCP\Util::linkToRoute( 'core_ajax_public_preview', array('x' => $thumbSize, 'y' => $thumbSize, 'file' => $_['directory_path'], 't' => $_['dirToken']))); ?>" />
<?php endif; ?>
@@ -38,7 +37,7 @@ $previewSupported = OC\Preview::isMimeSupported($_['mimetype']) ? 'true' : 'fals
<input type="hidden" name="sharingToken" value="<?php p($_['sharingToken']) ?>" id="sharingToken">
<input type="hidden" name="filename" value="<?php p($_['filename']) ?>" id="filename">
<input type="hidden" name="mimetype" value="<?php p($_['mimetype']) ?>" id="mimetype">
-<input type="hidden" name="previewSupported" value="<?php p($previewSupported); ?>" id="previewSupported">
+<input type="hidden" name="previewSupported" value="<?php p($_['previewSupported'] ? 'true' : 'false'); ?>" id="previewSupported">
<input type="hidden" name="mimetypeIcon" value="<?php p(OC_Helper::mimetypeIcon($_['mimetype'])); ?>" id="mimetypeIcon">
<input type="hidden" name="filesize" value="<?php p($_['nonHumanFileSize']); ?>" id="filesize">
<input type="hidden" name="maxSizeAnimateGif" value="<?php p($_['maxSizeAnimateGif']); ?>" id="maxSizeAnimateGif">
diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php
index 9256f9bcc85..371c94a8c88 100644
--- a/apps/files_sharing/tests/api.php
+++ b/apps/files_sharing/tests/api.php
@@ -1079,6 +1079,24 @@ class Test_Files_Sharing_Api extends TestCase {
$this->assertTrue(is_array($updatedLinkShare));
$this->assertEquals($dateWithinRange->format('Y-m-d') . ' 00:00:00', $updatedLinkShare['expiration']);
+
+ // Try to remove expire date
+ $params = array();
+ $params['id'] = $linkShare['id'];
+ $params['_put'] = ['expireDate' => ''];
+
+ $result = \OCA\Files_Sharing\API\Local::updateShare($params);
+
+ $this->assertFalse($result->succeeded());
+
+ $items = \OCP\Share::getItemShared('file', $linkShare['file_source']);
+
+ $updatedLinkShare = reset($items);
+
+ // date shouldn't be changed
+ $this->assertTrue(is_array($updatedLinkShare));
+ $this->assertEquals($dateWithinRange->format('Y-m-d') . ' 00:00:00', $updatedLinkShare['expiration']);
+
// cleanup
$config->setAppValue('core', 'shareapi_default_expire_date', 'no');
$config->setAppValue('core', 'shareapi_enforce_expire_date', 'no');
diff --git a/apps/files_sharing/tests/controller/sharecontroller.php b/apps/files_sharing/tests/controller/sharecontroller.php
index 81e60b03cdc..204422853d0 100644
--- a/apps/files_sharing/tests/controller/sharecontroller.php
+++ b/apps/files_sharing/tests/controller/sharecontroller.php
@@ -12,6 +12,7 @@ namespace OCA\Files_Sharing\Controllers;
use OC\Files\Filesystem;
use OCA\Files_Sharing\Application;
+use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\IAppContainer;
use OCP\Files;
use OCP\AppFramework\Http\RedirectResponse;
@@ -49,6 +50,8 @@ class ShareControllerTest extends \Test\TestCase {
->disableOriginalConstructor()->getMock();
$this->container['URLGenerator'] = $this->getMockBuilder('\OC\URLGenerator')
->disableOriginalConstructor()->getMock();
+ $this->container['UserManager'] = $this->getMockBuilder('\OCP\IUserManager')
+ ->disableOriginalConstructor()->getMock();
$this->urlGenerator = $this->container['URLGenerator'];
$this->shareController = $this->container['ShareController'];
@@ -115,7 +118,7 @@ class ShareControllerTest extends \Test\TestCase {
public function testAuthenticate() {
// Test without a not existing token
$response = $this->shareController->authenticate('ThisTokenShouldHopefullyNeverExistSoThatTheUnitTestWillAlwaysPass :)');
- $expectedResponse = new TemplateResponse('core', '404', array(), 'guest');
+ $expectedResponse = new NotFoundResponse();
$this->assertEquals($expectedResponse, $response);
// Test with a valid password
@@ -130,9 +133,14 @@ class ShareControllerTest extends \Test\TestCase {
}
public function testShowShare() {
+ $this->container['UserManager']->expects($this->exactly(2))
+ ->method('userExists')
+ ->with($this->user)
+ ->will($this->returnValue(true));
+
// Test without a not existing token
$response = $this->shareController->showShare('ThisTokenShouldHopefullyNeverExistSoThatTheUnitTestWillAlwaysPass :)');
- $expectedResponse = new TemplateResponse('core', '404', array(), 'guest');
+ $expectedResponse = new NotFoundResponse();
$this->assertEquals($expectedResponse, $response);
// Test with a password protected share and no authentication
@@ -158,6 +166,7 @@ class ShareControllerTest extends \Test\TestCase {
'fileSize' => '33 B',
'nonHumanFileSize' => 33,
'maxSizeAnimateGif' => 10,
+ 'previewSupported' => true,
);
$csp = new \OCP\AppFramework\Http\ContentSecurityPolicy();
@@ -175,4 +184,54 @@ class ShareControllerTest extends \Test\TestCase {
array('token' => $this->token)));
$this->assertEquals($expectedResponse, $response);
}
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage No file found belonging to file.
+ */
+ public function testShowShareWithDeletedFile() {
+ $this->container['UserManager']->expects($this->once())
+ ->method('userExists')
+ ->with($this->user)
+ ->will($this->returnValue(true));
+
+ $view = new View('/'. $this->user . '/files');
+ $view->unlink('file1.txt');
+ $linkItem = Share::getShareByToken($this->token, false);
+ \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']);
+ $this->shareController->showShare($this->token);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage No file found belonging to file.
+ */
+ public function testDownloadShareWithDeletedFile() {
+ $this->container['UserManager']->expects($this->once())
+ ->method('userExists')
+ ->with($this->user)
+ ->will($this->returnValue(true));
+
+ $view = new View('/'. $this->user . '/files');
+ $view->unlink('file1.txt');
+ $linkItem = Share::getShareByToken($this->token, false);
+ \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']);
+ $this->shareController->downloadShare($this->token);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Owner of the share does not exist anymore
+ */
+ public function testShowShareWithNotExistingUser() {
+ $this->container['UserManager']->expects($this->once())
+ ->method('userExists')
+ ->with($this->user)
+ ->will($this->returnValue(false));
+
+ $linkItem = Share::getShareByToken($this->token, false);
+ \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']);
+ $this->shareController->showShare($this->token);
+ }
+
}
diff --git a/apps/files_sharing/tests/external/manager.php b/apps/files_sharing/tests/external/manager.php
new file mode 100644
index 00000000000..dcb3dfba692
--- /dev/null
+++ b/apps/files_sharing/tests/external/manager.php
@@ -0,0 +1,142 @@
+<?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\Tests\External;
+
+use OC\Files\Storage\StorageFactory;
+use Test\TestCase;
+
+class Manager extends TestCase {
+ private $uid;
+
+ /**
+ * @var \OC\Files\Mount\Manager
+ */
+ private $mountManager;
+
+ /**
+ * @var \OCA\Files_Sharing\External\Manager
+ */
+ private $instance;
+
+ public function setUp() {
+ $this->uid = uniqid();
+ $this->mountManager = new \OC\Files\Mount\Manager();
+ $this->instance = new \OCA\Files_Sharing\External\Manager(\OC::$server->getDatabaseConnection(),
+ $this->mountManager, new StorageFactory(), \OC::$server->getHTTPHelper(), $this->uid);
+ }
+
+ public function tearDown() {
+ $this->instance->removeUserShares($this->uid);
+ }
+
+ private function getFullPath($path) {
+ return '/' . $this->uid . '/files' . $path;
+ }
+
+ private function assertMount($mountPoint) {
+ $mountPoint = rtrim($mountPoint, '/');
+ $mount = $this->mountManager->find($this->getFullPath($mountPoint));
+ $this->assertInstanceOf('\OCP\Files\Mount\IMountPoint', $mount);
+ $this->assertEquals($this->getFullPath($mountPoint), rtrim($mount->getMountPoint(), '/'));
+ $storage = $mount->getStorage();
+ $this->assertInstanceOf('\OCA\Files_Sharing\External\Storage', $storage);
+ }
+
+ private function assertNotMount($mountPoint) {
+ $mountPoint = rtrim($mountPoint, '/');
+ $mount = $this->mountManager->find($this->getFullPath($mountPoint));
+ if ($mount) {
+ $this->assertInstanceOf('\OCP\Files\Mount\IMountPoint', $mount);
+ $this->assertNotEquals($this->getFullPath($mountPoint), rtrim($mount->getMountPoint(), '/'));
+ } else {
+ $this->assertNull($mount);
+ }
+ }
+
+ public function testAddBasic() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', true);
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/example');
+ }
+
+ public function testAddBasicEmptyPassword() {
+ $this->instance->addShare('http://example.com', 'foo', '', 'example', 'me', true);
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/example');
+ }
+
+ public function testAddNotAcceptedShare() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', false);
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertNotMount('/example');
+ }
+
+ public function testAcceptMount() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', false);
+ $open = $this->instance->getOpenShares();
+ $this->assertCount(1, $open);
+ $this->instance->acceptShare($open[0]['id']);
+ $this->assertEquals([], $this->instance->getOpenShares());
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/example');
+ }
+
+ public function testDeclineMount() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', false);
+ $open = $this->instance->getOpenShares();
+ $this->assertCount(1, $open);
+ $this->instance->declineShare($open[0]['id']);
+ $this->assertEquals([], $this->instance->getOpenShares());
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertNotMount('/example');
+ }
+
+ public function testSetMountPoint() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', true);
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/example');
+ $this->instance->setMountPoint($this->getFullPath('/example'), $this->getFullPath('/renamed'));
+ $this->mountManager->clear();
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/renamed');
+ $this->assertNotMount('/example');
+ }
+
+ public function testRemoveShare() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', true);
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/example');
+ $this->instance->removeShare($this->getFullPath('/example'));
+ $this->mountManager->clear();
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertNotMount('/example');
+ }
+
+ public function testRemoveShareForUser() {
+ $this->instance->addShare('http://example.com', 'foo', 'bar', 'example', 'me', true);
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertMount('/example');
+ $this->instance->removeUserShares($this->uid);
+ $this->mountManager->clear();
+ \Test_Helper::invokePrivate($this->instance, 'setupMounts');
+ $this->assertNotMount('/example');
+ }
+}
diff --git a/apps/files_sharing/tests/sharedstorage.php b/apps/files_sharing/tests/sharedstorage.php
index 2959b9aacfb..46f75b488b5 100644
--- a/apps/files_sharing/tests/sharedstorage.php
+++ b/apps/files_sharing/tests/sharedstorage.php
@@ -182,9 +182,8 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
// for the share root we expect:
// the shared permissions (1)
// the delete permission (8), to enable unshare
- // the update permission (2), to allow renaming of the mount point
$rootInfo = \OC\Files\Filesystem::getFileInfo($this->folder);
- $this->assertSame(11, $rootInfo->getPermissions());
+ $this->assertSame(9, $rootInfo->getPermissions());
// for the file within the shared folder we expect:
// the shared permissions (1)
diff --git a/apps/files_trashbin/l10n/pl.js b/apps/files_trashbin/l10n/pl.js
index 941e768e304..ba0a2e93bd3 100644
--- a/apps/files_trashbin/l10n/pl.js
+++ b/apps/files_trashbin/l10n/pl.js
@@ -8,6 +8,10 @@ OC.L10N.register(
"Delete permanently" : "Trwale usuń",
"Error" : "Błąd",
"restored" : "przywrócony",
+ "No deleted files" : "Brak skasowanych plików",
+ "You will be able to recover deleted files from here" : "Możesz przywrócić skasowane pliki stąd",
+ "No entries found in this folder" : "Brak wpisów w tym folderze",
+ "Select all" : "Wybierz wszystko",
"Name" : "Nazwa",
"Deleted" : "Usunięte",
"Delete" : "Usuń"
diff --git a/apps/files_trashbin/l10n/pl.json b/apps/files_trashbin/l10n/pl.json
index 01308bd763f..4fa8debaf29 100644
--- a/apps/files_trashbin/l10n/pl.json
+++ b/apps/files_trashbin/l10n/pl.json
@@ -6,6 +6,10 @@
"Delete permanently" : "Trwale usuń",
"Error" : "Błąd",
"restored" : "przywrócony",
+ "No deleted files" : "Brak skasowanych plików",
+ "You will be able to recover deleted files from here" : "Możesz przywrócić skasowane pliki stąd",
+ "No entries found in this folder" : "Brak wpisów w tym folderze",
+ "Select all" : "Wybierz wszystko",
"Name" : "Nazwa",
"Deleted" : "Usunięte",
"Delete" : "Usuń"
diff --git a/apps/user_ldap/appinfo/register_command.php b/apps/user_ldap/appinfo/register_command.php
index 651e6a564e1..854f21aae35 100644
--- a/apps/user_ldap/appinfo/register_command.php
+++ b/apps/user_ldap/appinfo/register_command.php
@@ -25,11 +25,11 @@ $deletedUsersIndex = new DeletedUsersIndex(
$ocConfig, $dbConnection, $userMapping
);
-$application->add(new OCA\user_ldap\Command\ShowConfig());
+$application->add(new OCA\user_ldap\Command\ShowConfig($helper));
$application->add(new OCA\user_ldap\Command\SetConfig());
$application->add(new OCA\user_ldap\Command\TestConfig());
-$application->add(new OCA\user_ldap\Command\CreateEmptyConfig());
-$application->add(new OCA\user_ldap\Command\DeleteConfig());
+$application->add(new OCA\user_ldap\Command\CreateEmptyConfig($helper));
+$application->add(new OCA\user_ldap\Command\DeleteConfig($helper));
$application->add(new OCA\user_ldap\Command\Search($ocConfig));
$application->add(new OCA\user_ldap\Command\ShowRemnants(
$deletedUsersIndex, \OC::$server->getDateTimeFormatter())
diff --git a/apps/user_ldap/command/createemptyconfig.php b/apps/user_ldap/command/createemptyconfig.php
index 32010825361..1f051af9d5a 100644
--- a/apps/user_ldap/command/createemptyconfig.php
+++ b/apps/user_ldap/command/createemptyconfig.php
@@ -17,6 +17,16 @@ use \OCA\user_ldap\lib\Helper;
use \OCA\user_ldap\lib\Configuration;
class CreateEmptyConfig extends Command {
+ /** @var \OCA\User_LDAP\lib\Helper */
+ protected $helper;
+
+ /**
+ * @param Helper $helper
+ */
+ public function __construct(Helper $helper) {
+ $this->helper = $helper;
+ parent::__construct();
+ }
protected function configure() {
$this
@@ -25,7 +35,6 @@ class CreateEmptyConfig extends Command {
;
}
-
protected function execute(InputInterface $input, OutputInterface $output) {
$configPrefix = $this->getNewConfigurationPrefix();
$output->writeln("Created new configuration with configID '{$configPrefix}'");
@@ -35,7 +44,7 @@ class CreateEmptyConfig extends Command {
}
protected function getNewConfigurationPrefix() {
- $serverConnections = Helper::getServerConfigurationPrefixes();
+ $serverConnections = $this->helper->getServerConfigurationPrefixes();
// first connection uses no prefix
if(sizeof($serverConnections) == 0) {
diff --git a/apps/user_ldap/command/deleteconfig.php b/apps/user_ldap/command/deleteconfig.php
index f8b834a6465..fcffc50f47e 100644
--- a/apps/user_ldap/command/deleteconfig.php
+++ b/apps/user_ldap/command/deleteconfig.php
@@ -11,11 +11,20 @@ namespace OCA\user_ldap\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use \OCA\user_ldap\lib\Helper;
class DeleteConfig extends Command {
+ /** @var \OCA\User_LDAP\lib\Helper */
+ protected $helper;
+
+ /**
+ * @param Helper $helper
+ */
+ public function __construct(Helper $helper) {
+ $this->helper = $helper;
+ parent::__construct();
+ }
protected function configure() {
$this
@@ -31,9 +40,9 @@ class DeleteConfig extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
- $configPrefix = $input->getArgument('configID');;
+ $configPrefix = $input->getArgument('configID');
- $success = Helper::deleteServerConfiguration($configPrefix);
+ $success = $this->helper->deleteServerConfiguration($configPrefix);
if($success) {
$output->writeln("Deleted configuration with configID '{$configPrefix}'");
diff --git a/apps/user_ldap/command/showconfig.php b/apps/user_ldap/command/showconfig.php
index fbcf8d57de4..48ab76f1b7e 100644
--- a/apps/user_ldap/command/showconfig.php
+++ b/apps/user_ldap/command/showconfig.php
@@ -17,6 +17,16 @@ use \OCA\user_ldap\lib\Helper;
use \OCA\user_ldap\lib\Configuration;
class ShowConfig extends Command {
+ /** @var \OCA\User_LDAP\lib\Helper */
+ protected $helper;
+
+ /**
+ * @param Helper $helper
+ */
+ public function __construct(Helper $helper) {
+ $this->helper = $helper;
+ parent::__construct();
+ }
protected function configure() {
$this
@@ -37,8 +47,7 @@ class ShowConfig extends Command {
}
protected function execute(InputInterface $input, OutputInterface $output) {
- $helper = new Helper();
- $availableConfigs = $helper->getServerConfigurationPrefixes();
+ $availableConfigs = $this->helper->getServerConfigurationPrefixes();
$configID = $input->getArgument('configID');
if(!is_null($configID)) {
$configIDs[] = $configID;
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index 40d702360fb..5dc4f836904 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -673,7 +673,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
}
$maxGroups = 100000; // limit max results (just for safety reasons)
if ($limit > -1) {
- $overallLimit = min($limit, $maxGroups);
+ $overallLimit = min($limit + $offset, $maxGroups);
} else {
$overallLimit = $maxGroups;
}
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index a0f68bbce20..4269c47363e 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -18,7 +18,7 @@ OC.L10N.register(
"mappings cleared" : "limpadas as asignacións",
"Success" : "Correcto",
"Error" : "Erro",
- "Please specify a Base DN" : "Por favor indique un DN base",
+ "Please specify a Base DN" : "Indique un DN base",
"Could not determine Base DN" : "Non se puido determinar o DN base",
"Please specify the port" : "Especifique un porto",
"Configuration OK" : "Configuración correcta",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index 2740767e042..9aa1d3f6765 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -16,7 +16,7 @@
"mappings cleared" : "limpadas as asignacións",
"Success" : "Correcto",
"Error" : "Erro",
- "Please specify a Base DN" : "Por favor indique un DN base",
+ "Please specify a Base DN" : "Indique un DN base",
"Could not determine Base DN" : "Non se puido determinar o DN base",
"Please specify the port" : "Especifique un porto",
"Configuration OK" : "Configuración correcta",
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index 3f48c94c464..f10d32f30fe 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -2,9 +2,12 @@ OC.L10N.register(
"user_ldap",
{
"Deletion failed" : "Брисање није успело",
+ "Keep settings?" : "Задржати поставке?",
"Error" : "Грешка",
+ "Confirm Deletion" : "Потврдa брисањa",
"_%s group found_::_%s groups found_" : ["","",""],
"_%s user found_::_%s users found_" : ["","",""],
+ "Server" : "Сервер",
"Group Filter" : "Филтер групе",
"Save" : "Сачувај",
"Help" : "Помоћ",
@@ -23,7 +26,7 @@ OC.L10N.register(
"User Display Name Field" : "Име приказа корисника",
"Base User Tree" : "Основно стабло корисника",
"Group Display Name Field" : "Име приказа групе",
- "Base Group Tree" : "Основна стабло група",
+ "Base Group Tree" : "Стабло основне групе",
"Group-Member association" : "Придруживање чланова у групу",
"Quota Field" : "Поље квоте",
"Quota Default" : "Подразумевана квота",
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index 7bf1a2cc9ab..31d1fb15877 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -1,8 +1,11 @@
{ "translations": {
"Deletion failed" : "Брисање није успело",
+ "Keep settings?" : "Задржати поставке?",
"Error" : "Грешка",
+ "Confirm Deletion" : "Потврдa брисањa",
"_%s group found_::_%s groups found_" : ["","",""],
"_%s user found_::_%s users found_" : ["","",""],
+ "Server" : "Сервер",
"Group Filter" : "Филтер групе",
"Save" : "Сачувај",
"Help" : "Помоћ",
@@ -21,7 +24,7 @@
"User Display Name Field" : "Име приказа корисника",
"Base User Tree" : "Основно стабло корисника",
"Group Display Name Field" : "Име приказа групе",
- "Base Group Tree" : "Основна стабло група",
+ "Base Group Tree" : "Стабло основне групе",
"Group-Member association" : "Придруживање чланова у групу",
"Quota Field" : "Поље квоте",
"Quota Default" : "Подразумевана квота",
diff --git a/apps/user_ldap/l10n/uk.js b/apps/user_ldap/l10n/uk.js
index 1dfabd260f5..c231a4a5553 100644
--- a/apps/user_ldap/l10n/uk.js
+++ b/apps/user_ldap/l10n/uk.js
@@ -127,6 +127,7 @@ OC.L10N.register(
"UUID Attribute for Users:" : "UUID Атрибут для користувачів:",
"UUID Attribute for Groups:" : "UUID Атрибут для груп:",
"Username-LDAP User Mapping" : "Картографія Імен користувачів-LDAP ",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud використовує імена користувачів для зберігання та призначення метаданих. Для точної ідентифікації та розпізнавання користувачів, кожен користувач LDAP буде мати своє внутрішнє ім'я користувача. Це вимагає прив'язки імені користувача ownCloud до користувача LDAP. При створенні ім'я користувача призначається ідентифікатором UUID користувача LDAP. Крім цього кешируєтся доменне ім'я (DN) для зменшення числа звернень до LDAP, однак воно не використовується для ідентифікації. Якщо доменне ім'я було змінено, про це стане відомо ownCloud. Внутрішнє ім'я ownCloud використовується повсюдно в ownCloud. Після скидання прив'язок в базі можуть зберегтися залишки старої інформації. Скидання прив'язок не прив'язане до конфігурації, воно вплине на всі LDAP підключення! Ні в якому разі не рекомендується скидати прив'язки якщо система вже знаходиться в експлуатації, тільки на етапі тестування.",
"Clear Username-LDAP User Mapping" : "Очистити картографію Імен користувачів-LDAP",
"Clear Groupname-LDAP Group Mapping" : "Очистити картографію Імен груп-LDAP"
},
diff --git a/apps/user_ldap/l10n/uk.json b/apps/user_ldap/l10n/uk.json
index 73eaf3946c0..597c15170d6 100644
--- a/apps/user_ldap/l10n/uk.json
+++ b/apps/user_ldap/l10n/uk.json
@@ -125,6 +125,7 @@
"UUID Attribute for Users:" : "UUID Атрибут для користувачів:",
"UUID Attribute for Groups:" : "UUID Атрибут для груп:",
"Username-LDAP User Mapping" : "Картографія Імен користувачів-LDAP ",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud використовує імена користувачів для зберігання та призначення метаданих. Для точної ідентифікації та розпізнавання користувачів, кожен користувач LDAP буде мати своє внутрішнє ім'я користувача. Це вимагає прив'язки імені користувача ownCloud до користувача LDAP. При створенні ім'я користувача призначається ідентифікатором UUID користувача LDAP. Крім цього кешируєтся доменне ім'я (DN) для зменшення числа звернень до LDAP, однак воно не використовується для ідентифікації. Якщо доменне ім'я було змінено, про це стане відомо ownCloud. Внутрішнє ім'я ownCloud використовується повсюдно в ownCloud. Після скидання прив'язок в базі можуть зберегтися залишки старої інформації. Скидання прив'язок не прив'язане до конфігурації, воно вплине на всі LDAP підключення! Ні в якому разі не рекомендується скидати прив'язки якщо система вже знаходиться в експлуатації, тільки на етапі тестування.",
"Clear Username-LDAP User Mapping" : "Очистити картографію Імен користувачів-LDAP",
"Clear Groupname-LDAP Group Mapping" : "Очистити картографію Імен груп-LDAP"
},"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);"
diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php
index 44f0f82c2f7..f2b16ee2eab 100644
--- a/apps/user_ldap/tests/group_ldap.php
+++ b/apps/user_ldap/tests/group_ldap.php
@@ -298,4 +298,18 @@ class Test_Group_Ldap extends \Test\TestCase {
$groupBackend->inGroup($uid, $gid);
}
+ public function testGetGroupsWithOffset() {
+ $access = $this->getAccessMock();
+ $this->enableGroups($access);
+
+ $access->expects($this->once())
+ ->method('ownCloudGroupNames')
+ ->will($this->returnValue(array('group1', 'group2')));
+
+ $groupBackend = new GroupLDAP($access);
+ $groups = $groupBackend->getGroups('', 2, 2);
+
+ $this->assertSame(2, count($groups));
+ }
+
}
diff --git a/autotest.sh b/autotest.sh
index 94d63173547..6c2a61da0a7 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -17,6 +17,7 @@ set -e
#$EXECUTOR_NUMBER is set by Jenkins and allows us to run autotest in parallel
DATABASENAME=oc_autotest$EXECUTOR_NUMBER
DATABASEUSER=oc_autotest$EXECUTOR_NUMBER
+DATABASEHOST=localhost
ADMINLOGIN=admin$EXECUTOR_NUMBER
BASEDIR=$PWD
@@ -72,6 +73,11 @@ if [ -f config/config.php ] && [ ! -f config/config-autotest-backup.php ]; then
fi
function cleanup_config {
+ if [ ! -z "$DOCKER_CONTAINER_ID" ]; then
+ echo "Kill the docker $DOCKER_CONTAINER_ID"
+ docker rm -f $DOCKER_CONTAINER_ID
+ fi
+
cd "$BASEDIR"
# Restore existing config
if [ -f config/config-autotest-backup.php ]; then
@@ -117,35 +123,20 @@ function execute_tests {
dropdb -U $DATABASEUSER $DATABASENAME || true
fi
if [ "$1" == "oci" ] ; then
- echo "drop the database"
- sqlplus -s -l / as sysdba <<EOF
- drop user $DATABASENAME cascade;
-EOF
-
- echo "create the database"
- sqlplus -s -l / as sysdba <<EOF
- create user $DATABASENAME identified by owncloud;
- alter user $DATABASENAME default tablespace users
- temporary tablespace temp
- quota unlimited on users;
- grant create session
- , create table
- , create procedure
- , create sequence
- , create trigger
- , create view
- , create synonym
- , alter session
- to $DATABASENAME;
- exit;
-EOF
- DATABASEUSER=$DATABASENAME
+ echo "Fire up the oracle docker"
+ DOCKER_CONTAINER_ID=`docker run -d deepdiver/docker-oracle-xe-11g`
+ DATABASEHOST=`docker inspect $DOCKER_CONTAINER_ID | grep IPAddress | cut -d '"' -f 4`
+
+ echo "Waiting 60 seconds for Oracle initialization ... "
+ sleep 60
+
+ DATABASEUSER=autotest
DATABASENAME='XE'
fi
# trigger installation
echo "Installing ...."
- ./occ maintenance:install --database=$1 --database-name=$DATABASENAME --database-host=localhost --database-user=$DATABASEUSER --database-pass=owncloud --database-table-prefix=oc_ --admin-user=$ADMINLOGIN --admin-pass=admin --data-dir=$DATADIR
+ ./occ maintenance:install --database=$1 --database-name=$DATABASENAME --database-host=$DATABASEHOST --database-user=$DATABASEUSER --database-pass=owncloud --database-table-prefix=oc_ --admin-user=$ADMINLOGIN --admin-pass=admin --data-dir=$DATADIR
#test execution
echo "Testing with $1 ..."
diff --git a/build/.ci-conf/pr-oci b/build/.ci-conf/pr-oci
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/build/.ci-conf/pr-oci
diff --git a/config/config.sample.php b/config/config.sample.php
index 8d8fed7ad8c..672203153c6 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -421,7 +421,7 @@ $CONFIG = array(
/**
* Checks an app before install whether it uses private APIs instead of the
- * proper public APIs. If this is set to true it will just allow to install or
+ * proper public APIs. If this is set to true it will only allow to install or
* enable apps that pass this check.
*/
'appcodechecker' => true,
diff --git a/core/ajax/preview.php b/core/ajax/preview.php
index f7e24e0ec28..12bc80e4037 100644
--- a/core/ajax/preview.php
+++ b/core/ajax/preview.php
@@ -29,13 +29,12 @@ if ($maxX === 0 || $maxY === 0) {
exit;
}
-$preview = new \OC\Preview(\OC_User::getUser(), 'files');
-
$info = \OC\Files\Filesystem::getFileInfo($file);
-if (!$info instanceof OCP\Files\FileInfo || !$always && !$preview->isAvailable($info)) {
+if (!$info instanceof OCP\Files\FileInfo || !$always && !\OC::$server->getPreviewManager()->isAvailable($info)) {
\OC_Response::setStatus(404);
} else {
+ $preview = new \OC\Preview(\OC_User::getUser(), 'files');
$preview->setFile($file);
$preview->setMaxX($maxX);
$preview->setMaxY($maxY);
diff --git a/core/avatar/avatarcontroller.php b/core/avatar/avatarcontroller.php
index f63e02b7761..b63c8ad53b5 100644
--- a/core/avatar/avatarcontroller.php
+++ b/core/avatar/avatarcontroller.php
@@ -95,7 +95,7 @@ class AvatarController extends Controller {
$avatar = $this->avatarManager->getAvatar($userId);
$image = $avatar->get($size);
- if ($image instanceof \OC_Image) {
+ if ($image instanceof \OCP\IImage) {
$resp = new DataDisplayResponse($image->data(),
Http::STATUS_OK,
['Content-Type' => $image->mimeType()]);
diff --git a/core/css/apps.css b/core/css/apps.css
index a460bcf46c8..20822f8b398 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -524,6 +524,5 @@ button.loading {
em {
font-style: normal;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
opacity: .5;
}
diff --git a/core/css/header.css b/core/css/header.css
index b4e074a5e44..f249be8c4b4 100644
--- a/core/css/header.css
+++ b/core/css/header.css
@@ -95,7 +95,6 @@
.menutoggle .header-appname,
.menutoggle .icon-caret {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=75)";
- filter: alpha(opacity=75);
opacity: .75;
}
.menutoggle:hover .header-appname,
@@ -105,7 +104,6 @@
.menutoggle.active .header-appname,
.menutoggle.active .icon-caret {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
opacity: 1;
}
@@ -186,7 +184,6 @@
#navigation a span {
/* 50% opacity when inactive */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
opacity: .5;
}
#navigation a:hover img, #navigation a:focus img,
@@ -195,7 +192,6 @@
#navigation a.active span {
/* full opacity for the active app or when hovered/focused */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
opacity: 1;
}
@@ -209,7 +205,6 @@
/* Apps management */
#apps-management {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
- filter: alpha(opacity=60);
opacity: .6;
min-height: initial;
height: initial;
@@ -228,7 +223,6 @@
}
#navigation .app-loading .app-icon {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)";
- filter: alpha(opacity=10);
opacity: .1;
}
@@ -278,8 +272,17 @@
cursor: pointer;
}
#expand:hover, #expand:focus, #expand:active { color:#fff; }
-#expand img { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; margin-bottom:-2px; }
-#expand:hover img, #expand:focus img, #expand:active img { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
+#expand img {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
+ opacity: .7;
+ margin-bottom: -2px;
+}
+#expand:hover img,
+#expand:focus img,
+#expand:active img {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ opacity:1;
+}
#expanddiv {
position: absolute;
right: 0;
@@ -297,7 +300,6 @@
color: #fff;
padding: 4px 12px 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
- filter: alpha(opacity=70);
opacity: .7;
-moz-box-sizing: border-box;
box-sizing: border-box;
@@ -306,8 +308,9 @@
margin-bottom: -3px;
margin-right: 6px;
}
- #expanddiv a:hover, #expanddiv a:focus, #expanddiv a:active {
+ #expanddiv a:hover,
+ #expanddiv a:focus,
+ #expanddiv a:active {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
opacity: 1;
}
diff --git a/core/css/jquery-ui-fixes.css b/core/css/jquery-ui-fixes.css
index 0bfa9479893..7e0cdd18204 100644
--- a/core/css/jquery-ui-fixes.css
+++ b/core/css/jquery-ui-fixes.css
@@ -128,13 +128,11 @@
.ui-widget-overlay {
background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;
opacity: .5;
- filter: Alpha(Opacity=50);
}
.ui-widget-shadow {
margin: -5px 0 0 -5px;
padding: 5px;
background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;
opacity: .2;
- filter: Alpha(Opacity=20);
border-radius: 5px;
}
diff --git a/core/css/jquery.ocdialog.css b/core/css/jquery.ocdialog.css
index 93930bf435f..bada0b73a5e 100644
--- a/core/css/jquery.ocdialog.css
+++ b/core/css/jquery.ocdialog.css
@@ -52,7 +52,7 @@
.oc-dialog-dim {
background-color: #000;
- opacity: .20;filter:Alpha(Opacity=20);
+ opacity: .20;
z-index: 999;
position: fixed;
top: 0; left: 0;
diff --git a/core/css/mobile.css b/core/css/mobile.css
index a98547596b2..662c583efbc 100644
--- a/core/css/mobile.css
+++ b/core/css/mobile.css
@@ -109,14 +109,10 @@
z-index: 149;
background-color: rgba(255, 255, 255, .7);
cursor: pointer;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
- filter: alpha(opacity=60);
opacity: .6;
}
#app-navigation-toggle:hover,
#app-navigation-toggle:focus {
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
opacity: 1;
}
diff --git a/core/css/share.css b/core/css/share.css
index bf38ce83a02..94811100fcf 100644
--- a/core/css/share.css
+++ b/core/css/share.css
@@ -65,7 +65,6 @@
#shareWithList label input[type=checkbox]{
margin-left: 0;
- top: 3px;
position: relative;
}
#shareWithList .username{
@@ -87,6 +86,7 @@
#dropdown input[type="checkbox"] {
margin:0 3px 0 8px;
+ vertical-align: middle;
}
a.showCruds {
@@ -126,8 +126,10 @@ a.unshare {
width:12px;
}
-.reshare,#link label,#expiration label {
- padding-left:8px;
+.reshare,#link label,
+#expiration label {
+ display: inline-block;
+ padding: 6px 4px;
}
a.showCruds:hover,a.unshare:hover {
diff --git a/core/css/styles.css b/core/css/styles.css
index 74df29140a9..12b6bbe9efb 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -133,7 +133,8 @@ input[type="url"]:hover, input[type="url"]:focus, input[type="url"]:active,
input[type="time"]:hover, input[type="time"]:focus, input[type="time"]:active,
textarea:hover, textarea:focus, textarea:active {
color: #333;
- -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ opacity: 1;
}
input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; }
input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; }
@@ -243,7 +244,8 @@ textarea:disabled {
background: #fff url('../img/actions/search.svg') no-repeat .5em center;
border: 0;
border-radius: 2em;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity: .7;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
+ opacity: .7;
margin-top: 6px;
float: right;
}
@@ -324,7 +326,8 @@ input[type="submit"].enabled {
overflow-x: auto;
}
-#emptycontent {
+#emptycontent,
+.emptycontent {
font-size: 16px;
color: #888;
position: absolute;
@@ -332,18 +335,20 @@ input[type="submit"].enabled {
top: 30%;
width: 100%;
}
-#emptycontent h2 {
+#emptycontent h2,
+.emptycontent h2 {
font-size: 22px;
margin-bottom: 10px;
}
#emptycontent [class^="icon-"],
-#emptycontent [class*=" icon-"] {
+.emptycontent [class^="icon-"],
+#emptycontent [class*=" icon-"],
+.emptycontent [class*=" icon-"] {
background-size: 64px;
height: 64px;
width: 64px;
margin: 0 auto 15px;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
opacity: .5;
}
@@ -368,7 +373,6 @@ input[type="submit"].enabled {
text-align: center;
color: #ccc;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
- filter: alpha(opacity=60);
opacity: .6;
}
/* overrides another !important statement that sets this to unreadable black */
@@ -468,7 +472,6 @@ input[name='password-clone'] {
left: 16px;
top: 22px;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
- filter: alpha(opacity=30);
opacity: .3;
}
#adminpass-icon, #password-icon {
@@ -572,7 +575,6 @@ label.infield {
}
#show:checked + label, #dbpassword:checked + label, #personal-show:checked + label {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
- filter: alpha(opacity=80);
opacity: .8;
}
#show + label, #dbpassword + label, #personal-show + label {
@@ -583,7 +585,6 @@ label.infield {
background-repeat: no-repeat;
background-position: center;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
- filter: alpha(opacity=30);
opacity: .3;
}
#pass2, input[name="personal-password-clone"] {
@@ -675,7 +676,6 @@ label.infield {
}
#body-login .warning legend {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
opacity: 1;
}
#body-login a.warning {
@@ -763,8 +763,7 @@ label.infield {
top: 0;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
- -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=90)";
- filter:alpha(opacity=90);
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=90)";
opacity: .9;
}
#notification span, #update-notification span {
@@ -775,7 +774,6 @@ label.infield {
tr .action:not(.permanent),
.selectedActions a {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
- filter: alpha(opacity=0);
opacity: 0;
}
tr:hover .action,
@@ -783,7 +781,6 @@ tr:focus .action,
tr .action.permanent,
.selectedActions a {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
opacity: .5;
}
tr .action {
@@ -792,7 +789,6 @@ tr .action {
}
.header-action {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
- filter: alpha(opacity=80);
opacity: .8;
}
tr:hover .action:hover,
@@ -802,7 +798,6 @@ tr:focus .action:focus,
.header-action:hover,
.header-action:focus {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
opacity: 1;
}
tbody tr:hover,
@@ -981,7 +976,6 @@ div.crumb:focus,
div.crumb a:focus,
div.crumb:active {
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
- filter:alpha(opacity=70);
opacity:.7;
}
diff --git a/core/js/js.js b/core/js/js.js
index f24694124ad..00adcc514bc 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1338,7 +1338,7 @@ OC.Util = {
* @returns {string} timestamp formatted as requested
*/
formatDate: function (timestamp, format) {
- format = format || "MMMM D, YYYY h:mm";
+ format = format || "LLL";
return moment(timestamp).format(format);
},
diff --git a/core/js/share.js b/core/js/share.js
index 8804db12a08..38f7ec0e14d 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -674,23 +674,23 @@ OC.Share={
html += '<label><input type="checkbox" name="mailNotification" class="mailNotification" ' + checked + ' />'+t('core', 'notify by email')+'</label> ';
}
if (oc_appconfig.core.resharingAllowed && (possiblePermissions & OC.PERMISSION_SHARE)) {
- html += '<input id="canShare-'+escapeHTML(shareWith)+'" type="checkbox" name="share" class="permissions" '+shareChecked+' data-permissions="'+OC.PERMISSION_SHARE+'" /><label for="canShare-'+escapeHTML(shareWith)+'">'+t('core', 'can share')+'</label>';
+ html += '<label><input id="canShare-'+escapeHTML(shareWith)+'" type="checkbox" name="share" class="permissions" '+shareChecked+' data-permissions="'+OC.PERMISSION_SHARE+'" />'+t('core', 'can share')+'</label>';
}
if (possiblePermissions & OC.PERMISSION_CREATE || possiblePermissions & OC.PERMISSION_UPDATE || possiblePermissions & OC.PERMISSION_DELETE) {
- html += '<input id="canEdit-'+escapeHTML(shareWith)+'" type="checkbox" name="edit" class="permissions" '+editChecked+' /><label for="canEdit-'+escapeHTML(shareWith)+'">'+t('core', 'can edit')+'</label>';
+ html += '<label><input id="canEdit-'+escapeHTML(shareWith)+'" type="checkbox" name="edit" class="permissions" '+editChecked+' />'+t('core', 'can edit')+'</label>';
}
if (shareType !== OC.Share.SHARE_TYPE_REMOTE) {
showCrudsButton = '<a href="#" class="showCruds"><img class="svg" alt="'+t('core', 'access control')+'" src="'+OC.imagePath('core', 'actions/triangle-s')+'"/></a>';
}
html += '<div class="cruds" style="display:none;">';
if (possiblePermissions & OC.PERMISSION_CREATE) {
- html += '<input id="canCreate-' + escapeHTML(shareWith) + '" type="checkbox" name="create" class="permissions" ' + createChecked + ' data-permissions="' + OC.PERMISSION_CREATE + '"/><label for="canCreate-' + escapeHTML(shareWith) + '">' + t('core', 'create') + '</label>';
+ html += '<label><input id="canCreate-' + escapeHTML(shareWith) + '" type="checkbox" name="create" class="permissions" ' + createChecked + ' data-permissions="' + OC.PERMISSION_CREATE + '"/>' + t('core', 'create') + '</label>';
}
if (possiblePermissions & OC.PERMISSION_UPDATE) {
- html += '<input id="canUpdate-' + escapeHTML(shareWith) + '" type="checkbox" name="update" class="permissions" ' + updateChecked + ' data-permissions="' + OC.PERMISSION_UPDATE + '"/><label for="canUpdate-' + escapeHTML(shareWith) + '">' + t('core', 'change') + '</label>';
+ html += '<label><input id="canUpdate-' + escapeHTML(shareWith) + '" type="checkbox" name="update" class="permissions" ' + updateChecked + ' data-permissions="' + OC.PERMISSION_UPDATE + '"/>' + t('core', 'change') + '</label>';
}
if (possiblePermissions & OC.PERMISSION_DELETE) {
- html += '<input id="canDelete-' + escapeHTML(shareWith) + '" type="checkbox" name="delete" class="permissions" ' + deleteChecked + ' data-permissions="' + OC.PERMISSION_DELETE + '"/><label for="canDelete-' + escapeHTML(shareWith) + '">' + t('core', 'delete') + '</label>';
+ html += '<label><input id="canDelete-' + escapeHTML(shareWith) + '" type="checkbox" name="delete" class="permissions" ' + deleteChecked + ' data-permissions="' + OC.PERMISSION_DELETE + '"/>' + t('core', 'delete') + '</label>';
}
html += '</div>';
html += '</li>';
@@ -1189,10 +1189,10 @@ $(document).ready(function() {
$('#email').prop('disabled', false);
$('#emailButton').prop('disabled', false);
if (result && result.status == 'success') {
- $('#email').css('font-weight', 'bold');
- $('#email').animate({ fontWeight: 'normal' }, 2000, function() {
- $(this).val('');
- }).val(t('core','Email sent'));
+ $('#email').css('font-weight', 'bold').val(t('core','Email sent'));
+ setTimeout(function() {
+ $('#email').css('font-weight', 'normal').val('');
+ }, 2000);
} else {
OC.dialogs.alert(result.data.message, t('core', 'Error while sharing'));
}
diff --git a/core/js/tests/specHelper.js b/core/js/tests/specHelper.js
index 59c2a99645f..29293e89bcb 100644
--- a/core/js/tests/specHelper.js
+++ b/core/js/tests/specHelper.js
@@ -123,6 +123,9 @@ window.isPhantom = /phantom/i.test(navigator.userAgent);
// reset plugins
OC.Plugins._plugins = [];
+
+ // dummy select2 (which isn't loaded during the tests)
+ $.fn.select2 = function() {};
});
afterEach(function() {
@@ -131,6 +134,8 @@ window.isPhantom = /phantom/i.test(navigator.userAgent);
fakeServer.restore();
$testArea.remove();
+
+ delete($.fn.select2);
});
})();
diff --git a/core/l10n/af_ZA.js b/core/l10n/af_ZA.js
index 175a5cd3b76..a1e7649b925 100644
--- a/core/l10n/af_ZA.js
+++ b/core/l10n/af_ZA.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Checked database schema update" : "Databasis skema opdatering nagegaan",
"Checked database schema update for apps" : "Databasis skema opdatering nagegaan vir sagteware",
"Updated \"%s\" to %s" : "\"%s\" opgedateer na %s",
+ "Repair warning: " : "Herstel waarskuwing:",
+ "Repair error: " : "Herstel fout:",
"No image or file provided" : "Geen prent of lêer voorsien",
"Unknown filetype" : "Onbekende lêertipe",
"Invalid image" : "Ongeldige prent",
@@ -46,6 +48,7 @@ OC.L10N.register(
"One file conflict" : "Een lêer konflik",
"New Files" : "Nuwe lêers",
"Already existing files" : "Bestaande lêers",
+ "Which files do you want to keep?" : "Watse lêers wil jy hou?",
"Cancel" : "Kanselleer",
"Continue" : "Gaan voort",
"Very weak password" : "Baie swak wagwoord",
diff --git a/core/l10n/af_ZA.json b/core/l10n/af_ZA.json
index fcafcbd2bce..c2e6b148ae5 100644
--- a/core/l10n/af_ZA.json
+++ b/core/l10n/af_ZA.json
@@ -6,6 +6,8 @@
"Checked database schema update" : "Databasis skema opdatering nagegaan",
"Checked database schema update for apps" : "Databasis skema opdatering nagegaan vir sagteware",
"Updated \"%s\" to %s" : "\"%s\" opgedateer na %s",
+ "Repair warning: " : "Herstel waarskuwing:",
+ "Repair error: " : "Herstel fout:",
"No image or file provided" : "Geen prent of lêer voorsien",
"Unknown filetype" : "Onbekende lêertipe",
"Invalid image" : "Ongeldige prent",
@@ -44,6 +46,7 @@
"One file conflict" : "Een lêer konflik",
"New Files" : "Nuwe lêers",
"Already existing files" : "Bestaande lêers",
+ "Which files do you want to keep?" : "Watse lêers wil jy hou?",
"Cancel" : "Kanselleer",
"Continue" : "Gaan voort",
"Very weak password" : "Baie swak wagwoord",
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index 3dfe54b2f12..0a22e5aad4e 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Technické detaily",
"Remote Address: %s" : "Vzdálená adresa: %s",
"Request ID: %s" : "ID požadavku: %s",
+ "Type: %s" : "Typ: %s",
"Code: %s" : "Kód: %s",
"Message: %s" : "Zpráva: %s",
"File: %s" : "Soubor: %s",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index 576a5dc605b..c37ffeb2c7f 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -169,6 +169,7 @@
"Technical details" : "Technické detaily",
"Remote Address: %s" : "Vzdálená adresa: %s",
"Request ID: %s" : "ID požadavku: %s",
+ "Type: %s" : "Typ: %s",
"Code: %s" : "Kód: %s",
"Message: %s" : "Zpráva: %s",
"File: %s" : "Soubor: %s",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index a53ab7da494..0027eb7536a 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -8,13 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "Tjekket database schema opdatering",
"Checked database schema update for apps" : "Tjekkede databaseskemaets opdatering for apps",
"Updated \"%s\" to %s" : "Opdaterede \"%s\" til %s",
+ "Repair warning: " : "Reparationsadvarsel:",
+ "Repair error: " : "Reparationsfejl:",
"Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s",
"Following 3rd party apps have been disabled: %s" : "Følgende apps fra 3. part er blevet deaktiveret: %s",
+ "Invalid file provided" : "Der er angivet en ugyldig fil",
"No image or file provided" : "Ingen fil eller billede givet",
"Unknown filetype" : "Ukendt filtype",
"Invalid image" : "Ugyldigt billede",
"No temporary profile picture available, try again" : "Intet midlertidigt profilbillede tilgængeligt, prøv igen",
"No crop data provided" : "Ingen beskæringsdata give",
+ "No valid crop data provided" : "Der er ikke angivet gyldige data om beskæring",
+ "Crop is not square" : "Beskæringen er ikke kvadratisk",
"Sunday" : "Søndag",
"Monday" : "Mandag",
"Tuesday" : "Tirsdag",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index fb9b7652fcb..06f27d4df8c 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -6,13 +6,18 @@
"Checked database schema update" : "Tjekket database schema opdatering",
"Checked database schema update for apps" : "Tjekkede databaseskemaets opdatering for apps",
"Updated \"%s\" to %s" : "Opdaterede \"%s\" til %s",
+ "Repair warning: " : "Reparationsadvarsel:",
+ "Repair error: " : "Reparationsfejl:",
"Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s",
"Following 3rd party apps have been disabled: %s" : "Følgende apps fra 3. part er blevet deaktiveret: %s",
+ "Invalid file provided" : "Der er angivet en ugyldig fil",
"No image or file provided" : "Ingen fil eller billede givet",
"Unknown filetype" : "Ukendt filtype",
"Invalid image" : "Ugyldigt billede",
"No temporary profile picture available, try again" : "Intet midlertidigt profilbillede tilgængeligt, prøv igen",
"No crop data provided" : "Ingen beskæringsdata give",
+ "No valid crop data provided" : "Der er ikke angivet gyldige data om beskæring",
+ "Crop is not square" : "Beskæringen er ikke kvadratisk",
"Sunday" : "Søndag",
"Monday" : "Mandag",
"Tuesday" : "Tirsdag",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 8d8ef4ab77e..0dbd5fbba0c 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Technische Details",
"Remote Address: %s" : "Entfernte Adresse: %s",
"Request ID: %s" : "Anforderungskennung: %s",
+ "Type: %s" : "Typ: %s",
"Code: %s" : "Code: %s",
"Message: %s" : "Nachricht: %s",
"File: %s" : "Datei: %s",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 22b95a850f5..d380f3afa26 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -169,6 +169,7 @@
"Technical details" : "Technische Details",
"Remote Address: %s" : "Entfernte Adresse: %s",
"Request ID: %s" : "Anforderungskennung: %s",
+ "Type: %s" : "Typ: %s",
"Code: %s" : "Code: %s",
"Message: %s" : "Nachricht: %s",
"File: %s" : "Datei: %s",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index 2c6b8f38830..39ac07d6962 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Technische Details",
"Remote Address: %s" : "Entfernte Adresse: %s",
"Request ID: %s" : "Anforderungskennung: %s",
+ "Type: %s" : "Typ: %s",
"Code: %s" : "Code: %s",
"Message: %s" : "Nachricht: %s",
"File: %s" : "Datei: %s",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index 52906054484..aa58f2187b6 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -169,6 +169,7 @@
"Technical details" : "Technische Details",
"Remote Address: %s" : "Entfernte Adresse: %s",
"Request ID: %s" : "Anforderungskennung: %s",
+ "Type: %s" : "Typ: %s",
"Code: %s" : "Code: %s",
"Message: %s" : "Nachricht: %s",
"File: %s" : "Datei: %s",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index d67e9b71367..c6f93870044 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Tekniset tiedot",
"Remote Address: %s" : "Etäosoite: %s",
"Request ID: %s" : "Pyynnön tunniste: %s",
+ "Type: %s" : "Tyyppi: %s",
"Code: %s" : "Koodi: %s",
"Message: %s" : "Viesti: %s",
"File: %s" : "Tiedosto: %s",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index a343fbcb1c2..00911b956ff 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -169,6 +169,7 @@
"Technical details" : "Tekniset tiedot",
"Remote Address: %s" : "Etäosoite: %s",
"Request ID: %s" : "Pyynnön tunniste: %s",
+ "Type: %s" : "Tyyppi: %s",
"Code: %s" : "Koodi: %s",
"Message: %s" : "Viesti: %s",
"File: %s" : "Tiedosto: %s",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index 0085d3114c7..f966ee09836 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Checked database schema update" : "Mise à jour du schéma de la base de données vérifiée",
"Checked database schema update for apps" : "Mise à jour du schéma de la base de données pour les applications vérifiée",
"Updated \"%s\" to %s" : "Mise à jour de « %s » vers %s",
+ "Repair warning: " : "Avertissement de réparation :",
+ "Repair error: " : "Erreur de réparation :",
"Following incompatible apps have been disabled: %s" : "Les applications incompatibles suivantes ont été désactivées : %s",
"Following 3rd party apps have been disabled: %s" : "Les applications tierce partie suivantes ont été désactivées : %s",
"Invalid file provided" : "Fichier non valide",
@@ -169,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Renseignements techniques",
"Remote Address: %s" : "Adresse distante : %s",
"Request ID: %s" : "ID de la demande : %s",
+ "Type: %s" : "Type : %s",
"Code: %s" : "Code : %s",
"Message: %s" : "Message : %s",
"File: %s" : "Fichier : %s",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index d084ef577a9..2687099dbda 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -6,6 +6,8 @@
"Checked database schema update" : "Mise à jour du schéma de la base de données vérifiée",
"Checked database schema update for apps" : "Mise à jour du schéma de la base de données pour les applications vérifiée",
"Updated \"%s\" to %s" : "Mise à jour de « %s » vers %s",
+ "Repair warning: " : "Avertissement de réparation :",
+ "Repair error: " : "Erreur de réparation :",
"Following incompatible apps have been disabled: %s" : "Les applications incompatibles suivantes ont été désactivées : %s",
"Following 3rd party apps have been disabled: %s" : "Les applications tierce partie suivantes ont été désactivées : %s",
"Invalid file provided" : "Fichier non valide",
@@ -167,6 +169,7 @@
"Technical details" : "Renseignements techniques",
"Remote Address: %s" : "Adresse distante : %s",
"Request ID: %s" : "ID de la demande : %s",
+ "Type: %s" : "Type : %s",
"Code: %s" : "Code : %s",
"Message: %s" : "Message : %s",
"File: %s" : "Fichier : %s",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index bb302237824..21095ab6469 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Detalles técnicos",
"Remote Address: %s" : "Enderezo remoto: %s",
"Request ID: %s" : "ID da petición: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensaxe: %s",
"File: %s" : "Ficheiro: %s",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index b2fd4a3585a..259bdb5f0d0 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -169,6 +169,7 @@
"Technical details" : "Detalles técnicos",
"Remote Address: %s" : "Enderezo remoto: %s",
"Request ID: %s" : "ID da petición: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensaxe: %s",
"File: %s" : "Ficheiro: %s",
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index 359a386cc62..03117226d96 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -8,6 +8,9 @@ OC.L10N.register(
"Checked database schema update" : "Az adatbázis séma frissítését ellenőriztük",
"Checked database schema update for apps" : "Az adatbázis séma frissítését ellenőriztük az alkalmazásokra vontakozóan",
"Updated \"%s\" to %s" : "Frissítettük \"%s\"-t erre: %s",
+ "Repair warning: " : "Javítás figyelmeztetés:",
+ "Repair error: " : "Javítás hiba:",
+ "Invalid file provided" : "Érvénytelen fájl van megadva",
"No image or file provided" : "Nincs kép vagy fájl megadva",
"Unknown filetype" : "Ismeretlen fájltípus",
"Invalid image" : "Hibás kép",
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index f348b91a701..89bd567191f 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -6,6 +6,9 @@
"Checked database schema update" : "Az adatbázis séma frissítését ellenőriztük",
"Checked database schema update for apps" : "Az adatbázis séma frissítését ellenőriztük az alkalmazásokra vontakozóan",
"Updated \"%s\" to %s" : "Frissítettük \"%s\"-t erre: %s",
+ "Repair warning: " : "Javítás figyelmeztetés:",
+ "Repair error: " : "Javítás hiba:",
+ "Invalid file provided" : "Érvénytelen fájl van megadva",
"No image or file provided" : "Nincs kép vagy fájl megadva",
"Unknown filetype" : "Ismeretlen fájltípus",
"Invalid image" : "Hibás kép",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 98fd6c449d3..548c57d81e8 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Dettagli tecnici",
"Remote Address: %s" : "Indirizzo remoto: %s",
"Request ID: %s" : "ID richiesta: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Codice: %s",
"Message: %s" : "Messaggio: %s",
"File: %s" : "File: %s",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index dff9b1cad10..9c915ff3ce7 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -169,6 +169,7 @@
"Technical details" : "Dettagli tecnici",
"Remote Address: %s" : "Indirizzo remoto: %s",
"Request ID: %s" : "ID richiesta: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Codice: %s",
"Message: %s" : "Messaggio: %s",
"File: %s" : "File: %s",
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index 1ff925486dd..027b7449b39 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -8,8 +8,11 @@ OC.L10N.register(
"Checked database schema update" : "指定データベースのスキーマを更新",
"Checked database schema update for apps" : "アプリの指定データベースのスキーマを更新",
"Updated \"%s\" to %s" : "\"%s\" を %s にアップデートしました。",
+ "Repair warning: " : "修復警告:",
+ "Repair error: " : "修復エラー:",
"Following incompatible apps have been disabled: %s" : "次の互換性の無いアプリは無効にされています。: %s",
"Following 3rd party apps have been disabled: %s" : "次のサードパーティーアプリは無効にされています。: %s",
+ "Invalid file provided" : "無効なファイルが提供されました",
"No image or file provided" : "画像もしくはファイルが提供されていません",
"Unknown filetype" : "不明なファイルタイプ",
"Invalid image" : "無効な画像",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index 267dfa111e4..94cc50e0b10 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -6,8 +6,11 @@
"Checked database schema update" : "指定データベースのスキーマを更新",
"Checked database schema update for apps" : "アプリの指定データベースのスキーマを更新",
"Updated \"%s\" to %s" : "\"%s\" を %s にアップデートしました。",
+ "Repair warning: " : "修復警告:",
+ "Repair error: " : "修復エラー:",
"Following incompatible apps have been disabled: %s" : "次の互換性の無いアプリは無効にされています。: %s",
"Following 3rd party apps have been disabled: %s" : "次のサードパーティーアプリは無効にされています。: %s",
+ "Invalid file provided" : "無効なファイルが提供されました",
"No image or file provided" : "画像もしくはファイルが提供されていません",
"Unknown filetype" : "不明なファイルタイプ",
"Invalid image" : "無効な画像",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index a481531f666..54fbf9c3507 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Technische details",
"Remote Address: %s" : "Extern adres: %s",
"Request ID: %s" : "Aanvraag ID: %s",
+ "Type: %s" : "Type: %s",
"Code: %s" : "Code: %s",
"Message: %s" : "Boodschap: %s",
"File: %s" : "Bestand: %s",
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index 37bc2723cbb..038898ec06f 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -169,6 +169,7 @@
"Technical details" : "Technische details",
"Remote Address: %s" : "Extern adres: %s",
"Request ID: %s" : "Aanvraag ID: %s",
+ "Type: %s" : "Type: %s",
"Code: %s" : "Code: %s",
"Message: %s" : "Boodschap: %s",
"File: %s" : "Bestand: %s",
diff --git a/core/l10n/pl.js b/core/l10n/pl.js
index 527291427a9..e9a5d248db0 100644
--- a/core/l10n/pl.js
+++ b/core/l10n/pl.js
@@ -8,6 +8,11 @@ OC.L10N.register(
"Checked database schema update" : "Sprawdzono aktualizację schematu bazy danych",
"Checked database schema update for apps" : "Sprawdzono aktualizację schematu bazy danych dla aplikacji",
"Updated \"%s\" to %s" : "Zaktualizowano \"%s\" do %s",
+ "Repair warning: " : "Ostrzeżenie naprawiania:",
+ "Repair error: " : "Błąd naprawiania:",
+ "Following incompatible apps have been disabled: %s" : "Poniższe niezgodne aplikacje zostały wyłączone: %s",
+ "Following 3rd party apps have been disabled: %s" : "Poniższe aplikacje dostawców trzecich - 3rd - zostały wyłączone: %s",
+ "Invalid file provided" : "Podano błędny plik",
"No image or file provided" : "Brak obrazu lub pliku dostarczonego",
"Unknown filetype" : "Nieznany typ pliku",
"Invalid image" : "Nieprawidłowe zdjęcie",
diff --git a/core/l10n/pl.json b/core/l10n/pl.json
index 5fee2eade25..83fdbc4e58a 100644
--- a/core/l10n/pl.json
+++ b/core/l10n/pl.json
@@ -6,6 +6,11 @@
"Checked database schema update" : "Sprawdzono aktualizację schematu bazy danych",
"Checked database schema update for apps" : "Sprawdzono aktualizację schematu bazy danych dla aplikacji",
"Updated \"%s\" to %s" : "Zaktualizowano \"%s\" do %s",
+ "Repair warning: " : "Ostrzeżenie naprawiania:",
+ "Repair error: " : "Błąd naprawiania:",
+ "Following incompatible apps have been disabled: %s" : "Poniższe niezgodne aplikacje zostały wyłączone: %s",
+ "Following 3rd party apps have been disabled: %s" : "Poniższe aplikacje dostawców trzecich - 3rd - zostały wyłączone: %s",
+ "Invalid file provided" : "Podano błędny plik",
"No image or file provided" : "Brak obrazu lub pliku dostarczonego",
"Unknown filetype" : "Nieznany typ pliku",
"Invalid image" : "Nieprawidłowe zdjęcie",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index 67e4f5a1759..182d552158b 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -8,13 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "Verificado atualização do esquema de banco de dados",
"Checked database schema update for apps" : "Verificar atualização do esquema de banco de dados para aplicativos",
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
+ "Repair warning: " : "Aviso de reparação:",
+ "Repair error: " : "Reparação de erro:",
"Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s",
"Following 3rd party apps have been disabled: %s" : "Seguir aplicativos de terceiros 3 foi desativado: %s",
+ "Invalid file provided" : "Arquivo fornecido inválido",
"No image or file provided" : "Nenhuma imagem ou arquivo fornecido",
"Unknown filetype" : "Tipo de arquivo desconhecido",
"Invalid image" : "Imagem inválida",
"No temporary profile picture available, try again" : "Nenhuma imagem temporária disponível no perfil, tente novamente",
"No crop data provided" : "Nenhum dado para coleta foi fornecido",
+ "No valid crop data provided" : "Nenhum dado recortado válido",
+ "Crop is not square" : "Recorte não é quadrado",
"Sunday" : "Domingo",
"Monday" : "Segunda-feira",
"Tuesday" : "Terça-feira",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index f30f238665a..25bcdfc6b03 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -6,13 +6,18 @@
"Checked database schema update" : "Verificado atualização do esquema de banco de dados",
"Checked database schema update for apps" : "Verificar atualização do esquema de banco de dados para aplicativos",
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
+ "Repair warning: " : "Aviso de reparação:",
+ "Repair error: " : "Reparação de erro:",
"Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s",
"Following 3rd party apps have been disabled: %s" : "Seguir aplicativos de terceiros 3 foi desativado: %s",
+ "Invalid file provided" : "Arquivo fornecido inválido",
"No image or file provided" : "Nenhuma imagem ou arquivo fornecido",
"Unknown filetype" : "Tipo de arquivo desconhecido",
"Invalid image" : "Imagem inválida",
"No temporary profile picture available, try again" : "Nenhuma imagem temporária disponível no perfil, tente novamente",
"No crop data provided" : "Nenhum dado para coleta foi fornecido",
+ "No valid crop data provided" : "Nenhum dado recortado válido",
+ "Crop is not square" : "Recorte não é quadrado",
"Sunday" : "Domingo",
"Monday" : "Segunda-feira",
"Tuesday" : "Terça-feira",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 62991abce5b..63ee7c11953 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -171,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Detalhes técnicos",
"Remote Address: %s" : "Endereço remoto: %s",
"Request ID: %s" : "Id. do Pedido: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensagem: %s",
"File: %s" : "Ficheiro: %s",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index d4f869f01e1..722ef970ba6 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -169,6 +169,7 @@
"Technical details" : "Detalhes técnicos",
"Remote Address: %s" : "Endereço remoto: %s",
"Request ID: %s" : "Id. do Pedido: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensagem: %s",
"File: %s" : "Ficheiro: %s",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 22553badbbf..8ada818f687 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -8,13 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "Ажурирање шеме базе података, проверено",
"Checked database schema update for apps" : "Ажурирање шеме базе података за апликације, проверено",
"Updated \"%s\" to %s" : "„%s“ ажириран на %s",
+ "Repair warning: " : "Упозорење о поправци :",
+ "Repair error: " : "Грешка поправке:",
"Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s",
"Following 3rd party apps have been disabled: %s" : "Следеће апликације треће стране су искључене: %s",
+ "Invalid file provided" : "Понуђени фајл је неисправан",
"No image or file provided" : "Није дата ни слика ни фајл",
"Unknown filetype" : "Непознат тип фајла",
"Invalid image" : "Неисправна слика",
"No temporary profile picture available, try again" : "Нема привремене слике профила. Покушајте поново",
"No crop data provided" : "Нема података о опсецању",
+ "No valid crop data provided" : "Нема података о опсецању",
+ "Crop is not square" : "Опсецање није квадрат",
"Sunday" : "Недеља",
"Monday" : "Понедељак",
"Tuesday" : "Уторак",
@@ -129,6 +134,7 @@ OC.L10N.register(
"Please reload the page." : "Поново учитајте страницу.",
"The update was unsuccessful. " : "Ажурирање није успело.",
"The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на ОунКлауд.",
+ "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку, јер je дигитални кључ неважећи",
"Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за обнављање лозинке. Проверите да ли је корисничко име исправно.",
"Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не могу да пошаљем поруку за обнављање лозинке јер за ово корисничко име нема е-адресе. Контактирајте администратора.",
"%s password reset" : "%s лозинка обновљена",
@@ -165,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Технички детаљи",
"Remote Address: %s" : "Удаљена адреса: %s",
"Request ID: %s" : "ИД захтева: %s",
+ "Type: %s" : "Тип: %s",
"Code: %s" : "Кôд: %s",
"Message: %s" : "Порука: %s",
"File: %s" : "Фајл: %s",
@@ -191,6 +198,7 @@ OC.L10N.register(
"Finish setup" : "Заврши подешавање",
"Finishing …" : "Завршавам…",
"This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Ова апликација захтева Јава скрипт за исправан рад. {linkstart}Омогућите Јава скрипт{linkend} и поново учитајте страницу.",
+ "%s is available. Get more information on how to update." : "%s је доступан. Сазнајте више о томе како да ажурирате.",
"Log out" : "Одјава",
"Search" : "Претражи",
"Server side authentication failed!" : "Аутентификација на серверу није успела!",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index 0ad388791c6..eeed481a0c4 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -6,13 +6,18 @@
"Checked database schema update" : "Ажурирање шеме базе података, проверено",
"Checked database schema update for apps" : "Ажурирање шеме базе података за апликације, проверено",
"Updated \"%s\" to %s" : "„%s“ ажириран на %s",
+ "Repair warning: " : "Упозорење о поправци :",
+ "Repair error: " : "Грешка поправке:",
"Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s",
"Following 3rd party apps have been disabled: %s" : "Следеће апликације треће стране су искључене: %s",
+ "Invalid file provided" : "Понуђени фајл је неисправан",
"No image or file provided" : "Није дата ни слика ни фајл",
"Unknown filetype" : "Непознат тип фајла",
"Invalid image" : "Неисправна слика",
"No temporary profile picture available, try again" : "Нема привремене слике профила. Покушајте поново",
"No crop data provided" : "Нема података о опсецању",
+ "No valid crop data provided" : "Нема података о опсецању",
+ "Crop is not square" : "Опсецање није квадрат",
"Sunday" : "Недеља",
"Monday" : "Понедељак",
"Tuesday" : "Уторак",
@@ -127,6 +132,7 @@
"Please reload the page." : "Поново учитајте страницу.",
"The update was unsuccessful. " : "Ажурирање није успело.",
"The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на ОунКлауд.",
+ "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку, јер je дигитални кључ неважећи",
"Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за обнављање лозинке. Проверите да ли је корисничко име исправно.",
"Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не могу да пошаљем поруку за обнављање лозинке јер за ово корисничко име нема е-адресе. Контактирајте администратора.",
"%s password reset" : "%s лозинка обновљена",
@@ -163,6 +169,7 @@
"Technical details" : "Технички детаљи",
"Remote Address: %s" : "Удаљена адреса: %s",
"Request ID: %s" : "ИД захтева: %s",
+ "Type: %s" : "Тип: %s",
"Code: %s" : "Кôд: %s",
"Message: %s" : "Порука: %s",
"File: %s" : "Фајл: %s",
@@ -189,6 +196,7 @@
"Finish setup" : "Заврши подешавање",
"Finishing …" : "Завршавам…",
"This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Ова апликација захтева Јава скрипт за исправан рад. {linkstart}Омогућите Јава скрипт{linkend} и поново учитајте страницу.",
+ "%s is available. Get more information on how to update." : "%s је доступан. Сазнајте више о томе како да ажурирате.",
"Log out" : "Одјава",
"Search" : "Претражи",
"Server side authentication failed!" : "Аутентификација на серверу није успела!",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index cfd44d6efe4..ec09da6ec7c 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -8,13 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "Veritabanı şema güncellemesi denetlendi",
"Checked database schema update for apps" : "Uygulamalar için veritabanı şema güncellemesi denetlendi",
"Updated \"%s\" to %s" : "\"%s\", %s sürümüne güncellendi",
+ "Repair warning: " : "Onarım uyarısı:",
+ "Repair error: " : "Onarım hatası:",
"Following incompatible apps have been disabled: %s" : "Aşağıdaki uyumsuz uygulamalar devre dışı bırakıldı: %s",
"Following 3rd party apps have been disabled: %s" : "Aşağıdaki üçüncü parti uygulamalar devre dışı bırakıldı: %s",
+ "Invalid file provided" : "Geçersiz dosya sağlandı",
"No image or file provided" : "Resim veya dosya belirtilmedi",
"Unknown filetype" : "Bilinmeyen dosya türü",
"Invalid image" : "Geçersiz resim",
"No temporary profile picture available, try again" : "Kullanılabilir geçici profil resmi yok, tekrar deneyin",
"No crop data provided" : "Kesme verisi sağlanmamış",
+ "No valid crop data provided" : "Geçerli kırpma verisi sağlanmadı",
+ "Crop is not square" : "Kırpma kare değil",
"Sunday" : "Pazar",
"Monday" : "Pazartesi",
"Tuesday" : "Salı",
@@ -166,6 +171,7 @@ OC.L10N.register(
"Technical details" : "Teknik ayrıntılar",
"Remote Address: %s" : "Uzak Adres: %s",
"Request ID: %s" : "İstek Kimliği: %s",
+ "Type: %s" : "Tür: %s",
"Code: %s" : "Kod: %s",
"Message: %s" : "Mesaj: %s",
"File: %s" : "Dosya: %s",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index ad0d6c2dc18..ee7c82c3f04 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -6,13 +6,18 @@
"Checked database schema update" : "Veritabanı şema güncellemesi denetlendi",
"Checked database schema update for apps" : "Uygulamalar için veritabanı şema güncellemesi denetlendi",
"Updated \"%s\" to %s" : "\"%s\", %s sürümüne güncellendi",
+ "Repair warning: " : "Onarım uyarısı:",
+ "Repair error: " : "Onarım hatası:",
"Following incompatible apps have been disabled: %s" : "Aşağıdaki uyumsuz uygulamalar devre dışı bırakıldı: %s",
"Following 3rd party apps have been disabled: %s" : "Aşağıdaki üçüncü parti uygulamalar devre dışı bırakıldı: %s",
+ "Invalid file provided" : "Geçersiz dosya sağlandı",
"No image or file provided" : "Resim veya dosya belirtilmedi",
"Unknown filetype" : "Bilinmeyen dosya türü",
"Invalid image" : "Geçersiz resim",
"No temporary profile picture available, try again" : "Kullanılabilir geçici profil resmi yok, tekrar deneyin",
"No crop data provided" : "Kesme verisi sağlanmamış",
+ "No valid crop data provided" : "Geçerli kırpma verisi sağlanmadı",
+ "Crop is not square" : "Kırpma kare değil",
"Sunday" : "Pazar",
"Monday" : "Pazartesi",
"Tuesday" : "Salı",
@@ -164,6 +169,7 @@
"Technical details" : "Teknik ayrıntılar",
"Remote Address: %s" : "Uzak Adres: %s",
"Request ID: %s" : "İstek Kimliği: %s",
+ "Type: %s" : "Tür: %s",
"Code: %s" : "Kod: %s",
"Message: %s" : "Mesaj: %s",
"File: %s" : "Dosya: %s",
diff --git a/core/l10n/uk.js b/core/l10n/uk.js
index ec584c8085b..d59c40d0442 100644
--- a/core/l10n/uk.js
+++ b/core/l10n/uk.js
@@ -8,11 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "Перевірено оновлення схеми бази даних",
"Checked database schema update for apps" : "Перевірено оновлення схеми бази даних для додатків",
"Updated \"%s\" to %s" : "Оновлено \"%s\" до %s",
+ "Repair warning: " : "Попередження відновлення:",
+ "Repair error: " : "Помилка відновлення:",
+ "Following incompatible apps have been disabled: %s" : "Несумісні додатки були відключені: %s",
+ "Following 3rd party apps have been disabled: %s" : "3rd party додатки були відключені: %s",
+ "Invalid file provided" : "Невірний формат файлу",
"No image or file provided" : "Немає наданого зображення або файлу",
"Unknown filetype" : "Невідомий тип файлу",
"Invalid image" : "Невірне зображення",
"No temporary profile picture available, try again" : "Немає доступного тимчасового профілю для малюнків, спробуйте ще раз",
- "No crop data provided" : "Немає інформації щодо обрізки даних",
+ "No crop data provided" : "Не вказана інформація про кадрування",
+ "No valid crop data provided" : "Не вказані коректні дані про кадрування",
+ "Crop is not square" : "Кадр не є квадратом",
"Sunday" : "Неділя",
"Monday" : "Понеділок",
"Tuesday" : "Вівторок",
@@ -35,7 +42,7 @@ OC.L10N.register(
"Settings" : "Налаштування",
"Saving..." : "Зберігаю...",
"Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.",
- "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого пароль було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.",
+ "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого паролю було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.",
"Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваші файли зашифровані. Якщо ви не зробили ключ відновлення, після скидання паролю відновити ваші дані буде неможливо.<br /> Якщо ви не знаєте, що робити, будь ласка, зверніться до адміністратора перед продовженням.<br /> Ви дійсно хочете продовжити?",
"I know what I'm doing" : "Я знаю що роблю",
"Password can not be changed. Please contact your administrator." : "Пароль не може бути змінено. Будь ласка, зверніться до вашого адміністратора",
@@ -51,18 +58,24 @@ OC.L10N.register(
"New Files" : "Нових Файлів",
"Already existing files" : "Файли що вже існують",
"Which files do you want to keep?" : "Які файли ви хочете залишити?",
- "If you select both versions, the copied file will have a number added to its name." : "Якщо ви оберете обидві версії, скопійований файл буде мати номер, доданий у його ім'я.",
+ "If you select both versions, the copied file will have a number added to its name." : "При виборі обох версій, до назви копійованого файлу буде додана цифра",
"Cancel" : "Відмінити",
"Continue" : "Продовжити",
- "(all selected)" : "(все вибрано)",
- "({count} selected)" : "({count} вибрано)",
- "Error loading file exists template" : "Помилка при завантаженні файлу існуючого шаблону",
+ "(all selected)" : "(все обрано)",
+ "({count} selected)" : "({count} обраних)",
+ "Error loading file exists template" : "Помилка при завантаженні шаблону існуючого файлу",
"Very weak password" : "Дуже слабкий пароль",
"Weak password" : "Слабкий пароль",
"So-so password" : "Такий собі пароль",
"Good password" : "Добрий пароль",
"Strong password" : "Надійний пароль",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш веб-сервер ще не налаштований належним чином, щоб дозволити синхронізацію файлів, тому що інтерфейс WebDAV, здається, зіпсований.",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Цей сервер не має підключення до Інтернету. Це означає, що деякі з функцій, таких як зовнішнє сховище, повідомлення про оновлення та встановлення сторонніх додатків не будуть працювати. Доступ до файлів віддалено і відправки повідомлень поштою можуть не працювати. Ми пропонуємо включити підключення до Інтернету для цього сервера, якщо ви хочете, щоб всі функції працювали.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми настійно рекомендуємо вам налаштувати ваш веб сервер таким чином, що-б каталог даних не був більше доступний або перемістіть каталог даних за межі кореня веб сервера.",
"Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не збігається з \"{expected}\". Це потенційна проблема безпеки і ми рекомендуємо змінити ці налаштування.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP заголовок \"Strict-Transport-Security\" повинен бути налаштований принаймні на \"2,678,400\" секунд. Це потенційна проблема безпеки і ми рекомендуємо змінити ці налаштування.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Ви зайшли на цей сайт через HTTP. Ми настійно рекомендуємо налаштувати ваш сервер на використання HTTPS.",
"Shared" : "Опубліковано",
"Shared with {recipients}" : "Опубліковано для {recipients}",
"Share" : "Поділитися",
@@ -78,9 +91,9 @@ OC.L10N.register(
"Link" : "Посилання",
"Password protect" : "Захистити паролем",
"Password" : "Пароль",
- "Choose a password for the public link" : "Оберіть пароль для опублікованого посилання",
+ "Choose a password for the public link" : "Вкажіть пароль для публічного посилання",
"Allow editing" : "Дозволити редагування",
- "Email link to person" : "Ел. пошта належить Пану",
+ "Email link to person" : "Надіслати посилання по електронній пошті",
"Send" : "Надіслати",
"Set expiration date" : "Встановити термін дії",
"Expiration" : "Закінчення",
@@ -92,7 +105,7 @@ OC.L10N.register(
"Shared in {item} with {user}" : "Опубліковано {item} для {user}",
"Unshare" : "Закрити доступ",
"notify by email" : "повідомити по Email",
- "can share" : "можна поділитися",
+ "can share" : "може ділитися з іншими",
"can edit" : "може редагувати",
"access control" : "контроль доступу",
"create" : "створити",
@@ -114,7 +127,7 @@ OC.L10N.register(
"unknown text" : "невідомий текст",
"Hello world!" : "Привіт світ!",
"sunny" : "сонячно",
- "Hello {name}, the weather is {weather}" : "Привіт {name}, {weather} погода",
+ "Hello {name}, the weather is {weather}" : "Привіт {name}, погода {weather} ",
"Hello {name}" : "Привіт {name}",
"_download %n file_::_download %n files_" : ["завантяження %n файлу","завантаження %n файлів","завантаження %n файлів"],
"Updating {productName} to version {version}, this may take a while." : "Оновлення {productName} до версії {version}, це може займати деякий час.",
@@ -124,24 +137,26 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним",
"Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.",
"Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.",
- "%s password reset" : "%s пароль скинуто",
+ "%s password reset" : "%s скидання паролю",
"Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}",
"New password" : "Новий пароль",
"New Password" : "Новий пароль",
"Reset password" : "Скинути пароль",
- "_{count} search result in other places_::_{count} search results in other places_" : ["","",""],
+ "Searching other places" : "Йде пошук в інших місцях",
+ "No search result in other places" : "В інших місцях нічого не знайдено",
+ "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат пошуку в інших місцях","{count} результатів пошуку в інших місцях","{count} результати пошуку в інших місцях"],
"Personal" : "Особисте",
"Users" : "Користувачі",
"Apps" : "Додатки",
"Admin" : "Адмін",
"Help" : "Допомога",
"Error loading tags" : "Помилка завантаження тегів.",
- "Tag already exists" : "Тег вже існує",
- "Error deleting tag(s)" : "Помилка видалення тегу(ів)",
- "Error tagging" : "Помилка встановлення тегів",
- "Error untagging" : "Помилка зняття тегів",
- "Error favoriting" : "Помилка позначення улюблених",
- "Error unfavoriting" : "Помилка зняття позначки улюблених",
+ "Tag already exists" : "Мітка вже існує",
+ "Error deleting tag(s)" : "Помилка видалення мітки(ок)",
+ "Error tagging" : "Помилка встановлення міток",
+ "Error untagging" : "Помилка зняття мітки",
+ "Error favoriting" : "Помилка додавання в обрані",
+ "Error unfavoriting" : "Помилка видалення з обраного",
"Access forbidden" : "Доступ заборонено",
"File not found" : "Файл не знайдено",
"The specified document has not been found on the server." : "Не вдалось знайти вказаний документ на сервері.",
@@ -151,11 +166,12 @@ OC.L10N.register(
"Cheers!" : "Будьмо!",
"Internal Server Error" : "Внутрішня помилка серверу",
"The server encountered an internal error and was unable to complete your request." : "На сервері сталася внутрішня помилка, тому він не зміг виконати ваш запит.",
- "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Будь ласка, зверніться до адміністратора сервера, якщо ця помилка з'являється кілька разів, будь ласка, вкажіть технічні подробиці нижче в звіті.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Будь ласка, зверніться до адміністратора сервера, якщо ця помилка з'являється кілька разів, будь ласка, вкажіть технічні подробиці у вашому звіті.",
"More details can be found in the server log." : "Більше деталей може бути в журналі серверу.",
"Technical details" : "Технічні деталі",
"Remote Address: %s" : "Віддалена Адреса: %s",
- "Request ID: %s" : "Запит ID: %s",
+ "Request ID: %s" : "ID запиту: %s",
+ "Type: %s" : "Тип: %s",
"Code: %s" : "Код: %s",
"Message: %s" : "Повідомлення: %s",
"File: %s" : "Файл: %s",
@@ -169,38 +185,44 @@ OC.L10N.register(
"Storage & database" : "Сховище і база даних",
"Data folder" : "Каталог даних",
"Configure the database" : "Налаштування бази даних",
- "Only %s is available." : "Тільки %s доступно.",
+ "Only %s is available." : "Доступно тільки %s.",
"Database user" : "Користувач бази даних",
"Database password" : "Пароль для бази даних",
"Database name" : "Назва бази даних",
"Database tablespace" : "Таблиця бази даних",
"Database host" : "Хост бази даних",
- "Finish setup" : "Завершити налаштування",
+ "Performance Warning" : "Попередження про продуктивність",
+ "SQLite will be used as database." : "В якості бази даних буде використана SQLite.",
+ "For larger installations we recommend to choose a different database backend." : "Для великих установок ми радимо вибрати іншу базу даних.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
+ "Finish setup" : "Завершити встановлення",
"Finishing …" : "Завершується ...",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Ця програма вимагає увімкнений JavaScript для коректної роботи. Будь ласка, {linkstart} Увімкніть JavaScript {linkend} та перезавантажте інтерфейс.",
"%s is available. Get more information on how to update." : "%s доступний. Отримай більше інформації про те, як оновити.",
"Log out" : "Вихід",
- "Search" : "Пошук",
- "Server side authentication failed!" : "Помилка аутентифікації на боці Сервера !",
+ "Search" : "Знайти",
+ "Server side authentication failed!" : "Невдала аутентифікація з сервером!",
"Please contact your administrator." : "Будь ласка, зверніться до вашого Адміністратора.",
"Forgot your password? Reset it!" : "Забули ваш пароль? Скиньте його!",
"remember" : "запам'ятати",
- "Log in" : "Вхід",
- "Alternative Logins" : "Альтернативні Логіни",
+ "Log in" : "Увійти",
+ "Alternative Logins" : "Альтернативні імена користувача",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Агов,<br><br>просто щоб ви знали, що %s поділився »%s« з вами.<br><a href=\"%s\">Подивіться!</a><br><br>",
- "This ownCloud instance is currently in single user mode." : "Цей екземпляр OwnCloud зараз працює в монопольному режимі одного користувача",
- "This means only administrators can use the instance." : "Це означає, що лише адміністратори можуть використовувати цей екземпляр.",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "Зверніться до системного адміністратора, якщо це повідомлення зберігається або з'являєтья несподівано.",
+ "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в даний час працює в однокористувацькому режимі.",
+ "This means only administrators can use the instance." : "Це означає, що тільки адміністратори можуть використовувати сервер.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Зверніться до вашого системного адміністратора якщо це повідомлення не зникає або з'являється несподівано.",
"Thank you for your patience." : "Дякуємо за ваше терпіння.",
- "You are accessing the server from an untrusted domain." : "Ви зайшли на сервер з ненадійного домену.",
+ "You are accessing the server from an untrusted domain." : "Ви намагаєтеся отримати доступ до сервера з непідтвердженого домену.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Будь ласка, зверніться до адміністратора. Якщо ви є адміністратором цього серверу, ви можете налаштувати опцію \"trusted_domain\" в конфігураційному файлі config/config.php. Приклад конфігурації знаходится в файлі config/config.sample.php.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Залежно від конфігурації Ви як адміністратор можете додати цей домен у список довірених, використовуйте кнопку нижче.",
- "Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений",
+ "Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений домен",
"%s will be updated to version %s." : "%s буде оновлено до версії %s.",
"The following apps will be disabled:" : "Наступні додатки будуть відключені:",
"The theme %s has been disabled." : "Тему %s було вимкнено.",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перш ніж продовжити, будь ласка, переконайтеся, що база даних, папка конфігурації і папка даних були дубльовані.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продовженням переконайтеся, що ви зробили резервну копію бази даних, каталогу конфігурації та каталогу з даними.",
"Start update" : "Почати оновлення",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Щоб уникнути великих таймаутів з більш тяжкими встановленнями, ви можете виконати наступну команду відносно директорії встановлення:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Щоб уникнути затримок у великих встановленнях, ви можете виконати наступну команду в каталозі встановлення:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Цей %s знаходиться в режимі технічного обслуговування, яке може зайняти деякий час.",
"This page will refresh itself when the %s instance is available again." : "Ця сторінка автоматично перезавантажиться коли екземпляр %s стане знову доступний."
},
"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/core/l10n/uk.json b/core/l10n/uk.json
index 256b95c0292..9e7dd287a39 100644
--- a/core/l10n/uk.json
+++ b/core/l10n/uk.json
@@ -6,11 +6,18 @@
"Checked database schema update" : "Перевірено оновлення схеми бази даних",
"Checked database schema update for apps" : "Перевірено оновлення схеми бази даних для додатків",
"Updated \"%s\" to %s" : "Оновлено \"%s\" до %s",
+ "Repair warning: " : "Попередження відновлення:",
+ "Repair error: " : "Помилка відновлення:",
+ "Following incompatible apps have been disabled: %s" : "Несумісні додатки були відключені: %s",
+ "Following 3rd party apps have been disabled: %s" : "3rd party додатки були відключені: %s",
+ "Invalid file provided" : "Невірний формат файлу",
"No image or file provided" : "Немає наданого зображення або файлу",
"Unknown filetype" : "Невідомий тип файлу",
"Invalid image" : "Невірне зображення",
"No temporary profile picture available, try again" : "Немає доступного тимчасового профілю для малюнків, спробуйте ще раз",
- "No crop data provided" : "Немає інформації щодо обрізки даних",
+ "No crop data provided" : "Не вказана інформація про кадрування",
+ "No valid crop data provided" : "Не вказані коректні дані про кадрування",
+ "Crop is not square" : "Кадр не є квадратом",
"Sunday" : "Неділя",
"Monday" : "Понеділок",
"Tuesday" : "Вівторок",
@@ -33,7 +40,7 @@
"Settings" : "Налаштування",
"Saving..." : "Зберігаю...",
"Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.",
- "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого пароль було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.",
+ "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого паролю було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.",
"Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваші файли зашифровані. Якщо ви не зробили ключ відновлення, після скидання паролю відновити ваші дані буде неможливо.<br /> Якщо ви не знаєте, що робити, будь ласка, зверніться до адміністратора перед продовженням.<br /> Ви дійсно хочете продовжити?",
"I know what I'm doing" : "Я знаю що роблю",
"Password can not be changed. Please contact your administrator." : "Пароль не може бути змінено. Будь ласка, зверніться до вашого адміністратора",
@@ -49,18 +56,24 @@
"New Files" : "Нових Файлів",
"Already existing files" : "Файли що вже існують",
"Which files do you want to keep?" : "Які файли ви хочете залишити?",
- "If you select both versions, the copied file will have a number added to its name." : "Якщо ви оберете обидві версії, скопійований файл буде мати номер, доданий у його ім'я.",
+ "If you select both versions, the copied file will have a number added to its name." : "При виборі обох версій, до назви копійованого файлу буде додана цифра",
"Cancel" : "Відмінити",
"Continue" : "Продовжити",
- "(all selected)" : "(все вибрано)",
- "({count} selected)" : "({count} вибрано)",
- "Error loading file exists template" : "Помилка при завантаженні файлу існуючого шаблону",
+ "(all selected)" : "(все обрано)",
+ "({count} selected)" : "({count} обраних)",
+ "Error loading file exists template" : "Помилка при завантаженні шаблону існуючого файлу",
"Very weak password" : "Дуже слабкий пароль",
"Weak password" : "Слабкий пароль",
"So-so password" : "Такий собі пароль",
"Good password" : "Добрий пароль",
"Strong password" : "Надійний пароль",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш веб-сервер ще не налаштований належним чином, щоб дозволити синхронізацію файлів, тому що інтерфейс WebDAV, здається, зіпсований.",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Цей сервер не має підключення до Інтернету. Це означає, що деякі з функцій, таких як зовнішнє сховище, повідомлення про оновлення та встановлення сторонніх додатків не будуть працювати. Доступ до файлів віддалено і відправки повідомлень поштою можуть не працювати. Ми пропонуємо включити підключення до Інтернету для цього сервера, якщо ви хочете, щоб всі функції працювали.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми настійно рекомендуємо вам налаштувати ваш веб сервер таким чином, що-б каталог даних не був більше доступний або перемістіть каталог даних за межі кореня веб сервера.",
"Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не збігається з \"{expected}\". Це потенційна проблема безпеки і ми рекомендуємо змінити ці налаштування.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP заголовок \"Strict-Transport-Security\" повинен бути налаштований принаймні на \"2,678,400\" секунд. Це потенційна проблема безпеки і ми рекомендуємо змінити ці налаштування.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Ви зайшли на цей сайт через HTTP. Ми настійно рекомендуємо налаштувати ваш сервер на використання HTTPS.",
"Shared" : "Опубліковано",
"Shared with {recipients}" : "Опубліковано для {recipients}",
"Share" : "Поділитися",
@@ -76,9 +89,9 @@
"Link" : "Посилання",
"Password protect" : "Захистити паролем",
"Password" : "Пароль",
- "Choose a password for the public link" : "Оберіть пароль для опублікованого посилання",
+ "Choose a password for the public link" : "Вкажіть пароль для публічного посилання",
"Allow editing" : "Дозволити редагування",
- "Email link to person" : "Ел. пошта належить Пану",
+ "Email link to person" : "Надіслати посилання по електронній пошті",
"Send" : "Надіслати",
"Set expiration date" : "Встановити термін дії",
"Expiration" : "Закінчення",
@@ -90,7 +103,7 @@
"Shared in {item} with {user}" : "Опубліковано {item} для {user}",
"Unshare" : "Закрити доступ",
"notify by email" : "повідомити по Email",
- "can share" : "можна поділитися",
+ "can share" : "може ділитися з іншими",
"can edit" : "може редагувати",
"access control" : "контроль доступу",
"create" : "створити",
@@ -112,7 +125,7 @@
"unknown text" : "невідомий текст",
"Hello world!" : "Привіт світ!",
"sunny" : "сонячно",
- "Hello {name}, the weather is {weather}" : "Привіт {name}, {weather} погода",
+ "Hello {name}, the weather is {weather}" : "Привіт {name}, погода {weather} ",
"Hello {name}" : "Привіт {name}",
"_download %n file_::_download %n files_" : ["завантяження %n файлу","завантаження %n файлів","завантаження %n файлів"],
"Updating {productName} to version {version}, this may take a while." : "Оновлення {productName} до версії {version}, це може займати деякий час.",
@@ -122,24 +135,26 @@
"Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним",
"Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.",
"Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.",
- "%s password reset" : "%s пароль скинуто",
+ "%s password reset" : "%s скидання паролю",
"Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}",
"New password" : "Новий пароль",
"New Password" : "Новий пароль",
"Reset password" : "Скинути пароль",
- "_{count} search result in other places_::_{count} search results in other places_" : ["","",""],
+ "Searching other places" : "Йде пошук в інших місцях",
+ "No search result in other places" : "В інших місцях нічого не знайдено",
+ "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат пошуку в інших місцях","{count} результатів пошуку в інших місцях","{count} результати пошуку в інших місцях"],
"Personal" : "Особисте",
"Users" : "Користувачі",
"Apps" : "Додатки",
"Admin" : "Адмін",
"Help" : "Допомога",
"Error loading tags" : "Помилка завантаження тегів.",
- "Tag already exists" : "Тег вже існує",
- "Error deleting tag(s)" : "Помилка видалення тегу(ів)",
- "Error tagging" : "Помилка встановлення тегів",
- "Error untagging" : "Помилка зняття тегів",
- "Error favoriting" : "Помилка позначення улюблених",
- "Error unfavoriting" : "Помилка зняття позначки улюблених",
+ "Tag already exists" : "Мітка вже існує",
+ "Error deleting tag(s)" : "Помилка видалення мітки(ок)",
+ "Error tagging" : "Помилка встановлення міток",
+ "Error untagging" : "Помилка зняття мітки",
+ "Error favoriting" : "Помилка додавання в обрані",
+ "Error unfavoriting" : "Помилка видалення з обраного",
"Access forbidden" : "Доступ заборонено",
"File not found" : "Файл не знайдено",
"The specified document has not been found on the server." : "Не вдалось знайти вказаний документ на сервері.",
@@ -149,11 +164,12 @@
"Cheers!" : "Будьмо!",
"Internal Server Error" : "Внутрішня помилка серверу",
"The server encountered an internal error and was unable to complete your request." : "На сервері сталася внутрішня помилка, тому він не зміг виконати ваш запит.",
- "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Будь ласка, зверніться до адміністратора сервера, якщо ця помилка з'являється кілька разів, будь ласка, вкажіть технічні подробиці нижче в звіті.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Будь ласка, зверніться до адміністратора сервера, якщо ця помилка з'являється кілька разів, будь ласка, вкажіть технічні подробиці у вашому звіті.",
"More details can be found in the server log." : "Більше деталей може бути в журналі серверу.",
"Technical details" : "Технічні деталі",
"Remote Address: %s" : "Віддалена Адреса: %s",
- "Request ID: %s" : "Запит ID: %s",
+ "Request ID: %s" : "ID запиту: %s",
+ "Type: %s" : "Тип: %s",
"Code: %s" : "Код: %s",
"Message: %s" : "Повідомлення: %s",
"File: %s" : "Файл: %s",
@@ -167,38 +183,44 @@
"Storage & database" : "Сховище і база даних",
"Data folder" : "Каталог даних",
"Configure the database" : "Налаштування бази даних",
- "Only %s is available." : "Тільки %s доступно.",
+ "Only %s is available." : "Доступно тільки %s.",
"Database user" : "Користувач бази даних",
"Database password" : "Пароль для бази даних",
"Database name" : "Назва бази даних",
"Database tablespace" : "Таблиця бази даних",
"Database host" : "Хост бази даних",
- "Finish setup" : "Завершити налаштування",
+ "Performance Warning" : "Попередження про продуктивність",
+ "SQLite will be used as database." : "В якості бази даних буде використана SQLite.",
+ "For larger installations we recommend to choose a different database backend." : "Для великих установок ми радимо вибрати іншу базу даних.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
+ "Finish setup" : "Завершити встановлення",
"Finishing …" : "Завершується ...",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Ця програма вимагає увімкнений JavaScript для коректної роботи. Будь ласка, {linkstart} Увімкніть JavaScript {linkend} та перезавантажте інтерфейс.",
"%s is available. Get more information on how to update." : "%s доступний. Отримай більше інформації про те, як оновити.",
"Log out" : "Вихід",
- "Search" : "Пошук",
- "Server side authentication failed!" : "Помилка аутентифікації на боці Сервера !",
+ "Search" : "Знайти",
+ "Server side authentication failed!" : "Невдала аутентифікація з сервером!",
"Please contact your administrator." : "Будь ласка, зверніться до вашого Адміністратора.",
"Forgot your password? Reset it!" : "Забули ваш пароль? Скиньте його!",
"remember" : "запам'ятати",
- "Log in" : "Вхід",
- "Alternative Logins" : "Альтернативні Логіни",
+ "Log in" : "Увійти",
+ "Alternative Logins" : "Альтернативні імена користувача",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Агов,<br><br>просто щоб ви знали, що %s поділився »%s« з вами.<br><a href=\"%s\">Подивіться!</a><br><br>",
- "This ownCloud instance is currently in single user mode." : "Цей екземпляр OwnCloud зараз працює в монопольному режимі одного користувача",
- "This means only administrators can use the instance." : "Це означає, що лише адміністратори можуть використовувати цей екземпляр.",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "Зверніться до системного адміністратора, якщо це повідомлення зберігається або з'являєтья несподівано.",
+ "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в даний час працює в однокористувацькому режимі.",
+ "This means only administrators can use the instance." : "Це означає, що тільки адміністратори можуть використовувати сервер.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Зверніться до вашого системного адміністратора якщо це повідомлення не зникає або з'являється несподівано.",
"Thank you for your patience." : "Дякуємо за ваше терпіння.",
- "You are accessing the server from an untrusted domain." : "Ви зайшли на сервер з ненадійного домену.",
+ "You are accessing the server from an untrusted domain." : "Ви намагаєтеся отримати доступ до сервера з непідтвердженого домену.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Будь ласка, зверніться до адміністратора. Якщо ви є адміністратором цього серверу, ви можете налаштувати опцію \"trusted_domain\" в конфігураційному файлі config/config.php. Приклад конфігурації знаходится в файлі config/config.sample.php.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Залежно від конфігурації Ви як адміністратор можете додати цей домен у список довірених, використовуйте кнопку нижче.",
- "Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений",
+ "Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений домен",
"%s will be updated to version %s." : "%s буде оновлено до версії %s.",
"The following apps will be disabled:" : "Наступні додатки будуть відключені:",
"The theme %s has been disabled." : "Тему %s було вимкнено.",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перш ніж продовжити, будь ласка, переконайтеся, що база даних, папка конфігурації і папка даних були дубльовані.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продовженням переконайтеся, що ви зробили резервну копію бази даних, каталогу конфігурації та каталогу з даними.",
"Start update" : "Почати оновлення",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Щоб уникнути великих таймаутів з більш тяжкими встановленнями, ви можете виконати наступну команду відносно директорії встановлення:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Щоб уникнути затримок у великих встановленнях, ви можете виконати наступну команду в каталозі встановлення:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Цей %s знаходиться в режимі технічного обслуговування, яке може зайняти деякий час.",
"This page will refresh itself when the %s instance is available again." : "Ця сторінка автоматично перезавантажиться коли екземпляр %s стане знову доступний."
},"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/core/search/css/results.css b/core/search/css/results.css
index 04f7b6dcb99..b62f7df3fe3 100644
--- a/core/search/css/results.css
+++ b/core/search/css/results.css
@@ -18,23 +18,23 @@
box-sizing: content-box;
}
-#searchresults #status {
+#searchresults .status {
background-color: rgba(255, 255, 255, .85);
height: 12px;
padding: 28px 0 28px 56px;
font-size: 18px;
}
-.has-favorites:not(.hidden) ~ #searchresults #status {
+.has-favorites:not(.hidden) ~ #searchresults .status {
padding-left: 102px;
}
-#searchresults #status.fixed {
+#searchresults .status.fixed {
position: fixed;
bottom: 0;
width: 100%;
z-index: 10;
}
-#searchresults #status .spinner {
+#searchresults .status .spinner {
height: 16px;
width: 16px;
vertical-align: middle;
diff --git a/core/search/js/search.js b/core/search/js/search.js
index c7feeacf42e..b49a4b8c6eb 100644
--- a/core/search/js/search.js
+++ b/core/search/js/search.js
@@ -125,6 +125,7 @@
//show spinner
$searchResults.removeClass('hidden');
+ $status.addClass('status');
$status.html(t('core', 'Searching other places')+'<img class="spinner" alt="search in progress" src="'+OC.webroot+'/core/img/loading.gif" />');
// do the actual search query
@@ -209,8 +210,12 @@
var count = $searchResults.find('tr.result').length;
$status.data('count', count);
if (count === 0) {
- $status.text(t('core', 'No search result in other places'));
+ $status.addClass('emptycontent').removeClass('status');
+ $status.html('');
+ $status.append('<div class="icon-search"></div>');
+ $status.append('<h2>' + t('core', 'No search result in other places') + '</h2>');
} else {
+ $status.removeClass('emptycontent').addClass('status');
$status.text(n('core', '{count} search result in other places', '{count} search results in other places', count, {count:count}));
}
}
@@ -383,4 +388,4 @@ OC.search.customResults = {};
/**
* @deprecated use get/setRenderer() instead
*/
-OC.search.resultTypes = {}; \ No newline at end of file
+OC.search.resultTypes = {};
diff --git a/core/shipped.json b/core/shipped.json
new file mode 100644
index 00000000000..15a2c6a1473
--- /dev/null
+++ b/core/shipped.json
@@ -0,0 +1,35 @@
+{
+ "core-version": "8.1.0.0",
+ "shippedApps": [
+ "activity",
+ "admin_audit",
+ "enterprise_key",
+ "external",
+ "files",
+ "files_antivirus",
+ "files_encryption",
+ "files_external",
+ "files_ldap_home",
+ "files_locking",
+ "files_pdfviewer",
+ "files_sharing",
+ "files_sharing_log",
+ "files_texteditor",
+ "files_trashbin",
+ "files_versions",
+ "files_videoviewer",
+ "firewall",
+ "firstrunwizard",
+ "gallery",
+ "objectstore",
+ "provisioning_api",
+ "sharepoint",
+ "templateeditor",
+ "updater",
+ "user_external",
+ "user_ldap",
+ "user_shibboleth",
+ "user_webdavauth",
+ "windows_network_drive"
+ ]
+}
diff --git a/core/templates/403.php b/core/templates/403.php
index 6e910fd2e82..a19009c3546 100644
--- a/core/templates/403.php
+++ b/core/templates/403.php
@@ -9,7 +9,7 @@ if(!isset($_)) {//also provide standalone error page
?>
<ul>
<li class='error'>
- <?php p($l->t( 'Access forbidden' )); ?><br/>
+ <?php p($l->t( 'Access forbidden' )); ?><br>
<p class='hint'><?php if(isset($_['file'])) p($_['file'])?></p>
</li>
</ul>
diff --git a/core/templates/404.php b/core/templates/404.php
index 90912844ef9..c8d16e3e8f7 100644
--- a/core/templates/404.php
+++ b/core/templates/404.php
@@ -14,7 +14,7 @@ if(!isset($_)) {//also provide standalone error page
<?php else: ?>
<ul>
<li class="error">
- <?php p($l->t('File not found')); ?><br/>
+ <?php p($l->t('File not found')); ?><br>
<p class="hint"><?php p($l->t('The specified document has not been found on the server.')); ?></p>
<p class="hint"><a href="<?php p(OC_Helper::linkTo('', 'index.php')) ?>"><?php p($l->t('You can click here to return to %s.', array($theme->getName()))); ?></a></p>
</li>
diff --git a/core/templates/error.php b/core/templates/error.php
index 030fbf07fcb..6e044b72414 100644
--- a/core/templates/error.php
+++ b/core/templates/error.php
@@ -1,7 +1,7 @@
<ul class="error-wide">
<?php foreach($_["errors"] as $error):?>
<li class='error'>
- <?php p($error['error']) ?><br/>
+ <?php p($error['error']) ?><br>
<?php if(isset($error['hint']) && $error['hint']): ?>
<p class='hint'><?php print_unescaped($error['hint']) ?></p>
<?php endif;?>
diff --git a/core/templates/exception.php b/core/templates/exception.php
index e5b57e2645e..899ea29456c 100644
--- a/core/templates/exception.php
+++ b/core/templates/exception.php
@@ -9,13 +9,14 @@ style('core', ['styles', 'header']);
<p><?php p($l->t('The server encountered an internal error and was unable to complete your request.')) ?></p>
<p><?php p($l->t('Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.')) ?></p>
<p><?php p($l->t('More details can be found in the server log.')) ?></p>
- <br />
+ <br>
<h2><strong><?php p($l->t('Technical details')) ?></strong></h2>
<ul>
<li><?php p($l->t('Remote Address: %s', $_['remoteAddr'])) ?></li>
<li><?php p($l->t('Request ID: %s', $_['requestID'])) ?></li>
<?php if($_['debugMode']): ?>
+ <li><?php p($l->t('Type: %s', $_['errorClass'])) ?></li>
<li><?php p($l->t('Code: %s', $_['errorCode'])) ?></li>
<li><?php p($l->t('Message: %s', $_['errorMsg'])) ?></li>
<li><?php p($l->t('File: %s', $_['file'])) ?></li>
diff --git a/core/templates/installation.php b/core/templates/installation.php
index f8311fed009..96e6119cad3 100644
--- a/core/templates/installation.php
+++ b/core/templates/installation.php
@@ -10,7 +10,7 @@ script('core', [
<input type='hidden' id='hasOracle' value='<?php p($_['hasOracle']) ?>'>
<input type='hidden' id='hasMSSQL' value='<?php p($_['hasMSSQL']) ?>'>
<form action="index.php" method="post">
-<input type="hidden" name="install" value="true" />
+<input type="hidden" name="install" value="true">
<?php if(count($_['errors']) > 0): ?>
<fieldset class="warning">
<legend><strong><?php p($l->t('Error'));?></strong></legend>
@@ -42,18 +42,18 @@ script('core', [
<input type="text" name="adminlogin" id="adminlogin"
placeholder="<?php p($l->t( 'Username' )); ?>"
value="<?php p($_['adminlogin']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" autofocus required />
+ autocomplete="off" autocapitalize="off" autocorrect="off" autofocus required>
<label for="adminlogin" class="infield"><?php p($l->t( 'Username' )); ?></label>
- <img class="svg" src="<?php p(image_path('', 'actions/user.svg')); ?>" alt="" />
+ <img class="svg" src="<?php p(image_path('', 'actions/user.svg')); ?>" alt="">
</p>
<p class="groupbottom">
<input type="password" name="adminpass" data-typetoggle="#show" id="adminpass"
placeholder="<?php p($l->t( 'Password' )); ?>"
value="<?php p($_['adminpass']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" required />
+ autocomplete="off" autocapitalize="off" autocorrect="off" required>
<label for="adminpass" class="infield"><?php p($l->t( 'Password' )); ?></label>
- <img class="svg" id="adminpass-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt="" />
- <input type="checkbox" id="show" name="show" />
+ <img class="svg" id="adminpass-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt="">
+ <input type="checkbox" id="show" name="show">
<label for="show"></label>
<div class="strengthify-wrapper"></div>
</p>
@@ -72,7 +72,7 @@ script('core', [
<input type="text" name="directory" id="directory"
placeholder="<?php p(OC::$SERVERROOT.'/data'); ?>"
value="<?php p($_['directory']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" />
+ autocomplete="off" autocapitalize="off" autocorrect="off">
</div>
</fieldset>
<?php endif; ?>
@@ -86,7 +86,7 @@ script('core', [
<?php foreach($_['databases'] as $type => $label): ?>
<?php if(count($_['databases']) === 1): ?>
<p class="info"><?php p($l->t( 'Only %s is available.', array($label) )); ?>.</p>
- <input type="hidden" id="dbtype" name="dbtype" value="<?php p($type) ?>" />
+ <input type="hidden" id="dbtype" name="dbtype" value="<?php p($type) ?>">
<?php else: ?>
<input type="radio" name="dbtype" value="<?php p($type) ?>" id="<?php p($type) ?>"
<?php print_unescaped($_['dbtype'] === $type ? 'checked="checked" ' : '') ?>/>
@@ -104,15 +104,15 @@ script('core', [
<input type="text" name="dbuser" id="dbuser"
placeholder="<?php p($l->t( 'Database user' )); ?>"
value="<?php p($_['dbuser']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" />
+ autocomplete="off" autocapitalize="off" autocorrect="off">
</p>
<p class="groupmiddle">
<input type="password" name="dbpass" id="dbpass" data-typetoggle="#dbpassword"
placeholder="<?php p($l->t( 'Database password' )); ?>"
value="<?php p($_['dbpass']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" />
+ autocomplete="off" autocapitalize="off" autocorrect="off">
<label for="dbpass" class="infield"><?php p($l->t( 'Database password' )); ?></label>
- <input type="checkbox" id="dbpassword" name="dbpassword" />
+ <input type="checkbox" id="dbpassword" name="dbpassword">
<label for="dbpassword"></label>
</p>
<p class="groupmiddle">
@@ -121,7 +121,7 @@ script('core', [
placeholder="<?php p($l->t( 'Database name' )); ?>"
value="<?php p($_['dbname']); ?>"
autocomplete="off" autocapitalize="off" autocorrect="off"
- pattern="[0-9a-zA-Z$_-]+" />
+ pattern="[0-9a-zA-Z$_-]+">
</p>
<?php if($_['hasOracle']): ?>
<div id="use_oracle_db">
@@ -130,7 +130,7 @@ script('core', [
<input type="text" name="dbtablespace" id="dbtablespace"
placeholder="<?php p($l->t( 'Database tablespace' )); ?>"
value="<?php p($_['dbtablespace']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" />
+ autocomplete="off" autocapitalize="off" autocorrect="off">
</p>
</div>
<?php endif; ?>
@@ -139,7 +139,7 @@ script('core', [
<input type="text" name="dbhost" id="dbhost"
placeholder="<?php p($l->t( 'Database host' )); ?>"
value="<?php p($_['dbhost']); ?>"
- autocomplete="off" autocapitalize="off" autocorrect="off" />
+ autocomplete="off" autocapitalize="off" autocorrect="off">
</p>
</div>
</fieldset>
@@ -157,5 +157,5 @@ script('core', [
</fieldset>
<?php endif ?>
- <div class="buttons"><input type="submit" class="primary" value="<?php p($l->t( 'Finish setup' )); ?>" data-finishing="<?php p($l->t( 'Finishing …' )); ?>" /></div>
+ <div class="buttons"><input type="submit" class="primary" value="<?php p($l->t( 'Finish setup' )); ?>" data-finishing="<?php p($l->t( 'Finishing …' )); ?>"></div>
</form>
diff --git a/core/templates/layout.base.php b/core/templates/layout.base.php
index 7069c0c2634..a5336b1585a 100644
--- a/core/templates/layout.base.php
+++ b/core/templates/layout.base.php
@@ -1,25 +1,21 @@
<!DOCTYPE html>
-<!--[if lt IE 7]><html class="ng-csp ie ie6 lte9 lte8 lte7" data-placeholder-focus="false" lang="<?php p($_['language']); ?>"><![endif]-->
-<!--[if IE 7]><html class="ng-csp ie ie7 lte9 lte8 lte7" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if IE 8]><html class="ng-csp ie ie8 lte9 lte8" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
+<!--[if lte IE 8]><html class="ng-csp ie ie8 lte9 lte8" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
<!--[if IE 9]><html class="ng-csp ie ie9 lte9" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if gt IE 9]><html class="ng-csp ie" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if !IE]><!--><html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><!--<![endif]-->
-
+<!--[if (gt IE 9)|!(IE)]><!--><html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><!--<![endif]-->
<head data-requesttoken="<?php p($_['requesttoken']); ?>">
+ <meta charset="utf-8">
<title>
<?php p($theme->getTitle()); ?>
</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
- <link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path('', 'favicon.png')); ?>" />
- <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>" />
+ <link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path('', 'favicon.png')); ?>">
+ <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>">
<?php foreach ($_['cssfiles'] as $cssfile): ?>
- <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" type="text/css" media="screen" />
+ <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="screen">
<?php endforeach; ?>
<?php foreach ($_['jsfiles'] as $jsfile): ?>
- <script type="text/javascript" src="<?php print_unescaped($jsfile); ?>"></script>
+ <script src="<?php print_unescaped($jsfile); ?>"></script>
<?php endforeach; ?>
<?php print_unescaped($_['headers']); ?>
</head>
diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php
index 8deda443d98..0557e89ce71 100644
--- a/core/templates/layout.guest.php
+++ b/core/templates/layout.guest.php
@@ -1,35 +1,31 @@
<!DOCTYPE html>
-<!--[if lt IE 7]><html class="ng-csp ie ie6 lte9 lte8 lte7" data-placeholder-focus="false" lang="<?php p($_['language']); ?>"><![endif]-->
-<!--[if IE 7]><html class="ng-csp ie ie7 lte9 lte8 lte7" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if IE 8]><html class="ng-csp ie ie8 lte9 lte8" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
+<!--[if lte IE 8]><html class="ng-csp ie ie8 lte9 lte8" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
<!--[if IE 9]><html class="ng-csp ie ie9 lte9" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if gt IE 9]><html class="ng-csp ie" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if !IE]><!--><html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><!--<![endif]-->
-
+<!--[if (gt IE 9)|!(IE)]><!--><html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><!--<![endif]-->
<head data-requesttoken="<?php p($_['requesttoken']); ?>">
+ <meta charset="utf-8">
<title>
<?php p($theme->getTitle()); ?>
</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-itunes-app" content="app-id=<?php p($theme->getiTunesAppId()); ?>">
- <link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path('', 'favicon.png')); ?>" />
- <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>" />
+ <link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path('', 'favicon.png')); ?>">
+ <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>">
<?php foreach($_['cssfiles'] as $cssfile): ?>
- <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" type="text/css" media="screen" />
+ <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="screen">
<?php endforeach; ?>
<?php foreach($_['jsfiles'] as $jsfile): ?>
- <script type="text/javascript" src="<?php print_unescaped($jsfile); ?>"></script>
+ <script src="<?php print_unescaped($jsfile); ?>"></script>
<?php endforeach; ?>
<?php print_unescaped($_['headers']); ?>
</head>
<body id="<?php p($_['bodyid']);?>">
<?php include('layout.noscript.warning.php'); ?>
- <div class="wrapper"><!-- for sticky footer -->
- <div class="v-align"><!-- vertically centred box -->
+ <div class="wrapper">
+ <div class="v-align">
<?php if ($_['bodyid'] === 'body-login' ): ?>
- <header>
+ <header role="banner">
<div id="header">
<div class="logo svg">
<h1 class="hidden-visually">
@@ -44,8 +40,7 @@
<div class="push"></div><!-- for sticky footer -->
</div>
</div>
-
- <footer>
+ <footer role="contentinfo">
<p class="info">
<?php print_unescaped($theme->getLongFooter()); ?>
</p>
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 7ae4b2e3df7..138545f2ccc 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -1,33 +1,29 @@
<!DOCTYPE html>
-<!--[if lt IE 7]><html class="ng-csp ie ie6 lte9 lte8 lte7" data-placeholder-focus="false" lang="<?php p($_['language']); ?>"><![endif]-->
-<!--[if IE 7]><html class="ng-csp ie ie7 lte9 lte8 lte7" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if IE 8]><html class="ng-csp ie ie8 lte9 lte8" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
+<!--[if lte IE 8]><html class="ng-csp ie ie8 lte9 lte8" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
<!--[if IE 9]><html class="ng-csp ie ie9 lte9" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if gt IE 9]><html class="ng-csp ie" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><![endif]-->
-<!--[if !IE]><!--><html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><!--<![endif]-->
-
+<!--[if (gt IE 9)|!(IE)]><!--><html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" ><!--<![endif]-->
<head data-user="<?php p($_['user_uid']); ?>" data-requesttoken="<?php p($_['requesttoken']); ?>">
+ <meta charset="utf-8">
<title>
<?php
p(!empty($_['application'])?$_['application'].' - ':'');
p($theme->getTitle());
?>
</title>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-itunes-app" content="app-id=<?php p($theme->getiTunesAppId()); ?>">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="<?php p((!empty($_['application']) && $_['appid']!='files')? $_['application']:'ownCloud'); ?>">
<meta name="mobile-web-app-capable" content="yes">
- <link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path($_['appid'], 'favicon.png')); ?>" />
- <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path($_['appid'], 'favicon-touch.png')); ?>" />
+ <link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path($_['appid'], 'favicon.png')); ?>">
+ <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path($_['appid'], 'favicon-touch.png')); ?>">
<?php foreach($_['cssfiles'] as $cssfile): ?>
- <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" type="text/css" media="screen" />
+ <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="screen">
<?php endforeach; ?>
<?php foreach($_['jsfiles'] as $jsfile): ?>
- <script type="text/javascript" src="<?php print_unescaped($jsfile); ?>"></script>
+ <script src="<?php print_unescaped($jsfile); ?>"></script>
<?php endforeach; ?>
<?php print_unescaped($_['headers']); ?>
</head>
@@ -39,7 +35,7 @@
<div id="update-notification" style="display: inline;"><a href="<?php print_unescaped($_['updateLink']); ?>"><?php p($l->t('%s is available. Get more information on how to update.', array($_['updateVersion']))); ?></a></div>
<?php endif; ?>
</div>
- <header><div id="header">
+ <header role="banner"><div id="header">
<a href="<?php print_unescaped(link_to('', 'index.php')); ?>"
title="" id="owncloud" tabindex="-1">
<div class="logo-icon svg">
@@ -69,12 +65,12 @@
<div class="avatardiv<?php if ($_['userAvatarSet']) { print_unescaped(' avatardiv-shown"'); } else { print_unescaped('" style="display: none"'); } ?>>
<?php if ($_['userAvatarSet']): ?>
<img src="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', ['userId' => $_['user_uid'], 'size' => 32]));?>?requesttoken=<?php p(urlencode($_['requesttoken'])); ?>"
- alt="" />
+ alt="">
<?php endif; ?>
</div>
<?php endif; ?>
<span id="expandDisplayName"><?php p(trim($_['user_displayname']) != '' ? $_['user_displayname'] : $_['user_uid']) ?></span>
- <img class="svg" alt="" src="<?php print_unescaped(image_path('', 'actions/caret.svg')); ?>" />
+ <img class="svg" alt="" src="<?php print_unescaped(image_path('', 'actions/caret.svg')); ?>">
</div>
<div id="expanddiv">
<ul>
@@ -89,7 +85,7 @@
<?php endforeach; ?>
<li>
<a id="logout" <?php print_unescaped(OC_User::getLogoutAttribute()); ?>>
- <img class="svg" alt="" src="<?php print_unescaped(image_path('', 'actions/logout.svg')); ?>" />
+ <img class="svg" alt="" src="<?php print_unescaped(image_path('', 'actions/logout.svg')); ?>">
<?php p($l->t('Log out'));?>
</a>
</li>
@@ -97,24 +93,24 @@
</div>
</div>
- <form class="searchbox" action="#" method="post">
+ <form class="searchbox" action="#" method="post" role="search">
<label for="searchbox" class="hidden-visually">
<?php p($l->t('Search'));?>
</label>
<input id="searchbox" class="svg" type="search" name="query"
value="<?php if(isset($_POST['query'])) {p($_POST['query']);};?>"
- autocomplete="off" tabindex="3" />
+ autocomplete="off" tabindex="3">
</form>
</div></header>
- <nav><div id="navigation">
+ <nav role="navigation"><div id="navigation">
<div id="apps" class="svg">
<ul>
<?php foreach($_['navigation'] as $entry): ?>
<li data-id="<?php p($entry['id']); ?>">
<a href="<?php print_unescaped($entry['href']); ?>" title=""
<?php if( $entry['active'] ): ?> class="active"<?php endif; ?>>
- <img class="app-icon svg" alt="" src="<?php print_unescaped($entry['icon']); ?>"/>
+ <img class="app-icon svg" alt="" src="<?php print_unescaped($entry['icon']); ?>">
<div class="icon-loading-dark" style="display:none;"></div>
<span>
<?php p($entry['name']); ?>
@@ -122,13 +118,14 @@
</a>
</li>
<?php endforeach; ?>
-
- <!-- show "More apps" link to app administration directly in app navigation, as last entry -->
- <?php if(OC_User::isAdminUser(OC_User::getUser())): ?>
+ <?php
+ /* show "More apps" link to app administration directly in app navigation, as last entry */
+ if(OC_User::isAdminUser(OC_User::getUser())):
+ ?>
<li id="apps-management">
<a href="<?php print_unescaped(OC_Helper::linkToRoute('settings_apps')); ?>" title=""
<?php if( $_['appsmanagement_active'] ): ?> class="active"<?php endif; ?>>
- <img class="app-icon svg" alt="" src="<?php print_unescaped(OC_Helper::imagePath('settings', 'apps.svg')); ?>"/>
+ <img class="app-icon svg" alt="" src="<?php print_unescaped(OC_Helper::imagePath('settings', 'apps.svg')); ?>">
<div class="icon-loading-dark" style="display:none;"></div>
<span>
<?php p($l->t('Apps')); ?>
@@ -142,7 +139,7 @@
</div></nav>
<div id="content-wrapper">
- <div id="content" class="app-<?php p($_['appid']) ?>">
+ <div id="content" class="app-<?php p($_['appid']) ?>" role="main">
<?php print_unescaped($_['content']); ?>
</div>
</div>
diff --git a/core/templates/login.php b/core/templates/login.php
index f10a8102180..0ef7882d4b0 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -11,7 +11,7 @@ script('core', [
<form method="post" name="login">
<fieldset>
<?php if (!empty($_['redirect_url'])) {
- print_unescaped('<input type="hidden" name="redirect_url" value="' . OC_Util::sanitizeHTML($_['redirect_url']) . '" />');
+ print_unescaped('<input type="hidden" name="redirect_url" value="' . OC_Util::sanitizeHTML($_['redirect_url']) . '">');
} ?>
<?php if (isset($_['apacheauthfailed']) && ($_['apacheauthfailed'])): ?>
<div class="warning">
@@ -26,7 +26,7 @@ script('core', [
<?php endforeach; ?>
<p id="message" class="hidden">
<img class="float-spinner" alt=""
- src="<?php p(\OCP\Util::imagePath('core', 'loading-dark.gif'));?>" />
+ src="<?php p(\OCP\Util::imagePath('core', 'loading-dark.gif'));?>">
<span id="messageText"></span>
<!-- the following div ensures that the spinner is always inside the #message div -->
<div style="clear: both;"></div>
@@ -36,7 +36,7 @@ script('core', [
placeholder="<?php p($l->t('Username')); ?>"
value="<?php p($_['username']); ?>"
<?php p($_['user_autofocus'] ? 'autofocus' : ''); ?>
- autocomplete="on" autocapitalize="off" autocorrect="off" required />
+ autocomplete="on" autocapitalize="off" autocorrect="off" required>
<label for="user" class="infield"><?php p($l->t('Username')); ?></label>
<img class="svg" src="<?php print_unescaped(image_path('', 'actions/user.svg')); ?>" alt=""/>
</p>
@@ -45,7 +45,7 @@ script('core', [
<input type="password" name="password" id="password" value=""
placeholder="<?php p($l->t('Password')); ?>"
<?php p($_['user_autofocus'] ? '' : 'autofocus'); ?>
- autocomplete="on" autocapitalize="off" autocorrect="off" required />
+ autocomplete="on" autocapitalize="off" autocorrect="off" required>
<label for="password" class="infield"><?php p($l->t('Password')); ?></label>
<img class="svg" id="password-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt=""/>
</p>
@@ -56,12 +56,12 @@ script('core', [
</a>
<?php endif; ?>
<?php if ($_['rememberLoginAllowed'] === true) : ?>
- <input type="checkbox" name="remember_login" value="1" id="remember_login" />
+ <input type="checkbox" name="remember_login" value="1" id="remember_login">
<label for="remember_login"><?php p($l->t('remember')); ?></label>
<?php endif; ?>
<input type="hidden" name="timezone-offset" id="timezone-offset"/>
<input type="hidden" name="timezone" id="timezone"/>
- <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" />
+ <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>">
<input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>" disabled="disabled"/>
</fieldset>
</form>
diff --git a/core/templates/message.html b/core/templates/message.html
index cd642231a9e..a98fd31a7fe 100644
--- a/core/templates/message.html
+++ b/core/templates/message.html
@@ -1,3 +1,3 @@
-<div id="{dialog_name}" title="{title} "><!-- the ' ' after {title} fixes ie8, see http://stackoverflow.com/a/5313137/828717 -->
+<div id="{dialog_name}" title="{title} "><?php /* the ' ' after {title} fixes ie8, see http://stackoverflow.com/a/5313137/828717 */ ?>
<p><span class="ui-icon ui-icon-{type}"></span>{message}</p>
</div>
diff --git a/core/templates/singleuser.user.php b/core/templates/singleuser.user.php
index a5f56f6e2c4..bf076eb8d61 100644
--- a/core/templates/singleuser.user.php
+++ b/core/templates/singleuser.user.php
@@ -1,10 +1,10 @@
<ul>
<li class='update'>
- <?php p($l->t('This ownCloud instance is currently in single user mode.')) ?><br /><br />
- <?php p($l->t('This means only administrators can use the instance.')) ?><br /><br />
+ <?php p($l->t('This ownCloud instance is currently in single user mode.')) ?><br><br>
+ <?php p($l->t('This means only administrators can use the instance.')) ?><br><br>
<?php p($l->t('Contact your system administrator if this message persists or appeared unexpectedly.')) ?>
- <br /><br />
- <?php p($l->t('Thank you for your patience.')); ?><br /><br />
+ <br><br>
+ <?php p($l->t('Thank you for your patience.')); ?><br><br>
<a class="button" <?php print_unescaped(OC_User::getLogoutAttribute()); ?>><?php p($l->t('Log out')); ?></a>
</li>
</ul>
diff --git a/core/templates/tags.html b/core/templates/tags.html
index ae3d072b381..a7125027a26 100644
--- a/core/templates/tags.html
+++ b/core/templates/tags.html
@@ -2,13 +2,13 @@
<div class="content">
<div class="scrollarea">
<ul class="taglist">
- <li><input type="checkbox" name="ids[]" id="tag_{id}" value="{name}" />
+ <li><input type="checkbox" name="ids[]" id="tag_{id}" value="{name}">
<label for="tag_{id}">{name}</label>
</li>
</ul>
</div>
<div class="bottombuttons">
- <input type="text" class="addinput" name="tag" placeholder="{addText}" />
+ <input type="text" class="addinput" name="tag" placeholder="{addText}">
</div>
</div>
</div>
diff --git a/core/templates/untrustedDomain.php b/core/templates/untrustedDomain.php
index b661834318d..3197916cebb 100644
--- a/core/templates/untrustedDomain.php
+++ b/core/templates/untrustedDomain.php
@@ -2,13 +2,13 @@
<ul class="error-wide">
<li class='error'>
- <?php p($l->t('You are accessing the server from an untrusted domain.')); ?><br/>
+ <?php p($l->t('You are accessing the server from an untrusted domain.')); ?><br>
<p class='hint'>
<?php p($l->t('Please contact your administrator. If you are an administrator of this instance, configure the "trusted_domain" setting in config/config.php. An example configuration is provided in config/config.sample.php.')); ?>
- <br/>
+ <br>
<?php p($l->t('Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain.')); ?>
- <br/><br/>
+ <br><br>
<p style="text-align:center;">
<a href="<?php print_unescaped(OC_Helper::makeURLAbsolute(\OCP\Util::linkToRoute('settings_admin'))); ?>?trustDomain=<?php p($_['domain']); ?>" class="button">
<?php p($l->t('Add "%s" as trusted domain', array($_['domain']))); ?>
diff --git a/core/templates/update.user.php b/core/templates/update.user.php
index be332f24f35..bc6936188ea 100644
--- a/core/templates/update.user.php
+++ b/core/templates/update.user.php
@@ -1,8 +1,8 @@
<ul>
<li class='update'>
- <?php p($l->t('This %s instance is currently in maintenance mode, which may take a while.', array($theme->getName()))) ?><br/><br/>
- <?php p($l->t('This page will refresh itself when the %s instance is available again.', array($theme->getName()))) ?><br/><br/>
- <?php p($l->t('Contact your system administrator if this message persists or appeared unexpectedly.')) ?><br/><br/>
- <?php p($l->t('Thank you for your patience.')); ?><br/><br/>
+ <?php p($l->t('This %s instance is currently in maintenance mode, which may take a while.', array($theme->getName()))) ?><br><br>
+ <?php p($l->t('This page will refresh itself when the %s instance is available again.', array($theme->getName()))) ?><br><br>
+ <?php p($l->t('Contact your system administrator if this message persists or appeared unexpectedly.')) ?><br><br>
+ <?php p($l->t('Thank you for your patience.')); ?><br><br>
</li>
</ul>
diff --git a/lib/base.php b/lib/base.php
index 107ae059bb1..da4b3a47c75 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -80,6 +80,10 @@ class OC {
*/
public static $server = null;
+ /**
+ * @throws \RuntimeException when the 3rdparty directory is missing or
+ * the app path list is empty or contains an invalid path
+ */
public static function initPaths() {
// calculate the root directories
OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
@@ -155,10 +159,9 @@ class OC {
}
}
if (empty(OC::$THIRDPARTYROOT) || !file_exists(OC::$THIRDPARTYROOT)) {
- echo('3rdparty directory not found! Please put the ownCloud 3rdparty'
+ throw new \RuntimeException('3rdparty directory not found! Please put the ownCloud 3rdparty'
. ' folder in the ownCloud folder or the folder above.'
. ' You can also configure the location in the config.php file.');
- return;
}
// search the apps folder
@@ -182,12 +185,17 @@ class OC {
}
if (empty(OC::$APPSROOTS)) {
- throw new Exception('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
+ throw new \RuntimeException('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
. ' or the folder above. You can also configure the location in the config.php file.');
}
$paths = array();
foreach (OC::$APPSROOTS as $path) {
$paths[] = $path['path'];
+ if (!is_dir($path['path'])) {
+ throw new \RuntimeException(sprintf('App directory "%s" not found! Please put the ownCloud apps folder in the'
+ . ' ownCloud folder or the folder above. You can also configure the location in the'
+ . ' config.php file.', $path['path']));
+ }
}
// set the right include path
@@ -407,6 +415,7 @@ class OC {
}
// if session cant be started break with http 500 error
} catch (Exception $e) {
+ \OCP\Util::logException('base', $e);
//show the user a detailed error page
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
OC_Template::printExceptionErrorPage($e);
@@ -465,17 +474,20 @@ class OC {
self::$CLI = (php_sapi_name() == 'cli');
- self::initPaths();
-
- // setup 3rdparty autoloader
- $vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php';
- if (file_exists($vendorAutoLoad)) {
+ try {
+ self::initPaths();
+ // setup 3rdparty autoloader
+ $vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php';
+ if (!file_exists($vendorAutoLoad)) {
+ throw new \RuntimeException('Composer autoloader not found, unable to continue. Check the folder "3rdparty".');
+ }
require_once $vendorAutoLoad;
- } else {
+
+ } catch (\RuntimeException $e) {
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
// we can't use the template error page here, because this needs the
// DI container which isn't available yet
- print('Composer autoloader not found, unable to continue. Check the folder "3rdparty".');
+ print($e->getMessage());
exit();
}
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index 327c44bb63b..95ca9b9e121 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "4-bytové znaky nejsou podporovány ve jménech souborů",
"File name is a reserved word" : "Jméno souboru je rezervované slovo",
"File name contains at least one invalid character" : "Jméno souboru obsahuje nejméně jeden neplatný znak",
+ "File name is too long" : "Jméno souboru je moc dlouhé",
"App directory already exists" : "Adresář aplikace již existuje",
"Can't create app folder. Please fix permissions. %s" : "Nelze vytvořit složku aplikace. Opravte práva souborů. %s",
"No source specified when installing app" : "Nebyl zadán zdroj při instalaci aplikace",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Nastavení práv pro %s selhalo, protože položka nebyla nalezena",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nelze nastavit datum vypršení platnosti. Sdílení nemůže vypršet později než za %s po zveřejnění",
"Cannot set expiration date. Expiration date is in the past" : "Nelze nastavit datum vypršení platnosti. Datum vypršení je v minulosti",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Nelze smazat datum vypršení platnosti. Sdílená data vyžadují datum vypršení platnosti odkazu.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Úložiště pro sdílení %s musí implementovat rozhraní OCP\\Share_Backend",
"Sharing backend %s not found" : "Úložiště sdílení %s nenalezeno",
"Sharing backend for %s not found" : "Úložiště sdílení pro %s nenalezeno",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index f821284c58f..1c7650dbfa6 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "4-bytové znaky nejsou podporovány ve jménech souborů",
"File name is a reserved word" : "Jméno souboru je rezervované slovo",
"File name contains at least one invalid character" : "Jméno souboru obsahuje nejméně jeden neplatný znak",
+ "File name is too long" : "Jméno souboru je moc dlouhé",
"App directory already exists" : "Adresář aplikace již existuje",
"Can't create app folder. Please fix permissions. %s" : "Nelze vytvořit složku aplikace. Opravte práva souborů. %s",
"No source specified when installing app" : "Nebyl zadán zdroj při instalaci aplikace",
@@ -98,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Nastavení práv pro %s selhalo, protože položka nebyla nalezena",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nelze nastavit datum vypršení platnosti. Sdílení nemůže vypršet později než za %s po zveřejnění",
"Cannot set expiration date. Expiration date is in the past" : "Nelze nastavit datum vypršení platnosti. Datum vypršení je v minulosti",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Nelze smazat datum vypršení platnosti. Sdílená data vyžadují datum vypršení platnosti odkazu.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Úložiště pro sdílení %s musí implementovat rozhraní OCP\\Share_Backend",
"Sharing backend %s not found" : "Úložiště sdílení %s nenalezeno",
"Sharing backend for %s not found" : "Úložiště sdílení pro %s nenalezeno",
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index d7572bcec0d..17e67fdeb76 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -42,6 +42,8 @@ OC.L10N.register(
"Dot files are not allowed" : "Filer med punktummer er ikke tilladt",
"4-byte characters are not supported in file names" : "Tegn med 4-byte understøttes ikke i filnavne",
"File name is a reserved word" : "Filnavnet er et reserveret ord",
+ "File name contains at least one invalid character" : "Filnavnet indeholder mindst ét ugyldigt tegn",
+ "File name is too long" : "Filnavnet er for langt",
"App directory already exists" : "App-mappe findes allerede",
"Can't create app folder. Please fix permissions. %s" : "Kan ikke oprette app-mappe. Ret tilladelser. %s",
"No source specified when installing app" : "Ingen kilde angivet under installation af app",
@@ -99,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Angivelse af tilladelser for %s mislykkedes, fordi artiklen ikke blev fundet",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan ikke angive udløbsdato. Delinger kan ikke udløbe senere end %s efter at de er blevet delt",
"Cannot set expiration date. Expiration date is in the past" : "Kan ikke angive udløbsdato. Udløbsdato er allerede passeret",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ikke rydde udløbsdatoen. Det er et krav til delinger, at de har en udløbsdato.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delingsbackend'en %s skal implementere grænsefladen OCP\\Share_Backend",
"Sharing backend %s not found" : "Delingsbackend'en %s blev ikke fundet",
"Sharing backend for %s not found" : "Delingsbackend'en for %s blev ikke fundet",
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index 9bd03e3e92b..c7b0bb9296d 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -40,6 +40,8 @@
"Dot files are not allowed" : "Filer med punktummer er ikke tilladt",
"4-byte characters are not supported in file names" : "Tegn med 4-byte understøttes ikke i filnavne",
"File name is a reserved word" : "Filnavnet er et reserveret ord",
+ "File name contains at least one invalid character" : "Filnavnet indeholder mindst ét ugyldigt tegn",
+ "File name is too long" : "Filnavnet er for langt",
"App directory already exists" : "App-mappe findes allerede",
"Can't create app folder. Please fix permissions. %s" : "Kan ikke oprette app-mappe. Ret tilladelser. %s",
"No source specified when installing app" : "Ingen kilde angivet under installation af app",
@@ -97,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Angivelse af tilladelser for %s mislykkedes, fordi artiklen ikke blev fundet",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan ikke angive udløbsdato. Delinger kan ikke udløbe senere end %s efter at de er blevet delt",
"Cannot set expiration date. Expiration date is in the past" : "Kan ikke angive udløbsdato. Udløbsdato er allerede passeret",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ikke rydde udløbsdatoen. Det er et krav til delinger, at de har en udløbsdato.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delingsbackend'en %s skal implementere grænsefladen OCP\\Share_Backend",
"Sharing backend %s not found" : "Delingsbackend'en %s blev ikke fundet",
"Sharing backend for %s not found" : "Delingsbackend'en for %s blev ikke fundet",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index 8234fc14d1f..fc71d1fb6d5 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "4-Byte Zeichen sind in Dateinamen nicht erlaubt",
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
+ "File name is too long" : "Dateiname ist zu lang",
"App directory already exists" : "Das Applikationsverzeichnis existiert bereits",
"Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s",
"No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 47a35645186..f10d3578fb3 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "4-Byte Zeichen sind in Dateinamen nicht erlaubt",
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
+ "File name is too long" : "Dateiname ist zu lang",
"App directory already exists" : "Das Applikationsverzeichnis existiert bereits",
"Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s",
"No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index 8d5887b37ef..823fde2d789 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "4-Byte-Zeichen werden in Dateinamen nicht unterstützt",
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
+ "File name is too long" : "Dateiname ist zu lang",
"App directory already exists" : "Der Ordner für die App ist bereits vorhanden.",
"Can't create app folder. Please fix permissions. %s" : "Der Ordner für die App konnte nicht angelegt werden. Bitte überprüfen Sie die Ordner- und Dateirechte und passen Sie diese entsprechend an. %s",
"No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index f9f9165f9b9..42b6d72303e 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "4-Byte-Zeichen werden in Dateinamen nicht unterstützt",
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
+ "File name is too long" : "Dateiname ist zu lang",
"App directory already exists" : "Der Ordner für die App ist bereits vorhanden.",
"Can't create app folder. Please fix permissions. %s" : "Der Ordner für die App konnte nicht angelegt werden. Bitte überprüfen Sie die Ordner- und Dateirechte und passen Sie diese entsprechend an. %s",
"No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 8a71a222a7d..783cd8d6e3b 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : " No están permitidos caractéres de 4-bytes",
"File name is a reserved word" : "El nombre de archivo es una palabra reservada",
"File name contains at least one invalid character" : "El nombre del archivo contiene al menos un carácter inválido",
+ "File name is too long" : "El nombre del archivo es demasiado largo",
"App directory already exists" : "El directorio de la aplicación ya existe",
"Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s",
"No source specified when installing app" : "No se ha especificado origen cuando se ha instalado la aplicación",
@@ -98,8 +99,9 @@ OC.L10N.register(
"Share type %s is not valid for %s" : "Compartir tipo %s no es válido para %s",
"Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "La configuración de permisos para %s ha fallado, ya que los permisos superan los permisos dados a %s",
"Setting permissions for %s failed, because the item was not found" : "La configuración de permisos para %s ha fallado, ya que no se encontró el elemento ",
- "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "No se puede fijar fecha de caducidad. Los archivos compartidos no pueden caducar luego de %s de ser compartidos",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "No se puede fijar fecha de caducidad. Los archivos compartidos no pueden caducar más tarde de %s de ser compartidos",
"Cannot set expiration date. Expiration date is in the past" : "No se puede fijar la fecha de caducidad. La fecha de caducidad está en el pasado.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "No se puede eliminar la fecha de caducidad. Los archivos compartidos deben tener una fecha de caducidad.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartido %s debe implementar la interfaz OCP\\Share_Backend",
"Sharing backend %s not found" : "El motor compartido %s no se ha encontrado",
"Sharing backend for %s not found" : "Motor compartido para %s no encontrado",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index cdb5a99a543..3b5f6ea2f39 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : " No están permitidos caractéres de 4-bytes",
"File name is a reserved word" : "El nombre de archivo es una palabra reservada",
"File name contains at least one invalid character" : "El nombre del archivo contiene al menos un carácter inválido",
+ "File name is too long" : "El nombre del archivo es demasiado largo",
"App directory already exists" : "El directorio de la aplicación ya existe",
"Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s",
"No source specified when installing app" : "No se ha especificado origen cuando se ha instalado la aplicación",
@@ -96,8 +97,9 @@
"Share type %s is not valid for %s" : "Compartir tipo %s no es válido para %s",
"Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "La configuración de permisos para %s ha fallado, ya que los permisos superan los permisos dados a %s",
"Setting permissions for %s failed, because the item was not found" : "La configuración de permisos para %s ha fallado, ya que no se encontró el elemento ",
- "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "No se puede fijar fecha de caducidad. Los archivos compartidos no pueden caducar luego de %s de ser compartidos",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "No se puede fijar fecha de caducidad. Los archivos compartidos no pueden caducar más tarde de %s de ser compartidos",
"Cannot set expiration date. Expiration date is in the past" : "No se puede fijar la fecha de caducidad. La fecha de caducidad está en el pasado.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "No se puede eliminar la fecha de caducidad. Los archivos compartidos deben tener una fecha de caducidad.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartido %s debe implementar la interfaz OCP\\Share_Backend",
"Sharing backend %s not found" : "El motor compartido %s no se ha encontrado",
"Sharing backend for %s not found" : "Motor compartido para %s no encontrado",
diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js
index dbc8ba97129..9f688ba8075 100644
--- a/lib/l10n/fi_FI.js
+++ b/lib/l10n/fi_FI.js
@@ -40,6 +40,7 @@ OC.L10N.register(
"Empty filename is not allowed" : "Tiedostonimi ei voi olla tyhjä",
"Dot files are not allowed" : "Pistetiedostot eivät ole sallittuja",
"File name contains at least one invalid character" : "Tiedoston nimi sisältää ainakin yhden virheellisen merkin",
+ "File name is too long" : "Tiedoston nimi on liian pitkä",
"App directory already exists" : "Sovelluskansio on jo olemassa",
"Can't create app folder. Please fix permissions. %s" : "Sovelluskansion luominen ei onnistu. Korjaa käyttöoikeudet. %s",
"No source specified when installing app" : "Lähdettä ei määritelty sovellusta asennettaessa",
diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json
index fef6a8625c6..1ecab62af28 100644
--- a/lib/l10n/fi_FI.json
+++ b/lib/l10n/fi_FI.json
@@ -38,6 +38,7 @@
"Empty filename is not allowed" : "Tiedostonimi ei voi olla tyhjä",
"Dot files are not allowed" : "Pistetiedostot eivät ole sallittuja",
"File name contains at least one invalid character" : "Tiedoston nimi sisältää ainakin yhden virheellisen merkin",
+ "File name is too long" : "Tiedoston nimi on liian pitkä",
"App directory already exists" : "Sovelluskansio on jo olemassa",
"Can't create app folder. Please fix permissions. %s" : "Sovelluskansion luominen ei onnistu. Korjaa käyttöoikeudet. %s",
"No source specified when installing app" : "Lähdettä ei määritelty sovellusta asennettaessa",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index ecbdeeae339..9591b8671f4 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "Les caractères sur 4 octets ne sont pas pris en charge dans les noms de fichiers",
"File name is a reserved word" : "Ce nom de fichier est un mot réservé",
"File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
+ "File name is too long" : "Nom de fichier trop long",
"App directory already exists" : "Le dossier de l'application existe déjà",
"Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s",
"No source specified when installing app" : "Aucune source spécifiée pour installer l'application",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Le réglage des permissions pour %s a échoué car l'objet n'a pas été trouvé",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Impossible de configurer la date d'expiration. Un partage ne peut expirer plus de %s après sa création",
"Cannot set expiration date. Expiration date is in the past" : "Impossible de configurer la date d'expiration : elle est dans le passé.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Impossible de supprimer la date d'expiration. Les partages doivent avoir une date d'expiration.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Le service de partage %s doit implémenter l'interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Service de partage %s non trouvé",
"Sharing backend for %s not found" : "Le service de partage pour %s est introuvable",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index cc5a917940e..612a0dec8f7 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "Les caractères sur 4 octets ne sont pas pris en charge dans les noms de fichiers",
"File name is a reserved word" : "Ce nom de fichier est un mot réservé",
"File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
+ "File name is too long" : "Nom de fichier trop long",
"App directory already exists" : "Le dossier de l'application existe déjà",
"Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s",
"No source specified when installing app" : "Aucune source spécifiée pour installer l'application",
@@ -98,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Le réglage des permissions pour %s a échoué car l'objet n'a pas été trouvé",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Impossible de configurer la date d'expiration. Un partage ne peut expirer plus de %s après sa création",
"Cannot set expiration date. Expiration date is in the past" : "Impossible de configurer la date d'expiration : elle est dans le passé.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Impossible de supprimer la date d'expiration. Les partages doivent avoir une date d'expiration.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Le service de partage %s doit implémenter l'interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Service de partage %s non trouvé",
"Sharing backend for %s not found" : "Le service de partage pour %s est introuvable",
diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js
index 1b4b622fdda..ee6b5f19687 100644
--- a/lib/l10n/gl.js
+++ b/lib/l10n/gl.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "Non se admiten os caracteres de 4 bytes nos nomes de ficheiro",
"File name is a reserved word" : "O nome de ficheiro é unha palabra reservada",
"File name contains at least one invalid character" : "O nome de ficheiro contén algún carácter incorrecto",
+ "File name is too long" : "O nome de ficheiro é longo de máis",
"App directory already exists" : "Xa existe o directorio da aplicación",
"Can't create app folder. Please fix permissions. %s" : "Non é posíbel crear o cartafol de aplicacións. Corrixa os permisos. %s",
"No source specified when installing app" : "Non foi especificada ningunha orixe ao instalar a aplicación",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Non é posíbel estabelecer permisos para %s, non se atopa o elemento",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Non é posíbel estabelecer a data de caducidade. As comparticións non poden caducar máis aló de %s após de seren compartidas",
"Cannot set expiration date. Expiration date is in the past" : "Non é posíbel estabelecer a data de caducidade. A data de caducidade está no pasado.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Non é posíbel limpar a data de caducidade. É necesaria algunha compartición para ter unha data de caducidade.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "A infraestrutura de compartición %s ten que implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Non se atopou a infraestrutura de compartición %s",
"Sharing backend for %s not found" : "Non se atopou a infraestrutura de compartición para %s",
diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json
index 0e98c0606fa..ccdba66446c 100644
--- a/lib/l10n/gl.json
+++ b/lib/l10n/gl.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "Non se admiten os caracteres de 4 bytes nos nomes de ficheiro",
"File name is a reserved word" : "O nome de ficheiro é unha palabra reservada",
"File name contains at least one invalid character" : "O nome de ficheiro contén algún carácter incorrecto",
+ "File name is too long" : "O nome de ficheiro é longo de máis",
"App directory already exists" : "Xa existe o directorio da aplicación",
"Can't create app folder. Please fix permissions. %s" : "Non é posíbel crear o cartafol de aplicacións. Corrixa os permisos. %s",
"No source specified when installing app" : "Non foi especificada ningunha orixe ao instalar a aplicación",
@@ -98,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Non é posíbel estabelecer permisos para %s, non se atopa o elemento",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Non é posíbel estabelecer a data de caducidade. As comparticións non poden caducar máis aló de %s após de seren compartidas",
"Cannot set expiration date. Expiration date is in the past" : "Non é posíbel estabelecer a data de caducidade. A data de caducidade está no pasado.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Non é posíbel limpar a data de caducidade. É necesaria algunha compartición para ter unha data de caducidade.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "A infraestrutura de compartición %s ten que implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Non se atopou a infraestrutura de compartición %s",
"Sharing backend for %s not found" : "Non se atopou a infraestrutura de compartición para %s",
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index e1af5c17e61..4a2deab9b51 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "I caratteri di 4 byte non sono supportati nei nomi dei file",
"File name is a reserved word" : "Il nome del file è una parola riservata",
"File name contains at least one invalid character" : "Il nome del file contiene almeno un carattere non valido",
+ "File name is too long" : "Il nome del file è troppo lungo",
"App directory already exists" : "La cartella dell'applicazione esiste già",
"Can't create app folder. Please fix permissions. %s" : "Impossibile creare la cartella dell'applicazione. Correggi i permessi. %s",
"No source specified when installing app" : "Nessuna fonte specificata durante l'installazione dell'applicazione",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Impostazione permessi per %s non riuscita, poiché l'elemento non è stato trovato",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Impossibile impostare la data di scadenza. Le condivisioni non possono scadere più tardi di %s dalla loro attivazione",
"Cannot set expiration date. Expiration date is in the past" : "Impossibile impostare la data di scadenza. La data di scadenza è nel passato.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Impossibile cancellare la data di scadenza. Le condivisioni devono avere una data di scadenza.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Il motore di condivisione %s deve implementare l'interfaccia OCP\\Share_Backend",
"Sharing backend %s not found" : "Motore di condivisione %s non trovato",
"Sharing backend for %s not found" : "Motore di condivisione di %s non trovato",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 22b6bd40bb8..07e20706e3e 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "I caratteri di 4 byte non sono supportati nei nomi dei file",
"File name is a reserved word" : "Il nome del file è una parola riservata",
"File name contains at least one invalid character" : "Il nome del file contiene almeno un carattere non valido",
+ "File name is too long" : "Il nome del file è troppo lungo",
"App directory already exists" : "La cartella dell'applicazione esiste già",
"Can't create app folder. Please fix permissions. %s" : "Impossibile creare la cartella dell'applicazione. Correggi i permessi. %s",
"No source specified when installing app" : "Nessuna fonte specificata durante l'installazione dell'applicazione",
@@ -98,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Impostazione permessi per %s non riuscita, poiché l'elemento non è stato trovato",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Impossibile impostare la data di scadenza. Le condivisioni non possono scadere più tardi di %s dalla loro attivazione",
"Cannot set expiration date. Expiration date is in the past" : "Impossibile impostare la data di scadenza. La data di scadenza è nel passato.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Impossibile cancellare la data di scadenza. Le condivisioni devono avere una data di scadenza.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Il motore di condivisione %s deve implementare l'interfaccia OCP\\Share_Backend",
"Sharing backend %s not found" : "Motore di condivisione %s non trovato",
"Sharing backend for %s not found" : "Motore di condivisione di %s non trovato",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index dc30767863f..ff781afc8d0 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -36,6 +36,12 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["%n 分前"],
"seconds ago" : "数秒前",
"web services under your control" : "あなたの管理下のウェブサービス",
+ "Empty filename is not allowed" : "空のファイル名は許可されていません",
+ "Dot files are not allowed" : "ドットファイルは許可されていません",
+ "4-byte characters are not supported in file names" : "ファイル名に4バイト文字を使用するのはサポートされていません",
+ "File name is a reserved word" : "ファイル名が予約された単語です",
+ "File name contains at least one invalid character" : "ファイル名に1文字以上の無効な文字が含まれています",
+ "File name is too long" : "ファイル名が長すぎます",
"App directory already exists" : "アプリディレクトリはすでに存在します",
"Can't create app folder. Please fix permissions. %s" : "アプリフォルダーを作成できませんでした。%s のパーミッションを修正してください。",
"No source specified when installing app" : "アプリインストール時のソースが未指定",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index 5e16fe42010..f9dc5322c0c 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -34,6 +34,12 @@
"_%n minute ago_::_%n minutes ago_" : ["%n 分前"],
"seconds ago" : "数秒前",
"web services under your control" : "あなたの管理下のウェブサービス",
+ "Empty filename is not allowed" : "空のファイル名は許可されていません",
+ "Dot files are not allowed" : "ドットファイルは許可されていません",
+ "4-byte characters are not supported in file names" : "ファイル名に4バイト文字を使用するのはサポートされていません",
+ "File name is a reserved word" : "ファイル名が予約された単語です",
+ "File name contains at least one invalid character" : "ファイル名に1文字以上の無効な文字が含まれています",
+ "File name is too long" : "ファイル名が長すぎます",
"App directory already exists" : "アプリディレクトリはすでに存在します",
"Can't create app folder. Please fix permissions. %s" : "アプリフォルダーを作成できませんでした。%s のパーミッションを修正してください。",
"No source specified when installing app" : "アプリインストール時のソースが未指定",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index 67dea9f0f83..32fd1933487 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "4-byte tekens in bestandsnamen worden niet ondersteund",
"File name is a reserved word" : "Bestandsnaam is een gereserveerd woord",
"File name contains at least one invalid character" : "De bestandsnaam bevat ten minste één verboden teken",
+ "File name is too long" : "De bestandsnaam is te lang",
"App directory already exists" : "App directory bestaat al",
"Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s",
"No source specified when installing app" : "Geen bron opgegeven bij installatie van de app",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Instellen van de permissies voor %s is mislukt, omdat het object niet is gevonden",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kon vervaldatum niet instellen. Shares kunnen niet langer dan %s vervallen na het moment van delen",
"Cannot set expiration date. Expiration date is in the past" : "Kon vervaldatum niet instellen. De vervaldatum ligt in het verleden",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kon vervaldatum niet weghalen. Shares moeten een vervaldatum hebben.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Het share-backend %s moet de OCP\\Share_Backend interface implementeren",
"Sharing backend %s not found" : "Het share-backend %s is niet gevonden",
"Sharing backend for %s not found" : "Het share-backend voor %s is niet gevonden",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 35961c075d3..380c3da46c7 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "4-byte tekens in bestandsnamen worden niet ondersteund",
"File name is a reserved word" : "Bestandsnaam is een gereserveerd woord",
"File name contains at least one invalid character" : "De bestandsnaam bevat ten minste één verboden teken",
+ "File name is too long" : "De bestandsnaam is te lang",
"App directory already exists" : "App directory bestaat al",
"Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s",
"No source specified when installing app" : "Geen bron opgegeven bij installatie van de app",
@@ -98,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Instellen van de permissies voor %s is mislukt, omdat het object niet is gevonden",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kon vervaldatum niet instellen. Shares kunnen niet langer dan %s vervallen na het moment van delen",
"Cannot set expiration date. Expiration date is in the past" : "Kon vervaldatum niet instellen. De vervaldatum ligt in het verleden",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kon vervaldatum niet weghalen. Shares moeten een vervaldatum hebben.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Het share-backend %s moet de OCP\\Share_Backend interface implementeren",
"Sharing backend %s not found" : "Het share-backend %s is niet gevonden",
"Sharing backend for %s not found" : "Het share-backend voor %s is niet gevonden",
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index 4042179b895..0be4d823a0d 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -8,9 +8,15 @@ OC.L10N.register(
"Sample configuration detected" : "Wykryto przykładową konfigurację",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Wykryto skopiowanie przykładowej konfiguracji. To może popsuć Twoją instalację i nie jest wspierane. Proszę przeczytać dokumentację przed dokonywaniem zmian w config.php",
"PHP %s or higher is required." : "PHP %s lub wyższe jest wymagane.",
+ "PHP with a version lower than %s is required." : "Wersja PHP jest niższa niż %s, która jest wymagana.",
"Following databases are supported: %s" : "Obsługiwane są następujące bazy danych: %s",
+ "The command line tool %s could not be found" : "Narzędzie konsoli %s nie zostało znalezione",
"The library %s is not available." : "Biblioteka %s nie jest dostępna.",
+ "Library %s with a version higher than %s is required - available version %s." : "Biblioteka %s w wersji wyższej niż %s, która jest wymagana - dostępna wersja %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Biblioteka w wersji %s jest niższa niż %s, która jest wymagana - dostępna wersja %s.",
"Following platforms are supported: %s" : "Obsługiwane są następujące platformy: %s",
+ "ownCloud %s or higher is required." : "ownCloud %s jest w wersji wyższej niż wymagana.",
+ "ownCloud with a version lower than %s is required." : "ownCloud jest w wersji niższej niż wymagana wersja %s",
"Help" : "Pomoc",
"Personal" : "Osobiste",
"Users" : "Użytkownicy",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index 548cb703097..12de24755d6 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -6,9 +6,15 @@
"Sample configuration detected" : "Wykryto przykładową konfigurację",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Wykryto skopiowanie przykładowej konfiguracji. To może popsuć Twoją instalację i nie jest wspierane. Proszę przeczytać dokumentację przed dokonywaniem zmian w config.php",
"PHP %s or higher is required." : "PHP %s lub wyższe jest wymagane.",
+ "PHP with a version lower than %s is required." : "Wersja PHP jest niższa niż %s, która jest wymagana.",
"Following databases are supported: %s" : "Obsługiwane są następujące bazy danych: %s",
+ "The command line tool %s could not be found" : "Narzędzie konsoli %s nie zostało znalezione",
"The library %s is not available." : "Biblioteka %s nie jest dostępna.",
+ "Library %s with a version higher than %s is required - available version %s." : "Biblioteka %s w wersji wyższej niż %s, która jest wymagana - dostępna wersja %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Biblioteka w wersji %s jest niższa niż %s, która jest wymagana - dostępna wersja %s.",
"Following platforms are supported: %s" : "Obsługiwane są następujące platformy: %s",
+ "ownCloud %s or higher is required." : "ownCloud %s jest w wersji wyższej niż wymagana.",
+ "ownCloud with a version lower than %s is required." : "ownCloud jest w wersji niższej niż wymagana wersja %s",
"Help" : "Pomoc",
"Personal" : "Osobiste",
"Users" : "Użytkownicy",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 456189f3cc6..07d1eb39fbf 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -42,6 +42,8 @@ OC.L10N.register(
"Dot files are not allowed" : "Dot arquivos não são permitidos",
"4-byte characters are not supported in file names" : "Caracteres de 4-bytes não são suportados em nomes de arquivos",
"File name is a reserved word" : "O nome do arquivo é uma palavra reservada",
+ "File name contains at least one invalid character" : "O nome do arquivo contém pelo menos um caractere inválido",
+ "File name is too long" : "O nome do arquivo é muito longo",
"App directory already exists" : "Diretório App já existe",
"Can't create app folder. Please fix permissions. %s" : "Não é possível criar pasta app. Corrija as permissões. %s",
"No source specified when installing app" : "Nenhuma fonte foi especificada enquanto instalava o aplicativo",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 7915a8f715a..8b356bd88fc 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -40,6 +40,8 @@
"Dot files are not allowed" : "Dot arquivos não são permitidos",
"4-byte characters are not supported in file names" : "Caracteres de 4-bytes não são suportados em nomes de arquivos",
"File name is a reserved word" : "O nome do arquivo é uma palavra reservada",
+ "File name contains at least one invalid character" : "O nome do arquivo contém pelo menos um caractere inválido",
+ "File name is too long" : "O nome do arquivo é muito longo",
"App directory already exists" : "Diretório App já existe",
"Can't create app folder. Please fix permissions. %s" : "Não é possível criar pasta app. Corrija as permissões. %s",
"No source specified when installing app" : "Nenhuma fonte foi especificada enquanto instalava o aplicativo",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index f9e78265ece..6b8f05413f3 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "Carateres 4-byte não são suportados como nome de ficheiros",
"File name is a reserved word" : "Nome de ficheiro é uma palavra reservada",
"File name contains at least one invalid character" : "Nome de ficheiro contém pelo menos um caráter inválido",
+ "File name is too long" : "Nome do ficheiro demasiado longo",
"App directory already exists" : "A directoria da aplicação já existe",
"Can't create app folder. Please fix permissions. %s" : "Não foi possível criar a pasta da aplicação. Por favor verifique as permissões. %s",
"No source specified when installing app" : "Não foi especificada uma fonte de instalação desta aplicação",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Definir permissões para %s falhou, porque o item não foi encontrado",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não é possível definir data de expiração. As partilhas não podem expirar mais de %s depois de terem sido partilhadas",
"Cannot set expiration date. Expiration date is in the past" : "Não é possivel definir data de expiração. A data de expiração está no passado",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível limpar a data de expiração. As partilhas devem ter uma data de expiração.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Ao partilhar a interface %s deve implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Não foi encontrada a partilha da interface %s",
"Sharing backend for %s not found" : "Não foi encontrada a partilha da interface para %s",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index 8e9f37f4589..d171e3585c6 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "Carateres 4-byte não são suportados como nome de ficheiros",
"File name is a reserved word" : "Nome de ficheiro é uma palavra reservada",
"File name contains at least one invalid character" : "Nome de ficheiro contém pelo menos um caráter inválido",
+ "File name is too long" : "Nome do ficheiro demasiado longo",
"App directory already exists" : "A directoria da aplicação já existe",
"Can't create app folder. Please fix permissions. %s" : "Não foi possível criar a pasta da aplicação. Por favor verifique as permissões. %s",
"No source specified when installing app" : "Não foi especificada uma fonte de instalação desta aplicação",
@@ -98,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Definir permissões para %s falhou, porque o item não foi encontrado",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não é possível definir data de expiração. As partilhas não podem expirar mais de %s depois de terem sido partilhadas",
"Cannot set expiration date. Expiration date is in the past" : "Não é possivel definir data de expiração. A data de expiração está no passado",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível limpar a data de expiração. As partilhas devem ter uma data de expiração.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Ao partilhar a interface %s deve implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Não foi encontrada a partilha da interface %s",
"Sharing backend for %s not found" : "Não foi encontrada a partilha da interface para %s",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 74a2feaffcb..82ab53bdf03 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "4-х байтовые символы в имени файлов не допускаются",
"File name is a reserved word" : "Имя файла является зарезервированным словом",
"File name contains at least one invalid character" : "Имя файла содержит по крайней мере один некорректный символ",
+ "File name is too long" : "Имя файла слишком длинное.",
"App directory already exists" : "Каталог приложения уже существует",
"Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог. Исправьте права доступа. %s",
"No source specified when installing app" : "Не указан источник при установке приложения",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index b11ff4d72f9..8bf4786e7f6 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -41,6 +41,7 @@
"4-byte characters are not supported in file names" : "4-х байтовые символы в имени файлов не допускаются",
"File name is a reserved word" : "Имя файла является зарезервированным словом",
"File name contains at least one invalid character" : "Имя файла содержит по крайней мере один некорректный символ",
+ "File name is too long" : "Имя файла слишком длинное.",
"App directory already exists" : "Каталог приложения уже существует",
"Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог. Исправьте права доступа. %s",
"No source specified when installing app" : "Не указан источник при установке приложения",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index f46c88770ac..b28071912f7 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -1,11 +1,21 @@
OC.L10N.register(
"lib",
{
+ "See %s" : "Погледајте %s",
+ "PHP %s or higher is required." : "Потребан је ПХП %s или новији.",
+ "PHP with a version lower than %s is required." : "Потребан је ПХП старији од %s.",
+ "Following databases are supported: %s" : "Следеће базе података су подржане: %s",
+ "The library %s is not available." : "Библиотека %s није доступна.",
+ "Following platforms are supported: %s" : "Следеће платформе су подржане: %s",
+ "ownCloud %s or higher is required." : "Оунклауд %s или новији је потребан.",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
"Admin" : "Администратор",
"Recommended" : "Препоручено",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Апликација „%s“ не може бити инсталирана јер није компатибилна са овим издањем Оунклауда.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Апликација „%s“ не може бити инсталирана јер следеће зависности нису испуњене: %s",
+ "No app name specified" : "Није наведен назив апликације",
"Unknown filetype" : "Непознат тип фајла",
"Invalid image" : "Неисправна слика",
"today" : "данас",
@@ -14,20 +24,44 @@ OC.L10N.register(
"last month" : "прошлог месеца",
"_%n month ago_::_%n months ago_" : ["пре %n месец","пре %n месеца","пре %n месеци"],
"last year" : "прошле године",
- "_%n year ago_::_%n years ago_" : ["","",""],
- "_%n hour ago_::_%n hours ago_" : ["","",""],
- "_%n minute ago_::_%n minutes ago_" : ["","",""],
+ "_%n year ago_::_%n years ago_" : ["пре %n годину","пре %n године","пре %n година"],
+ "_%n hour ago_::_%n hours ago_" : ["пре %n сат","пре %n сата","пре %n сати"],
+ "_%n minute ago_::_%n minutes ago_" : ["пре %n минут","пре %n минута","пре %n минута"],
"seconds ago" : "пре неколико секунди",
"web services under your control" : "веб сервиси под вашом контролом",
+ "Empty filename is not allowed" : "Празан назив није дозвољен",
+ "Dot files are not allowed" : "Фајлови са почетном тачком нису дозвољени",
+ "4-byte characters are not supported in file names" : "4-бајтни знакови нису подржани у називу фајлова",
+ "File name is a reserved word" : "Назив фајла је резервисана реч",
+ "File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
+ "File name is too long" : "Назив фајла је предугачак",
+ "App directory already exists" : "Директоријум апликација већ постоји",
+ "Archives of type %s are not supported" : "%s архиве нису подржане",
"Application is not enabled" : "Апликација није укључена",
"Authentication error" : "Грешка аутентификације",
"Token expired. Please reload page." : "Жетон је истекао. Поново учитајте страницу.",
+ "Unknown user" : "Непознат корисник",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Мек ОС Икс није подржан и %s неће радити исправно на овој платформи. Користите га на сопствени ризик!",
"For the best results, please consider using a GNU/Linux server instead." : "За најбоље резултате, размотрите употребу ГНУ/Линукс сервера.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Изгледа да %s ради у 32-битном ПХП окружењу а open_basedir је подешен у php.ini фајлу. То може довести до проблема са фајловима већим од 4 GB те стога није препоручљиво.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Уклоните open_basedir поставку из php.ini фајла или пређите на 64-битни ПХП.",
+ "Set an admin username." : "Поставите име за администратора.",
+ "Set an admin password." : "Поставите лозинку за администратора.",
+ "%s shared »%s« with you" : "%s подели „%s“ са вама",
+ "You are not allowed to share %s" : "Није вам дозвољено да делите %s",
"Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“",
"A valid username must be provided" : "Морате унети исправно корисничко име",
- "A valid password must be provided" : "Морате унети исправну лозинку"
+ "A valid password must be provided" : "Морате унети исправну лозинку",
+ "The username is already being used" : "Корисничко име се већ користи",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Нема драјвера базе података (скулајт, мајскул или постгрескул).",
+ "Setting locale to %s failed" : "Постављање локалитета на %s није успело",
+ "Please install one of these locales on your system and restart your webserver." : "Инсталирајте неки од ових локалитета на ваш систем и поново покрените веб сервер.",
+ "Please ask your server administrator to install the module." : "Замолите администратора вашег сервера да инсталира тај модул.",
+ "PHP module %s not installed." : "ПХП модул %s није инсталиран.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "ПХП поставка „%s“ није постављена на „%s“.",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
+ "PostgreSQL >= 9 required" : "Захтеван је ПостгреСкул >= 9"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index fcae89b69fd..e4cc7d27608 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -1,9 +1,19 @@
{ "translations": {
+ "See %s" : "Погледајте %s",
+ "PHP %s or higher is required." : "Потребан је ПХП %s или новији.",
+ "PHP with a version lower than %s is required." : "Потребан је ПХП старији од %s.",
+ "Following databases are supported: %s" : "Следеће базе података су подржане: %s",
+ "The library %s is not available." : "Библиотека %s није доступна.",
+ "Following platforms are supported: %s" : "Следеће платформе су подржане: %s",
+ "ownCloud %s or higher is required." : "Оунклауд %s или новији је потребан.",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
"Admin" : "Администратор",
"Recommended" : "Препоручено",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Апликација „%s“ не може бити инсталирана јер није компатибилна са овим издањем Оунклауда.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Апликација „%s“ не може бити инсталирана јер следеће зависности нису испуњене: %s",
+ "No app name specified" : "Није наведен назив апликације",
"Unknown filetype" : "Непознат тип фајла",
"Invalid image" : "Неисправна слика",
"today" : "данас",
@@ -12,20 +22,44 @@
"last month" : "прошлог месеца",
"_%n month ago_::_%n months ago_" : ["пре %n месец","пре %n месеца","пре %n месеци"],
"last year" : "прошле године",
- "_%n year ago_::_%n years ago_" : ["","",""],
- "_%n hour ago_::_%n hours ago_" : ["","",""],
- "_%n minute ago_::_%n minutes ago_" : ["","",""],
+ "_%n year ago_::_%n years ago_" : ["пре %n годину","пре %n године","пре %n година"],
+ "_%n hour ago_::_%n hours ago_" : ["пре %n сат","пре %n сата","пре %n сати"],
+ "_%n minute ago_::_%n minutes ago_" : ["пре %n минут","пре %n минута","пре %n минута"],
"seconds ago" : "пре неколико секунди",
"web services under your control" : "веб сервиси под вашом контролом",
+ "Empty filename is not allowed" : "Празан назив није дозвољен",
+ "Dot files are not allowed" : "Фајлови са почетном тачком нису дозвољени",
+ "4-byte characters are not supported in file names" : "4-бајтни знакови нису подржани у називу фајлова",
+ "File name is a reserved word" : "Назив фајла је резервисана реч",
+ "File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
+ "File name is too long" : "Назив фајла је предугачак",
+ "App directory already exists" : "Директоријум апликација већ постоји",
+ "Archives of type %s are not supported" : "%s архиве нису подржане",
"Application is not enabled" : "Апликација није укључена",
"Authentication error" : "Грешка аутентификације",
"Token expired. Please reload page." : "Жетон је истекао. Поново учитајте страницу.",
+ "Unknown user" : "Непознат корисник",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Мек ОС Икс није подржан и %s неће радити исправно на овој платформи. Користите га на сопствени ризик!",
"For the best results, please consider using a GNU/Linux server instead." : "За најбоље резултате, размотрите употребу ГНУ/Линукс сервера.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Изгледа да %s ради у 32-битном ПХП окружењу а open_basedir је подешен у php.ini фајлу. То може довести до проблема са фајловима већим од 4 GB те стога није препоручљиво.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Уклоните open_basedir поставку из php.ini фајла или пређите на 64-битни ПХП.",
+ "Set an admin username." : "Поставите име за администратора.",
+ "Set an admin password." : "Поставите лозинку за администратора.",
+ "%s shared »%s« with you" : "%s подели „%s“ са вама",
+ "You are not allowed to share %s" : "Није вам дозвољено да делите %s",
"Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“",
"A valid username must be provided" : "Морате унети исправно корисничко име",
- "A valid password must be provided" : "Морате унети исправну лозинку"
+ "A valid password must be provided" : "Морате унети исправну лозинку",
+ "The username is already being used" : "Корисничко име се већ користи",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Нема драјвера базе података (скулајт, мајскул или постгрескул).",
+ "Setting locale to %s failed" : "Постављање локалитета на %s није успело",
+ "Please install one of these locales on your system and restart your webserver." : "Инсталирајте неки од ових локалитета на ваш систем и поново покрените веб сервер.",
+ "Please ask your server administrator to install the module." : "Замолите администратора вашег сервера да инсталира тај модул.",
+ "PHP module %s not installed." : "ПХП модул %s није инсталиран.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "ПХП поставка „%s“ није постављена на „%s“.",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
+ "PostgreSQL >= 9 required" : "Захтеван је ПостгреСкул >= 9"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index f4e48570d54..a54c5f49057 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -22,7 +22,7 @@ OC.L10N.register(
"Users" : "Kullanıcılar",
"Admin" : "Yönetici",
"Recommended" : "Önerilen",
- "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "ownCloud yazılımının bu sürümü ile uyumlu olmadığı için \"%s\" uygulaması kurulamaz.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "ownCloud yazılımının bu sürümü ile uyumlu olmadığı için \"%s\" uygulaması kurulamaz.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "\"%s\" uygulaması, şu bağımlılıklar sağlanmadığı için yüklenemiyor: %s",
"No app name specified" : "Uygulama adı belirtilmedi",
"Unknown filetype" : "Bilinmeyen dosya türü",
@@ -40,6 +40,10 @@ OC.L10N.register(
"web services under your control" : "denetiminizdeki web hizmetleri",
"Empty filename is not allowed" : "Boş dasya adına izin verilmiyor",
"Dot files are not allowed" : "Nokta dosyalarına izin verilmiyor",
+ "4-byte characters are not supported in file names" : "4 bayt karakterler dosya adlarında desteklenmez",
+ "File name is a reserved word" : "Bu dosya adı özel bir kullanıma aittir",
+ "File name contains at least one invalid character" : "Dosya adı en az bir geçersiz karakter içeriyor",
+ "File name is too long" : "Dosya adı çok uzun",
"App directory already exists" : "Uygulama dizini zaten mevcut",
"Can't create app folder. Please fix permissions. %s" : "Uygulama dizini oluşturulamıyor. Lütfen izinleri düzeltin. %s",
"No source specified when installing app" : "Uygulama kurulurken bir kaynak belirtilmedi",
@@ -97,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "%s için izinler öge bulunamadığından ayarlanamadı",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Son kullanma tarihi ayarlanamıyor. Paylaşımlar, paylaşıldıkları süreden %s sonra dolamaz.",
"Cannot set expiration date. Expiration date is in the past" : "Son kullanma tarihi ayarlanamıyor. Son kullanma tarihi geçmişte",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Son kullanım tarihi temizlenemiyor. Paylaşımların bir son kullanma tarihi olmalı.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Paylaşma arka ucu %s OCP\\Share_Backend arayüzünü desteklemeli",
"Sharing backend %s not found" : "Paylaşım arka ucu %s bulunamadı",
"Sharing backend for %s not found" : "%s için paylaşım arka ucu bulunamadı",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index 7b170e3e5b7..c97b318b334 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -20,7 +20,7 @@
"Users" : "Kullanıcılar",
"Admin" : "Yönetici",
"Recommended" : "Önerilen",
- "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "ownCloud yazılımının bu sürümü ile uyumlu olmadığı için \"%s\" uygulaması kurulamaz.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "ownCloud yazılımının bu sürümü ile uyumlu olmadığı için \"%s\" uygulaması kurulamaz.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "\"%s\" uygulaması, şu bağımlılıklar sağlanmadığı için yüklenemiyor: %s",
"No app name specified" : "Uygulama adı belirtilmedi",
"Unknown filetype" : "Bilinmeyen dosya türü",
@@ -38,6 +38,10 @@
"web services under your control" : "denetiminizdeki web hizmetleri",
"Empty filename is not allowed" : "Boş dasya adına izin verilmiyor",
"Dot files are not allowed" : "Nokta dosyalarına izin verilmiyor",
+ "4-byte characters are not supported in file names" : "4 bayt karakterler dosya adlarında desteklenmez",
+ "File name is a reserved word" : "Bu dosya adı özel bir kullanıma aittir",
+ "File name contains at least one invalid character" : "Dosya adı en az bir geçersiz karakter içeriyor",
+ "File name is too long" : "Dosya adı çok uzun",
"App directory already exists" : "Uygulama dizini zaten mevcut",
"Can't create app folder. Please fix permissions. %s" : "Uygulama dizini oluşturulamıyor. Lütfen izinleri düzeltin. %s",
"No source specified when installing app" : "Uygulama kurulurken bir kaynak belirtilmedi",
@@ -95,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "%s için izinler öge bulunamadığından ayarlanamadı",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Son kullanma tarihi ayarlanamıyor. Paylaşımlar, paylaşıldıkları süreden %s sonra dolamaz.",
"Cannot set expiration date. Expiration date is in the past" : "Son kullanma tarihi ayarlanamıyor. Son kullanma tarihi geçmişte",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Son kullanım tarihi temizlenemiyor. Paylaşımların bir son kullanma tarihi olmalı.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Paylaşma arka ucu %s OCP\\Share_Backend arayüzünü desteklemeli",
"Sharing backend %s not found" : "Paylaşım arka ucu %s bulunamadı",
"Sharing backend for %s not found" : "%s için paylaşım arka ucu bulunamadı",
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 0689e6b1fb2..2d830eb0d85 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -8,25 +8,42 @@ OC.L10N.register(
"Sample configuration detected" : "Виявлено приклад конфігурації",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Була виявлена конфігурація з прикладу. Це може нашкодити вашій системі та не підтримується. Будь ласка, зверніться до документації перед внесенням змін в файл config.php",
"PHP %s or higher is required." : "Необхідно PHP %s або вище",
+ "PHP with a version lower than %s is required." : "Потрібна версія PHP нижче %s ",
+ "Following databases are supported: %s" : "Підтримуються наступні сервери баз даних: %s",
+ "The command line tool %s could not be found" : "Утиліту командного рядка %s не знайдено",
+ "The library %s is not available." : "Бібліотека %s недоступна.",
+ "Library %s with a version higher than %s is required - available version %s." : "Потрібна бібліотека %s версії не більше %s, встановлена версія %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Потрібна бібліотека %s версії менш ніж %s, встановлена версія %s.",
+ "Following platforms are supported: %s" : "Підтримуються наступні платформи: %s",
+ "ownCloud %s or higher is required." : "Потрібен ownCloud %s або вище.",
+ "ownCloud with a version lower than %s is required." : "Потрібна версія ownCloud нижче %s.",
"Help" : "Допомога",
"Personal" : "Особисте",
"Users" : "Користувачі",
"Admin" : "Адмін",
"Recommended" : "Рекомендуємо",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Додаток \"%s\" не може бути встановлено, так як він не сумісний з цією версією ownCloud.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Додаток \"%s\" не може бути встановлений, так як наступні залежності не виконано: %s",
"No app name specified" : "Не вказано ім'я додатку",
"Unknown filetype" : "Невідомий тип файлу",
"Invalid image" : "Невірне зображення",
"today" : "сьогодні",
"yesterday" : "вчора",
- "_%n day ago_::_%n days ago_" : ["","",""],
+ "_%n day ago_::_%n days ago_" : ["%n день тому","%n днів тому","%n днів тому"],
"last month" : "минулого місяця",
"_%n month ago_::_%n months ago_" : ["","","%n місяців тому"],
"last year" : "минулого року",
- "_%n year ago_::_%n years ago_" : ["","",""],
+ "_%n year ago_::_%n years ago_" : ["%n рік тому","%n років тому","%n років тому"],
"_%n hour ago_::_%n hours ago_" : ["","","%n годин тому"],
"_%n minute ago_::_%n minutes ago_" : ["","","%n хвилин тому"],
"seconds ago" : "секунди тому",
"web services under your control" : "підконтрольні Вам веб-сервіси",
+ "Empty filename is not allowed" : "Порожні імена файлів не допускаються",
+ "Dot files are not allowed" : "Файли які починаються з крапки не допустимі",
+ "4-byte characters are not supported in file names" : "4-х байтові символи в імені файлів не допустимі",
+ "File name is a reserved word" : "Ім’я файлу є зарезервованим словом",
+ "File name contains at least one invalid character" : "Ім’я файлу містить принаймні один некоректний символ",
+ "File name is too long" : "Ім’я файлу занадто довге",
"App directory already exists" : "Тека додатку вже існує",
"Can't create app folder. Please fix permissions. %s" : "Неможливо створити теку додатку. Будь ласка, виправте права доступу. %s",
"No source specified when installing app" : "Не вказано джерело при встановлені додатку",
@@ -61,11 +78,13 @@ OC.L10N.register(
"PostgreSQL username and/or password not valid" : "PostgreSQL ім'я користувача та/або пароль не дійсні",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не підтримується і %s не буде коректно працювати на цій платформі. Випробовуєте на свій риск!",
"For the best results, please consider using a GNU/Linux server instead." : "Для кращих результатів розгляньте можливість використання GNU/Linux серверу",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Здається що екземпляр цього %s працює в 32-бітному PHP середовищі і open_basedir повинен бути налаштований в php.ini. Це призведе до проблем з файлами більше 4 ГБ і це дуже не рекомендується.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Будь ласка, видаліть параметр open_basedir у вашому php.ini або перейдіть на 64-бітний PHP.",
"Set an admin username." : "Встановіть ім'я адміністратора.",
"Set an admin password." : "Встановіть пароль адміністратора.",
"Can't create or write into the data directory %s" : "Неможливо створити або записати каталог даних %s",
"%s shared »%s« with you" : "%s розподілено »%s« з тобою",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Не вдалося поділитися %s, загальний доступ не допускає публікації з елементів типу %i",
"Sharing %s failed, because the file does not exist" : "Не вдалося поділитися %s, оскільки файл не існує",
"You are not allowed to share %s" : "Вам заборонено поширювати %s",
"Sharing %s failed, because the user %s is the item owner" : "Не вдалося поділитися з %s, оскільки %s вже є володарем",
@@ -76,17 +95,54 @@ OC.L10N.register(
"Sharing %s failed, because %s is not a member of the group %s" : "Не вдалося поділитися %s, оскільки %s не є членом групи %s",
"You need to provide a password to create a public link, only protected links are allowed" : "Вам необхідно задати пароль для створення публічного посилання. Дозволені лише захищені посилання",
"Sharing %s failed, because sharing with links is not allowed" : "Не вдалося поділитися %s, оскільки публічний доступ через посилання заборонений",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не вдалося поділитися %s, не вдалося знайти %s, можливо, сервер не доступний.",
+ "Share type %s is not valid for %s" : "Тип загального доступу %s неприпустимий для %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Не вдалося налаштувати права доступу для %s, зазначені права доступу перевищують надані для %s",
+ "Setting permissions for %s failed, because the item was not found" : "Не вдалося налаштувати права доступу для %s, елемент не знайдений.",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Неможливо встановити дату закінчення. Загальні ресурси не можуть застаріти пізніше %s з моменту їх публікації.",
+ "Cannot set expiration date. Expiration date is in the past" : "Неможливо встановити дату закінчення. Дата закінчення в минулому.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Неможливо очистити дату закінчення. Загальні ресурси повинні мати термін придатності.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend загального доступу %s повинен реалізовувати інтерфейс OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Backend загального доступу %s не знайдено",
+ "Sharing backend for %s not found" : "Бекенд загального доступу для %s не знайдено",
+ "Sharing %s failed, because the user %s is the original sharer" : "Не вдалося поділитися %s, спочатку елементом поділився %s",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Не вдалося поділитися %s, права перевищують надані права доступу %s",
+ "Sharing %s failed, because resharing is not allowed" : "Не вдалося поділитися %s, перевідкриття доступу заборонено",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Не вдалося поділитися %s, backend загального доступу не знайшов шлях до %s",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Не вдалося поділитися %s, елемент не знайдено у файловому кеші.",
"Could not find category \"%s\"" : "Не вдалося знайти категорію \"%s\"",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Тільки такі символи допускаються в імені користувача: \"az\", \"AZ\", \"0-9\", і \"_.@ -\"",
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
"The username is already being used" : "Ім'я користувача вже використовується",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Не встановлено драйвер бази даних (sqlite, mysql, or postgresql).",
"Cannot write into \"config\" directory" : "Не можу писати у теку \"config\"",
"Cannot write into \"apps\" directory" : "Не можу писати у теку \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Зазвичай це можна виправити, %s надавши веб-серверу права на запис в каталог додатків %s або відключивши сховище програм у файлі конфігурації.",
+ "Cannot create \"data\" directory (%s)" : "Неможливо створити каталог \"data\" (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Зазвичай це можна виправити, <a href=\"%s\" target=\"_blank\"> надавши веб-серверу права на запис в кореневому каталозі</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Зазвичай це можна виправити, %s надавши веб-серверу права на запис в кореневому каталозі %s.",
+ "Setting locale to %s failed" : "Установка локалі %s не вдалася",
+ "Please install one of these locales on your system and restart your webserver." : "Встановіть один із цих мовних пакетів в вашу систему і перезапустіть веб-сервер.",
"Please ask your server administrator to install the module." : "Будь ласка, зверніться до адміністратора, щоб встановити модуль.",
"PHP module %s not installed." : "%s модуль PHP не встановлено.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "Параметр PHP \"%s\" не встановлено в \"%s\".",
+ "Adjusting this setting in php.ini will make ownCloud run again" : "Установка цього параметру в php.ini дозволяє запуститися ownCloud знову.",
+ "Please ask your server administrator to update PHP to the latest version. Your PHP version is no longer supported by ownCloud and the PHP community." : "Будь ласка, зверніться до адміністратора серверу, щоб оновити PHP до останньої версії. Встановлена версія PHP більше не підтримується ownCloud і співтовариством PHP.",
+ "PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code." : "У PHP включена директива \"always_populate_raw_post_data\". PHP версії 5.6 і вище, при включеній директиві, додає повідомлення в журнал навіть для абсолютно робочого коду.",
+ "To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "Щоб виправити цю помилку, вкажіть значення <code> -1 </ code> як значення параметра <code> always_populate_raw_post_data </ code> у вашому php.ini",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Схоже, що PHP налаштовано на вичищення блоків вбудованої документації. Це зробить кілька основних додатків недоступними.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Це, ймовірно, обумовлено використанням кеша/прискорювача такого як Zend OPcache або eAccelerator.",
- "Please ask your server administrator to restart the web server." : "Будь ласка, зверніться до адміністратора, щоб перезавантажити сервер."
+ "PHP modules have been installed, but they are still listed as missing?" : "Модулі PHP були встановлені, але вони все ще перераховані як відсутні?",
+ "Please ask your server administrator to restart the web server." : "Будь ласка, зверніться до адміністратора, щоб перезавантажити сервер.",
+ "PostgreSQL >= 9 required" : "Потрібно PostgreSQL> = 9",
+ "Please upgrade your database version" : "Оновіть версію бази даних",
+ "Error occurred while checking PostgreSQL version" : "Сталася помилка при перевірці версії PostgreSQL",
+ "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Переконайтеся що версія PostgreSQL> = 9 або перевірте журнали для отримання додаткової інформацією про помилку",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Змініть права доступу на 0770, щоб інші користувачі не могли отримати список файлів цього каталогу.",
+ "Data directory (%s) is readable by other users" : "Каталог даних (%s) доступний для читання іншим користувачам",
+ "Data directory (%s) is invalid" : "Каталог даних (%s) невірний",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Переконайтеся, що файл \".ocdata\" присутній у корені каталогу даних.",
+ "Could not obtain lock type %d on \"%s\"." : "Не вдалося отримати блокування типу %d для \"%s\""
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index 587d30c1bc3..8bb598eb219 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -6,25 +6,42 @@
"Sample configuration detected" : "Виявлено приклад конфігурації",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Була виявлена конфігурація з прикладу. Це може нашкодити вашій системі та не підтримується. Будь ласка, зверніться до документації перед внесенням змін в файл config.php",
"PHP %s or higher is required." : "Необхідно PHP %s або вище",
+ "PHP with a version lower than %s is required." : "Потрібна версія PHP нижче %s ",
+ "Following databases are supported: %s" : "Підтримуються наступні сервери баз даних: %s",
+ "The command line tool %s could not be found" : "Утиліту командного рядка %s не знайдено",
+ "The library %s is not available." : "Бібліотека %s недоступна.",
+ "Library %s with a version higher than %s is required - available version %s." : "Потрібна бібліотека %s версії не більше %s, встановлена версія %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Потрібна бібліотека %s версії менш ніж %s, встановлена версія %s.",
+ "Following platforms are supported: %s" : "Підтримуються наступні платформи: %s",
+ "ownCloud %s or higher is required." : "Потрібен ownCloud %s або вище.",
+ "ownCloud with a version lower than %s is required." : "Потрібна версія ownCloud нижче %s.",
"Help" : "Допомога",
"Personal" : "Особисте",
"Users" : "Користувачі",
"Admin" : "Адмін",
"Recommended" : "Рекомендуємо",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Додаток \"%s\" не може бути встановлено, так як він не сумісний з цією версією ownCloud.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Додаток \"%s\" не може бути встановлений, так як наступні залежності не виконано: %s",
"No app name specified" : "Не вказано ім'я додатку",
"Unknown filetype" : "Невідомий тип файлу",
"Invalid image" : "Невірне зображення",
"today" : "сьогодні",
"yesterday" : "вчора",
- "_%n day ago_::_%n days ago_" : ["","",""],
+ "_%n day ago_::_%n days ago_" : ["%n день тому","%n днів тому","%n днів тому"],
"last month" : "минулого місяця",
"_%n month ago_::_%n months ago_" : ["","","%n місяців тому"],
"last year" : "минулого року",
- "_%n year ago_::_%n years ago_" : ["","",""],
+ "_%n year ago_::_%n years ago_" : ["%n рік тому","%n років тому","%n років тому"],
"_%n hour ago_::_%n hours ago_" : ["","","%n годин тому"],
"_%n minute ago_::_%n minutes ago_" : ["","","%n хвилин тому"],
"seconds ago" : "секунди тому",
"web services under your control" : "підконтрольні Вам веб-сервіси",
+ "Empty filename is not allowed" : "Порожні імена файлів не допускаються",
+ "Dot files are not allowed" : "Файли які починаються з крапки не допустимі",
+ "4-byte characters are not supported in file names" : "4-х байтові символи в імені файлів не допустимі",
+ "File name is a reserved word" : "Ім’я файлу є зарезервованим словом",
+ "File name contains at least one invalid character" : "Ім’я файлу містить принаймні один некоректний символ",
+ "File name is too long" : "Ім’я файлу занадто довге",
"App directory already exists" : "Тека додатку вже існує",
"Can't create app folder. Please fix permissions. %s" : "Неможливо створити теку додатку. Будь ласка, виправте права доступу. %s",
"No source specified when installing app" : "Не вказано джерело при встановлені додатку",
@@ -59,11 +76,13 @@
"PostgreSQL username and/or password not valid" : "PostgreSQL ім'я користувача та/або пароль не дійсні",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не підтримується і %s не буде коректно працювати на цій платформі. Випробовуєте на свій риск!",
"For the best results, please consider using a GNU/Linux server instead." : "Для кращих результатів розгляньте можливість використання GNU/Linux серверу",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Здається що екземпляр цього %s працює в 32-бітному PHP середовищі і open_basedir повинен бути налаштований в php.ini. Це призведе до проблем з файлами більше 4 ГБ і це дуже не рекомендується.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Будь ласка, видаліть параметр open_basedir у вашому php.ini або перейдіть на 64-бітний PHP.",
"Set an admin username." : "Встановіть ім'я адміністратора.",
"Set an admin password." : "Встановіть пароль адміністратора.",
"Can't create or write into the data directory %s" : "Неможливо створити або записати каталог даних %s",
"%s shared »%s« with you" : "%s розподілено »%s« з тобою",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Не вдалося поділитися %s, загальний доступ не допускає публікації з елементів типу %i",
"Sharing %s failed, because the file does not exist" : "Не вдалося поділитися %s, оскільки файл не існує",
"You are not allowed to share %s" : "Вам заборонено поширювати %s",
"Sharing %s failed, because the user %s is the item owner" : "Не вдалося поділитися з %s, оскільки %s вже є володарем",
@@ -74,17 +93,54 @@
"Sharing %s failed, because %s is not a member of the group %s" : "Не вдалося поділитися %s, оскільки %s не є членом групи %s",
"You need to provide a password to create a public link, only protected links are allowed" : "Вам необхідно задати пароль для створення публічного посилання. Дозволені лише захищені посилання",
"Sharing %s failed, because sharing with links is not allowed" : "Не вдалося поділитися %s, оскільки публічний доступ через посилання заборонений",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не вдалося поділитися %s, не вдалося знайти %s, можливо, сервер не доступний.",
+ "Share type %s is not valid for %s" : "Тип загального доступу %s неприпустимий для %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Не вдалося налаштувати права доступу для %s, зазначені права доступу перевищують надані для %s",
+ "Setting permissions for %s failed, because the item was not found" : "Не вдалося налаштувати права доступу для %s, елемент не знайдений.",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Неможливо встановити дату закінчення. Загальні ресурси не можуть застаріти пізніше %s з моменту їх публікації.",
+ "Cannot set expiration date. Expiration date is in the past" : "Неможливо встановити дату закінчення. Дата закінчення в минулому.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Неможливо очистити дату закінчення. Загальні ресурси повинні мати термін придатності.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend загального доступу %s повинен реалізовувати інтерфейс OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Backend загального доступу %s не знайдено",
+ "Sharing backend for %s not found" : "Бекенд загального доступу для %s не знайдено",
+ "Sharing %s failed, because the user %s is the original sharer" : "Не вдалося поділитися %s, спочатку елементом поділився %s",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Не вдалося поділитися %s, права перевищують надані права доступу %s",
+ "Sharing %s failed, because resharing is not allowed" : "Не вдалося поділитися %s, перевідкриття доступу заборонено",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Не вдалося поділитися %s, backend загального доступу не знайшов шлях до %s",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Не вдалося поділитися %s, елемент не знайдено у файловому кеші.",
"Could not find category \"%s\"" : "Не вдалося знайти категорію \"%s\"",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Тільки такі символи допускаються в імені користувача: \"az\", \"AZ\", \"0-9\", і \"_.@ -\"",
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
"The username is already being used" : "Ім'я користувача вже використовується",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Не встановлено драйвер бази даних (sqlite, mysql, or postgresql).",
"Cannot write into \"config\" directory" : "Не можу писати у теку \"config\"",
"Cannot write into \"apps\" directory" : "Не можу писати у теку \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Зазвичай це можна виправити, %s надавши веб-серверу права на запис в каталог додатків %s або відключивши сховище програм у файлі конфігурації.",
+ "Cannot create \"data\" directory (%s)" : "Неможливо створити каталог \"data\" (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Зазвичай це можна виправити, <a href=\"%s\" target=\"_blank\"> надавши веб-серверу права на запис в кореневому каталозі</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Зазвичай це можна виправити, %s надавши веб-серверу права на запис в кореневому каталозі %s.",
+ "Setting locale to %s failed" : "Установка локалі %s не вдалася",
+ "Please install one of these locales on your system and restart your webserver." : "Встановіть один із цих мовних пакетів в вашу систему і перезапустіть веб-сервер.",
"Please ask your server administrator to install the module." : "Будь ласка, зверніться до адміністратора, щоб встановити модуль.",
"PHP module %s not installed." : "%s модуль PHP не встановлено.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "Параметр PHP \"%s\" не встановлено в \"%s\".",
+ "Adjusting this setting in php.ini will make ownCloud run again" : "Установка цього параметру в php.ini дозволяє запуститися ownCloud знову.",
+ "Please ask your server administrator to update PHP to the latest version. Your PHP version is no longer supported by ownCloud and the PHP community." : "Будь ласка, зверніться до адміністратора серверу, щоб оновити PHP до останньої версії. Встановлена версія PHP більше не підтримується ownCloud і співтовариством PHP.",
+ "PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code." : "У PHP включена директива \"always_populate_raw_post_data\". PHP версії 5.6 і вище, при включеній директиві, додає повідомлення в журнал навіть для абсолютно робочого коду.",
+ "To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "Щоб виправити цю помилку, вкажіть значення <code> -1 </ code> як значення параметра <code> always_populate_raw_post_data </ code> у вашому php.ini",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Схоже, що PHP налаштовано на вичищення блоків вбудованої документації. Це зробить кілька основних додатків недоступними.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Це, ймовірно, обумовлено використанням кеша/прискорювача такого як Zend OPcache або eAccelerator.",
- "Please ask your server administrator to restart the web server." : "Будь ласка, зверніться до адміністратора, щоб перезавантажити сервер."
+ "PHP modules have been installed, but they are still listed as missing?" : "Модулі PHP були встановлені, але вони все ще перераховані як відсутні?",
+ "Please ask your server administrator to restart the web server." : "Будь ласка, зверніться до адміністратора, щоб перезавантажити сервер.",
+ "PostgreSQL >= 9 required" : "Потрібно PostgreSQL> = 9",
+ "Please upgrade your database version" : "Оновіть версію бази даних",
+ "Error occurred while checking PostgreSQL version" : "Сталася помилка при перевірці версії PostgreSQL",
+ "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Переконайтеся що версія PostgreSQL> = 9 або перевірте журнали для отримання додаткової інформацією про помилку",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Змініть права доступу на 0770, щоб інші користувачі не могли отримати список файлів цього каталогу.",
+ "Data directory (%s) is readable by other users" : "Каталог даних (%s) доступний для читання іншим користувачам",
+ "Data directory (%s) is invalid" : "Каталог даних (%s) невірний",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Переконайтеся, що файл \".ocdata\" присутній у корені каталогу даних.",
+ "Could not obtain lock type %d on \"%s\"." : "Не вдалося отримати блокування типу %d для \"%s\""
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/private/app.php b/lib/private/app.php
index 9ae4ae30d74..dce159d574c 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -42,6 +42,7 @@ class OC_App {
static private $appTypes = array();
static private $loadedApps = array();
static private $altLogin = array();
+ private static $shippedApps = null;
/**
* clean the appId
@@ -60,7 +61,7 @@ class OC_App {
* @return bool
*
* This function walks through the ownCloud directory and loads all apps
- * it can find. A directory contains an app if the file /appinfo/app.php
+ * it can find. A directory contains an app if the file /appinfo/info.xml
* exists.
*
* if $types is set, only apps of those types will be loaded
@@ -182,12 +183,18 @@ class OC_App {
* Check if an app that is installed is a shipped app or installed from the appstore.
*/
public static function isShipped($appId) {
- $info = self::getAppInfo($appId);
- if (isset($info['shipped']) && $info['shipped'] == 'true') {
- return true;
- } else {
- return false;
+ if (is_null(self::$shippedApps)) {
+ $shippedJson = \OC::$SERVERROOT . '/core/shipped.json';
+ if (file_exists($shippedJson)) {
+ self::$shippedApps = json_decode(file_get_contents($shippedJson), true);
+ self::$shippedApps = self::$shippedApps['shippedApps'];
+ } else {
+ self::$shippedApps = ['files', 'files_encryption', 'files_external',
+ 'files_sharing', 'files_trashbin', 'files_versions', 'provisioning_api',
+ 'user_ldap', 'user_webdavauth'];
+ }
}
+ return in_array($appId, self::$shippedApps);
}
/**
@@ -262,7 +269,15 @@ class OC_App {
$appManager = \OC::$server->getAppManager();
if (!is_null($groups)) {
- $appManager->enableAppForGroups($app, $groups);
+ $groupManager = \OC::$server->getGroupManager();
+ $groupsList = [];
+ foreach ($groups as $group) {
+ $groupItem = $groupManager->get($group);
+ if ($groupItem instanceof \OCP\IGroup) {
+ $groupsList[] = $groupManager->get($group);
+ }
+ }
+ $appManager->enableAppForGroups($app, $groupsList);
} else {
$appManager->enableApp($app);
}
@@ -319,29 +334,6 @@ class OC_App {
}
/**
- * adds an entry to the navigation
- *
- * @param array $data array containing the data
- * @return bool
- *
- * This function adds a new entry to the navigation visible to users. $data
- * is an associative array.
- * The following keys are required:
- * - id: unique id for this entry ('addressbook_index')
- * - href: link to the page
- * - name: Human readable name ('Addressbook')
- *
- * The following keys are optional:
- * - icon: path to the icon of the app
- * - order: integer, that influences the position of your application in
- * the navigation. Lower values come first.
- */
- public static function addNavigationEntry($data) {
- OC::$server->getNavigationManager()->add($data);
- return true;
- }
-
- /**
* marks a navigation entry as active
*
* @param string $id id of the entry
@@ -350,6 +342,8 @@ class OC_App {
* This function sets a navigation entry as active and removes the 'active'
* property from all other entries. The templates can use this for
* highlighting the current position of the user.
+ *
+ * @deprecated Use \OC::$server->getNavigationManager()->setActiveEntry() instead
*/
public static function setActiveNavigationEntry($id) {
OC::$server->getNavigationManager()->setActiveEntry($id);
@@ -380,6 +374,8 @@ class OC_App {
*
* This function returns the id of the active navigation entry (set by
* setActiveNavigationEntry
+ *
+ * @deprecated Use \OC::$server->getNavigationManager()->getActiveEntry() instead
*/
public static function getActiveNavigationEntry() {
return OC::$server->getNavigationManager()->getActiveEntry();
@@ -751,7 +747,7 @@ class OC_App {
if (is_resource($dh)) {
while (($file = readdir($dh)) !== false) {
- if ($file[0] != '.' and is_file($apps_dir['path'] . '/' . $file . '/appinfo/app.php')) {
+ if ($file[0] != '.' and is_file($apps_dir['path'] . '/' . $file . '/appinfo/info.xml')) {
$apps[] = $file;
@@ -900,7 +896,7 @@ class OC_App {
/**
* get a list of all apps on apps.owncloud.com
- *
+ *
* @return array|false multi-dimensional array of apps.
* Keys: id, name, type, typename, personid, license, detailpage, preview, changed, description
*/
diff --git a/lib/private/avatar.php b/lib/private/avatar.php
index 23b3c82771a..da9c84d84a4 100644
--- a/lib/private/avatar.php
+++ b/lib/private/avatar.php
@@ -29,7 +29,7 @@ class Avatar implements \OCP\IAvatar {
/**
* get the users avatar
* @param int $size size in px of the avatar, avatars are square, defaults to 64
- * @return boolean|\OC_Image containing the avatar or false if there's no image
+ * @return boolean|\OCP\IImage containing the avatar or false if there's no image
*/
public function get ($size = 64) {
if ($this->view->file_exists('avatar.jpg')) {
@@ -57,14 +57,14 @@ class Avatar implements \OCP\IAvatar {
/**
* sets the users avatar
- * @param \OC_Image|resource|string $data OC_Image, imagedata or path to set a new avatar
+ * @param \OCP\IImage|resource|string $data An image object, imagedata or path to set a new avatar
* @throws \Exception if the provided file is not a jpg or png image
* @throws \Exception if the provided image is not valid
* @throws \OC\NotSquareException if the image is not square
* @return void
*/
public function set ($data) {
- if($data instanceOf OC_Image) {
+ if($data instanceOf \OCP\IImage) {
$img = $data;
$data = $img->data();
} else {
diff --git a/lib/private/cache/fileglobalgc.php b/lib/private/cache/fileglobalgc.php
index 039992718ab..b07e886f652 100644
--- a/lib/private/cache/fileglobalgc.php
+++ b/lib/private/cache/fileglobalgc.php
@@ -6,6 +6,9 @@ use OC\BackgroundJob\Job;
use OCP\IConfig;
class FileGlobalGC extends Job {
+ // only do cleanup every 5 minutes
+ const CLEANUP_TTL_SEC = 300;
+
public function run($argument) {
$this->gc(\OC::$server->getConfig(), $this->getCacheDir());
}
@@ -39,8 +42,7 @@ class FileGlobalGC extends Job {
public function gc(IConfig $config, $cacheDir) {
$lastRun = $config->getAppValue('core', 'global_cache_gc_lastrun', 0);
$now = time();
- if (($now - $lastRun) < 300) {
- // only do cleanup every 5 minutes
+ if (($now - $lastRun) < self::CLEANUP_TTL_SEC) {
return;
}
$config->setAppValue('core', 'global_cache_gc_lastrun', $now);
@@ -48,6 +50,8 @@ class FileGlobalGC extends Job {
return;
}
$paths = $this->getExpiredPaths($cacheDir, $now);
- array_walk($paths, 'unlink');
+ array_walk($paths, function($file) {
+ unlink($file);
+ });
}
}
diff --git a/lib/private/connector/sabre/custompropertiesbackend.php b/lib/private/connector/sabre/custompropertiesbackend.php
index 76ac8b84ef9..9bd6452674b 100644
--- a/lib/private/connector/sabre/custompropertiesbackend.php
+++ b/lib/private/connector/sabre/custompropertiesbackend.php
@@ -29,6 +29,8 @@ use Sabre\DAV\PropertyStorage\Backend\BackendInterface;
use Sabre\DAV\PropFind;
use Sabre\DAV\PropPatch;
use Sabre\DAV\Tree;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Exception\ServiceUnavailable;
class CustomPropertiesBackend implements BackendInterface {
@@ -94,8 +96,22 @@ class CustomPropertiesBackend implements BackendInterface {
* @return void
*/
public function propFind($path, PropFind $propFind) {
- $node = $this->tree->getNodeForPath($path);
- if (!($node instanceof Node)) {
+ try {
+ $node = $this->tree->getNodeForPath($path);
+ if (!($node instanceof Node)) {
+ return;
+ }
+ } catch (ServiceUnavailable $e) {
+ // might happen for unavailable mount points, skip
+ return;
+ } catch (NotFound $e) {
+ // in some rare (buggy) cases the node might not be found,
+ // we catch the exception to prevent breaking the whole list with a 404
+ // (soft fail)
+ \OC::$server->getLogger()->warning(
+ 'Could not get node for path: \"' . $path . '\" : ' . $e->getMessage(),
+ array('app' => 'files')
+ );
return;
}
diff --git a/lib/private/connector/sabre/filesplugin.php b/lib/private/connector/sabre/filesplugin.php
index 29240e2b674..9720519f4c7 100644
--- a/lib/private/connector/sabre/filesplugin.php
+++ b/lib/private/connector/sabre/filesplugin.php
@@ -70,7 +70,6 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$this->server->on('propPatch', array($this, 'handleUpdateProperties'));
$this->server->on('afterBind', array($this, 'sendFileIdHeader'));
$this->server->on('afterWriteContent', array($this, 'sendFileIdHeader'));
- $this->server->on('beforeMethod:GET', array($this, 'handleRangeHeaders'));
}
/**
@@ -178,17 +177,4 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
}
}
- /**
- * Remove range headers if encryption is enabled.
- *
- * @param RequestInterface $request
- * @param ResponseInterface $response
- */
- public function handleRangeHeaders(RequestInterface $request, ResponseInterface $response) {
- if (\OC_App::isEnabled('files_encryption')) {
- // encryption does not support range requests (yet)
- $request->removeHeader('range');
- }
- }
-
}
diff --git a/lib/private/db/connection.php b/lib/private/db/connection.php
index 8748f66b369..dd1a9da6747 100644
--- a/lib/private/db/connection.php
+++ b/lib/private/db/connection.php
@@ -30,7 +30,7 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
return parent::connect();
} catch (DBALException $e) {
// throw a new exception to prevent leaking info from the stacktrace
- throw new DBALException($e->getMessage(), $e->getCode());
+ throw new DBALException('Failed to connect to the database: ' . $e->getMessage(), $e->getCode());
}
}
diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php
index 64661ca1157..670ac2ec524 100644
--- a/lib/private/files/cache/cache.php
+++ b/lib/private/files/cache/cache.php
@@ -245,9 +245,6 @@ class Cache {
$queryParts[] = '`storage`';
$params[] = $this->getNumericStorageId();
- $params = array_map(function($item) {
- return trim($item, "`");
- }, $params);
$queryParts = array_map(function($item) {
return trim($item, "`");
}, $queryParts);
diff --git a/lib/private/files/cache/watcher.php b/lib/private/files/cache/watcher.php
index f4572895b09..22c3fb202c3 100644
--- a/lib/private/files/cache/watcher.php
+++ b/lib/private/files/cache/watcher.php
@@ -52,6 +52,13 @@ class Watcher {
}
/**
+ * @return int either \OC\Files\Cache\Watcher::CHECK_NEVER, \OC\Files\Cache\Watcher::CHECK_ONCE, \OC\Files\Cache\Watcher::CHECK_ALWAYS
+ */
+ public function getPolicy() {
+ return $this->watchPolicy;
+ }
+
+ /**
* check $path for updates
*
* @param string $path
diff --git a/lib/private/files/mount/mountpoint.php b/lib/private/files/mount/mountpoint.php
index 85edb7cb570..a187f4db109 100644
--- a/lib/private/files/mount/mountpoint.php
+++ b/lib/private/files/mount/mountpoint.php
@@ -71,9 +71,10 @@ class MountPoint implements IMountPoint {
}
$mountpoint = $this->formatPath($mountpoint);
+ $this->mountPoint = $mountpoint;
if ($storage instanceof Storage) {
$this->class = get_class($storage);
- $this->storage = $this->loader->wrap($mountpoint, $storage);
+ $this->storage = $this->loader->wrap($this, $storage);
} else {
// Update old classes to new namespace
if (strpos($storage, 'OC_Filestorage_') !== false) {
@@ -82,7 +83,6 @@ class MountPoint implements IMountPoint {
$this->class = $storage;
$this->arguments = $arguments;
}
- $this->mountPoint = $mountpoint;
}
/**
@@ -113,7 +113,7 @@ class MountPoint implements IMountPoint {
if (class_exists($this->class)) {
try {
- return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments);
+ return $this->loader->getInstance($this, $this->class, $this->arguments);
} catch (\Exception $exception) {
$this->invalidStorage = true;
if ($this->mountPoint === '/') {
@@ -195,7 +195,7 @@ class MountPoint implements IMountPoint {
$storage = $this->getStorage();
// storage can be null if it couldn't be initialized
if ($storage != null) {
- $this->storage = $wrapper($this->mountPoint, $storage);
+ $this->storage = $wrapper($this->mountPoint, $storage, $this);
}
}
@@ -209,4 +209,13 @@ class MountPoint implements IMountPoint {
public function getOption($name, $default) {
return isset($this->mountOptions[$name]) ? $this->mountOptions[$name] : $default;
}
+
+ /**
+ * Get all options for the mount
+ *
+ * @return array
+ */
+ public function getOptions() {
+ return $this->mountOptions;
+ }
}
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 031a2f1cb7a..11cf3405fd9 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -35,6 +35,8 @@ abstract class Common implements \OC\Files\Storage\Storage {
protected $watcher;
protected $storageCache;
+ protected $mountOptions = [];
+
/**
* @var string[]
*/
@@ -330,7 +332,8 @@ abstract class Common implements \OC\Files\Storage\Storage {
}
if (!isset($this->watcher)) {
$this->watcher = new Watcher($storage);
- $this->watcher->setPolicy(\OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_ONCE));
+ $globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_ONCE);
+ $this->watcher->setPolicy($this->getMountOption('filesystem_check_changes', $globalPolicy));
}
return $this->watcher;
}
@@ -512,9 +515,25 @@ abstract class Common implements \OC\Files\Storage\Storage {
}
}
- $sanitizedFileName = filter_var($fileName, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
+ $sanitizedFileName = filter_var($fileName, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);
if($sanitizedFileName !== $fileName) {
throw new InvalidCharacterInPathException();
}
}
+
+ /**
+ * @param array $options
+ */
+ public function setMountOptions(array $options) {
+ $this->mountOptions = $options;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $default
+ * @return mixed
+ */
+ public function getMountOption($name, $default = null) {
+ return isset($this->mountOptions[$name]) ? $this->mountOptions[$name] : $default;
+ }
}
diff --git a/lib/private/files/storage/storagefactory.php b/lib/private/files/storage/storagefactory.php
index fa6dea2537c..51972791290 100644
--- a/lib/private/files/storage/storagefactory.php
+++ b/lib/private/files/storage/storagefactory.php
@@ -8,6 +8,7 @@
namespace OC\Files\Storage;
+use OCP\Files\Mount\IMountPoint;
use OCP\Files\Storage\IStorageFactory;
class StorageFactory implements IStorageFactory {
@@ -55,23 +56,23 @@ class StorageFactory implements IStorageFactory {
/**
* Create an instance of a storage and apply the registered storage wrappers
*
- * @param string|boolean $mountPoint
+ * @param \OCP\Files\Mount\IMountPoint $mountPoint
* @param string $class
* @param array $arguments
* @return \OCP\Files\Storage
*/
- public function getInstance($mountPoint, $class, $arguments) {
+ public function getInstance(IMountPoint $mountPoint, $class, $arguments) {
return $this->wrap($mountPoint, new $class($arguments));
}
/**
- * @param string|boolean $mountPoint
+ * @param \OCP\Files\Mount\IMountPoint $mountPoint
* @param \OCP\Files\Storage $storage
* @return \OCP\Files\Storage
*/
- public function wrap($mountPoint, $storage) {
+ public function wrap(IMountPoint $mountPoint, $storage) {
foreach ($this->storageWrappers as $wrapper) {
- $storage = $wrapper($mountPoint, $storage);
+ $storage = $wrapper($mountPoint->getMountPoint(), $storage, $mountPoint);
}
return $storage;
}
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 53e13396621..c95e0545810 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -1133,7 +1133,7 @@ class View {
}
if ($mount instanceof MoveableMount && $internalPath === '') {
- $data['permissions'] |= \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_UPDATE;
+ $data['permissions'] |= \OCP\Constants::PERMISSION_DELETE;
}
$data = \OC_FileProxy::runPostProxies('getFileInfo', $path, $data);
diff --git a/lib/private/image.php b/lib/private/image.php
index 2484aeecc63..c8509c61286 100644
--- a/lib/private/image.php
+++ b/lib/private/image.php
@@ -15,7 +15,7 @@
/**
* Class for basic image manipulation
*/
-class OC_Image {
+class OC_Image implements \OCP\IImage {
protected $resource = false; // tmp resource.
protected $imageType = IMAGETYPE_PNG; // Default to png if file type isn't evident.
protected $mimeType = "image/png"; // Default to png
@@ -285,7 +285,7 @@ class OC_Image {
/**
* @return null|string Returns the raw image data.
*/
- function data() {
+ public function data() {
if (!$this->valid()) {
return null;
}
@@ -949,6 +949,9 @@ class OC_Image {
return true;
}
+ /**
+ * Destroys the current image and resets the object
+ */
public function destroy() {
if ($this->valid()) {
imagedestroy($this->resource);
diff --git a/lib/private/mail/mailer.php b/lib/private/mail/mailer.php
index a995322d89e..13c9167cabc 100644
--- a/lib/private/mail/mailer.php
+++ b/lib/private/mail/mailer.php
@@ -73,15 +73,30 @@ class Mailer implements IMailer {
* has been supplied.)
*/
public function send(Message $message) {
+ $debugMode = $this->config->getSystemValue('mail_smtpdebug', false);
+
if (sizeof($message->getFrom()) === 0) {
$message->setFrom([\OCP\Util::getDefaultEmailAddress($this->defaults->getName())]);
}
$failedRecipients = [];
- $this->getInstance()->send($message->getSwiftMessage(), $failedRecipients);
+ $mailer = $this->getInstance();
+
+ // Enable logger if debug mode is enabled
+ if($debugMode) {
+ $mailLogger = new \Swift_Plugins_Loggers_ArrayLogger();
+ $mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($mailLogger));
+ }
+
+ $mailer->send($message->getSwiftMessage(), $failedRecipients);
+
+ // Debugging logging
$logMessage = sprintf('Sent mail to "%s" with subject "%s"', print_r($message->getTo(), true), $message->getSubject());
$this->logger->debug($logMessage, ['app' => 'core']);
+ if($debugMode && isset($mailLogger)) {
+ $this->logger->debug($mailLogger->dump(), ['app' => 'core']);
+ }
return $failedRecipients;
}
diff --git a/lib/private/memcache/cache.php b/lib/private/memcache/cache.php
index c606d94fa51..d2d0353febc 100644
--- a/lib/private/memcache/cache.php
+++ b/lib/private/memcache/cache.php
@@ -21,6 +21,9 @@ abstract class Cache implements \ArrayAccess, \OCP\ICache {
$this->prefix = $prefix;
}
+ /**
+ * @return string Prefix used for caching purposes
+ */
public function getPrefix() {
return $this->prefix;
}
diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php
index c051c0eded2..af2c651cf80 100644
--- a/lib/private/mimetypes.list.php
+++ b/lib/private/mimetypes.list.php
@@ -81,6 +81,7 @@ return array(
'impress' => array('text/impress', null),
'jpeg' => array('image/jpeg', null),
'jpg' => array('image/jpeg', null),
+ 'jps' => array('image/jpeg', null),
'js' => array('application/javascript', 'text/plain'),
'json' => array('application/json', 'text/plain'),
'k25' => array('image/x-dcraw', null),
@@ -103,6 +104,7 @@ return array(
'mp4' => array('video/mp4', null),
'mpeg' => array('video/mpeg', null),
'mpg' => array('video/mpeg', null),
+ 'mpo' => array('image/jpeg', null),
'msi' => array('application/x-msi', null),
'nef' => array('image/x-dcraw', null),
'numbers' => array('application/x-iwork-numbers-sffnumbers', null),
diff --git a/lib/private/preview.php b/lib/private/preview.php
index 6af1586293f..f69b0d6c971 100644
--- a/lib/private/preview.php
+++ b/lib/private/preview.php
@@ -46,15 +46,10 @@ class Preview {
/**
* preview images object
*
- * @var \OC_Image
+ * @var \OCP\IImage
*/
private $preview;
- //preview providers
- static private $providers = array();
- static private $registeredProviders = array();
- static private $enabledProviders = array();
-
/**
* @var \OCP\Files\FileInfo
*/
@@ -95,11 +90,7 @@ class Preview {
$this->preview = null;
//check if there are preview backends
- if (empty(self::$providers)) {
- self::initProviders();
- }
-
- if (empty(self::$providers) && \OC::$server->getConfig()->getSystemValue('enable_previews', true)) {
+ if (!\OC::$server->getPreviewManager()->hasProviders() && \OC::$server->getConfig()->getSystemValue('enable_previews', true)) {
\OC_Log::write('core', 'No preview providers exist', \OC_Log::ERROR);
throw new \Exception('No preview providers');
}
@@ -474,7 +465,7 @@ class Preview {
/**
* return a preview of a file
- * @return \OC_Image
+ * @return \OCP\IImage
*/
public function getPreview() {
if (!is_null($this->preview) && $this->preview->valid()) {
@@ -510,37 +501,45 @@ class Preview {
if (is_null($this->preview)) {
$preview = null;
- foreach (self::$providers as $supportedMimeType => $provider) {
+ $previewProviders = \OC::$server->getPreviewManager()->getProviders();
+ foreach ($previewProviders as $supportedMimeType => $providers) {
if (!preg_match($supportedMimeType, $this->mimeType)) {
continue;
}
- \OC_Log::write('core', 'Generating preview for "' . $file . '" with "' . get_class($provider) . '"', \OC_Log::DEBUG);
+ foreach ($providers as $closure) {
+ $provider = $closure();
+ if (!($provider instanceof \OCP\Preview\IProvider)) {
+ continue;
+ }
- /** @var $provider Provider */
- $preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView);
+ \OC_Log::write('core', 'Generating preview for "' . $file . '" with "' . get_class($provider) . '"', \OC_Log::DEBUG);
- if (!($preview instanceof \OC_Image)) {
- continue;
- }
+ /** @var $provider Provider */
+ $preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView);
- $this->preview = $preview;
- $this->resizeAndCrop();
+ if (!($preview instanceof \OCP\IImage)) {
+ continue;
+ }
- $previewPath = $this->getPreviewPath($fileId);
- $cachePath = $this->buildCachePath($fileId);
+ $this->preview = $preview;
+ $this->resizeAndCrop();
- if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) {
- $this->userView->mkdir($this->getThumbnailsFolder() . '/');
- }
+ $previewPath = $this->getPreviewPath($fileId);
+ $cachePath = $this->buildCachePath($fileId);
- if ($this->userView->is_dir($previewPath) === false) {
- $this->userView->mkdir($previewPath);
- }
+ if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) {
+ $this->userView->mkdir($this->getThumbnailsFolder() . '/');
+ }
+
+ if ($this->userView->is_dir($previewPath) === false) {
+ $this->userView->mkdir($previewPath);
+ }
- $this->userView->file_put_contents($cachePath, $preview->data());
+ $this->userView->file_put_contents($cachePath, $preview->data());
- break;
+ break 2;
+ }
}
}
@@ -565,7 +564,7 @@ class Preview {
if (is_null($this->preview)) {
$this->getPreview();
}
- if ($this->preview instanceof \OC_Image) {
+ if ($this->preview instanceof \OCP\IImage) {
$this->preview->show($mimeType);
}
}
@@ -581,8 +580,8 @@ class Preview {
$scalingUp = $this->getScalingUp();
$maxScaleFactor = $this->getMaxScaleFactor();
- if (!($image instanceof \OC_Image)) {
- \OC_Log::write('core', '$this->preview is not an instance of OC_Image', \OC_Log::DEBUG);
+ if (!($image instanceof \OCP\IImage)) {
+ \OC_Log::write('core', '$this->preview is not an instance of \OCP\IImage', \OC_Log::DEBUG);
return;
}
@@ -686,146 +685,6 @@ class Preview {
}
/**
- * register a new preview provider to be used
- * @param string $class
- * @param array $options
- */
- public static function registerProvider($class, $options = array()) {
- /**
- * Only register providers that have been explicitly enabled
- *
- * The following providers are enabled by default:
- * - OC\Preview\Image
- * - OC\Preview\MP3
- * - OC\Preview\TXT
- * - OC\Preview\MarkDown
- *
- * The following providers are disabled by default due to performance or privacy concerns:
- * - OC\Preview\MSOfficeDoc
- * - OC\Preview\MSOffice2003
- * - OC\Preview\MSOffice2007
- * - OC\Preview\OpenDocument
- * - OC\Preview\StarOffice
- * - OC\Preview\SVG
- * - OC\Preview\Movie
- * - OC\Preview\PDF
- * - OC\Preview\TIFF
- * - OC\Preview\Illustrator
- * - OC\Preview\Postscript
- * - OC\Preview\Photoshop
- * - OC\Preview\Font
- */
- if(empty(self::$enabledProviders)) {
- self::$enabledProviders = \OC::$server->getConfig()->getSystemValue('enabledPreviewProviders', array(
- 'OC\Preview\Image',
- 'OC\Preview\MP3',
- 'OC\Preview\TXT',
- 'OC\Preview\MarkDown',
- ));
- }
-
- if(in_array($class, self::$enabledProviders)) {
- self::$registeredProviders[] = array('class' => $class, 'options' => $options);
- }
- }
-
- /**
- * create instances of all the registered preview providers
- * @return void
- */
- private static function initProviders() {
- if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) {
- self::$providers = array();
- return;
- }
-
- if (!empty(self::$providers)) {
- return;
- }
-
- self::registerCoreProviders();
- foreach (self::$registeredProviders as $provider) {
- $class = $provider['class'];
- $options = $provider['options'];
-
- /** @var $object Provider */
- $object = new $class($options);
- self::$providers[$object->getMimeType()] = $object;
- }
-
- $keys = array_map('strlen', array_keys(self::$providers));
- array_multisort($keys, SORT_DESC, self::$providers);
- }
-
- protected static function registerCoreProviders() {
- self::registerProvider('OC\Preview\TXT');
- self::registerProvider('OC\Preview\MarkDown');
- self::registerProvider('OC\Preview\Image');
- self::registerProvider('OC\Preview\MP3');
-
- // SVG, Office and Bitmap require imagick
- if (extension_loaded('imagick')) {
- $checkImagick = new \Imagick();
-
- $imagickProviders = array(
- 'SVG' => 'OC\Preview\SVG',
- 'TIFF' => 'OC\Preview\TIFF',
- 'PDF' => 'OC\Preview\PDF',
- 'AI' => 'OC\Preview\Illustrator',
- 'PSD' => 'OC\Preview\Photoshop',
- 'EPS' => 'OC\Preview\Postscript',
- 'TTF' => 'OC\Preview\Font',
- );
-
- foreach ($imagickProviders as $queryFormat => $provider) {
- if (count($checkImagick->queryFormats($queryFormat)) === 1) {
- self::registerProvider($provider);
- }
- }
-
- if (count($checkImagick->queryFormats('PDF')) === 1) {
- // Office previews are currently not supported on Windows
- if (!\OC_Util::runningOnWindows() && \OC_Helper::is_function_enabled('shell_exec')) {
- $officeFound = is_string(\OC::$server->getConfig()->getSystemValue('preview_libreoffice_path', null));
-
- if (!$officeFound) {
- //let's see if there is libreoffice or openoffice on this machine
- $whichLibreOffice = shell_exec('command -v libreoffice');
- $officeFound = !empty($whichLibreOffice);
- if (!$officeFound) {
- $whichOpenOffice = shell_exec('command -v openoffice');
- $officeFound = !empty($whichOpenOffice);
- }
- }
-
- if ($officeFound) {
- self::registerProvider('OC\Preview\MSOfficeDoc');
- self::registerProvider('OC\Preview\MSOffice2003');
- self::registerProvider('OC\Preview\MSOffice2007');
- self::registerProvider('OC\Preview\OpenDocument');
- self::registerProvider('OC\Preview\StarOffice');
- }
- }
- }
- }
-
- // Video requires avconv or ffmpeg and is therefor
- // currently not supported on Windows.
- if (!\OC_Util::runningOnWindows()) {
- $avconvBinary = \OC_Helper::findBinaryPath('avconv');
- $ffmpegBinary = ($avconvBinary) ? null : \OC_Helper::findBinaryPath('ffmpeg');
-
- if ($avconvBinary || $ffmpegBinary) {
- // FIXME // a bit hacky but didn't want to use subclasses
- \OC\Preview\Movie::$avconvBinary = $avconvBinary;
- \OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
-
- self::registerProvider('OC\Preview\Movie');
- }
- }
- }
-
- /**
* @param array $args
*/
public static function post_write($args) {
@@ -915,60 +774,6 @@ class Preview {
}
/**
- * Check if a preview can be generated for a file
- *
- * @param \OC\Files\FileInfo $file
- * @return bool
- */
- public static function isAvailable(\OC\Files\FileInfo $file) {
- if (!\OC_Config::getValue('enable_previews', true)) {
- return false;
- }
-
- $mount = $file->getMountPoint();
- if ($mount and !$mount->getOption('previews', true)){
- return false;
- }
-
- //check if there are preview backends
- if (empty(self::$providers)) {
- self::initProviders();
- }
-
- foreach (self::$providers as $supportedMimeType => $provider) {
- /**
- * @var \OC\Preview\Provider $provider
- */
- if (preg_match($supportedMimeType, $file->getMimetype())) {
- return $provider->isAvailable($file);
- }
- }
- return false;
- }
-
- /**
- * @param string $mimeType
- * @return bool
- */
- public static function isMimeSupported($mimeType) {
- if (!\OC_Config::getValue('enable_previews', true)) {
- return false;
- }
-
- //check if there are preview backends
- if (empty(self::$providers)) {
- self::initProviders();
- }
-
- foreach(self::$providers as $supportedMimetype => $provider) {
- if(preg_match($supportedMimetype, $mimeType)) {
- return true;
- }
- }
- return false;
- }
-
- /**
* @param int $fileId
* @return string
*/
diff --git a/lib/private/preview/movie.php b/lib/private/preview/movie.php
index 06353ddebb7..85151f5dbaa 100644
--- a/lib/private/preview/movie.php
+++ b/lib/private/preview/movie.php
@@ -61,7 +61,7 @@ class Movie extends Provider {
* @param int $maxY
* @param string $absPath
* @param int $second
- * @return bool|\OC_Image
+ * @return bool|\OCP\IImage
*/
private function generateThumbNail($maxX, $maxY, $absPath, $second) {
$tmpPath = \OC_Helper::tmpFile();
diff --git a/lib/private/preview/mp3.php b/lib/private/preview/mp3.php
index f1a50d99e13..19360f4f036 100644
--- a/lib/private/preview/mp3.php
+++ b/lib/private/preview/mp3.php
@@ -39,8 +39,7 @@ class MP3 extends Provider {
/**
* Generates a default image when the file has no cover
*
- * @return false|\OC_Image False if the default image is missing or invalid,
- * otherwise the image is returned as \OC_Image
+ * @return bool|\OCP\IImage false if the default image is missing or invalid
*/
private function getNoCoverThumbnail() {
$icon = \OC::$SERVERROOT . '/core/img/filetypes/audio.png';
diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php
index ead67eaeef7..1d6fac13965 100644
--- a/lib/private/preview/provider.php
+++ b/lib/private/preview/provider.php
@@ -1,10 +1,17 @@
<?php
namespace OC\Preview;
-abstract class Provider {
+use OCP\Preview\IProvider;
+
+abstract class Provider implements IProvider {
private $options;
- public function __construct($options) {
+ /**
+ * Constructor
+ *
+ * @param array $options
+ */
+ public function __construct(array $options = []) {
$this->options = $options;
}
@@ -16,10 +23,10 @@ abstract class Provider {
/**
* Check if a preview can be generated for $path
*
- * @param \OC\Files\FileInfo $file
+ * @param \OCP\Files\FileInfo $file
* @return bool
*/
- public function isAvailable($file) {
+ public function isAvailable(\OCP\Files\FileInfo $file) {
return true;
}
@@ -30,9 +37,7 @@ abstract class Provider {
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
* @param bool $scalingup Disable/Enable upscaling of previews
* @param \OC\Files\View $fileview fileview object of user folder
- * @return mixed
- * false if no preview was generated
- * OC_Image object of the preview
+ * @return bool|\OCP\IImage false if no preview was generated
*/
abstract public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview);
}
diff --git a/lib/private/preview/txt.php b/lib/private/preview/txt.php
index 8b414dc5726..772b56c72cc 100644
--- a/lib/private/preview/txt.php
+++ b/lib/private/preview/txt.php
@@ -18,7 +18,7 @@ class TXT extends Provider {
/**
* {@inheritDoc}
*/
- public function isAvailable($file) {
+ public function isAvailable(\OCP\Files\FileInfo $file) {
return $file->getSize() > 5;
}
diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php
index 85bf609743d..9f78379ba0f 100644
--- a/lib/private/previewmanager.php
+++ b/lib/private/previewmanager.php
@@ -8,10 +8,87 @@
*/
namespace OC;
-use OCP\image;
use OCP\IPreview;
+use OCP\Preview\IProvider;
class PreviewManager implements IPreview {
+ /** @var \OCP\IConfig */
+ protected $config;
+
+ /** @var bool */
+ protected $providerListDirty = false;
+
+ /** @var bool */
+ protected $registeredCoreProviders = false;
+
+ /** @var array */
+ protected $providers = [];
+
+ /** @var array mime type => support status */
+ protected $mimeTypeSupportMap = [];
+
+ /** @var array */
+ protected $defaultProviders;
+
+ /**
+ * Constructor
+ *
+ * @param \OCP\IConfig $config
+ */
+ public function __construct(\OCP\IConfig $config) {
+ $this->config = $config;
+ }
+
+ /**
+ * In order to improve lazy loading a closure can be registered which will be
+ * called in case preview providers are actually requested
+ *
+ * $callable has to return an instance of \OCP\Preview\IProvider
+ *
+ * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider
+ * @param \Closure $callable
+ * @return void
+ */
+ public function registerProvider($mimeTypeRegex, \Closure $callable) {
+ if (!$this->config->getSystemValue('enable_previews', true)) {
+ return;
+ }
+
+ if (!isset($this->providers[$mimeTypeRegex])) {
+ $this->providers[$mimeTypeRegex] = [];
+ }
+ $this->providers[$mimeTypeRegex][] = $callable;
+ $this->providerListDirty = true;
+ }
+
+ /**
+ * Get all providers
+ * @return array
+ */
+ public function getProviders() {
+ if (!$this->config->getSystemValue('enable_previews', true)) {
+ return [];
+ }
+
+ $this->registerCoreProviders();
+ if ($this->providerListDirty) {
+ $keys = array_map('strlen', array_keys($this->providers));
+ array_multisort($keys, SORT_DESC, $this->providers);
+ $this->providerListDirty = false;
+ }
+
+ return $this->providers;
+ }
+
+ /**
+ * Does the manager have any providers
+ * @return bool
+ */
+ public function hasProviders() {
+ $this->registerCoreProviders();
+ return !empty($this->providers);
+ }
+
/**
* return a preview of a file
*
@@ -19,9 +96,9 @@ class PreviewManager implements IPreview {
* @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
- * @return \OCP\Image
+ * @return \OCP\IImage
*/
- function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) {
+ public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) {
$preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp);
return $preview->getPreview();
}
@@ -32,17 +109,198 @@ class PreviewManager implements IPreview {
* @param string $mimeType
* @return boolean
*/
- function isMimeSupported($mimeType = '*') {
- return \OC\Preview::isMimeSupported($mimeType);
+ public function isMimeSupported($mimeType = '*') {
+ if (!$this->config->getSystemValue('enable_previews', true)) {
+ return false;
+ }
+
+ if (isset($this->mimeTypeSupportMap[$mimeType])) {
+ return $this->mimeTypeSupportMap[$mimeType];
+ }
+
+ $this->registerCoreProviders();
+ $providerMimeTypes = array_keys($this->providers);
+ foreach ($providerMimeTypes as $supportedMimeType) {
+ if (preg_match($supportedMimeType, $mimeType)) {
+ $this->mimeTypeSupportMap[$mimeType] = true;
+ return true;
+ }
+ }
+ $this->mimeTypeSupportMap[$mimeType] = false;
+ return false;
}
/**
* Check if a preview can be generated for a file
*
- * @param \OC\Files\FileInfo $file
+ * @param \OCP\Files\FileInfo $file
* @return bool
*/
- function isAvailable($file) {
- return \OC\Preview::isAvailable($file);
+ public function isAvailable(\OCP\Files\FileInfo $file) {
+ if (!$this->config->getSystemValue('enable_previews', true)) {
+ return false;
+ }
+
+ $this->registerCoreProviders();
+ if (!$this->isMimeSupported($file->getMimetype())) {
+ return false;
+ }
+
+ $mount = $file->getMountPoint();
+ if ($mount and !$mount->getOption('previews', true)){
+ return false;
+ }
+
+ foreach ($this->providers as $supportedMimeType => $providers) {
+ if (preg_match($supportedMimeType, $file->getMimetype())) {
+ foreach ($providers as $closure) {
+ $provider = $closure();
+ if (!($provider instanceof IProvider)) {
+ continue;
+ }
+
+ /** @var $provider IProvider */
+ if ($provider->isAvailable($file)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * List of enabled default providers
+ *
+ * The following providers are enabled by default:
+ * - OC\Preview\Image
+ * - OC\Preview\MarkDown
+ * - OC\Preview\MP3
+ * - OC\Preview\TXT
+ *
+ * The following providers are disabled by default due to performance or privacy concerns:
+ * - OC\Preview\Font
+ * - OC\Preview\Illustrator
+ * - OC\Preview\Movie
+ * - OC\Preview\MSOfficeDoc
+ * - OC\Preview\MSOffice2003
+ * - OC\Preview\MSOffice2007
+ * - OC\Preview\OpenDocument
+ * - OC\Preview\PDF
+ * - OC\Preview\Photoshop
+ * - OC\Preview\Postscript
+ * - OC\Preview\StarOffice
+ * - OC\Preview\SVG
+ * - OC\Preview\TIFF
+ *
+ * @return array
+ */
+ protected function getEnabledDefaultProvider() {
+ if ($this->defaultProviders !== null) {
+ return $this->defaultProviders;
+ }
+
+ $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', [
+ 'OC\Preview\Image',
+ 'OC\Preview\MarkDown',
+ 'OC\Preview\MP3',
+ 'OC\Preview\TXT',
+ ]);
+ return $this->defaultProviders;
+ }
+
+ /**
+ * Register the default providers (if enabled)
+ *
+ * @param string $class
+ * @param string $mimeType
+ */
+ protected function registerCoreProvider($class, $mimeType, $options = []) {
+ if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
+ $this->registerProvider($mimeType, function () use ($class, $options) {
+ return new $class($options);
+ });
+ }
+ }
+
+ /**
+ * Register the default providers (if enabled)
+ */
+ protected function registerCoreProviders() {
+ if ($this->registeredCoreProviders) {
+ return;
+ }
+ $this->registeredCoreProviders = true;
+
+ $this->registerCoreProvider('OC\Preview\TXT', '/text\/plain/');
+ $this->registerCoreProvider('OC\Preview\MarkDown', '/text\/(x-)?markdown/');
+ $this->registerCoreProvider('OC\Preview\Image', '/image\/(?!tiff$)(?!svg.*).*/');
+ $this->registerCoreProvider('OC\Preview\MP3', '/audio\/mpeg/');
+
+ // SVG, Office and Bitmap require imagick
+ if (extension_loaded('imagick')) {
+ $checkImagick = new \Imagick();
+
+ $imagickProviders = [
+ 'SVG' => ['mimetype' => '/image\/svg\+xml/', 'class' => '\OC\Preview\SVG'],
+ 'TIFF' => ['mimetype' => '/image\/tiff/', 'class' => '\OC\Preview\TIFF'],
+ 'PDF' => ['mimetype' => '/application\/pdf/', 'class' => '\OC\Preview\PDF'],
+ 'AI' => ['mimetype' => '/application\/illustrator/', 'class' => '\OC\Preview\Illustrator'],
+ 'PSD' => ['mimetype' => '/application\/x-photoshop/', 'class' => '\OC\Preview\Photoshop'],
+ 'EPS' => ['mimetype' => '/application\/postscript/', 'class' => '\OC\Preview\Postscript'],
+ 'TTF' => ['mimetype' => '/application\/(?:font-sfnt|x-font$)/', 'class' => '\OC\Preview\Font'],
+ ];
+
+ foreach ($imagickProviders as $queryFormat => $provider) {
+ $class = $provider['class'];
+ if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
+ continue;
+ }
+
+ if (count($checkImagick->queryFormats($queryFormat)) === 1) {
+ $this->registerCoreProvider($class, $provider['mimetype']);
+ }
+ }
+
+ if (count($checkImagick->queryFormats('PDF')) === 1) {
+ // Office previews are currently not supported on Windows
+ if (!\OC_Util::runningOnWindows() && \OC_Helper::is_function_enabled('shell_exec')) {
+ $officeFound = is_string($this->config->getSystemValue('preview_libreoffice_path', null));
+
+ if (!$officeFound) {
+ //let's see if there is libreoffice or openoffice on this machine
+ $whichLibreOffice = shell_exec('command -v libreoffice');
+ $officeFound = !empty($whichLibreOffice);
+ if (!$officeFound) {
+ $whichOpenOffice = shell_exec('command -v openoffice');
+ $officeFound = !empty($whichOpenOffice);
+ }
+ }
+
+ if ($officeFound) {
+ $this->registerCoreProvider('\OC\Preview\MSOfficeDoc', '/application\/msword/');
+ $this->registerCoreProvider('\OC\Preview\MSOffice2003', '/application\/vnd.ms-.*/');
+ $this->registerCoreProvider('\OC\Preview\MSOffice2007', '/application\/vnd.openxmlformats-officedocument.*/');
+ $this->registerCoreProvider('\OC\Preview\OpenDocument', '/application\/vnd.oasis.opendocument.*/');
+ $this->registerCoreProvider('\OC\Preview\StarOffice', '/application\/vnd.sun.xml.*/');
+ }
+ }
+ }
+ }
+
+ // Video requires avconv or ffmpeg and is therefor
+ // currently not supported on Windows.
+ if (in_array('OC\Preview\Movie', $this->getEnabledDefaultProvider()) && !\OC_Util::runningOnWindows()) {
+ $avconvBinary = \OC_Helper::findBinaryPath('avconv');
+ $ffmpegBinary = ($avconvBinary) ? null : \OC_Helper::findBinaryPath('ffmpeg');
+
+ if ($avconvBinary || $ffmpegBinary) {
+ // FIXME // a bit hacky but didn't want to use subclasses
+ \OC\Preview\Movie::$avconvBinary = $avconvBinary;
+ \OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
+
+ $this->registerCoreProvider('\OC\Preview\Movie', '/video\/.*/');
+ }
+ }
}
}
diff --git a/lib/private/server.php b/lib/private/server.php
index 2f688c47f09..fd7a2bea2d1 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -12,6 +12,7 @@ use OC\Diagnostics\NullQueryLogger;
use OC\Diagnostics\EventLogger;
use OC\Diagnostics\QueryLogger;
use OC\Mail\Mailer;
+use OC\Memcache\ArrayCache;
use OC\Security\CertificateManager;
use OC\Files\Node\Root;
use OC\Files\View;
@@ -44,8 +45,8 @@ class Server extends SimpleContainer implements IServerContainer {
$this->registerService('ContactsManager', function ($c) {
return new ContactsManager();
});
- $this->registerService('PreviewManager', function ($c) {
- return new PreviewManager();
+ $this->registerService('PreviewManager', function (Server $c) {
+ return new PreviewManager($c->getConfig());
});
$this->registerService('TagMapper', function(Server $c) {
return new TagMapper($c->getDatabaseConnection());
@@ -147,7 +148,11 @@ class Server extends SimpleContainer implements IServerContainer {
});
$this->registerService('URLGenerator', function (Server $c) {
$config = $c->getConfig();
- return new \OC\URLGenerator($config);
+ $cacheFactory = $c->getMemCacheFactory();
+ return new \OC\URLGenerator(
+ $config,
+ $cacheFactory
+ );
});
$this->registerService('AppHelper', function ($c) {
return new \OC\AppHelper();
@@ -155,12 +160,25 @@ class Server extends SimpleContainer implements IServerContainer {
$this->registerService('UserCache', function ($c) {
return new UserCache();
});
- $this->registerService('MemCacheFactory', function ($c) {
+ $this->registerService('MemCacheFactory', function (Server $c) {
$config = $c->getConfig();
- $instanceId = \OC_Util::getInstanceId();
- return new \OC\Memcache\Factory($instanceId,
- $config->getSystemValue('memcache.local', null),
- $config->getSystemValue('memcache.distributed', null)
+
+ if($config->getSystemValue('installed', false)) {
+ $v = \OC_App::getAppVersions();
+ $v['core'] = implode('.', \OC_Util::getVersion());
+ $version = implode(',', $v);
+ $instanceId = \OC_Util::getInstanceId();
+ $path = \OC::$SERVERROOT;
+ $prefix = md5($instanceId.'-'.$version.'-'.$path);
+ return new \OC\Memcache\Factory($prefix,
+ $config->getSystemValue('memcache.local', null),
+ $config->getSystemValue('memcache.distributed', null)
+ );
+ }
+
+ return new \OC\Memcache\Factory('',
+ new ArrayCache(),
+ new ArrayCache()
);
});
$this->registerService('ActivityManager', function ($c) {
diff --git a/lib/private/session/internal.php b/lib/private/session/internal.php
index 8fda6b3b3ee..acd93630f40 100644
--- a/lib/private/session/internal.php
+++ b/lib/private/session/internal.php
@@ -18,7 +18,9 @@ namespace OC\Session;
class Internal extends Session {
public function __construct($name) {
session_name($name);
+ set_error_handler(array($this, 'trapError'));
session_start();
+ restore_error_handler();
if (!isset($_SESSION)) {
throw new \Exception('Failed to start session');
}
@@ -82,7 +84,11 @@ class Internal extends Session {
throw new \Exception('The session cannot be reopened - reopen() is ony to be used in unit testing.');
}
- private function validateSession() {
+ public function trapError($errorNumber, $errorString) {
+ throw new \ErrorException($errorString);
+ }
+
+ private function validateSession() {
if ($this->sessionClosed) {
throw new \Exception('Session has been closed - no further changes to the session as allowed');
}
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 974ebf41f93..dff3af56f40 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -1097,9 +1097,17 @@ class Share extends \OC\Share\Constants {
*/
public static function setExpirationDate($itemType, $itemSource, $date, $shareTime = null) {
$user = \OC_User::getUser();
+ $l = \OC::$server->getL10N('lib');
if ($date == '') {
- $date = null;
+ if (\OCP\Util::isDefaultExpireDateEnforced()) {
+ $warning = 'Cannot clear expiration date. Shares are required to have an expiration date.';
+ $warning_t = $l->t('Cannot clear expiration date. Shares are required to have an expiration date.');
+ \OCP\Util::writeLog('OCP\Share', $warning, \OCP\Util::WARN);
+ throw new \Exception($warning_t);
+ } else {
+ $date = null;
+ }
} else {
$date = self::validateExpireDate($date, $shareTime, $itemType, $itemSource);
}
diff --git a/lib/private/tags.php b/lib/private/tags.php
index 200ec8c2771..276da9d4b80 100644
--- a/lib/private/tags.php
+++ b/lib/private/tags.php
@@ -34,8 +34,8 @@
namespace OC;
-use \OC\Tagging\Tag,
- \OC\Tagging\TagMapper;
+use \OC\Tagging\Tag;
+use \OC\Tagging\TagMapper;
class Tags implements \OCP\ITags {
@@ -248,6 +248,7 @@ class Tags implements \OCP\ITags {
*
* @param string $tag Tag id or name.
* @return array|false An array of object ids or false on error.
+ * @throws \Exception
*/
public function getIdsForTag($tag) {
$result = null;
diff --git a/lib/private/template.php b/lib/private/template.php
index b0d212c6f53..e6b76cc664e 100644
--- a/lib/private/template.php
+++ b/lib/private/template.php
@@ -217,6 +217,7 @@ class OC_Template extends \OC\Template\Base {
public static function printExceptionErrorPage(Exception $exception) {
$request = \OC::$server->getRequest();
$content = new \OC_Template('', 'exception', 'error', false);
+ $content->assign('errorClass', get_class($exception));
$content->assign('errorMsg', $exception->getMessage());
$content->assign('errorCode', $exception->getCode());
$content->assign('file', $exception->getFile());
diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php
index 3220d9d969c..3f8422b9f0b 100644
--- a/lib/private/templatelayout.php
+++ b/lib/private/templatelayout.php
@@ -242,7 +242,11 @@ class OC_TemplateLayout extends OC_Template {
private static function hashFileNames($files) {
foreach($files as $i => $file) {
- $files[$i] = self::convertToRelativePath($file[0]).'/'.$file[2];
+ try {
+ $files[$i] = self::convertToRelativePath($file[0]).'/'.$file[2];
+ } catch (\Exception $e) {
+ $files[$i] = $file[0].'/'.$file[2];
+ }
}
sort($files);
diff --git a/lib/private/updater.php b/lib/private/updater.php
index 4d813ee3d39..419cd7db6c0 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -10,6 +10,7 @@ namespace OC;
use OC\Hooks\BasicEmitter;
use OC_App;
+use OC_Installer;
use OC_Util;
use OCP\IConfig;
use OC\Setup;
@@ -233,9 +234,14 @@ class Updater extends BasicEmitter {
if ($this->updateStepEnabled) {
$this->doCoreUpgrade();
- $this->checkAppsRequirements();
+ // update all shipped apps
+ $disabledApps = $this->checkAppsRequirements();
$this->doAppUpgrade();
+ // upgrade appstore apps
+ $this->upgradeAppStoreApps($disabledApps);
+
+
// post-upgrade repairs
$repair = new Repair(Repair::getRepairSteps());
$this->emitRepairMessages($repair);
@@ -356,6 +362,7 @@ class Updater extends BasicEmitter {
$isCoreUpgrade = $this->isCodeUpgrade();
$apps = OC_App::getEnabledApps();
$version = OC_Util::getVersion();
+ $disabledApps = [];
foreach ($apps as $app) {
// check if the app is compatible with this version of ownCloud
$info = OC_App::getAppInfo($app);
@@ -378,8 +385,10 @@ class Updater extends BasicEmitter {
// disable any other 3rd party apps
\OC_App::disable($app);
+ $disabledApps[]= $app;
$this->emit('\OC\Updater', 'thirdPartyAppDisabled', array($app));
}
+ return $disabledApps;
}
private function isCodeUpgrade() {
@@ -390,5 +399,16 @@ class Updater extends BasicEmitter {
}
return false;
}
+
+ private function upgradeAppStoreApps($disabledApps) {
+ foreach($disabledApps as $app) {
+ if (OC_Installer::isUpdateAvailable($app)) {
+ $ocsId = \OC::$server->getConfig()->getAppValue($app, 'ocsid', '');
+
+ $this->emit('\OC\Updater', 'upgradeAppStoreApp', array($app));
+ OC_Installer::updateAppByOCSId($ocsId);
+ }
+ }
+ }
}
diff --git a/lib/private/urlgenerator.php b/lib/private/urlgenerator.php
index e87a6c354fb..93666a86780 100644
--- a/lib/private/urlgenerator.php
+++ b/lib/private/urlgenerator.php
@@ -9,6 +9,8 @@
namespace OC;
use OC_Defaults;
+use OCP\ICacheFactory;
+use OCP\IConfig;
use OCP\IURLGenerator;
use RuntimeException;
@@ -16,17 +18,19 @@ use RuntimeException;
* Class to generate URLs
*/
class URLGenerator implements IURLGenerator {
-
- /**
- * @var \OCP\IConfig
- */
+ /** @var IConfig */
private $config;
+ /** @var ICacheFactory */
+ private $cacheFactory;
/**
- * @param \OCP\IConfig $config
+ * @param IConfig $config
+ * @param ICacheFactory $cacheFactory
*/
- public function __construct($config) {
+ public function __construct(IConfig $config,
+ ICacheFactory $cacheFactory) {
$this->config = $config;
+ $this->cacheFactory = $cacheFactory;
}
/**
@@ -113,6 +117,12 @@ class URLGenerator implements IURLGenerator {
* Returns the path to the image.
*/
public function imagePath($app, $image) {
+ $cache = $this->cacheFactory->create('imagePath');
+ $cacheKey = $app.'-'.$image;
+ if($key = $cache->get($cacheKey)) {
+ return $key;
+ }
+
// Read the selected theme from the config file
$theme = \OC_Util::getTheme();
@@ -120,33 +130,39 @@ class URLGenerator implements IURLGenerator {
$basename = substr(basename($image),0,-4);
// Check if the app is in the app folder
+ $path = '';
if (file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$image")) {
- return \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$image";
+ $path = \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$image";
} elseif (!file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$basename.svg")
&& file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$basename.png")) {
- return \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$basename.png";
+ $path = \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$basename.png";
} elseif (file_exists(\OC_App::getAppPath($app) . "/img/$image")) {
- return \OC_App::getAppWebPath($app) . "/img/$image";
+ $path = \OC_App::getAppWebPath($app) . "/img/$image";
} elseif (!file_exists(\OC_App::getAppPath($app) . "/img/$basename.svg")
&& file_exists(\OC_App::getAppPath($app) . "/img/$basename.png")) {
- return \OC_App::getAppPath($app) . "/img/$basename.png";
+ $path = \OC_App::getAppPath($app) . "/img/$basename.png";
} elseif (!empty($app) and file_exists(\OC::$SERVERROOT . "/themes/$theme/$app/img/$image")) {
- return \OC::$WEBROOT . "/themes/$theme/$app/img/$image";
+ $path = \OC::$WEBROOT . "/themes/$theme/$app/img/$image";
} elseif (!empty($app) and (!file_exists(\OC::$SERVERROOT . "/themes/$theme/$app/img/$basename.svg")
&& file_exists(\OC::$SERVERROOT . "/themes/$theme/$app/img/$basename.png"))) {
- return \OC::$WEBROOT . "/themes/$theme/$app/img/$basename.png";
+ $path = \OC::$WEBROOT . "/themes/$theme/$app/img/$basename.png";
} elseif (!empty($app) and file_exists(\OC::$SERVERROOT . "/$app/img/$image")) {
- return \OC::$WEBROOT . "/$app/img/$image";
+ $path = \OC::$WEBROOT . "/$app/img/$image";
} elseif (!empty($app) and (!file_exists(\OC::$SERVERROOT . "/$app/img/$basename.svg")
&& file_exists(\OC::$SERVERROOT . "/$app/img/$basename.png"))) {
- return \OC::$WEBROOT . "/$app/img/$basename.png";
+ $path = \OC::$WEBROOT . "/$app/img/$basename.png";
} elseif (file_exists(\OC::$SERVERROOT . "/themes/$theme/core/img/$image")) {
- return \OC::$WEBROOT . "/themes/$theme/core/img/$image";
+ $path = \OC::$WEBROOT . "/themes/$theme/core/img/$image";
} elseif (!file_exists(\OC::$SERVERROOT . "/themes/$theme/core/img/$basename.svg")
&& file_exists(\OC::$SERVERROOT . "/themes/$theme/core/img/$basename.png")) {
- return \OC::$WEBROOT . "/themes/$theme/core/img/$basename.png";
+ $path = \OC::$WEBROOT . "/themes/$theme/core/img/$basename.png";
} elseif (file_exists(\OC::$SERVERROOT . "/core/img/$image")) {
- return \OC::$WEBROOT . "/core/img/$image";
+ $path = \OC::$WEBROOT . "/core/img/$image";
+ }
+
+ if($path !== '') {
+ $cache->set($cacheKey, $path);
+ return $path;
} else {
throw new RuntimeException('image not found: image:' . $image . ' webroot:' . \OC::$WEBROOT . ' serverroot:' . \OC::$SERVERROOT);
}
diff --git a/lib/private/util.php b/lib/private/util.php
index 11366d450a9..a048996da6e 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -98,6 +98,14 @@ class OC_Util {
return false;
}
+ \OC\Files\Filesystem::addStorageWrapper('mount_options', function($mountPoint, \OCP\Files\Storage $storage, \OCP\Files\Mount\IMountPoint $mount) {
+ if($storage->instanceOfStorage('\OC\Files\Storage\Common')) {
+ /** @var \OC\Files\Storage\Common $storage */
+ $storage->setMountOptions($mount->getOptions());
+ }
+ return $storage;
+ });
+
//if we aren't logged in, there is no use to set up the filesystem
if ($user != "") {
\OC\Files\Filesystem::addStorageWrapper('oc_quota', function ($mountPoint, $storage) {
@@ -127,9 +135,6 @@ class OC_Util {
//jail the user into his "home" directory
\OC\Files\Filesystem::init($user, $userDir);
- $fileOperationProxy = new OC_FileProxy_FileOperations();
- OC_FileProxy::register($fileOperationProxy);
-
//trigger creation of user home and /files folder
\OC::$server->getUserFolder($user);
diff --git a/lib/public/app.php b/lib/public/app.php
index bef4e96ae02..736c2b64c7d 100644
--- a/lib/public/app.php
+++ b/lib/public/app.php
@@ -49,8 +49,6 @@ class App {
/**
* Adds an entry to the navigation
- * @param array $data containing the data
- * @return boolean
*
* This function adds a new entry to the navigation visible to users. $data
* is an associative array.
@@ -62,10 +60,17 @@ class App {
* The following keys are optional:
* - icon: path to the icon of the app
* - order: integer, that influences the position of your application in
- * the navigation. Lower values come first.
+ * the navigation. Lower values come first.
+ *
+ * @param array $data containing the data
+ * @return boolean
+ *
+ * @deprecated Use \OC::$server->getNavigationManager()->add() instead to
+ * register a closure, this helps to speed up all requests against ownCloud
*/
- public static function addNavigationEntry( $data ) {
- return \OC_App::addNavigationEntry( $data );
+ public static function addNavigationEntry($data) {
+ \OC::$server->getNavigationManager()->add($data);
+ return true;
}
/**
@@ -76,6 +81,8 @@ class App {
* This function sets a navigation entry as active and removes the 'active'
* property from all other entries. The templates can use this for
* highlighting the current position of the user.
+ *
+ * @deprecated Use \OC::$server->getNavigationManager()->setActiveEntry() instead
*/
public static function setActiveNavigationEntry( $id ) {
return \OC_App::setActiveNavigationEntry( $id );
diff --git a/lib/public/appframework/db/mapper.php b/lib/public/appframework/db/mapper.php
index 5143547c8e8..9a5d6e819b9 100644
--- a/lib/public/appframework/db/mapper.php
+++ b/lib/public/appframework/db/mapper.php
@@ -26,7 +26,8 @@
namespace OCP\AppFramework\Db;
-use \OCP\IDBConnection;
+use OCP\IDBConnection;
+use OCP\IDb;
/**
@@ -183,6 +184,31 @@ abstract class Mapper {
return $entity;
}
+ /**
+ * Checks if an array is associative
+ * @param array $array
+ * @return bool true if associative
+ */
+ private function isAssocArray(array $array) {
+ return array_values($array) !== $array;
+ }
+
+ /**
+ * Returns the correct PDO constant based on the value type
+ * @param $value
+ * @return PDO constant
+ */
+ private function getPDOType($value) {
+ switch (gettype($value)) {
+ case 'integer':
+ return \PDO::PARAM_INT;
+ case 'boolean':
+ return \PDO::PARAM_BOOL;
+ default:
+ return \PDO::PARAM_STR;
+ }
+ }
+
/**
* Runs an sql query
@@ -193,32 +219,37 @@ abstract class Mapper {
* @return \PDOStatement the database query result
*/
protected function execute($sql, array $params=[], $limit=null, $offset=null){
- $query = $this->db->prepare($sql, $limit, $offset);
-
- $index = 1; // bindParam is 1 indexed
- foreach($params as $param) {
-
- switch (gettype($param)) {
- case 'integer':
- $pdoConstant = \PDO::PARAM_INT;
- break;
-
- case 'boolean':
- $pdoConstant = \PDO::PARAM_BOOL;
- break;
+ if ($this->db instanceof IDb) {
+ $query = $this->db->prepareQuery($sql, $limit, $offset);
+ } else {
+ $query = $this->db->prepare($sql, $limit, $offset);
+ }
- default:
- $pdoConstant = \PDO::PARAM_STR;
- break;
+ if ($this->isAssocArray($params)) {
+ foreach ($params as $key => $param) {
+ $pdoConstant = $this->getPDOType($param);
+ $query->bindValue($key, $param, $pdoConstant);
}
+ } else {
+ $index = 1; // bindParam is 1 indexed
+ foreach ($params as $param) {
+ $pdoConstant = $this->getPDOType($param);
+ $query->bindValue($index, $param, $pdoConstant);
+ $index++;
+ }
+ }
- $query->bindValue($index, $param, $pdoConstant);
+ $result = $query->execute();
- $index++;
+ // this is only for backwards compatibility reasons and can be removed
+ // in owncloud 10. IDb returns a StatementWrapper from execute, PDO,
+ // Doctrine and IDbConnection don't so this needs to be done in order
+ // to stay backwards compatible for the things that rely on the
+ // StatementWrapper being returned
+ if ($result instanceof \OC_DB_StatementWrapper) {
+ return $result;
}
- $query->execute();
-
return $query;
}
diff --git a/lib/public/appframework/http/notfoundresponse.php b/lib/public/appframework/http/notfoundresponse.php
new file mode 100644
index 00000000000..21f0461f5e6
--- /dev/null
+++ b/lib/public/appframework/http/notfoundresponse.php
@@ -0,0 +1,43 @@
+<?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 OCP\AppFramework\Http;
+
+use OCP\AppFramework\Http;
+use OCP\Template;
+
+/**
+ * A generic 404 response showing an 404 error page as well to the end-user
+ */
+class NotFoundResponse extends Response {
+
+ public function __construct() {
+ $this->setStatus(404);
+ }
+
+ /**
+ * @return string
+ */
+ public function render() {
+ $template = new Template('core', '404', 'guest');
+ return $template->fetchPage();
+ }
+}
diff --git a/lib/public/files/mount/imountpoint.php b/lib/public/files/mount/imountpoint.php
index af7819ae160..2ec0cca1dce 100644
--- a/lib/public/files/mount/imountpoint.php
+++ b/lib/public/files/mount/imountpoint.php
@@ -64,4 +64,11 @@ interface IMountPoint {
* @return mixed
*/
public function getOption($name, $default);
+
+ /**
+ * Get all options for the mount
+ *
+ * @return array
+ */
+ public function getOptions();
}
diff --git a/lib/public/files/storage/istoragefactory.php b/lib/public/files/storage/istoragefactory.php
index 50c844af2e6..7d4fa55e418 100644
--- a/lib/public/files/storage/istoragefactory.php
+++ b/lib/public/files/storage/istoragefactory.php
@@ -7,6 +7,7 @@
*/
namespace OCP\Files\Storage;
+use OCP\Files\Mount\IMountPoint;
/**
* Creates storage instances and manages and applies storage wrappers
@@ -25,10 +26,10 @@ interface IStorageFactory {
public function addStorageWrapper($wrapperName, $callback);
/**
- * @param string|boolean $mountPoint
+ * @param \OCP\Files\Mount\IMountPoint $mountPoint
* @param string $class
* @param array $arguments
* @return \OCP\Files\Storage
*/
- public function getInstance($mountPoint, $class, $arguments);
+ public function getInstance(IMountPoint $mountPoint, $class, $arguments);
}
diff --git a/lib/public/iavatar.php b/lib/public/iavatar.php
index 8f432c23fb8..984fe1075b4 100644
--- a/lib/public/iavatar.php
+++ b/lib/public/iavatar.php
@@ -16,7 +16,7 @@ interface IAvatar {
/**
* get the users avatar
* @param int $size size in px of the avatar, avatars are square, defaults to 64
- * @return boolean|\OC_Image containing the avatar or false if there's no image
+ * @return boolean|\OCP\IImage containing the avatar or false if there's no image
*/
function get($size = 64);
@@ -29,7 +29,7 @@ interface IAvatar {
/**
* sets the users avatar
- * @param \OC_Image|resource|string $data OC_Image, imagedata or path to set a new avatar
+ * @param \OCP\IImage|resource|string $data An image object, imagedata or path to set a new avatar
* @throws \Exception if the provided file is not a jpg or png image
* @throws \Exception if the provided image is not valid
* @throws \OC\NotSquareException if the image is not square
diff --git a/lib/public/iimage.php b/lib/public/iimage.php
new file mode 100644
index 00000000000..01d8e101330
--- /dev/null
+++ b/lib/public/iimage.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Joas Schilling
+ * @copyright 2015 Joas Schilling nickvergessen@owncloud.com
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCP;
+
+/**
+ * Class for basic image manipulation
+ */
+interface IImage {
+ /**
+ * Determine whether the object contains an image resource.
+ *
+ * @return bool
+ */
+ public function valid();
+
+ /**
+ * Returns the MIME type of the image or an empty string if no image is loaded.
+ *
+ * @return string
+ */
+ public function mimeType();
+
+ /**
+ * Returns the width of the image or -1 if no image is loaded.
+ *
+ * @return int
+ */
+ public function width();
+
+ /**
+ * Returns the height of the image or -1 if no image is loaded.
+ *
+ * @return int
+ */
+ public function height();
+
+ /**
+ * Returns the width when the image orientation is top-left.
+ *
+ * @return int
+ */
+ public function widthTopLeft();
+
+ /**
+ * Returns the height when the image orientation is top-left.
+ *
+ * @return int
+ */
+ public function heightTopLeft();
+
+ /**
+ * Outputs the image.
+ *
+ * @param string $mimeType
+ * @return bool
+ */
+ public function show($mimeType = null);
+
+ /**
+ * Saves the image.
+ *
+ * @param string $filePath
+ * @param string $mimeType
+ * @return bool
+ */
+ public function save($filePath = null, $mimeType = null);
+
+ /**
+ * @return resource Returns the image resource in any.
+ */
+ public function resource();
+
+ /**
+ * @return string Returns the raw image data.
+ */
+ public function data();
+
+ /**
+ * (I'm open for suggestions on better method name ;)
+ * Get the orientation based on EXIF data.
+ *
+ * @return int The orientation or -1 if no EXIF data is available.
+ */
+ public function getOrientation();
+
+ /**
+ * (I'm open for suggestions on better method name ;)
+ * Fixes orientation based on EXIF data.
+ *
+ * @return bool.
+ */
+ public function fixOrientation();
+
+ /**
+ * Resizes the image preserving ratio.
+ *
+ * @param integer $maxSize The maximum size of either the width or height.
+ * @return bool
+ */
+ public function resize($maxSize);
+
+ /**
+ * @param int $width
+ * @param int $height
+ * @return bool
+ */
+ public function preciseResize($width, $height);
+
+ /**
+ * Crops the image to the middle square. If the image is already square it just returns.
+ *
+ * @param int $size maximum size for the result (optional)
+ * @return bool for success or failure
+ */
+ public function centerCrop($size = 0);
+
+ /**
+ * Crops the image from point $x$y with dimension $wx$h.
+ *
+ * @param int $x Horizontal position
+ * @param int $y Vertical position
+ * @param int $w Width
+ * @param int $h Height
+ * @return bool for success or failure
+ */
+ public function crop($x, $y, $w, $h);
+
+ /**
+ * Resizes the image to fit within a boundary while preserving ratio.
+ *
+ * @param integer $maxWidth
+ * @param integer $maxHeight
+ * @return bool
+ */
+ public function fitIn($maxWidth, $maxHeight);
+}
diff --git a/lib/public/ipreview.php b/lib/public/ipreview.php
index cc756ef80d3..202b0d03948 100644
--- a/lib/public/ipreview.php
+++ b/lib/public/ipreview.php
@@ -36,8 +36,30 @@ namespace OCP;
/**
* This class provides functions to render and show thumbnails and previews of files
*/
-interface IPreview
-{
+interface IPreview {
+ /**
+ * In order to improve lazy loading a closure can be registered which will be
+ * called in case preview providers are actually requested
+ *
+ * $callable has to return an instance of \OCP\Preview\IProvider
+ *
+ * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider
+ * @param \Closure $callable
+ * @return void
+ */
+ public function registerProvider($mimeTypeRegex, \Closure $callable);
+
+ /**
+ * Get all providers
+ * @return array
+ */
+ public function getProviders();
+
+ /**
+ * Does the manager have any providers
+ * @return bool
+ */
+ public function hasProviders();
/**
* Return a preview of a file
@@ -45,9 +67,9 @@ interface IPreview
* @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
- * @return \OCP\Image
+ * @return \OCP\IImage
*/
- function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false);
+ public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false);
/**
@@ -55,7 +77,7 @@ interface IPreview
* @param string $mimeType
* @return boolean
*/
- function isMimeSupported($mimeType = '*');
+ public function isMimeSupported($mimeType = '*');
/**
* Check if a preview can be generated for a file
@@ -63,5 +85,5 @@ interface IPreview
* @param \OCP\Files\FileInfo $file
* @return bool
*/
- function isAvailable($file);
+ public function isAvailable(\OCP\Files\FileInfo $file);
}
diff --git a/lib/public/preview/iprovider.php b/lib/public/preview/iprovider.php
new file mode 100644
index 00000000000..4318ecd37ac
--- /dev/null
+++ b/lib/public/preview/iprovider.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Joas Schilling
+ * @copyright 2015 Joas Schilling nickvergessen@owncloud.com
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+namespace OCP\Preview;
+
+interface IProvider {
+ /**
+ * @return string Regex with the mimetypes that are supported by this provider
+ */
+ public function getMimeType();
+
+ /**
+ * Check if a preview can be generated for $path
+ *
+ * @param \OCP\Files\FileInfo $file
+ * @return bool
+ */
+ public function isAvailable(\OCP\Files\FileInfo $file);
+
+ /**
+ * get thumbnail for file at path $path
+ *
+ * @param string $path Path of file
+ * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
+ * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
+ * @param bool $scalingup Disable/Enable upscaling of previews
+ * @param \OC\Files\View $fileview fileview object of user folder
+ * @return bool|\OCP\IImage false if no preview was generated
+ */
+ public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview);
+}
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index ad55c63c21a..e9ce4c73a42 100644
--- a/lib/repair/repairmimetypes.php
+++ b/lib/repair/repairmimetypes.php
@@ -17,7 +17,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
public function getName() {
return 'Repair mime types';
}
-
+
private static function existsStmt() {
return \OC_DB::prepare('
SELECT count(`mimetype`)
@@ -51,14 +51,14 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
) WHERE `mimetype` = ?
');
}
-
+
private static function deleteStmt() {
return \OC_DB::prepare('
DELETE FROM `*PREFIX*mimetypes`
WHERE `id` = ?
');
- }
-
+ }
+
private static function updateByNameStmt() {
return \OC_DB::prepare('
UPDATE `*PREFIX*filecache`
@@ -66,10 +66,10 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
SELECT `id`
FROM `*PREFIX*mimetypes`
WHERE `mimetype` = ?
- ) WHERE `name` LIKE ?
+ ) WHERE `name` ILIKE ?
');
}
-
+
private function repairMimetypes($wrongMimetypes) {
foreach ($wrongMimetypes as $wrong => $correct) {
// do we need to remove a wrong mimetype?
@@ -81,8 +81,8 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
$result = \OC_DB::executeAudited(self::existsStmt(), array($correct));
$exists = $result->fetchOne();
- if ( ! is_null($correct) ) {
- if ( ! $exists ) {
+ if (!is_null($correct)) {
+ if (!$exists) {
// insert mimetype
\OC_DB::executeAudited(self::insertStmt(), array($correct));
}
@@ -90,27 +90,27 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
// change wrong mimetype to correct mimetype in filecache
\OC_DB::executeAudited(self::updateWrongStmt(), array($correct, $wrongId));
}
-
+
// delete wrong mimetype
\OC_DB::executeAudited(self::deleteStmt(), array($wrongId));
}
}
}
-
+
private function updateMimetypes($updatedMimetypes) {
-
- foreach ($updatedMimetypes as $extension => $mimetype ) {
+
+ foreach ($updatedMimetypes as $extension => $mimetype) {
$result = \OC_DB::executeAudited(self::existsStmt(), array($mimetype));
$exists = $result->fetchOne();
- if ( ! $exists ) {
+ if (!$exists) {
// insert mimetype
\OC_DB::executeAudited(self::insertStmt(), array($mimetype));
}
// change mimetype for files with x extension
- \OC_DB::executeAudited(self::updateByNameStmt(), array($mimetype, '%.'.$extension));
+ \OC_DB::executeAudited(self::updateByNameStmt(), array($mimetype, '%.' . $extension));
}
}
@@ -132,9 +132,9 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
// separate doc from docx etc
self::updateMimetypes($updatedMimetypes);
-
+
}
-
+
private function fixApkMimeType() {
$updatedMimetypes = array(
'apk' => 'application/vnd.android.package-archive',
@@ -142,7 +142,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
self::updateMimetypes($updatedMimetypes);
}
-
+
private function fixFontsMimeTypes() {
// update wrong mimetypes
$wrongMimetypes = array(
@@ -152,7 +152,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
);
self::repairMimetypes($wrongMimetypes);
-
+
$updatedMimetypes = array(
'ttf' => 'application/font-sfnt',
'otf' => 'application/font-sfnt',
@@ -161,7 +161,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
self::updateMimetypes($updatedMimetypes);
}
-
+
private function fixPostscriptMimeType() {
$updatedMimetypes = array(
'eps' => 'application/postscript',
@@ -195,6 +195,15 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
self::updateMimetypes($updatedMimetypes);
}
+ private function introduce3dImagesMimeType() {
+ $updatedMimetypes = array(
+ 'jps' => 'image/jpeg',
+ 'mpo' => 'image/jpeg',
+ );
+
+ self::updateMimetypes($updatedMimetypes);
+ }
+
/**
* Fix mime types
*/
@@ -202,15 +211,15 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
if ($this->fixOfficeMimeTypes()) {
$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
}
-
+
if ($this->fixApkMimeType()) {
$this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
}
-
+
if ($this->fixFontsMimeTypes()) {
$this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
}
-
+
if ($this->fixPostscriptMimeType()) {
$this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
}
@@ -218,5 +227,9 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
if ($this->introduceRawMimeType()) {
$this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
}
+
+ if ($this->introduce3dImagesMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
+ }
}
}
diff --git a/settings/admin.php b/settings/admin.php
index da25ab55a93..6ec4cef350d 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -118,7 +118,6 @@ $formsAndMore = array_merge($formsAndMore, $formsMap);
// add bottom hardcoded forms from the template
$formsAndMore[] = array('anchor' => 'backgroundjobs', 'section-name' => $l->t('Cron'));
$formsAndMore[] = array('anchor' => 'shareAPI', 'section-name' => $l->t('Sharing'));
-$formsAndMore[] = array('anchor' => 'security', 'section-name' => $l->t('Security'));
$formsAndMore[] = array('anchor' => 'mail_general_settings', 'section-name' => $l->t('Email Server'));
$formsAndMore[] = array('anchor' => 'log-section', 'section-name' => $l->t('Log'));
diff --git a/settings/controller/appsettingscontroller.php b/settings/controller/appsettingscontroller.php
index e209ba69a9e..634f681aaae 100644
--- a/settings/controller/appsettingscontroller.php
+++ b/settings/controller/appsettingscontroller.php
@@ -78,7 +78,6 @@ class AppSettingsController extends Controller {
}
}
- $categories['status'] = 'success';
$this->cache->set('listCategories', $categories, 3600);
return $categories;
diff --git a/settings/controller/userscontroller.php b/settings/controller/userscontroller.php
index 11afe514016..a6faa3c4a1d 100644
--- a/settings/controller/userscontroller.php
+++ b/settings/controller/userscontroller.php
@@ -286,6 +286,15 @@ class UsersController extends Controller {
}
}
+ if ($this->userManager->userExists($username)) {
+ return new DataResponse(
+ array(
+ 'message' => (string)$this->l10n->t('A user with that name already exists.')
+ ),
+ Http::STATUS_CONFLICT
+ );
+ }
+
try {
$user = $this->userManager->createUser($username, $password);
} catch (\Exception $exception) {
diff --git a/settings/css/settings.css b/settings/css/settings.css
index e2349e9dd68..24f7791bae4 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -14,6 +14,10 @@ input#openid, input#webdav { width:20em; }
}
/* Sync clients */
+.clientsbox {
+ padding-top: 30px;
+ margin-top: -30px;
+}
.clientsbox h2 {
font-size: 20px;
margin: 35px 0 10px;
@@ -55,10 +59,37 @@ table.nostyle td { padding: 0.2em 0; }
content: '+'; font-weight: bold; font-size: 150%;
}
+#newgroup-form {
+ height: 44px;
+}
+#newgroupname {
+ margin: 6px;
+ width: 95%;
+ padding-right: 32px;
+ box-sizing: border-box
+}
+#newgroup-form .button {
+ position: absolute;
+ right: 0;
+ top: 3px;
+ height: 32px;
+ width: 32px;
+}
+
.ie8 #newgroup-form .icon-add {
height: 30px;
}
+.isgroup .groupname {
+ width: 85%;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.isgroup.active .groupname {
+ width: 65%;
+}
+
.usercount { float: left; margin: 5px; }
li.active span.utils .delete {
float: left; position: relative; opacity: 0.5;
@@ -78,7 +109,6 @@ span.utils .delete, .rename { display: none; }
#app-navigation ul li.active > span.utils .rename { display: block; }
#usersearchform { position: absolute; top: 2px; right: 250px; }
#usersearchform label { font-weight: 700; }
-form { display:inline; }
/* display table at full width */
table.grid {
@@ -99,10 +129,14 @@ span.usersLastLoginTooltip { white-space: nowrap; }
display : none;
}
-td.remove { width:1em; padding-right:1em; }
tr:hover>td.password>span, tr:hover>td.displayName>span { margin:0; cursor:pointer; }
tr:hover>td.remove>a, tr:hover>td.password>img,tr:hover>td.displayName>img, tr:hover>td.quota>img { visibility:visible; cursor:pointer; }
-tr:hover>td.remove>a { float:right; }
+td.remove {
+ width: 25px;
+}
+tr:hover>td.remove>a {
+ float: left;
+}
div.recoveryPassword { left:50em; display:block; position:absolute; top:-1px; }
input#recoveryPassword {width:15em;}
@@ -117,15 +151,26 @@ select.quota.active { background: #fff; }
input.userFilter {width: 200px;}
/* positioning fixes */
+#newuser {
+ padding-left: 3px;
+}
#newuser .multiselect {
min-width: 150px !important;
}
#newuser .multiselect,
#newusergroups + input[type='submit'] {
position: relative;
- top: 1px;
+ top: -1px;
+}
+#headerGroups,
+#headerSubAdmins,
+#headerQuota {
+ padding-left: 18px;
+}
+#headerAvatar {
+ width: 32px;
}
-#headerGroups, #headerSubAdmins, #headerQuota { padding-left:18px; }
+
.ie8 table.hascontrols{border-collapse:collapse;width: 100%;}
.ie8 table.hascontrols tbody tr{border-collapse:collapse;border: 1px solid #ddd !important;}
@@ -194,6 +239,21 @@ span.version { margin-left:1em; margin-right:1em; color:#555; }
.recommendedapp {
display: inline-block;
}
+
+.app-description-toggle-show,
+.app-description-toggle-hide {
+ clear: both;
+ padding: 7px 0;
+ cursor: pointer;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ opacity: .5;
+}
+.app-description-container {
+ clear: both;
+ position: relative;
+ top: 7px;
+}
+
.app-description {
clear: both;
}
@@ -348,3 +408,11 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
font-weight: normal;
margin-top: 5px;
}
+
+#admin-tips li {
+ list-style: initial;
+}
+#admin-tips li a {
+ display: inline-block;
+ padding: 3px 0;
+}
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 7330f426af7..8431cbd4ff4 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -63,7 +63,9 @@ OC.Settings.Apps = OC.Settings.Apps || {
}
$('#apps-list')
.addClass('icon-loading')
+ .removeClass('hidden')
.html('');
+ $('#apps-list-empty').addClass('hidden');
$('#app-category-' + OC.Settings.Apps.State.currentCategory).removeClass('active');
$('#app-category-' + categoryId).addClass('active');
OC.Settings.Apps.State.currentCategory = categoryId;
@@ -73,14 +75,19 @@ OC.Settings.Apps = OC.Settings.Apps || {
}), {
data:{},
type:'GET',
- success:function (apps) {
+ success: function (apps) {
OC.Settings.Apps.State.apps = _.indexBy(apps.apps, 'id');
var source = $("#app-template").html();
var template = Handlebars.compile(source);
- _.each(apps.apps, function(app) {
- OC.Settings.Apps.renderApp(app, template, null);
- });
+ if (apps.apps.length) {
+ _.each(apps.apps, function(app) {
+ OC.Settings.Apps.renderApp(app, template, null);
+ });
+ } else {
+ $('#apps-list').addClass('hidden');
+ $('#apps-list-empty').removeClass('hidden');
+ }
},
complete: function() {
$('#apps-list').removeClass('icon-loading');
@@ -369,6 +376,17 @@ OC.Settings.Apps = OC.Settings.Apps || {
OC.Settings.Apps.loadCategory(categoryId);
});
+ $(document).on('click', '.app-description-toggle-show', function () {
+ $(this).addClass('hidden');
+ $(this).siblings('.app-description-toggle-hide').removeClass('hidden');
+ $(this).siblings('.app-description-container').slideDown();
+ });
+ $(document).on('click', '.app-description-toggle-hide', function () {
+ $(this).addClass('hidden');
+ $(this).siblings('.app-description-toggle-show').removeClass('hidden');
+ $(this).siblings('.app-description-container').slideUp();
+ });
+
$(document).on('click', '#apps-list input.enable', function () {
var appId = $(this).data('appid');
var element = $(this);
@@ -395,7 +413,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
var element = $(this).parent().find('input.enable');
var groups = $(this).val();
if (groups && groups !== '') {
- groups = groups.split(',');
+ groups = groups.split('|');
} else {
groups = [];
}
diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js
index c06bc5ff14b..32ddbf3ba01 100644
--- a/settings/js/users/groups.js
+++ b/settings/js/users/groups.js
@@ -182,6 +182,7 @@ GroupList = {
$('#newgroup-form').show();
$('#newgroup-init').hide();
$('#newgroupname').focus();
+ GroupList.handleAddGroupInput('');
}
else {
$('#newgroup-form').hide();
@@ -190,6 +191,14 @@ GroupList = {
}
},
+ handleAddGroupInput: function (input) {
+ if(input.length) {
+ $('#newgroup-form input[type="submit"]').attr('disabled', null);
+ } else {
+ $('#newgroup-form input[type="submit"]').attr('disabled', 'disabled');
+ }
+ },
+
isGroupNameValid: function (groupname) {
if ($.trim(groupname) === '') {
OC.dialogs.alert(
@@ -295,4 +304,8 @@ $(document).ready( function () {
$userGroupList.on('click', '.isgroup', function () {
GroupList.showGroup(GroupList.getElementGID(this));
});
+
+ $('#newgroupname').on('input', function(){
+ GroupList.handleAddGroupInput(this.value);
+ });
});
diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js
index 704428b4ba4..bd65c64d8e4 100644
--- a/settings/l10n/ar.js
+++ b/settings/l10n/ar.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "مجدول",
"Sharing" : "مشاركة",
- "Security" : "الأمان",
"Email Server" : "خادم البريد الالكتروني",
"Log" : "سجل",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
@@ -24,7 +23,6 @@ OC.L10N.register(
"Enabled" : "مفعلة",
"Saved" : "حفظ",
"test email settings" : "إعدادات البريد التجريبي",
- "If you received this email, the settings seem to be correct." : "تبدوا الاعدادت صحيحة اذا تلقيت هذا البريد الالكتروني",
"Email sent" : "تم ارسال البريد الالكتروني",
"Email saved" : "تم حفظ البريد الإلكتروني",
"Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.",
@@ -102,7 +100,6 @@ OC.L10N.register(
"Current password" : "كلمات السر الحالية",
"New password" : "كلمات سر جديدة",
"Change password" : "عدل كلمة السر",
- "Full Name" : "اسمك الكامل",
"Email" : "البريد الإلكترونى",
"Your email address" : "عنوانك البريدي",
"Profile picture" : "صورة الملف الشخصي",
@@ -129,6 +126,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "يرجى ادخال تخزين quota (مثل:\"512 MB\" او \"12 GB\")",
"Unlimited" : "غير محدود",
"Other" : "شيء آخر",
+ "Full Name" : "اسمك الكامل",
"Quota" : "حصه",
"Last Login" : "آخر تسجيل دخول",
"change full name" : "تغيير اسمك الكامل",
diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json
index 2c8eb713782..c60ef0a7707 100644
--- a/settings/l10n/ar.json
+++ b/settings/l10n/ar.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "مجدول",
"Sharing" : "مشاركة",
- "Security" : "الأمان",
"Email Server" : "خادم البريد الالكتروني",
"Log" : "سجل",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
@@ -22,7 +21,6 @@
"Enabled" : "مفعلة",
"Saved" : "حفظ",
"test email settings" : "إعدادات البريد التجريبي",
- "If you received this email, the settings seem to be correct." : "تبدوا الاعدادت صحيحة اذا تلقيت هذا البريد الالكتروني",
"Email sent" : "تم ارسال البريد الالكتروني",
"Email saved" : "تم حفظ البريد الإلكتروني",
"Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.",
@@ -100,7 +98,6 @@
"Current password" : "كلمات السر الحالية",
"New password" : "كلمات سر جديدة",
"Change password" : "عدل كلمة السر",
- "Full Name" : "اسمك الكامل",
"Email" : "البريد الإلكترونى",
"Your email address" : "عنوانك البريدي",
"Profile picture" : "صورة الملف الشخصي",
@@ -127,6 +124,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "يرجى ادخال تخزين quota (مثل:\"512 MB\" او \"12 GB\")",
"Unlimited" : "غير محدود",
"Other" : "شيء آخر",
+ "Full Name" : "اسمك الكامل",
"Quota" : "حصه",
"Last Login" : "آخر تسجيل دخول",
"change full name" : "تغيير اسمك الكامل",
diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js
index 1e03ab58cca..18723351961 100644
--- a/settings/l10n/ast.js
+++ b/settings/l10n/ast.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridá",
"Email Server" : "Sirvidor de corréu-e",
"Log" : "Rexistru",
"Authentication error" : "Fallu d'autenticación",
@@ -33,8 +32,6 @@ OC.L10N.register(
"Recommended" : "Recomendáu",
"Saved" : "Guardáu",
"test email settings" : "probar configuración de corréu",
- "If you received this email, the settings seem to be correct." : "Si recibisti esti mensaxe de corréu-e, la to configuración ta correuta.",
- "A problem occurred while sending the email. Please revise your settings." : "Hebo un problema al unviar el mensaxe. Revisa la configuración.",
"Email sent" : "Corréu-e unviáu",
"You need to set your user email before being able to send test emails." : "Tienes de configurar la direición de corréu-e enantes de poder unviar mensaxes de prueba.",
"Email saved" : "Corréu-e guardáu",
@@ -78,7 +75,6 @@ OC.L10N.register(
"Error creating user" : "Fallu al crear usuariu",
"A valid password must be provided" : "Tien d'apurrise una contraseña válida",
"__language_name__" : "Asturianu",
- "Personal Info" : "Información personal",
"SSL root certificates" : "Certificaos raíz SSL",
"Encryption" : "Cifráu",
"Everything (fatal issues, errors, warnings, info, debug)" : "Too (Información, Avisos, Fallos, debug y problemes fatales)",
@@ -156,7 +152,6 @@ OC.L10N.register(
"Current password" : "Contraseña actual",
"New password" : "Contraseña nueva",
"Change password" : "Camudar contraseña",
- "Full Name" : "Nome completu",
"Email" : "Corréu-e",
"Your email address" : "Direición de corréu-e",
"Fill in an email address to enable password recovery and receive notifications" : "Introducir una direición de corréu-e p'activar la recuperación de contraseñes y recibir notificaciones",
@@ -170,7 +165,6 @@ OC.L10N.register(
"Choose as profile image" : "Esbillar como imaxe de perfil",
"Language" : "Llingua",
"Help translate" : "Ayúdanos nes traducciones",
- "Import Root Certificate" : "Importar certificáu raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "L'aplicación de cifráu yá nun ta activada, descifra tolos ficheros",
"Log-in password" : "Contraseña d'accesu",
"Decrypt all Files" : "Descifrar ficheros",
@@ -189,6 +183,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor indica la cuota d'almacenamientu (ex: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Non llendáu",
"Other" : "Otru",
+ "Full Name" : "Nome completu",
"Quota" : "Cuota",
"Storage Location" : "Llocalización d'almacenamientu",
"Last Login" : "Caberu aniciu de sesión",
diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json
index e9aa245e14a..47066078156 100644
--- a/settings/l10n/ast.json
+++ b/settings/l10n/ast.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridá",
"Email Server" : "Sirvidor de corréu-e",
"Log" : "Rexistru",
"Authentication error" : "Fallu d'autenticación",
@@ -31,8 +30,6 @@
"Recommended" : "Recomendáu",
"Saved" : "Guardáu",
"test email settings" : "probar configuración de corréu",
- "If you received this email, the settings seem to be correct." : "Si recibisti esti mensaxe de corréu-e, la to configuración ta correuta.",
- "A problem occurred while sending the email. Please revise your settings." : "Hebo un problema al unviar el mensaxe. Revisa la configuración.",
"Email sent" : "Corréu-e unviáu",
"You need to set your user email before being able to send test emails." : "Tienes de configurar la direición de corréu-e enantes de poder unviar mensaxes de prueba.",
"Email saved" : "Corréu-e guardáu",
@@ -76,7 +73,6 @@
"Error creating user" : "Fallu al crear usuariu",
"A valid password must be provided" : "Tien d'apurrise una contraseña válida",
"__language_name__" : "Asturianu",
- "Personal Info" : "Información personal",
"SSL root certificates" : "Certificaos raíz SSL",
"Encryption" : "Cifráu",
"Everything (fatal issues, errors, warnings, info, debug)" : "Too (Información, Avisos, Fallos, debug y problemes fatales)",
@@ -154,7 +150,6 @@
"Current password" : "Contraseña actual",
"New password" : "Contraseña nueva",
"Change password" : "Camudar contraseña",
- "Full Name" : "Nome completu",
"Email" : "Corréu-e",
"Your email address" : "Direición de corréu-e",
"Fill in an email address to enable password recovery and receive notifications" : "Introducir una direición de corréu-e p'activar la recuperación de contraseñes y recibir notificaciones",
@@ -168,7 +163,6 @@
"Choose as profile image" : "Esbillar como imaxe de perfil",
"Language" : "Llingua",
"Help translate" : "Ayúdanos nes traducciones",
- "Import Root Certificate" : "Importar certificáu raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "L'aplicación de cifráu yá nun ta activada, descifra tolos ficheros",
"Log-in password" : "Contraseña d'accesu",
"Decrypt all Files" : "Descifrar ficheros",
@@ -187,6 +181,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor indica la cuota d'almacenamientu (ex: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Non llendáu",
"Other" : "Otru",
+ "Full Name" : "Nome completu",
"Quota" : "Cuota",
"Storage Location" : "Llocalización d'almacenamientu",
"Last Login" : "Caberu aniciu de sesión",
diff --git a/settings/l10n/az.js b/settings/l10n/az.js
index 1eda8b1889b..4d05025ebc0 100644
--- a/settings/l10n/az.js
+++ b/settings/l10n/az.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Təhlükəsizlik və İşəsalınma xəbərdarlıqları",
"Cron" : "Cron",
"Sharing" : "Paylaşılır",
- "Security" : "Təhlükəsizlik",
"Email Server" : "Email server",
"Log" : "Jurnal",
"Authentication error" : "Təyinat metodikası",
@@ -39,8 +38,6 @@ OC.L10N.register(
"log-level out of allowed range" : "jurnal-səviyyəsi izin verilən aralıqdan kənardır",
"Saved" : "Saxlanıldı",
"test email settings" : "sınaq məktubu quraşdırmaları",
- "If you received this email, the settings seem to be correct." : "Əgər siz bu məktubu aldınızsa, demək quraşdırmalar düzgündür.",
- "A problem occurred while sending the email. Please revise your settings." : "Mailin yollanması müddətində səhv baş verdi. Xahiş olunur quraşdırmalarınıza yenidən baxasınız.",
"Email sent" : "Məktub göndərildi",
"You need to set your user email before being able to send test emails." : "Test məktubu göndərməzdən öncə, siz öz istifadəçi poçtunuzu təyin etməlisiniz.",
"Invalid mail address" : "Yalnış mail ünvanı",
@@ -93,7 +90,6 @@ OC.L10N.register(
"A valid password must be provided" : "Düzgün şifrə daxil edilməlidir",
"A valid email must be provided" : "Düzgün email təqdim edilməlidir",
"__language_name__" : "__AZ_Azerbaijan__",
- "Personal Info" : "Şəxsi İnformasiya",
"SSL root certificates" : "SSL root sertifikatları",
"Encryption" : "Şifrələnmə",
"Everything (fatal issues, errors, warnings, info, debug)" : "Hər şey(ən pis hadisələr, səhvlər, xəbərdarlıqlar, məlmat, araşdırma səhvləri)",
@@ -199,7 +195,6 @@ OC.L10N.register(
"Current password" : "Hazırkı şifrə",
"New password" : "Yeni şifrə",
"Change password" : "Şifrəni dəyiş",
- "Full Name" : "Tam ad",
"No display name set" : "Ekranda adı dəsti yoxdur",
"Email" : "Email",
"Your email address" : "Sizin email ünvanı",
@@ -220,7 +215,6 @@ OC.L10N.register(
"Valid until" : "Vaxtadək keçərlidir",
"Issued By" : "Tərəfindən yaradılıb",
"Valid until %s" : "Keçərlidir vaxtadək %s",
- "Import Root Certificate" : "Root sertifikatı İmport et",
"The encryption app is no longer enabled, please decrypt all your files" : "Şifrələnmə proqramı uzun müddətdir işləmir, xahiş olunur bütün fayllarınızı deşifrə edəsiniz",
"Log-in password" : "Şifrəni daxil et",
"Decrypt all Files" : "Bütün faylları deşifrə et",
@@ -247,6 +241,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Xahiş olunur depo normasını daxil edəsiniz (Məs: \"512 MB\" yada \"12 GB\")",
"Unlimited" : "Limitsiz",
"Other" : "Digər",
+ "Full Name" : "Tam ad",
"Group Admin for" : "üçün qrup inzibatçısı",
"Quota" : "Norma",
"Storage Location" : "Depo yeri",
diff --git a/settings/l10n/az.json b/settings/l10n/az.json
index 9ad03a8fa67..9676aba766f 100644
--- a/settings/l10n/az.json
+++ b/settings/l10n/az.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Təhlükəsizlik və İşəsalınma xəbərdarlıqları",
"Cron" : "Cron",
"Sharing" : "Paylaşılır",
- "Security" : "Təhlükəsizlik",
"Email Server" : "Email server",
"Log" : "Jurnal",
"Authentication error" : "Təyinat metodikası",
@@ -37,8 +36,6 @@
"log-level out of allowed range" : "jurnal-səviyyəsi izin verilən aralıqdan kənardır",
"Saved" : "Saxlanıldı",
"test email settings" : "sınaq məktubu quraşdırmaları",
- "If you received this email, the settings seem to be correct." : "Əgər siz bu məktubu aldınızsa, demək quraşdırmalar düzgündür.",
- "A problem occurred while sending the email. Please revise your settings." : "Mailin yollanması müddətində səhv baş verdi. Xahiş olunur quraşdırmalarınıza yenidən baxasınız.",
"Email sent" : "Məktub göndərildi",
"You need to set your user email before being able to send test emails." : "Test məktubu göndərməzdən öncə, siz öz istifadəçi poçtunuzu təyin etməlisiniz.",
"Invalid mail address" : "Yalnış mail ünvanı",
@@ -91,7 +88,6 @@
"A valid password must be provided" : "Düzgün şifrə daxil edilməlidir",
"A valid email must be provided" : "Düzgün email təqdim edilməlidir",
"__language_name__" : "__AZ_Azerbaijan__",
- "Personal Info" : "Şəxsi İnformasiya",
"SSL root certificates" : "SSL root sertifikatları",
"Encryption" : "Şifrələnmə",
"Everything (fatal issues, errors, warnings, info, debug)" : "Hər şey(ən pis hadisələr, səhvlər, xəbərdarlıqlar, məlmat, araşdırma səhvləri)",
@@ -197,7 +193,6 @@
"Current password" : "Hazırkı şifrə",
"New password" : "Yeni şifrə",
"Change password" : "Şifrəni dəyiş",
- "Full Name" : "Tam ad",
"No display name set" : "Ekranda adı dəsti yoxdur",
"Email" : "Email",
"Your email address" : "Sizin email ünvanı",
@@ -218,7 +213,6 @@
"Valid until" : "Vaxtadək keçərlidir",
"Issued By" : "Tərəfindən yaradılıb",
"Valid until %s" : "Keçərlidir vaxtadək %s",
- "Import Root Certificate" : "Root sertifikatı İmport et",
"The encryption app is no longer enabled, please decrypt all your files" : "Şifrələnmə proqramı uzun müddətdir işləmir, xahiş olunur bütün fayllarınızı deşifrə edəsiniz",
"Log-in password" : "Şifrəni daxil et",
"Decrypt all Files" : "Bütün faylları deşifrə et",
@@ -245,6 +239,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Xahiş olunur depo normasını daxil edəsiniz (Məs: \"512 MB\" yada \"12 GB\")",
"Unlimited" : "Limitsiz",
"Other" : "Digər",
+ "Full Name" : "Tam ad",
"Group Admin for" : "üçün qrup inzibatçısı",
"Quota" : "Norma",
"Storage Location" : "Depo yeri",
diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js
index f78dac4f7cd..ca46048fe57 100644
--- a/settings/l10n/bg_BG.js
+++ b/settings/l10n/bg_BG.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Предупреждения за сигурност и настройки",
"Cron" : "Крон",
"Sharing" : "Споделяне",
- "Security" : "Сигурност",
"Email Server" : "Имейл Сървър",
"Log" : "Лог",
"Authentication error" : "Възникна проблем с идентификацията",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "Ниво на проследяване \\(log-level\\) e извън допустимия обхват",
"Saved" : "Запаметяване",
"test email settings" : "проверка на настройките на електронна поща",
- "If you received this email, the settings seem to be correct." : "Ако сте получили този имейл, изглежда, че настройките са ви правилни.",
- "A problem occurred while sending the email. Please revise your settings." : "Настъпи проблем при изпращането на електронната поща. Моля, проверете вашите настройки.",
"Email sent" : "Имейлът е изпратен",
"You need to set your user email before being able to send test emails." : "Трябва да зададете своя имейл преди да можете да изпращате тестови имейли.",
"Invalid mail address" : "невалиден адрес на електронна поща",
@@ -92,7 +89,6 @@ OC.L10N.register(
"A valid password must be provided" : "Трябва да бъде зададена валидна парола",
"A valid email must be provided" : "Трябва да бъде зададена валидна електронна поща",
"__language_name__" : "Български",
- "Personal Info" : "Лична информация",
"SSL root certificates" : "SSL root сертификати",
"Encryption" : "Криптиране",
"Everything (fatal issues, errors, warnings, info, debug)" : "Всичко (фатални проблеми, грешки, предупреждения, информация, дебъгване)",
@@ -189,7 +185,6 @@ OC.L10N.register(
"Current password" : "Текуща парола",
"New password" : "Нова парола",
"Change password" : "Промяна на паролата",
- "Full Name" : "Пълно Име",
"No display name set" : "Няма настроено екранно име",
"Email" : "Имейл",
"Your email address" : "Твоят имейл адрес",
@@ -209,7 +204,6 @@ OC.L10N.register(
"Valid until" : "Валиден до",
"Issued By" : "Издаден От",
"Valid until %s" : "Валиден до %s",
- "Import Root Certificate" : "Внасяне на Root Сертификат",
"The encryption app is no longer enabled, please decrypt all your files" : "Приложението за криптиране вече не е включено, моля разшифрирай всичките си файлове.",
"Log-in password" : "Парола за вписване",
"Decrypt all Files" : "Разшифровай всички Файлове",
@@ -234,6 +228,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Моля, въведи квота за заделено място (пр. \"512 MB\" или \"12 GB\")",
"Unlimited" : "Неограничено",
"Other" : "Друга...",
+ "Full Name" : "Пълно Име",
"Group Admin for" : "Групов администратор за",
"Quota" : "Квота",
"Storage Location" : "Място за Запис",
diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json
index 75610d7a2cd..c94be43d40f 100644
--- a/settings/l10n/bg_BG.json
+++ b/settings/l10n/bg_BG.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Предупреждения за сигурност и настройки",
"Cron" : "Крон",
"Sharing" : "Споделяне",
- "Security" : "Сигурност",
"Email Server" : "Имейл Сървър",
"Log" : "Лог",
"Authentication error" : "Възникна проблем с идентификацията",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "Ниво на проследяване \\(log-level\\) e извън допустимия обхват",
"Saved" : "Запаметяване",
"test email settings" : "проверка на настройките на електронна поща",
- "If you received this email, the settings seem to be correct." : "Ако сте получили този имейл, изглежда, че настройките са ви правилни.",
- "A problem occurred while sending the email. Please revise your settings." : "Настъпи проблем при изпращането на електронната поща. Моля, проверете вашите настройки.",
"Email sent" : "Имейлът е изпратен",
"You need to set your user email before being able to send test emails." : "Трябва да зададете своя имейл преди да можете да изпращате тестови имейли.",
"Invalid mail address" : "невалиден адрес на електронна поща",
@@ -90,7 +87,6 @@
"A valid password must be provided" : "Трябва да бъде зададена валидна парола",
"A valid email must be provided" : "Трябва да бъде зададена валидна електронна поща",
"__language_name__" : "Български",
- "Personal Info" : "Лична информация",
"SSL root certificates" : "SSL root сертификати",
"Encryption" : "Криптиране",
"Everything (fatal issues, errors, warnings, info, debug)" : "Всичко (фатални проблеми, грешки, предупреждения, информация, дебъгване)",
@@ -187,7 +183,6 @@
"Current password" : "Текуща парола",
"New password" : "Нова парола",
"Change password" : "Промяна на паролата",
- "Full Name" : "Пълно Име",
"No display name set" : "Няма настроено екранно име",
"Email" : "Имейл",
"Your email address" : "Твоят имейл адрес",
@@ -207,7 +202,6 @@
"Valid until" : "Валиден до",
"Issued By" : "Издаден От",
"Valid until %s" : "Валиден до %s",
- "Import Root Certificate" : "Внасяне на Root Сертификат",
"The encryption app is no longer enabled, please decrypt all your files" : "Приложението за криптиране вече не е включено, моля разшифрирай всичките си файлове.",
"Log-in password" : "Парола за вписване",
"Decrypt all Files" : "Разшифровай всички Файлове",
@@ -232,6 +226,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Моля, въведи квота за заделено място (пр. \"512 MB\" или \"12 GB\")",
"Unlimited" : "Неограничено",
"Other" : "Друга...",
+ "Full Name" : "Пълно Име",
"Group Admin for" : "Групов администратор за",
"Quota" : "Квота",
"Storage Location" : "Място за Запис",
diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js
index 498f76a4c75..556296ac1da 100644
--- a/settings/l10n/bn_BD.js
+++ b/settings/l10n/bn_BD.js
@@ -2,7 +2,6 @@ OC.L10N.register(
"settings",
{
"Sharing" : "ভাগাভাগিরত",
- "Security" : "নিরাপত্তা",
"Email Server" : "ইমেইল সার্ভার",
"Authentication error" : "অনুমোদন ঘটিত সমস্যা",
"Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।",
@@ -21,7 +20,6 @@ OC.L10N.register(
"Enabled" : "কার্যকর",
"Saved" : "সংরক্ষণ করা হলো",
"test email settings" : "ইমেইল নিয়ামকসমূহ পরীক্ষা করুন",
- "If you received this email, the settings seem to be correct." : "এই ইমেইলের অর্থ নিয়ামকসমূহ সঠিক।",
"Email sent" : "ই-মেইল পাঠানো হয়েছে",
"Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে",
"All" : "সবাই",
@@ -78,7 +76,6 @@ OC.L10N.register(
"Cancel" : "বাতির",
"Language" : "ভাষা",
"Help translate" : "অনুবাদ করতে সহায়তা করুন",
- "Import Root Certificate" : "রুট সনদপত্রটি আমদানি করুন",
"Username" : "ব্যবহারকারী",
"Create" : "তৈরী কর",
"Admin Recovery Password" : "প্রশাসক পূণরূদ্ধার কুটশব্দ",
diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json
index eb4128029fd..f885cb1f1bd 100644
--- a/settings/l10n/bn_BD.json
+++ b/settings/l10n/bn_BD.json
@@ -1,6 +1,5 @@
{ "translations": {
"Sharing" : "ভাগাভাগিরত",
- "Security" : "নিরাপত্তা",
"Email Server" : "ইমেইল সার্ভার",
"Authentication error" : "অনুমোদন ঘটিত সমস্যা",
"Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।",
@@ -19,7 +18,6 @@
"Enabled" : "কার্যকর",
"Saved" : "সংরক্ষণ করা হলো",
"test email settings" : "ইমেইল নিয়ামকসমূহ পরীক্ষা করুন",
- "If you received this email, the settings seem to be correct." : "এই ইমেইলের অর্থ নিয়ামকসমূহ সঠিক।",
"Email sent" : "ই-মেইল পাঠানো হয়েছে",
"Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে",
"All" : "সবাই",
@@ -76,7 +74,6 @@
"Cancel" : "বাতির",
"Language" : "ভাষা",
"Help translate" : "অনুবাদ করতে সহায়তা করুন",
- "Import Root Certificate" : "রুট সনদপত্রটি আমদানি করুন",
"Username" : "ব্যবহারকারী",
"Create" : "তৈরী কর",
"Admin Recovery Password" : "প্রশাসক পূণরূদ্ধার কুটশব্দ",
diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js
index 32eaa6c94bf..098b85403fa 100644
--- a/settings/l10n/bs.js
+++ b/settings/l10n/bs.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Sigurnosna Upozorenja & Upozorenja Postavki",
"Cron" : "Cron",
"Sharing" : "Dijeljenje",
- "Security" : "Sigurnost",
"Email Server" : "Server e-pošte",
"Log" : "Zapisnik",
"Authentication error" : "Grešna autentifikacije",
@@ -37,8 +36,6 @@ OC.L10N.register(
"Unable to delete group." : "Nemoguće izbrisati grupu.",
"Saved" : "Spremljeno",
"test email settings" : "testiraj postavke e-pošte",
- "If you received this email, the settings seem to be correct." : "Ako ste primili ovu e-poštu, izgleda da su postavke ispravne.",
- "A problem occurred while sending the email. Please revise your settings." : "Došlo je do problema prilikom slanja e-pošte. Molim vas revidirate svoje postavke.",
"Email sent" : "E-pošta je poslana",
"You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu email trebate postaviti svoj korisnički email.",
"Invalid mail address" : "Nevažeća adresa e-pošte",
@@ -90,7 +87,6 @@ OC.L10N.register(
"A valid password must be provided" : "Nužno je navesti valjanu lozinku",
"A valid email must be provided" : "Nužno je navesti valjanu adresu e-pošte",
"__language_name__" : "__naziv_jezika___",
- "Personal Info" : "Osobne Informacije",
"SSL root certificates" : "SSL root certifikati",
"Encryption" : "Šifriranje",
"Everything (fatal issues, errors, warnings, info, debug)" : "Sve (fatalni problemi, greške, upozorenja, info, ispravljanje pogrešaka)",
@@ -183,7 +179,6 @@ OC.L10N.register(
"Current password" : "Trenutna lozinka",
"New password" : "Nova lozinka",
"Change password" : "Promijeni lozinku",
- "Full Name" : "Puno ime",
"Email" : "E-pošta",
"Your email address" : "Vaša adresa e-pošte",
"Fill in an email address to enable password recovery and receive notifications" : "Unesite adresu e-pošte da biste omogućili oporavak lozinke i primili notifikacije",
@@ -201,7 +196,6 @@ OC.L10N.register(
"Valid until" : "Validno do",
"Issued By" : "Izdano od",
"Valid until %s" : "Validno do %s",
- "Import Root Certificate" : "Uvoz Root Certifikata",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikacija šifriranja više nije omogćena, molimo dešifrirajte sve svoje datoteke",
"Log-in password" : "Lozinka za prijavu",
"Decrypt all Files" : "Dešifriraj sve datoteke",
@@ -227,6 +221,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Molim unesite kvotu za spremanje (npr: \"512 MB\" ili \"12 GB\")",
"Unlimited" : "Neograničeno",
"Other" : "Ostali",
+ "Full Name" : "Puno ime",
"Group Admin for" : "Grupa Admin za",
"Quota" : "Kvota",
"Storage Location" : "Mjesto za spremanje",
diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json
index 95c8a81f3cb..9bbfb54967e 100644
--- a/settings/l10n/bs.json
+++ b/settings/l10n/bs.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Sigurnosna Upozorenja & Upozorenja Postavki",
"Cron" : "Cron",
"Sharing" : "Dijeljenje",
- "Security" : "Sigurnost",
"Email Server" : "Server e-pošte",
"Log" : "Zapisnik",
"Authentication error" : "Grešna autentifikacije",
@@ -35,8 +34,6 @@
"Unable to delete group." : "Nemoguće izbrisati grupu.",
"Saved" : "Spremljeno",
"test email settings" : "testiraj postavke e-pošte",
- "If you received this email, the settings seem to be correct." : "Ako ste primili ovu e-poštu, izgleda da su postavke ispravne.",
- "A problem occurred while sending the email. Please revise your settings." : "Došlo je do problema prilikom slanja e-pošte. Molim vas revidirate svoje postavke.",
"Email sent" : "E-pošta je poslana",
"You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu email trebate postaviti svoj korisnički email.",
"Invalid mail address" : "Nevažeća adresa e-pošte",
@@ -88,7 +85,6 @@
"A valid password must be provided" : "Nužno je navesti valjanu lozinku",
"A valid email must be provided" : "Nužno je navesti valjanu adresu e-pošte",
"__language_name__" : "__naziv_jezika___",
- "Personal Info" : "Osobne Informacije",
"SSL root certificates" : "SSL root certifikati",
"Encryption" : "Šifriranje",
"Everything (fatal issues, errors, warnings, info, debug)" : "Sve (fatalni problemi, greške, upozorenja, info, ispravljanje pogrešaka)",
@@ -181,7 +177,6 @@
"Current password" : "Trenutna lozinka",
"New password" : "Nova lozinka",
"Change password" : "Promijeni lozinku",
- "Full Name" : "Puno ime",
"Email" : "E-pošta",
"Your email address" : "Vaša adresa e-pošte",
"Fill in an email address to enable password recovery and receive notifications" : "Unesite adresu e-pošte da biste omogućili oporavak lozinke i primili notifikacije",
@@ -199,7 +194,6 @@
"Valid until" : "Validno do",
"Issued By" : "Izdano od",
"Valid until %s" : "Validno do %s",
- "Import Root Certificate" : "Uvoz Root Certifikata",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikacija šifriranja više nije omogćena, molimo dešifrirajte sve svoje datoteke",
"Log-in password" : "Lozinka za prijavu",
"Decrypt all Files" : "Dešifriraj sve datoteke",
@@ -225,6 +219,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Molim unesite kvotu za spremanje (npr: \"512 MB\" ili \"12 GB\")",
"Unlimited" : "Neograničeno",
"Other" : "Ostali",
+ "Full Name" : "Puno ime",
"Group Admin for" : "Grupa Admin za",
"Quota" : "Kvota",
"Storage Location" : "Mjesto za spremanje",
diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js
index 5ee226c6b43..8476315fda8 100644
--- a/settings/l10n/ca.js
+++ b/settings/l10n/ca.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Avisos de seguretat i configuració",
"Cron" : "Cron",
"Sharing" : "Compartir",
- "Security" : "Seguretat",
"Email Server" : "Servidor de correu",
"Log" : "Registre",
"Authentication error" : "Error d'autenticació",
@@ -34,8 +33,6 @@ OC.L10N.register(
"Recommended" : "Recomanat",
"Saved" : "Desat",
"test email settings" : "prova l'arranjament del correu",
- "If you received this email, the settings seem to be correct." : "Si rebeu aquest correu sembla que l'arranjament del correu és correcte.",
- "A problem occurred while sending the email. Please revise your settings." : "Hi ha hagut un problema enviant el correu. Reviseu la configuració.",
"Email sent" : "El correu electrónic s'ha enviat",
"You need to set your user email before being able to send test emails." : "Heu d'establir un nom d'usuari abans de poder enviar correus de prova.",
"Email saved" : "S'ha desat el correu electrònic",
@@ -79,7 +76,6 @@ OC.L10N.register(
"Error creating user" : "Error en crear l'usuari",
"A valid password must be provided" : "Heu de facilitar una contrasenya vàlida",
"__language_name__" : "Català",
- "Personal Info" : "Informació personal",
"SSL root certificates" : "Certificats SSL root",
"Encryption" : "Xifrat",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tot (problemes fatals, errors, avisos, informació, depuració)",
@@ -163,7 +159,6 @@ OC.L10N.register(
"Current password" : "Contrasenya actual",
"New password" : "Contrasenya nova",
"Change password" : "Canvia la contrasenya",
- "Full Name" : "Nom complet",
"Email" : "Correu electrònic",
"Your email address" : "Correu electrònic",
"Fill in an email address to enable password recovery and receive notifications" : "Ompliu una adreça de correu per poder recuperar la contrasenya i rebre notificacions",
@@ -181,7 +176,6 @@ OC.L10N.register(
"Valid until" : "Valid fins",
"Issued By" : "Emès Per",
"Valid until %s" : "Vàlid fins %s",
- "Import Root Certificate" : "Importa certificat root",
"The encryption app is no longer enabled, please decrypt all your files" : "L'aplicació d'encriptació ja no està activada, desencripteu tots els vostres fitxers",
"Log-in password" : "Contrasenya d'accés",
"Decrypt all Files" : "Desencripta tots els fitxers",
@@ -203,6 +197,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Escriviu la quota d'emmagatzemament (per ex.: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Il·limitat",
"Other" : "Un altre",
+ "Full Name" : "Nom complet",
"Group Admin for" : "Grup Admin per",
"Quota" : "Quota",
"Storage Location" : "Ubicació de l'emmagatzemament",
diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json
index 8ae4df81c33..58bd42f5214 100644
--- a/settings/l10n/ca.json
+++ b/settings/l10n/ca.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Avisos de seguretat i configuració",
"Cron" : "Cron",
"Sharing" : "Compartir",
- "Security" : "Seguretat",
"Email Server" : "Servidor de correu",
"Log" : "Registre",
"Authentication error" : "Error d'autenticació",
@@ -32,8 +31,6 @@
"Recommended" : "Recomanat",
"Saved" : "Desat",
"test email settings" : "prova l'arranjament del correu",
- "If you received this email, the settings seem to be correct." : "Si rebeu aquest correu sembla que l'arranjament del correu és correcte.",
- "A problem occurred while sending the email. Please revise your settings." : "Hi ha hagut un problema enviant el correu. Reviseu la configuració.",
"Email sent" : "El correu electrónic s'ha enviat",
"You need to set your user email before being able to send test emails." : "Heu d'establir un nom d'usuari abans de poder enviar correus de prova.",
"Email saved" : "S'ha desat el correu electrònic",
@@ -77,7 +74,6 @@
"Error creating user" : "Error en crear l'usuari",
"A valid password must be provided" : "Heu de facilitar una contrasenya vàlida",
"__language_name__" : "Català",
- "Personal Info" : "Informació personal",
"SSL root certificates" : "Certificats SSL root",
"Encryption" : "Xifrat",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tot (problemes fatals, errors, avisos, informació, depuració)",
@@ -161,7 +157,6 @@
"Current password" : "Contrasenya actual",
"New password" : "Contrasenya nova",
"Change password" : "Canvia la contrasenya",
- "Full Name" : "Nom complet",
"Email" : "Correu electrònic",
"Your email address" : "Correu electrònic",
"Fill in an email address to enable password recovery and receive notifications" : "Ompliu una adreça de correu per poder recuperar la contrasenya i rebre notificacions",
@@ -179,7 +174,6 @@
"Valid until" : "Valid fins",
"Issued By" : "Emès Per",
"Valid until %s" : "Vàlid fins %s",
- "Import Root Certificate" : "Importa certificat root",
"The encryption app is no longer enabled, please decrypt all your files" : "L'aplicació d'encriptació ja no està activada, desencripteu tots els vostres fitxers",
"Log-in password" : "Contrasenya d'accés",
"Decrypt all Files" : "Desencripta tots els fitxers",
@@ -201,6 +195,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Escriviu la quota d'emmagatzemament (per ex.: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Il·limitat",
"Other" : "Un altre",
+ "Full Name" : "Nom complet",
"Group Admin for" : "Grup Admin per",
"Quota" : "Quota",
"Storage Location" : "Ubicació de l'emmagatzemament",
diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js
index a2856534eaa..f023d6dec1e 100644
--- a/settings/l10n/cs_CZ.js
+++ b/settings/l10n/cs_CZ.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Upozornění zabezpečení a nastavení",
"Cron" : "Cron",
"Sharing" : "Sdílení",
- "Security" : "Zabezpečení",
"Email Server" : "Emailový server",
"Log" : "Záznam",
"Authentication error" : "Chyba přihlášení",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "úroveň logování z povoleného rozpětí",
"Saved" : "Uloženo",
"test email settings" : "otestovat nastavení emailu",
- "If you received this email, the settings seem to be correct." : "Pokud jste obdrželi tento email, nastavení se zdají být v pořádku.",
- "A problem occurred while sending the email. Please revise your settings." : "Při odesílání emailu nastala chyba. Překontrolujte prosím svá nastavení.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Při odesílání emailu nastala chyba. Překontrolujte prosím svá nastavení. (Error: %s)",
"Email sent" : "Email odeslán",
"You need to set your user email before being able to send test emails." : "Pro možnost odeslání zkušebních emailů musíte nejprve nastavit svou emailovou adresu.",
"Invalid mail address" : "Neplatná emailová adresa",
+ "A user with that name already exists." : "Uživatel tohoto jména již existuje.",
"Unable to create user." : "Nelze vytvořit uživatele.",
"Your %s account was created" : "Účet %s byl vytvořen",
"Unable to delete user." : "Nelze smazat uživatele.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Musíte zadat platné heslo",
"A valid email must be provided" : "Musíte zadat platný email",
"__language_name__" : "Česky",
- "Personal Info" : "Osobní informace",
"SSL root certificates" : "Kořenové certifikáty SSL",
"Encryption" : "Šifrování",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)",
@@ -132,6 +130,7 @@ OC.L10N.register(
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:",
"Configuration Checks" : "Ověření konfigurace",
"No problems found" : "Nebyly nalezeny žádné problémy",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ověřte znovu prosím informace z <a href=\"%s\">instalační příručky</a> a zkontrolujte <a href=\"#log-section\">log</a> na výskyt chyb a varování.",
"Last cron job execution: %s." : "Poslední cron proběhl: %s.",
"Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.",
"Cron was not executed yet!" : "Cron ještě nebyl spuštěn!",
@@ -179,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Dokumentace:",
"User Documentation" : "Uživatelská dokumentace",
"Admin Documentation" : "Dokumentace pro administrátory",
+ "Show description …" : "Zobrazit popis ...",
+ "Hide description …" : "Skrýt popis ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Tuto aplikaci nelze nainstalovat, protože nejsou splněny následující závislosti:",
"Update to %s" : "Aktualizovat na %s",
"Enable only for specific groups" : "Povolit pouze pro vybrané skupiny",
@@ -203,7 +204,6 @@ OC.L10N.register(
"Current password" : "Současné heslo",
"New password" : "Nové heslo",
"Change password" : "Změnit heslo",
- "Full Name" : "Celé jméno",
"No display name set" : "Jméno pro zobrazení nenastaveno",
"Email" : "Email",
"Your email address" : "Vaše emailová adresa",
@@ -224,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Platný do",
"Issued By" : "Vydal",
"Valid until %s" : "Platný do %s",
- "Import Root Certificate" : "Import kořenového certifikátu",
"The encryption app is no longer enabled, please decrypt all your files" : "Šifrovací aplikace již není spuštěna, dešifrujte prosím všechny své soubory",
"Log-in password" : "Přihlašovací heslo",
"Decrypt all Files" : "Odšifrovat všechny soubory",
@@ -251,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Zvolte prosím kvótu pro úložiště (např. \"512 MB\" nebo \"12 GB\")",
"Unlimited" : "Neomezeně",
"Other" : "Jiný",
+ "Full Name" : "Celé jméno",
"Group Admin for" : "Správce skupiny ",
"Quota" : "Kvóta",
"Storage Location" : "Umístění úložiště",
diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json
index 012c0db3457..706a0f18462 100644
--- a/settings/l10n/cs_CZ.json
+++ b/settings/l10n/cs_CZ.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Upozornění zabezpečení a nastavení",
"Cron" : "Cron",
"Sharing" : "Sdílení",
- "Security" : "Zabezpečení",
"Email Server" : "Emailový server",
"Log" : "Záznam",
"Authentication error" : "Chyba přihlášení",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "úroveň logování z povoleného rozpětí",
"Saved" : "Uloženo",
"test email settings" : "otestovat nastavení emailu",
- "If you received this email, the settings seem to be correct." : "Pokud jste obdrželi tento email, nastavení se zdají být v pořádku.",
- "A problem occurred while sending the email. Please revise your settings." : "Při odesílání emailu nastala chyba. Překontrolujte prosím svá nastavení.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Při odesílání emailu nastala chyba. Překontrolujte prosím svá nastavení. (Error: %s)",
"Email sent" : "Email odeslán",
"You need to set your user email before being able to send test emails." : "Pro možnost odeslání zkušebních emailů musíte nejprve nastavit svou emailovou adresu.",
"Invalid mail address" : "Neplatná emailová adresa",
+ "A user with that name already exists." : "Uživatel tohoto jména již existuje.",
"Unable to create user." : "Nelze vytvořit uživatele.",
"Your %s account was created" : "Účet %s byl vytvořen",
"Unable to delete user." : "Nelze smazat uživatele.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Musíte zadat platné heslo",
"A valid email must be provided" : "Musíte zadat platný email",
"__language_name__" : "Česky",
- "Personal Info" : "Osobní informace",
"SSL root certificates" : "Kořenové certifikáty SSL",
"Encryption" : "Šifrování",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)",
@@ -130,6 +128,7 @@
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:",
"Configuration Checks" : "Ověření konfigurace",
"No problems found" : "Nebyly nalezeny žádné problémy",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ověřte znovu prosím informace z <a href=\"%s\">instalační příručky</a> a zkontrolujte <a href=\"#log-section\">log</a> na výskyt chyb a varování.",
"Last cron job execution: %s." : "Poslední cron proběhl: %s.",
"Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.",
"Cron was not executed yet!" : "Cron ještě nebyl spuštěn!",
@@ -177,6 +176,8 @@
"Documentation:" : "Dokumentace:",
"User Documentation" : "Uživatelská dokumentace",
"Admin Documentation" : "Dokumentace pro administrátory",
+ "Show description …" : "Zobrazit popis ...",
+ "Hide description …" : "Skrýt popis ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Tuto aplikaci nelze nainstalovat, protože nejsou splněny následující závislosti:",
"Update to %s" : "Aktualizovat na %s",
"Enable only for specific groups" : "Povolit pouze pro vybrané skupiny",
@@ -201,7 +202,6 @@
"Current password" : "Současné heslo",
"New password" : "Nové heslo",
"Change password" : "Změnit heslo",
- "Full Name" : "Celé jméno",
"No display name set" : "Jméno pro zobrazení nenastaveno",
"Email" : "Email",
"Your email address" : "Vaše emailová adresa",
@@ -222,7 +222,6 @@
"Valid until" : "Platný do",
"Issued By" : "Vydal",
"Valid until %s" : "Platný do %s",
- "Import Root Certificate" : "Import kořenového certifikátu",
"The encryption app is no longer enabled, please decrypt all your files" : "Šifrovací aplikace již není spuštěna, dešifrujte prosím všechny své soubory",
"Log-in password" : "Přihlašovací heslo",
"Decrypt all Files" : "Odšifrovat všechny soubory",
@@ -249,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Zvolte prosím kvótu pro úložiště (např. \"512 MB\" nebo \"12 GB\")",
"Unlimited" : "Neomezeně",
"Other" : "Jiný",
+ "Full Name" : "Celé jméno",
"Group Admin for" : "Správce skupiny ",
"Quota" : "Kvóta",
"Storage Location" : "Umístění úložiště",
diff --git a/settings/l10n/da.js b/settings/l10n/da.js
index bba55f27a52..18896c600a4 100644
--- a/settings/l10n/da.js
+++ b/settings/l10n/da.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Advarsler om sikkerhed og opsætning",
"Cron" : "Cron",
"Sharing" : "Deling",
- "Security" : "Sikkerhed",
"Email Server" : "E-mailserver",
"Log" : "Log",
"Authentication error" : "Adgangsfejl",
@@ -39,8 +38,7 @@ OC.L10N.register(
"log-level out of allowed range" : "niveau for logregistrering går ud over tilladte interval",
"Saved" : "Gemt",
"test email settings" : "test e-mailindstillinger",
- "If you received this email, the settings seem to be correct." : "Hvis du har modtaget denne e-mail, så lader indstillinger til at være korrekte.",
- "A problem occurred while sending the email. Please revise your settings." : "Der opstod en fejl under afsendelse af e-mailen. Gennemse venligst dine indstillinger.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Der opstod et problem under afsendelse af e-mailen. Gennemse venligst dine indstillinger. (Fejl: %s)",
"Email sent" : "E-mail afsendt",
"You need to set your user email before being able to send test emails." : "Du skal angive din bruger-e-mail før der kan sendes test-e-mail.",
"Invalid mail address" : "Ugyldig mailadresse",
@@ -93,7 +91,6 @@ OC.L10N.register(
"A valid password must be provided" : "En gyldig adgangskode skal angives",
"A valid email must be provided" : "Der skal angives en gyldig e-mail",
"__language_name__" : "Dansk",
- "Personal Info" : "Personlige oplysninger",
"SSL root certificates" : "SSL-rodcertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (alvorlige fejl, fejl, advarsler, info, debug)",
@@ -132,6 +129,7 @@ OC.L10N.register(
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:",
"Configuration Checks" : "Konfigurationstjek",
"No problems found" : "Der blev ikke fundet problemer",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Dobbelttjek venligst <a href=\"%s\">installationsvejledningerne</a>, og tjek om der er fejl eller advarsler i <a href=\"#log-section\">loggen</a>.",
"Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
"Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
"Cron was not executed yet!" : "Cron har ikke kørt endnu!",
@@ -203,7 +201,6 @@ OC.L10N.register(
"Current password" : "Nuværende adgangskode",
"New password" : "Nyt kodeord",
"Change password" : "Skift kodeord",
- "Full Name" : "Fulde navn",
"No display name set" : "Der er ikke angivet skærmnavn",
"Email" : "E-mail",
"Your email address" : "Din e-mailadresse",
@@ -224,7 +221,6 @@ OC.L10N.register(
"Valid until" : "Gyldig indtil",
"Issued By" : "Udstedt af",
"Valid until %s" : "Gyldig indtil %s",
- "Import Root Certificate" : "Importer rodcertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypteringsprogrammet er ikke længere aktiveret. Dekrypter venligst alle dine filer",
"Log-in password" : "Log-in kodeord",
"Decrypt all Files" : "Dekrypter alle Filer ",
@@ -251,6 +247,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Indtast venligst lagerkvote (f.eks. \"512 MB\" eller \"12 GB\")",
"Unlimited" : "Ubegrænset",
"Other" : "Andet",
+ "Full Name" : "Fulde navn",
"Group Admin for" : "Gruppeadministrator for",
"Quota" : "Kvote",
"Storage Location" : "Placering af lageret",
diff --git a/settings/l10n/da.json b/settings/l10n/da.json
index 17444a752d2..979f0f9f994 100644
--- a/settings/l10n/da.json
+++ b/settings/l10n/da.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Advarsler om sikkerhed og opsætning",
"Cron" : "Cron",
"Sharing" : "Deling",
- "Security" : "Sikkerhed",
"Email Server" : "E-mailserver",
"Log" : "Log",
"Authentication error" : "Adgangsfejl",
@@ -37,8 +36,7 @@
"log-level out of allowed range" : "niveau for logregistrering går ud over tilladte interval",
"Saved" : "Gemt",
"test email settings" : "test e-mailindstillinger",
- "If you received this email, the settings seem to be correct." : "Hvis du har modtaget denne e-mail, så lader indstillinger til at være korrekte.",
- "A problem occurred while sending the email. Please revise your settings." : "Der opstod en fejl under afsendelse af e-mailen. Gennemse venligst dine indstillinger.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Der opstod et problem under afsendelse af e-mailen. Gennemse venligst dine indstillinger. (Fejl: %s)",
"Email sent" : "E-mail afsendt",
"You need to set your user email before being able to send test emails." : "Du skal angive din bruger-e-mail før der kan sendes test-e-mail.",
"Invalid mail address" : "Ugyldig mailadresse",
@@ -91,7 +89,6 @@
"A valid password must be provided" : "En gyldig adgangskode skal angives",
"A valid email must be provided" : "Der skal angives en gyldig e-mail",
"__language_name__" : "Dansk",
- "Personal Info" : "Personlige oplysninger",
"SSL root certificates" : "SSL-rodcertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (alvorlige fejl, fejl, advarsler, info, debug)",
@@ -130,6 +127,7 @@
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:",
"Configuration Checks" : "Konfigurationstjek",
"No problems found" : "Der blev ikke fundet problemer",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Dobbelttjek venligst <a href=\"%s\">installationsvejledningerne</a>, og tjek om der er fejl eller advarsler i <a href=\"#log-section\">loggen</a>.",
"Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
"Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
"Cron was not executed yet!" : "Cron har ikke kørt endnu!",
@@ -201,7 +199,6 @@
"Current password" : "Nuværende adgangskode",
"New password" : "Nyt kodeord",
"Change password" : "Skift kodeord",
- "Full Name" : "Fulde navn",
"No display name set" : "Der er ikke angivet skærmnavn",
"Email" : "E-mail",
"Your email address" : "Din e-mailadresse",
@@ -222,7 +219,6 @@
"Valid until" : "Gyldig indtil",
"Issued By" : "Udstedt af",
"Valid until %s" : "Gyldig indtil %s",
- "Import Root Certificate" : "Importer rodcertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypteringsprogrammet er ikke længere aktiveret. Dekrypter venligst alle dine filer",
"Log-in password" : "Log-in kodeord",
"Decrypt all Files" : "Dekrypter alle Filer ",
@@ -249,6 +245,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Indtast venligst lagerkvote (f.eks. \"512 MB\" eller \"12 GB\")",
"Unlimited" : "Ubegrænset",
"Other" : "Andet",
+ "Full Name" : "Fulde navn",
"Group Admin for" : "Gruppeadministrator for",
"Quota" : "Kvote",
"Storage Location" : "Placering af lageret",
diff --git a/settings/l10n/de.js b/settings/l10n/de.js
index e8ed0764452..dc8c1cbf89f 100644
--- a/settings/l10n/de.js
+++ b/settings/l10n/de.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Sicherheits- & Einrichtungswarnungen",
"Cron" : "Cron",
"Sharing" : "Teilen",
- "Security" : "Sicherheit",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Authentication error" : "Authentifizierungsfehler",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs",
"Saved" : "Gespeichert",
"test email settings" : "E-Mail-Einstellungen testen",
- "If you received this email, the settings seem to be correct." : "Wenn Du diese E-Mail erhalten hast, sind die Einstellungen korrekt.",
- "A problem occurred while sending the email. Please revise your settings." : "Ein Problem ist beim Senden der E-Mail aufgetreten. Bitte überprüfe deine Einstellungen.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfe Deine Einstellungen. (Fehler: %s)",
"Email sent" : "E-Mail wurde verschickt",
"You need to set your user email before being able to send test emails." : "Du musst zunächst Deine Benutzer-E-Mail-Adresse angeben, bevor Du Test-E-Mail verschicken kannst.",
"Invalid mail address" : "Ungültige E-Mail-Adresse",
+ "A user with that name already exists." : "Es existiert bereits ein Benutzer dieses Namens.",
"Unable to create user." : "Benutzer konnte nicht erstellt werden.",
"Your %s account was created" : "Dein %s-Konto wurde erstellt",
"Unable to delete user." : "Benutzer konnte nicht gelöscht werden.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
"A valid email must be provided" : "Es muss eine gültige E-Mail-Adresse angegeben werden",
"__language_name__" : "Deutsch (Persönlich)",
- "Personal Info" : "Persönliche Informationen",
"SSL root certificates" : "SSL-Root-Zertifikate",
"Encryption" : "Verschlüsselung",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Dokumentation:",
"User Documentation" : "Dokumentation für Benutzer",
"Admin Documentation" : "Admin-Dokumentation",
+ "Show description …" : "Beschreibung anzeigen…",
+ "Hide description …" : "Beschreibung ausblenden…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Die App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:",
"Update to %s" : "Aktualisierung auf %s",
"Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Aktuelles Passwort",
"New password" : "Neues Passwort",
"Change password" : "Passwort ändern",
- "Full Name" : "Vollständiger Name",
"No display name set" : "Kein Anzeigename angegeben",
"Email" : "E-Mail",
"Your email address" : "Deine E-Mail-Adresse",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Gültig bis",
"Issued By" : "Ausgestellt von:",
"Valid until %s" : "Gültig bis %s",
- "Import Root Certificate" : "Root-Zertifikat importieren",
"The encryption app is no longer enabled, please decrypt all your files" : "Die Verschlüsselungsapp ist nicht mehr aktiviert, bitte entschlüssele alle Deine Daten.",
"Log-in password" : "Login-Passwort",
"Decrypt all Files" : "Alle Dateien entschlüsseln",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Bitte Speicherkontingent eingeben (z. B.: „512 MB“ oder „12 GB“)",
"Unlimited" : "Unbegrenzt",
"Other" : "Andere",
+ "Full Name" : "Vollständiger Name",
"Group Admin for" : "Gruppenadministrator für",
"Quota" : "Quota",
"Storage Location" : "Speicherort",
diff --git a/settings/l10n/de.json b/settings/l10n/de.json
index 3b37c111f98..4396d7438cb 100644
--- a/settings/l10n/de.json
+++ b/settings/l10n/de.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Sicherheits- & Einrichtungswarnungen",
"Cron" : "Cron",
"Sharing" : "Teilen",
- "Security" : "Sicherheit",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Authentication error" : "Authentifizierungsfehler",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs",
"Saved" : "Gespeichert",
"test email settings" : "E-Mail-Einstellungen testen",
- "If you received this email, the settings seem to be correct." : "Wenn Du diese E-Mail erhalten hast, sind die Einstellungen korrekt.",
- "A problem occurred while sending the email. Please revise your settings." : "Ein Problem ist beim Senden der E-Mail aufgetreten. Bitte überprüfe deine Einstellungen.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfe Deine Einstellungen. (Fehler: %s)",
"Email sent" : "E-Mail wurde verschickt",
"You need to set your user email before being able to send test emails." : "Du musst zunächst Deine Benutzer-E-Mail-Adresse angeben, bevor Du Test-E-Mail verschicken kannst.",
"Invalid mail address" : "Ungültige E-Mail-Adresse",
+ "A user with that name already exists." : "Es existiert bereits ein Benutzer dieses Namens.",
"Unable to create user." : "Benutzer konnte nicht erstellt werden.",
"Your %s account was created" : "Dein %s-Konto wurde erstellt",
"Unable to delete user." : "Benutzer konnte nicht gelöscht werden.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
"A valid email must be provided" : "Es muss eine gültige E-Mail-Adresse angegeben werden",
"__language_name__" : "Deutsch (Persönlich)",
- "Personal Info" : "Persönliche Informationen",
"SSL root certificates" : "SSL-Root-Zertifikate",
"Encryption" : "Verschlüsselung",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)",
@@ -178,6 +176,8 @@
"Documentation:" : "Dokumentation:",
"User Documentation" : "Dokumentation für Benutzer",
"Admin Documentation" : "Admin-Dokumentation",
+ "Show description …" : "Beschreibung anzeigen…",
+ "Hide description …" : "Beschreibung ausblenden…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Die App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:",
"Update to %s" : "Aktualisierung auf %s",
"Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren",
@@ -202,7 +202,6 @@
"Current password" : "Aktuelles Passwort",
"New password" : "Neues Passwort",
"Change password" : "Passwort ändern",
- "Full Name" : "Vollständiger Name",
"No display name set" : "Kein Anzeigename angegeben",
"Email" : "E-Mail",
"Your email address" : "Deine E-Mail-Adresse",
@@ -223,7 +222,6 @@
"Valid until" : "Gültig bis",
"Issued By" : "Ausgestellt von:",
"Valid until %s" : "Gültig bis %s",
- "Import Root Certificate" : "Root-Zertifikat importieren",
"The encryption app is no longer enabled, please decrypt all your files" : "Die Verschlüsselungsapp ist nicht mehr aktiviert, bitte entschlüssele alle Deine Daten.",
"Log-in password" : "Login-Passwort",
"Decrypt all Files" : "Alle Dateien entschlüsseln",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Bitte Speicherkontingent eingeben (z. B.: „512 MB“ oder „12 GB“)",
"Unlimited" : "Unbegrenzt",
"Other" : "Andere",
+ "Full Name" : "Vollständiger Name",
"Group Admin for" : "Gruppenadministrator für",
"Quota" : "Quota",
"Storage Location" : "Speicherort",
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index 7409de138eb..cf23dd58a23 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Sicherheits- & Einrichtungswarnungen",
"Cron" : "Cron",
"Sharing" : "Teilen",
- "Security" : "Sicherheit",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Authentication error" : "Authentifizierungsfehler",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs",
"Saved" : "Gespeichert",
"test email settings" : "E-Mail-Einstellungen testen",
- "If you received this email, the settings seem to be correct." : "Wenn Sie diese E-Mail erhalten haben, scheinen die Einstellungen richtig zu sein.",
- "A problem occurred while sending the email. Please revise your settings." : "Ein Problem ist beim Senden der E-Mail aufgetreten. Bitte überprüfen Sie Ihre Einstellungen.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Einstellungen. (Fehler: %s)",
"Email sent" : "E-Mail gesendet",
"You need to set your user email before being able to send test emails." : "Sie müssen Ihre Benutzer-E-Mail-Adresse einstellen, bevor Sie Test-E-Mails versenden können.",
"Invalid mail address" : "Ungültige E-Mail-Adresse",
+ "A user with that name already exists." : "Es existiert bereits ein Benutzer dieses Namens.",
"Unable to create user." : "Benutzer konnte nicht erstellt werden.",
"Your %s account was created" : "Ihr %s-Konto wurde erstellt",
"Unable to delete user." : "Benutzer konnte nicht gelöscht werden.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
"A valid email must be provided" : "Es muss eine gültige E-Mail-Adresse angegeben werden",
"__language_name__" : "Deutsch (Förmlich: Sie)",
- "Personal Info" : "Persönliche Informationen",
"SSL root certificates" : "SSL-Root-Zertifikate",
"Encryption" : "Verschlüsselung",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Dokumentation:",
"User Documentation" : "Dokumentation für Benutzer",
"Admin Documentation" : "Dokumentation für Administratoren",
+ "Show description …" : "Beschreibung anzeigen…",
+ "Hide description …" : "Beschreibung ausblenden…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Diese App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:",
"Update to %s" : "Aktualisierung auf %s",
"Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Aktuelles Passwort",
"New password" : "Neues Passwort",
"Change password" : "Passwort ändern",
- "Full Name" : "Vollständiger Name",
"No display name set" : "Kein Anzeigename angegeben",
"Email" : "E-Mail",
"Your email address" : "Ihre E-Mail-Adresse",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Gültig bis",
"Issued By" : "Ausgestellt von:",
"Valid until %s" : "Gültig bis %s",
- "Import Root Certificate" : "Root-Zertifikat importieren",
"The encryption app is no longer enabled, please decrypt all your files" : "Die Verschlüsselungsapp ist nicht mehr aktiviert, bitte entschlüsseln Sie alle Ihre Daten",
"Log-in password" : "Login-Passwort",
"Decrypt all Files" : "Alle Dateien entschlüsseln",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Bitte Speicherkontingent eingeben (z.B.: „512 MB“ oder „12 GB“)",
"Unlimited" : "Unbegrenzt",
"Other" : "Andere",
+ "Full Name" : "Vollständiger Name",
"Group Admin for" : "Gruppenadministrator für",
"Quota" : "Kontingent",
"Storage Location" : "Speicherort",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index 19571c611cc..62181ade389 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Sicherheits- & Einrichtungswarnungen",
"Cron" : "Cron",
"Sharing" : "Teilen",
- "Security" : "Sicherheit",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Authentication error" : "Authentifizierungsfehler",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs",
"Saved" : "Gespeichert",
"test email settings" : "E-Mail-Einstellungen testen",
- "If you received this email, the settings seem to be correct." : "Wenn Sie diese E-Mail erhalten haben, scheinen die Einstellungen richtig zu sein.",
- "A problem occurred while sending the email. Please revise your settings." : "Ein Problem ist beim Senden der E-Mail aufgetreten. Bitte überprüfen Sie Ihre Einstellungen.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Einstellungen. (Fehler: %s)",
"Email sent" : "E-Mail gesendet",
"You need to set your user email before being able to send test emails." : "Sie müssen Ihre Benutzer-E-Mail-Adresse einstellen, bevor Sie Test-E-Mails versenden können.",
"Invalid mail address" : "Ungültige E-Mail-Adresse",
+ "A user with that name already exists." : "Es existiert bereits ein Benutzer dieses Namens.",
"Unable to create user." : "Benutzer konnte nicht erstellt werden.",
"Your %s account was created" : "Ihr %s-Konto wurde erstellt",
"Unable to delete user." : "Benutzer konnte nicht gelöscht werden.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
"A valid email must be provided" : "Es muss eine gültige E-Mail-Adresse angegeben werden",
"__language_name__" : "Deutsch (Förmlich: Sie)",
- "Personal Info" : "Persönliche Informationen",
"SSL root certificates" : "SSL-Root-Zertifikate",
"Encryption" : "Verschlüsselung",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)",
@@ -178,6 +176,8 @@
"Documentation:" : "Dokumentation:",
"User Documentation" : "Dokumentation für Benutzer",
"Admin Documentation" : "Dokumentation für Administratoren",
+ "Show description …" : "Beschreibung anzeigen…",
+ "Hide description …" : "Beschreibung ausblenden…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Diese App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:",
"Update to %s" : "Aktualisierung auf %s",
"Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren",
@@ -202,7 +202,6 @@
"Current password" : "Aktuelles Passwort",
"New password" : "Neues Passwort",
"Change password" : "Passwort ändern",
- "Full Name" : "Vollständiger Name",
"No display name set" : "Kein Anzeigename angegeben",
"Email" : "E-Mail",
"Your email address" : "Ihre E-Mail-Adresse",
@@ -223,7 +222,6 @@
"Valid until" : "Gültig bis",
"Issued By" : "Ausgestellt von:",
"Valid until %s" : "Gültig bis %s",
- "Import Root Certificate" : "Root-Zertifikat importieren",
"The encryption app is no longer enabled, please decrypt all your files" : "Die Verschlüsselungsapp ist nicht mehr aktiviert, bitte entschlüsseln Sie alle Ihre Daten",
"Log-in password" : "Login-Passwort",
"Decrypt all Files" : "Alle Dateien entschlüsseln",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Bitte Speicherkontingent eingeben (z.B.: „512 MB“ oder „12 GB“)",
"Unlimited" : "Unbegrenzt",
"Other" : "Andere",
+ "Full Name" : "Vollständiger Name",
"Group Admin for" : "Gruppenadministrator für",
"Quota" : "Kontingent",
"Storage Location" : "Speicherort",
diff --git a/settings/l10n/el.js b/settings/l10n/el.js
index 2b8bdac8d73..7a003cd921b 100644
--- a/settings/l10n/el.js
+++ b/settings/l10n/el.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων",
"Cron" : "Cron",
"Sharing" : "Διαμοιρασμός",
- "Security" : "Ασφάλεια",
"Email Server" : "Διακομιστής Email",
"Log" : "Καταγραφές",
"Authentication error" : "Σφάλμα πιστοποίησης",
@@ -38,8 +37,6 @@ OC.L10N.register(
"Unable to delete group." : "Αδυναμία διαγραφής ομάδας.",
"Saved" : "Αποθηκεύτηκαν",
"test email settings" : "δοκιμή ρυθμίσεων email",
- "If you received this email, the settings seem to be correct." : "Εάν λάβατε αυτό το email, οι ρυθμίσεις δείχνουν να είναι σωστές.",
- "A problem occurred while sending the email. Please revise your settings." : "Παρουσιάστηκε ένα σφάλμα κατά την αποστολή του email. Παρακαλώ αναθεωρήστε τις ρυθμίσεις σας.",
"Email sent" : "Το Email απεστάλη ",
"You need to set your user email before being able to send test emails." : "Πρέπει να ορίσετε το email του χρήστη πριν να είστε σε θέση να στείλετε δοκιμαστικά emails.",
"Invalid mail address" : "Μη έγκυρη διεύθυνση ταχυδρομείου.",
@@ -91,7 +88,6 @@ OC.L10N.register(
"A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό",
"A valid email must be provided" : "Πρέπει να εισαχθεί ένα έγκυρο email",
"__language_name__" : "__όνομα_γλώσσας__",
- "Personal Info" : "Προσωπικές Πληροφορίες",
"SSL root certificates" : "Πιστοποιητικά SSL root",
"Encryption" : "Κρυπτογράφηση",
"Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)",
@@ -109,6 +105,7 @@ OC.L10N.register(
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Ο PHP φαίνεται να είναι ρυθμισμένος ώστε να αφαιρεί μπλοκ εσωτερικών κειμένων (inline doc). Αυτό θα καταστήσει κύριες εφαρμογές μη-διαθέσιμες.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Αυτό πιθανόν προκλήθηκε από προσωρινή μνήμη (cache)/επιταχυντή όπως τη Zend OPcache ή τον eAccelerator.",
"Database Performance Info" : "Πληροφορίες Επίδοσης Βάσης Δεδομένων",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.",
"Microsoft Windows Platform" : "Πλατφόρμα Microsoft Windows",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ο διακομιστής σας τρέχει σε Microsoft Windows. Συστήνουμε ιδιαίτερα Linux για τη βέλτιστη εμπειρία του χρήστη.",
"Module 'fileinfo' missing" : "Η ενοτητα 'fileinfo' λειπει",
@@ -189,7 +186,6 @@ OC.L10N.register(
"Current password" : "Τρέχων συνθηματικό",
"New password" : "Νέο συνθηματικό",
"Change password" : "Αλλαγή συνθηματικού",
- "Full Name" : "Πλήρες όνομα",
"No display name set" : "Δεν ορίστηκε όνομα",
"Email" : "Ηλεκτρονικό ταχυδρομείο",
"Your email address" : "Η διεύθυνση ηλ. ταχυδρομείου σας",
@@ -210,7 +206,6 @@ OC.L10N.register(
"Valid until" : "Έγκυρο έως",
"Issued By" : "Έκδόθηκε από",
"Valid until %s" : "Έγκυρο έως %s",
- "Import Root Certificate" : "Εισαγωγή Πιστοποιητικού Root",
"The encryption app is no longer enabled, please decrypt all your files" : "Η εφαρμογή κρυπτογράφησης δεν είναι πλέον ενεργοποιημένη, παρακαλώ αποκρυπτογραφήστε όλα τα αρχεία σας",
"Log-in password" : "Συνθηματικό εισόδου",
"Decrypt all Files" : "Αποκρυπτογράφηση όλων των Αρχείων",
@@ -235,6 +230,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Παρακαλώ εισάγετε επιτρεπόμενα μερίδια αποθηκευτικού χώρου (π.χ. \"512 MB\" ή \"12 GB\")",
"Unlimited" : "Απεριόριστο",
"Other" : "Άλλο",
+ "Full Name" : "Πλήρες όνομα",
"Quota" : "Σύνολο Χώρου",
"Storage Location" : "Τοποθεσία αποθηκευτικού χώρου",
"Last Login" : "Τελευταία Σύνδεση",
diff --git a/settings/l10n/el.json b/settings/l10n/el.json
index b9ea914de98..ed10dfbdd4f 100644
--- a/settings/l10n/el.json
+++ b/settings/l10n/el.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων",
"Cron" : "Cron",
"Sharing" : "Διαμοιρασμός",
- "Security" : "Ασφάλεια",
"Email Server" : "Διακομιστής Email",
"Log" : "Καταγραφές",
"Authentication error" : "Σφάλμα πιστοποίησης",
@@ -36,8 +35,6 @@
"Unable to delete group." : "Αδυναμία διαγραφής ομάδας.",
"Saved" : "Αποθηκεύτηκαν",
"test email settings" : "δοκιμή ρυθμίσεων email",
- "If you received this email, the settings seem to be correct." : "Εάν λάβατε αυτό το email, οι ρυθμίσεις δείχνουν να είναι σωστές.",
- "A problem occurred while sending the email. Please revise your settings." : "Παρουσιάστηκε ένα σφάλμα κατά την αποστολή του email. Παρακαλώ αναθεωρήστε τις ρυθμίσεις σας.",
"Email sent" : "Το Email απεστάλη ",
"You need to set your user email before being able to send test emails." : "Πρέπει να ορίσετε το email του χρήστη πριν να είστε σε θέση να στείλετε δοκιμαστικά emails.",
"Invalid mail address" : "Μη έγκυρη διεύθυνση ταχυδρομείου.",
@@ -89,7 +86,6 @@
"A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό",
"A valid email must be provided" : "Πρέπει να εισαχθεί ένα έγκυρο email",
"__language_name__" : "__όνομα_γλώσσας__",
- "Personal Info" : "Προσωπικές Πληροφορίες",
"SSL root certificates" : "Πιστοποιητικά SSL root",
"Encryption" : "Κρυπτογράφηση",
"Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)",
@@ -107,6 +103,7 @@
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Ο PHP φαίνεται να είναι ρυθμισμένος ώστε να αφαιρεί μπλοκ εσωτερικών κειμένων (inline doc). Αυτό θα καταστήσει κύριες εφαρμογές μη-διαθέσιμες.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Αυτό πιθανόν προκλήθηκε από προσωρινή μνήμη (cache)/επιταχυντή όπως τη Zend OPcache ή τον eAccelerator.",
"Database Performance Info" : "Πληροφορίες Επίδοσης Βάσης Δεδομένων",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.",
"Microsoft Windows Platform" : "Πλατφόρμα Microsoft Windows",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ο διακομιστής σας τρέχει σε Microsoft Windows. Συστήνουμε ιδιαίτερα Linux για τη βέλτιστη εμπειρία του χρήστη.",
"Module 'fileinfo' missing" : "Η ενοτητα 'fileinfo' λειπει",
@@ -187,7 +184,6 @@
"Current password" : "Τρέχων συνθηματικό",
"New password" : "Νέο συνθηματικό",
"Change password" : "Αλλαγή συνθηματικού",
- "Full Name" : "Πλήρες όνομα",
"No display name set" : "Δεν ορίστηκε όνομα",
"Email" : "Ηλεκτρονικό ταχυδρομείο",
"Your email address" : "Η διεύθυνση ηλ. ταχυδρομείου σας",
@@ -208,7 +204,6 @@
"Valid until" : "Έγκυρο έως",
"Issued By" : "Έκδόθηκε από",
"Valid until %s" : "Έγκυρο έως %s",
- "Import Root Certificate" : "Εισαγωγή Πιστοποιητικού Root",
"The encryption app is no longer enabled, please decrypt all your files" : "Η εφαρμογή κρυπτογράφησης δεν είναι πλέον ενεργοποιημένη, παρακαλώ αποκρυπτογραφήστε όλα τα αρχεία σας",
"Log-in password" : "Συνθηματικό εισόδου",
"Decrypt all Files" : "Αποκρυπτογράφηση όλων των Αρχείων",
@@ -233,6 +228,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Παρακαλώ εισάγετε επιτρεπόμενα μερίδια αποθηκευτικού χώρου (π.χ. \"512 MB\" ή \"12 GB\")",
"Unlimited" : "Απεριόριστο",
"Other" : "Άλλο",
+ "Full Name" : "Πλήρες όνομα",
"Quota" : "Σύνολο Χώρου",
"Storage Location" : "Τοποθεσία αποθηκευτικού χώρου",
"Last Login" : "Τελευταία Σύνδεση",
diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js
index 3109540a699..965129cb507 100644
--- a/settings/l10n/en_GB.js
+++ b/settings/l10n/en_GB.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Security & Setup Warnings",
"Cron" : "Cron",
"Sharing" : "Sharing",
- "Security" : "Security",
"Email Server" : "Email Server",
"Log" : "Log",
"Authentication error" : "Authentication error",
@@ -39,8 +38,6 @@ OC.L10N.register(
"log-level out of allowed range" : "log-level out of allowed range",
"Saved" : "Saved",
"test email settings" : "test email settings",
- "If you received this email, the settings seem to be correct." : "If you received this email, the settings seem to be correct.",
- "A problem occurred while sending the email. Please revise your settings." : "A problem occurred whilst sending the email. Please revise your settings.",
"Email sent" : "Email sent",
"You need to set your user email before being able to send test emails." : "You need to set your user email before being able to send test emails.",
"Invalid mail address" : "Invalid mail address",
@@ -93,7 +90,6 @@ OC.L10N.register(
"A valid password must be provided" : "A valid password must be provided",
"A valid email must be provided" : "A valid email must be provided",
"__language_name__" : "English (British English)",
- "Personal Info" : "Personal Info",
"SSL root certificates" : "SSL root certificates",
"Encryption" : "Encryption",
"Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)",
@@ -203,7 +199,6 @@ OC.L10N.register(
"Current password" : "Current password",
"New password" : "New password",
"Change password" : "Change password",
- "Full Name" : "Full Name",
"No display name set" : "No display name set",
"Email" : "Email",
"Your email address" : "Your email address",
@@ -224,7 +219,6 @@ OC.L10N.register(
"Valid until" : "Valid until",
"Issued By" : "Issued By",
"Valid until %s" : "Valid until %s",
- "Import Root Certificate" : "Import Root Certificate",
"The encryption app is no longer enabled, please decrypt all your files" : "The encryption app is no longer enabled, please decrypt all your files",
"Log-in password" : "Log-in password",
"Decrypt all Files" : "Decrypt all Files",
@@ -251,6 +245,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Please enter storage quota (e.g. \"512 MB\" or \"12 GB\")",
"Unlimited" : "Unlimited",
"Other" : "Other",
+ "Full Name" : "Full Name",
"Group Admin for" : "Group Admin for",
"Quota" : "Quota",
"Storage Location" : "Storage Location",
diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json
index ac99428a6af..919603a5d84 100644
--- a/settings/l10n/en_GB.json
+++ b/settings/l10n/en_GB.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Security & Setup Warnings",
"Cron" : "Cron",
"Sharing" : "Sharing",
- "Security" : "Security",
"Email Server" : "Email Server",
"Log" : "Log",
"Authentication error" : "Authentication error",
@@ -37,8 +36,6 @@
"log-level out of allowed range" : "log-level out of allowed range",
"Saved" : "Saved",
"test email settings" : "test email settings",
- "If you received this email, the settings seem to be correct." : "If you received this email, the settings seem to be correct.",
- "A problem occurred while sending the email. Please revise your settings." : "A problem occurred whilst sending the email. Please revise your settings.",
"Email sent" : "Email sent",
"You need to set your user email before being able to send test emails." : "You need to set your user email before being able to send test emails.",
"Invalid mail address" : "Invalid mail address",
@@ -91,7 +88,6 @@
"A valid password must be provided" : "A valid password must be provided",
"A valid email must be provided" : "A valid email must be provided",
"__language_name__" : "English (British English)",
- "Personal Info" : "Personal Info",
"SSL root certificates" : "SSL root certificates",
"Encryption" : "Encryption",
"Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)",
@@ -201,7 +197,6 @@
"Current password" : "Current password",
"New password" : "New password",
"Change password" : "Change password",
- "Full Name" : "Full Name",
"No display name set" : "No display name set",
"Email" : "Email",
"Your email address" : "Your email address",
@@ -222,7 +217,6 @@
"Valid until" : "Valid until",
"Issued By" : "Issued By",
"Valid until %s" : "Valid until %s",
- "Import Root Certificate" : "Import Root Certificate",
"The encryption app is no longer enabled, please decrypt all your files" : "The encryption app is no longer enabled, please decrypt all your files",
"Log-in password" : "Log-in password",
"Decrypt all Files" : "Decrypt all Files",
@@ -249,6 +243,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Please enter storage quota (e.g. \"512 MB\" or \"12 GB\")",
"Unlimited" : "Unlimited",
"Other" : "Other",
+ "Full Name" : "Full Name",
"Group Admin for" : "Group Admin for",
"Quota" : "Quota",
"Storage Location" : "Storage Location",
diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js
index ac2cde8908b..0fb4b42fabb 100644
--- a/settings/l10n/eo.js
+++ b/settings/l10n/eo.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "Kunhavigo",
- "Security" : "Sekuro",
"Email Server" : "Retpoŝtoservilo",
"Log" : "Protokolo",
"Authentication error" : "Aŭtentiga eraro",
@@ -107,7 +106,6 @@ OC.L10N.register(
"Current password" : "Nuna pasvorto",
"New password" : "Nova pasvorto",
"Change password" : "Ŝanĝi la pasvorton",
- "Full Name" : "Plena nomo",
"Email" : "Retpoŝto",
"Your email address" : "Via retpoŝta adreso",
"Profile picture" : "Profila bildo",
@@ -119,7 +117,6 @@ OC.L10N.register(
"Choose as profile image" : "Elekti kiel profilan bildon",
"Language" : "Lingvo",
"Help translate" : "Helpu traduki",
- "Import Root Certificate" : "Enporti radikan ateston",
"Log-in password" : "Ensaluta pasvorto",
"Decrypt all Files" : "Malĉifri ĉiujn dosierojn",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Viaj ĉifroklavoj moviĝis al savokopia loko. Se io malsukcesas, vi povas restaŭri la klavojn. Nur forigu ilin porĉiame se vi certas, ke ĉiuj dosieroj malĉifriĝis korekte.",
@@ -134,6 +131,7 @@ OC.L10N.register(
"Default Quota" : "Defaŭlta kvoto",
"Unlimited" : "Senlima",
"Other" : "Alia",
+ "Full Name" : "Plena nomo",
"Quota" : "Kvoto",
"Last Login" : "Lasta ensaluto",
"change full name" : "ŝanĝi plenan nomon",
diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json
index 7ae45f9d09b..fd0e587da55 100644
--- a/settings/l10n/eo.json
+++ b/settings/l10n/eo.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "Kunhavigo",
- "Security" : "Sekuro",
"Email Server" : "Retpoŝtoservilo",
"Log" : "Protokolo",
"Authentication error" : "Aŭtentiga eraro",
@@ -105,7 +104,6 @@
"Current password" : "Nuna pasvorto",
"New password" : "Nova pasvorto",
"Change password" : "Ŝanĝi la pasvorton",
- "Full Name" : "Plena nomo",
"Email" : "Retpoŝto",
"Your email address" : "Via retpoŝta adreso",
"Profile picture" : "Profila bildo",
@@ -117,7 +115,6 @@
"Choose as profile image" : "Elekti kiel profilan bildon",
"Language" : "Lingvo",
"Help translate" : "Helpu traduki",
- "Import Root Certificate" : "Enporti radikan ateston",
"Log-in password" : "Ensaluta pasvorto",
"Decrypt all Files" : "Malĉifri ĉiujn dosierojn",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Viaj ĉifroklavoj moviĝis al savokopia loko. Se io malsukcesas, vi povas restaŭri la klavojn. Nur forigu ilin porĉiame se vi certas, ke ĉiuj dosieroj malĉifriĝis korekte.",
@@ -132,6 +129,7 @@
"Default Quota" : "Defaŭlta kvoto",
"Unlimited" : "Senlima",
"Other" : "Alia",
+ "Full Name" : "Plena nomo",
"Quota" : "Kvoto",
"Last Login" : "Lasta ensaluto",
"change full name" : "ŝanĝi plenan nomon",
diff --git a/settings/l10n/es.js b/settings/l10n/es.js
index ca7fda26daa..992b9d5ced0 100644
--- a/settings/l10n/es.js
+++ b/settings/l10n/es.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Advertencias de configuración y seguridad",
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridad",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Registro",
"Authentication error" : "Error de autenticación",
@@ -39,8 +38,7 @@ OC.L10N.register(
"log-level out of allowed range" : "Nivel de autenticación fuera del rango permitido",
"Saved" : "Guardado",
"test email settings" : "probar configuración de correo electrónico",
- "If you received this email, the settings seem to be correct." : "Si recibió este mensaje de correo electrónico, su configuración debe estar correcta.",
- "A problem occurred while sending the email. Please revise your settings." : "Ocurrió un problema al mandar el mensaje. Revise la configuración.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocurrió un problema al enviar el mensaje de correo electrónico. Revise su configuración. (Error: %s)",
"Email sent" : "Correo electrónico enviado",
"You need to set your user email before being able to send test emails." : "Tiene que configurar su dirección de correo electrónico antes de poder enviar mensajes de prueba.",
"Invalid mail address" : "Dirección de correo inválida",
@@ -93,7 +91,6 @@ OC.L10N.register(
"A valid password must be provided" : "Se debe proporcionar una contraseña válida",
"A valid email must be provided" : "Se debe brindar una dirección de correo electrónico válida ",
"__language_name__" : "Castellano",
- "Personal Info" : "Información personal",
"SSL root certificates" : "Certificados raíz SSL",
"Encryption" : "Cifrado",
"Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)",
@@ -204,7 +201,6 @@ OC.L10N.register(
"Current password" : "Contraseña actual",
"New password" : "Nueva contraseña",
"Change password" : "Cambiar contraseña",
- "Full Name" : "Nombre completo",
"No display name set" : "No se ha establecido ningún nombre para mostrar",
"Email" : "Correo electrónico",
"Your email address" : "Su dirección de correo",
@@ -225,7 +221,6 @@ OC.L10N.register(
"Valid until" : "Válido hasta",
"Issued By" : "Emitido por",
"Valid until %s" : "Válido hasta %s",
- "Import Root Certificate" : "Importar certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "La aplicación de cifrado ya no está activada, descifre todos sus archivos",
"Log-in password" : "Contraseña de acceso",
"Decrypt all Files" : "Descifrar archivos",
@@ -252,6 +247,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor indique la cúota de almacenamiento (ej: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Otro",
+ "Full Name" : "Nombre completo",
"Group Admin for" : "Grupo administrador para",
"Quota" : "Cuota",
"Storage Location" : "Ubicación de almacenamiento",
diff --git a/settings/l10n/es.json b/settings/l10n/es.json
index 8bd8a6854c9..44947b22800 100644
--- a/settings/l10n/es.json
+++ b/settings/l10n/es.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Advertencias de configuración y seguridad",
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridad",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Registro",
"Authentication error" : "Error de autenticación",
@@ -37,8 +36,7 @@
"log-level out of allowed range" : "Nivel de autenticación fuera del rango permitido",
"Saved" : "Guardado",
"test email settings" : "probar configuración de correo electrónico",
- "If you received this email, the settings seem to be correct." : "Si recibió este mensaje de correo electrónico, su configuración debe estar correcta.",
- "A problem occurred while sending the email. Please revise your settings." : "Ocurrió un problema al mandar el mensaje. Revise la configuración.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocurrió un problema al enviar el mensaje de correo electrónico. Revise su configuración. (Error: %s)",
"Email sent" : "Correo electrónico enviado",
"You need to set your user email before being able to send test emails." : "Tiene que configurar su dirección de correo electrónico antes de poder enviar mensajes de prueba.",
"Invalid mail address" : "Dirección de correo inválida",
@@ -91,7 +89,6 @@
"A valid password must be provided" : "Se debe proporcionar una contraseña válida",
"A valid email must be provided" : "Se debe brindar una dirección de correo electrónico válida ",
"__language_name__" : "Castellano",
- "Personal Info" : "Información personal",
"SSL root certificates" : "Certificados raíz SSL",
"Encryption" : "Cifrado",
"Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)",
@@ -202,7 +199,6 @@
"Current password" : "Contraseña actual",
"New password" : "Nueva contraseña",
"Change password" : "Cambiar contraseña",
- "Full Name" : "Nombre completo",
"No display name set" : "No se ha establecido ningún nombre para mostrar",
"Email" : "Correo electrónico",
"Your email address" : "Su dirección de correo",
@@ -223,7 +219,6 @@
"Valid until" : "Válido hasta",
"Issued By" : "Emitido por",
"Valid until %s" : "Válido hasta %s",
- "Import Root Certificate" : "Importar certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "La aplicación de cifrado ya no está activada, descifre todos sus archivos",
"Log-in password" : "Contraseña de acceso",
"Decrypt all Files" : "Descifrar archivos",
@@ -250,6 +245,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor indique la cúota de almacenamiento (ej: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Otro",
+ "Full Name" : "Nombre completo",
"Group Admin for" : "Grupo administrador para",
"Quota" : "Cuota",
"Storage Location" : "Ubicación de almacenamiento",
diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js
index cfd4b3d9daf..e6eae1b64cf 100644
--- a/settings/l10n/es_AR.js
+++ b/settings/l10n/es_AR.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridad",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Log",
"Authentication error" : "Error al autenticar",
@@ -24,7 +23,6 @@ OC.L10N.register(
"Enabled" : "Habilitado",
"Saved" : "Guardado",
"test email settings" : "Configuración de correo de prueba.",
- "If you received this email, the settings seem to be correct." : "Si recibió este correo, la configuración parece estar correcta.",
"Email sent" : "e-mail mandado",
"You need to set your user email before being able to send test emails." : "Necesita especificar el usuario de correo electrónico antes de poder enviar correos electrónicos de prueba.",
"Email saved" : "e-mail guardado",
@@ -113,7 +111,6 @@ OC.L10N.register(
"Current password" : "Contraseña actual",
"New password" : "Nueva contraseña:",
"Change password" : "Cambiar contraseña",
- "Full Name" : "Nombre completo",
"Email" : "e-mail",
"Your email address" : "Tu dirección de e-mail",
"Fill in an email address to enable password recovery and receive notifications" : "Rellene una direccion de correo para habilitar la recuperacion de contraseña y recibir notificaciones. ",
@@ -127,7 +124,6 @@ OC.L10N.register(
"Choose as profile image" : "Elegir como imagen de perfil",
"Language" : "Idioma",
"Help translate" : "Ayudanos a traducir",
- "Import Root Certificate" : "Importar certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "La aplicación de encriptación ya no está habilidata, por favor desencripte todos sus archivos.",
"Log-in password" : "Clave de acceso",
"Decrypt all Files" : "Desencriptar todos los archivos",
@@ -140,6 +136,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor ingrese la cuota de almacenamiento (ej.: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Otros",
+ "Full Name" : "Nombre completo",
"Quota" : "Cuota",
"change full name" : "Cambiar nombre completo",
"set new password" : "Configurar nueva contraseña",
diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json
index f2b8322c40b..46e1305f796 100644
--- a/settings/l10n/es_AR.json
+++ b/settings/l10n/es_AR.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridad",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Log",
"Authentication error" : "Error al autenticar",
@@ -22,7 +21,6 @@
"Enabled" : "Habilitado",
"Saved" : "Guardado",
"test email settings" : "Configuración de correo de prueba.",
- "If you received this email, the settings seem to be correct." : "Si recibió este correo, la configuración parece estar correcta.",
"Email sent" : "e-mail mandado",
"You need to set your user email before being able to send test emails." : "Necesita especificar el usuario de correo electrónico antes de poder enviar correos electrónicos de prueba.",
"Email saved" : "e-mail guardado",
@@ -111,7 +109,6 @@
"Current password" : "Contraseña actual",
"New password" : "Nueva contraseña:",
"Change password" : "Cambiar contraseña",
- "Full Name" : "Nombre completo",
"Email" : "e-mail",
"Your email address" : "Tu dirección de e-mail",
"Fill in an email address to enable password recovery and receive notifications" : "Rellene una direccion de correo para habilitar la recuperacion de contraseña y recibir notificaciones. ",
@@ -125,7 +122,6 @@
"Choose as profile image" : "Elegir como imagen de perfil",
"Language" : "Idioma",
"Help translate" : "Ayudanos a traducir",
- "Import Root Certificate" : "Importar certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "La aplicación de encriptación ya no está habilidata, por favor desencripte todos sus archivos.",
"Log-in password" : "Clave de acceso",
"Decrypt all Files" : "Desencriptar todos los archivos",
@@ -138,6 +134,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor ingrese la cuota de almacenamiento (ej.: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Otros",
+ "Full Name" : "Nombre completo",
"Quota" : "Cuota",
"change full name" : "Cambiar nombre completo",
"set new password" : "Configurar nueva contraseña",
diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js
index c0919321307..47c04b6bdde 100644
--- a/settings/l10n/es_MX.js
+++ b/settings/l10n/es_MX.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridad",
"Log" : "Registro",
"Authentication error" : "Error de autenticación",
"Your full name has been changed." : "Se ha cambiado su nombre completo.",
@@ -83,7 +82,6 @@ OC.L10N.register(
"Current password" : "Contraseña actual",
"New password" : "Nueva contraseña",
"Change password" : "Cambiar contraseña",
- "Full Name" : "Nombre completo",
"Email" : "Correo electrónico",
"Your email address" : "Su dirección de correo",
"Profile picture" : "Foto de perfil",
@@ -96,7 +94,6 @@ OC.L10N.register(
"Choose as profile image" : "Seleccionar como imagen de perfil",
"Language" : "Idioma",
"Help translate" : "Ayúdanos a traducir",
- "Import Root Certificate" : "Importar certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "La aplicación de cifrado ya no está activada, descifre todos sus archivos",
"Log-in password" : "Contraseña de acceso",
"Decrypt all Files" : "Descifrar archivos",
@@ -107,6 +104,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor indique la cúota de almacenamiento (ej: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Otro",
+ "Full Name" : "Nombre completo",
"change full name" : "cambiar el nombre completo",
"set new password" : "establecer nueva contraseña",
"Default" : "Predeterminado"
diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json
index d73e8b2fdb4..3b8388ee905 100644
--- a/settings/l10n/es_MX.json
+++ b/settings/l10n/es_MX.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Security" : "Seguridad",
"Log" : "Registro",
"Authentication error" : "Error de autenticación",
"Your full name has been changed." : "Se ha cambiado su nombre completo.",
@@ -81,7 +80,6 @@
"Current password" : "Contraseña actual",
"New password" : "Nueva contraseña",
"Change password" : "Cambiar contraseña",
- "Full Name" : "Nombre completo",
"Email" : "Correo electrónico",
"Your email address" : "Su dirección de correo",
"Profile picture" : "Foto de perfil",
@@ -94,7 +92,6 @@
"Choose as profile image" : "Seleccionar como imagen de perfil",
"Language" : "Idioma",
"Help translate" : "Ayúdanos a traducir",
- "Import Root Certificate" : "Importar certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "La aplicación de cifrado ya no está activada, descifre todos sus archivos",
"Log-in password" : "Contraseña de acceso",
"Decrypt all Files" : "Descifrar archivos",
@@ -105,6 +102,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor indique la cúota de almacenamiento (ej: \"512 MB\" o \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Otro",
+ "Full Name" : "Nombre completo",
"change full name" : "cambiar el nombre completo",
"set new password" : "establecer nueva contraseña",
"Default" : "Predeterminado"
diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js
index 837f98162c7..7c35b31faba 100644
--- a/settings/l10n/et_EE.js
+++ b/settings/l10n/et_EE.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Turva- ja paigalduse hoiatused",
"Cron" : "Cron",
"Sharing" : "Jagamine",
- "Security" : "Turvalisus",
"Email Server" : "Postiserver",
"Log" : "Logi",
"Authentication error" : "Autentimise viga",
@@ -34,8 +33,6 @@ OC.L10N.register(
"Recommended" : "Soovitatud",
"Saved" : "Salvestatud",
"test email settings" : "testi e-posti seadeid",
- "If you received this email, the settings seem to be correct." : "Kui said selle kirja, siis on seadistus korrektne.",
- "A problem occurred while sending the email. Please revise your settings." : "Kirja saatmisel tekkis tõrge. Palun kontrolli üle oma seadistus.",
"Email sent" : "E-kiri on saadetud",
"You need to set your user email before being able to send test emails." : "Pead seadistama oma e-postienne kui on võimalik saata test-kirju.",
"Email saved" : "Kiri on salvestatud",
@@ -79,7 +76,6 @@ OC.L10N.register(
"Error creating user" : "Viga kasutaja loomisel",
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
"__language_name__" : "Eesti",
- "Personal Info" : "Isiklik info",
"SSL root certificates" : "SSL root sertifikaadid",
"Encryption" : "Krüpteerimine",
"Everything (fatal issues, errors, warnings, info, debug)" : "Kõik (tõsised probleemid, veateated, hoiatused, info, veatuvastus)",
@@ -162,7 +158,6 @@ OC.L10N.register(
"Current password" : "Praegune parool",
"New password" : "Uus parool",
"Change password" : "Muuda parooli",
- "Full Name" : "Täispikk nimi",
"Email" : "E-post",
"Your email address" : "Sinu e-posti aadress",
"Fill in an email address to enable password recovery and receive notifications" : "Täida e-posti aadress võimaldamaks parooli taastamist ning teadete saamist.",
@@ -180,7 +175,6 @@ OC.L10N.register(
"Valid until" : "Kehtib kuni",
"Issued By" : "isas",
"Valid until %s" : "Kehtib kuni %s",
- "Import Root Certificate" : "Impordi root sertifikaadid",
"The encryption app is no longer enabled, please decrypt all your files" : "Küpteeringu rakend pole lubatud, dekrüpteeri kõik oma failid",
"Log-in password" : "Sisselogimise parool",
"Decrypt all Files" : "Dekrüpteeri kõik failid",
@@ -201,6 +195,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Palun sisesta mahupiir (nt: \"512 MB\" või \"12 GB\")",
"Unlimited" : "Piiramatult",
"Other" : "Muu",
+ "Full Name" : "Täispikk nimi",
"Group Admin for" : "Grupi admin",
"Quota" : "Mahupiir",
"Storage Location" : "Mahu asukoht",
diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json
index 94180d22cd5..0dcabc9a12f 100644
--- a/settings/l10n/et_EE.json
+++ b/settings/l10n/et_EE.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Turva- ja paigalduse hoiatused",
"Cron" : "Cron",
"Sharing" : "Jagamine",
- "Security" : "Turvalisus",
"Email Server" : "Postiserver",
"Log" : "Logi",
"Authentication error" : "Autentimise viga",
@@ -32,8 +31,6 @@
"Recommended" : "Soovitatud",
"Saved" : "Salvestatud",
"test email settings" : "testi e-posti seadeid",
- "If you received this email, the settings seem to be correct." : "Kui said selle kirja, siis on seadistus korrektne.",
- "A problem occurred while sending the email. Please revise your settings." : "Kirja saatmisel tekkis tõrge. Palun kontrolli üle oma seadistus.",
"Email sent" : "E-kiri on saadetud",
"You need to set your user email before being able to send test emails." : "Pead seadistama oma e-postienne kui on võimalik saata test-kirju.",
"Email saved" : "Kiri on salvestatud",
@@ -77,7 +74,6 @@
"Error creating user" : "Viga kasutaja loomisel",
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
"__language_name__" : "Eesti",
- "Personal Info" : "Isiklik info",
"SSL root certificates" : "SSL root sertifikaadid",
"Encryption" : "Krüpteerimine",
"Everything (fatal issues, errors, warnings, info, debug)" : "Kõik (tõsised probleemid, veateated, hoiatused, info, veatuvastus)",
@@ -160,7 +156,6 @@
"Current password" : "Praegune parool",
"New password" : "Uus parool",
"Change password" : "Muuda parooli",
- "Full Name" : "Täispikk nimi",
"Email" : "E-post",
"Your email address" : "Sinu e-posti aadress",
"Fill in an email address to enable password recovery and receive notifications" : "Täida e-posti aadress võimaldamaks parooli taastamist ning teadete saamist.",
@@ -178,7 +173,6 @@
"Valid until" : "Kehtib kuni",
"Issued By" : "isas",
"Valid until %s" : "Kehtib kuni %s",
- "Import Root Certificate" : "Impordi root sertifikaadid",
"The encryption app is no longer enabled, please decrypt all your files" : "Küpteeringu rakend pole lubatud, dekrüpteeri kõik oma failid",
"Log-in password" : "Sisselogimise parool",
"Decrypt all Files" : "Dekrüpteeri kõik failid",
@@ -199,6 +193,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Palun sisesta mahupiir (nt: \"512 MB\" või \"12 GB\")",
"Unlimited" : "Piiramatult",
"Other" : "Muu",
+ "Full Name" : "Täispikk nimi",
"Group Admin for" : "Grupi admin",
"Quota" : "Mahupiir",
"Storage Location" : "Mahu asukoht",
diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js
index c9123659b76..842f2028ca6 100644
--- a/settings/l10n/eu.js
+++ b/settings/l10n/eu.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Segurtasun eta Konfigurazio Abisuak",
"Cron" : "Cron",
"Sharing" : "Partekatzea",
- "Security" : "Segurtasuna",
"Email Server" : "Eposta zerbitzaria",
"Log" : "Log",
"Authentication error" : "Autentifikazio errorea",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "erregistro-maila baimendutako tartetik at",
"Saved" : "Gordeta",
"test email settings" : "probatu eposta ezarpenak",
- "If you received this email, the settings seem to be correct." : "Eposta hau jaso baduzu, zure ezarpenak egokiak direnaren seinale",
- "A problem occurred while sending the email. Please revise your settings." : "Arazo bat gertatu da eposta bidaltzean. Berrikusi zure ezarpenak.",
"Email sent" : "Eposta bidalia",
"You need to set your user email before being able to send test emails." : "Epostaren erabiltzailea zehaztu behar duzu probako eposta bidali aurretik.",
"Invalid mail address" : "Posta helbide baliogabea",
@@ -92,7 +89,6 @@ OC.L10N.register(
"A valid password must be provided" : "Baliozko pasahitza eman behar da",
"A valid email must be provided" : "Baliozko posta elektronikoa eman behar da",
"__language_name__" : "Euskara",
- "Personal Info" : "Informazio Pertsonala",
"SSL root certificates" : "SSL erro ziurtagiriak",
"Encryption" : "Enkriptazioa",
"Everything (fatal issues, errors, warnings, info, debug)" : "Dena (arazo larriak, erroreak, abisuak, informazioa, arazketa)",
@@ -190,7 +186,6 @@ OC.L10N.register(
"Current password" : "Uneko pasahitza",
"New password" : "Pasahitz berria",
"Change password" : "Aldatu pasahitza",
- "Full Name" : "Izena",
"No display name set" : "Ez da bistaratze izena ezarri",
"Email" : "E-posta",
"Your email address" : "Zure e-posta",
@@ -210,7 +205,6 @@ OC.L10N.register(
"Valid until" : "Data hau arte baliogarria",
"Issued By" : "Honek bidalita",
"Valid until %s" : "%s arte baliogarria",
- "Import Root Certificate" : "Inportatu erro ziurtagiria",
"The encryption app is no longer enabled, please decrypt all your files" : "Enkriptazio aplikazioa ez dago jada gaiturik, mesedez desenkriptatu zure fitxategi guztiak.",
"Log-in password" : "Saioa hasteko pasahitza",
"Decrypt all Files" : "Desenkripattu fitxategi guztiak",
@@ -236,6 +230,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Mesedez sartu biltegiratze kouta (adb: \"512 MB\" edo \"12 GB\")",
"Unlimited" : "Mugarik gabe",
"Other" : "Bestelakoa",
+ "Full Name" : "Izena",
"Group Admin for" : "Talde administradorea honentzat",
"Quota" : "Kuota",
"Storage Location" : "Biltegiaren kokapena",
diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json
index 1324065b198..8b2855e2ae3 100644
--- a/settings/l10n/eu.json
+++ b/settings/l10n/eu.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Segurtasun eta Konfigurazio Abisuak",
"Cron" : "Cron",
"Sharing" : "Partekatzea",
- "Security" : "Segurtasuna",
"Email Server" : "Eposta zerbitzaria",
"Log" : "Log",
"Authentication error" : "Autentifikazio errorea",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "erregistro-maila baimendutako tartetik at",
"Saved" : "Gordeta",
"test email settings" : "probatu eposta ezarpenak",
- "If you received this email, the settings seem to be correct." : "Eposta hau jaso baduzu, zure ezarpenak egokiak direnaren seinale",
- "A problem occurred while sending the email. Please revise your settings." : "Arazo bat gertatu da eposta bidaltzean. Berrikusi zure ezarpenak.",
"Email sent" : "Eposta bidalia",
"You need to set your user email before being able to send test emails." : "Epostaren erabiltzailea zehaztu behar duzu probako eposta bidali aurretik.",
"Invalid mail address" : "Posta helbide baliogabea",
@@ -90,7 +87,6 @@
"A valid password must be provided" : "Baliozko pasahitza eman behar da",
"A valid email must be provided" : "Baliozko posta elektronikoa eman behar da",
"__language_name__" : "Euskara",
- "Personal Info" : "Informazio Pertsonala",
"SSL root certificates" : "SSL erro ziurtagiriak",
"Encryption" : "Enkriptazioa",
"Everything (fatal issues, errors, warnings, info, debug)" : "Dena (arazo larriak, erroreak, abisuak, informazioa, arazketa)",
@@ -188,7 +184,6 @@
"Current password" : "Uneko pasahitza",
"New password" : "Pasahitz berria",
"Change password" : "Aldatu pasahitza",
- "Full Name" : "Izena",
"No display name set" : "Ez da bistaratze izena ezarri",
"Email" : "E-posta",
"Your email address" : "Zure e-posta",
@@ -208,7 +203,6 @@
"Valid until" : "Data hau arte baliogarria",
"Issued By" : "Honek bidalita",
"Valid until %s" : "%s arte baliogarria",
- "Import Root Certificate" : "Inportatu erro ziurtagiria",
"The encryption app is no longer enabled, please decrypt all your files" : "Enkriptazio aplikazioa ez dago jada gaiturik, mesedez desenkriptatu zure fitxategi guztiak.",
"Log-in password" : "Saioa hasteko pasahitza",
"Decrypt all Files" : "Desenkripattu fitxategi guztiak",
@@ -234,6 +228,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Mesedez sartu biltegiratze kouta (adb: \"512 MB\" edo \"12 GB\")",
"Unlimited" : "Mugarik gabe",
"Other" : "Bestelakoa",
+ "Full Name" : "Izena",
"Group Admin for" : "Talde administradorea honentzat",
"Quota" : "Kuota",
"Storage Location" : "Biltegiaren kokapena",
diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js
index cc1c7f5799d..cc01e9656ae 100644
--- a/settings/l10n/fa.js
+++ b/settings/l10n/fa.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "زمانبند",
"Sharing" : "اشتراک گذاری",
- "Security" : "امنیت",
"Email Server" : "سرور ایمیل",
"Log" : "کارنامه",
"Authentication error" : "خطا در اعتبار سنجی",
@@ -133,7 +132,6 @@ OC.L10N.register(
"Current password" : "گذرواژه کنونی",
"New password" : "گذرواژه جدید",
"Change password" : "تغییر گذر واژه",
- "Full Name" : "نام کامل",
"Email" : "ایمیل",
"Your email address" : "پست الکترونیکی شما",
"Profile picture" : "تصویر پروفایل",
@@ -145,7 +143,6 @@ OC.L10N.register(
"Choose as profile image" : "یک تصویر پروفایل انتخاب کنید",
"Language" : "زبان",
"Help translate" : "به ترجمه آن کمک کنید",
- "Import Root Certificate" : "وارد کردن گواهی اصلی",
"Log-in password" : "رمز ورود",
"Decrypt all Files" : "تمام فایلها رمزگشایی شود",
"Restore Encryption Keys" : "بازیابی کلید های رمزگذاری",
@@ -162,6 +159,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "لطفا سهمیه ذخیره سازی را وارد کنید (به عنوان مثال: \" 512MB\" یا \"12GB\")",
"Unlimited" : "نامحدود",
"Other" : "دیگر",
+ "Full Name" : "نام کامل",
"Quota" : "سهم",
"Storage Location" : "محل فضای ذخیره سازی",
"Last Login" : "اخرین ورود",
diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json
index 0d49bc82393..6f0d2687e91 100644
--- a/settings/l10n/fa.json
+++ b/settings/l10n/fa.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "زمانبند",
"Sharing" : "اشتراک گذاری",
- "Security" : "امنیت",
"Email Server" : "سرور ایمیل",
"Log" : "کارنامه",
"Authentication error" : "خطا در اعتبار سنجی",
@@ -131,7 +130,6 @@
"Current password" : "گذرواژه کنونی",
"New password" : "گذرواژه جدید",
"Change password" : "تغییر گذر واژه",
- "Full Name" : "نام کامل",
"Email" : "ایمیل",
"Your email address" : "پست الکترونیکی شما",
"Profile picture" : "تصویر پروفایل",
@@ -143,7 +141,6 @@
"Choose as profile image" : "یک تصویر پروفایل انتخاب کنید",
"Language" : "زبان",
"Help translate" : "به ترجمه آن کمک کنید",
- "Import Root Certificate" : "وارد کردن گواهی اصلی",
"Log-in password" : "رمز ورود",
"Decrypt all Files" : "تمام فایلها رمزگشایی شود",
"Restore Encryption Keys" : "بازیابی کلید های رمزگذاری",
@@ -160,6 +157,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "لطفا سهمیه ذخیره سازی را وارد کنید (به عنوان مثال: \" 512MB\" یا \"12GB\")",
"Unlimited" : "نامحدود",
"Other" : "دیگر",
+ "Full Name" : "نام کامل",
"Quota" : "سهم",
"Storage Location" : "محل فضای ذخیره سازی",
"Last Login" : "اخرین ورود",
diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js
index 19f2884f21f..e38402ca5c1 100644
--- a/settings/l10n/fi_FI.js
+++ b/settings/l10n/fi_FI.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Turvallisuus- ja asetusvaroitukset",
"Cron" : "Cron",
"Sharing" : "Jakaminen",
- "Security" : "Tietoturva",
"Email Server" : "Sähköpostipalvelin",
"Log" : "Loki",
"Authentication error" : "Tunnistautumisvirhe",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "lokitaso ei sallittujen rajojen sisäpuolella",
"Saved" : "Tallennettu",
"test email settings" : "testaa sähköpostiasetukset",
- "If you received this email, the settings seem to be correct." : "Jos sait tämän sähköpostin, kaikki asetukset vaikuttavat olevan kunnossa.",
- "A problem occurred while sending the email. Please revise your settings." : "Sähköpostia lähettäessä tapahtui virhe. Tarkista asetukset.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Sähköpostia lähettäessä tapahtui virhe. Tarkista asetukset. (Virhe: %s)",
"Email sent" : "Sähköposti lähetetty",
"You need to set your user email before being able to send test emails." : "Aseta sähköpostiosoite, jotta voit testata sähköpostin toimivuutta.",
"Invalid mail address" : "Virheellinen sähköpostiosoite",
+ "A user with that name already exists." : "Käyttäjä samalla nimellä on jo olemassa.",
"Unable to create user." : "Käyttäjän luominen ei onnistunut.",
"Your %s account was created" : "%s-tilisi luotiin",
"Unable to delete user." : "Käyttäjän poistaminen ei onnistunut.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Anna kelvollinen salasana",
"A valid email must be provided" : "Tarvitaan kelvollinen sähköpostiosoite",
"__language_name__" : "_kielen_nimi_",
- "Personal Info" : "Henkilökohtaiset tiedot",
"SSL root certificates" : "SSL-juurivarmenteet",
"Encryption" : "Salaus",
"Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)",
@@ -173,6 +171,8 @@ OC.L10N.register(
"Documentation:" : "Ohjeistus:",
"User Documentation" : "Käyttäjäohjeistus",
"Admin Documentation" : "Ylläpitäjän ohjeistus",
+ "Show description …" : "Näytä kuvaus…",
+ "Hide description …" : "Piilota kuvaus…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Tätä sovellusta ei voi asentaa, koska seuraavat riippuvuudet eivät täyty:",
"Update to %s" : "Päivitä versioon %s",
"Enable only for specific groups" : "Salli vain tietyille ryhmille",
@@ -197,7 +197,6 @@ OC.L10N.register(
"Current password" : "Nykyinen salasana",
"New password" : "Uusi salasana",
"Change password" : "Vaihda salasana",
- "Full Name" : "Koko nimi",
"No display name set" : "Näyttönimeä ei ole asetettu",
"Email" : "Sähköpostiosoite",
"Your email address" : "Sähköpostiosoitteesi",
@@ -218,7 +217,6 @@ OC.L10N.register(
"Valid until" : "Kelvollinen",
"Issued By" : " Myöntänyt",
"Valid until %s" : "Kelvollinen %s asti",
- "Import Root Certificate" : "Tuo juurivarmenne",
"The encryption app is no longer enabled, please decrypt all your files" : "Salaussovellus ei ole enää käytössä, joten pura kaikkien tiedostojesi salaus",
"Log-in password" : "Kirjautumissalasana",
"Decrypt all Files" : "Pura kaikkien tiedostojen salaus",
@@ -244,6 +242,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Määritä tallennustilan kiintiö (esim. \"512 MB\" tai \"12 GB\")",
"Unlimited" : "Rajoittamaton",
"Other" : "Muu",
+ "Full Name" : "Koko nimi",
"Group Admin for" : "Ryhmäylläpitäjä kohteille",
"Quota" : "Kiintiö",
"Storage Location" : "Tallennustilan sijainti",
diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json
index bcc24715273..ee0ae4bc397 100644
--- a/settings/l10n/fi_FI.json
+++ b/settings/l10n/fi_FI.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Turvallisuus- ja asetusvaroitukset",
"Cron" : "Cron",
"Sharing" : "Jakaminen",
- "Security" : "Tietoturva",
"Email Server" : "Sähköpostipalvelin",
"Log" : "Loki",
"Authentication error" : "Tunnistautumisvirhe",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "lokitaso ei sallittujen rajojen sisäpuolella",
"Saved" : "Tallennettu",
"test email settings" : "testaa sähköpostiasetukset",
- "If you received this email, the settings seem to be correct." : "Jos sait tämän sähköpostin, kaikki asetukset vaikuttavat olevan kunnossa.",
- "A problem occurred while sending the email. Please revise your settings." : "Sähköpostia lähettäessä tapahtui virhe. Tarkista asetukset.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Sähköpostia lähettäessä tapahtui virhe. Tarkista asetukset. (Virhe: %s)",
"Email sent" : "Sähköposti lähetetty",
"You need to set your user email before being able to send test emails." : "Aseta sähköpostiosoite, jotta voit testata sähköpostin toimivuutta.",
"Invalid mail address" : "Virheellinen sähköpostiosoite",
+ "A user with that name already exists." : "Käyttäjä samalla nimellä on jo olemassa.",
"Unable to create user." : "Käyttäjän luominen ei onnistunut.",
"Your %s account was created" : "%s-tilisi luotiin",
"Unable to delete user." : "Käyttäjän poistaminen ei onnistunut.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Anna kelvollinen salasana",
"A valid email must be provided" : "Tarvitaan kelvollinen sähköpostiosoite",
"__language_name__" : "_kielen_nimi_",
- "Personal Info" : "Henkilökohtaiset tiedot",
"SSL root certificates" : "SSL-juurivarmenteet",
"Encryption" : "Salaus",
"Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)",
@@ -171,6 +169,8 @@
"Documentation:" : "Ohjeistus:",
"User Documentation" : "Käyttäjäohjeistus",
"Admin Documentation" : "Ylläpitäjän ohjeistus",
+ "Show description …" : "Näytä kuvaus…",
+ "Hide description …" : "Piilota kuvaus…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Tätä sovellusta ei voi asentaa, koska seuraavat riippuvuudet eivät täyty:",
"Update to %s" : "Päivitä versioon %s",
"Enable only for specific groups" : "Salli vain tietyille ryhmille",
@@ -195,7 +195,6 @@
"Current password" : "Nykyinen salasana",
"New password" : "Uusi salasana",
"Change password" : "Vaihda salasana",
- "Full Name" : "Koko nimi",
"No display name set" : "Näyttönimeä ei ole asetettu",
"Email" : "Sähköpostiosoite",
"Your email address" : "Sähköpostiosoitteesi",
@@ -216,7 +215,6 @@
"Valid until" : "Kelvollinen",
"Issued By" : " Myöntänyt",
"Valid until %s" : "Kelvollinen %s asti",
- "Import Root Certificate" : "Tuo juurivarmenne",
"The encryption app is no longer enabled, please decrypt all your files" : "Salaussovellus ei ole enää käytössä, joten pura kaikkien tiedostojesi salaus",
"Log-in password" : "Kirjautumissalasana",
"Decrypt all Files" : "Pura kaikkien tiedostojen salaus",
@@ -242,6 +240,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Määritä tallennustilan kiintiö (esim. \"512 MB\" tai \"12 GB\")",
"Unlimited" : "Rajoittamaton",
"Other" : "Muu",
+ "Full Name" : "Koko nimi",
"Group Admin for" : "Ryhmäylläpitäjä kohteille",
"Quota" : "Kiintiö",
"Storage Location" : "Tallennustilan sijainti",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 1fdf4f2f579..29748097ddb 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Alertes de sécurité ou de configuration",
"Cron" : "Cron",
"Sharing" : "Partage",
- "Security" : "Sécurité",
"Email Server" : "Serveur mail",
"Log" : "Log",
"Authentication error" : "Erreur d'authentification",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "niveau de journalisation hors borne",
"Saved" : "Sauvegardé",
"test email settings" : "tester les paramètres d'e-mail",
- "If you received this email, the settings seem to be correct." : "Si vous recevez cet email, c'est que les paramètres sont corrects",
- "A problem occurred while sending the email. Please revise your settings." : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres. (Erreur: %s)",
"Email sent" : "Email envoyé",
"You need to set your user email before being able to send test emails." : "Vous devez configurer votre e-mail d'utilisateur avant de pouvoir envoyer des e-mails de test.",
"Invalid mail address" : "Adresse email non valide",
+ "A user with that name already exists." : "Un utilisateur à ce nom existe déjà.",
"Unable to create user." : "Impossible de créer l'utilisateur.",
"Your %s account was created" : "Votre compte %s a été créé.",
"Unable to delete user." : "Impossible de supprimer l'utilisateur.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
"A valid email must be provided" : "Vous devez fournir une adresse de courriel valide",
"__language_name__" : "Français",
- "Personal Info" : "Informations personnelles",
"SSL root certificates" : "Certificats racine SSL",
"Encryption" : "Chiffrement",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)",
@@ -171,7 +169,7 @@ OC.L10N.register(
"Download logfile" : "Télécharger le fichier de journalisation",
"More" : "Plus",
"Less" : "Moins",
- "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Le fichier de journalisation dépasser les 100 Mo. Le télécharger peut prendre un certain temps.",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "La taille du fichier journal excède 100 Mo. Le télécharger peut prendre un certain temps!",
"Version" : "Version",
"More apps" : "Plus d'applications",
"Developer documentation" : "Documentation pour les développeurs",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Documentation :",
"User Documentation" : "Documentation utilisateur",
"Admin Documentation" : "Documentation administrateur",
+ "Show description …" : "Afficher la description...",
+ "Hide description …" : "Masquer la description...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Cette application ne peut être installée à cause de ces dépendances non satisfaites :",
"Update to %s" : "Mettre à niveau vers la version %s",
"Enable only for specific groups" : "Activer uniquement pour certains groupes",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Mot de passe actuel",
"New password" : "Nouveau mot de passe",
"Change password" : "Changer de mot de passe",
- "Full Name" : "Nom complet",
"No display name set" : "Aucun nom d'affichage configuré",
"Email" : "Adresse mail",
"Your email address" : "Votre adresse mail",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Valide jusqu'à",
"Issued By" : "Délivré par",
"Valid until %s" : "Valide jusqu'à %s",
- "Import Root Certificate" : "Importer un certificat racine",
"The encryption app is no longer enabled, please decrypt all your files" : "L'app de chiffrement n’est plus activée, veuillez déchiffrer tous vos fichiers",
"Log-in password" : "Mot de passe de connexion",
"Decrypt all Files" : "Déchiffrer tous les fichiers",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Veuillez entrer le quota de stockage (ex. \"512 MB\" ou \"12 GB\")",
"Unlimited" : "Illimité",
"Other" : "Autre",
+ "Full Name" : "Nom complet",
"Group Admin for" : "Administrateur de groupe pour",
"Quota" : "Quota",
"Storage Location" : "Emplacement du Stockage",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index f309c18c8a9..7363e0997dc 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Alertes de sécurité ou de configuration",
"Cron" : "Cron",
"Sharing" : "Partage",
- "Security" : "Sécurité",
"Email Server" : "Serveur mail",
"Log" : "Log",
"Authentication error" : "Erreur d'authentification",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "niveau de journalisation hors borne",
"Saved" : "Sauvegardé",
"test email settings" : "tester les paramètres d'e-mail",
- "If you received this email, the settings seem to be correct." : "Si vous recevez cet email, c'est que les paramètres sont corrects",
- "A problem occurred while sending the email. Please revise your settings." : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres. (Erreur: %s)",
"Email sent" : "Email envoyé",
"You need to set your user email before being able to send test emails." : "Vous devez configurer votre e-mail d'utilisateur avant de pouvoir envoyer des e-mails de test.",
"Invalid mail address" : "Adresse email non valide",
+ "A user with that name already exists." : "Un utilisateur à ce nom existe déjà.",
"Unable to create user." : "Impossible de créer l'utilisateur.",
"Your %s account was created" : "Votre compte %s a été créé.",
"Unable to delete user." : "Impossible de supprimer l'utilisateur.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
"A valid email must be provided" : "Vous devez fournir une adresse de courriel valide",
"__language_name__" : "Français",
- "Personal Info" : "Informations personnelles",
"SSL root certificates" : "Certificats racine SSL",
"Encryption" : "Chiffrement",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)",
@@ -169,7 +167,7 @@
"Download logfile" : "Télécharger le fichier de journalisation",
"More" : "Plus",
"Less" : "Moins",
- "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Le fichier de journalisation dépasser les 100 Mo. Le télécharger peut prendre un certain temps.",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "La taille du fichier journal excède 100 Mo. Le télécharger peut prendre un certain temps!",
"Version" : "Version",
"More apps" : "Plus d'applications",
"Developer documentation" : "Documentation pour les développeurs",
@@ -178,6 +176,8 @@
"Documentation:" : "Documentation :",
"User Documentation" : "Documentation utilisateur",
"Admin Documentation" : "Documentation administrateur",
+ "Show description …" : "Afficher la description...",
+ "Hide description …" : "Masquer la description...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Cette application ne peut être installée à cause de ces dépendances non satisfaites :",
"Update to %s" : "Mettre à niveau vers la version %s",
"Enable only for specific groups" : "Activer uniquement pour certains groupes",
@@ -202,7 +202,6 @@
"Current password" : "Mot de passe actuel",
"New password" : "Nouveau mot de passe",
"Change password" : "Changer de mot de passe",
- "Full Name" : "Nom complet",
"No display name set" : "Aucun nom d'affichage configuré",
"Email" : "Adresse mail",
"Your email address" : "Votre adresse mail",
@@ -223,7 +222,6 @@
"Valid until" : "Valide jusqu'à",
"Issued By" : "Délivré par",
"Valid until %s" : "Valide jusqu'à %s",
- "Import Root Certificate" : "Importer un certificat racine",
"The encryption app is no longer enabled, please decrypt all your files" : "L'app de chiffrement n’est plus activée, veuillez déchiffrer tous vos fichiers",
"Log-in password" : "Mot de passe de connexion",
"Decrypt all Files" : "Déchiffrer tous les fichiers",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Veuillez entrer le quota de stockage (ex. \"512 MB\" ou \"12 GB\")",
"Unlimited" : "Illimité",
"Other" : "Autre",
+ "Full Name" : "Nom complet",
"Group Admin for" : "Administrateur de groupe pour",
"Quota" : "Quota",
"Storage Location" : "Emplacement du Stockage",
diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js
index 9ff5f21cb6a..ee941a23e43 100644
--- a/settings/l10n/gl.js
+++ b/settings/l10n/gl.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Avisos de seguridade e configuración",
"Cron" : "Cron",
"Sharing" : "Compartindo",
- "Security" : "Seguranza",
"Email Server" : "Servidor de correo",
"Log" : "Rexistro",
"Authentication error" : "Produciuse un erro de autenticación",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "o nivel do rexistro está fora do intervalo admitido",
"Saved" : "Gardado",
"test email settings" : "correo de proba dos axustes",
- "If you received this email, the settings seem to be correct." : "Se recibiu este correo, semella que a configuración é correcta.",
- "A problem occurred while sending the email. Please revise your settings." : "Produciuse un erro mentres enviaba o correo. Revise os axustes.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu un problema ao enviar o correo. Revise a súa configuración. (Erro: %s)",
"Email sent" : "Correo enviado",
"You need to set your user email before being able to send test emails." : "É necesario configurar o correo do usuario antes de poder enviar mensaxes de correo de proba.",
"Invalid mail address" : "Enderezo de correo incorrecto",
+ "A user with that name already exists." : "Xa existe un usuario con ese nome.",
"Unable to create user." : "Non é posíbel crear o usuario.",
"Your %s account was created" : "Foi creada a conta %s",
"Unable to delete user." : "Non é posíbel eliminar o usuario.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Debe fornecer un contrasinal",
"A valid email must be provided" : "Ten que fornecer un correo funcional",
"__language_name__" : "Galego",
- "Personal Info" : "Información personal",
"SSL root certificates" : "Certificados raíz SSL",
"Encryption" : "Cifrado",
"Everything (fatal issues, errors, warnings, info, debug)" : "Todo (problemas críticos, erros, avisos, información, depuración)",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Documentación:",
"User Documentation" : "Documentación do usuario",
"Admin Documentation" : "Documentación do administrador",
+ "Show description …" : "Amosar a descrición ...",
+ "Hide description …" : "Agochar a descrición ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Non é posíbel instalar esta aplicación por mor de non cumprirse as dependencias:",
"Update to %s" : "Actualizar a %s",
"Enable only for specific groups" : "Activar só para grupos específicos",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Contrasinal actual",
"New password" : "Novo contrasinal",
"Change password" : "Cambiar o contrasinal",
- "Full Name" : "Nome completo",
"No display name set" : "Sen nome visíbel estabelecido",
"Email" : "Correo",
"Your email address" : "O seu enderezo de correo",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Válido ata",
"Issued By" : "Fornecido por",
"Valid until %s" : "Válido ata %s",
- "Import Root Certificate" : "Importar o certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "A aplicación de cifrado non está activada, descifre todos os ficheiros",
"Log-in password" : "Contrasinal de acceso",
"Decrypt all Files" : "Descifrar todos os ficheiros",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Introduza a cota de almacenamento (p.ex. «512 MB» ou «12 GB»)",
"Unlimited" : "Sen límites",
"Other" : "Outro",
+ "Full Name" : "Nome completo",
"Group Admin for" : "Grupo de Admin para",
"Quota" : "Cota",
"Storage Location" : "Localización do almacenamento",
diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json
index 6d9b47b8e5a..d89e3e705e6 100644
--- a/settings/l10n/gl.json
+++ b/settings/l10n/gl.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Avisos de seguridade e configuración",
"Cron" : "Cron",
"Sharing" : "Compartindo",
- "Security" : "Seguranza",
"Email Server" : "Servidor de correo",
"Log" : "Rexistro",
"Authentication error" : "Produciuse un erro de autenticación",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "o nivel do rexistro está fora do intervalo admitido",
"Saved" : "Gardado",
"test email settings" : "correo de proba dos axustes",
- "If you received this email, the settings seem to be correct." : "Se recibiu este correo, semella que a configuración é correcta.",
- "A problem occurred while sending the email. Please revise your settings." : "Produciuse un erro mentres enviaba o correo. Revise os axustes.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu un problema ao enviar o correo. Revise a súa configuración. (Erro: %s)",
"Email sent" : "Correo enviado",
"You need to set your user email before being able to send test emails." : "É necesario configurar o correo do usuario antes de poder enviar mensaxes de correo de proba.",
"Invalid mail address" : "Enderezo de correo incorrecto",
+ "A user with that name already exists." : "Xa existe un usuario con ese nome.",
"Unable to create user." : "Non é posíbel crear o usuario.",
"Your %s account was created" : "Foi creada a conta %s",
"Unable to delete user." : "Non é posíbel eliminar o usuario.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Debe fornecer un contrasinal",
"A valid email must be provided" : "Ten que fornecer un correo funcional",
"__language_name__" : "Galego",
- "Personal Info" : "Información personal",
"SSL root certificates" : "Certificados raíz SSL",
"Encryption" : "Cifrado",
"Everything (fatal issues, errors, warnings, info, debug)" : "Todo (problemas críticos, erros, avisos, información, depuración)",
@@ -178,6 +176,8 @@
"Documentation:" : "Documentación:",
"User Documentation" : "Documentación do usuario",
"Admin Documentation" : "Documentación do administrador",
+ "Show description …" : "Amosar a descrición ...",
+ "Hide description …" : "Agochar a descrición ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Non é posíbel instalar esta aplicación por mor de non cumprirse as dependencias:",
"Update to %s" : "Actualizar a %s",
"Enable only for specific groups" : "Activar só para grupos específicos",
@@ -202,7 +202,6 @@
"Current password" : "Contrasinal actual",
"New password" : "Novo contrasinal",
"Change password" : "Cambiar o contrasinal",
- "Full Name" : "Nome completo",
"No display name set" : "Sen nome visíbel estabelecido",
"Email" : "Correo",
"Your email address" : "O seu enderezo de correo",
@@ -223,7 +222,6 @@
"Valid until" : "Válido ata",
"Issued By" : "Fornecido por",
"Valid until %s" : "Válido ata %s",
- "Import Root Certificate" : "Importar o certificado raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "A aplicación de cifrado non está activada, descifre todos os ficheiros",
"Log-in password" : "Contrasinal de acceso",
"Decrypt all Files" : "Descifrar todos os ficheiros",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Introduza a cota de almacenamento (p.ex. «512 MB» ou «12 GB»)",
"Unlimited" : "Sen límites",
"Other" : "Outro",
+ "Full Name" : "Nome completo",
"Group Admin for" : "Grupo de Admin para",
"Quota" : "Cota",
"Storage Location" : "Localización do almacenamento",
diff --git a/settings/l10n/he.js b/settings/l10n/he.js
index 99e717412f5..7bcbb6e4c13 100644
--- a/settings/l10n/he.js
+++ b/settings/l10n/he.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "שיתוף",
- "Security" : "אבטחה",
"Log" : "יומן",
"Authentication error" : "שגיאת הזדהות",
"Language changed" : "שפה השתנתה",
@@ -69,7 +68,6 @@ OC.L10N.register(
"Cancel" : "ביטול",
"Language" : "פה",
"Help translate" : "עזרה בתרגום",
- "Import Root Certificate" : "ייבוא אישור אבטחת שורש",
"Username" : "שם משתמש",
"Create" : "יצירה",
"Admin Recovery Password" : "ססמת השחזור של המנהל",
diff --git a/settings/l10n/he.json b/settings/l10n/he.json
index adf1d2509d0..eceb6ae5131 100644
--- a/settings/l10n/he.json
+++ b/settings/l10n/he.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "שיתוף",
- "Security" : "אבטחה",
"Log" : "יומן",
"Authentication error" : "שגיאת הזדהות",
"Language changed" : "שפה השתנתה",
@@ -67,7 +66,6 @@
"Cancel" : "ביטול",
"Language" : "פה",
"Help translate" : "עזרה בתרגום",
- "Import Root Certificate" : "ייבוא אישור אבטחת שורש",
"Username" : "שם משתמש",
"Create" : "יצירה",
"Admin Recovery Password" : "ססמת השחזור של המנהל",
diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js
index e26488e6011..959ff81d124 100644
--- a/settings/l10n/hr.js
+++ b/settings/l10n/hr.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Upozorenja o sigurnosti i postavkama",
"Cron" : "Cron",
"Sharing" : "Dijeljenje zajedničkih resursa",
- "Security" : "Sigurnost",
"Email Server" : "Poslužitelj e-pošte",
"Log" : "Zapisnik",
"Authentication error" : "Pogrešna autentikacija",
@@ -33,7 +32,6 @@ OC.L10N.register(
"Recommended" : "Preporuceno",
"Saved" : "Spremljeno",
"test email settings" : "Postavke za testiranje e-pošte",
- "If you received this email, the settings seem to be correct." : "Ako ste ovu e-poštu primili,čini se da su postavke ispravne.",
"Email sent" : "E-pošta je poslana",
"You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu e-poštu trebate postaviti svoj korisnički email.",
"Email saved" : "E-pošta spremljena",
@@ -153,7 +151,6 @@ OC.L10N.register(
"Current password" : "Trenutna lozinka",
"New password" : "Nova lozinka",
"Change password" : "Promijenite lozinku",
- "Full Name" : "Puno ime",
"Email" : "E-pošta",
"Your email address" : "Vaša adresa e-pošte",
"Fill in an email address to enable password recovery and receive notifications" : "Unesite adresu e-pošte da biste omogućili oporavak lozinke i primili notifikacije",
@@ -171,7 +168,6 @@ OC.L10N.register(
"Valid until" : "Valid until",
"Issued By" : "Issued By",
"Valid until %s" : "Valid until %s",
- "Import Root Certificate" : "Uvoz Root certifikata",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikacija šifriranja više nije omogćena,molimo dešifrirajte sve svoje datoteke",
"Log-in password" : "Lozinka za prijavu",
"Decrypt all Files" : "Dešifrirajte sve datoteke",
@@ -192,6 +188,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Molimo unesite kvotu za spremanje (npr: \"512 MB\" ili \"12 GB\")",
"Unlimited" : "Neograničeno",
"Other" : "Ostalo",
+ "Full Name" : "Puno ime",
"Quota" : "Kvota",
"Storage Location" : "Mjesto za spremanje",
"Last Login" : "Zadnja prijava",
diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json
index 2dbc156393b..e5c4d4f456f 100644
--- a/settings/l10n/hr.json
+++ b/settings/l10n/hr.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Upozorenja o sigurnosti i postavkama",
"Cron" : "Cron",
"Sharing" : "Dijeljenje zajedničkih resursa",
- "Security" : "Sigurnost",
"Email Server" : "Poslužitelj e-pošte",
"Log" : "Zapisnik",
"Authentication error" : "Pogrešna autentikacija",
@@ -31,7 +30,6 @@
"Recommended" : "Preporuceno",
"Saved" : "Spremljeno",
"test email settings" : "Postavke za testiranje e-pošte",
- "If you received this email, the settings seem to be correct." : "Ako ste ovu e-poštu primili,čini se da su postavke ispravne.",
"Email sent" : "E-pošta je poslana",
"You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu e-poštu trebate postaviti svoj korisnički email.",
"Email saved" : "E-pošta spremljena",
@@ -151,7 +149,6 @@
"Current password" : "Trenutna lozinka",
"New password" : "Nova lozinka",
"Change password" : "Promijenite lozinku",
- "Full Name" : "Puno ime",
"Email" : "E-pošta",
"Your email address" : "Vaša adresa e-pošte",
"Fill in an email address to enable password recovery and receive notifications" : "Unesite adresu e-pošte da biste omogućili oporavak lozinke i primili notifikacije",
@@ -169,7 +166,6 @@
"Valid until" : "Valid until",
"Issued By" : "Issued By",
"Valid until %s" : "Valid until %s",
- "Import Root Certificate" : "Uvoz Root certifikata",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikacija šifriranja više nije omogćena,molimo dešifrirajte sve svoje datoteke",
"Log-in password" : "Lozinka za prijavu",
"Decrypt all Files" : "Dešifrirajte sve datoteke",
@@ -190,6 +186,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Molimo unesite kvotu za spremanje (npr: \"512 MB\" ili \"12 GB\")",
"Unlimited" : "Neograničeno",
"Other" : "Ostalo",
+ "Full Name" : "Puno ime",
"Quota" : "Kvota",
"Storage Location" : "Mjesto za spremanje",
"Last Login" : "Zadnja prijava",
diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js
index 40c04f645a0..4cd969e718c 100644
--- a/settings/l10n/hu_HU.js
+++ b/settings/l10n/hu_HU.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Ütemezett feladatok",
"Sharing" : "Megosztás",
- "Security" : "Biztonság",
"Email Server" : "E-mail kiszolgáló",
"Log" : "Naplózás",
"Authentication error" : "Azonosítási hiba",
@@ -32,7 +31,6 @@ OC.L10N.register(
"Recommended" : "Ajánlott",
"Saved" : "Elmentve",
"test email settings" : "e-mail beállítások ellenőrzése",
- "If you received this email, the settings seem to be correct." : "Amennyiben megérkezett ez az e-mail akkor a beállítások megfelelők.",
"Email sent" : "Az e-mailt elküldtük",
"You need to set your user email before being able to send test emails." : "Előbb meg kell adnia az e-mail címét, mielőtt tesztelni tudná az e-mail küldést.",
"Email saved" : "Elmentettük az e-mail címet",
@@ -151,7 +149,6 @@ OC.L10N.register(
"Current password" : "A jelenlegi jelszó",
"New password" : "Az új jelszó",
"Change password" : "A jelszó megváltoztatása",
- "Full Name" : "Teljes név",
"Email" : "E-mail",
"Your email address" : "Az Ön e-mail címe",
"Fill in an email address to enable password recovery and receive notifications" : "Adja meg az e-mail címét, hogy vissza tudja állítani a jelszavát, illetve, hogy rendszeres jelentéseket kaphasson!",
@@ -165,7 +162,6 @@ OC.L10N.register(
"Choose as profile image" : "Válasszuk ki profilképnek",
"Language" : "Nyelv",
"Help translate" : "Segítsen a fordításban!",
- "Import Root Certificate" : "SSL tanúsítványok importálása",
"The encryption app is no longer enabled, please decrypt all your files" : "A titkosító alkalmazás a továbbiakban nincs engedélyezve, kérem állítsa vissza az állományait titkostásmentes állapotba!",
"Log-in password" : "Bejelentkezési jelszó",
"Decrypt all Files" : "Mentesíti a titkosítástól az összes fájlt",
@@ -184,6 +180,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Kérjük adja meg a tárolási kvótát (pl. \"512 MB\" vagy \"12 GB\")",
"Unlimited" : "Korlátlan",
"Other" : "Más",
+ "Full Name" : "Teljes név",
"Quota" : "Kvóta",
"Storage Location" : "A háttértár helye",
"Last Login" : "Utolsó bejelentkezés",
diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json
index c2329653a20..509e0fb0f77 100644
--- a/settings/l10n/hu_HU.json
+++ b/settings/l10n/hu_HU.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Ütemezett feladatok",
"Sharing" : "Megosztás",
- "Security" : "Biztonság",
"Email Server" : "E-mail kiszolgáló",
"Log" : "Naplózás",
"Authentication error" : "Azonosítási hiba",
@@ -30,7 +29,6 @@
"Recommended" : "Ajánlott",
"Saved" : "Elmentve",
"test email settings" : "e-mail beállítások ellenőrzése",
- "If you received this email, the settings seem to be correct." : "Amennyiben megérkezett ez az e-mail akkor a beállítások megfelelők.",
"Email sent" : "Az e-mailt elküldtük",
"You need to set your user email before being able to send test emails." : "Előbb meg kell adnia az e-mail címét, mielőtt tesztelni tudná az e-mail küldést.",
"Email saved" : "Elmentettük az e-mail címet",
@@ -149,7 +147,6 @@
"Current password" : "A jelenlegi jelszó",
"New password" : "Az új jelszó",
"Change password" : "A jelszó megváltoztatása",
- "Full Name" : "Teljes név",
"Email" : "E-mail",
"Your email address" : "Az Ön e-mail címe",
"Fill in an email address to enable password recovery and receive notifications" : "Adja meg az e-mail címét, hogy vissza tudja állítani a jelszavát, illetve, hogy rendszeres jelentéseket kaphasson!",
@@ -163,7 +160,6 @@
"Choose as profile image" : "Válasszuk ki profilképnek",
"Language" : "Nyelv",
"Help translate" : "Segítsen a fordításban!",
- "Import Root Certificate" : "SSL tanúsítványok importálása",
"The encryption app is no longer enabled, please decrypt all your files" : "A titkosító alkalmazás a továbbiakban nincs engedélyezve, kérem állítsa vissza az állományait titkostásmentes állapotba!",
"Log-in password" : "Bejelentkezési jelszó",
"Decrypt all Files" : "Mentesíti a titkosítástól az összes fájlt",
@@ -182,6 +178,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Kérjük adja meg a tárolási kvótát (pl. \"512 MB\" vagy \"12 GB\")",
"Unlimited" : "Korlátlan",
"Other" : "Más",
+ "Full Name" : "Teljes név",
"Quota" : "Kvóta",
"Storage Location" : "A háttértár helye",
"Last Login" : "Utolsó bejelentkezés",
diff --git a/settings/l10n/ia.js b/settings/l10n/ia.js
index f964ae33c2b..3f90be0c618 100644
--- a/settings/l10n/ia.js
+++ b/settings/l10n/ia.js
@@ -4,8 +4,10 @@ OC.L10N.register(
"Log" : "Registro",
"Language changed" : "Linguage cambiate",
"Invalid request" : "Requesta invalide",
+ "Wrong password" : "Contrasigno errate",
"Saved" : "Salveguardate",
"Email sent" : "Message de e-posta inviate",
+ "All" : "Omne",
"Very weak password" : "Contrasigno multo debile",
"Weak password" : "Contrasigno debile",
"So-so password" : "Contrasigno passabile",
diff --git a/settings/l10n/ia.json b/settings/l10n/ia.json
index 6e340356f3b..346d1b15994 100644
--- a/settings/l10n/ia.json
+++ b/settings/l10n/ia.json
@@ -2,8 +2,10 @@
"Log" : "Registro",
"Language changed" : "Linguage cambiate",
"Invalid request" : "Requesta invalide",
+ "Wrong password" : "Contrasigno errate",
"Saved" : "Salveguardate",
"Email sent" : "Message de e-posta inviate",
+ "All" : "Omne",
"Very weak password" : "Contrasigno multo debile",
"Weak password" : "Contrasigno debile",
"So-so password" : "Contrasigno passabile",
diff --git a/settings/l10n/id.js b/settings/l10n/id.js
index dab5c914726..288b9027a14 100644
--- a/settings/l10n/id.js
+++ b/settings/l10n/id.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Keamanan dan Setelan Peringatan",
"Cron" : "Cron",
"Sharing" : "Berbagi",
- "Security" : "Keamanan",
"Email Server" : "Server Email",
"Log" : "Log",
"Authentication error" : "Terjadi kesalahan saat otentikasi",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "level-log melebihi batas yang diizinkan",
"Saved" : "Disimpan",
"test email settings" : "pengaturan email percobaan",
- "If you received this email, the settings seem to be correct." : "Jika Anda menerma email ini, pengaturan tampaknya sudah benar.",
- "A problem occurred while sending the email. Please revise your settings." : "Muncul masalah tidak terduga saat mengirim email. Mohon merevisi pengaturan Anda.",
"Email sent" : "Email terkirim",
"You need to set your user email before being able to send test emails." : "Anda perlu menetapkan email pengguna Anda sebelum dapat mengirim email percobaan.",
"Invalid mail address" : "Alamat email salah",
@@ -92,7 +89,6 @@ OC.L10N.register(
"A valid password must be provided" : "Harus memberikan sandi yang benar",
"A valid email must be provided" : "Email yang benar harus diberikan",
"__language_name__" : "__language_name__",
- "Personal Info" : "Info Pribadi",
"SSL root certificates" : "Sertifikat root SSL",
"Encryption" : "Enkripsi",
"Everything (fatal issues, errors, warnings, info, debug)" : "Semuanya (Masalah fatal, galat, peringatan, info, debug)",
@@ -190,7 +186,6 @@ OC.L10N.register(
"Current password" : "Sandi saat ini",
"New password" : "Sandi baru",
"Change password" : "Ubah sandi",
- "Full Name" : "Nama Lengkap",
"No display name set" : "Nama tampilan tidak diatur",
"Email" : "Email",
"Your email address" : "Alamat email Anda",
@@ -210,7 +205,6 @@ OC.L10N.register(
"Valid until" : "Berlaku sampai",
"Issued By" : "Diterbitkan oleh",
"Valid until %s" : "Berlaku sampai %s",
- "Import Root Certificate" : "Impor Sertifikat Root",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikasi enkripsi tidak lagi diaktifkan, silahkan mendekripsi semua file Anda",
"Log-in password" : "Sandi masuk",
"Decrypt all Files" : "Deskripsi semua Berkas",
@@ -236,6 +230,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Silakan masukkan jumlah penyimpanan (contoh: \"512 MB\" atau \"12 GB\")",
"Unlimited" : "Tak terbatas",
"Other" : "Lainnya",
+ "Full Name" : "Nama Lengkap",
"Group Admin for" : "Grup Admin untuk",
"Quota" : "Kuota",
"Storage Location" : "Lokasi Penyimpanan",
diff --git a/settings/l10n/id.json b/settings/l10n/id.json
index 5cb894d2952..ac8005dc19f 100644
--- a/settings/l10n/id.json
+++ b/settings/l10n/id.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Keamanan dan Setelan Peringatan",
"Cron" : "Cron",
"Sharing" : "Berbagi",
- "Security" : "Keamanan",
"Email Server" : "Server Email",
"Log" : "Log",
"Authentication error" : "Terjadi kesalahan saat otentikasi",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "level-log melebihi batas yang diizinkan",
"Saved" : "Disimpan",
"test email settings" : "pengaturan email percobaan",
- "If you received this email, the settings seem to be correct." : "Jika Anda menerma email ini, pengaturan tampaknya sudah benar.",
- "A problem occurred while sending the email. Please revise your settings." : "Muncul masalah tidak terduga saat mengirim email. Mohon merevisi pengaturan Anda.",
"Email sent" : "Email terkirim",
"You need to set your user email before being able to send test emails." : "Anda perlu menetapkan email pengguna Anda sebelum dapat mengirim email percobaan.",
"Invalid mail address" : "Alamat email salah",
@@ -90,7 +87,6 @@
"A valid password must be provided" : "Harus memberikan sandi yang benar",
"A valid email must be provided" : "Email yang benar harus diberikan",
"__language_name__" : "__language_name__",
- "Personal Info" : "Info Pribadi",
"SSL root certificates" : "Sertifikat root SSL",
"Encryption" : "Enkripsi",
"Everything (fatal issues, errors, warnings, info, debug)" : "Semuanya (Masalah fatal, galat, peringatan, info, debug)",
@@ -188,7 +184,6 @@
"Current password" : "Sandi saat ini",
"New password" : "Sandi baru",
"Change password" : "Ubah sandi",
- "Full Name" : "Nama Lengkap",
"No display name set" : "Nama tampilan tidak diatur",
"Email" : "Email",
"Your email address" : "Alamat email Anda",
@@ -208,7 +203,6 @@
"Valid until" : "Berlaku sampai",
"Issued By" : "Diterbitkan oleh",
"Valid until %s" : "Berlaku sampai %s",
- "Import Root Certificate" : "Impor Sertifikat Root",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikasi enkripsi tidak lagi diaktifkan, silahkan mendekripsi semua file Anda",
"Log-in password" : "Sandi masuk",
"Decrypt all Files" : "Deskripsi semua Berkas",
@@ -234,6 +228,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Silakan masukkan jumlah penyimpanan (contoh: \"512 MB\" atau \"12 GB\")",
"Unlimited" : "Tak terbatas",
"Other" : "Lainnya",
+ "Full Name" : "Nama Lengkap",
"Group Admin for" : "Grup Admin untuk",
"Quota" : "Kuota",
"Storage Location" : "Lokasi Penyimpanan",
diff --git a/settings/l10n/is.js b/settings/l10n/is.js
index b475e96bcab..841d6504402 100644
--- a/settings/l10n/is.js
+++ b/settings/l10n/is.js
@@ -44,7 +44,6 @@ OC.L10N.register(
"Cancel" : "Hætta við",
"Language" : "Tungumál",
"Help translate" : "Hjálpa við þýðingu",
- "Import Root Certificate" : "Flytja inn rótar skilríki",
"Username" : "Notendanafn",
"Create" : "Búa til",
"Unlimited" : "Ótakmarkað",
diff --git a/settings/l10n/is.json b/settings/l10n/is.json
index 3269a3d0783..f20ad761bc7 100644
--- a/settings/l10n/is.json
+++ b/settings/l10n/is.json
@@ -42,7 +42,6 @@
"Cancel" : "Hætta við",
"Language" : "Tungumál",
"Help translate" : "Hjálpa við þýðingu",
- "Import Root Certificate" : "Flytja inn rótar skilríki",
"Username" : "Notendanafn",
"Create" : "Búa til",
"Unlimited" : "Ótakmarkað",
diff --git a/settings/l10n/it.js b/settings/l10n/it.js
index dce07640ca2..108a23c5722 100644
--- a/settings/l10n/it.js
+++ b/settings/l10n/it.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Avvisi di sicurezza e configurazione",
"Cron" : "Cron",
"Sharing" : "Condivisione",
- "Security" : "Protezione",
"Email Server" : "Server di posta",
"Log" : "Log",
"Authentication error" : "Errore di autenticazione",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "livello di log fuori dall'intervallo consentito",
"Saved" : "Salvato",
"test email settings" : "prova impostazioni email",
- "If you received this email, the settings seem to be correct." : "Se hai ricevuto questa email, le impostazioni dovrebbero essere corrette.",
- "A problem occurred while sending the email. Please revise your settings." : "Si è verificato un problema durante l'invio dell'email. Controlla le tue impostazioni.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Si è verificato un problema durante l'invio dell'email. Controlla le tue impostazioni. (Errore: %s)",
"Email sent" : "Email inviata",
"You need to set your user email before being able to send test emails." : "Devi impostare l'indirizzo del tuo utente prima di poter provare l'invio delle email.",
"Invalid mail address" : "Indirizzo email non valido",
+ "A user with that name already exists." : "Un utente con quel nome esiste già.",
"Unable to create user." : "Impossibile creare l'utente.",
"Your %s account was created" : "Il tuo account %s è stato creato",
"Unable to delete user." : "Impossibile eliminare l'utente.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Deve essere fornita una password valida",
"A valid email must be provided" : "Deve essere fornito un indirizzo email valido",
"__language_name__" : "Italiano",
- "Personal Info" : "Informazioni personali",
"SSL root certificates" : "Certificati SSL radice",
"Encryption" : "Cifratura",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Documentazione:",
"User Documentation" : "Documentazione utente",
"Admin Documentation" : "Documentazione di amministrazione",
+ "Show description …" : "Mostra descrizione...",
+ "Hide description …" : "Nascondi descrizione...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Questa applicazione non può essere installata perché le seguenti dipendenze non sono soddisfatte:",
"Update to %s" : "Aggiornato a %s",
"Enable only for specific groups" : "Abilita solo per gruppi specifici",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Password attuale",
"New password" : "Nuova password",
"Change password" : "Modifica password",
- "Full Name" : "Nome completo",
"No display name set" : "Nome visualizzato non impostato",
"Email" : "Posta elettronica",
"Your email address" : "Il tuo indirizzo email",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Valido fino al",
"Issued By" : "Emesso da",
"Valid until %s" : "Valido fino al %s",
- "Import Root Certificate" : "Importa certificato radice",
"The encryption app is no longer enabled, please decrypt all your files" : "L'applicazione di cifratura non è più abilitata, decifra tutti i tuoi file",
"Log-in password" : "Password di accesso",
"Decrypt all Files" : "Decifra tutti i file",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Digita la quota di archiviazione (ad es.: \"512 MB\" or \"12 GB\")",
"Unlimited" : "Illimitata",
"Other" : "Altro",
+ "Full Name" : "Nome completo",
"Group Admin for" : "Gruppo di amministrazione per",
"Quota" : "Quote",
"Storage Location" : "Posizione di archiviazione",
diff --git a/settings/l10n/it.json b/settings/l10n/it.json
index 1aa0996f94f..9929feca344 100644
--- a/settings/l10n/it.json
+++ b/settings/l10n/it.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Avvisi di sicurezza e configurazione",
"Cron" : "Cron",
"Sharing" : "Condivisione",
- "Security" : "Protezione",
"Email Server" : "Server di posta",
"Log" : "Log",
"Authentication error" : "Errore di autenticazione",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "livello di log fuori dall'intervallo consentito",
"Saved" : "Salvato",
"test email settings" : "prova impostazioni email",
- "If you received this email, the settings seem to be correct." : "Se hai ricevuto questa email, le impostazioni dovrebbero essere corrette.",
- "A problem occurred while sending the email. Please revise your settings." : "Si è verificato un problema durante l'invio dell'email. Controlla le tue impostazioni.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Si è verificato un problema durante l'invio dell'email. Controlla le tue impostazioni. (Errore: %s)",
"Email sent" : "Email inviata",
"You need to set your user email before being able to send test emails." : "Devi impostare l'indirizzo del tuo utente prima di poter provare l'invio delle email.",
"Invalid mail address" : "Indirizzo email non valido",
+ "A user with that name already exists." : "Un utente con quel nome esiste già.",
"Unable to create user." : "Impossibile creare l'utente.",
"Your %s account was created" : "Il tuo account %s è stato creato",
"Unable to delete user." : "Impossibile eliminare l'utente.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Deve essere fornita una password valida",
"A valid email must be provided" : "Deve essere fornito un indirizzo email valido",
"__language_name__" : "Italiano",
- "Personal Info" : "Informazioni personali",
"SSL root certificates" : "Certificati SSL radice",
"Encryption" : "Cifratura",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)",
@@ -178,6 +176,8 @@
"Documentation:" : "Documentazione:",
"User Documentation" : "Documentazione utente",
"Admin Documentation" : "Documentazione di amministrazione",
+ "Show description …" : "Mostra descrizione...",
+ "Hide description …" : "Nascondi descrizione...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Questa applicazione non può essere installata perché le seguenti dipendenze non sono soddisfatte:",
"Update to %s" : "Aggiornato a %s",
"Enable only for specific groups" : "Abilita solo per gruppi specifici",
@@ -202,7 +202,6 @@
"Current password" : "Password attuale",
"New password" : "Nuova password",
"Change password" : "Modifica password",
- "Full Name" : "Nome completo",
"No display name set" : "Nome visualizzato non impostato",
"Email" : "Posta elettronica",
"Your email address" : "Il tuo indirizzo email",
@@ -223,7 +222,6 @@
"Valid until" : "Valido fino al",
"Issued By" : "Emesso da",
"Valid until %s" : "Valido fino al %s",
- "Import Root Certificate" : "Importa certificato radice",
"The encryption app is no longer enabled, please decrypt all your files" : "L'applicazione di cifratura non è più abilitata, decifra tutti i tuoi file",
"Log-in password" : "Password di accesso",
"Decrypt all Files" : "Decifra tutti i file",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Digita la quota di archiviazione (ad es.: \"512 MB\" or \"12 GB\")",
"Unlimited" : "Illimitata",
"Other" : "Altro",
+ "Full Name" : "Nome completo",
"Group Admin for" : "Gruppo di amministrazione per",
"Quota" : "Quote",
"Storage Location" : "Posizione di archiviazione",
diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js
index 2278e6e5877..dadf0f6162e 100644
--- a/settings/l10n/ja.js
+++ b/settings/l10n/ja.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "セキュリティ&セットアップ警告",
"Cron" : "Cron",
"Sharing" : "共有",
- "Security" : "セキュリティ",
"Email Server" : "メールサーバー",
"Log" : "ログ",
"Authentication error" : "認証エラー",
@@ -39,8 +38,6 @@ OC.L10N.register(
"log-level out of allowed range" : "ログレベルが許可された範囲を超えています",
"Saved" : "保存されました",
"test email settings" : "メール設定のテスト",
- "If you received this email, the settings seem to be correct." : "このメールを受け取ったら、設定は正しいはずです。",
- "A problem occurred while sending the email. Please revise your settings." : "メールの送信中に問題が発生しました。設定を確認してください。",
"Email sent" : "メールを送信しました",
"You need to set your user email before being able to send test emails." : "ユーザーメールを設定して初めて、テストメールを送信することができるようになります。",
"Invalid mail address" : "無効なメールアドレスです",
@@ -93,7 +90,6 @@ OC.L10N.register(
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
"A valid email must be provided" : "有効なメールアドレスを指定する必要があります",
"__language_name__" : "Japanese (日本語)",
- "Personal Info" : "個人情報",
"SSL root certificates" : "SSLルート証明書",
"Encryption" : "暗号化",
"Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)",
@@ -199,7 +195,6 @@ OC.L10N.register(
"Current password" : "現在のパスワード",
"New password" : "新しいパスワード",
"Change password" : "パスワードを変更",
- "Full Name" : "名前",
"No display name set" : "表示名が未設定",
"Email" : "メール",
"Your email address" : "あなたのメールアドレス",
@@ -220,7 +215,6 @@ OC.L10N.register(
"Valid until" : "有効期限",
"Issued By" : "発行元",
"Valid until %s" : "%s まで有効",
- "Import Root Certificate" : "ルート証明書をインポート",
"The encryption app is no longer enabled, please decrypt all your files" : "暗号化アプリはもはや有効ではありません、すべてのファイルを複合してください",
"Log-in password" : "ログインパスワード",
"Decrypt all Files" : "すべてのファイルを複合する",
@@ -247,6 +241,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "ストレージのクォータを入力してください (例: \"512MB\" や \"12 GB\")",
"Unlimited" : "無制限",
"Other" : "その他",
+ "Full Name" : "名前",
"Group Admin for" : "グループ管理者",
"Quota" : "クオータ",
"Storage Location" : "データの保存場所",
diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json
index 531b0de08a7..f0638629f98 100644
--- a/settings/l10n/ja.json
+++ b/settings/l10n/ja.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "セキュリティ&セットアップ警告",
"Cron" : "Cron",
"Sharing" : "共有",
- "Security" : "セキュリティ",
"Email Server" : "メールサーバー",
"Log" : "ログ",
"Authentication error" : "認証エラー",
@@ -37,8 +36,6 @@
"log-level out of allowed range" : "ログレベルが許可された範囲を超えています",
"Saved" : "保存されました",
"test email settings" : "メール設定のテスト",
- "If you received this email, the settings seem to be correct." : "このメールを受け取ったら、設定は正しいはずです。",
- "A problem occurred while sending the email. Please revise your settings." : "メールの送信中に問題が発生しました。設定を確認してください。",
"Email sent" : "メールを送信しました",
"You need to set your user email before being able to send test emails." : "ユーザーメールを設定して初めて、テストメールを送信することができるようになります。",
"Invalid mail address" : "無効なメールアドレスです",
@@ -91,7 +88,6 @@
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
"A valid email must be provided" : "有効なメールアドレスを指定する必要があります",
"__language_name__" : "Japanese (日本語)",
- "Personal Info" : "個人情報",
"SSL root certificates" : "SSLルート証明書",
"Encryption" : "暗号化",
"Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)",
@@ -197,7 +193,6 @@
"Current password" : "現在のパスワード",
"New password" : "新しいパスワード",
"Change password" : "パスワードを変更",
- "Full Name" : "名前",
"No display name set" : "表示名が未設定",
"Email" : "メール",
"Your email address" : "あなたのメールアドレス",
@@ -218,7 +213,6 @@
"Valid until" : "有効期限",
"Issued By" : "発行元",
"Valid until %s" : "%s まで有効",
- "Import Root Certificate" : "ルート証明書をインポート",
"The encryption app is no longer enabled, please decrypt all your files" : "暗号化アプリはもはや有効ではありません、すべてのファイルを複合してください",
"Log-in password" : "ログインパスワード",
"Decrypt all Files" : "すべてのファイルを複合する",
@@ -245,6 +239,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "ストレージのクォータを入力してください (例: \"512MB\" や \"12 GB\")",
"Unlimited" : "無制限",
"Other" : "その他",
+ "Full Name" : "名前",
"Group Admin for" : "グループ管理者",
"Quota" : "クオータ",
"Storage Location" : "データの保存場所",
diff --git a/settings/l10n/ka_GE.js b/settings/l10n/ka_GE.js
index a0a8c1a25c7..1e8a59c61f8 100644
--- a/settings/l10n/ka_GE.js
+++ b/settings/l10n/ka_GE.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron–ი",
"Sharing" : "გაზიარება",
- "Security" : "უსაფრთხოება",
"Log" : "ლოგი",
"Authentication error" : "ავთენტიფიკაციის შეცდომა",
"Language changed" : "ენა შეცვლილია",
@@ -68,7 +67,6 @@ OC.L10N.register(
"Cancel" : "უარყოფა",
"Language" : "ენა",
"Help translate" : "თარგმნის დახმარება",
- "Import Root Certificate" : "Root სერთიფიკატის იმპორტირება",
"Username" : "მომხმარებლის სახელი",
"Create" : "შექმნა",
"Default Quota" : "საწყისი ქვოტა",
diff --git a/settings/l10n/ka_GE.json b/settings/l10n/ka_GE.json
index 6c4d984bbe6..901c7ff8daa 100644
--- a/settings/l10n/ka_GE.json
+++ b/settings/l10n/ka_GE.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron–ი",
"Sharing" : "გაზიარება",
- "Security" : "უსაფრთხოება",
"Log" : "ლოგი",
"Authentication error" : "ავთენტიფიკაციის შეცდომა",
"Language changed" : "ენა შეცვლილია",
@@ -66,7 +65,6 @@
"Cancel" : "უარყოფა",
"Language" : "ენა",
"Help translate" : "თარგმნის დახმარება",
- "Import Root Certificate" : "Root სერთიფიკატის იმპორტირება",
"Username" : "მომხმარებლის სახელი",
"Create" : "შექმნა",
"Default Quota" : "საწყისი ქვოტა",
diff --git a/settings/l10n/km.js b/settings/l10n/km.js
index 9ec44c3660d..53ce3a47256 100644
--- a/settings/l10n/km.js
+++ b/settings/l10n/km.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "ការ​ចែក​រំលែក",
- "Security" : "សុវត្ថិភាព",
"Email Server" : "ម៉ាស៊ីន​បម្រើ​អ៊ីមែល",
"Log" : "Log",
"Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ",
@@ -17,7 +16,6 @@ OC.L10N.register(
"Enabled" : "បាន​បើក",
"Saved" : "បាន​រក្សាទុក",
"test email settings" : "សាក​ល្បង​ការ​កំណត់​អ៊ីមែល",
- "If you received this email, the settings seem to be correct." : "ប្រសិន​បើ​អ្នក​ទទួល​បាន​អ៊ីមែល​នេះ មាន​ន័យ​ថា​ការ​កំណត់​គឺ​បាន​ត្រឹមម​ត្រូវ​ហើយ។",
"Email sent" : "បាន​ផ្ញើ​អ៊ីមែល",
"You need to set your user email before being able to send test emails." : "អ្នក​ត្រូវ​តែ​កំណត់​អ៊ីមែល​របស់​អ្នក​មុន​នឹង​អាច​ផ្ញើ​អ៊ីមែល​សាកល្បង​បាន។",
"Email saved" : "បាន​រក្សា​ទុក​អ៊ីមែល",
diff --git a/settings/l10n/km.json b/settings/l10n/km.json
index a648d48e81a..e00d70a0215 100644
--- a/settings/l10n/km.json
+++ b/settings/l10n/km.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "ការ​ចែក​រំលែក",
- "Security" : "សុវត្ថិភាព",
"Email Server" : "ម៉ាស៊ីន​បម្រើ​អ៊ីមែល",
"Log" : "Log",
"Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ",
@@ -15,7 +14,6 @@
"Enabled" : "បាន​បើក",
"Saved" : "បាន​រក្សាទុក",
"test email settings" : "សាក​ល្បង​ការ​កំណត់​អ៊ីមែល",
- "If you received this email, the settings seem to be correct." : "ប្រសិន​បើ​អ្នក​ទទួល​បាន​អ៊ីមែល​នេះ មាន​ន័យ​ថា​ការ​កំណត់​គឺ​បាន​ត្រឹមម​ត្រូវ​ហើយ។",
"Email sent" : "បាន​ផ្ញើ​អ៊ីមែល",
"You need to set your user email before being able to send test emails." : "អ្នក​ត្រូវ​តែ​កំណត់​អ៊ីមែល​របស់​អ្នក​មុន​នឹង​អាច​ផ្ញើ​អ៊ីមែល​សាកល្បង​បាន។",
"Email saved" : "បាន​រក្សា​ទុក​អ៊ីមែល",
diff --git a/settings/l10n/kn.js b/settings/l10n/kn.js
index e0f9a8729fd..e2a4b755069 100644
--- a/settings/l10n/kn.js
+++ b/settings/l10n/kn.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Security & Setup Warnings" : "ಭದ್ರತಾ ಮತ್ತು ಸೆಟಪ್ ಎಚ್ಚರಿಕೆಗಳು",
"Sharing" : "ಹಂಚಿಕೆ",
- "Security" : "ಭದ್ರತೆ",
"Email Server" : "ಇ-ಅಂಚೆಯ ಪರಿಚಾರಕ ಗಣಕಯಂತ್ರ",
"Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ",
"Authentication error" : "ದೃಢೀಕರಣ ದೋಷ",
@@ -32,8 +31,6 @@ OC.L10N.register(
"Unable to delete group." : "ಗುಂಪುನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.",
"Saved" : "ಉಳಿಸಿದ",
"test email settings" : "ಪರೀರ್ಕ್ಷಾತ ಇ-ಅಂಚೆಯ ಆಯ್ಕೇ",
- "If you received this email, the settings seem to be correct." : "ನೀವು ಈ ಇ-ಅಂಚೆಯನ್ನು ಪಡೆದ ಪಕ್ಷದಲ್ಲಿ, ಆಯ್ಕೇ ಸರಿಯಾಗಿದೆ ಎಂದು ತೋರುತ್ತದೆ.",
- "A problem occurred while sending the email. Please revise your settings." : "ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸುವ ದೋಷವೊಂದು ಸಂಭವಿಸಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಆಯ್ಕೆಗಳನ್ನು ಪರಿಷ್ಕರಿಸಿಕೊಳ್ಳಿ .",
"Email sent" : "ಇ-ಅಂಚೆ ಕಳುಹಿಸಲಾಗಿದೆ",
"You need to set your user email before being able to send test emails." : "ನೀವು ಪರೀಕ್ಷಾ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸುವ ಮುನ್ನ ನಿಮ್ಮ ಬಳಕೆದಾರ ಇ-ಅಂಚೆಯನ್ನು ಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ.",
"Invalid mail address" : "ಅಮಾನ್ಯ ಇ-ಅಂಚೆ ವಿಳಾಸ",
@@ -83,7 +80,6 @@ OC.L10N.register(
"A valid password must be provided" : "ಸರಿಯಾದ ಬಳಕೆದಾರ ಗುಪ್ತಪದ ಒದಗಿಸಬೇಕಾಗಿದೆ",
"A valid email must be provided" : "ಮಾನ್ಯ ಬಳಕೆದಾರ ಇ-ಅಂಚೆಯನ್ನು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ",
"__language_name__" : "ಕನ್ನಡ",
- "Personal Info" : "ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ",
"Encryption" : "ರಹಸ್ಯ ಸಂಕೇತೀಕರಿಸು",
"Everything (fatal issues, errors, warnings, info, debug)" : "ಎಲ್ಲ ರೀತಿಗಳು (ವಿನಾಶಕ ಸಮಸ್ಯೆಗಳು, ದೋಷಗಳು, ಎಚ್ಚರಿಕೆಗಳನ್ನು, ಮಾಹಿತಿ, ಇತರೆ )",
"Info, warnings, errors and fatal issues" : "ಮಾಹಿತಿ, ಎಚ್ಚರಿಕೆ, ದೋಷಗಳು ಮತ್ತು ಮಾರಕ ಸಮಸ್ಯೆಗಳು",
@@ -133,7 +129,6 @@ OC.L10N.register(
"Current password" : "ಪ್ರಸ್ತುತ ಗುಪ್ತಪದ",
"New password" : "ಹೊಸ ಗುಪ್ತಪದ",
"Change password" : "ಗುಪ್ತ ಪದವನ್ನು ಬದಲಾಯಿಸಿ",
- "Full Name" : "ಪೂರ್ಣ ಹೆಸರು",
"Email" : "ಇ-ಅಂಚೆ",
"Your email address" : "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸ",
"Cancel" : "ರದ್ದು",
@@ -150,6 +145,7 @@ OC.L10N.register(
"Everyone" : "ಪ್ರತಿಯೊಬ್ಬರೂ",
"Admins" : "ನಿರ್ವಾಹಕರು",
"Other" : "ಇತರೆ",
+ "Full Name" : "ಪೂರ್ಣ ಹೆಸರು",
"Quota" : "ಪಾಲು",
"Storage Location" : " ಸಂಗ್ರಹ ಸ್ಥಳ",
"Last Login" : "ಹಿಂದಿನ ಖಾತೆ ಪ್ರವೇಶ",
diff --git a/settings/l10n/kn.json b/settings/l10n/kn.json
index 670f6714696..97c857d5179 100644
--- a/settings/l10n/kn.json
+++ b/settings/l10n/kn.json
@@ -1,7 +1,6 @@
{ "translations": {
"Security & Setup Warnings" : "ಭದ್ರತಾ ಮತ್ತು ಸೆಟಪ್ ಎಚ್ಚರಿಕೆಗಳು",
"Sharing" : "ಹಂಚಿಕೆ",
- "Security" : "ಭದ್ರತೆ",
"Email Server" : "ಇ-ಅಂಚೆಯ ಪರಿಚಾರಕ ಗಣಕಯಂತ್ರ",
"Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ",
"Authentication error" : "ದೃಢೀಕರಣ ದೋಷ",
@@ -30,8 +29,6 @@
"Unable to delete group." : "ಗುಂಪುನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.",
"Saved" : "ಉಳಿಸಿದ",
"test email settings" : "ಪರೀರ್ಕ್ಷಾತ ಇ-ಅಂಚೆಯ ಆಯ್ಕೇ",
- "If you received this email, the settings seem to be correct." : "ನೀವು ಈ ಇ-ಅಂಚೆಯನ್ನು ಪಡೆದ ಪಕ್ಷದಲ್ಲಿ, ಆಯ್ಕೇ ಸರಿಯಾಗಿದೆ ಎಂದು ತೋರುತ್ತದೆ.",
- "A problem occurred while sending the email. Please revise your settings." : "ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸುವ ದೋಷವೊಂದು ಸಂಭವಿಸಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಆಯ್ಕೆಗಳನ್ನು ಪರಿಷ್ಕರಿಸಿಕೊಳ್ಳಿ .",
"Email sent" : "ಇ-ಅಂಚೆ ಕಳುಹಿಸಲಾಗಿದೆ",
"You need to set your user email before being able to send test emails." : "ನೀವು ಪರೀಕ್ಷಾ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸುವ ಮುನ್ನ ನಿಮ್ಮ ಬಳಕೆದಾರ ಇ-ಅಂಚೆಯನ್ನು ಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ.",
"Invalid mail address" : "ಅಮಾನ್ಯ ಇ-ಅಂಚೆ ವಿಳಾಸ",
@@ -81,7 +78,6 @@
"A valid password must be provided" : "ಸರಿಯಾದ ಬಳಕೆದಾರ ಗುಪ್ತಪದ ಒದಗಿಸಬೇಕಾಗಿದೆ",
"A valid email must be provided" : "ಮಾನ್ಯ ಬಳಕೆದಾರ ಇ-ಅಂಚೆಯನ್ನು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ",
"__language_name__" : "ಕನ್ನಡ",
- "Personal Info" : "ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ",
"Encryption" : "ರಹಸ್ಯ ಸಂಕೇತೀಕರಿಸು",
"Everything (fatal issues, errors, warnings, info, debug)" : "ಎಲ್ಲ ರೀತಿಗಳು (ವಿನಾಶಕ ಸಮಸ್ಯೆಗಳು, ದೋಷಗಳು, ಎಚ್ಚರಿಕೆಗಳನ್ನು, ಮಾಹಿತಿ, ಇತರೆ )",
"Info, warnings, errors and fatal issues" : "ಮಾಹಿತಿ, ಎಚ್ಚರಿಕೆ, ದೋಷಗಳು ಮತ್ತು ಮಾರಕ ಸಮಸ್ಯೆಗಳು",
@@ -131,7 +127,6 @@
"Current password" : "ಪ್ರಸ್ತುತ ಗುಪ್ತಪದ",
"New password" : "ಹೊಸ ಗುಪ್ತಪದ",
"Change password" : "ಗುಪ್ತ ಪದವನ್ನು ಬದಲಾಯಿಸಿ",
- "Full Name" : "ಪೂರ್ಣ ಹೆಸರು",
"Email" : "ಇ-ಅಂಚೆ",
"Your email address" : "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸ",
"Cancel" : "ರದ್ದು",
@@ -148,6 +143,7 @@
"Everyone" : "ಪ್ರತಿಯೊಬ್ಬರೂ",
"Admins" : "ನಿರ್ವಾಹಕರು",
"Other" : "ಇತರೆ",
+ "Full Name" : "ಪೂರ್ಣ ಹೆಸರು",
"Quota" : "ಪಾಲು",
"Storage Location" : " ಸಂಗ್ರಹ ಸ್ಥಳ",
"Last Login" : "ಹಿಂದಿನ ಖಾತೆ ಪ್ರವೇಶ",
diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js
index a9bd847105d..af718ef3c04 100644
--- a/settings/l10n/ko.js
+++ b/settings/l10n/ko.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "보안 및 설치 경고",
"Cron" : "Cron",
"Sharing" : "공유",
- "Security" : "보안",
"Email Server" : "전자우편 서버",
"Log" : "로그",
"Authentication error" : "인증 오류",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "로그 단계가 허용 범위를 벗어남",
"Saved" : "저장됨",
"test email settings" : "이메일 설정 시험",
- "If you received this email, the settings seem to be correct." : "이 메일을 받았으면 설정이 올바른 것 같습니다.",
- "A problem occurred while sending the email. Please revise your settings." : "이메일을 보내는 중 문제가 발생하였습니다. 설정을 다시 확인하십시오.",
"Email sent" : "이메일 발송됨",
"You need to set your user email before being able to send test emails." : "테스트 이메일을 보내기 전 내 주소를 설정해야 합니다.",
"Invalid mail address" : "잘못된 이메일 주소",
@@ -92,7 +89,6 @@ OC.L10N.register(
"A valid password must be provided" : "올바른 암호를 입력해야 함",
"A valid email must be provided" : "올바른 이메일 주소를 입력해야 함",
"__language_name__" : "한국어",
- "Personal Info" : "개인 정보",
"SSL root certificates" : "SSL 루트 인증서",
"Encryption" : "암호화",
"Everything (fatal issues, errors, warnings, info, debug)" : "모두 (치명적 문제, 오류, 경고, 정보, 디버그)",
@@ -194,7 +190,6 @@ OC.L10N.register(
"Current password" : "현재 암호",
"New password" : "새 암호",
"Change password" : "암호 변경",
- "Full Name" : "전체 이름",
"No display name set" : "표시 이름이 설정되지 않음",
"Email" : "이메일",
"Your email address" : "이메일 주소",
@@ -214,7 +209,6 @@ OC.L10N.register(
"Valid until" : "만료 기간:",
"Issued By" : "발급자:",
"Valid until %s" : "%s까지 유효함",
- "Import Root Certificate" : "루트 인증서 가져오기",
"The encryption app is no longer enabled, please decrypt all your files" : "암호화 앱이 비활성화되었습니다. 모든 파일을 복호화해야 합니다.",
"Log-in password" : "로그인 암호",
"Decrypt all Files" : "모든 파일 복호화",
@@ -240,6 +234,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "저장소 할당량을 입력하십시오 (예: \"512 MB\", \"12 GB\")",
"Unlimited" : "무제한",
"Other" : "기타",
+ "Full Name" : "전체 이름",
"Group Admin for" : "다음 그룹의 관리자:",
"Quota" : "할당량",
"Storage Location" : "저장소 위치",
diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json
index a45ffad6eb1..09397d535be 100644
--- a/settings/l10n/ko.json
+++ b/settings/l10n/ko.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "보안 및 설치 경고",
"Cron" : "Cron",
"Sharing" : "공유",
- "Security" : "보안",
"Email Server" : "전자우편 서버",
"Log" : "로그",
"Authentication error" : "인증 오류",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "로그 단계가 허용 범위를 벗어남",
"Saved" : "저장됨",
"test email settings" : "이메일 설정 시험",
- "If you received this email, the settings seem to be correct." : "이 메일을 받았으면 설정이 올바른 것 같습니다.",
- "A problem occurred while sending the email. Please revise your settings." : "이메일을 보내는 중 문제가 발생하였습니다. 설정을 다시 확인하십시오.",
"Email sent" : "이메일 발송됨",
"You need to set your user email before being able to send test emails." : "테스트 이메일을 보내기 전 내 주소를 설정해야 합니다.",
"Invalid mail address" : "잘못된 이메일 주소",
@@ -90,7 +87,6 @@
"A valid password must be provided" : "올바른 암호를 입력해야 함",
"A valid email must be provided" : "올바른 이메일 주소를 입력해야 함",
"__language_name__" : "한국어",
- "Personal Info" : "개인 정보",
"SSL root certificates" : "SSL 루트 인증서",
"Encryption" : "암호화",
"Everything (fatal issues, errors, warnings, info, debug)" : "모두 (치명적 문제, 오류, 경고, 정보, 디버그)",
@@ -192,7 +188,6 @@
"Current password" : "현재 암호",
"New password" : "새 암호",
"Change password" : "암호 변경",
- "Full Name" : "전체 이름",
"No display name set" : "표시 이름이 설정되지 않음",
"Email" : "이메일",
"Your email address" : "이메일 주소",
@@ -212,7 +207,6 @@
"Valid until" : "만료 기간:",
"Issued By" : "발급자:",
"Valid until %s" : "%s까지 유효함",
- "Import Root Certificate" : "루트 인증서 가져오기",
"The encryption app is no longer enabled, please decrypt all your files" : "암호화 앱이 비활성화되었습니다. 모든 파일을 복호화해야 합니다.",
"Log-in password" : "로그인 암호",
"Decrypt all Files" : "모든 파일 복호화",
@@ -238,6 +232,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "저장소 할당량을 입력하십시오 (예: \"512 MB\", \"12 GB\")",
"Unlimited" : "무제한",
"Other" : "기타",
+ "Full Name" : "전체 이름",
"Group Admin for" : "다음 그룹의 관리자:",
"Quota" : "할당량",
"Storage Location" : "저장소 위치",
diff --git a/settings/l10n/lo.js b/settings/l10n/lo.js
new file mode 100644
index 00000000000..3f5ec7a0bce
--- /dev/null
+++ b/settings/l10n/lo.js
@@ -0,0 +1,10 @@
+OC.L10N.register(
+ "settings",
+ {
+ "Sharing" : "ການແບ່ງປັນ",
+ "Email Server" : "ເຊີເວີອີເມວ",
+ "Log" : "ບັນທຶກ",
+ "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້",
+ "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້"
+},
+"nplurals=1; plural=0;");
diff --git a/settings/l10n/lo.json b/settings/l10n/lo.json
new file mode 100644
index 00000000000..e92493d0fe1
--- /dev/null
+++ b/settings/l10n/lo.json
@@ -0,0 +1,8 @@
+{ "translations": {
+ "Sharing" : "ການແບ່ງປັນ",
+ "Email Server" : "ເຊີເວີອີເມວ",
+ "Log" : "ບັນທຶກ",
+ "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້",
+ "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js
index 274ab09e8da..d2a0b6a88dd 100644
--- a/settings/l10n/lt_LT.js
+++ b/settings/l10n/lt_LT.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "Dalijimasis",
- "Security" : "Saugumas",
"Log" : "Žurnalas",
"Authentication error" : "Autentikacijos klaida",
"Language changed" : "Kalba pakeista",
@@ -80,7 +79,6 @@ OC.L10N.register(
"Current password" : "Dabartinis slaptažodis",
"New password" : "Naujas slaptažodis",
"Change password" : "Pakeisti slaptažodį",
- "Full Name" : "Pilnas vardas",
"Email" : "El. Paštas",
"Your email address" : "Jūsų el. pašto adresas",
"Profile picture" : "Profilio paveikslėlis",
@@ -92,7 +90,6 @@ OC.L10N.register(
"Choose as profile image" : "Pasirinkite profilio paveiksliuką",
"Language" : "Kalba",
"Help translate" : "Padėkite išversti",
- "Import Root Certificate" : "Įkelti pagrindinį sertifikatą",
"Log-in password" : "Prisijungimo slaptažodis",
"Decrypt all Files" : "Iššifruoti visus failus",
"Username" : "Prisijungimo vardas",
@@ -103,6 +100,7 @@ OC.L10N.register(
"Default Quota" : "Numatytoji kvota",
"Unlimited" : "Neribota",
"Other" : "Kita",
+ "Full Name" : "Pilnas vardas",
"Quota" : "Limitas",
"change full name" : "keisti pilną vardą",
"set new password" : "nustatyti naują slaptažodį",
diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json
index a76cbbdf3d9..9559ded0787 100644
--- a/settings/l10n/lt_LT.json
+++ b/settings/l10n/lt_LT.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "Dalijimasis",
- "Security" : "Saugumas",
"Log" : "Žurnalas",
"Authentication error" : "Autentikacijos klaida",
"Language changed" : "Kalba pakeista",
@@ -78,7 +77,6 @@
"Current password" : "Dabartinis slaptažodis",
"New password" : "Naujas slaptažodis",
"Change password" : "Pakeisti slaptažodį",
- "Full Name" : "Pilnas vardas",
"Email" : "El. Paštas",
"Your email address" : "Jūsų el. pašto adresas",
"Profile picture" : "Profilio paveikslėlis",
@@ -90,7 +88,6 @@
"Choose as profile image" : "Pasirinkite profilio paveiksliuką",
"Language" : "Kalba",
"Help translate" : "Padėkite išversti",
- "Import Root Certificate" : "Įkelti pagrindinį sertifikatą",
"Log-in password" : "Prisijungimo slaptažodis",
"Decrypt all Files" : "Iššifruoti visus failus",
"Username" : "Prisijungimo vardas",
@@ -101,6 +98,7 @@
"Default Quota" : "Numatytoji kvota",
"Unlimited" : "Neribota",
"Other" : "Kita",
+ "Full Name" : "Pilnas vardas",
"Quota" : "Limitas",
"change full name" : "keisti pilną vardą",
"set new password" : "nustatyti naują slaptažodį",
diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js
index 9a908209fe8..abd6399262e 100644
--- a/settings/l10n/lv.js
+++ b/settings/l10n/lv.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Drošības & iestatījumu brīdinājumi",
"Cron" : "Cron",
"Sharing" : "Dalīšanās",
- "Security" : "Drošība",
"Email Server" : "E-pasta serveris",
"Log" : "Žurnāls",
"Authentication error" : "Autentifikācijas kļūda",
@@ -37,8 +36,6 @@ OC.L10N.register(
"Unable to delete group." : "Nevar izdzēst grupu.",
"Saved" : "Saglabāts",
"test email settings" : "testēt e-pasta iestatījumus",
- "If you received this email, the settings seem to be correct." : "Ja jūs saņēmāt šo e-pastu, tad izskatās, ka iestatījum ir pareizi.",
- "A problem occurred while sending the email. Please revise your settings." : "Neizdevās nosūtīt e-pastu. Lūdzu pārskatiet savus iestatījumus.",
"Email sent" : "Vēstule nosūtīta",
"You need to set your user email before being able to send test emails." : "Nepieciešams norādīt sava lietotāja e-pasta adresi, lai nosūtīta testa e-pastus.",
"Invalid mail address" : "Nepareiza e-pasta adrese",
@@ -90,7 +87,6 @@ OC.L10N.register(
"A valid password must be provided" : "Jānorāda derīga parole",
"A valid email must be provided" : "Jānorāda derīga e-pasta adrese",
"__language_name__" : "__valodas_nosaukums__",
- "Personal Info" : "Personīgā informācija",
"SSL root certificates" : "SSL saknes sertifikāti",
"Encryption" : "Šifrēšana",
"Everything (fatal issues, errors, warnings, info, debug)" : "Viss (letālas problēmas, kļūdas, brīdinājumi, informatīvas ziņas, atkļūdošanas paziņojumi)",
@@ -141,7 +137,6 @@ OC.L10N.register(
"Current password" : "Pašreizējā parole",
"New password" : "Jauna parole",
"Change password" : "Mainīt paroli",
- "Full Name" : "Pilns vārds",
"Email" : "E-pasts",
"Your email address" : "Jūsu e-pasta adrese",
"Profile picture" : "Profila attēls",
@@ -151,7 +146,6 @@ OC.L10N.register(
"Cancel" : "Atcelt",
"Language" : "Valoda",
"Help translate" : "Palīdzi tulkot",
- "Import Root Certificate" : "Importēt saknes sertifikātus",
"Log-in password" : "Pieslēgšanās parole",
"Decrypt all Files" : "Atšifrēt visus failus",
"Username" : "Lietotājvārds",
@@ -162,6 +156,7 @@ OC.L10N.register(
"Default Quota" : "Apjoms pēc noklusējuma",
"Unlimited" : "Neierobežota",
"Other" : "Cits",
+ "Full Name" : "Pilns vārds",
"Quota" : "Apjoms",
"set new password" : "iestatīt jaunu paroli",
"Default" : "Noklusējuma"
diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json
index 182a992eb73..7f9dbb54ecb 100644
--- a/settings/l10n/lv.json
+++ b/settings/l10n/lv.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Drošības & iestatījumu brīdinājumi",
"Cron" : "Cron",
"Sharing" : "Dalīšanās",
- "Security" : "Drošība",
"Email Server" : "E-pasta serveris",
"Log" : "Žurnāls",
"Authentication error" : "Autentifikācijas kļūda",
@@ -35,8 +34,6 @@
"Unable to delete group." : "Nevar izdzēst grupu.",
"Saved" : "Saglabāts",
"test email settings" : "testēt e-pasta iestatījumus",
- "If you received this email, the settings seem to be correct." : "Ja jūs saņēmāt šo e-pastu, tad izskatās, ka iestatījum ir pareizi.",
- "A problem occurred while sending the email. Please revise your settings." : "Neizdevās nosūtīt e-pastu. Lūdzu pārskatiet savus iestatījumus.",
"Email sent" : "Vēstule nosūtīta",
"You need to set your user email before being able to send test emails." : "Nepieciešams norādīt sava lietotāja e-pasta adresi, lai nosūtīta testa e-pastus.",
"Invalid mail address" : "Nepareiza e-pasta adrese",
@@ -88,7 +85,6 @@
"A valid password must be provided" : "Jānorāda derīga parole",
"A valid email must be provided" : "Jānorāda derīga e-pasta adrese",
"__language_name__" : "__valodas_nosaukums__",
- "Personal Info" : "Personīgā informācija",
"SSL root certificates" : "SSL saknes sertifikāti",
"Encryption" : "Šifrēšana",
"Everything (fatal issues, errors, warnings, info, debug)" : "Viss (letālas problēmas, kļūdas, brīdinājumi, informatīvas ziņas, atkļūdošanas paziņojumi)",
@@ -139,7 +135,6 @@
"Current password" : "Pašreizējā parole",
"New password" : "Jauna parole",
"Change password" : "Mainīt paroli",
- "Full Name" : "Pilns vārds",
"Email" : "E-pasts",
"Your email address" : "Jūsu e-pasta adrese",
"Profile picture" : "Profila attēls",
@@ -149,7 +144,6 @@
"Cancel" : "Atcelt",
"Language" : "Valoda",
"Help translate" : "Palīdzi tulkot",
- "Import Root Certificate" : "Importēt saknes sertifikātus",
"Log-in password" : "Pieslēgšanās parole",
"Decrypt all Files" : "Atšifrēt visus failus",
"Username" : "Lietotājvārds",
@@ -160,6 +154,7 @@
"Default Quota" : "Apjoms pēc noklusējuma",
"Unlimited" : "Neierobežota",
"Other" : "Cits",
+ "Full Name" : "Pilns vārds",
"Quota" : "Apjoms",
"set new password" : "iestatīt jaunu paroli",
"Default" : "Noklusējuma"
diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js
index 320139c4292..0e36590ee83 100644
--- a/settings/l10n/mk.js
+++ b/settings/l10n/mk.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Крон",
"Sharing" : "Споделување",
- "Security" : "Безбедност",
"Email Server" : "Сервер за електронска пошта",
"Log" : "Записник",
"Authentication error" : "Грешка во автентикација",
@@ -118,7 +117,6 @@ OC.L10N.register(
"Current password" : "Моментална лозинка",
"New password" : "Нова лозинка",
"Change password" : "Смени лозинка",
- "Full Name" : "Цело име",
"Email" : "Е-пошта",
"Your email address" : "Вашата адреса за е-пошта",
"Profile picture" : "Фотографија за профил",
@@ -131,7 +129,6 @@ OC.L10N.register(
"Choose as profile image" : "Одбери фотографија за профилот",
"Language" : "Јазик",
"Help translate" : "Помогни во преводот",
- "Import Root Certificate" : "Увези",
"Log-in password" : "Лозинка за најавување",
"Decrypt all Files" : "Дешифрирај ги сите датотеки",
"Restore Encryption Keys" : "Обнови ги енкрипциските клучеви",
@@ -147,6 +144,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ве молам внесете квота за просторот (нпр: \"512 MB\" или \"12 GB\")",
"Unlimited" : "Неограничено",
"Other" : "Останато",
+ "Full Name" : "Цело име",
"Quota" : "Квота",
"Storage Location" : "Локација на сториџот",
"Last Login" : "Последна најава",
diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json
index 459347a713e..901693eff93 100644
--- a/settings/l10n/mk.json
+++ b/settings/l10n/mk.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Крон",
"Sharing" : "Споделување",
- "Security" : "Безбедност",
"Email Server" : "Сервер за електронска пошта",
"Log" : "Записник",
"Authentication error" : "Грешка во автентикација",
@@ -116,7 +115,6 @@
"Current password" : "Моментална лозинка",
"New password" : "Нова лозинка",
"Change password" : "Смени лозинка",
- "Full Name" : "Цело име",
"Email" : "Е-пошта",
"Your email address" : "Вашата адреса за е-пошта",
"Profile picture" : "Фотографија за профил",
@@ -129,7 +127,6 @@
"Choose as profile image" : "Одбери фотографија за профилот",
"Language" : "Јазик",
"Help translate" : "Помогни во преводот",
- "Import Root Certificate" : "Увези",
"Log-in password" : "Лозинка за најавување",
"Decrypt all Files" : "Дешифрирај ги сите датотеки",
"Restore Encryption Keys" : "Обнови ги енкрипциските клучеви",
@@ -145,6 +142,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ве молам внесете квота за просторот (нпр: \"512 MB\" или \"12 GB\")",
"Unlimited" : "Неограничено",
"Other" : "Останато",
+ "Full Name" : "Цело име",
"Quota" : "Квота",
"Storage Location" : "Локација на сториџот",
"Last Login" : "Последна најава",
diff --git a/settings/l10n/mn.js b/settings/l10n/mn.js
index a0d6b1e14b1..3bb2864e55b 100644
--- a/settings/l10n/mn.js
+++ b/settings/l10n/mn.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Аюулгүй байдал болон Тохиргооны анхааруулга",
"Cron" : "Крон",
"Sharing" : "Түгээлт",
- "Security" : "Аюулгүй байдал",
"Email Server" : "И-мэйл сервер",
"Log" : "Лог бичилт",
"Authentication error" : "Нотолгооны алдаа",
diff --git a/settings/l10n/mn.json b/settings/l10n/mn.json
index b1332514713..04f5d25c8dd 100644
--- a/settings/l10n/mn.json
+++ b/settings/l10n/mn.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Аюулгүй байдал болон Тохиргооны анхааруулга",
"Cron" : "Крон",
"Sharing" : "Түгээлт",
- "Security" : "Аюулгүй байдал",
"Email Server" : "И-мэйл сервер",
"Log" : "Лог бичилт",
"Authentication error" : "Нотолгооны алдаа",
diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js
index 6cae9469b95..8ba4b7941e1 100644
--- a/settings/l10n/nb_NO.js
+++ b/settings/l10n/nb_NO.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Advarsler for sikkerhet og oppsett",
"Cron" : "Cron",
"Sharing" : "Deling",
- "Security" : "Sikkerhet",
"Email Server" : "E-postserver",
"Log" : "Logg",
"Authentication error" : "Autentiseringsfeil",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "Loggnivå utenfor tillatt område",
"Saved" : "Lagret",
"test email settings" : "Test av innstillinger for e-post",
- "If you received this email, the settings seem to be correct." : "Hvis du mottar denne e-posten er innstillingene tydeligvis korrekte.",
- "A problem occurred while sending the email. Please revise your settings." : "Et problem oppstod med sending av e-post. Sjekk innstillingene.",
"Email sent" : "E-post sendt",
"You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.",
"Invalid mail address" : "Ugyldig e-postadresse",
@@ -92,7 +89,6 @@ OC.L10N.register(
"A valid password must be provided" : "Oppgi et gyldig passord",
"A valid email must be provided" : "En gyldig e-postadresse må oppgis",
"__language_name__" : "__language_name__",
- "Personal Info" : "Personlig informasjon",
"SSL root certificates" : "SSL rotsertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (fatale problemer, feil, advarsler, info, debug)",
@@ -196,7 +192,6 @@ OC.L10N.register(
"Current password" : "Nåværende passord",
"New password" : "Nytt passord",
"Change password" : "Endre passord",
- "Full Name" : "Fullt navn",
"No display name set" : "Visningsnavn ikke satt",
"Email" : "Epost",
"Your email address" : "Din e-postadresse",
@@ -217,7 +212,6 @@ OC.L10N.register(
"Valid until" : "Gyldig til",
"Issued By" : "Utstedt av",
"Valid until %s" : "Gyldig til %s",
- "Import Root Certificate" : "Importer rotsertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypterings-appen er ikke aktiv lenger. Vennligst dekrypter alle filene dine",
"Log-in password" : "Innloggingspassord",
"Decrypt all Files" : "Dekrypter alle filer",
@@ -243,6 +237,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Legg inn lagringskvote (f.eks. \"512 MB\" eller \"12 GB\")",
"Unlimited" : "Ubegrenset",
"Other" : "Annet",
+ "Full Name" : "Fullt navn",
"Group Admin for" : "Gruppeadministrator for",
"Quota" : "Kvote",
"Storage Location" : "Lagringsplassering",
diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json
index bf37133acc6..44cab5c459e 100644
--- a/settings/l10n/nb_NO.json
+++ b/settings/l10n/nb_NO.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Advarsler for sikkerhet og oppsett",
"Cron" : "Cron",
"Sharing" : "Deling",
- "Security" : "Sikkerhet",
"Email Server" : "E-postserver",
"Log" : "Logg",
"Authentication error" : "Autentiseringsfeil",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "Loggnivå utenfor tillatt område",
"Saved" : "Lagret",
"test email settings" : "Test av innstillinger for e-post",
- "If you received this email, the settings seem to be correct." : "Hvis du mottar denne e-posten er innstillingene tydeligvis korrekte.",
- "A problem occurred while sending the email. Please revise your settings." : "Et problem oppstod med sending av e-post. Sjekk innstillingene.",
"Email sent" : "E-post sendt",
"You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.",
"Invalid mail address" : "Ugyldig e-postadresse",
@@ -90,7 +87,6 @@
"A valid password must be provided" : "Oppgi et gyldig passord",
"A valid email must be provided" : "En gyldig e-postadresse må oppgis",
"__language_name__" : "__language_name__",
- "Personal Info" : "Personlig informasjon",
"SSL root certificates" : "SSL rotsertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (fatale problemer, feil, advarsler, info, debug)",
@@ -194,7 +190,6 @@
"Current password" : "Nåværende passord",
"New password" : "Nytt passord",
"Change password" : "Endre passord",
- "Full Name" : "Fullt navn",
"No display name set" : "Visningsnavn ikke satt",
"Email" : "Epost",
"Your email address" : "Din e-postadresse",
@@ -215,7 +210,6 @@
"Valid until" : "Gyldig til",
"Issued By" : "Utstedt av",
"Valid until %s" : "Gyldig til %s",
- "Import Root Certificate" : "Importer rotsertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypterings-appen er ikke aktiv lenger. Vennligst dekrypter alle filene dine",
"Log-in password" : "Innloggingspassord",
"Decrypt all Files" : "Dekrypter alle filer",
@@ -241,6 +235,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Legg inn lagringskvote (f.eks. \"512 MB\" eller \"12 GB\")",
"Unlimited" : "Ubegrenset",
"Other" : "Annet",
+ "Full Name" : "Fullt navn",
"Group Admin for" : "Gruppeadministrator for",
"Quota" : "Kvote",
"Storage Location" : "Lagringsplassering",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index b1e7bb6b891..441d8cf5254 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Beveiligings- en instellingswaarschuwingen",
"Cron" : "Cron",
"Sharing" : "Delen",
- "Security" : "Beveiliging",
"Email Server" : "E-mailserver",
"Log" : "Log",
"Authentication error" : "Authenticatie fout",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "loggingniveau buiten toegestane bereik",
"Saved" : "Bewaard",
"test email settings" : "test e-mailinstellingen",
- "If you received this email, the settings seem to be correct." : "Als u dit e-mailbericht ontvangt, lijken de instellingen juist.",
- "A problem occurred while sending the email. Please revise your settings." : "Er ontstond een probleem bij het versturen van de e-mail. Controleer uw instellingen.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Er ontstond een probleem bij het versturen van de e-mail. Controleer uw instellingen. (Fout: %s)",
"Email sent" : "E-mail verzonden",
"You need to set your user email before being able to send test emails." : "U moet uw e-mailadres invoeren voordat u testberichten kunt versturen.",
"Invalid mail address" : "Ongeldig e-mailadres",
+ "A user with that name already exists." : "Er bestaat al een gebruiker met die naam.",
"Unable to create user." : "Kan gebruiker niet aanmaken.",
"Your %s account was created" : "Uw %s account is aangemaakt",
"Unable to delete user." : "Kan gebruiker niet afvoeren.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven",
"A valid email must be provided" : "Er moet een geldig e-mailadres worden opgegeven",
"__language_name__" : "Nederlands",
- "Personal Info" : "Persoonlijke info",
"SSL root certificates" : "SSL root certificaten",
"Encryption" : "Versleuteling",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Documentatie:",
"User Documentation" : "Gebruikersdocumentatie",
"Admin Documentation" : "Beheerdocumentatie",
+ "Show description …" : "Toon beschrijving ...",
+ "Hide description …" : "Verberg beschrijving ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Deze app kan niet worden geïnstalleerd omdat de volgende afhankelijkheden niet zijn ingevuld:",
"Update to %s" : "Bijgewerkt naar %s",
"Enable only for specific groups" : "Alleen voor bepaalde groepen activeren",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Huidig wachtwoord",
"New password" : "Nieuw",
"Change password" : "Wijzig wachtwoord",
- "Full Name" : "Volledige naam",
"No display name set" : "Nog geen weergavenaam ingesteld",
"Email" : "E-mailadres",
"Your email address" : "Uw e-mailadres",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Geldig tot",
"Issued By" : "Uitgegeven door",
"Valid until %s" : "Geldig tot %s",
- "Import Root Certificate" : "Importeer root certificaat",
"The encryption app is no longer enabled, please decrypt all your files" : "De crypto app is niet langer geactiveerd, u moet alle bestanden decrypten.",
"Log-in password" : "Inlog-wachtwoord",
"Decrypt all Files" : "Decodeer alle bestanden",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Geef de opslagquotering op (bijv. \"512 MB\" of \"12 GB\")",
"Unlimited" : "Ongelimiteerd",
"Other" : "Anders",
+ "Full Name" : "Volledige naam",
"Group Admin for" : "Groepsbeheerder voor",
"Quota" : "Limieten",
"Storage Location" : "Opslaglocatie",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index c264a0675e6..e09928e198a 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Beveiligings- en instellingswaarschuwingen",
"Cron" : "Cron",
"Sharing" : "Delen",
- "Security" : "Beveiliging",
"Email Server" : "E-mailserver",
"Log" : "Log",
"Authentication error" : "Authenticatie fout",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "loggingniveau buiten toegestane bereik",
"Saved" : "Bewaard",
"test email settings" : "test e-mailinstellingen",
- "If you received this email, the settings seem to be correct." : "Als u dit e-mailbericht ontvangt, lijken de instellingen juist.",
- "A problem occurred while sending the email. Please revise your settings." : "Er ontstond een probleem bij het versturen van de e-mail. Controleer uw instellingen.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Er ontstond een probleem bij het versturen van de e-mail. Controleer uw instellingen. (Fout: %s)",
"Email sent" : "E-mail verzonden",
"You need to set your user email before being able to send test emails." : "U moet uw e-mailadres invoeren voordat u testberichten kunt versturen.",
"Invalid mail address" : "Ongeldig e-mailadres",
+ "A user with that name already exists." : "Er bestaat al een gebruiker met die naam.",
"Unable to create user." : "Kan gebruiker niet aanmaken.",
"Your %s account was created" : "Uw %s account is aangemaakt",
"Unable to delete user." : "Kan gebruiker niet afvoeren.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven",
"A valid email must be provided" : "Er moet een geldig e-mailadres worden opgegeven",
"__language_name__" : "Nederlands",
- "Personal Info" : "Persoonlijke info",
"SSL root certificates" : "SSL root certificaten",
"Encryption" : "Versleuteling",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)",
@@ -178,6 +176,8 @@
"Documentation:" : "Documentatie:",
"User Documentation" : "Gebruikersdocumentatie",
"Admin Documentation" : "Beheerdocumentatie",
+ "Show description …" : "Toon beschrijving ...",
+ "Hide description …" : "Verberg beschrijving ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Deze app kan niet worden geïnstalleerd omdat de volgende afhankelijkheden niet zijn ingevuld:",
"Update to %s" : "Bijgewerkt naar %s",
"Enable only for specific groups" : "Alleen voor bepaalde groepen activeren",
@@ -202,7 +202,6 @@
"Current password" : "Huidig wachtwoord",
"New password" : "Nieuw",
"Change password" : "Wijzig wachtwoord",
- "Full Name" : "Volledige naam",
"No display name set" : "Nog geen weergavenaam ingesteld",
"Email" : "E-mailadres",
"Your email address" : "Uw e-mailadres",
@@ -223,7 +222,6 @@
"Valid until" : "Geldig tot",
"Issued By" : "Uitgegeven door",
"Valid until %s" : "Geldig tot %s",
- "Import Root Certificate" : "Importeer root certificaat",
"The encryption app is no longer enabled, please decrypt all your files" : "De crypto app is niet langer geactiveerd, u moet alle bestanden decrypten.",
"Log-in password" : "Inlog-wachtwoord",
"Decrypt all Files" : "Decodeer alle bestanden",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Geef de opslagquotering op (bijv. \"512 MB\" of \"12 GB\")",
"Unlimited" : "Ongelimiteerd",
"Other" : "Anders",
+ "Full Name" : "Volledige naam",
"Group Admin for" : "Groepsbeheerder voor",
"Quota" : "Limieten",
"Storage Location" : "Opslaglocatie",
diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js
index ee269927320..016f54b4b60 100644
--- a/settings/l10n/nn_NO.js
+++ b/settings/l10n/nn_NO.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "Cron",
"Sharing" : "Deling",
- "Security" : "Tryggleik",
"Log" : "Logg",
"Authentication error" : "Autentiseringsfeil",
"Language changed" : "Språk endra",
diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json
index 9977cf661b5..eceac88d74d 100644
--- a/settings/l10n/nn_NO.json
+++ b/settings/l10n/nn_NO.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "Cron",
"Sharing" : "Deling",
- "Security" : "Tryggleik",
"Log" : "Logg",
"Authentication error" : "Autentiseringsfeil",
"Language changed" : "Språk endra",
diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js
index f1e8c8a6cc3..ee56758ef86 100644
--- a/settings/l10n/pl.js
+++ b/settings/l10n/pl.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Ostrzeżenia bezpieczeństwa i konfiguracji",
"Cron" : "Cron",
"Sharing" : "Udostępnianie",
- "Security" : "Bezpieczeństwo",
"Email Server" : "Serwer pocztowy",
"Log" : "Logi",
"Authentication error" : "Błąd uwierzytelniania",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "wartość log-level spoza dozwolonego zakresu",
"Saved" : "Zapisano",
"test email settings" : "przetestuj ustawienia email",
- "If you received this email, the settings seem to be correct." : "Jeśli otrzymałeś ten email, ustawienia wydają się być poprawne.",
- "A problem occurred while sending the email. Please revise your settings." : "Pojawił się problem podczas wysyłania email. Proszę sprawdzić ponownie ustawienia",
"Email sent" : "E-mail wysłany",
"You need to set your user email before being able to send test emails." : "Musisz najpierw ustawić użytkownika e-mail, aby móc wysyłać wiadomości testowe.",
"Invalid mail address" : "Nieprawidłowy adres email",
@@ -92,7 +89,6 @@ OC.L10N.register(
"A valid password must be provided" : "Należy podać prawidłowe hasło",
"A valid email must be provided" : "Podaj poprawny adres email",
"__language_name__" : "polski",
- "Personal Info" : "Informacje osobiste",
"SSL root certificates" : "Główny certyfikat SSL",
"Encryption" : "Szyfrowanie",
"Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)",
@@ -186,7 +182,6 @@ OC.L10N.register(
"Current password" : "Bieżące hasło",
"New password" : "Nowe hasło",
"Change password" : "Zmień hasło",
- "Full Name" : "Pełna nazwa",
"No display name set" : "Brak nazwa wyświetlanej",
"Email" : "Email",
"Your email address" : "Twój adres e-mail",
@@ -206,7 +201,6 @@ OC.L10N.register(
"Valid until" : "Ważny do",
"Issued By" : "Wydany przez",
"Valid until %s" : "Ważny do %s",
- "Import Root Certificate" : "Importuj główny certyfikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikacja szyfrowanie nie jest włączona, odszyfruj wszystkie plik",
"Log-in password" : "Hasło logowania",
"Decrypt all Files" : "Odszyfruj wszystkie pliki",
@@ -231,6 +225,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Proszę ustawić ograniczenie zasobów (np. \"512 MB\" albo \"12 GB)",
"Unlimited" : "Bez limitu",
"Other" : "Inne",
+ "Full Name" : "Pełna nazwa",
"Group Admin for" : "Grupa Admin dla",
"Quota" : "Udział",
"Storage Location" : "Lokalizacja magazynu",
diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json
index 4cb462ab689..78cec4a18f8 100644
--- a/settings/l10n/pl.json
+++ b/settings/l10n/pl.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Ostrzeżenia bezpieczeństwa i konfiguracji",
"Cron" : "Cron",
"Sharing" : "Udostępnianie",
- "Security" : "Bezpieczeństwo",
"Email Server" : "Serwer pocztowy",
"Log" : "Logi",
"Authentication error" : "Błąd uwierzytelniania",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "wartość log-level spoza dozwolonego zakresu",
"Saved" : "Zapisano",
"test email settings" : "przetestuj ustawienia email",
- "If you received this email, the settings seem to be correct." : "Jeśli otrzymałeś ten email, ustawienia wydają się być poprawne.",
- "A problem occurred while sending the email. Please revise your settings." : "Pojawił się problem podczas wysyłania email. Proszę sprawdzić ponownie ustawienia",
"Email sent" : "E-mail wysłany",
"You need to set your user email before being able to send test emails." : "Musisz najpierw ustawić użytkownika e-mail, aby móc wysyłać wiadomości testowe.",
"Invalid mail address" : "Nieprawidłowy adres email",
@@ -90,7 +87,6 @@
"A valid password must be provided" : "Należy podać prawidłowe hasło",
"A valid email must be provided" : "Podaj poprawny adres email",
"__language_name__" : "polski",
- "Personal Info" : "Informacje osobiste",
"SSL root certificates" : "Główny certyfikat SSL",
"Encryption" : "Szyfrowanie",
"Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)",
@@ -184,7 +180,6 @@
"Current password" : "Bieżące hasło",
"New password" : "Nowe hasło",
"Change password" : "Zmień hasło",
- "Full Name" : "Pełna nazwa",
"No display name set" : "Brak nazwa wyświetlanej",
"Email" : "Email",
"Your email address" : "Twój adres e-mail",
@@ -204,7 +199,6 @@
"Valid until" : "Ważny do",
"Issued By" : "Wydany przez",
"Valid until %s" : "Ważny do %s",
- "Import Root Certificate" : "Importuj główny certyfikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Aplikacja szyfrowanie nie jest włączona, odszyfruj wszystkie plik",
"Log-in password" : "Hasło logowania",
"Decrypt all Files" : "Odszyfruj wszystkie pliki",
@@ -229,6 +223,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Proszę ustawić ograniczenie zasobów (np. \"512 MB\" albo \"12 GB)",
"Unlimited" : "Bez limitu",
"Other" : "Inne",
+ "Full Name" : "Pełna nazwa",
"Group Admin for" : "Grupa Admin dla",
"Quota" : "Udział",
"Storage Location" : "Lokalizacja magazynu",
diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js
index 3f4bb81a4fc..5af3f0daa62 100644
--- a/settings/l10n/pt_BR.js
+++ b/settings/l10n/pt_BR.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Avisos de Segurança & Configuração",
"Cron" : "Cron",
"Sharing" : "Compartilhamento",
- "Security" : "Segurança",
"Email Server" : "Servidor de Email",
"Log" : "Registro",
"Authentication error" : "Erro de autenticação",
@@ -39,8 +38,7 @@ OC.L10N.register(
"log-level out of allowed range" : "log-nível acima do permitido",
"Saved" : "Salvo",
"test email settings" : "testar configurações de email",
- "If you received this email, the settings seem to be correct." : "Se você recebeu este e-mail, as configurações parecem estar corretas.",
- "A problem occurred while sending the email. Please revise your settings." : "Ocorreu um problema ao enviar o e-mail. Por favor, revise suas configurações.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o e-mail. Por favor, revise suas configurações. (Erro: %s)",
"Email sent" : "E-mail enviado",
"You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.",
"Invalid mail address" : "Endereço de e-mail inválido",
@@ -93,7 +91,6 @@ OC.L10N.register(
"A valid password must be provided" : "Forneça uma senha válida",
"A valid email must be provided" : "Deve ser informado um e-mail válido",
"__language_name__" : "__language_name__",
- "Personal Info" : "Informação Pessoal",
"SSL root certificates" : "Certificados SSL raíz",
"Encryption" : "Criptografia",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)",
@@ -132,6 +129,7 @@ OC.L10N.register(
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:",
"Configuration Checks" : "Verificações de Configuração",
"No problems found" : "Nenhum problema encontrado",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor verifique novamente o <a href=\"%s\">guia de instalações</a>, e procure por qualquer erro ou alerta em <a href=\"#log-section\">log</a>.",
"Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
"Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
"Cron was not executed yet!" : "Cron não foi executado ainda!",
@@ -203,7 +201,6 @@ OC.L10N.register(
"Current password" : "Senha atual",
"New password" : "Nova senha",
"Change password" : "Alterar senha",
- "Full Name" : "Nome Completo",
"No display name set" : "Nenhuma exibição de nome de configuração",
"Email" : "E-mail",
"Your email address" : "Seu endereço de e-mail",
@@ -224,7 +221,6 @@ OC.L10N.register(
"Valid until" : "Válido até",
"Issued By" : "Emitido Por",
"Valid until %s" : "Válido até %s",
- "Import Root Certificate" : "Importar Certificado Raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "O aplicativo de criptografia não está habilitado, por favor descriptar todos os seus arquivos",
"Log-in password" : "Senha de login",
"Decrypt all Files" : "Descriptografar todos os Arquivos",
@@ -251,6 +247,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor insira cota de armazenamento (ex: \"512\" ou \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Outro",
+ "Full Name" : "Nome Completo",
"Group Admin for" : "Grupo Admin para",
"Quota" : "Cota",
"Storage Location" : "Local de Armazenamento",
diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json
index ac9c8a8455f..df4004acca1 100644
--- a/settings/l10n/pt_BR.json
+++ b/settings/l10n/pt_BR.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Avisos de Segurança & Configuração",
"Cron" : "Cron",
"Sharing" : "Compartilhamento",
- "Security" : "Segurança",
"Email Server" : "Servidor de Email",
"Log" : "Registro",
"Authentication error" : "Erro de autenticação",
@@ -37,8 +36,7 @@
"log-level out of allowed range" : "log-nível acima do permitido",
"Saved" : "Salvo",
"test email settings" : "testar configurações de email",
- "If you received this email, the settings seem to be correct." : "Se você recebeu este e-mail, as configurações parecem estar corretas.",
- "A problem occurred while sending the email. Please revise your settings." : "Ocorreu um problema ao enviar o e-mail. Por favor, revise suas configurações.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o e-mail. Por favor, revise suas configurações. (Erro: %s)",
"Email sent" : "E-mail enviado",
"You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.",
"Invalid mail address" : "Endereço de e-mail inválido",
@@ -91,7 +89,6 @@
"A valid password must be provided" : "Forneça uma senha válida",
"A valid email must be provided" : "Deve ser informado um e-mail válido",
"__language_name__" : "__language_name__",
- "Personal Info" : "Informação Pessoal",
"SSL root certificates" : "Certificados SSL raíz",
"Encryption" : "Criptografia",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)",
@@ -130,6 +127,7 @@
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:",
"Configuration Checks" : "Verificações de Configuração",
"No problems found" : "Nenhum problema encontrado",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor verifique novamente o <a href=\"%s\">guia de instalações</a>, e procure por qualquer erro ou alerta em <a href=\"#log-section\">log</a>.",
"Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
"Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
"Cron was not executed yet!" : "Cron não foi executado ainda!",
@@ -201,7 +199,6 @@
"Current password" : "Senha atual",
"New password" : "Nova senha",
"Change password" : "Alterar senha",
- "Full Name" : "Nome Completo",
"No display name set" : "Nenhuma exibição de nome de configuração",
"Email" : "E-mail",
"Your email address" : "Seu endereço de e-mail",
@@ -222,7 +219,6 @@
"Valid until" : "Válido até",
"Issued By" : "Emitido Por",
"Valid until %s" : "Válido até %s",
- "Import Root Certificate" : "Importar Certificado Raíz",
"The encryption app is no longer enabled, please decrypt all your files" : "O aplicativo de criptografia não está habilitado, por favor descriptar todos os seus arquivos",
"Log-in password" : "Senha de login",
"Decrypt all Files" : "Descriptografar todos os Arquivos",
@@ -249,6 +245,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Por favor insira cota de armazenamento (ex: \"512\" ou \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Outro",
+ "Full Name" : "Nome Completo",
"Group Admin for" : "Grupo Admin para",
"Quota" : "Cota",
"Storage Location" : "Local de Armazenamento",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index dd61503aa0b..e535ae1b43a 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Avisos de Configuração e Segurança",
"Cron" : "Cron",
"Sharing" : "Partilha",
- "Security" : "Segurança",
"Email Server" : "Servidor de e-mail",
"Log" : "Registo",
"Authentication error" : "Erro na autenticação",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "log-level fora do alcance permitido",
"Saved" : "Guardado",
"test email settings" : "testar as definições de e-mail",
- "If you received this email, the settings seem to be correct." : "Se recebeu este e-mail, as configurações parecem estar corretas",
- "A problem occurred while sending the email. Please revise your settings." : "Ocorreu um problema durante o envio do e-mail. Por favor, verifique as suas configurações..",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Um problema ocorreu ao enviar o email. Por favor verifique as suas definições. (Erro: %s)",
"Email sent" : "Mensagem enviada",
"You need to set your user email before being able to send test emails." : "Você precisa de configurar o seu e-mail de usuário antes de ser capaz de enviar e-mails de teste",
"Invalid mail address" : "Endereço de correio eletrónico inválido",
+ "A user with that name already exists." : "Já existe um utilizador com esse nome.",
"Unable to create user." : "Impossível criar o utilizador.",
"Your %s account was created" : "A tua conta %s foi criada",
"Unable to delete user." : "Impossível apagar o utilizador.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Deve ser indicada uma palavra-passe válida",
"A valid email must be provided" : "Deve ser fornecido um email válido",
"__language_name__" : "__language_name__",
- "Personal Info" : "Informação Pessoal",
"SSL root certificates" : "Certificados de raiz SSL",
"Encryption" : "Encriptação",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (problemas fatais, erros, avisos, informação, depuração)",
@@ -180,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Documentação:",
"User Documentation" : "Documentação de Utilizador",
"Admin Documentation" : "Documentação de Administrador",
+ "Show description …" : "Mostrar descrição ...",
+ "Hide description …" : "Esconder descrição ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicação não pode ser instalada porque as seguintes dependências não podem ser realizadas:",
"Update to %s" : "Actualizar para %s",
"Enable only for specific groups" : "Activar só para grupos específicos",
@@ -204,7 +204,6 @@ OC.L10N.register(
"Current password" : "Palavra-passe atual",
"New password" : "Nova palavra-passe",
"Change password" : "Alterar palavra-passe",
- "Full Name" : "Nome completo",
"No display name set" : "Nenhum nome display estabelecido",
"Email" : "Email",
"Your email address" : "O seu endereço de email",
@@ -225,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Válido até",
"Issued By" : "Emitido Por",
"Valid until %s" : "Válido até %s",
- "Import Root Certificate" : "Importar Certificado Root",
"The encryption app is no longer enabled, please decrypt all your files" : "A aplicação de encriptação já não está ativa, por favor desincripte todos os seus ficheiros",
"Log-in password" : "Palavra-passe de Iniciar a Sessão",
"Decrypt all Files" : "Desencriptar todos os ficheiros",
@@ -252,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Insira a quota de armazenamento (ex: \"512 MB\" ou \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Outro",
+ "Full Name" : "Nome completo",
"Group Admin for" : "Administrador de Grupo para",
"Quota" : "Quota",
"Storage Location" : "Localização do Armazenamento",
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index fe612281aa0..f557e6fc806 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Avisos de Configuração e Segurança",
"Cron" : "Cron",
"Sharing" : "Partilha",
- "Security" : "Segurança",
"Email Server" : "Servidor de e-mail",
"Log" : "Registo",
"Authentication error" : "Erro na autenticação",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "log-level fora do alcance permitido",
"Saved" : "Guardado",
"test email settings" : "testar as definições de e-mail",
- "If you received this email, the settings seem to be correct." : "Se recebeu este e-mail, as configurações parecem estar corretas",
- "A problem occurred while sending the email. Please revise your settings." : "Ocorreu um problema durante o envio do e-mail. Por favor, verifique as suas configurações..",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Um problema ocorreu ao enviar o email. Por favor verifique as suas definições. (Erro: %s)",
"Email sent" : "Mensagem enviada",
"You need to set your user email before being able to send test emails." : "Você precisa de configurar o seu e-mail de usuário antes de ser capaz de enviar e-mails de teste",
"Invalid mail address" : "Endereço de correio eletrónico inválido",
+ "A user with that name already exists." : "Já existe um utilizador com esse nome.",
"Unable to create user." : "Impossível criar o utilizador.",
"Your %s account was created" : "A tua conta %s foi criada",
"Unable to delete user." : "Impossível apagar o utilizador.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Deve ser indicada uma palavra-passe válida",
"A valid email must be provided" : "Deve ser fornecido um email válido",
"__language_name__" : "__language_name__",
- "Personal Info" : "Informação Pessoal",
"SSL root certificates" : "Certificados de raiz SSL",
"Encryption" : "Encriptação",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (problemas fatais, erros, avisos, informação, depuração)",
@@ -178,6 +176,8 @@
"Documentation:" : "Documentação:",
"User Documentation" : "Documentação de Utilizador",
"Admin Documentation" : "Documentação de Administrador",
+ "Show description …" : "Mostrar descrição ...",
+ "Hide description …" : "Esconder descrição ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicação não pode ser instalada porque as seguintes dependências não podem ser realizadas:",
"Update to %s" : "Actualizar para %s",
"Enable only for specific groups" : "Activar só para grupos específicos",
@@ -202,7 +202,6 @@
"Current password" : "Palavra-passe atual",
"New password" : "Nova palavra-passe",
"Change password" : "Alterar palavra-passe",
- "Full Name" : "Nome completo",
"No display name set" : "Nenhum nome display estabelecido",
"Email" : "Email",
"Your email address" : "O seu endereço de email",
@@ -223,7 +222,6 @@
"Valid until" : "Válido até",
"Issued By" : "Emitido Por",
"Valid until %s" : "Válido até %s",
- "Import Root Certificate" : "Importar Certificado Root",
"The encryption app is no longer enabled, please decrypt all your files" : "A aplicação de encriptação já não está ativa, por favor desincripte todos os seus ficheiros",
"Log-in password" : "Palavra-passe de Iniciar a Sessão",
"Decrypt all Files" : "Desencriptar todos os ficheiros",
@@ -250,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Insira a quota de armazenamento (ex: \"512 MB\" ou \"12 GB\")",
"Unlimited" : "Ilimitado",
"Other" : "Outro",
+ "Full Name" : "Nome completo",
"Group Admin for" : "Administrador de Grupo para",
"Quota" : "Quota",
"Storage Location" : "Localização do Armazenamento",
diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js
index 22d22c0e3c1..0b2fb901904 100644
--- a/settings/l10n/ro.js
+++ b/settings/l10n/ro.js
@@ -1,9 +1,9 @@
OC.L10N.register(
"settings",
{
+ "Security & Setup Warnings" : "Nu am putut sterge aplicatia",
"Cron" : "Cron",
"Sharing" : "Partajare",
- "Security" : "Securitate",
"Log" : "Jurnal de activitate",
"Authentication error" : "Eroare la autentificare",
"Your full name has been changed." : "Numele tău complet a fost schimbat.",
@@ -11,6 +11,7 @@ OC.L10N.register(
"Files decrypted successfully" : "Fișierele au fost decriptate cu succes",
"Couldn't decrypt your files, please check your owncloud.log or ask your administrator" : "Nu s-a puput decripta fișierele tale, verifică owncloud.log sau întreabă administratorul",
"Couldn't decrypt your files, check your password and try again" : "Nu s-a puput decripta fișierele tale, verifică parola și încearcă din nou",
+ "Backups restored successfully" : "Copiile de rezervă au fost restaurate cu succes",
"Language changed" : "Limba a fost schimbată",
"Invalid request" : "Cerere eronată",
"Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul admin",
@@ -22,10 +23,13 @@ OC.L10N.register(
"Unable to change password" : "Imposibil de schimbat parola",
"Enabled" : "Activat",
"Recommended" : "Recomandat",
+ "Group already exists." : "Grupul deja exista.",
+ "Unable to add group." : "Nu se poate adăuga grupul.",
+ "Unable to delete group." : "Nu se poate sterge grupul.",
"Saved" : "Salvat",
"test email settings" : "verifică setările de e-mail",
- "If you received this email, the settings seem to be correct." : "Dacă ai primit acest e-mail atunci setările par a fi corecte.",
"Email sent" : "Mesajul a fost expediat",
+ "Invalid user" : "Utilizator nevalid",
"Email saved" : "E-mail salvat",
"Sending..." : "Se expediază...",
"All" : "Toate ",
@@ -37,6 +41,8 @@ OC.L10N.register(
"Updating...." : "Actualizare în curs....",
"Error while updating app" : "Eroare în timpul actualizării aplicaţiei",
"Updated" : "Actualizat",
+ "Uninstalling ...." : "Dezinstalaza ....",
+ "Uninstall" : "Dezinstalați",
"Select a profile picture" : "Selectează o imagine de profil",
"Very weak password" : "Parolă foarte slabă",
"Weak password" : "Parolă slabă",
@@ -94,7 +100,6 @@ OC.L10N.register(
"Current password" : "Parola curentă",
"New password" : "Noua parolă",
"Change password" : "Schimbă parola",
- "Full Name" : "Nume complet",
"Email" : "Email",
"Your email address" : "Adresa ta de email",
"Profile picture" : "Imagine de profil",
@@ -106,7 +111,6 @@ OC.L10N.register(
"Choose as profile image" : "Alege drept imagine de profil",
"Language" : "Limba",
"Help translate" : "Ajută la traducere",
- "Import Root Certificate" : "Importă certificat root",
"Log-in password" : "Parolă",
"Decrypt all Files" : "Decriptează toate fișierele",
"Username" : "Nume utilizator",
@@ -117,6 +121,7 @@ OC.L10N.register(
"Default Quota" : "Cotă implicită",
"Unlimited" : "Nelimitată",
"Other" : "Altele",
+ "Full Name" : "Nume complet",
"Quota" : "Cotă",
"change full name" : "schimbă numele complet",
"set new password" : "setează parolă nouă",
diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json
index 62e5e659839..a2e7ca2cb85 100644
--- a/settings/l10n/ro.json
+++ b/settings/l10n/ro.json
@@ -1,7 +1,7 @@
{ "translations": {
+ "Security & Setup Warnings" : "Nu am putut sterge aplicatia",
"Cron" : "Cron",
"Sharing" : "Partajare",
- "Security" : "Securitate",
"Log" : "Jurnal de activitate",
"Authentication error" : "Eroare la autentificare",
"Your full name has been changed." : "Numele tău complet a fost schimbat.",
@@ -9,6 +9,7 @@
"Files decrypted successfully" : "Fișierele au fost decriptate cu succes",
"Couldn't decrypt your files, please check your owncloud.log or ask your administrator" : "Nu s-a puput decripta fișierele tale, verifică owncloud.log sau întreabă administratorul",
"Couldn't decrypt your files, check your password and try again" : "Nu s-a puput decripta fișierele tale, verifică parola și încearcă din nou",
+ "Backups restored successfully" : "Copiile de rezervă au fost restaurate cu succes",
"Language changed" : "Limba a fost schimbată",
"Invalid request" : "Cerere eronată",
"Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul admin",
@@ -20,10 +21,13 @@
"Unable to change password" : "Imposibil de schimbat parola",
"Enabled" : "Activat",
"Recommended" : "Recomandat",
+ "Group already exists." : "Grupul deja exista.",
+ "Unable to add group." : "Nu se poate adăuga grupul.",
+ "Unable to delete group." : "Nu se poate sterge grupul.",
"Saved" : "Salvat",
"test email settings" : "verifică setările de e-mail",
- "If you received this email, the settings seem to be correct." : "Dacă ai primit acest e-mail atunci setările par a fi corecte.",
"Email sent" : "Mesajul a fost expediat",
+ "Invalid user" : "Utilizator nevalid",
"Email saved" : "E-mail salvat",
"Sending..." : "Se expediază...",
"All" : "Toate ",
@@ -35,6 +39,8 @@
"Updating...." : "Actualizare în curs....",
"Error while updating app" : "Eroare în timpul actualizării aplicaţiei",
"Updated" : "Actualizat",
+ "Uninstalling ...." : "Dezinstalaza ....",
+ "Uninstall" : "Dezinstalați",
"Select a profile picture" : "Selectează o imagine de profil",
"Very weak password" : "Parolă foarte slabă",
"Weak password" : "Parolă slabă",
@@ -92,7 +98,6 @@
"Current password" : "Parola curentă",
"New password" : "Noua parolă",
"Change password" : "Schimbă parola",
- "Full Name" : "Nume complet",
"Email" : "Email",
"Your email address" : "Adresa ta de email",
"Profile picture" : "Imagine de profil",
@@ -104,7 +109,6 @@
"Choose as profile image" : "Alege drept imagine de profil",
"Language" : "Limba",
"Help translate" : "Ajută la traducere",
- "Import Root Certificate" : "Importă certificat root",
"Log-in password" : "Parolă",
"Decrypt all Files" : "Decriptează toate fișierele",
"Username" : "Nume utilizator",
@@ -115,6 +119,7 @@
"Default Quota" : "Cotă implicită",
"Unlimited" : "Nelimitată",
"Other" : "Altele",
+ "Full Name" : "Nume complet",
"Quota" : "Cotă",
"change full name" : "schimbă numele complet",
"set new password" : "setează parolă nouă",
diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js
index e2d64b4eea4..1a8e715405b 100644
--- a/settings/l10n/ru.js
+++ b/settings/l10n/ru.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Предупреждения безопасности и настроек",
"Cron" : "Cron (планировщик задач)",
"Sharing" : "Общий доступ",
- "Security" : "Безопасность",
"Email Server" : "Почтовый сервер",
"Log" : "Журнал",
"Authentication error" : "Ошибка аутентификации",
@@ -39,8 +38,7 @@ OC.L10N.register(
"log-level out of allowed range" : "уровень журнала вышел за разрешенный диапазон",
"Saved" : "Сохранено",
"test email settings" : "проверить настройки почты",
- "If you received this email, the settings seem to be correct." : "Если вы получили это письмо, значит настройки верны.",
- "A problem occurred while sending the email. Please revise your settings." : "Возникла проблема при отправке письма. Пожалуйста проверьте ваши настройки.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Во время отправки email произошла ошибка. Пожалуйста проверьте настройки. (Ошибка: %s)",
"Email sent" : "Письмо отправлено",
"You need to set your user email before being able to send test emails." : "Вы должны настроить свой e-mail пользователя прежде чем отправлять тестовые сообщения.",
"Invalid mail address" : "Некорректный адрес email",
@@ -93,7 +91,6 @@ OC.L10N.register(
"A valid password must be provided" : "Должен быть указан правильный пароль",
"A valid email must be provided" : "Должен быть указан корректный адрес email",
"__language_name__" : "Русский",
- "Personal Info" : "Личная информация",
"SSL root certificates" : "Корневые сертификаты SSL",
"Encryption" : "Шифрование",
"Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)",
@@ -204,7 +201,6 @@ OC.L10N.register(
"Current password" : "Текущий пароль",
"New password" : "Новый пароль",
"Change password" : "Сменить пароль",
- "Full Name" : "Полное имя",
"No display name set" : "Отображаемое имя не указано",
"Email" : "E-mail",
"Your email address" : "Ваш адрес электронной почты",
@@ -225,7 +221,6 @@ OC.L10N.register(
"Valid until" : "Действительно до",
"Issued By" : "Выдан",
"Valid until %s" : "Действительно до %s",
- "Import Root Certificate" : "Импортировать корневые сертификаты",
"The encryption app is no longer enabled, please decrypt all your files" : "Приложение шифрования больше не используется, пожалуйста расшифруйте все ваши файлы",
"Log-in password" : "Пароль входа",
"Decrypt all Files" : "Снять шифрование со всех файлов",
@@ -252,6 +247,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Пожалуйста, введите квоту на хранилище (например: \"512 MB\" или \"12 GB\")",
"Unlimited" : "Неограничено",
"Other" : "Другая",
+ "Full Name" : "Полное имя",
"Group Admin for" : "Для группы Администраторов",
"Quota" : "Квота",
"Storage Location" : "Место хранилища",
diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json
index 5c6ec0f644f..4c8e777de10 100644
--- a/settings/l10n/ru.json
+++ b/settings/l10n/ru.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Предупреждения безопасности и настроек",
"Cron" : "Cron (планировщик задач)",
"Sharing" : "Общий доступ",
- "Security" : "Безопасность",
"Email Server" : "Почтовый сервер",
"Log" : "Журнал",
"Authentication error" : "Ошибка аутентификации",
@@ -37,8 +36,7 @@
"log-level out of allowed range" : "уровень журнала вышел за разрешенный диапазон",
"Saved" : "Сохранено",
"test email settings" : "проверить настройки почты",
- "If you received this email, the settings seem to be correct." : "Если вы получили это письмо, значит настройки верны.",
- "A problem occurred while sending the email. Please revise your settings." : "Возникла проблема при отправке письма. Пожалуйста проверьте ваши настройки.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Во время отправки email произошла ошибка. Пожалуйста проверьте настройки. (Ошибка: %s)",
"Email sent" : "Письмо отправлено",
"You need to set your user email before being able to send test emails." : "Вы должны настроить свой e-mail пользователя прежде чем отправлять тестовые сообщения.",
"Invalid mail address" : "Некорректный адрес email",
@@ -91,7 +89,6 @@
"A valid password must be provided" : "Должен быть указан правильный пароль",
"A valid email must be provided" : "Должен быть указан корректный адрес email",
"__language_name__" : "Русский",
- "Personal Info" : "Личная информация",
"SSL root certificates" : "Корневые сертификаты SSL",
"Encryption" : "Шифрование",
"Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)",
@@ -202,7 +199,6 @@
"Current password" : "Текущий пароль",
"New password" : "Новый пароль",
"Change password" : "Сменить пароль",
- "Full Name" : "Полное имя",
"No display name set" : "Отображаемое имя не указано",
"Email" : "E-mail",
"Your email address" : "Ваш адрес электронной почты",
@@ -223,7 +219,6 @@
"Valid until" : "Действительно до",
"Issued By" : "Выдан",
"Valid until %s" : "Действительно до %s",
- "Import Root Certificate" : "Импортировать корневые сертификаты",
"The encryption app is no longer enabled, please decrypt all your files" : "Приложение шифрования больше не используется, пожалуйста расшифруйте все ваши файлы",
"Log-in password" : "Пароль входа",
"Decrypt all Files" : "Снять шифрование со всех файлов",
@@ -250,6 +245,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Пожалуйста, введите квоту на хранилище (например: \"512 MB\" или \"12 GB\")",
"Unlimited" : "Неограничено",
"Other" : "Другая",
+ "Full Name" : "Полное имя",
"Group Admin for" : "Для группы Администраторов",
"Quota" : "Квота",
"Storage Location" : "Место хранилища",
diff --git a/settings/l10n/si_LK.js b/settings/l10n/si_LK.js
index 9de7f4f4f38..a0a10f99fbb 100644
--- a/settings/l10n/si_LK.js
+++ b/settings/l10n/si_LK.js
@@ -36,7 +36,6 @@ OC.L10N.register(
"Cancel" : "එපා",
"Language" : "භාෂාව",
"Help translate" : "පරිවර්ථන සහය",
- "Import Root Certificate" : "මූල සහතිකය ආයාත කරන්න",
"Username" : "පරිශීලක නම",
"Create" : "තනන්න",
"Default Quota" : "සාමාන්‍ය සලාකය",
diff --git a/settings/l10n/si_LK.json b/settings/l10n/si_LK.json
index 7fe983cdaf4..17c19d4583f 100644
--- a/settings/l10n/si_LK.json
+++ b/settings/l10n/si_LK.json
@@ -34,7 +34,6 @@
"Cancel" : "එපා",
"Language" : "භාෂාව",
"Help translate" : "පරිවර්ථන සහය",
- "Import Root Certificate" : "මූල සහතිකය ආයාත කරන්න",
"Username" : "පරිශීලක නම",
"Create" : "තනන්න",
"Default Quota" : "සාමාන්‍ය සලාකය",
diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js
index 828a147cbe2..518b7cf9e87 100644
--- a/settings/l10n/sk_SK.js
+++ b/settings/l10n/sk_SK.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Bezpečnosť a nastavenia upozornení",
"Cron" : "Cron",
"Sharing" : "Zdieľanie",
- "Security" : "Zabezpečenie",
"Email Server" : "Email server",
"Log" : "Záznam",
"Authentication error" : "Chyba autentifikácie",
@@ -39,8 +38,6 @@ OC.L10N.register(
"log-level out of allowed range" : "úroveň logovania z povoleného rozpätia",
"Saved" : "Uložené",
"test email settings" : "nastavenia testovacieho emailu",
- "If you received this email, the settings seem to be correct." : "Ak ste dostali tento email, nastavenie je správne.",
- "A problem occurred while sending the email. Please revise your settings." : "Vyskytol sa problém pri odosielaní emailu. Prosím, znovu skontrolujte svoje nastavenia.",
"Email sent" : "Email odoslaný",
"You need to set your user email before being able to send test emails." : "Musíte nastaviť svoj po​​užívateľský email, než budete môcť odoslať testovací email.",
"Invalid mail address" : "Neplatná emailová adresa",
@@ -93,7 +90,6 @@ OC.L10N.register(
"A valid password must be provided" : "Musíte zadať platné heslo",
"A valid email must be provided" : "Musíte zadať platnú emailovú adresu",
"__language_name__" : "Slovensky",
- "Personal Info" : "Osobné informácie",
"SSL root certificates" : "Koreňové SSL certifikáty",
"Encryption" : "Šifrovanie",
"Everything (fatal issues, errors, warnings, info, debug)" : "Všetko (fatálne problémy, chyby, upozornenia, info, debug)",
@@ -199,7 +195,6 @@ OC.L10N.register(
"Current password" : "Aktuálne heslo",
"New password" : "Nové heslo",
"Change password" : "Zmeniť heslo",
- "Full Name" : "Meno a priezvisko",
"No display name set" : "Zobrazované meno nie je nastavené",
"Email" : "Email",
"Your email address" : "Vaša emailová adresa",
@@ -220,7 +215,6 @@ OC.L10N.register(
"Valid until" : "Platný do",
"Issued By" : "Vydal",
"Valid until %s" : "Platný do %s",
- "Import Root Certificate" : "Importovať koreňový certifikát",
"The encryption app is no longer enabled, please decrypt all your files" : "Šifrovacia aplikácia už nie je spustená, dešifrujte všetky svoje súbory.",
"Log-in password" : "Prihlasovacie heslo",
"Decrypt all Files" : "Dešifrovať všetky súbory",
@@ -247,6 +241,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Prosím zadajte kvótu úložného priestoru (napr.: \"512 MB​​\" alebo \"12 GB\")",
"Unlimited" : "Nelimitované",
"Other" : "Iné",
+ "Full Name" : "Meno a priezvisko",
"Group Admin for" : "Administrátor skupiny",
"Quota" : "Kvóta",
"Storage Location" : "Umiestnenie úložiska",
diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json
index 92db8d7b878..1f9db767981 100644
--- a/settings/l10n/sk_SK.json
+++ b/settings/l10n/sk_SK.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Bezpečnosť a nastavenia upozornení",
"Cron" : "Cron",
"Sharing" : "Zdieľanie",
- "Security" : "Zabezpečenie",
"Email Server" : "Email server",
"Log" : "Záznam",
"Authentication error" : "Chyba autentifikácie",
@@ -37,8 +36,6 @@
"log-level out of allowed range" : "úroveň logovania z povoleného rozpätia",
"Saved" : "Uložené",
"test email settings" : "nastavenia testovacieho emailu",
- "If you received this email, the settings seem to be correct." : "Ak ste dostali tento email, nastavenie je správne.",
- "A problem occurred while sending the email. Please revise your settings." : "Vyskytol sa problém pri odosielaní emailu. Prosím, znovu skontrolujte svoje nastavenia.",
"Email sent" : "Email odoslaný",
"You need to set your user email before being able to send test emails." : "Musíte nastaviť svoj po​​užívateľský email, než budete môcť odoslať testovací email.",
"Invalid mail address" : "Neplatná emailová adresa",
@@ -91,7 +88,6 @@
"A valid password must be provided" : "Musíte zadať platné heslo",
"A valid email must be provided" : "Musíte zadať platnú emailovú adresu",
"__language_name__" : "Slovensky",
- "Personal Info" : "Osobné informácie",
"SSL root certificates" : "Koreňové SSL certifikáty",
"Encryption" : "Šifrovanie",
"Everything (fatal issues, errors, warnings, info, debug)" : "Všetko (fatálne problémy, chyby, upozornenia, info, debug)",
@@ -197,7 +193,6 @@
"Current password" : "Aktuálne heslo",
"New password" : "Nové heslo",
"Change password" : "Zmeniť heslo",
- "Full Name" : "Meno a priezvisko",
"No display name set" : "Zobrazované meno nie je nastavené",
"Email" : "Email",
"Your email address" : "Vaša emailová adresa",
@@ -218,7 +213,6 @@
"Valid until" : "Platný do",
"Issued By" : "Vydal",
"Valid until %s" : "Platný do %s",
- "Import Root Certificate" : "Importovať koreňový certifikát",
"The encryption app is no longer enabled, please decrypt all your files" : "Šifrovacia aplikácia už nie je spustená, dešifrujte všetky svoje súbory.",
"Log-in password" : "Prihlasovacie heslo",
"Decrypt all Files" : "Dešifrovať všetky súbory",
@@ -245,6 +239,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Prosím zadajte kvótu úložného priestoru (napr.: \"512 MB​​\" alebo \"12 GB\")",
"Unlimited" : "Nelimitované",
"Other" : "Iné",
+ "Full Name" : "Meno a priezvisko",
"Group Admin for" : "Administrátor skupiny",
"Quota" : "Kvóta",
"Storage Location" : "Umiestnenie úložiska",
diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js
index a08bdc21df7..82ad1f47ac5 100644
--- a/settings/l10n/sl.js
+++ b/settings/l10n/sl.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Varnostna in nastavitvena opozorila",
"Cron" : "Periodično opravilo",
"Sharing" : "Souporaba",
- "Security" : "Varnost",
"Email Server" : "Poštni strežnik",
"Log" : "Dnevnik",
"Authentication error" : "Napaka med overjanjem",
@@ -37,8 +36,6 @@ OC.L10N.register(
"Unable to delete group." : "Ni mogoče izbrisati skupine.",
"Saved" : "Shranjeno",
"test email settings" : "preizkusi nastavitve elektronske pošte",
- "If you received this email, the settings seem to be correct." : "Če ste prejeli to sporočilo, so nastavitve pravilne.",
- "A problem occurred while sending the email. Please revise your settings." : "Prišlo je do napake med pošiljanjem sporočila na elektronski naslov. Spremeniti je treba nastavitve.",
"Email sent" : "Elektronska pošta je poslana",
"You need to set your user email before being able to send test emails." : "Pred preizkusnim pošiljanjem sporočil je treba nastaviti elektronski naslov uporabnika.",
"Invalid mail address" : "Neveljaven elektronski naslov",
@@ -90,7 +87,6 @@ OC.L10N.register(
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
"A valid email must be provided" : "Naveden mora biti veljaven naslov elektronske pošte.",
"__language_name__" : "Slovenščina",
- "Personal Info" : "Osebni podatki",
"SSL root certificates" : "Korenska potrdila SSL",
"Encryption" : "Šifriranje",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)",
@@ -175,7 +171,6 @@ OC.L10N.register(
"Current password" : "Trenutno geslo",
"New password" : "Novo geslo",
"Change password" : "Spremeni geslo",
- "Full Name" : "Polno ime",
"Email" : "Elektronski naslov",
"Your email address" : "Osebni elektronski naslov",
"Profile picture" : "Slika profila",
@@ -192,7 +187,6 @@ OC.L10N.register(
"Valid until" : "Veljavno do",
"Issued By" : "Izdajatelj",
"Valid until %s" : "Veljavno do %s",
- "Import Root Certificate" : "Uvozi korensko potrdilo",
"The encryption app is no longer enabled, please decrypt all your files" : "Program za šifriranje ni več omogočen. Odšifrirati je treba vse datoteke.",
"Log-in password" : "Prijavno geslo",
"Decrypt all Files" : "Odšifriraj vse datoteke",
@@ -215,6 +209,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Vnesite količinsko omejitev prostora (na primer: \"512 MB\" ali \"12 GB\")",
"Unlimited" : "Neomejeno",
"Other" : "Drugo",
+ "Full Name" : "Polno ime",
"Group Admin for" : "Skrbnik skupine za",
"Quota" : "Količinska omejitev",
"Storage Location" : "Mesto shrambe",
diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json
index 75bae7152be..b2ca2c84091 100644
--- a/settings/l10n/sl.json
+++ b/settings/l10n/sl.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Varnostna in nastavitvena opozorila",
"Cron" : "Periodično opravilo",
"Sharing" : "Souporaba",
- "Security" : "Varnost",
"Email Server" : "Poštni strežnik",
"Log" : "Dnevnik",
"Authentication error" : "Napaka med overjanjem",
@@ -35,8 +34,6 @@
"Unable to delete group." : "Ni mogoče izbrisati skupine.",
"Saved" : "Shranjeno",
"test email settings" : "preizkusi nastavitve elektronske pošte",
- "If you received this email, the settings seem to be correct." : "Če ste prejeli to sporočilo, so nastavitve pravilne.",
- "A problem occurred while sending the email. Please revise your settings." : "Prišlo je do napake med pošiljanjem sporočila na elektronski naslov. Spremeniti je treba nastavitve.",
"Email sent" : "Elektronska pošta je poslana",
"You need to set your user email before being able to send test emails." : "Pred preizkusnim pošiljanjem sporočil je treba nastaviti elektronski naslov uporabnika.",
"Invalid mail address" : "Neveljaven elektronski naslov",
@@ -88,7 +85,6 @@
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
"A valid email must be provided" : "Naveden mora biti veljaven naslov elektronske pošte.",
"__language_name__" : "Slovenščina",
- "Personal Info" : "Osebni podatki",
"SSL root certificates" : "Korenska potrdila SSL",
"Encryption" : "Šifriranje",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)",
@@ -173,7 +169,6 @@
"Current password" : "Trenutno geslo",
"New password" : "Novo geslo",
"Change password" : "Spremeni geslo",
- "Full Name" : "Polno ime",
"Email" : "Elektronski naslov",
"Your email address" : "Osebni elektronski naslov",
"Profile picture" : "Slika profila",
@@ -190,7 +185,6 @@
"Valid until" : "Veljavno do",
"Issued By" : "Izdajatelj",
"Valid until %s" : "Veljavno do %s",
- "Import Root Certificate" : "Uvozi korensko potrdilo",
"The encryption app is no longer enabled, please decrypt all your files" : "Program za šifriranje ni več omogočen. Odšifrirati je treba vse datoteke.",
"Log-in password" : "Prijavno geslo",
"Decrypt all Files" : "Odšifriraj vse datoteke",
@@ -213,6 +207,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Vnesite količinsko omejitev prostora (na primer: \"512 MB\" ali \"12 GB\")",
"Unlimited" : "Neomejeno",
"Other" : "Drugo",
+ "Full Name" : "Polno ime",
"Group Admin for" : "Skrbnik skupine za",
"Quota" : "Količinska omejitev",
"Storage Location" : "Mesto shrambe",
diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js
index f779a1685a8..d99f79b1804 100644
--- a/settings/l10n/sq.js
+++ b/settings/l10n/sq.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Paralajmërimet e Sigurisë dhe Konfigurimit",
"Cron" : "Cron",
"Sharing" : "Ndarje",
- "Security" : "Siguria",
"Email Server" : "Serveri Email",
"Log" : "Historik aktiviteti",
"Authentication error" : "Gabim autentifikimi",
@@ -102,7 +101,6 @@ OC.L10N.register(
"Current password" : "Fjalëkalimi aktual",
"New password" : "Fjalëkalimi i ri",
"Change password" : "Ndrysho fjalëkalimin",
- "Full Name" : "Emri i plotë",
"Email" : "Email",
"Your email address" : "Adresa juaj email",
"Profile picture" : "Foto Profili",
@@ -121,6 +119,7 @@ OC.L10N.register(
"Everyone" : "Të gjithë",
"Unlimited" : "E pakufizuar",
"Other" : "Tjetër",
+ "Full Name" : "Emri i plotë",
"Last Login" : "Hyrja e fundit",
"change full name" : "ndrysho emrin e plotë",
"set new password" : "vendos fjalëkalim të ri",
diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json
index c9fe14920a1..600dc646dc0 100644
--- a/settings/l10n/sq.json
+++ b/settings/l10n/sq.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Paralajmërimet e Sigurisë dhe Konfigurimit",
"Cron" : "Cron",
"Sharing" : "Ndarje",
- "Security" : "Siguria",
"Email Server" : "Serveri Email",
"Log" : "Historik aktiviteti",
"Authentication error" : "Gabim autentifikimi",
@@ -100,7 +99,6 @@
"Current password" : "Fjalëkalimi aktual",
"New password" : "Fjalëkalimi i ri",
"Change password" : "Ndrysho fjalëkalimin",
- "Full Name" : "Emri i plotë",
"Email" : "Email",
"Your email address" : "Adresa juaj email",
"Profile picture" : "Foto Profili",
@@ -119,6 +117,7 @@
"Everyone" : "Të gjithë",
"Unlimited" : "E pakufizuar",
"Other" : "Tjetër",
+ "Full Name" : "Emri i plotë",
"Last Login" : "Hyrja e fundit",
"change full name" : "ndrysho emrin e plotë",
"set new password" : "vendos fjalëkalim të ri",
diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js
index 66b19d4b259..f55ac9c7b94 100644
--- a/settings/l10n/sr.js
+++ b/settings/l10n/sr.js
@@ -2,8 +2,8 @@ OC.L10N.register(
"settings",
{
"Security & Setup Warnings" : "Упозорења поставки и безбедности",
+ "Cron" : "Крон",
"Sharing" : "Дељење",
- "Security" : "Безбедност",
"Email Server" : "Сервер е-поште",
"Log" : "Бележење",
"Authentication error" : "Грешка при провери идентитета",
@@ -38,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "ниво бележења је ван дозвољеног опсега",
"Saved" : "Сачувано",
"test email settings" : "тестирајте поставке е-поште",
- "If you received this email, the settings seem to be correct." : "Уколико сте примили ову поруку, подешавања за е-пошту су исправна.",
- "A problem occurred while sending the email. Please revise your settings." : "Проблем приликом слања е-поште. Проверите поставке.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Појавио се проблем приликом слања е-поште. Молимо вас да проверите ваше поставке. (Грешка: %s)",
"Email sent" : "Порука је послата",
"You need to set your user email before being able to send test emails." : "Морате поставити адресу е-поште пре слања тестне поруке.",
"Invalid mail address" : "Неисправна е-адреса",
+ "A user with that name already exists." : "Корисник тог имена већ постоји.",
"Unable to create user." : "Не могу да направим корисника.",
"Your %s account was created" : "Ваш %s налог је направљен",
"Unable to delete user." : "Не могу да обришем корисника.",
@@ -92,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Морате унети исправну лозинку",
"A valid email must be provided" : "Мора бити наведена исправна е-адреса",
"__language_name__" : "Српски",
- "Personal Info" : "Лични подаци",
"SSL root certificates" : "ССЛ корени сертификати",
"Encryption" : "Шифровање",
"Everything (fatal issues, errors, warnings, info, debug)" : "Све (фаталне проблеме, грешке, упозорења, информације, отклањање грешака)",
@@ -102,18 +101,42 @@ OC.L10N.register(
"Fatal issues only" : "Само фатални проблеми",
"None" : "Ништа",
"Login" : "Пријава",
+ "Plain" : "Једноставан",
+ "NT LAN Manager" : "НТ ЛАН менаџер",
+ "SSL" : "SSL",
+ "TLS" : "TLS",
"Read-Only config enabled" : "Подешавања само-за-читање укључена",
+ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Омогућена је Само-читај конфигурација. То спречава постављање неке конфигурације преко веб-интерфејса. Осим тога, фајлу мора бити ручно омогућено уписивање код сваког освежавања.",
"Setup Warning" : "Упозорење о подешавању",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
+ "Database Performance Info" : "Информације о перформансама базе",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite се користи као базе података. За веће инсталације препоручујемо да се пребаците на други модел базе података.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type'" : "За мигрирацију на другу базу података користите командну линију: 'occ db:convert-type'",
+ "Microsoft Windows Platform" : "Мајкрософт Виндоуз платформа",
+ "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер ради под оперативним системом Microsoft Windows. Препоручујемо оперативни систем Linux за оптималaн кориснички доживљај.",
+ "APCu below version 4.0.6 installed" : "Инсталиран АПЦу испод верзије 4.0.6",
+ "APCu below version 4.0.6 is installed, for stability and performance reasons we recommend to update to a newer APCu version." : "Инсталиран је АПЦу испод верзије 4.0.6, за повећање стабилности и перформанси препоручујемо да инсталирате новију АПЦу верзију.",
"Module 'fileinfo' missing" : "Недостаје модул „fileinfo“",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Недостаје ПХП модул „fileinfo“. Препоручујемо вам да га укључите да бисте добили најбоље резултате с откривањем МИМЕ врста.",
"Locale not working" : "Локализација не ради",
"System locale can not be set to a one which supports UTF-8." : "Системски локалитет се не може поставити на неки који подржава УТФ-8",
"This means that there might be problems with certain characters in file names." : "То значи да може доћи до проблема са неким знаковима у називима фајлова.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Препоручујемо да инсталирате потребне пакете да бисте подржали следеће локалитете: %s",
+ "URL generation in notification emails" : "УРЛ генерисање у информативним е-порукама",
+ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталација није инсталирана у основи домена и користи системски крон, може бити проблема са генерисањем веб адреса. Да бисте избегли ове проблеме, молимо вас да подесите \"overwrite.cli.url\" опцију у вашем config.php фајлу у путању веб-основе ваше инсталације (Предложено: \"%s\")",
+ "Cronjob encountered misconfiguration" : "Крон задатак је погрешно подешен",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Није било могуће да се изврши крон задатак путем интерфејса командне линије. Појавила су се следеће техничке грешке:",
"Configuration Checks" : "Провера подешавања",
"No problems found" : "Нема никаквих проблема",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Молимо вас да добро проверите <a href=\"%s\">упутства за инсталацију</a> и проверите да ли постоје било какве грешке или упозорења у <a href=\"#log-section\">дневнику записа</a>.",
+ "Last cron job execution: %s." : "Последњи извршени крон задатак: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последњи извршени крон задатак: %s. Нешто изгледа није у реду.",
+ "Cron was not executed yet!" : "Крон задатак још увек није извршен!",
"Execute one task with each page loaded" : "Изврши један задатак са сваком учитаном страницом",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php је регистрован код вебкрон сервиса за позивање cron.php сваких 15 минута преко протокола http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 15 минута.",
"Allow apps to use the Share API" : "Дозвољава апликацијама да користе АПИ дељења",
"Allow users to share via link" : "Дозволи корисницима да деле путем везе",
"Enforce password protection" : "Захтевај заштиту лозинком",
@@ -155,12 +178,15 @@ OC.L10N.register(
"Documentation:" : "Документација:",
"User Documentation" : "Корисничка документација",
"Admin Documentation" : "Администраторска документација",
+ "Show description …" : "Прикажи опис…",
+ "Hide description …" : "Сакриј опис…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:",
"Update to %s" : "Ажурирај на %s",
"Enable only for specific groups" : "Укључи само за одређене групе",
"Uninstall App" : "Деинсталирај апликацију",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Поздрав,<br><br>само вас обавештавам да сад имате %s налог.<br><br>Ваше корисничко име: %s<br>Приступите му на: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Здраво!",
+ "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Добродошли,\n\nСамо да знате да сада имате %s налог.\n\nВаше корисничко име: %s\nПриступите: %s\n",
"Administrator Documentation" : "Администраторска документација",
"Online Documentation" : "Мрежна документација",
"Forum" : "Форум",
@@ -170,6 +196,7 @@ OC.L10N.register(
"Desktop client" : "Клијент за рачунар",
"Android app" : "Андроид апликација",
"iOS app" : "iOS апликација",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ако желите да подржите пројект\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">придружите се развоју</a>\n\t\tили\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">проширите реч</a>!",
"Show First Run Wizard again" : "Поново прикажи чаробњака за прво покретање",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Искористили сте <strong>%s</strong> од дозвољених <strong>%s</strong>",
"Password" : "Лозинка",
@@ -177,7 +204,6 @@ OC.L10N.register(
"Current password" : "Тренутна лозинка",
"New password" : "Нова лозинка",
"Change password" : "Измени лозинку",
- "Full Name" : "Пуно име",
"No display name set" : "Није постављено име за приказ",
"Email" : "Е-пошта",
"Your email address" : "Ваша адреса е-поште",
@@ -198,13 +224,13 @@ OC.L10N.register(
"Valid until" : "Важи до",
"Issued By" : "Издавач",
"Valid until %s" : "Важи до %s",
- "Import Root Certificate" : "Увоз кореног сертификата",
"The encryption app is no longer enabled, please decrypt all your files" : "Апликација за шифровање више није укључена. Дешифрујте све ваше фајлове",
"Log-in password" : "Лозинка за пријаву",
"Decrypt all Files" : "Дешифруј све фајлове",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Ваши шифрарски кључеви су премештени на резервну локацију. Ако нешто крене наопако, можете их повратити. Избришите их заувек само ако сте сигурни да су сви фајлови исправно дешифровани.",
"Restore Encryption Keys" : "Врати шифрарске кључеве",
"Delete Encryption Keys" : "Обриши шифрарске кључеве",
+ "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Развијено од {communityopen}заједнице сопственогОблака{linkclose}, {githubopen}изворни код{linkclose} је лиценциран под {licenseopen}<abbr title=\"Affero General Public License\">АГПЛ</abbr>{linkclose}.",
"Show storage location" : "Прикажи локацију складишта",
"Show last log in" : "Прикажи последњу пријаву",
"Show user backend" : "Прикажи позадину за кориснике",
@@ -224,6 +250,8 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Унесите квоту складиштења (нпр. 512 MB или 12 GB)",
"Unlimited" : "Неограничено",
"Other" : "Друго",
+ "Full Name" : "Пуно име",
+ "Group Admin for" : "Групни администратор за",
"Quota" : "Квота",
"Storage Location" : "Локација складишта",
"User Backend" : "Позадина за кориснике",
diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json
index 52e0884279c..af698aafdf4 100644
--- a/settings/l10n/sr.json
+++ b/settings/l10n/sr.json
@@ -1,7 +1,7 @@
{ "translations": {
"Security & Setup Warnings" : "Упозорења поставки и безбедности",
+ "Cron" : "Крон",
"Sharing" : "Дељење",
- "Security" : "Безбедност",
"Email Server" : "Сервер е-поште",
"Log" : "Бележење",
"Authentication error" : "Грешка при провери идентитета",
@@ -36,11 +36,11 @@
"log-level out of allowed range" : "ниво бележења је ван дозвољеног опсега",
"Saved" : "Сачувано",
"test email settings" : "тестирајте поставке е-поште",
- "If you received this email, the settings seem to be correct." : "Уколико сте примили ову поруку, подешавања за е-пошту су исправна.",
- "A problem occurred while sending the email. Please revise your settings." : "Проблем приликом слања е-поште. Проверите поставке.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Појавио се проблем приликом слања е-поште. Молимо вас да проверите ваше поставке. (Грешка: %s)",
"Email sent" : "Порука је послата",
"You need to set your user email before being able to send test emails." : "Морате поставити адресу е-поште пре слања тестне поруке.",
"Invalid mail address" : "Неисправна е-адреса",
+ "A user with that name already exists." : "Корисник тог имена већ постоји.",
"Unable to create user." : "Не могу да направим корисника.",
"Your %s account was created" : "Ваш %s налог је направљен",
"Unable to delete user." : "Не могу да обришем корисника.",
@@ -90,7 +90,6 @@
"A valid password must be provided" : "Морате унети исправну лозинку",
"A valid email must be provided" : "Мора бити наведена исправна е-адреса",
"__language_name__" : "Српски",
- "Personal Info" : "Лични подаци",
"SSL root certificates" : "ССЛ корени сертификати",
"Encryption" : "Шифровање",
"Everything (fatal issues, errors, warnings, info, debug)" : "Све (фаталне проблеме, грешке, упозорења, информације, отклањање грешака)",
@@ -100,18 +99,42 @@
"Fatal issues only" : "Само фатални проблеми",
"None" : "Ништа",
"Login" : "Пријава",
+ "Plain" : "Једноставан",
+ "NT LAN Manager" : "НТ ЛАН менаџер",
+ "SSL" : "SSL",
+ "TLS" : "TLS",
"Read-Only config enabled" : "Подешавања само-за-читање укључена",
+ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Омогућена је Само-читај конфигурација. То спречава постављање неке конфигурације преко веб-интерфејса. Осим тога, фајлу мора бити ручно омогућено уписивање код сваког освежавања.",
"Setup Warning" : "Упозорење о подешавању",
+ "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
+ "Database Performance Info" : "Информације о перформансама базе",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite се користи као базе података. За веће инсталације препоручујемо да се пребаците на други модел базе података.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type'" : "За мигрирацију на другу базу података користите командну линију: 'occ db:convert-type'",
+ "Microsoft Windows Platform" : "Мајкрософт Виндоуз платформа",
+ "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер ради под оперативним системом Microsoft Windows. Препоручујемо оперативни систем Linux за оптималaн кориснички доживљај.",
+ "APCu below version 4.0.6 installed" : "Инсталиран АПЦу испод верзије 4.0.6",
+ "APCu below version 4.0.6 is installed, for stability and performance reasons we recommend to update to a newer APCu version." : "Инсталиран је АПЦу испод верзије 4.0.6, за повећање стабилности и перформанси препоручујемо да инсталирате новију АПЦу верзију.",
"Module 'fileinfo' missing" : "Недостаје модул „fileinfo“",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Недостаје ПХП модул „fileinfo“. Препоручујемо вам да га укључите да бисте добили најбоље резултате с откривањем МИМЕ врста.",
"Locale not working" : "Локализација не ради",
"System locale can not be set to a one which supports UTF-8." : "Системски локалитет се не може поставити на неки који подржава УТФ-8",
"This means that there might be problems with certain characters in file names." : "То значи да може доћи до проблема са неким знаковима у називима фајлова.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Препоручујемо да инсталирате потребне пакете да бисте подржали следеће локалитете: %s",
+ "URL generation in notification emails" : "УРЛ генерисање у информативним е-порукама",
+ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталација није инсталирана у основи домена и користи системски крон, може бити проблема са генерисањем веб адреса. Да бисте избегли ове проблеме, молимо вас да подесите \"overwrite.cli.url\" опцију у вашем config.php фајлу у путању веб-основе ваше инсталације (Предложено: \"%s\")",
+ "Cronjob encountered misconfiguration" : "Крон задатак је погрешно подешен",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Није било могуће да се изврши крон задатак путем интерфејса командне линије. Појавила су се следеће техничке грешке:",
"Configuration Checks" : "Провера подешавања",
"No problems found" : "Нема никаквих проблема",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Молимо вас да добро проверите <a href=\"%s\">упутства за инсталацију</a> и проверите да ли постоје било какве грешке или упозорења у <a href=\"#log-section\">дневнику записа</a>.",
+ "Last cron job execution: %s." : "Последњи извршени крон задатак: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последњи извршени крон задатак: %s. Нешто изгледа није у реду.",
+ "Cron was not executed yet!" : "Крон задатак још увек није извршен!",
"Execute one task with each page loaded" : "Изврши један задатак са сваком учитаном страницом",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php је регистрован код вебкрон сервиса за позивање cron.php сваких 15 минута преко протокола http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 15 минута.",
"Allow apps to use the Share API" : "Дозвољава апликацијама да користе АПИ дељења",
"Allow users to share via link" : "Дозволи корисницима да деле путем везе",
"Enforce password protection" : "Захтевај заштиту лозинком",
@@ -153,12 +176,15 @@
"Documentation:" : "Документација:",
"User Documentation" : "Корисничка документација",
"Admin Documentation" : "Администраторска документација",
+ "Show description …" : "Прикажи опис…",
+ "Hide description …" : "Сакриј опис…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:",
"Update to %s" : "Ажурирај на %s",
"Enable only for specific groups" : "Укључи само за одређене групе",
"Uninstall App" : "Деинсталирај апликацију",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Поздрав,<br><br>само вас обавештавам да сад имате %s налог.<br><br>Ваше корисничко име: %s<br>Приступите му на: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Здраво!",
+ "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Добродошли,\n\nСамо да знате да сада имате %s налог.\n\nВаше корисничко име: %s\nПриступите: %s\n",
"Administrator Documentation" : "Администраторска документација",
"Online Documentation" : "Мрежна документација",
"Forum" : "Форум",
@@ -168,6 +194,7 @@
"Desktop client" : "Клијент за рачунар",
"Android app" : "Андроид апликација",
"iOS app" : "iOS апликација",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ако желите да подржите пројект\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">придружите се развоју</a>\n\t\tили\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">проширите реч</a>!",
"Show First Run Wizard again" : "Поново прикажи чаробњака за прво покретање",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Искористили сте <strong>%s</strong> од дозвољених <strong>%s</strong>",
"Password" : "Лозинка",
@@ -175,7 +202,6 @@
"Current password" : "Тренутна лозинка",
"New password" : "Нова лозинка",
"Change password" : "Измени лозинку",
- "Full Name" : "Пуно име",
"No display name set" : "Није постављено име за приказ",
"Email" : "Е-пошта",
"Your email address" : "Ваша адреса е-поште",
@@ -196,13 +222,13 @@
"Valid until" : "Важи до",
"Issued By" : "Издавач",
"Valid until %s" : "Важи до %s",
- "Import Root Certificate" : "Увоз кореног сертификата",
"The encryption app is no longer enabled, please decrypt all your files" : "Апликација за шифровање више није укључена. Дешифрујте све ваше фајлове",
"Log-in password" : "Лозинка за пријаву",
"Decrypt all Files" : "Дешифруј све фајлове",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Ваши шифрарски кључеви су премештени на резервну локацију. Ако нешто крене наопако, можете их повратити. Избришите их заувек само ако сте сигурни да су сви фајлови исправно дешифровани.",
"Restore Encryption Keys" : "Врати шифрарске кључеве",
"Delete Encryption Keys" : "Обриши шифрарске кључеве",
+ "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Развијено од {communityopen}заједнице сопственогОблака{linkclose}, {githubopen}изворни код{linkclose} је лиценциран под {licenseopen}<abbr title=\"Affero General Public License\">АГПЛ</abbr>{linkclose}.",
"Show storage location" : "Прикажи локацију складишта",
"Show last log in" : "Прикажи последњу пријаву",
"Show user backend" : "Прикажи позадину за кориснике",
@@ -222,6 +248,8 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Унесите квоту складиштења (нпр. 512 MB или 12 GB)",
"Unlimited" : "Неограничено",
"Other" : "Друго",
+ "Full Name" : "Пуно име",
+ "Group Admin for" : "Групни администратор за",
"Quota" : "Квота",
"Storage Location" : "Локација складишта",
"User Backend" : "Позадина за кориснике",
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index 49c0f7bc34d..109c38816b1 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Säkerhets & Inställningsvarningar",
"Cron" : "Cron",
"Sharing" : "Dela",
- "Security" : "Säkerhet",
"Email Server" : "E-postserver",
"Log" : "Logg",
"Authentication error" : "Fel vid autentisering",
@@ -38,8 +37,6 @@ OC.L10N.register(
"log-level out of allowed range" : "logg-nivå utanför tillåtet område",
"Saved" : "Sparad",
"test email settings" : "testa e-post inställningar",
- "If you received this email, the settings seem to be correct." : "Om du mottog detta e-postmeddelande, verkar dina inställningar vara korrekta.",
- "A problem occurred while sending the email. Please revise your settings." : "Ett problem uppstod när e-postmeddelandet skickades. Vänligen se över dina inställningar.",
"Email sent" : "E-post skickat",
"You need to set your user email before being able to send test emails." : "Du behöver ställa in din användares e-postadress före du kan skicka test e-post.",
"Invalid mail address" : "Ogiltig e-postadress",
@@ -91,7 +88,6 @@ OC.L10N.register(
"A valid password must be provided" : "Ett giltigt lösenord måste anges",
"A valid email must be provided" : "En giltig e-postadress måste anges",
"__language_name__" : "__language_name__",
- "Personal Info" : "Personlig info",
"SSL root certificates" : "SSL rotcertifikat",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Allting (allvarliga fel, fel, varningar, info, debug)",
@@ -189,7 +185,6 @@ OC.L10N.register(
"Current password" : "Nuvarande lösenord",
"New password" : "Nytt lösenord",
"Change password" : "Ändra lösenord",
- "Full Name" : "Hela namnet",
"No display name set" : "Inget visningsnamn angivet",
"Email" : "E-post",
"Your email address" : "Din e-postadress",
@@ -209,7 +204,6 @@ OC.L10N.register(
"Valid until" : "Giltigt till",
"Issued By" : "Utfärdat av",
"Valid until %s" : "Giltigt till %s",
- "Import Root Certificate" : "Importera rotcertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypteringsapplikationen är inte längre aktiverad, vänligen dekryptera alla dina filer",
"Log-in password" : "Inloggningslösenord",
"Decrypt all Files" : "Dekryptera alla filer",
@@ -235,6 +229,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Var god skriv in lagringskvot (ex: \"512MB\" eller \"12 GB\")",
"Unlimited" : "Obegränsad",
"Other" : "Annat",
+ "Full Name" : "Hela namnet",
"Group Admin for" : "Gruppadministratör för",
"Quota" : "Kvot",
"Storage Location" : "Lagringsplats",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index f26546b2a96..62554b33d91 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Säkerhets & Inställningsvarningar",
"Cron" : "Cron",
"Sharing" : "Dela",
- "Security" : "Säkerhet",
"Email Server" : "E-postserver",
"Log" : "Logg",
"Authentication error" : "Fel vid autentisering",
@@ -36,8 +35,6 @@
"log-level out of allowed range" : "logg-nivå utanför tillåtet område",
"Saved" : "Sparad",
"test email settings" : "testa e-post inställningar",
- "If you received this email, the settings seem to be correct." : "Om du mottog detta e-postmeddelande, verkar dina inställningar vara korrekta.",
- "A problem occurred while sending the email. Please revise your settings." : "Ett problem uppstod när e-postmeddelandet skickades. Vänligen se över dina inställningar.",
"Email sent" : "E-post skickat",
"You need to set your user email before being able to send test emails." : "Du behöver ställa in din användares e-postadress före du kan skicka test e-post.",
"Invalid mail address" : "Ogiltig e-postadress",
@@ -89,7 +86,6 @@
"A valid password must be provided" : "Ett giltigt lösenord måste anges",
"A valid email must be provided" : "En giltig e-postadress måste anges",
"__language_name__" : "__language_name__",
- "Personal Info" : "Personlig info",
"SSL root certificates" : "SSL rotcertifikat",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Allting (allvarliga fel, fel, varningar, info, debug)",
@@ -187,7 +183,6 @@
"Current password" : "Nuvarande lösenord",
"New password" : "Nytt lösenord",
"Change password" : "Ändra lösenord",
- "Full Name" : "Hela namnet",
"No display name set" : "Inget visningsnamn angivet",
"Email" : "E-post",
"Your email address" : "Din e-postadress",
@@ -207,7 +202,6 @@
"Valid until" : "Giltigt till",
"Issued By" : "Utfärdat av",
"Valid until %s" : "Giltigt till %s",
- "Import Root Certificate" : "Importera rotcertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypteringsapplikationen är inte längre aktiverad, vänligen dekryptera alla dina filer",
"Log-in password" : "Inloggningslösenord",
"Decrypt all Files" : "Dekryptera alla filer",
@@ -233,6 +227,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Var god skriv in lagringskvot (ex: \"512MB\" eller \"12 GB\")",
"Unlimited" : "Obegränsad",
"Other" : "Annat",
+ "Full Name" : "Hela namnet",
"Group Admin for" : "Gruppadministratör för",
"Quota" : "Kvot",
"Storage Location" : "Lagringsplats",
diff --git a/settings/l10n/ta_LK.js b/settings/l10n/ta_LK.js
index e567332f917..ae7170a9fa2 100644
--- a/settings/l10n/ta_LK.js
+++ b/settings/l10n/ta_LK.js
@@ -36,7 +36,6 @@ OC.L10N.register(
"Cancel" : "இரத்து செய்க",
"Language" : "மொழி",
"Help translate" : "மொழிபெயர்க்க உதவி",
- "Import Root Certificate" : "வேர் சான்றிதழை இறக்குமதி செய்க",
"Username" : "பயனாளர் பெயர்",
"Create" : "உருவாக்குக",
"Default Quota" : "பொது இருப்பு பங்கு",
diff --git a/settings/l10n/ta_LK.json b/settings/l10n/ta_LK.json
index 8eaf2deeead..eb36984c312 100644
--- a/settings/l10n/ta_LK.json
+++ b/settings/l10n/ta_LK.json
@@ -34,7 +34,6 @@
"Cancel" : "இரத்து செய்க",
"Language" : "மொழி",
"Help translate" : "மொழிபெயர்க்க உதவி",
- "Import Root Certificate" : "வேர் சான்றிதழை இறக்குமதி செய்க",
"Username" : "பயனாளர் பெயர்",
"Create" : "உருவாக்குக",
"Default Quota" : "பொது இருப்பு பங்கு",
diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js
index 3ff3ebb9d30..3d12a42763d 100644
--- a/settings/l10n/th_TH.js
+++ b/settings/l10n/th_TH.js
@@ -59,7 +59,6 @@ OC.L10N.register(
"Cancel" : "ยกเลิก",
"Language" : "ภาษา",
"Help translate" : "ช่วยกันแปล",
- "Import Root Certificate" : "นำเข้าข้อมูลใบรับรองความปลอดภัยจาก Root",
"Username" : "ชื่อผู้ใช้งาน",
"Create" : "สร้าง",
"Default Quota" : "โควต้าที่กำหนดไว้เริ่มต้น",
diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json
index 2c84f41af33..1fc69a0a0f3 100644
--- a/settings/l10n/th_TH.json
+++ b/settings/l10n/th_TH.json
@@ -57,7 +57,6 @@
"Cancel" : "ยกเลิก",
"Language" : "ภาษา",
"Help translate" : "ช่วยกันแปล",
- "Import Root Certificate" : "นำเข้าข้อมูลใบรับรองความปลอดภัยจาก Root",
"Username" : "ชื่อผู้ใช้งาน",
"Create" : "สร้าง",
"Default Quota" : "โควต้าที่กำหนดไว้เริ่มต้น",
diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js
index 0bdcefd9013..c35b39e1715 100644
--- a/settings/l10n/tr.js
+++ b/settings/l10n/tr.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "Güvenlik ve Kurulum Uyarıları",
"Cron" : "Cron",
"Sharing" : "Paylaşım",
- "Security" : "Güvenlik",
"Email Server" : "E-Posta Sunucusu",
"Log" : "Günlük",
"Authentication error" : "Kimlik doğrulama hatası",
@@ -39,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "günlük seviyesi izin verilen aralık dışında",
"Saved" : "Kaydedildi",
"test email settings" : "e-posta ayarlarını sına",
- "If you received this email, the settings seem to be correct." : "Eğer bu e-postayı aldıysanız, ayarlar doğru gibi görünüyor.",
- "A problem occurred while sending the email. Please revise your settings." : "E-posta gönderilirken bir sorun oluştu. Lütfen ayarlarınızı gözden geçirin.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "E-posta gönderilirken bir hata oluştu. Lütfen ayarlarınızı gözden geçirin. (Hata: %s)",
"Email sent" : "E-posta gönderildi",
"You need to set your user email before being able to send test emails." : "Sınama e-postaları göndermeden önce kullanıcı e-postasını ayarlamanız gerekiyor.",
"Invalid mail address" : "Geçersiz posta adresi",
+ "A user with that name already exists." : "Bu isimde bir kullanıcı adı zaten mevcut.",
"Unable to create user." : "Kullanıcı oluşturma başarısız.",
"Your %s account was created" : "%s hesabınız oluşturuldu",
"Unable to delete user." : "Kullanıcı silme başarısız.",
@@ -93,7 +92,6 @@ OC.L10N.register(
"A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı",
"A valid email must be provided" : "Geçerli bir e-posta belirtilmeli",
"__language_name__" : "Türkçe",
- "Personal Info" : "Kişisel Bilgi",
"SSL root certificates" : "SSL kök sertifikaları",
"Encryption" : "Şifreleme",
"Everything (fatal issues, errors, warnings, info, debug)" : "Her şey (Ciddi sorunlar, hatalar, uyarılar, bilgi, hata ayıklama)",
@@ -132,6 +130,7 @@ OC.L10N.register(
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:",
"Configuration Checks" : "Yapılandırma Kontrolleri",
"No problems found" : "Hiç sorun yok",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a Href=\"%s\"> kurulumu </a> kılavuzlarını kontrol çift, ve <a href=\"#log-section\"> günlük </a> herhangi bir hata veya uyarı için kontrol edin.",
"Last cron job execution: %s." : "Son cron çalıştırılma: %s.",
"Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.",
"Cron was not executed yet!" : "Cron henüz çalıştırılmadı!",
@@ -179,6 +178,8 @@ OC.L10N.register(
"Documentation:" : "Belgelendirme:",
"User Documentation" : "Kullanıcı Belgelendirmesi",
"Admin Documentation" : "Yönetici Belgelendirmesi",
+ "Show description …" : "Açıklamayı göster...",
+ "Hide description …" : "Açıklamayı gizle...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Bu uygulama, aşağıdaki bağımlılıklar sağlanmadığından yüklenemiyor:",
"Update to %s" : "%s sürümüne güncelle",
"Enable only for specific groups" : "Sadece belirli gruplar için etkinleştir",
@@ -203,7 +204,6 @@ OC.L10N.register(
"Current password" : "Mevcut parola",
"New password" : "Yeni parola",
"Change password" : "Parola değiştir",
- "Full Name" : "Tam Adı",
"No display name set" : "Ekran adı ayarlanmamış",
"Email" : "E-posta",
"Your email address" : "E-posta adresiniz",
@@ -224,7 +224,6 @@ OC.L10N.register(
"Valid until" : "Geçerlilik",
"Issued By" : "Veren",
"Valid until %s" : "%s tarihine kadar geçerli",
- "Import Root Certificate" : "Kök Sertifikalarını İçe Aktar",
"The encryption app is no longer enabled, please decrypt all your files" : "Şifreleme uygulaması artık etkin değil, lütfen tüm dosyalarınızın şifrelemesini kaldırın",
"Log-in password" : "Oturum açma parolası",
"Decrypt all Files" : "Tüm Dosyaların Şifrelemesini Kaldır",
@@ -251,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Lütfen disk alanı kotasını girin (örnek: \"512MB\" veya \"12GB\")",
"Unlimited" : "Sınırsız",
"Other" : "Diğer",
+ "Full Name" : "Tam Adı",
"Group Admin for" : "Grup Yöneticisi",
"Quota" : "Kota",
"Storage Location" : "Depolama Konumu",
diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json
index f4b3f1d5098..f8900c1d4fd 100644
--- a/settings/l10n/tr.json
+++ b/settings/l10n/tr.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "Güvenlik ve Kurulum Uyarıları",
"Cron" : "Cron",
"Sharing" : "Paylaşım",
- "Security" : "Güvenlik",
"Email Server" : "E-Posta Sunucusu",
"Log" : "Günlük",
"Authentication error" : "Kimlik doğrulama hatası",
@@ -37,11 +36,11 @@
"log-level out of allowed range" : "günlük seviyesi izin verilen aralık dışında",
"Saved" : "Kaydedildi",
"test email settings" : "e-posta ayarlarını sına",
- "If you received this email, the settings seem to be correct." : "Eğer bu e-postayı aldıysanız, ayarlar doğru gibi görünüyor.",
- "A problem occurred while sending the email. Please revise your settings." : "E-posta gönderilirken bir sorun oluştu. Lütfen ayarlarınızı gözden geçirin.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "E-posta gönderilirken bir hata oluştu. Lütfen ayarlarınızı gözden geçirin. (Hata: %s)",
"Email sent" : "E-posta gönderildi",
"You need to set your user email before being able to send test emails." : "Sınama e-postaları göndermeden önce kullanıcı e-postasını ayarlamanız gerekiyor.",
"Invalid mail address" : "Geçersiz posta adresi",
+ "A user with that name already exists." : "Bu isimde bir kullanıcı adı zaten mevcut.",
"Unable to create user." : "Kullanıcı oluşturma başarısız.",
"Your %s account was created" : "%s hesabınız oluşturuldu",
"Unable to delete user." : "Kullanıcı silme başarısız.",
@@ -91,7 +90,6 @@
"A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı",
"A valid email must be provided" : "Geçerli bir e-posta belirtilmeli",
"__language_name__" : "Türkçe",
- "Personal Info" : "Kişisel Bilgi",
"SSL root certificates" : "SSL kök sertifikaları",
"Encryption" : "Şifreleme",
"Everything (fatal issues, errors, warnings, info, debug)" : "Her şey (Ciddi sorunlar, hatalar, uyarılar, bilgi, hata ayıklama)",
@@ -130,6 +128,7 @@
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:",
"Configuration Checks" : "Yapılandırma Kontrolleri",
"No problems found" : "Hiç sorun yok",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a Href=\"%s\"> kurulumu </a> kılavuzlarını kontrol çift, ve <a href=\"#log-section\"> günlük </a> herhangi bir hata veya uyarı için kontrol edin.",
"Last cron job execution: %s." : "Son cron çalıştırılma: %s.",
"Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.",
"Cron was not executed yet!" : "Cron henüz çalıştırılmadı!",
@@ -177,6 +176,8 @@
"Documentation:" : "Belgelendirme:",
"User Documentation" : "Kullanıcı Belgelendirmesi",
"Admin Documentation" : "Yönetici Belgelendirmesi",
+ "Show description …" : "Açıklamayı göster...",
+ "Hide description …" : "Açıklamayı gizle...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Bu uygulama, aşağıdaki bağımlılıklar sağlanmadığından yüklenemiyor:",
"Update to %s" : "%s sürümüne güncelle",
"Enable only for specific groups" : "Sadece belirli gruplar için etkinleştir",
@@ -201,7 +202,6 @@
"Current password" : "Mevcut parola",
"New password" : "Yeni parola",
"Change password" : "Parola değiştir",
- "Full Name" : "Tam Adı",
"No display name set" : "Ekran adı ayarlanmamış",
"Email" : "E-posta",
"Your email address" : "E-posta adresiniz",
@@ -222,7 +222,6 @@
"Valid until" : "Geçerlilik",
"Issued By" : "Veren",
"Valid until %s" : "%s tarihine kadar geçerli",
- "Import Root Certificate" : "Kök Sertifikalarını İçe Aktar",
"The encryption app is no longer enabled, please decrypt all your files" : "Şifreleme uygulaması artık etkin değil, lütfen tüm dosyalarınızın şifrelemesini kaldırın",
"Log-in password" : "Oturum açma parolası",
"Decrypt all Files" : "Tüm Dosyaların Şifrelemesini Kaldır",
@@ -249,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Lütfen disk alanı kotasını girin (örnek: \"512MB\" veya \"12GB\")",
"Unlimited" : "Sınırsız",
"Other" : "Diğer",
+ "Full Name" : "Tam Adı",
"Group Admin for" : "Grup Yöneticisi",
"Quota" : "Kota",
"Storage Location" : "Depolama Konumu",
diff --git a/settings/l10n/ug.js b/settings/l10n/ug.js
index d53f366f993..d27b2f6d5fd 100644
--- a/settings/l10n/ug.js
+++ b/settings/l10n/ug.js
@@ -2,7 +2,6 @@ OC.L10N.register(
"settings",
{
"Sharing" : "ھەمبەھىر",
- "Security" : "بىخەتەرلىك",
"Log" : "خاتىرە",
"Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى",
"Language changed" : "تىل ئۆزگەردى",
diff --git a/settings/l10n/ug.json b/settings/l10n/ug.json
index f7a5913f200..904d1e4dc13 100644
--- a/settings/l10n/ug.json
+++ b/settings/l10n/ug.json
@@ -1,6 +1,5 @@
{ "translations": {
"Sharing" : "ھەمبەھىر",
- "Security" : "بىخەتەرلىك",
"Log" : "خاتىرە",
"Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى",
"Language changed" : "تىل ئۆزگەردى",
diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js
index 535d7e370e0..aeddb6c6acb 100644
--- a/settings/l10n/uk.js
+++ b/settings/l10n/uk.js
@@ -2,11 +2,10 @@ OC.L10N.register(
"settings",
{
"Security & Setup Warnings" : "Попередження Налаштувань та Безпеки",
- "Cron" : "Cron",
+ "Cron" : "Планувальник Cron",
"Sharing" : "Спільний доступ",
- "Security" : "Безпека",
"Email Server" : "Сервер електронної пошти",
- "Log" : "Протокол",
+ "Log" : "Журнал",
"Authentication error" : "Помилка автентифікації",
"Your full name has been changed." : "Ваше ім'я було змінене",
"Unable to change full name" : "Неможливо змінити ім'я",
@@ -28,6 +27,7 @@ OC.L10N.register(
"No user supplied" : "Користувач не знайден",
"Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль адміністратора для відновлення, інакше всі дані будуть втрачені",
"Wrong admin recovery password. Please check the password and try again." : "Неправильний пароль адміністратора для відновлення. Перевірте пароль та спробуйте ще раз.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Використовуваний механізм не підтримує зміну паролів, але користувальницький ключ шифрування був успішно змінено",
"Unable to change password" : "Неможливо змінити пароль",
"Enabled" : "Увімкнено",
"Not enabled" : "Вимкнено",
@@ -38,11 +38,11 @@ OC.L10N.register(
"log-level out of allowed range" : "Перевищений розмір файлу-логу",
"Saved" : "Збереженно",
"test email settings" : "перевірити налаштування електронної пошти",
- "If you received this email, the settings seem to be correct." : "Якщо ви отримали цього листа, налаштування вірні.",
- "A problem occurred while sending the email. Please revise your settings." : "Під час надсилання листа виникли проблеми. Будь ласка перевірте налаштування.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час відправки email сталася помилка. Будь ласка перевірте налаштування. (Помилка:%s)",
"Email sent" : "Ел. пошта надіслана",
"You need to set your user email before being able to send test emails." : "Перед надсиланням тестових повідомлень ви повинні вказати свою електронну адресу.",
"Invalid mail address" : "Неправильна email адреса",
+ "A user with that name already exists." : "Користувач з таким іменем вже існує.",
"Unable to create user." : "Неможливо створити користувача.",
"Your %s account was created" : "Ваш %s аккаунт створений",
"Unable to delete user." : "Неможливо видалити користувача.",
@@ -86,12 +86,12 @@ OC.L10N.register(
"never" : "ніколи",
"deleted {userName}" : "видалено {userName}",
"add group" : "додати групу",
+ "Changing the password will result in data loss, because data recovery is not available for this user" : "Зміна пароля призведе до втрати даних, тому що відновлення даних не доступно для цього користувача",
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"Error creating user" : "Помилка при створенні користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
"A valid email must be provided" : "Вкажіть дійсний e-mail",
"__language_name__" : "__language_name__",
- "Personal Info" : "Особиста інформація",
"SSL root certificates" : "SSL корневі сертифікати",
"Encryption" : "Шифрування",
"Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)",
@@ -111,6 +111,13 @@ OC.L10N.register(
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Схоже, що PHP налаштовано на вичищення блоків вбудованої документації. Це зробить кілька основних додатків недоступними.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Це, ймовірно, обумовлено використанням кеша/прискорювача такого як Zend OPcache або eAccelerator.",
"Database Performance Info" : "Інформація продуктивності баз даних",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо переключитися на інший тип серверу баз даних.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type'" : "Для переходу на іншу базу даних використовуйте команду: 'occ db:convert-type'",
+ "Microsoft Windows Platform" : "Microsoft Windows Platform",
+ "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер працює на ОС Microsoft Windows. Ми настійно рекомендуємо використовувати ОС сімейства Linux для досягнення найкращих умов використання.",
+ "APCu below version 4.0.6 installed" : "Встановлена APCu, версія 4.0.6.",
+ "APCu below version 4.0.6 is installed, for stability and performance reasons we recommend to update to a newer APCu version." : "Встановлена APCu, версія 4.0.6. З метою стабільності ми рекомендуємо оновити на більш нову версію APCu.",
"Module 'fileinfo' missing" : "Модуль 'fileinfo' відсутній",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP модуль 'fileinfo' відсутній. Ми наполегливо рекомендуємо увімкнути цей модуль, щоб отримати кращі результати при виявленні MIME-типів.",
"Locale not working" : "Локалізація не працює",
@@ -119,8 +126,13 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.",
"URL generation in notification emails" : "Генерування URL для повідомлень в електроних листах",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файла config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")",
+ "Cronjob encountered misconfiguration" : "Одне із завдань планувальника має неправильну конфігурацію",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:",
"Configuration Checks" : "Перевірка налаштувань",
"No problems found" : "Проблем не виявленно",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Будь ласка, двічі перевірте <a href=\"%s\"> інструкцію з встановлення </a> та перевірте помилки або попередження в <a href=\"#log-section\"> журналі </a>.",
+ "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
"Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
"Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
@@ -157,13 +169,17 @@ OC.L10N.register(
"Download logfile" : "Завантажити файл журналу",
"More" : "Більше",
"Less" : "Менше",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Журнал-файл - більше 100 МБ. Його скачування може зайняти деякий час!",
"Version" : "Версія",
"More apps" : "Більше додатків",
+ "Developer documentation" : "Документація для розробників",
"by" : "по",
"licensed" : "Ліцензовано",
"Documentation:" : "Документація:",
"User Documentation" : "Документація Користувача",
"Admin Documentation" : "Документація Адміністратора",
+ "Show description …" : "Показати деталі ...",
+ "Hide description …" : "Сховати деталі ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:",
"Update to %s" : "Оновити до %s",
"Enable only for specific groups" : "Включити тільки для конкретних груп",
@@ -180,6 +196,7 @@ OC.L10N.register(
"Desktop client" : "Клієнт для ПК",
"Android app" : "Android-додаток",
"iOS app" : "iOS додаток",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Якщо Ви хочете підтримати проект\n⇥⇥ <a href=\"https://owncloud.org/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\"> спільна розробка </a> \n⇥⇥або\n⇥ ⇥ <a href=\"https://owncloud.org/promote\"\n ⇥⇥⇥target=\"_blank\" rel=\"noreferrer\"> повідомити у світі </a> !",
"Show First Run Wizard again" : "Показувати Майстер Налаштувань знову",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Ви використали <strong>%s</strong> із доступних <strong>%s</strong>",
"Password" : "Пароль",
@@ -187,10 +204,12 @@ OC.L10N.register(
"Current password" : "Поточний пароль",
"New password" : "Новий пароль",
"Change password" : "Змінити пароль",
- "Full Name" : "Повне Ім'я",
+ "No display name set" : "Коротке ім'я не вказано",
"Email" : "Ел.пошта",
"Your email address" : "Ваша адреса електронної пошти",
"Fill in an email address to enable password recovery and receive notifications" : "Введіть адресу електронної пошти, щоб ввімкнути відновлення паролю та отримання повідомлень",
+ "No email address set" : "E-mail не вказано",
+ "You are member of the following groups:" : "Ви є членом наступних груп:",
"Profile picture" : "Зображення облікового запису",
"Upload new" : "Завантажити нове",
"Select new from Files" : "Обрати із завантажених файлів",
@@ -205,13 +224,13 @@ OC.L10N.register(
"Valid until" : "Дійсно до",
"Issued By" : "Виданий",
"Valid until %s" : "Дійсно до %s",
- "Import Root Certificate" : "Імпортувати корневі сертифікати",
"The encryption app is no longer enabled, please decrypt all your files" : "Додаток для шифрування вимкнено, будь ласка, розшифруйте ваші файли",
"Log-in password" : "Пароль входу",
"Decrypt all Files" : "Розшифрувати всі файли",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Ваші ключі шифрування переміщено до теки резервного копіювання. Якщо щось піде не так, ви зможете відновити їх. Видаляйте ключі лише в тому випадку, коли всі файли розшифровані.",
"Restore Encryption Keys" : "Відновити ключі шифрування",
"Delete Encryption Keys" : "Видалити ключі шифрування",
+ "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Розроблено {communityopen} спільнотою ownCloud {linkclose}, {githubopen} вихідний код {linkclose} ліцензується відповідно до {licenseopen} <abbr title = \"Публічної ліцензії Affero General\"> AGPL </ abbr> {linkclose}.",
"Show storage location" : "Показати місцезнаходження сховища",
"Show last log in" : "Показати останній вхід в систему",
"Show user backend" : "Показати користувача",
@@ -231,6 +250,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Будь ласка, вкажіть розмір сховища (наприклад: \"512 MB\" або \"12 GB\")",
"Unlimited" : "Необмежено",
"Other" : "Інше",
+ "Full Name" : "Повне Ім'я",
"Group Admin for" : "Адміністратор групи",
"Quota" : "Квота",
"Storage Location" : "Місцезнаходження сховища",
diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json
index afd8d3c5564..dbacb0a3666 100644
--- a/settings/l10n/uk.json
+++ b/settings/l10n/uk.json
@@ -1,10 +1,9 @@
{ "translations": {
"Security & Setup Warnings" : "Попередження Налаштувань та Безпеки",
- "Cron" : "Cron",
+ "Cron" : "Планувальник Cron",
"Sharing" : "Спільний доступ",
- "Security" : "Безпека",
"Email Server" : "Сервер електронної пошти",
- "Log" : "Протокол",
+ "Log" : "Журнал",
"Authentication error" : "Помилка автентифікації",
"Your full name has been changed." : "Ваше ім'я було змінене",
"Unable to change full name" : "Неможливо змінити ім'я",
@@ -26,6 +25,7 @@
"No user supplied" : "Користувач не знайден",
"Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль адміністратора для відновлення, інакше всі дані будуть втрачені",
"Wrong admin recovery password. Please check the password and try again." : "Неправильний пароль адміністратора для відновлення. Перевірте пароль та спробуйте ще раз.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Використовуваний механізм не підтримує зміну паролів, але користувальницький ключ шифрування був успішно змінено",
"Unable to change password" : "Неможливо змінити пароль",
"Enabled" : "Увімкнено",
"Not enabled" : "Вимкнено",
@@ -36,11 +36,11 @@
"log-level out of allowed range" : "Перевищений розмір файлу-логу",
"Saved" : "Збереженно",
"test email settings" : "перевірити налаштування електронної пошти",
- "If you received this email, the settings seem to be correct." : "Якщо ви отримали цього листа, налаштування вірні.",
- "A problem occurred while sending the email. Please revise your settings." : "Під час надсилання листа виникли проблеми. Будь ласка перевірте налаштування.",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час відправки email сталася помилка. Будь ласка перевірте налаштування. (Помилка:%s)",
"Email sent" : "Ел. пошта надіслана",
"You need to set your user email before being able to send test emails." : "Перед надсиланням тестових повідомлень ви повинні вказати свою електронну адресу.",
"Invalid mail address" : "Неправильна email адреса",
+ "A user with that name already exists." : "Користувач з таким іменем вже існує.",
"Unable to create user." : "Неможливо створити користувача.",
"Your %s account was created" : "Ваш %s аккаунт створений",
"Unable to delete user." : "Неможливо видалити користувача.",
@@ -84,12 +84,12 @@
"never" : "ніколи",
"deleted {userName}" : "видалено {userName}",
"add group" : "додати групу",
+ "Changing the password will result in data loss, because data recovery is not available for this user" : "Зміна пароля призведе до втрати даних, тому що відновлення даних не доступно для цього користувача",
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"Error creating user" : "Помилка при створенні користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
"A valid email must be provided" : "Вкажіть дійсний e-mail",
"__language_name__" : "__language_name__",
- "Personal Info" : "Особиста інформація",
"SSL root certificates" : "SSL корневі сертифікати",
"Encryption" : "Шифрування",
"Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)",
@@ -109,6 +109,13 @@
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Схоже, що PHP налаштовано на вичищення блоків вбудованої документації. Це зробить кілька основних додатків недоступними.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Це, ймовірно, обумовлено використанням кеша/прискорювача такого як Zend OPcache або eAccelerator.",
"Database Performance Info" : "Інформація продуктивності баз даних",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо переключитися на інший тип серверу баз даних.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type'" : "Для переходу на іншу базу даних використовуйте команду: 'occ db:convert-type'",
+ "Microsoft Windows Platform" : "Microsoft Windows Platform",
+ "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер працює на ОС Microsoft Windows. Ми настійно рекомендуємо використовувати ОС сімейства Linux для досягнення найкращих умов використання.",
+ "APCu below version 4.0.6 installed" : "Встановлена APCu, версія 4.0.6.",
+ "APCu below version 4.0.6 is installed, for stability and performance reasons we recommend to update to a newer APCu version." : "Встановлена APCu, версія 4.0.6. З метою стабільності ми рекомендуємо оновити на більш нову версію APCu.",
"Module 'fileinfo' missing" : "Модуль 'fileinfo' відсутній",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP модуль 'fileinfo' відсутній. Ми наполегливо рекомендуємо увімкнути цей модуль, щоб отримати кращі результати при виявленні MIME-типів.",
"Locale not working" : "Локалізація не працює",
@@ -117,8 +124,13 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.",
"URL generation in notification emails" : "Генерування URL для повідомлень в електроних листах",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файла config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")",
+ "Cronjob encountered misconfiguration" : "Одне із завдань планувальника має неправильну конфігурацію",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:",
"Configuration Checks" : "Перевірка налаштувань",
"No problems found" : "Проблем не виявленно",
+ "Please double check the <a href=\"%s\">installation guides</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Будь ласка, двічі перевірте <a href=\"%s\"> інструкцію з встановлення </a> та перевірте помилки або попередження в <a href=\"#log-section\"> журналі </a>.",
+ "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
"Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
"Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
@@ -155,13 +167,17 @@
"Download logfile" : "Завантажити файл журналу",
"More" : "Більше",
"Less" : "Менше",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Журнал-файл - більше 100 МБ. Його скачування може зайняти деякий час!",
"Version" : "Версія",
"More apps" : "Більше додатків",
+ "Developer documentation" : "Документація для розробників",
"by" : "по",
"licensed" : "Ліцензовано",
"Documentation:" : "Документація:",
"User Documentation" : "Документація Користувача",
"Admin Documentation" : "Документація Адміністратора",
+ "Show description …" : "Показати деталі ...",
+ "Hide description …" : "Сховати деталі ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:",
"Update to %s" : "Оновити до %s",
"Enable only for specific groups" : "Включити тільки для конкретних груп",
@@ -178,6 +194,7 @@
"Desktop client" : "Клієнт для ПК",
"Android app" : "Android-додаток",
"iOS app" : "iOS додаток",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Якщо Ви хочете підтримати проект\n⇥⇥ <a href=\"https://owncloud.org/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\"> спільна розробка </a> \n⇥⇥або\n⇥ ⇥ <a href=\"https://owncloud.org/promote\"\n ⇥⇥⇥target=\"_blank\" rel=\"noreferrer\"> повідомити у світі </a> !",
"Show First Run Wizard again" : "Показувати Майстер Налаштувань знову",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Ви використали <strong>%s</strong> із доступних <strong>%s</strong>",
"Password" : "Пароль",
@@ -185,10 +202,12 @@
"Current password" : "Поточний пароль",
"New password" : "Новий пароль",
"Change password" : "Змінити пароль",
- "Full Name" : "Повне Ім'я",
+ "No display name set" : "Коротке ім'я не вказано",
"Email" : "Ел.пошта",
"Your email address" : "Ваша адреса електронної пошти",
"Fill in an email address to enable password recovery and receive notifications" : "Введіть адресу електронної пошти, щоб ввімкнути відновлення паролю та отримання повідомлень",
+ "No email address set" : "E-mail не вказано",
+ "You are member of the following groups:" : "Ви є членом наступних груп:",
"Profile picture" : "Зображення облікового запису",
"Upload new" : "Завантажити нове",
"Select new from Files" : "Обрати із завантажених файлів",
@@ -203,13 +222,13 @@
"Valid until" : "Дійсно до",
"Issued By" : "Виданий",
"Valid until %s" : "Дійсно до %s",
- "Import Root Certificate" : "Імпортувати корневі сертифікати",
"The encryption app is no longer enabled, please decrypt all your files" : "Додаток для шифрування вимкнено, будь ласка, розшифруйте ваші файли",
"Log-in password" : "Пароль входу",
"Decrypt all Files" : "Розшифрувати всі файли",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Ваші ключі шифрування переміщено до теки резервного копіювання. Якщо щось піде не так, ви зможете відновити їх. Видаляйте ключі лише в тому випадку, коли всі файли розшифровані.",
"Restore Encryption Keys" : "Відновити ключі шифрування",
"Delete Encryption Keys" : "Видалити ключі шифрування",
+ "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Розроблено {communityopen} спільнотою ownCloud {linkclose}, {githubopen} вихідний код {linkclose} ліцензується відповідно до {licenseopen} <abbr title = \"Публічної ліцензії Affero General\"> AGPL </ abbr> {linkclose}.",
"Show storage location" : "Показати місцезнаходження сховища",
"Show last log in" : "Показати останній вхід в систему",
"Show user backend" : "Показати користувача",
@@ -229,6 +248,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Будь ласка, вкажіть розмір сховища (наприклад: \"512 MB\" або \"12 GB\")",
"Unlimited" : "Необмежено",
"Other" : "Інше",
+ "Full Name" : "Повне Ім'я",
"Group Admin for" : "Адміністратор групи",
"Quota" : "Квота",
"Storage Location" : "Місцезнаходження сховища",
diff --git a/settings/l10n/vi.js b/settings/l10n/vi.js
index 525b1a37749..31f56913f88 100644
--- a/settings/l10n/vi.js
+++ b/settings/l10n/vi.js
@@ -57,7 +57,6 @@ OC.L10N.register(
"Current password" : "Mật khẩu cũ",
"New password" : "Mật khẩu mới",
"Change password" : "Đổi mật khẩu",
- "Full Name" : "Họ và tên",
"Email" : "Email",
"Your email address" : "Email của bạn",
"Upload new" : "Tải lên",
@@ -66,13 +65,13 @@ OC.L10N.register(
"Choose as profile image" : "Chọn hình ảnh như hồ sơ cá nhân",
"Language" : "Ngôn ngữ",
"Help translate" : "Hỗ trợ dịch thuật",
- "Import Root Certificate" : "Nhập Root Certificate",
"Username" : "Tên đăng nhập",
"Create" : "Tạo",
"Group" : "N",
"Default Quota" : "Hạn ngạch mặt định",
"Unlimited" : "Không giới hạn",
"Other" : "Khác",
+ "Full Name" : "Họ và tên",
"Quota" : "Hạn ngạch",
"change full name" : "Đổi họ và t",
"set new password" : "đặt mật khẩu mới",
diff --git a/settings/l10n/vi.json b/settings/l10n/vi.json
index fd6046f0930..63966eeb31d 100644
--- a/settings/l10n/vi.json
+++ b/settings/l10n/vi.json
@@ -55,7 +55,6 @@
"Current password" : "Mật khẩu cũ",
"New password" : "Mật khẩu mới",
"Change password" : "Đổi mật khẩu",
- "Full Name" : "Họ và tên",
"Email" : "Email",
"Your email address" : "Email của bạn",
"Upload new" : "Tải lên",
@@ -64,13 +63,13 @@
"Choose as profile image" : "Chọn hình ảnh như hồ sơ cá nhân",
"Language" : "Ngôn ngữ",
"Help translate" : "Hỗ trợ dịch thuật",
- "Import Root Certificate" : "Nhập Root Certificate",
"Username" : "Tên đăng nhập",
"Create" : "Tạo",
"Group" : "N",
"Default Quota" : "Hạn ngạch mặt định",
"Unlimited" : "Không giới hạn",
"Other" : "Khác",
+ "Full Name" : "Họ và tên",
"Quota" : "Hạn ngạch",
"change full name" : "Đổi họ và t",
"set new password" : "đặt mật khẩu mới",
diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js
index 33c8de9a860..95841efaf84 100644
--- a/settings/l10n/zh_CN.js
+++ b/settings/l10n/zh_CN.js
@@ -3,7 +3,6 @@ OC.L10N.register(
{
"Cron" : "计划任务",
"Sharing" : "共享",
- "Security" : "安全",
"Email Server" : "电子邮件服务器",
"Log" : "日志",
"Authentication error" : "认证错误",
@@ -31,7 +30,6 @@ OC.L10N.register(
"Enabled" : "开启",
"Saved" : "已保存",
"test email settings" : "测试电子邮件设置",
- "If you received this email, the settings seem to be correct." : "如果您收到了这封邮件,看起来设置没有问题。",
"Email sent" : "邮件已发送",
"You need to set your user email before being able to send test emails." : "在发送测试邮件前您需要设置您的用户电子邮件。",
"Email saved" : "电子邮件已保存",
@@ -153,7 +151,6 @@ OC.L10N.register(
"Current password" : "当前密码",
"New password" : "新密码",
"Change password" : "修改密码",
- "Full Name" : "全名",
"Email" : "电子邮件",
"Your email address" : "您的电子邮件",
"Fill in an email address to enable password recovery and receive notifications" : "填入电子邮件地址从而启用密码恢复和接收通知",
@@ -171,7 +168,6 @@ OC.L10N.register(
"Valid until" : "有效期至",
"Issued By" : "授权由",
"Valid until %s" : "有效期至 %s",
- "Import Root Certificate" : "导入根证书",
"The encryption app is no longer enabled, please decrypt all your files" : "加密 app 不再被启用,请解密您所有的文件",
"Log-in password" : "登录密码",
"Decrypt all Files" : "解密所有文件",
@@ -192,6 +188,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "请输入存储限额 (ex: \"512 MB\" or \"12 GB\")",
"Unlimited" : "无限",
"Other" : "其它",
+ "Full Name" : "全名",
"Quota" : "配额",
"Storage Location" : "存储空间位置",
"Last Login" : "最后登录",
diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json
index 42ae73d7baa..c3d70e0ab57 100644
--- a/settings/l10n/zh_CN.json
+++ b/settings/l10n/zh_CN.json
@@ -1,7 +1,6 @@
{ "translations": {
"Cron" : "计划任务",
"Sharing" : "共享",
- "Security" : "安全",
"Email Server" : "电子邮件服务器",
"Log" : "日志",
"Authentication error" : "认证错误",
@@ -29,7 +28,6 @@
"Enabled" : "开启",
"Saved" : "已保存",
"test email settings" : "测试电子邮件设置",
- "If you received this email, the settings seem to be correct." : "如果您收到了这封邮件,看起来设置没有问题。",
"Email sent" : "邮件已发送",
"You need to set your user email before being able to send test emails." : "在发送测试邮件前您需要设置您的用户电子邮件。",
"Email saved" : "电子邮件已保存",
@@ -151,7 +149,6 @@
"Current password" : "当前密码",
"New password" : "新密码",
"Change password" : "修改密码",
- "Full Name" : "全名",
"Email" : "电子邮件",
"Your email address" : "您的电子邮件",
"Fill in an email address to enable password recovery and receive notifications" : "填入电子邮件地址从而启用密码恢复和接收通知",
@@ -169,7 +166,6 @@
"Valid until" : "有效期至",
"Issued By" : "授权由",
"Valid until %s" : "有效期至 %s",
- "Import Root Certificate" : "导入根证书",
"The encryption app is no longer enabled, please decrypt all your files" : "加密 app 不再被启用,请解密您所有的文件",
"Log-in password" : "登录密码",
"Decrypt all Files" : "解密所有文件",
@@ -190,6 +186,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "请输入存储限额 (ex: \"512 MB\" or \"12 GB\")",
"Unlimited" : "无限",
"Other" : "其它",
+ "Full Name" : "全名",
"Quota" : "配额",
"Storage Location" : "存储空间位置",
"Last Login" : "最后登录",
diff --git a/settings/l10n/zh_HK.js b/settings/l10n/zh_HK.js
index 4130c6c2b1f..97fc876af07 100644
--- a/settings/l10n/zh_HK.js
+++ b/settings/l10n/zh_HK.js
@@ -2,7 +2,6 @@ OC.L10N.register(
"settings",
{
"Sharing" : "分享",
- "Security" : "安全",
"Email Server" : "電子郵件伺服器",
"Log" : "日誌",
"Wrong password" : "密碼錯誤",
diff --git a/settings/l10n/zh_HK.json b/settings/l10n/zh_HK.json
index bf05f9394a9..222a82d9684 100644
--- a/settings/l10n/zh_HK.json
+++ b/settings/l10n/zh_HK.json
@@ -1,6 +1,5 @@
{ "translations": {
"Sharing" : "分享",
- "Security" : "安全",
"Email Server" : "電子郵件伺服器",
"Log" : "日誌",
"Wrong password" : "密碼錯誤",
diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js
index ef215fcce30..4465012f9ac 100644
--- a/settings/l10n/zh_TW.js
+++ b/settings/l10n/zh_TW.js
@@ -4,7 +4,6 @@ OC.L10N.register(
"Security & Setup Warnings" : "安全及警告設定",
"Cron" : "工作排程",
"Sharing" : "分享",
- "Security" : "安全性",
"Email Server" : "郵件伺服器",
"Log" : "紀錄",
"Authentication error" : "認證錯誤",
@@ -33,7 +32,6 @@ OC.L10N.register(
"Group already exists." : "群組已存在",
"Saved" : "已儲存",
"test email settings" : "測試郵件設定",
- "If you received this email, the settings seem to be correct." : "假如您收到這個郵件,此設定看起來是正確的。",
"Email sent" : "Email 已寄出",
"You need to set your user email before being able to send test emails." : "在準備要寄出測試郵件時您需要設定您的使用者郵件。",
"Email saved" : "Email已儲存",
@@ -125,7 +123,6 @@ OC.L10N.register(
"Current password" : "目前密碼",
"New password" : "新密碼",
"Change password" : "變更密碼",
- "Full Name" : "全名",
"Email" : "信箱",
"Your email address" : "您的電子郵件信箱",
"Fill in an email address to enable password recovery and receive notifications" : "填入電子郵件地址來啟用忘記密碼和接收通知的功能",
@@ -139,7 +136,6 @@ OC.L10N.register(
"Choose as profile image" : "設定為大頭貼",
"Language" : "語言",
"Help translate" : "幫助翻譯",
- "Import Root Certificate" : "匯入根憑證",
"The encryption app is no longer enabled, please decrypt all your files" : "加密的軟體不能長時間啟用,請解密所有您的檔案",
"Log-in password" : "登入密碼",
"Decrypt all Files" : "解密所有檔案",
@@ -152,6 +148,7 @@ OC.L10N.register(
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "請輸入空間配額(例如: \"512 MB\"或是 \"12 GB\")",
"Unlimited" : "無限制",
"Other" : "其他",
+ "Full Name" : "全名",
"Quota" : "容量限制",
"change full name" : "變更全名",
"set new password" : "設定新密碼",
diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json
index 43dbd4f6b63..db3a8716347 100644
--- a/settings/l10n/zh_TW.json
+++ b/settings/l10n/zh_TW.json
@@ -2,7 +2,6 @@
"Security & Setup Warnings" : "安全及警告設定",
"Cron" : "工作排程",
"Sharing" : "分享",
- "Security" : "安全性",
"Email Server" : "郵件伺服器",
"Log" : "紀錄",
"Authentication error" : "認證錯誤",
@@ -31,7 +30,6 @@
"Group already exists." : "群組已存在",
"Saved" : "已儲存",
"test email settings" : "測試郵件設定",
- "If you received this email, the settings seem to be correct." : "假如您收到這個郵件,此設定看起來是正確的。",
"Email sent" : "Email 已寄出",
"You need to set your user email before being able to send test emails." : "在準備要寄出測試郵件時您需要設定您的使用者郵件。",
"Email saved" : "Email已儲存",
@@ -123,7 +121,6 @@
"Current password" : "目前密碼",
"New password" : "新密碼",
"Change password" : "變更密碼",
- "Full Name" : "全名",
"Email" : "信箱",
"Your email address" : "您的電子郵件信箱",
"Fill in an email address to enable password recovery and receive notifications" : "填入電子郵件地址來啟用忘記密碼和接收通知的功能",
@@ -137,7 +134,6 @@
"Choose as profile image" : "設定為大頭貼",
"Language" : "語言",
"Help translate" : "幫助翻譯",
- "Import Root Certificate" : "匯入根憑證",
"The encryption app is no longer enabled, please decrypt all your files" : "加密的軟體不能長時間啟用,請解密所有您的檔案",
"Log-in password" : "登入密碼",
"Decrypt all Files" : "解密所有檔案",
@@ -150,6 +146,7 @@
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "請輸入空間配額(例如: \"512 MB\"或是 \"12 GB\")",
"Unlimited" : "無限制",
"Other" : "其他",
+ "Full Name" : "全名",
"Quota" : "容量限制",
"change full name" : "變更全名",
"set new password" : "設定新密碼",
diff --git a/settings/personal.php b/settings/personal.php
index 7239df365f5..1249fb8a40f 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -108,8 +108,9 @@ $tmpl->assign('groups', $groups2);
// add hardcoded forms from the template
$l = OC_L10N::get('settings');
-$formsAndMore = array();
-$formsAndMore[]= array( 'anchor' => 'passwordform', 'section-name' => $l->t('Personal Info') );
+$formsAndMore = [];
+$formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')];
+$formsAndMore[]= ['anchor' => 'passwordform', 'section-name' => $l->t('Personal info')];
$forms=OC_App::getForms('personal');
diff --git a/settings/templates/admin.php b/settings/templates/admin.php
index 23c3a36e28c..e24b51368dd 100644
--- a/settings/templates/admin.php
+++ b/settings/templates/admin.php
@@ -111,7 +111,7 @@ if ($_['databaseOverload']) {
</strong>
</p>
<p>
- <?php p($l->t('To migrate to another database use the command line tool: \'occ db:convert-type\'')); ?>
+ <?php print_unescaped($l->t('To migrate to another database use the command line tool: \'occ db:convert-type\', or see the <a target="_blank" href="%s">documentation ↗</a>.', link_to_docs('admin-db-conversion') )); ?>
</p>
</div>
@@ -228,7 +228,7 @@ if ($_['cronErrors']) {
<ul class="errors hidden"></ul>
<div class="hint hidden">
<span class="setupwarning"><?php
- print_unescaped($l->t('Please double check the <a href="%s">installation guides</a>, and check for any errors or warnings in the <a href="#log-section">log</a>.', \OC_Helper::linkToDocs('admin-install')));
+ print_unescaped($l->t('Please double check the <a target="_blank" href="%s">installation guides ↗</a>, and check for any errors or warnings in the <a href="#log-section">log</a>.', link_to_docs('admin-install')));
?></span>
</div>
</div>
@@ -491,6 +491,17 @@ if ($_['cronErrors']) {
<?php endif; ?>
</div>
+<div class="section" id="admin-tips">
+ <h2><?php p($l->t('Tips & tricks'));?></h2>
+ <ul>
+ <li><a target="_blank" href="<?php p(link_to_docs('admin-backup')); ?>"><?php p($l->t('How to do backups'));?> ↗</a></li>
+ <li><a target="_blank" href="<?php p(link_to_docs('admin-monitoring')); ?>"><?php p($l->t('Advanced monitoring'));?> ↗</a></li>
+ <li><a target="_blank" href="<?php p(link_to_docs('admin-performance')); ?>"><?php p($l->t('Performance tuning'));?> ↗</a></li>
+ <li><a target="_blank" href="<?php p(link_to_docs('admin-config')); ?>"><?php p($l->t('Improving the config.php'));?> ↗</a></li>
+ <li><a target="_blank" href="<?php p(link_to_docs('developer-theming')); ?>"><?php p($l->t('Theming'));?> ↗</a></li>
+ </ul>
+</div>
+
<div class="section">
<h2><?php p($l->t('Version'));?></h2>
<strong><?php p($theme->getTitle()); ?></strong> <?php p(OC_Util::getHumanVersion()) ?>
diff --git a/settings/templates/apps.php b/settings/templates/apps.php
index e749b33027a..1d059d4f77f 100644
--- a/settings/templates/apps.php
+++ b/settings/templates/apps.php
@@ -33,24 +33,30 @@
<div class="{{internalclass}} icon-checkmark">{{internallabel}}</div>
{{/if}}
<div class="app-detailpage"></div>
- <div class="app-description"><pre>{{description}}</pre></div>
- <!--<div class="app-changed">{{changed}}</div>-->
- {{#if documentation}}
- <p class="documentation">
- <?php p($l->t("Documentation:"));?>
- {{#if documentation.user}}
- <span class="userDocumentation appslink">
- <a id='userDocumentation' href='{{documentation.user}}' target="_blank"><?php p($l->t("User Documentation"));?></a>
- </span>
- {{/if}}
- {{#if documentation.admin}}
- <span class="adminDocumentation appslink">
- <a id='adminDocumentation' href='{{documentation.admin}}' target="_blank"><?php p($l->t("Admin Documentation"));?></a>
- </span>
+ <div class="app-description-container hidden">
+ <div class="app-description"><pre>{{description}}</pre></div>
+ <!--<div class="app-changed">{{changed}}</div>-->
+ {{#if documentation}}
+ <p class="documentation">
+ <?php p($l->t("Documentation:"));?>
+ {{#if documentation.user}}
+ <span class="userDocumentation appslink">
+ <a id='userDocumentation' href='{{documentation.user}}' target="_blank"><?php p($l->t("User Documentation"));?></a>
+ </span>
+ {{/if}}
+
+ {{#if documentation.admin}}
+ <span class="adminDocumentation appslink">
+ <a id='adminDocumentation' href='{{documentation.admin}}' target="_blank"><?php p($l->t("Admin Documentation"));?></a>
+ </span>
+ {{/if}}
+ </p>
{{/if}}
- </p>
- {{/if}}
+ </div><!-- end app-description-container -->
+ <div class="app-description-toggle-show"><?php p($l->t("Show description …"));?></div>
+ <div class="app-description-toggle-hide hidden"><?php p($l->t("Hide description …"));?></div>
+
{{#unless canInstall}}
<div class="app-dependencies">
<p><?php p($l->t('This app cannot be installed because the following dependencies are not fulfilled:')); ?></p>
@@ -90,4 +96,8 @@
</div>
<div id="app-content">
<div id="apps-list" class="icon-loading"></div>
+ <div id="apps-list-empty" class="hidden emptycontent">
+ <div class="icon-search"></div>
+ <h2><?php p($l->t('No apps found for your version')) ?></h2>
+ </div>
</div>
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index cb153447b96..1d5bf1fc54f 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -21,7 +21,7 @@
<div id="app-content">
-<div class="clientsbox center">
+<div id="clientsbox" class="clientsbox center">
<h2><?php p($l->t('Get the apps to sync your files'));?></h2>
<a href="<?php p($_['clients']['desktop']); ?>" target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('core', 'desktopapp.png')); ?>"
@@ -94,7 +94,7 @@ if($_['displayNameChangeSupported']) {
?>
<form id="displaynameform" class="section">
<h2>
- <label for="displayName"><?php echo $l->t('Full Name');?></label>
+ <label for="displayName"><?php echo $l->t('Full name');?></label>
</h2>
<input type="text" id="displayName" name="displayName"
value="<?php p($_['displayName'])?>"
@@ -106,7 +106,7 @@ if($_['displayNameChangeSupported']) {
} else {
?>
<div class="section">
- <h2><?php echo $l->t('Full Name');?></h2>
+ <h2><?php echo $l->t('Full name');?></h2>
<span><?php if(isset($_['displayName'][0])) { p($_['displayName']); } else { p($l->t('No display name set')); } ?></span>
</div>
<?php
@@ -236,7 +236,7 @@ if($_['passwordChangeSupported']) {
</table>
<form class="uploadButton" method="post" action="<?php p(\OC_Helper::linkToRoute('settings_cert_post')); ?>" target="certUploadFrame">
<input type="file" id="rootcert_import" name="rootcert_import" class="hidden">
- <input type="button" id="rootcert_import_button" value="<?php p($l->t('Import Root Certificate')); ?>"/>
+ <input type="button" id="rootcert_import_button" value="<?php p($l->t('Import root certificate')); ?>"/>
</form>
</div>
diff --git a/tests/karma.config.js b/tests/karma.config.js
index e5febb15aaa..997da4bcb26 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -64,7 +64,8 @@ module.exports = function(config) {
// only test these files, others are not ready and mess
// up with the global namespace/classes/state
'apps/files_external/js/app.js',
- 'apps/files_external/js/mountsfilelist.js'
+ 'apps/files_external/js/mountsfilelist.js',
+ 'apps/files_external/js/settings.js'
],
testFiles: ['apps/files_external/tests/js/*.js']
},
diff --git a/tests/lib/appframework/db/mappertest.php b/tests/lib/appframework/db/mappertest.php
index 8e585c479bb..c8b999ad62c 100644
--- a/tests/lib/appframework/db/mappertest.php
+++ b/tests/lib/appframework/db/mappertest.php
@@ -47,6 +47,7 @@ class ExampleMapper extends Mapper {
public function findOneEntity($table, $id){ return $this->findEntity($table, $id); }
public function findAllEntities($table){ return $this->findEntities($table); }
public function mapRow($row){ return $this->mapRowToEntity($row); }
+ public function execSql($sql, $params){ return $this->execute($sql, $params); }
}
@@ -187,6 +188,15 @@ class MapperTest extends MapperTestUtility {
}
+ public function testAssocParameters() {
+ $sql = 'test';
+ $params = [':test' => 1, ':a' => 2];
+
+ $this->setMapperResult($sql, $params);
+ $this->mapper->execSql($sql, $params);
+ }
+
+
public function testUpdate(){
$sql = 'UPDATE `*PREFIX*table` ' .
'SET ' .
diff --git a/tests/lib/appframework/db/mappertestutility.php b/tests/lib/appframework/db/mappertestutility.php
index c87ad528c03..818e4a59b21 100644
--- a/tests/lib/appframework/db/mappertestutility.php
+++ b/tests/lib/appframework/db/mappertestutility.php
@@ -56,7 +56,30 @@ abstract class MapperTestUtility extends \Test\TestCase {
$this->fetchAt = 0;
}
+ /**
+ * Checks if an array is associative
+ * @param array $array
+ * @return bool true if associative
+ */
+ private function isAssocArray(array $array) {
+ return array_values($array) !== $array;
+ }
+ /**
+ * Returns the correct PDO constant based on the value type
+ * @param $value
+ * @return PDO constant
+ */
+ private function getPDOType($value) {
+ switch (gettype($value)) {
+ case 'integer':
+ return \PDO::PARAM_INT;
+ case 'boolean':
+ return \PDO::PARAM_BOOL;
+ default:
+ return \PDO::PARAM_STR;
+ }
+ }
/**
* Create mocks and set expected results for database queries
@@ -117,32 +140,28 @@ abstract class MapperTestUtility extends \Test\TestCase {
}
));
- $index = 1;
- foreach($arguments as $argument) {
- switch (gettype($argument)) {
- case 'integer':
- $pdoConstant = \PDO::PARAM_INT;
- break;
-
- case 'NULL':
- $pdoConstant = \PDO::PARAM_NULL;
- break;
-
- case 'boolean':
- $pdoConstant = \PDO::PARAM_BOOL;
- break;
-
- default:
- $pdoConstant = \PDO::PARAM_STR;
- break;
+ if ($this->isAssocArray($arguments)) {
+ foreach($arguments as $key => $argument) {
+ $pdoConstant = $this->getPDOType($argument);
+ $this->query->expects($this->at($this->queryAt))
+ ->method('bindValue')
+ ->with($this->equalTo($key),
+ $this->equalTo($argument),
+ $this->equalTo($pdoConstant));
+ $this->queryAt++;
+ }
+ } else {
+ $index = 1;
+ foreach($arguments as $argument) {
+ $pdoConstant = $this->getPDOType($argument);
+ $this->query->expects($this->at($this->queryAt))
+ ->method('bindValue')
+ ->with($this->equalTo($index),
+ $this->equalTo($argument),
+ $this->equalTo($pdoConstant));
+ $index++;
+ $this->queryAt++;
}
- $this->query->expects($this->at($this->queryAt))
- ->method('bindValue')
- ->with($this->equalTo($index),
- $this->equalTo($argument),
- $this->equalTo($pdoConstant));
- $index++;
- $this->queryAt++;
}
$this->query->expects($this->at($this->queryAt))
diff --git a/tests/lib/cache/fileglobalgc.php b/tests/lib/cache/fileglobalgc.php
index 0b0a4cb002d..4f032538e7d 100644
--- a/tests/lib/cache/fileglobalgc.php
+++ b/tests/lib/cache/fileglobalgc.php
@@ -70,4 +70,38 @@ class FileGlobalGC extends TestCase {
mkdir($this->cacheDir . 'asd');
$this->assertEquals([$this->cacheDir . 'foo'], $this->gc->getExpiredPaths($this->cacheDir, $time));
}
+
+ public function testGcUnlink() {
+ $time = time();
+ $this->addCacheFile('foo', $time - 10);
+ $this->addCacheFile('bar', $time - 10);
+ $this->addCacheFile('asd', $time + 10);
+
+ $config = $this->getMock('\OCP\IConfig');
+ $config->expects($this->once())
+ ->method('getAppValue')
+ ->with('core', 'global_cache_gc_lastrun', 0)
+ ->willReturn($time - \OC\Cache\FileGlobalGC::CLEANUP_TTL_SEC - 1);
+ $config->expects($this->once())
+ ->method('setAppValue');
+
+ $this->gc->gc($config, $this->cacheDir);
+ $this->assertFileNotExists($this->cacheDir . 'foo');
+ $this->assertFileNotExists($this->cacheDir . 'bar');
+ $this->assertFileExists($this->cacheDir . 'asd');
+ }
+
+ public function testGcLastRun() {
+ $time = time();
+
+ $config = $this->getMock('\OCP\IConfig');
+ $config->expects($this->once())
+ ->method('getAppValue')
+ ->with('core', 'global_cache_gc_lastrun', 0)
+ ->willReturn($time);
+ $config->expects($this->never())
+ ->method('setAppValue');
+
+ $this->gc->gc($config, $this->cacheDir);
+ }
}
diff --git a/tests/lib/connector/sabre/custompropertiesbackend.php b/tests/lib/connector/sabre/custompropertiesbackend.php
index ee0c3c4e53d..212bece9402 100644
--- a/tests/lib/connector/sabre/custompropertiesbackend.php
+++ b/tests/lib/connector/sabre/custompropertiesbackend.php
@@ -102,6 +102,44 @@ class CustomPropertiesBackend extends \Test\TestCase {
}
/**
+ * Test that propFind on a missing file soft fails
+ */
+ public function testPropFindMissingFileSoftFail() {
+ $this->tree->expects($this->at(0))
+ ->method('getNodeForPath')
+ ->with('/dummypath')
+ ->will($this->throwException(new \Sabre\DAV\Exception\NotFound()));
+
+ $this->tree->expects($this->at(1))
+ ->method('getNodeForPath')
+ ->with('/dummypath')
+ ->will($this->throwException(new \Sabre\DAV\Exception\ServiceUnavailable()));
+
+ $propFind = new \Sabre\DAV\PropFind(
+ '/dummypath',
+ array(
+ 'customprop',
+ 'customprop2',
+ 'unsetprop',
+ ),
+ 0
+ );
+
+ $this->plugin->propFind(
+ '/dummypath',
+ $propFind
+ );
+
+ $this->plugin->propFind(
+ '/dummypath',
+ $propFind
+ );
+
+ // no exception, soft fail
+ $this->assertTrue(true);
+ }
+
+ /**
* Test setting/getting properties
*/
public function testSetGetPropertiesForFile() {
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index 15bcff24f36..1bf838351b6 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -260,6 +260,28 @@ class Cache extends \Test\TestCase {
$this->assertEquals(\OC\Files\Cache\Cache::COMPLETE, $this->cache->getStatus('foo'));
}
+ public function putWithAllKindOfQuotesData() {
+ return [
+ ['`backtick`'],
+ ['´forward´'],
+ ['\'single\''],
+ ];
+ }
+
+ /**
+ * @dataProvider putWithAllKindOfQuotesData
+ * @param $fileName
+ */
+ public function testPutWithAllKindOfQuotes($fileName) {
+
+ $this->assertEquals(\OC\Files\Cache\Cache::NOT_FOUND, $this->cache->get($fileName));
+ $this->cache->put($fileName, array('size' => 20, 'mtime' => 25, 'mimetype' => 'foo/file', 'etag' => $fileName));
+
+ $cacheEntry = $this->cache->get($fileName);
+ $this->assertEquals($fileName, $cacheEntry['etag']);
+ $this->assertEquals($fileName, $cacheEntry['path']);
+ }
+
function testSearch() {
$file1 = 'folder';
$file2 = 'folder/foobar';
diff --git a/tests/lib/files/pathverificationtest.php b/tests/lib/files/pathverificationtest.php
index 5d38c6291a6..65342c7799e 100644
--- a/tests/lib/files/pathverificationtest.php
+++ b/tests/lib/files/pathverificationtest.php
@@ -230,4 +230,30 @@ class PathVerification extends \Test\TestCase {
];
}
+ /**
+ * @dataProvider providesValidPosixPaths
+ */
+ public function testPathVerificationValidPaths($fileName) {
+ $storage = new Local(['datadir' => '']);
+
+ \Test_Helper::invokePrivate($storage, 'verifyPosixPath', [$fileName]);
+ \Test_Helper::invokePrivate($storage, 'verifyWindowsPath', [$fileName]);
+ // nothing thrown
+ $this->assertTrue(true);
+ }
+
+ public function providesValidPosixPaths() {
+ return [
+ ['simple'],
+ ['simple.txt'],
+ ['\''],
+ ['`'],
+ ['%'],
+ ['()'],
+ ['[]'],
+ ['!'],
+ ['$'],
+ ['_'],
+ ];
+ }
}
diff --git a/tests/lib/files/storage/storagefactory.php b/tests/lib/files/storage/storagefactory.php
new file mode 100644
index 00000000000..15519ef83fb
--- /dev/null
+++ b/tests/lib/files/storage/storagefactory.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Files\Storage;
+
+use OC\Files\Mount\MountPoint;
+use OCP\Files\Mount\IMountPoint;
+use OCP\Files\Storage as IStorage;
+use Test\TestCase;
+use OC\Files\Storage\Wrapper\Wrapper;
+
+class DummyWrapper extends Wrapper {
+
+}
+
+class StorageFactory extends TestCase {
+ public function testSimpleWrapper() {
+ $instance = new \OC\Files\Storage\StorageFactory();
+ $mount = new MountPoint('\OC\Files\Storage\Temporary', '/foo', [[]], $instance);
+ $instance->addStorageWrapper('dummy', function ($mountPoint, IStorage $storage, IMountPoint $mount) {
+ $this->assertInstanceOf('\OC\Files\Storage\Temporary', $storage);
+ $this->assertEquals('/foo/', $mount->getMountPoint());
+ $this->assertEquals('/foo/', $mountPoint);
+ return new DummyWrapper(['storage' => $storage]);
+ });
+ $wrapped = $mount->getStorage();
+ $this->assertInstanceOf('\Test\Files\Storage\DummyWrapper', $wrapped);
+ }
+
+ public function testRemoveWrapper() {
+ $instance = new \OC\Files\Storage\StorageFactory();
+ $mount = new MountPoint('\OC\Files\Storage\Temporary', '/foo', [[]], $instance);
+ $instance->addStorageWrapper('dummy', function ($mountPoint, IStorage $storage) {
+ return new DummyWrapper(['storage' => $storage]);
+ });
+ $instance->removeStorageWrapper('dummy');
+ $wrapped = $mount->getStorage();
+ $this->assertInstanceOf('\OC\Files\Storage\Temporary', $wrapped);
+ }
+}
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index db39df7d16b..cd9f2d4afd1 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -8,6 +8,7 @@
namespace Test\Files;
use OC\Files\Cache\Watcher;
+use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Temporary;
class TemporaryNoTouch extends \OC\Files\Storage\Temporary {
@@ -975,4 +976,21 @@ class View extends \Test\TestCase {
$view = new \OC\Files\View('');
$this->assertTrue($view->rename('/test/foo.txt', '/test/foo/bar.txt'));
}
+
+ public function testSetMountOptionsInStorage() {
+ $mount = new MountPoint('\OC\Files\Storage\Temporary', '/asd/', [[]], \OC\Files\Filesystem::getLoader(), ['foo' => 'bar']);
+ \OC\Files\Filesystem::getMountManager()->addMount($mount);
+ /** @var \OC\Files\Storage\Common $storage */
+ $storage = $mount->getStorage();
+ $this->assertEquals($storage->getMountOption('foo'), 'bar');
+ }
+
+ public function testSetMountOptionsWatcherPolicy() {
+ $mount = new MountPoint('\OC\Files\Storage\Temporary', '/asd/', [[]], \OC\Files\Filesystem::getLoader(), ['filesystem_check_changes' => Watcher::CHECK_NEVER]);
+ \OC\Files\Filesystem::getMountManager()->addMount($mount);
+ /** @var \OC\Files\Storage\Common $storage */
+ $storage = $mount->getStorage();
+ $watcher = $storage->getWatcher();
+ $this->assertEquals(Watcher::CHECK_NEVER, $watcher->getPolicy());
+ }
}
diff --git a/tests/lib/image.php b/tests/lib/image.php
index 0ee517100ad..a22e210947b 100644
--- a/tests/lib/image.php
+++ b/tests/lib/image.php
@@ -31,20 +31,24 @@ class Test_Image extends \Test\TestCase {
public function testConstructDestruct() {
$img = new \OC_Image(OC::$SERVERROOT.'/tests/data/testimage.png');
$this->assertInstanceOf('\OC_Image', $img);
+ $this->assertInstanceOf('\OCP\IImage', $img);
unset($img);
$imgcreate = imagecreatefromjpeg(OC::$SERVERROOT.'/tests/data/testimage.jpg');
$img = new \OC_Image($imgcreate);
$this->assertInstanceOf('\OC_Image', $img);
+ $this->assertInstanceOf('\OCP\IImage', $img);
unset($img);
$base64 = base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'));
$img = new \OC_Image($base64);
$this->assertInstanceOf('\OC_Image', $img);
+ $this->assertInstanceOf('\OCP\IImage', $img);
unset($img);
$img = new \OC_Image(null);
$this->assertInstanceOf('\OC_Image', $img);
+ $this->assertInstanceOf('\OCP\IImage', $img);
unset($img);
}
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index 839a4723ecd..7524f887eb7 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -21,7 +21,7 @@ class TestRepairMimeTypes extends \Test\TestCase {
protected function setUp() {
parent::setUp();
- $this->storage = new \OC\Files\Storage\Temporary(array());
+ $this->storage = new \OC\Files\Storage\Temporary([]);
$this->repair = new \OC\Repair\RepairMimeTypes();
}
@@ -29,7 +29,7 @@ class TestRepairMimeTypes extends \Test\TestCase {
protected function tearDown() {
$this->storage->getCache()->clear();
$sql = 'DELETE FROM `*PREFIX*storages` WHERE `id` = ?';
- \OC_DB::executeAudited($sql, array($this->storage->getId()));
+ \OC_DB::executeAudited($sql, [$this->storage->getId()]);
$this->clearMimeTypes();
DummyFileCache::clearCachedMimeTypes();
@@ -48,11 +48,11 @@ class TestRepairMimeTypes extends \Test\TestCase {
foreach ($entries as $entry) {
$this->storage->getCache()->put(
$entry[0],
- array(
+ [
'size' => 0,
'mtime' => 0,
'mimetype' => $entry[1]
- )
+ ]
);
}
@@ -71,7 +71,7 @@ class TestRepairMimeTypes extends \Test\TestCase {
*/
private function getMimeTypeIdFromDB($mimeType) {
$sql = 'SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = ?';
- $results = \OC_DB::executeAudited($sql, array($mimeType));
+ $results = \OC_DB::executeAudited($sql, [$mimeType]);
$result = $results->fetchOne();
if ($result) {
return $result['id'];
@@ -79,20 +79,8 @@ class TestRepairMimeTypes extends \Test\TestCase {
return null;
}
- /**
- * Test renaming and splitting old office mime types
- */
- public function testRenameOfficeMimeTypes() {
- $this->addEntries(
- array(
- array('test.doc', 'application/msword'),
- array('test.docx', 'application/msword'),
- array('test.xls', 'application/msexcel'),
- array('test.xlsx', 'application/msexcel'),
- array('test.ppt', 'application/mspowerpoint'),
- array('test.pptx', 'application/mspowerpoint'),
- )
- );
+ private function renameMimeTypes($currentMimeTypes, $fixedMimeTypes) {
+ $this->addEntries($currentMimeTypes);
$this->repair->run();
@@ -100,150 +88,150 @@ class TestRepairMimeTypes extends \Test\TestCase {
DummyFileCache::clearCachedMimeTypes();
$this->storage->getCache()->loadMimeTypes();
- $this->checkEntries(
- array(
- array('test.doc', 'application/msword'),
- array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('test.xls', 'application/vnd.ms-excel'),
- array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
- array('test.ppt', 'application/vnd.ms-powerpoint'),
- array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
- )
- );
+ $this->checkEntries($fixedMimeTypes);
}
-
+
+ /**
+ * Test renaming and splitting old office mime types
+ */
+ public function testRenameOfficeMimeTypes() {
+ $currentMimeTypes = [
+ ['test.doc', 'application/msword'],
+ ['test.docx', 'application/msword'],
+ ['test.xls', 'application/msexcel'],
+ ['test.xlsx', 'application/msexcel'],
+ ['test.ppt', 'application/mspowerpoint'],
+ ['test.pptx', 'application/mspowerpoint'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.doc', 'application/msword'],
+ ['test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['test.xls', 'application/vnd.ms-excel'],
+ ['test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
+ ['test.ppt', 'application/vnd.ms-powerpoint'],
+ ['test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
+ }
+
/**
* Test renaming old fonts mime types
*/
public function testRenameFontsMimeTypes() {
- $this->addEntries(
- array(
- array('test.ttf', 'application/x-font-ttf'),
- array('test.otf', 'font/opentype'),
- array('test.pfb', 'application/octet-stream'),
- )
- );
-
- $this->repair->run();
-
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
-
- $this->checkEntries(
- array(
- array('test.ttf', 'application/font-sfnt'),
- array('test.otf', 'application/font-sfnt'),
- array('test.pfb', 'application/x-font'),
- )
- );
+ $currentMimeTypes = [
+ ['test.ttf', 'application/x-font-ttf'],
+ ['test.otf', 'font/opentype'],
+ ['test.pfb', 'application/octet-stream'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.ttf', 'application/font-sfnt'],
+ ['test.otf', 'application/font-sfnt'],
+ ['test.pfb', 'application/x-font'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
}
/**
* Test renaming the APK mime type
*/
public function testRenameAPKMimeType() {
- $this->addEntries(
- array(
- array('test.apk', 'application/octet-stream'),
- array('bogus.apk', 'application/vnd.android.package-archive'),
- array('bogus2.apk', 'application/wrong'),
- )
- );
-
- $this->repair->run();
-
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
-
- $this->checkEntries(
- array(
- array('test.apk', 'application/vnd.android.package-archive'),
- array('bogus.apk', 'application/vnd.android.package-archive'),
- array('bogus2.apk', 'application/vnd.android.package-archive'),
- )
- );
+ $currentMimeTypes = [
+ ['test.apk', 'application/octet-stream'],
+ ['bogus.apk', 'application/vnd.android.package-archive'],
+ ['bogus2.apk', 'application/wrong'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.apk', 'application/vnd.android.package-archive'],
+ ['bogus.apk', 'application/vnd.android.package-archive'],
+ ['bogus2.apk', 'application/vnd.android.package-archive'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
}
-
+
/**
* Test renaming the postscript mime types
*/
public function testRenamePostscriptMimeType() {
- $this->addEntries(
- array(
- array('test.eps', 'application/octet-stream'),
- array('test.ps', 'application/octet-stream'),
- )
- );
+ $currentMimeTypes = [
+ ['test.eps', 'application/octet-stream'],
+ ['test.ps', 'application/octet-stream'],
+ ];
- $this->repair->run();
+ $fixedMimeTypes = [
+ ['test.eps', 'application/postscript'],
+ ['test.ps', 'application/postscript'],
+ ];
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
-
- $this->checkEntries(
- array(
- array('test.eps', 'application/postscript'),
- array('test.ps', 'application/postscript'),
- )
- );
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
}
/**
- * Test renaming the postscript mime types
+ * Test renaming the Raw mime types
*/
public function testRenameRawMimeType() {
- $this->addEntries(
- array(
- array('test.arw', 'application/octet-stream'),
- array('test.cr2', 'application/octet-stream'),
- array('test.dcr', 'application/octet-stream'),
- array('test.dng', 'application/octet-stream'),
- array('test.erf', 'application/octet-stream'),
- array('test.iiq', 'application/octet-stream'),
- array('test.k25', 'application/octet-stream'),
- array('test.kdc', 'application/octet-stream'),
- array('test.mef', 'application/octet-stream'),
- array('test.nef', 'application/octet-stream'),
- array('test.orf', 'application/octet-stream'),
- array('test.pef', 'application/octet-stream'),
- array('test.raf', 'application/octet-stream'),
- array('test.rw2', 'application/octet-stream'),
- array('test.srf', 'application/octet-stream'),
- array('test.sr2', 'application/octet-stream'),
- array('test.xrf', 'application/octet-stream'),
- )
- );
+ $currentMimeTypes = [
+ ['test.arw', 'application/octet-stream'],
+ ['test.cr2', 'application/octet-stream'],
+ ['test.dcr', 'application/octet-stream'],
+ ['test.dng', 'application/octet-stream'],
+ ['test.erf', 'application/octet-stream'],
+ ['test.iiq', 'application/octet-stream'],
+ ['test.k25', 'application/octet-stream'],
+ ['test.kdc', 'application/octet-stream'],
+ ['test.mef', 'application/octet-stream'],
+ ['test.nef', 'application/octet-stream'],
+ ['test.orf', 'application/octet-stream'],
+ ['test.pef', 'application/octet-stream'],
+ ['test.raf', 'application/octet-stream'],
+ ['test.rw2', 'application/octet-stream'],
+ ['test.srf', 'application/octet-stream'],
+ ['test.sr2', 'application/octet-stream'],
+ ['test.xrf', 'application/octet-stream'],
+ ['CapitalExtension.DNG', 'application/octet-stream'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.arw', 'image/x-dcraw'],
+ ['test.cr2', 'image/x-dcraw'],
+ ['test.dcr', 'image/x-dcraw'],
+ ['test.dng', 'image/x-dcraw'],
+ ['test.erf', 'image/x-dcraw'],
+ ['test.iiq', 'image/x-dcraw'],
+ ['test.k25', 'image/x-dcraw'],
+ ['test.kdc', 'image/x-dcraw'],
+ ['test.mef', 'image/x-dcraw'],
+ ['test.nef', 'image/x-dcraw'],
+ ['test.orf', 'image/x-dcraw'],
+ ['test.pef', 'image/x-dcraw'],
+ ['test.raf', 'image/x-dcraw'],
+ ['test.rw2', 'image/x-dcraw'],
+ ['test.srf', 'image/x-dcraw'],
+ ['test.sr2', 'image/x-dcraw'],
+ ['test.xrf', 'image/x-dcraw'],
+ ['CapitalExtension.DNG', 'image/x-dcraw'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
+ }
- $this->repair->run();
+ public function testRename3dImagesMimeType() {
+ $currentMimeTypes = [
+ ['test.eps', 'application/octet-stream'],
+ ['test.ps', 'application/octet-stream'],
+ ];
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
+ $fixedMimeTypes = [
+ ['test.eps', 'application/postscript'],
+ ['test.ps', 'application/postscript'],
+ ];
- $this->checkEntries(
- array(
- array('test.arw', 'image/x-dcraw'),
- array('test.cr2', 'image/x-dcraw'),
- array('test.dcr', 'image/x-dcraw'),
- array('test.dng', 'image/x-dcraw'),
- array('test.erf', 'image/x-dcraw'),
- array('test.iiq', 'image/x-dcraw'),
- array('test.k25', 'image/x-dcraw'),
- array('test.kdc', 'image/x-dcraw'),
- array('test.mef', 'image/x-dcraw'),
- array('test.nef', 'image/x-dcraw'),
- array('test.orf', 'image/x-dcraw'),
- array('test.pef', 'image/x-dcraw'),
- array('test.raf', 'image/x-dcraw'),
- array('test.rw2', 'image/x-dcraw'),
- array('test.srf', 'image/x-dcraw'),
- array('test.sr2', 'image/x-dcraw'),
- array('test.xrf', 'image/x-dcraw'),
- )
- );
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
}
/**
@@ -251,85 +239,69 @@ class TestRepairMimeTypes extends \Test\TestCase {
* new ones already exist
*/
public function testRenameOfficeMimeTypesWhenExist() {
- $this->addEntries(
- array(
- array('test.doc', 'application/msword'),
- array('test.docx', 'application/msword'),
- array('test.xls', 'application/msexcel'),
- array('test.xlsx', 'application/msexcel'),
- array('test.ppt', 'application/mspowerpoint'),
- array('test.pptx', 'application/mspowerpoint'),
- // make it so that the new mimetypes already exist
- array('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('bogus.xlsx', 'application/vnd.ms-excel'),
- array('bogus.pptx', 'application/vnd.ms-powerpoint'),
- array('bogus2.docx', 'application/wrong'),
- array('bogus2.xlsx', 'application/wrong'),
- array('bogus2.pptx', 'application/wrong'),
- )
- );
-
- $this->repair->run();
-
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
-
- $this->checkEntries(
- array(
- array('test.doc', 'application/msword'),
- array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('test.xls', 'application/vnd.ms-excel'),
- array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
- array('test.ppt', 'application/vnd.ms-powerpoint'),
- array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
- array('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('bogus.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
- array('bogus.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
- array('bogus2.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('bogus2.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
- array('bogus2.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
- )
- );
+ $currentMimeTypes = [
+ ['test.doc', 'application/msword'],
+ ['test.docx', 'application/msword'],
+ ['test.xls', 'application/msexcel'],
+ ['test.xlsx', 'application/msexcel'],
+ ['test.ppt', 'application/mspowerpoint'],
+ ['test.pptx', 'application/mspowerpoint'],
+ // make it so that the new mimetypes already exist
+ ['bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['bogus.xlsx', 'application/vnd.ms-excel'],
+ ['bogus.pptx', 'application/vnd.ms-powerpoint'],
+ ['bogus2.docx', 'application/wrong'],
+ ['bogus2.xlsx', 'application/wrong'],
+ ['bogus2.pptx', 'application/wrong'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.doc', 'application/msword'],
+ ['test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['test.xls', 'application/vnd.ms-excel'],
+ ['test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
+ ['test.ppt', 'application/vnd.ms-powerpoint'],
+ ['test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
+ ['bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['bogus.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
+ ['bogus.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
+ ['bogus2.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['bogus2.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
+ ['bogus2.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
// wrong mimetypes are gone
$this->assertNull($this->getMimeTypeIdFromDB('application/msexcel'));
$this->assertNull($this->getMimeTypeIdFromDB('application/mspowerpoint'));
}
-
+
/**
* Test renaming old fonts mime types when
* new ones already exist
*/
public function testRenameFontsMimeTypesWhenExist() {
- $this->addEntries(
- array(
- array('test.ttf', 'application/x-font-ttf'),
- array('test.otf', 'font/opentype'),
- // make it so that the new mimetypes already exist
- array('bogus.ttf', 'application/font-sfnt'),
- array('bogus.otf', 'application/font-sfnt'),
- array('bogus2.ttf', 'application/wrong'),
- array('bogus2.otf', 'application/wrong'),
- )
- );
-
- $this->repair->run();
-
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
-
- $this->checkEntries(
- array(
- array('test.ttf', 'application/font-sfnt'),
- array('test.otf', 'application/font-sfnt'),
- array('bogus.ttf', 'application/font-sfnt'),
- array('bogus.otf', 'application/font-sfnt'),
- array('bogus2.ttf', 'application/font-sfnt'),
- array('bogus2.otf', 'application/font-sfnt'),
- )
- );
+ $currentMimeTypes = [
+ ['test.ttf', 'application/x-font-ttf'],
+ ['test.otf', 'font/opentype'],
+ // make it so that the new mimetypes already exist
+ ['bogus.ttf', 'application/font-sfnt'],
+ ['bogus.otf', 'application/font-sfnt'],
+ ['bogus2.ttf', 'application/wrong'],
+ ['bogus2.otf', 'application/wrong'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.ttf', 'application/font-sfnt'],
+ ['test.otf', 'application/font-sfnt'],
+ ['bogus.ttf', 'application/font-sfnt'],
+ ['bogus.otf', 'application/font-sfnt'],
+ ['bogus2.ttf', 'application/font-sfnt'],
+ ['bogus2.otf', 'application/font-sfnt'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
// wrong mimetypes are gone
$this->assertNull($this->getMimeTypeIdFromDB('application/x-font-ttf'));
@@ -342,79 +314,77 @@ class TestRepairMimeTypes extends \Test\TestCase {
* already correct and no old ones exist..
*/
public function testDoNothingWhenOnlyNewFiles() {
- $this->addEntries(
- array(
- array('test.doc', 'application/msword'),
- array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('test.xls', 'application/vnd.ms-excel'),
- array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
- array('test.ppt', 'application/vnd.ms-powerpoint'),
- array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
- array('test.apk', 'application/vnd.android.package-archive'),
- array('test.ttf', 'application/font-sfnt'),
- array('test.otf', 'application/font-sfnt'),
- array('test.pfb', 'application/x-font'),
- array('test.eps', 'application/postscript'),
- array('test.ps', 'application/postscript'),
- array('test.arw', 'image/x-dcraw'),
- array('test.cr2', 'image/x-dcraw'),
- array('test.dcr', 'image/x-dcraw'),
- array('test.dng', 'image/x-dcraw'),
- array('test.erf', 'image/x-dcraw'),
- array('test.iiq', 'image/x-dcraw'),
- array('test.k25', 'image/x-dcraw'),
- array('test.kdc', 'image/x-dcraw'),
- array('test.mef', 'image/x-dcraw'),
- array('test.nef', 'image/x-dcraw'),
- array('test.orf', 'image/x-dcraw'),
- array('test.pef', 'image/x-dcraw'),
- array('test.raf', 'image/x-dcraw'),
- array('test.rw2', 'image/x-dcraw'),
- array('test.srf', 'image/x-dcraw'),
- array('test.sr2', 'image/x-dcraw'),
- array('test.xrf', 'image/x-dcraw'),
- )
- );
-
- $this->repair->run();
-
- // force mimetype reload
- DummyFileCache::clearCachedMimeTypes();
- $this->storage->getCache()->loadMimeTypes();
-
- $this->checkEntries(
- array(
- array('test.doc', 'application/msword'),
- array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
- array('test.xls', 'application/vnd.ms-excel'),
- array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
- array('test.ppt', 'application/vnd.ms-powerpoint'),
- array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
- array('test.apk', 'application/vnd.android.package-archive'),
- array('test.ttf', 'application/font-sfnt'),
- array('test.otf', 'application/font-sfnt'),
- array('test.pfb', 'application/x-font'),
- array('test.eps', 'application/postscript'),
- array('test.ps', 'application/postscript'),
- array('test.arw', 'image/x-dcraw'),
- array('test.cr2', 'image/x-dcraw'),
- array('test.dcr', 'image/x-dcraw'),
- array('test.dng', 'image/x-dcraw'),
- array('test.erf', 'image/x-dcraw'),
- array('test.iiq', 'image/x-dcraw'),
- array('test.k25', 'image/x-dcraw'),
- array('test.kdc', 'image/x-dcraw'),
- array('test.mef', 'image/x-dcraw'),
- array('test.nef', 'image/x-dcraw'),
- array('test.orf', 'image/x-dcraw'),
- array('test.pef', 'image/x-dcraw'),
- array('test.raf', 'image/x-dcraw'),
- array('test.rw2', 'image/x-dcraw'),
- array('test.srf', 'image/x-dcraw'),
- array('test.sr2', 'image/x-dcraw'),
- array('test.xrf', 'image/x-dcraw'),
- )
- );
+ $currentMimeTypes = [
+ ['test.doc', 'application/msword'],
+ ['test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['test.xls', 'application/vnd.ms-excel'],
+ ['test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
+ ['test.ppt', 'application/vnd.ms-powerpoint'],
+ ['test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
+ ['test.apk', 'application/vnd.android.package-archive'],
+ ['test.ttf', 'application/font-sfnt'],
+ ['test.otf', 'application/font-sfnt'],
+ ['test.pfb', 'application/x-font'],
+ ['test.eps', 'application/postscript'],
+ ['test.ps', 'application/postscript'],
+ ['test.arw', 'image/x-dcraw'],
+ ['test.cr2', 'image/x-dcraw'],
+ ['test.dcr', 'image/x-dcraw'],
+ ['test.dng', 'image/x-dcraw'],
+ ['test.erf', 'image/x-dcraw'],
+ ['test.iiq', 'image/x-dcraw'],
+ ['test.k25', 'image/x-dcraw'],
+ ['test.kdc', 'image/x-dcraw'],
+ ['test.mef', 'image/x-dcraw'],
+ ['test.nef', 'image/x-dcraw'],
+ ['test.orf', 'image/x-dcraw'],
+ ['test.pef', 'image/x-dcraw'],
+ ['test.raf', 'image/x-dcraw'],
+ ['test.rw2', 'image/x-dcraw'],
+ ['test.srf', 'image/x-dcraw'],
+ ['test.sr2', 'image/x-dcraw'],
+ ['test.xrf', 'image/x-dcraw'],
+ ['test.DNG', 'image/x-dcraw'],
+ ['test.jps', 'image/jpeg'],
+ ['test.MPO', 'image/jpeg'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.doc', 'application/msword'],
+ ['test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
+ ['test.xls', 'application/vnd.ms-excel'],
+ ['test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
+ ['test.ppt', 'application/vnd.ms-powerpoint'],
+ ['test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
+ ['test.apk', 'application/vnd.android.package-archive'],
+ ['test.ttf', 'application/font-sfnt'],
+ ['test.otf', 'application/font-sfnt'],
+ ['test.pfb', 'application/x-font'],
+ ['test.eps', 'application/postscript'],
+ ['test.ps', 'application/postscript'],
+ ['test.arw', 'image/x-dcraw'],
+ ['test.cr2', 'image/x-dcraw'],
+ ['test.dcr', 'image/x-dcraw'],
+ ['test.dng', 'image/x-dcraw'],
+ ['test.erf', 'image/x-dcraw'],
+ ['test.iiq', 'image/x-dcraw'],
+ ['test.k25', 'image/x-dcraw'],
+ ['test.kdc', 'image/x-dcraw'],
+ ['test.mef', 'image/x-dcraw'],
+ ['test.nef', 'image/x-dcraw'],
+ ['test.orf', 'image/x-dcraw'],
+ ['test.pef', 'image/x-dcraw'],
+ ['test.raf', 'image/x-dcraw'],
+ ['test.rw2', 'image/x-dcraw'],
+ ['test.srf', 'image/x-dcraw'],
+ ['test.sr2', 'image/x-dcraw'],
+ ['test.xrf', 'image/x-dcraw'],
+ ['test.DNG', 'image/x-dcraw'],
+ ['test.jps', 'image/jpeg'],
+ ['test.MPO', 'image/jpeg'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
}
}
@@ -424,8 +394,8 @@ class TestRepairMimeTypes extends \Test\TestCase {
class DummyFileCache extends \OC\Files\Cache\Cache {
public static function clearCachedMimeTypes() {
- self::$mimetypeIds = array();
- self::$mimetypes = array();
+ self::$mimetypeIds = [];
+ self::$mimetypes = [];
}
}
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 1ef62dc2b07..42bb82968af 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -1051,6 +1051,41 @@ class Test_Share extends \Test\TestCase {
),
);
}
+
+ /**
+ * Ensure that we do not allow removing a an expiration date from a link share if this
+ * is enforced by the settings.
+ */
+ public function testClearExpireDateWhileEnforced() {
+ OC_User::setUserId($this->user1);
+
+ \OC_Appconfig::setValue('core', 'shareapi_default_expire_date', 'yes');
+ \OC_Appconfig::setValue('core', 'shareapi_expire_after_n_days', '2');
+ \OC_Appconfig::setValue('core', 'shareapi_enforce_expire_date', 'yes');
+
+ $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
+ $this->assertInternalType(
+ 'string',
+ $token,
+ 'Failed asserting that user 1 successfully shared text.txt as link with token.'
+ );
+
+ $setExpireDateFailed = false;
+ try {
+ $this->assertTrue(
+ OCP\Share::setExpirationDate('test', 'test.txt', '', ''),
+ 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
+ );
+ } catch (\Exception $e) {
+ $setExpireDateFailed = true;
+ }
+
+ $this->assertTrue($setExpireDateFailed);
+
+ \OC_Appconfig::deleteKey('core', 'shareapi_default_expire_date');
+ \OC_Appconfig::deleteKey('core', 'shareapi_expire_after_n_days');
+ \OC_Appconfig::deleteKey('core', 'shareapi_enforce_expire_date');
+ }
}
class DummyShareClass extends \OC\Share\Share {
diff --git a/tests/lib/urlgenerator.php b/tests/lib/urlgenerator.php
index a92aaddeb4c..60e1a86f16a 100644
--- a/tests/lib/urlgenerator.php
+++ b/tests/lib/urlgenerator.php
@@ -16,7 +16,8 @@ class Test_Urlgenerator extends \Test\TestCase {
public function testLinkToDocRoot($app, $file, $args, $expectedResult) {
\OC::$WEBROOT = '';
$config = $this->getMock('\OCP\IConfig');
- $urlGenerator = new \OC\URLGenerator($config);
+ $cacheFactory = $this->getMock('\OCP\ICacheFactory');
+ $urlGenerator = new \OC\URLGenerator($config, $cacheFactory);
$result = $urlGenerator->linkTo($app, $file, $args);
$this->assertEquals($expectedResult, $result);
@@ -30,7 +31,8 @@ class Test_Urlgenerator extends \Test\TestCase {
public function testLinkToSubDir($app, $file, $args, $expectedResult) {
\OC::$WEBROOT = '/owncloud';
$config = $this->getMock('\OCP\IConfig');
- $urlGenerator = new \OC\URLGenerator($config);
+ $cacheFactory = $this->getMock('\OCP\ICacheFactory');
+ $urlGenerator = new \OC\URLGenerator($config, $cacheFactory);
$result = $urlGenerator->linkTo($app, $file, $args);
$this->assertEquals($expectedResult, $result);
@@ -42,7 +44,8 @@ class Test_Urlgenerator extends \Test\TestCase {
public function testLinkToRouteAbsolute($route, $expected) {
\OC::$WEBROOT = '/owncloud';
$config = $this->getMock('\OCP\IConfig');
- $urlGenerator = new \OC\URLGenerator($config);
+ $cacheFactory = $this->getMock('\OCP\ICacheFactory');
+ $urlGenerator = new \OC\URLGenerator($config, $cacheFactory);
$result = $urlGenerator->linkToRouteAbsolute($route);
$this->assertEquals($expected, $result);
@@ -79,7 +82,9 @@ class Test_Urlgenerator extends \Test\TestCase {
function testGetAbsoluteURLDocRoot($url, $expectedResult) {
\OC::$WEBROOT = '';
- $urlGenerator = new \OC\URLGenerator(null);
+ $config = $this->getMock('\OCP\IConfig');
+ $cacheFactory = $this->getMock('\OCP\ICacheFactory');
+ $urlGenerator = new \OC\URLGenerator($config, $cacheFactory);
$result = $urlGenerator->getAbsoluteURL($url);
$this->assertEquals($expectedResult, $result);
@@ -93,7 +98,9 @@ class Test_Urlgenerator extends \Test\TestCase {
function testGetAbsoluteURLSubDir($url, $expectedResult) {
\OC::$WEBROOT = '/owncloud';
- $urlGenerator = new \OC\URLGenerator(null);
+ $config = $this->getMock('\OCP\IConfig');
+ $cacheFactory = $this->getMock('\OCP\ICacheFactory');
+ $urlGenerator = new \OC\URLGenerator($config, $cacheFactory);
$result = $urlGenerator->getAbsoluteURL($url);
$this->assertEquals($expectedResult, $result);
diff --git a/tests/lib/util.php b/tests/lib/util.php
index a852eee8ad6..4082c28f050 100644
--- a/tests/lib/util.php
+++ b/tests/lib/util.php
@@ -52,13 +52,11 @@ class Test_Util extends \Test\TestCase {
OC_Util::formatDate(1350129205, false, 'Mordor/Barad-dûr');
}
- public function formatDateWithTZFromSessionData()
- {
+ public function formatDateWithTZFromSessionData() {
return array(
array(3, 'October 13, 2012 at 2:53:25 PM GMT+3'),
array(15, 'October 13, 2012 at 11:53:25 AM GMT+0'),
array(-13, 'October 13, 2012 at 11:53:25 AM GMT+0'),
- array(3.5, 'October 13, 2012 at 3:23:25 PM GMT+3:30'),
array(9.5, 'October 13, 2012 at 9:23:25 PM GMT+9:30'),
array(-4.5, 'October 13, 2012 at 7:23:25 AM GMT-4:30'),
array(15.5, 'October 13, 2012 at 11:53:25 AM GMT+0'),
diff --git a/tests/preseed-config.php b/tests/preseed-config.php
index 3f41573bf29..e2c5a55fa58 100644
--- a/tests/preseed-config.php
+++ b/tests/preseed-config.php
@@ -1,23 +1,23 @@
<?php
-$CONFIG = array (
- "appstoreenabled" => false,
- 'apps_paths' =>
- array (
- 0 =>
- array (
- 'path' => OC::$SERVERROOT.'/apps',
- 'url' => '/apps',
- 'writable' => true,
- ),
- 1 =>
- array (
- 'path' => OC::$SERVERROOT.'/apps2',
- 'url' => '/apps2',
- 'writable' => false,
- )
- ),
-);
+$CONFIG = [
+ 'appstoreenabled' => false,
+ 'apps_paths' => [
+ [
+ 'path' => OC::$SERVERROOT . '/apps',
+ 'url' => '/apps',
+ 'writable' => true,
+ ],
+ ],
+];
-if(substr(strtolower(PHP_OS), 0, 3) == "win") {
- $CONFIG['openssl'] = array( 'config' => OC::$SERVERROOT.'/tests/data/openssl.cnf');
+if (is_dir(OC::$SERVERROOT.'/apps2')) {
+ $CONFIG['apps_paths'][] = [
+ 'path' => OC::$SERVERROOT . '/apps2',
+ 'url' => '/apps2',
+ 'writable' => false,
+ ];
+}
+
+if (substr(strtolower(PHP_OS), 0, 3) === 'win') {
+ $CONFIG['openssl'] = ['config' => OC::$SERVERROOT . '/tests/data/openssl.cnf'];
}