summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--apps/admin_audit/appinfo/info.xml4
-rw-r--r--apps/comments/l10n/ca.js38
-rw-r--r--apps/comments/l10n/ca.json38
-rw-r--r--apps/comments/l10n/fr.js2
-rw-r--r--apps/comments/l10n/fr.json2
-rw-r--r--apps/comments/lib/Notification/Listener.php15
-rw-r--r--apps/comments/lib/Notification/Notifier.php6
-rw-r--r--apps/comments/tests/Unit/Notification/ListenerTest.php8
-rw-r--r--apps/dav/l10n/cs_CZ.js70
-rw-r--r--apps/dav/l10n/cs_CZ.json70
-rw-r--r--apps/dav/l10n/sq.js40
-rw-r--r--apps/dav/l10n/sq.json38
-rw-r--r--apps/dav/l10n/sv.js44
-rw-r--r--apps/dav/l10n/sv.json44
-rw-r--r--apps/dav/lib/CalDAV/Activity/Filter/Todo.php2
-rw-r--r--apps/dav/lib/CalDAV/Activity/Setting/Todo.php2
-rw-r--r--apps/dav/tests/unit/CalDAV/Activity/Filter/TodoTest.php6
-rw-r--r--apps/encryption/l10n/fr.js2
-rw-r--r--apps/encryption/l10n/fr.json2
-rw-r--r--apps/encryption/l10n/sk_SK.js9
-rw-r--r--apps/encryption/l10n/sk_SK.json9
-rw-r--r--apps/encryption/l10n/sv.js2
-rw-r--r--apps/encryption/l10n/sv.json2
-rw-r--r--apps/encryption/lib/Hooks/UserHooks.php61
-rw-r--r--apps/encryption/lib/KeyManager.php8
-rw-r--r--apps/encryption/tests/Hooks/UserHooksTest.php47
-rw-r--r--apps/encryption/tests/KeyManagerTest.php6
-rw-r--r--apps/federatedfilesharing/l10n/cs_CZ.js1
-rw-r--r--apps/federatedfilesharing/l10n/cs_CZ.json1
-rw-r--r--apps/federatedfilesharing/l10n/de.js2
-rw-r--r--apps/federatedfilesharing/l10n/de.json2
-rw-r--r--apps/federatedfilesharing/l10n/de_DE.js2
-rw-r--r--apps/federatedfilesharing/l10n/de_DE.json2
-rw-r--r--apps/federatedfilesharing/l10n/fr.js2
-rw-r--r--apps/federatedfilesharing/l10n/fr.json2
-rw-r--r--apps/federatedfilesharing/l10n/sq.js26
-rw-r--r--apps/federatedfilesharing/l10n/sq.json26
-rw-r--r--apps/federatedfilesharing/l10n/sv.js2
-rw-r--r--apps/federatedfilesharing/l10n/sv.json2
-rw-r--r--apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php46
-rw-r--r--apps/federation/l10n/cs_CZ.js3
-rw-r--r--apps/federation/l10n/cs_CZ.json3
-rw-r--r--apps/files/css/mobile.css2
-rw-r--r--apps/files/js/filelist.js10
-rw-r--r--apps/files/l10n/cs_CZ.js25
-rw-r--r--apps/files/l10n/cs_CZ.json25
-rw-r--r--apps/files/l10n/de.js2
-rw-r--r--apps/files/l10n/de.json2
-rw-r--r--apps/files/l10n/de_DE.js2
-rw-r--r--apps/files/l10n/de_DE.json2
-rw-r--r--apps/files/l10n/fr.js22
-rw-r--r--apps/files/l10n/fr.json22
-rw-r--r--apps/files/l10n/sv.js2
-rw-r--r--apps/files/l10n/sv.json2
-rw-r--r--apps/files/l10n/zh_CN.js132
-rw-r--r--apps/files/l10n/zh_CN.json132
-rw-r--r--apps/files_external/appinfo/info.xml6
-rw-r--r--apps/files_external/l10n/de_DE.js2
-rw-r--r--apps/files_external/l10n/de_DE.json2
-rw-r--r--apps/files_external/lib/Lib/Storage/AmazonS3.php16
-rw-r--r--apps/files_external/lib/Lib/Storage/Dropbox.php28
-rw-r--r--apps/files_external/lib/Lib/Storage/FTP.php16
-rw-r--r--apps/files_external/lib/Lib/Storage/Google.php144
-rw-r--r--apps/files_external/lib/Lib/Storage/Swift.php16
-rw-r--r--apps/files_sharing/l10n/cs_CZ.js184
-rw-r--r--apps/files_sharing/l10n/cs_CZ.json184
-rw-r--r--apps/files_sharing/l10n/fr.js2
-rw-r--r--apps/files_sharing/l10n/fr.json2
-rw-r--r--apps/files_sharing/l10n/pl.js161
-rw-r--r--apps/files_sharing/l10n/pl.json161
-rw-r--r--apps/files_sharing/l10n/ru.js50
-rw-r--r--apps/files_sharing/l10n/ru.json50
-rw-r--r--apps/files_sharing/lib/AppInfo/Application.php4
-rw-r--r--apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php30
-rw-r--r--apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php34
-rw-r--r--apps/files_trashbin/l10n/zh_CN.js6
-rw-r--r--apps/files_trashbin/l10n/zh_CN.json6
-rw-r--r--apps/files_versions/l10n/cs_CZ.js1
-rw-r--r--apps/files_versions/l10n/cs_CZ.json1
-rw-r--r--apps/files_versions/l10n/de_DE.js2
-rw-r--r--apps/files_versions/l10n/de_DE.json2
-rw-r--r--apps/sharebymail/lib/ShareByMailProvider.php19
-rw-r--r--apps/systemtags/l10n/cs_CZ.js40
-rw-r--r--apps/systemtags/l10n/cs_CZ.json40
-rw-r--r--apps/theming/lib/Controller/ThemingController.php4
-rw-r--r--apps/theming/tests/Controller/ThemingControllerTest.php11
-rw-r--r--apps/twofactor_backupcodes/appinfo/app.php3
-rw-r--r--apps/twofactor_backupcodes/appinfo/routes.php2
-rw-r--r--apps/twofactor_backupcodes/l10n/cs_CZ.js4
-rw-r--r--apps/twofactor_backupcodes/l10n/cs_CZ.json4
-rw-r--r--apps/twofactor_backupcodes/l10n/de.js2
-rw-r--r--apps/twofactor_backupcodes/l10n/de.json2
-rw-r--r--apps/twofactor_backupcodes/lib/Activity/Provider.php5
-rw-r--r--apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php1
-rw-r--r--apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php11
-rw-r--r--apps/twofactor_backupcodes/settings/personal.php3
-rw-r--r--apps/twofactor_backupcodes/tests/Unit/Activity/GenericProviderTest.php132
-rw-r--r--apps/twofactor_backupcodes/tests/Unit/Activity/ProviderTest.php55
-rw-r--r--apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php37
-rw-r--r--apps/updatenotification/l10n/cs_CZ.js4
-rw-r--r--apps/updatenotification/l10n/cs_CZ.json4
-rw-r--r--apps/updatenotification/lib/Notification/BackgroundJob.php23
-rw-r--r--apps/updatenotification/lib/Notification/Notifier.php36
-rw-r--r--apps/updatenotification/tests/Notification/BackgroundJobTest.php49
-rw-r--r--apps/updatenotification/tests/Notification/NotifierTest.php14
-rw-r--r--apps/user_ldap/l10n/cs_CZ.js5
-rw-r--r--apps/user_ldap/l10n/cs_CZ.json5
-rw-r--r--apps/user_ldap/l10n/fr.js4
-rw-r--r--apps/user_ldap/l10n/fr.json4
-rw-r--r--apps/user_ldap/l10n/sv.js1
-rw-r--r--apps/user_ldap/l10n/sv.json1
-rw-r--r--apps/workflowengine/l10n/sk_SK.js58
-rw-r--r--apps/workflowengine/l10n/sk_SK.json56
-rw-r--r--bower.json1
-rw-r--r--config/config.sample.php228
-rw-r--r--core/Command/Config/ListConfigs.php19
-rw-r--r--core/Controller/LoginController.php12
-rw-r--r--core/Controller/LostController.php8
-rw-r--r--core/Controller/OCSController.php2
-rw-r--r--core/Controller/TwoFactorChallengeController.php25
-rw-r--r--core/css/apps.scss491
-rw-r--r--core/css/header.scss227
-rw-r--r--core/css/icons.scss112
-rw-r--r--core/css/multiselect.scss55
-rw-r--r--core/css/share.scss113
-rw-r--r--core/css/systemtags.scss48
-rw-r--r--core/css/tooltip.scss107
-rw-r--r--core/js/lostpassword.js2
-rw-r--r--core/js/tests/specs/coreSpec.js4
-rw-r--r--core/js/tests/specs/l10nSpec.js7
-rw-r--r--core/l10n/bg_BG.js2
-rw-r--r--core/l10n/bg_BG.json2
-rw-r--r--core/l10n/cs_CZ.js5
-rw-r--r--core/l10n/cs_CZ.json5
-rw-r--r--core/l10n/da.js2
-rw-r--r--core/l10n/da.json2
-rw-r--r--core/l10n/de.js3
-rw-r--r--core/l10n/de.json3
-rw-r--r--core/l10n/de_DE.js7
-rw-r--r--core/l10n/de_DE.json7
-rw-r--r--core/l10n/el.js2
-rw-r--r--core/l10n/el.json2
-rw-r--r--core/l10n/en_GB.js2
-rw-r--r--core/l10n/en_GB.json2
-rw-r--r--core/l10n/es.js2
-rw-r--r--core/l10n/es.json2
-rw-r--r--core/l10n/fi_FI.js2
-rw-r--r--core/l10n/fi_FI.json2
-rw-r--r--core/l10n/fr.js3
-rw-r--r--core/l10n/fr.json3
-rw-r--r--core/l10n/he.js2
-rw-r--r--core/l10n/he.json2
-rw-r--r--core/l10n/hu_HU.js2
-rw-r--r--core/l10n/hu_HU.json2
-rw-r--r--core/l10n/id.js2
-rw-r--r--core/l10n/id.json2
-rw-r--r--core/l10n/is.js2
-rw-r--r--core/l10n/is.json2
-rw-r--r--core/l10n/it.js2
-rw-r--r--core/l10n/it.json2
-rw-r--r--core/l10n/ja.js2
-rw-r--r--core/l10n/ja.json2
-rw-r--r--core/l10n/ko.js2
-rw-r--r--core/l10n/ko.json2
-rw-r--r--core/l10n/nb_NO.js2
-rw-r--r--core/l10n/nb_NO.json2
-rw-r--r--core/l10n/nl.js3
-rw-r--r--core/l10n/nl.json3
-rw-r--r--core/l10n/pl.js2
-rw-r--r--core/l10n/pl.json2
-rw-r--r--core/l10n/pt_BR.js3
-rw-r--r--core/l10n/pt_BR.json3
-rw-r--r--core/l10n/pt_PT.js2
-rw-r--r--core/l10n/pt_PT.json2
-rw-r--r--core/l10n/ru.js19
-rw-r--r--core/l10n/ru.json19
-rw-r--r--core/l10n/sk_SK.js2
-rw-r--r--core/l10n/sk_SK.json2
-rw-r--r--core/l10n/sl.js2
-rw-r--r--core/l10n/sl.json2
-rw-r--r--core/l10n/sq.js2
-rw-r--r--core/l10n/sq.json2
-rw-r--r--core/l10n/sv.js11
-rw-r--r--core/l10n/sv.json11
-rw-r--r--core/l10n/th_TH.js2
-rw-r--r--core/l10n/th_TH.json2
-rw-r--r--core/l10n/tr.js2
-rw-r--r--core/l10n/tr.json2
-rw-r--r--core/l10n/uk.js2
-rw-r--r--core/l10n/uk.json2
-rw-r--r--core/l10n/zh_CN.js281
-rw-r--r--core/l10n/zh_CN.json281
-rw-r--r--core/l10n/zh_TW.js2
-rw-r--r--core/l10n/zh_TW.json2
-rw-r--r--core/templates/twofactorshowchallenge.php8
-rw-r--r--core/vendor/.gitignore16
-rw-r--r--core/vendor/DOMPurify/.bower.json42
-rw-r--r--core/vendor/DOMPurify/LICENSE378
-rw-r--r--core/vendor/DOMPurify/dist/purify.min.js2
-rw-r--r--core/vendor/marked/.bower.json33
-rw-r--r--core/vendor/marked/LICENSE19
-rw-r--r--core/vendor/marked/marked.min.js6
-rw-r--r--lib/base.php22
-rw-r--r--lib/composer/composer/autoload_classmap.php3
-rw-r--r--lib/composer/composer/autoload_static.php3
-rw-r--r--lib/l10n/cs_CZ.js4
-rw-r--r--lib/l10n/cs_CZ.json4
-rw-r--r--lib/l10n/de_DE.js16
-rw-r--r--lib/l10n/de_DE.json16
-rw-r--r--lib/l10n/sk_SK.js5
-rw-r--r--lib/l10n/sk_SK.json5
-rw-r--r--lib/l10n/sv.js2
-rw-r--r--lib/l10n/sv.json2
-rw-r--r--lib/private/AllConfig.php13
-rw-r--r--lib/private/AppConfig.php59
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php21
-rw-r--r--lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php14
-rw-r--r--lib/private/AppFramework/Utility/ControllerMethodReflector.php23
-rw-r--r--lib/private/Archive/TAR.php19
-rw-r--r--lib/private/Archive/ZIP.php18
-rw-r--r--lib/private/Encryption/Keys/Storage.php35
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php21
-rw-r--r--lib/private/Files/Storage/DAV.php123
-rw-r--r--lib/private/Files/Stream/Close.php119
-rw-r--r--lib/private/Files/Utils/Scanner.php21
-rw-r--r--lib/private/Group/Database.php5
-rw-r--r--lib/private/Log.php28
-rw-r--r--lib/private/Log/Rotate.php4
-rw-r--r--lib/private/Mail/Mailer.php2
-rw-r--r--lib/private/Preview.php1349
-rw-r--r--lib/private/PreviewManager.php24
-rw-r--r--lib/private/Repair/Collation.php12
-rw-r--r--lib/private/Security/Bruteforce/Throttler.php13
-rw-r--r--lib/private/Server.php8
-rw-r--r--lib/private/Share20/Manager.php1
-rw-r--r--lib/private/SystemConfig.php1
-rw-r--r--lib/private/TemplateLayout.php15
-rw-r--r--lib/private/User/Database.php6
-rw-r--r--lib/private/User/Session.php6
-rw-r--r--lib/private/legacy/app.php40
-rw-r--r--lib/public/AppFramework/Http/Response.php4
-rw-r--r--lib/public/Authentication/TwoFactorAuth/TwoFactorException.php38
-rw-r--r--lib/public/Encryption/Keys/IStorage.php10
-rw-r--r--lib/public/IAppConfig.php9
-rw-r--r--lib/public/IPreview.php2
-rw-r--r--lib/public/RichObjectStrings/Definitions.php25
-rw-r--r--settings/css/settings.css23
-rw-r--r--settings/js/apps.js65
-rw-r--r--settings/js/federationscopemenu.js2
-rw-r--r--settings/js/users/users.js4
-rw-r--r--settings/l10n/cs_CZ.js7
-rw-r--r--settings/l10n/cs_CZ.json7
-rw-r--r--settings/l10n/de_DE.js10
-rw-r--r--settings/l10n/de_DE.json10
-rw-r--r--settings/l10n/fr.js8
-rw-r--r--settings/l10n/fr.json8
-rw-r--r--settings/l10n/lt_LT.js7
-rw-r--r--settings/l10n/lt_LT.json7
-rw-r--r--settings/l10n/ru.js2
-rw-r--r--settings/l10n/ru.json2
-rw-r--r--settings/l10n/sv.js8
-rw-r--r--settings/l10n/sv.json8
-rw-r--r--settings/personal.php2
-rw-r--r--settings/templates/apps.php8
-rw-r--r--settings/tests/js/appsSpec.js10
-rw-r--r--tests/Core/Command/Config/ListConfigsTest.php6
-rw-r--r--tests/Core/Controller/LostControllerTest.php38
-rw-r--r--tests/Core/Controller/TwoFactorChallengeControllerTest.php152
-rw-r--r--tests/karma.config.js18
-rw-r--r--tests/lib/AppConfigTest.php23
-rw-r--r--tests/lib/AppFramework/Controller/ControllerTest.php2
-rw-r--r--tests/lib/AppFramework/Http/DataResponseTest.php2
-rw-r--r--tests/lib/AppFramework/Http/ResponseTest.php2
-rw-r--r--tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php73
-rw-r--r--tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php13
-rw-r--r--tests/lib/AppTest.php20
-rw-r--r--tests/lib/Encryption/Keys/StorageTest.php43
-rw-r--r--tests/lib/Files/Utils/ScannerTest.php21
-rw-r--r--tests/lib/LoggerTest.php18
-rw-r--r--tests/lib/Mail/MailerTest.php4
-rw-r--r--tests/lib/PreviewTest.php963
-rw-r--r--tests/lib/Share20/ManagerTest.php110
-rw-r--r--tests/lib/StreamWrappersTest.php68
-rw-r--r--themes/example/defaults.php6
286 files changed, 4675 insertions, 4835 deletions
diff --git a/.gitignore b/.gitignore
index fa49588fad4..d8669fed074 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,6 +124,7 @@ Vagrantfile
# Tests - auto-generated files
/data-autotest
/tests/coverage*
+/tests/css
/tests/karma-coverage
/tests/autoconfig*
/tests/autotest*
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2ed7920a830..5f9dce7a3bf 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -58,7 +58,7 @@ like `git config --global alias.ci 'commit -s'`. Now you can commit with
In case you are not sure how to add or update the license header correctly please have a look at [contribute/HowToApplyALicense.md][applyalicense]
-[devmanual]: https://docs.nextcloud.org/server/11/developer_manual/
+[devmanual]: https://docs.nextcloud.org/server/12/developer_manual/
[dcofile]: https://github.com/nextcloud/server/blob/master/contribute/developer-certificate-of-origin
[applyalicense]: https://github.com/nextcloud/server/blob/master/contribute/HowToApplyALicense.md
diff --git a/apps/admin_audit/appinfo/info.xml b/apps/admin_audit/appinfo/info.xml
index 98862554090..e5ec9db0689 100644
--- a/apps/admin_audit/appinfo/info.xml
+++ b/apps/admin_audit/appinfo/info.xml
@@ -2,9 +2,7 @@
<info>
<id>admin_audit</id>
<name>Auditing / Logging</name>
- <description>Provides logging abilities for Nextcloud such as logging file
- accesses or otherwise sensitive actions.
- </description>
+ <description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
<licence>AGPL</licence>
<author>Nextcloud</author>
<version>1.2.0</version>
diff --git a/apps/comments/l10n/ca.js b/apps/comments/l10n/ca.js
index 9ad9f962572..e97f85ec407 100644
--- a/apps/comments/l10n/ca.js
+++ b/apps/comments/l10n/ca.js
@@ -1,23 +1,39 @@
OC.L10N.register(
"comments",
{
- "Type in a new comment..." : "Escriu en un nou comentari...",
+ "Comments" : "Comentaris",
+ "Unknown user" : "Usuari desconegut",
+ "New comment …" : "Nou comentari...",
"Delete comment" : "Esborrar comentari",
"Post" : "Publica",
"Cancel" : "Cancel·la",
"Edit comment" : "Editar comentari",
"[Deleted user]" : "[usuari Esborrat]",
- "Comments" : "Comentaris",
- "No other comments available" : "No hi han altres comentaris disponibles",
- "More comments..." : "Més comentaris",
+ "No comments yet, start the conversation!" : "Encara no hi ha comentaris. Comenceu la conversa!",
+ "More comments …" : "Més comentaris...",
"Save" : "Desa",
- "Allowed characters {count} of {max}" : "caracters Permessos {count} de {max}",
- "{count} unread comments" : "{count} comentaris no llegits",
+ "Allowed characters {count} of {max}" : "{count} caràcters permesos de {max}",
+ "Error occurred while retrieving comment with id {id}" : "Hi ha hagut un error en extraure el comentari amb id {id}",
+ "Error occurred while updating comment with id {id}" : "Hi ha hagut un error en actualitzar el comentari amb id {id}",
+ "Error occurred while posting comment" : "Hi ha hagut un error en publicar el comentari",
+ "_%n unread comment_::_%n unread comments_" : ["%n comentari no llegit","%n comentaris no llegits"],
"Comment" : "Comentari",
- "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentaris</strong> per arxius <em>(sempre llistat en corrent)",
- "You commented" : "Has comentat",
- "%1$s commented" : "%1$s comentat",
- "You commented on %2$s" : "Has comentat a %2$s",
- "%1$s commented on %2$s" : "%1$s ha comentat a %2$s"
+ "You commented" : "Heu comentat",
+ "%1$s commented" : "%1$s ha comentat",
+ "{author} commented" : "{author} ha comentat",
+ "You commented on %1$s" : "Heu comentat a %1$s",
+ "You commented on {file}" : "Heu comentat a {file}",
+ "%1$s commented on %2$s" : "%1$s ha comentat a %2$s",
+ "{author} commented on {file}" : "{author} ha comentat a {file}",
+ "<strong>Comments</strong> for files" : "<strong>Comentaris</strong> per arxius",
+ "A (now) deleted user mentioned you in a comment on “%s”" : "Un usuari (ara) esborrat us ha nomenat en un comentari a “%s”",
+ "A (now) deleted user mentioned you in a comment on “{file}”" : "Un usuari (ara) esborrat us ha nomenat en un comentari de “{file}”",
+ "%1$s mentioned you in a comment on “%2$s”" : "%1$s us ha nomenat en un comentari a “%2$s”",
+ "{user} mentioned you in a comment on “{file}”" : "{user} us ha nomenat en un comentari de “{file}”",
+ "Type in a new comment..." : "Escriviu un nou comentari...",
+ "No other comments available" : "No hi ha altres comentaris disponibles",
+ "More comments..." : "Més comentaris...",
+ "{count} unread comments" : "{count} comentaris no llegits",
+ "You commented on %2$s" : "Heu comentat a %2$s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/comments/l10n/ca.json b/apps/comments/l10n/ca.json
index f6df3abce3b..599ff0afa10 100644
--- a/apps/comments/l10n/ca.json
+++ b/apps/comments/l10n/ca.json
@@ -1,21 +1,37 @@
{ "translations": {
- "Type in a new comment..." : "Escriu en un nou comentari...",
+ "Comments" : "Comentaris",
+ "Unknown user" : "Usuari desconegut",
+ "New comment …" : "Nou comentari...",
"Delete comment" : "Esborrar comentari",
"Post" : "Publica",
"Cancel" : "Cancel·la",
"Edit comment" : "Editar comentari",
"[Deleted user]" : "[usuari Esborrat]",
- "Comments" : "Comentaris",
- "No other comments available" : "No hi han altres comentaris disponibles",
- "More comments..." : "Més comentaris",
+ "No comments yet, start the conversation!" : "Encara no hi ha comentaris. Comenceu la conversa!",
+ "More comments …" : "Més comentaris...",
"Save" : "Desa",
- "Allowed characters {count} of {max}" : "caracters Permessos {count} de {max}",
- "{count} unread comments" : "{count} comentaris no llegits",
+ "Allowed characters {count} of {max}" : "{count} caràcters permesos de {max}",
+ "Error occurred while retrieving comment with id {id}" : "Hi ha hagut un error en extraure el comentari amb id {id}",
+ "Error occurred while updating comment with id {id}" : "Hi ha hagut un error en actualitzar el comentari amb id {id}",
+ "Error occurred while posting comment" : "Hi ha hagut un error en publicar el comentari",
+ "_%n unread comment_::_%n unread comments_" : ["%n comentari no llegit","%n comentaris no llegits"],
"Comment" : "Comentari",
- "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentaris</strong> per arxius <em>(sempre llistat en corrent)",
- "You commented" : "Has comentat",
- "%1$s commented" : "%1$s comentat",
- "You commented on %2$s" : "Has comentat a %2$s",
- "%1$s commented on %2$s" : "%1$s ha comentat a %2$s"
+ "You commented" : "Heu comentat",
+ "%1$s commented" : "%1$s ha comentat",
+ "{author} commented" : "{author} ha comentat",
+ "You commented on %1$s" : "Heu comentat a %1$s",
+ "You commented on {file}" : "Heu comentat a {file}",
+ "%1$s commented on %2$s" : "%1$s ha comentat a %2$s",
+ "{author} commented on {file}" : "{author} ha comentat a {file}",
+ "<strong>Comments</strong> for files" : "<strong>Comentaris</strong> per arxius",
+ "A (now) deleted user mentioned you in a comment on “%s”" : "Un usuari (ara) esborrat us ha nomenat en un comentari a “%s”",
+ "A (now) deleted user mentioned you in a comment on “{file}”" : "Un usuari (ara) esborrat us ha nomenat en un comentari de “{file}”",
+ "%1$s mentioned you in a comment on “%2$s”" : "%1$s us ha nomenat en un comentari a “%2$s”",
+ "{user} mentioned you in a comment on “{file}”" : "{user} us ha nomenat en un comentari de “{file}”",
+ "Type in a new comment..." : "Escriviu un nou comentari...",
+ "No other comments available" : "No hi ha altres comentaris disponibles",
+ "More comments..." : "Més comentaris...",
+ "{count} unread comments" : "{count} comentaris no llegits",
+ "You commented on %2$s" : "Heu comentat a %2$s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/comments/l10n/fr.js b/apps/comments/l10n/fr.js
index 21641df269b..588f429babc 100644
--- a/apps/comments/l10n/fr.js
+++ b/apps/comments/l10n/fr.js
@@ -9,7 +9,7 @@ OC.L10N.register(
"Cancel" : "Annuler",
"Edit comment" : "Modifier le commentaire",
"[Deleted user]" : "[Utilisateur supprimé]",
- "No comments yet, start the conversation!" : "Il n'y a aucun commentaire, démarrer la conversation!",
+ "No comments yet, start the conversation!" : "Aucun commentaire actuellement, débutez une conversation !",
"More comments …" : "Plus de commentaires ...",
"Save" : "Enregistrer",
"Allowed characters {count} of {max}" : "{count} sur {max} caractères autorisés",
diff --git a/apps/comments/l10n/fr.json b/apps/comments/l10n/fr.json
index c8aa168fc3c..71e3823b84a 100644
--- a/apps/comments/l10n/fr.json
+++ b/apps/comments/l10n/fr.json
@@ -7,7 +7,7 @@
"Cancel" : "Annuler",
"Edit comment" : "Modifier le commentaire",
"[Deleted user]" : "[Utilisateur supprimé]",
- "No comments yet, start the conversation!" : "Il n'y a aucun commentaire, démarrer la conversation!",
+ "No comments yet, start the conversation!" : "Aucun commentaire actuellement, débutez une conversation !",
"More comments …" : "Plus de commentaires ...",
"Save" : "Enregistrer",
"Allowed characters {count} of {max}" : "{count} sur {max} caractères autorisés",
diff --git a/apps/comments/lib/Notification/Listener.php b/apps/comments/lib/Notification/Listener.php
index d30c59c93d5..365f93ce8dd 100644
--- a/apps/comments/lib/Notification/Listener.php
+++ b/apps/comments/lib/Notification/Listener.php
@@ -23,7 +23,6 @@ namespace OCA\Comments\Notification;
use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment;
-use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Notification\IManager;
@@ -34,25 +33,19 @@ class Listener {
/** @var IUserManager */
protected $userManager;
- /** @var IURLGenerator */
- protected $urlGenerator;
-
/**
* Listener constructor.
*
* @param IManager $notificationManager
* @param IUserManager $userManager
- * @param IURLGenerator $urlGenerator
*/
public function __construct(
IManager $notificationManager,
- IUserManager $userManager,
- IURLGenerator $urlGenerator
+ IUserManager $userManager
) {
$this->notificationManager = $notificationManager;
$this->userManager = $userManager;
- $this->urlGenerator = $urlGenerator;
}
/**
@@ -100,11 +93,7 @@ class Listener {
->setApp('comments')
->setObject('comment', $comment->getId())
->setSubject('mention', [ $comment->getObjectType(), $comment->getObjectId() ])
- ->setDateTime($comment->getCreationDateTime())
- ->setLink($this->urlGenerator->linkToRouteAbsolute(
- 'comments.Notifications.view',
- ['id' => $comment->getId()])
- );
+ ->setDateTime($comment->getCreationDateTime());
return $notification;
}
diff --git a/apps/comments/lib/Notification/Notifier.php b/apps/comments/lib/Notification/Notifier.php
index 170538512d8..a9daef3031f 100644
--- a/apps/comments/lib/Notification/Notifier.php
+++ b/apps/comments/lib/Notification/Notifier.php
@@ -139,7 +139,11 @@ class Notifier implements INotifier {
]
);
}
- $notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/comment.svg')));
+ $notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/comment.svg')))
+ ->setLink($this->url->linkToRouteAbsolute(
+ 'comments.Notifications.view',
+ ['id' => $comment->getId()])
+ );
return $notification;
break;
diff --git a/apps/comments/tests/Unit/Notification/ListenerTest.php b/apps/comments/tests/Unit/Notification/ListenerTest.php
index 3007b78cb3d..ef84d1c60de 100644
--- a/apps/comments/tests/Unit/Notification/ListenerTest.php
+++ b/apps/comments/tests/Unit/Notification/ListenerTest.php
@@ -46,14 +46,12 @@ class ListenerTest extends TestCase {
protected function setUp() {
parent::setUp();
- $this->notificationManager = $this->getMockBuilder('\OCP\Notification\IManager')->getMock();
- $this->userManager = $this->getMockBuilder('\OCP\IUserManager')->getMock();
- $this->urlGenerator = $this->getMockBuilder('OCP\IURLGenerator')->getMock();
+ $this->notificationManager = $this->createMock(\OCP\Notification\IManager::class);
+ $this->userManager = $this->createMock(\OCP\IUserManager::class);
$this->listener = new Listener(
$this->notificationManager,
- $this->userManager,
- $this->urlGenerator
+ $this->userManager
);
}
diff --git a/apps/dav/l10n/cs_CZ.js b/apps/dav/l10n/cs_CZ.js
index 3ffe09c4fe3..acd0b85b03f 100644
--- a/apps/dav/l10n/cs_CZ.js
+++ b/apps/dav/l10n/cs_CZ.js
@@ -1,44 +1,44 @@
OC.L10N.register(
"dav",
{
+ "Calendar" : "Kalendář",
+ "Todos" : "Úkoly",
+ "{actor} created calendar {calendar}" : "{actor} vytvořil(a) kalendář {calendar}",
+ "You created calendar {calendar}" : "Vytvořil(a",
+ "{actor} deleted calendar {calendar}" : "{actor} smazal(a) kalendář {calendar}",
+ "You deleted calendar {calendar}" : "Smazal(a) jste kalendář {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} aktualizoval(a) kalendář {calendar}",
+ "You updated calendar {calendar}" : "Aktualizoval(a) jste kalendář {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} s vámi nasdílel(a) kalendář {calendar}",
+ "You shared calendar {calendar} with {user}" : "S uživatelem {user} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} začal sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} s vámi přestal(a) sdílet kalendář {calendar}",
+ "You unshared calendar {calendar} from {user}" : "S uživatelem {user} jste přestal(a) sdílet kalendář {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} přestal(a) sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} přestal sdílet kalendář {calendar} sám se sebou",
+ "You shared calendar {calendar} with group {group}" : "Se skupinou {group} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} nasdílel(a) kalendář {calendar} skupině {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zrušil(a) jste sdílení kalendáře {calendar} skupině {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} přestal(a) sdílet kalendář {calendar} se skupinou {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} vytvořil(a) událost {event} v kalendáři {calendar}",
+ "You created event {event} in calendar {calendar}" : "V kalendáři {calendar} jste vytvořil(a) událost {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} z kalendáře {calendar} smazal(a) událost {event}",
+ "You deleted event {event} from calendar {calendar}" : "Smazal(a) jste událost {event} z kalendáře {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Aktualizoval(a) jste událost {event} v kalendáři {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} vytvořil(a) v seznamu {calendar} vytvořila úkol {todo}",
+ "You created todo {todo} in list {calendar}" : "V seznamu {calendar} jste vytvořil(a) úkol {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} smazal(a) úkol {todo} ze seznamu {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ze seznamu {todo} jste smazal(a) úkol {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} aktualizoval(a) úkol {todo} v seznamu {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Aktualizoval(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} vyřešil(a) úkol {todo} v seznamu {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Vyřešil(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřel(a) úkol {todo} v seznamu {calendar}",
"A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn",
"A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna",
"A calendar <strong>todo</strong> was modified" : "<strong>Úkol</strong> v kalendáři byl změněn",
- "%1$s created calendar %2$s" : "%1$s vytvořil(a) kalendář %2$s",
- "You created calendar %2$s" : "Vytvořili jste kalendář %2$s",
- "%1$s deleted calendar %2$s" : "%1$s vymazal(a) kalendář %2$s",
- "You deleted calendar %2$s" : "Smazali jste kalendář %2$s",
- "%1$s updated calendar %2$s" : "%1$s aktualizoval(a) kalendář %2$s",
- "You updated calendar %2$s" : "Aktualizovali jste kalendář %2$s",
- "%1$s shared calendar %2$s with you" : "%1$s s vámi začal(a) sdílet kalendář %2$s",
- "You shared calendar %2$s with %1$s" : "S uživatelem %1$s jste začal(a) sdílet kalendář %2$s",
- "%3$s shared calendar %2$s with %1$s" : "%3$s nasdílel(a) s %1$s kalendář %2$s",
- "%1$s unshared calendar %2$s from you" : "%1$s s vámi přestal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from %1$s" : "S %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from %1$s" : "%3$s přestal s %1$s sdílet kalendář %2$s",
- "%1$s unshared calendar %2$s from themselves" : "%1$s přestal sám se sebou sdílet kalendář %2$s",
- "You shared calendar %2$s with group %1$s" : "Se skupinou %1$s jste nasdílel(a) kalendář %2$s",
- "%3$s shared calendar %2$s with group %1$s" : "%3$s se skupinou %1$s začal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from group %1$s" : "Se skupinou %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from group %1$s" : "%3$s přestal ve skupině %1$s sdílet kalendář %2$s",
- "%1$s created event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s vytvořil událost %3$s",
- "You created event %3$s in calendar %2$s" : "V kalendáři %2$s jste vytvořil(a) událost %3$s",
- "%1$s deleted event %3$s from calendar %2$s" : "%1$s z kalendáře %2$s smazal(a) událost %3$s",
- "You deleted event %3$s from calendar %2$s" : "V kalendáři %2$s jste smazal(a) událost %3$s",
- "%1$s updated event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s aktualizoval(a) událost %3$s",
- "You updated event %3$s in calendar %2$s" : "Aktualizoval(a) jste událost %3$s v kalendáři %2$s",
- "%1$s created todo %3$s in list %2$s" : "%1$s v seznamu %2$s vytvořil(a) úkol %3$s",
- "You created todo %3$s in list %2$s" : "V seznamu %2$s jste vytvořil(a) úkol %3$s",
- "%1$s deleted todo %3$s from list %2$s" : "%1$s ze seznamu %2$s smazal(a) úkol %3$s",
- "You deleted todo %3$s from list %2$s" : "Ze seznamu %2$s jste odstranil(a) úkol %3$s",
- "%1$s updated todo %3$s in list %2$s" : "%1$s v seznamu %2$s aktualizoval(a) úkol %3$s",
- "You updated todo %3$s in list %2$s" : "Aktualizoval(a) jste úkol %3$s v seznamu %2$s",
- "%1$s solved todo %3$s in list %2$s" : "%1$s v seznamu %2$s vyřešil(a) úkol %3$s",
- "You solved todo %3$s in list %2$s" : "Vyřešil(a) jste úkol %3$s v seznamu %2$s",
- "%1$s reopened todo %3$s in list %2$s" : "%1$s znovu otevřel úkol %3$s v seznamu %2$s",
- "You reopened todo %3$s in list %2$s" : "Znovu jste otevřel(a) úkol %3$s v seznamu %2$s",
- "Calendar" : "Kalendář",
- "Todos" : "Úkoly",
"Contact birthdays" : "Narozeniny kontaktů",
"Personal" : "Osobní",
"Contacts" : "Kontakty",
diff --git a/apps/dav/l10n/cs_CZ.json b/apps/dav/l10n/cs_CZ.json
index abe873a2094..c1a25b3401e 100644
--- a/apps/dav/l10n/cs_CZ.json
+++ b/apps/dav/l10n/cs_CZ.json
@@ -1,42 +1,42 @@
{ "translations": {
+ "Calendar" : "Kalendář",
+ "Todos" : "Úkoly",
+ "{actor} created calendar {calendar}" : "{actor} vytvořil(a) kalendář {calendar}",
+ "You created calendar {calendar}" : "Vytvořil(a",
+ "{actor} deleted calendar {calendar}" : "{actor} smazal(a) kalendář {calendar}",
+ "You deleted calendar {calendar}" : "Smazal(a) jste kalendář {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} aktualizoval(a) kalendář {calendar}",
+ "You updated calendar {calendar}" : "Aktualizoval(a) jste kalendář {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} s vámi nasdílel(a) kalendář {calendar}",
+ "You shared calendar {calendar} with {user}" : "S uživatelem {user} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} začal sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} s vámi přestal(a) sdílet kalendář {calendar}",
+ "You unshared calendar {calendar} from {user}" : "S uživatelem {user} jste přestal(a) sdílet kalendář {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} přestal(a) sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} přestal sdílet kalendář {calendar} sám se sebou",
+ "You shared calendar {calendar} with group {group}" : "Se skupinou {group} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} nasdílel(a) kalendář {calendar} skupině {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zrušil(a) jste sdílení kalendáře {calendar} skupině {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} přestal(a) sdílet kalendář {calendar} se skupinou {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} vytvořil(a) událost {event} v kalendáři {calendar}",
+ "You created event {event} in calendar {calendar}" : "V kalendáři {calendar} jste vytvořil(a) událost {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} z kalendáře {calendar} smazal(a) událost {event}",
+ "You deleted event {event} from calendar {calendar}" : "Smazal(a) jste událost {event} z kalendáře {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Aktualizoval(a) jste událost {event} v kalendáři {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} vytvořil(a) v seznamu {calendar} vytvořila úkol {todo}",
+ "You created todo {todo} in list {calendar}" : "V seznamu {calendar} jste vytvořil(a) úkol {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} smazal(a) úkol {todo} ze seznamu {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ze seznamu {todo} jste smazal(a) úkol {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} aktualizoval(a) úkol {todo} v seznamu {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Aktualizoval(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} vyřešil(a) úkol {todo} v seznamu {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Vyřešil(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřel(a) úkol {todo} v seznamu {calendar}",
"A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn",
"A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna",
"A calendar <strong>todo</strong> was modified" : "<strong>Úkol</strong> v kalendáři byl změněn",
- "%1$s created calendar %2$s" : "%1$s vytvořil(a) kalendář %2$s",
- "You created calendar %2$s" : "Vytvořili jste kalendář %2$s",
- "%1$s deleted calendar %2$s" : "%1$s vymazal(a) kalendář %2$s",
- "You deleted calendar %2$s" : "Smazali jste kalendář %2$s",
- "%1$s updated calendar %2$s" : "%1$s aktualizoval(a) kalendář %2$s",
- "You updated calendar %2$s" : "Aktualizovali jste kalendář %2$s",
- "%1$s shared calendar %2$s with you" : "%1$s s vámi začal(a) sdílet kalendář %2$s",
- "You shared calendar %2$s with %1$s" : "S uživatelem %1$s jste začal(a) sdílet kalendář %2$s",
- "%3$s shared calendar %2$s with %1$s" : "%3$s nasdílel(a) s %1$s kalendář %2$s",
- "%1$s unshared calendar %2$s from you" : "%1$s s vámi přestal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from %1$s" : "S %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from %1$s" : "%3$s přestal s %1$s sdílet kalendář %2$s",
- "%1$s unshared calendar %2$s from themselves" : "%1$s přestal sám se sebou sdílet kalendář %2$s",
- "You shared calendar %2$s with group %1$s" : "Se skupinou %1$s jste nasdílel(a) kalendář %2$s",
- "%3$s shared calendar %2$s with group %1$s" : "%3$s se skupinou %1$s začal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from group %1$s" : "Se skupinou %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from group %1$s" : "%3$s přestal ve skupině %1$s sdílet kalendář %2$s",
- "%1$s created event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s vytvořil událost %3$s",
- "You created event %3$s in calendar %2$s" : "V kalendáři %2$s jste vytvořil(a) událost %3$s",
- "%1$s deleted event %3$s from calendar %2$s" : "%1$s z kalendáře %2$s smazal(a) událost %3$s",
- "You deleted event %3$s from calendar %2$s" : "V kalendáři %2$s jste smazal(a) událost %3$s",
- "%1$s updated event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s aktualizoval(a) událost %3$s",
- "You updated event %3$s in calendar %2$s" : "Aktualizoval(a) jste událost %3$s v kalendáři %2$s",
- "%1$s created todo %3$s in list %2$s" : "%1$s v seznamu %2$s vytvořil(a) úkol %3$s",
- "You created todo %3$s in list %2$s" : "V seznamu %2$s jste vytvořil(a) úkol %3$s",
- "%1$s deleted todo %3$s from list %2$s" : "%1$s ze seznamu %2$s smazal(a) úkol %3$s",
- "You deleted todo %3$s from list %2$s" : "Ze seznamu %2$s jste odstranil(a) úkol %3$s",
- "%1$s updated todo %3$s in list %2$s" : "%1$s v seznamu %2$s aktualizoval(a) úkol %3$s",
- "You updated todo %3$s in list %2$s" : "Aktualizoval(a) jste úkol %3$s v seznamu %2$s",
- "%1$s solved todo %3$s in list %2$s" : "%1$s v seznamu %2$s vyřešil(a) úkol %3$s",
- "You solved todo %3$s in list %2$s" : "Vyřešil(a) jste úkol %3$s v seznamu %2$s",
- "%1$s reopened todo %3$s in list %2$s" : "%1$s znovu otevřel úkol %3$s v seznamu %2$s",
- "You reopened todo %3$s in list %2$s" : "Znovu jste otevřel(a) úkol %3$s v seznamu %2$s",
- "Calendar" : "Kalendář",
- "Todos" : "Úkoly",
"Contact birthdays" : "Narozeniny kontaktů",
"Personal" : "Osobní",
"Contacts" : "Kontakty",
diff --git a/apps/dav/l10n/sq.js b/apps/dav/l10n/sq.js
new file mode 100644
index 00000000000..e84a2e2354f
--- /dev/null
+++ b/apps/dav/l10n/sq.js
@@ -0,0 +1,40 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Kalendar",
+ "{actor} created calendar {calendar}" : "{actor} krijoj kalendarin {calendar}",
+ "You created calendar {calendar}" : "Ju krijuat kalendarin {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} fshiu kalendarin {calendar}",
+ "You deleted calendar {calendar}" : "Ju fshit kalendarin {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} përditësoi kalendarin {calendar}",
+ "You updated calendar {calendar}" : "Ju përditësuat kalendarin {calendar}",
+ "{actor} shared calendar {calendar} with you" : " {actor} ndau kalendarin {calendar} me ju",
+ "You shared calendar {calendar} with {user}" : "Ju ndat kalendarin {calendar} me {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} ndau kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} ndaloj së ndari kalendarin {calendar} me ju",
+ "You unshared calendar {calendar} from {user}" : "Ju ndaluat së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} ndaloj së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} ndaloj së ndari kalendarin {calendar} me veten",
+ "You shared calendar {calendar} with group {group}" : "Ju ndat kalendarin {calendar} me grupin {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} ndau kalendarin {calendar} me grupin {group}",
+ "You unshared calendar {calendar} from group {group}" : "Ju ndaluat së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} ndaloj së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} krijoj eventin {event} në kalendarin {calendar}",
+ "You created event {event} in calendar {calendar}" : "Ju krijuat eventin {event} në kalendarin {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} fshiu eventin {event} nga kalendari {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Ju fshit eventin {event} nga kalndari {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} përditsoi eventin {event} në kalndarin {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Ju përditësuat eventin {event} në kalndarin {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} u krijua todo{todo} në listën {calendar}",
+ "You created todo {todo} in list {calendar}" : "Ju krijuat todo {todo} në listën {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} u fshi todo{ todo} nga lista{calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} u përditësua todo{todo} në listën{calendar}",
+ "A <strong>calendar</strong> was modified" : "Një <strong>kalendar</strong> u modifikua",
+ "A calendar <strong>event</strong> was modified" : "Një <strong>event</strong> në kalendar u modifikua",
+ "Personal" : "Personale",
+ "Contacts" : "Kontaktet",
+ "Technical details" : "Detaje teknike",
+ "Remote Address: %s" : "Adresa remote: %s",
+ "Request ID: %s" : "ID e kërkesës: %s"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/sq.json b/apps/dav/l10n/sq.json
new file mode 100644
index 00000000000..922e7122069
--- /dev/null
+++ b/apps/dav/l10n/sq.json
@@ -0,0 +1,38 @@
+{ "translations": {
+ "Calendar" : "Kalendar",
+ "{actor} created calendar {calendar}" : "{actor} krijoj kalendarin {calendar}",
+ "You created calendar {calendar}" : "Ju krijuat kalendarin {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} fshiu kalendarin {calendar}",
+ "You deleted calendar {calendar}" : "Ju fshit kalendarin {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} përditësoi kalendarin {calendar}",
+ "You updated calendar {calendar}" : "Ju përditësuat kalendarin {calendar}",
+ "{actor} shared calendar {calendar} with you" : " {actor} ndau kalendarin {calendar} me ju",
+ "You shared calendar {calendar} with {user}" : "Ju ndat kalendarin {calendar} me {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} ndau kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} ndaloj së ndari kalendarin {calendar} me ju",
+ "You unshared calendar {calendar} from {user}" : "Ju ndaluat së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} ndaloj së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} ndaloj së ndari kalendarin {calendar} me veten",
+ "You shared calendar {calendar} with group {group}" : "Ju ndat kalendarin {calendar} me grupin {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} ndau kalendarin {calendar} me grupin {group}",
+ "You unshared calendar {calendar} from group {group}" : "Ju ndaluat së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} ndaloj së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} krijoj eventin {event} në kalendarin {calendar}",
+ "You created event {event} in calendar {calendar}" : "Ju krijuat eventin {event} në kalendarin {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} fshiu eventin {event} nga kalendari {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Ju fshit eventin {event} nga kalndari {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} përditsoi eventin {event} në kalndarin {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Ju përditësuat eventin {event} në kalndarin {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} u krijua todo{todo} në listën {calendar}",
+ "You created todo {todo} in list {calendar}" : "Ju krijuat todo {todo} në listën {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} u fshi todo{ todo} nga lista{calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} u përditësua todo{todo} në listën{calendar}",
+ "A <strong>calendar</strong> was modified" : "Një <strong>kalendar</strong> u modifikua",
+ "A calendar <strong>event</strong> was modified" : "Një <strong>event</strong> në kalendar u modifikua",
+ "Personal" : "Personale",
+ "Contacts" : "Kontaktet",
+ "Technical details" : "Detaje teknike",
+ "Remote Address: %s" : "Adresa remote: %s",
+ "Request ID: %s" : "ID e kërkesës: %s"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/sv.js b/apps/dav/l10n/sv.js
index 44ec2399e2b..25cd0d797c8 100644
--- a/apps/dav/l10n/sv.js
+++ b/apps/dav/l10n/sv.js
@@ -2,44 +2,44 @@ OC.L10N.register(
"dav",
{
"Calendar" : "Kalender",
- "Todos" : "Att göra",
+ "Todos" : "Uppgifter",
"{actor} created calendar {calendar}" : "{actor} skapade kalender {calendar}",
"You created calendar {calendar}" : "Du skapade kalender {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} raderade kalender {calendar}",
"You deleted calendar {calendar}" : "Du raderade kalender {calendar}",
- "{actor} updated calendar {calendar}" : "{actor} uppdaterade kalender{calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} uppdaterade kalender {calendar}",
"You updated calendar {calendar}" : "Du uppdaterade kalender {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} delade kalender {calendar} med dig",
"You shared calendar {calendar} with {user}" : "Du delade kalender {calendar} med {user}",
"{actor} shared calendar {calendar} with {user}" : "{actor} delade kalender {calendar} med {user}",
- "{actor} unshared calendar {calendar} from you" : "{actor} tog bort delning av kalender {calendar} från dig",
- "You unshared calendar {calendar} from {user}" : "Du tog bort delning av kalender {calendar} från {user}",
- "{actor} unshared calendar {calendar} from {user}" : "{actor} tog bort delning utav kalender {calendar} från {user}",
- "{actor} unshared calendar {calendar} from themselves" : "{actor} tog bort delning utav kalender {calendar} från sig själva",
+ "{actor} unshared calendar {calendar} from you" : "{actor} slutade dela kalender {calendar} med dig",
+ "You unshared calendar {calendar} from {user}" : "Du slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} slutade dela kalender {calendar} med sig själv",
"You shared calendar {calendar} with group {group}" : "Du delade kalender {calendar} med grupp {group}",
"{actor} shared calendar {calendar} with group {group}" : "{actor} delade kalender {calendar} med grupp {group}",
- "You unshared calendar {calendar} from group {group}" : "Du tog bort delning utav kalender {calendar} från grupp {group}",
- "{actor} unshared calendar {calendar} from group {group}" : "{actor} tog bort delning utav kalender {calendar} från grupp {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du slutade dela kalender {calendar} med gruppen {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} slutade dela kalender {calendar} med gruppen {group}",
"{actor} created event {event} in calendar {calendar}" : "{actor} skapade händelse {event} i kalender {calendar}",
"You created event {event} in calendar {calendar}" : "Du skapade händelse {event} i kalender {calendar}",
"{actor} deleted event {event} from calendar {calendar}" : "{actor} raderade händelse {event} från kalender {calendar}",
"You deleted event {event} from calendar {calendar}" : "Du raderade händelse {event} från kalender {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} uppdaterade händelse {event} i kalender {calendar}",
- "You updated event {event} in calendar {calendar}" : "Du uppdaterade händelse {event} kalender {calendar}",
- "{actor} created todo {todo} in list {calendar}" : "{actor} skapade att göra {todo} i listan {calendar}",
- "You created todo {todo} in list {calendar}" : "Du skapade att-göra {todo} i listan {calendar}",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} raderade att-göra {todo} från listan {calendar}",
- "You deleted todo {todo} from list {calendar}" : "Du raderade att-göra {todo} från listan {calendar}",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} uppdaterade {todo} i listan {calendar}",
- "You updated todo {todo} in list {calendar}" : "Du uppdaterade att-göra {todo} i listan {calendar}",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} löste att-göra {todo} i listan {calendar}",
- "You solved todo {todo} in list {calendar}" : "Du löste att-göra {todo} i listan {calendar}",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} återupptog att-göra {todo} i listan {calendar}",
- "You reopened todo {todo} in list {calendar}" : "Du återupptog att-göra {todo} i listan {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du uppdaterade händelse {event} i kalender {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} skapade uppgift {todo} i listan {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du skapade uppgift {todo} i listan {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} raderade uppgift {todo} från listan {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du raderade uppgift {todo} från listan {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} uppdaterade uppgift {todo} i listan {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du uppdaterade uppgift {todo} i listan {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} löste uppgift {todo} i listan {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du löste uppgift {todo} i listan {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} återupptog uppgift {todo} i listan {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du återupptog uppgift {todo} i listan {calendar}",
"A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> modifierades",
- "A calendar <strong>event</strong> was modified" : "En kalender <strong>händelse</strong> modifierades",
- "A calendar <strong>todo</strong> was modified" : "En kalender <strong>att-göra</strong> modifierades",
- "Contact birthdays" : "Kontaktfödelsedagar",
+ "A calendar <strong>event</strong> was modified" : "En kalender-<strong>händelse</strong> modifierades",
+ "A calendar <strong>todo</strong> was modified" : "En kalender <strong>uppgift</strong> modifierades",
+ "Contact birthdays" : "Födelsedagar",
"Personal" : "Privat",
"Contacts" : "Kontakter",
"Technical details" : "Tekniska detaljer",
diff --git a/apps/dav/l10n/sv.json b/apps/dav/l10n/sv.json
index 6f77c0a7692..ba76ca55329 100644
--- a/apps/dav/l10n/sv.json
+++ b/apps/dav/l10n/sv.json
@@ -1,43 +1,43 @@
{ "translations": {
"Calendar" : "Kalender",
- "Todos" : "Att göra",
+ "Todos" : "Uppgifter",
"{actor} created calendar {calendar}" : "{actor} skapade kalender {calendar}",
"You created calendar {calendar}" : "Du skapade kalender {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} raderade kalender {calendar}",
"You deleted calendar {calendar}" : "Du raderade kalender {calendar}",
- "{actor} updated calendar {calendar}" : "{actor} uppdaterade kalender{calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} uppdaterade kalender {calendar}",
"You updated calendar {calendar}" : "Du uppdaterade kalender {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} delade kalender {calendar} med dig",
"You shared calendar {calendar} with {user}" : "Du delade kalender {calendar} med {user}",
"{actor} shared calendar {calendar} with {user}" : "{actor} delade kalender {calendar} med {user}",
- "{actor} unshared calendar {calendar} from you" : "{actor} tog bort delning av kalender {calendar} från dig",
- "You unshared calendar {calendar} from {user}" : "Du tog bort delning av kalender {calendar} från {user}",
- "{actor} unshared calendar {calendar} from {user}" : "{actor} tog bort delning utav kalender {calendar} från {user}",
- "{actor} unshared calendar {calendar} from themselves" : "{actor} tog bort delning utav kalender {calendar} från sig själva",
+ "{actor} unshared calendar {calendar} from you" : "{actor} slutade dela kalender {calendar} med dig",
+ "You unshared calendar {calendar} from {user}" : "Du slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} slutade dela kalender {calendar} med sig själv",
"You shared calendar {calendar} with group {group}" : "Du delade kalender {calendar} med grupp {group}",
"{actor} shared calendar {calendar} with group {group}" : "{actor} delade kalender {calendar} med grupp {group}",
- "You unshared calendar {calendar} from group {group}" : "Du tog bort delning utav kalender {calendar} från grupp {group}",
- "{actor} unshared calendar {calendar} from group {group}" : "{actor} tog bort delning utav kalender {calendar} från grupp {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du slutade dela kalender {calendar} med gruppen {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} slutade dela kalender {calendar} med gruppen {group}",
"{actor} created event {event} in calendar {calendar}" : "{actor} skapade händelse {event} i kalender {calendar}",
"You created event {event} in calendar {calendar}" : "Du skapade händelse {event} i kalender {calendar}",
"{actor} deleted event {event} from calendar {calendar}" : "{actor} raderade händelse {event} från kalender {calendar}",
"You deleted event {event} from calendar {calendar}" : "Du raderade händelse {event} från kalender {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} uppdaterade händelse {event} i kalender {calendar}",
- "You updated event {event} in calendar {calendar}" : "Du uppdaterade händelse {event} kalender {calendar}",
- "{actor} created todo {todo} in list {calendar}" : "{actor} skapade att göra {todo} i listan {calendar}",
- "You created todo {todo} in list {calendar}" : "Du skapade att-göra {todo} i listan {calendar}",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} raderade att-göra {todo} från listan {calendar}",
- "You deleted todo {todo} from list {calendar}" : "Du raderade att-göra {todo} från listan {calendar}",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} uppdaterade {todo} i listan {calendar}",
- "You updated todo {todo} in list {calendar}" : "Du uppdaterade att-göra {todo} i listan {calendar}",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} löste att-göra {todo} i listan {calendar}",
- "You solved todo {todo} in list {calendar}" : "Du löste att-göra {todo} i listan {calendar}",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} återupptog att-göra {todo} i listan {calendar}",
- "You reopened todo {todo} in list {calendar}" : "Du återupptog att-göra {todo} i listan {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du uppdaterade händelse {event} i kalender {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} skapade uppgift {todo} i listan {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du skapade uppgift {todo} i listan {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} raderade uppgift {todo} från listan {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du raderade uppgift {todo} från listan {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} uppdaterade uppgift {todo} i listan {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du uppdaterade uppgift {todo} i listan {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} löste uppgift {todo} i listan {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du löste uppgift {todo} i listan {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} återupptog uppgift {todo} i listan {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du återupptog uppgift {todo} i listan {calendar}",
"A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> modifierades",
- "A calendar <strong>event</strong> was modified" : "En kalender <strong>händelse</strong> modifierades",
- "A calendar <strong>todo</strong> was modified" : "En kalender <strong>att-göra</strong> modifierades",
- "Contact birthdays" : "Kontaktfödelsedagar",
+ "A calendar <strong>event</strong> was modified" : "En kalender-<strong>händelse</strong> modifierades",
+ "A calendar <strong>todo</strong> was modified" : "En kalender <strong>uppgift</strong> modifierades",
+ "Contact birthdays" : "Födelsedagar",
"Personal" : "Privat",
"Contacts" : "Kontakter",
"Technical details" : "Tekniska detaljer",
diff --git a/apps/dav/lib/CalDAV/Activity/Filter/Todo.php b/apps/dav/lib/CalDAV/Activity/Filter/Todo.php
index 312bb6c472d..42ee0740851 100644
--- a/apps/dav/lib/CalDAV/Activity/Filter/Todo.php
+++ b/apps/dav/lib/CalDAV/Activity/Filter/Todo.php
@@ -79,7 +79,7 @@ class Todo implements IFilter {
* @since 11.0.0
*/
public function filterTypes(array $types) {
- return array_intersect(['calendar_todos'], $types);
+ return array_intersect(['calendar_todo'], $types);
}
/**
diff --git a/apps/dav/lib/CalDAV/Activity/Setting/Todo.php b/apps/dav/lib/CalDAV/Activity/Setting/Todo.php
index 0c8215f4843..234774bfea4 100644
--- a/apps/dav/lib/CalDAV/Activity/Setting/Todo.php
+++ b/apps/dav/lib/CalDAV/Activity/Setting/Todo.php
@@ -42,7 +42,7 @@ class Todo implements ISetting {
* @since 11.0.0
*/
public function getIdentifier() {
- return 'calendar_todos';
+ return 'calendar_todo';
}
/**
diff --git a/apps/dav/tests/unit/CalDAV/Activity/Filter/TodoTest.php b/apps/dav/tests/unit/CalDAV/Activity/Filter/TodoTest.php
index 3c6ac2a5c55..54a5a6f5f9d 100644
--- a/apps/dav/tests/unit/CalDAV/Activity/Filter/TodoTest.php
+++ b/apps/dav/tests/unit/CalDAV/Activity/Filter/TodoTest.php
@@ -67,9 +67,9 @@ class TodoTest extends TestCase {
public function dataFilterTypes() {
return [
[[], []],
- [['calendar_todos'], ['calendar_todos']],
- [['calendar', 'calendar_event', 'calendar_todos'], ['calendar_todos']],
- [['calendar', 'calendar_todos', 'files'], ['calendar_todos']],
+ [['calendar_todo'], ['calendar_todo']],
+ [['calendar', 'calendar_event', 'calendar_todo'], ['calendar_todo']],
+ [['calendar', 'calendar_todo', 'files'], ['calendar_todo']],
];
}
diff --git a/apps/encryption/l10n/fr.js b/apps/encryption/l10n/fr.js
index 77a433ef58d..14b693baa28 100644
--- a/apps/encryption/l10n/fr.js
+++ b/apps/encryption/l10n/fr.js
@@ -12,7 +12,7 @@ OC.L10N.register(
"Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération",
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
- "Password successfully changed." : "Mot de passe changé avec succès.",
+ "Password successfully changed." : "Mot de passe modifié avec succès.",
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Recovery Key disabled" : "Clé de récupération désactivée",
"Recovery Key enabled" : "Clef de récupération activée",
diff --git a/apps/encryption/l10n/fr.json b/apps/encryption/l10n/fr.json
index 2129bd43828..74c0b7492a8 100644
--- a/apps/encryption/l10n/fr.json
+++ b/apps/encryption/l10n/fr.json
@@ -10,7 +10,7 @@
"Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération",
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
- "Password successfully changed." : "Mot de passe changé avec succès.",
+ "Password successfully changed." : "Mot de passe modifié avec succès.",
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Recovery Key disabled" : "Clé de récupération désactivée",
"Recovery Key enabled" : "Clef de récupération activée",
diff --git a/apps/encryption/l10n/sk_SK.js b/apps/encryption/l10n/sk_SK.js
index 798a5939ff9..7678ed60ac7 100644
--- a/apps/encryption/l10n/sk_SK.js
+++ b/apps/encryption/l10n/sk_SK.js
@@ -22,11 +22,19 @@ OC.L10N.register(
"The current log-in password was not correct, please try again." : "Toto heslo nebolo správne, prosím skúste to ešte raz.",
"Private key password successfully updated." : "Heslo súkromného kľúča je úspešne aktualizované.",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Musíte migrovať vaše šifrovacie kľúče zo starého šifrovania (ownCloud <= 8,0) na nové. Spustite „occ encryption:migrate“ alebo sa obráťte na správcu",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Neplatný súkromný kľúč pre šifrovanie. Aktualizujte prosím heslo vášho súkromného kľúča v osobných nastaveniach pre obnovenie prístupu k vaším šifrovaným súborom.",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia pre šifrovanie je povolená, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
+ "Encryption app is enabled and ready" : "Aplikácia pre šifrovanie je povolená a pripravená",
+ "Bad Signature" : "Zlý podpis",
+ "Missing Signature" : "Chýbajúci podpis",
"one-time password for server-side-encryption" : "jednorazové heslo na šifrovanie na strane servera",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor nie je možné rozšifrovať, môže ísť o súbor sprístupnený iným používateľom. Požiadajte majiteľa súboru, aby vám ho sprístupnil ešte raz.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor nie je možné prečítať, môže ísť o súbor sprístupnený iným používateľom. Požiadajte majiteľa súboru, aby vám ho sprístupnil ešte raz.",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Dobrý deň,\n\nAdministrátor povolil šifrovanie na strane servera. Vaše súbory boli zašifrované pomocou hesla '%s'.\n\nPrihláste sa prosím cez webový prehliadač, choďte do sekcie základného šifrovacieho modulu v osobných nastaveniach a zadajte horeuvedené heslo do políčka 'staré prihlasovacie heslo' a vaše súčasné prihlasovacie heslo.\n\n",
"The share will expire on %s." : "Sprístupnenie vyprší %s.",
"Cheers!" : "Pekný deň!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Dobrý deň,<br><br>Administrátor povolil šifrovanie na strane servera. Vaše súbory boli zašifrované pomocou hesla <strong>%s</strong>.<br><br>Prihláste sa prosím cez webový prehliadač, choďte do sekcie základného šifrovacieho modulu v osobných nastaveniach a zadajte horeuvedené heslo do políčka 'staré prihlasovacie heslo' a vaše súčasné prihlasovacie heslo.<br><br>",
+ "Default encryption module" : "Predvolený šifrovací modul",
"Encrypt the home storage" : "Šifrovať domáce úložisko",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Zapnutím tejto voľby zašifrujete všetky súbory v hlavnom úložisku, v opačnom prípade zašifrujete iba súbory na externom úložisku.",
"Enable recovery key" : "Povoliť obnovovací kľúč",
@@ -39,6 +47,7 @@ OC.L10N.register(
"New recovery key password" : "Nové heslo obnovovacieho kľúča",
"Repeat new recovery key password" : "Zopakujte nové heslo obnovovacieho kľúča",
"Change Password" : "Zmeniť heslo",
+ "Basic encryption module" : "Základný šifrovací modul",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
"Your private key password no longer matches your log-in password." : "Heslo vášho súkromného kľúča sa nezhoduje v vašim prihlasovacím heslom.",
"Set your old private key password to your current log-in password:" : "Zmeňte si vaše staré heslo súkromného kľúča na rovnaké, aké je vaše aktuálne prihlasovacie heslo:",
diff --git a/apps/encryption/l10n/sk_SK.json b/apps/encryption/l10n/sk_SK.json
index cf259c2223d..91fbf2aa577 100644
--- a/apps/encryption/l10n/sk_SK.json
+++ b/apps/encryption/l10n/sk_SK.json
@@ -20,11 +20,19 @@
"The current log-in password was not correct, please try again." : "Toto heslo nebolo správne, prosím skúste to ešte raz.",
"Private key password successfully updated." : "Heslo súkromného kľúča je úspešne aktualizované.",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Musíte migrovať vaše šifrovacie kľúče zo starého šifrovania (ownCloud <= 8,0) na nové. Spustite „occ encryption:migrate“ alebo sa obráťte na správcu",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Neplatný súkromný kľúč pre šifrovanie. Aktualizujte prosím heslo vášho súkromného kľúča v osobných nastaveniach pre obnovenie prístupu k vaším šifrovaným súborom.",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia pre šifrovanie je povolená, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
+ "Encryption app is enabled and ready" : "Aplikácia pre šifrovanie je povolená a pripravená",
+ "Bad Signature" : "Zlý podpis",
+ "Missing Signature" : "Chýbajúci podpis",
"one-time password for server-side-encryption" : "jednorazové heslo na šifrovanie na strane servera",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor nie je možné rozšifrovať, môže ísť o súbor sprístupnený iným používateľom. Požiadajte majiteľa súboru, aby vám ho sprístupnil ešte raz.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor nie je možné prečítať, môže ísť o súbor sprístupnený iným používateľom. Požiadajte majiteľa súboru, aby vám ho sprístupnil ešte raz.",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Dobrý deň,\n\nAdministrátor povolil šifrovanie na strane servera. Vaše súbory boli zašifrované pomocou hesla '%s'.\n\nPrihláste sa prosím cez webový prehliadač, choďte do sekcie základného šifrovacieho modulu v osobných nastaveniach a zadajte horeuvedené heslo do políčka 'staré prihlasovacie heslo' a vaše súčasné prihlasovacie heslo.\n\n",
"The share will expire on %s." : "Sprístupnenie vyprší %s.",
"Cheers!" : "Pekný deň!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Dobrý deň,<br><br>Administrátor povolil šifrovanie na strane servera. Vaše súbory boli zašifrované pomocou hesla <strong>%s</strong>.<br><br>Prihláste sa prosím cez webový prehliadač, choďte do sekcie základného šifrovacieho modulu v osobných nastaveniach a zadajte horeuvedené heslo do políčka 'staré prihlasovacie heslo' a vaše súčasné prihlasovacie heslo.<br><br>",
+ "Default encryption module" : "Predvolený šifrovací modul",
"Encrypt the home storage" : "Šifrovať domáce úložisko",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Zapnutím tejto voľby zašifrujete všetky súbory v hlavnom úložisku, v opačnom prípade zašifrujete iba súbory na externom úložisku.",
"Enable recovery key" : "Povoliť obnovovací kľúč",
@@ -37,6 +45,7 @@
"New recovery key password" : "Nové heslo obnovovacieho kľúča",
"Repeat new recovery key password" : "Zopakujte nové heslo obnovovacieho kľúča",
"Change Password" : "Zmeniť heslo",
+ "Basic encryption module" : "Základný šifrovací modul",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
"Your private key password no longer matches your log-in password." : "Heslo vášho súkromného kľúča sa nezhoduje v vašim prihlasovacím heslom.",
"Set your old private key password to your current log-in password:" : "Zmeňte si vaše staré heslo súkromného kľúča na rovnaké, aké je vaše aktuálne prihlasovacie heslo:",
diff --git a/apps/encryption/l10n/sv.js b/apps/encryption/l10n/sv.js
index 0689661768d..0b8530bf006 100644
--- a/apps/encryption/l10n/sv.js
+++ b/apps/encryption/l10n/sv.js
@@ -55,7 +55,7 @@ OC.L10N.register(
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
- "Enable password recovery:" : "Aktivera lösenordsåterställning",
+ "Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Genom att aktivera detta alternativ kommer du kunna återfå tillgång till dina krypterade filer om du skulle förlora/glömma ditt lösenord",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad"
diff --git a/apps/encryption/l10n/sv.json b/apps/encryption/l10n/sv.json
index ab1134f64b7..976336ae068 100644
--- a/apps/encryption/l10n/sv.json
+++ b/apps/encryption/l10n/sv.json
@@ -53,7 +53,7 @@
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
- "Enable password recovery:" : "Aktivera lösenordsåterställning",
+ "Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Genom att aktivera detta alternativ kommer du kunna återfå tillgång till dina krypterade filer om du skulle förlora/glömma ditt lösenord",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad"
diff --git a/apps/encryption/lib/Hooks/UserHooks.php b/apps/encryption/lib/Hooks/UserHooks.php
index 16e4e962432..d189ce3eeef 100644
--- a/apps/encryption/lib/Hooks/UserHooks.php
+++ b/apps/encryption/lib/Hooks/UserHooks.php
@@ -40,6 +40,13 @@ use OCA\Encryption\Session;
use OCA\Encryption\Recovery;
class UserHooks implements IHook {
+
+ /**
+ * list of user for which we perform a password reset
+ * @var array
+ */
+ protected static $passwordResetUsers = [];
+
/**
* @var KeyManager
*/
@@ -132,6 +139,16 @@ class UserHooks implements IHook {
$this,
'preSetPassphrase');
+ OCUtil::connectHook('\OC\Core\LostPassword\Controller\LostController',
+ 'post_passwordReset',
+ $this,
+ 'postPasswordReset');
+
+ OCUtil::connectHook('\OC\Core\LostPassword\Controller\LostController',
+ 'pre_passwordReset',
+ $this,
+ 'prePasswordReset');
+
OCUtil::connectHook('OC_User',
'post_createUser',
$this,
@@ -202,6 +219,22 @@ class UserHooks implements IHook {
}
}
+ public function prePasswordReset($params) {
+ if (App::isEnabled('encryption')) {
+ $user = $params['uid'];
+ self::$passwordResetUsers[$user] = true;
+ }
+ }
+
+ public function postPasswordReset($params) {
+ $uid = $params['uid'];
+ $password = $params['password'];
+ $this->keyManager->backupUserKeys('passwordReset', $uid);
+ $this->keyManager->deleteUserKeys($uid);
+ $this->userSetup->setupUser($uid, $password);
+ unset(self::$passwordResetUsers[$uid]);
+ }
+
/**
* If the password can't be changed within ownCloud, than update the key password in advance.
*
@@ -209,13 +242,10 @@ class UserHooks implements IHook {
* @return boolean|null
*/
public function preSetPassphrase($params) {
- if (App::isEnabled('encryption')) {
-
- $user = $this->userManager->get($params['uid']);
+ $user = $this->userManager->get($params['uid']);
- if ($user && !$user->canChangePassword()) {
- $this->setPassphrase($params);
- }
+ if ($user && !$user->canChangePassword()) {
+ $this->setPassphrase($params);
}
}
@@ -227,6 +257,12 @@ class UserHooks implements IHook {
*/
public function setPassphrase($params) {
+ // if we are in the process to resetting a user password, we have nothing
+ // to do here
+ if (isset(self::$passwordResetUsers[$params['uid']])) {
+ return true;
+ }
+
// Get existing decrypted private key
$privateKey = $this->session->getPrivateKey();
$user = $this->user->getUser();
@@ -299,19 +335,6 @@ class UserHooks implements IHook {
Filesystem::initMountPoints($user);
}
-
- /**
- * after password reset we create a new key pair for the user
- *
- * @param array $params
- */
- public function postPasswordReset($params) {
- $password = $params['password'];
-
- $this->keyManager->deleteUserKeys($params['uid']);
- $this->userSetup->setupUser($params['uid'], $password);
- }
-
/**
* setup file system for user
*
diff --git a/apps/encryption/lib/KeyManager.php b/apps/encryption/lib/KeyManager.php
index 26f023ed8f9..caae154b2d3 100644
--- a/apps/encryption/lib/KeyManager.php
+++ b/apps/encryption/lib/KeyManager.php
@@ -560,11 +560,10 @@ class KeyManager {
/**
* @param string $purpose
- * @param bool $timestamp
- * @param bool $includeUserKeys
+ * @param string $uid
*/
- public function backupAllKeys($purpose, $timestamp = true, $includeUserKeys = true) {
-// $backupDir = $this->keyStorage->;
+ public function backupUserKeys($purpose, $uid) {
+ $this->keyStorage->backupUserKeys(Encryption::ID, $purpose, $uid);
}
/**
@@ -573,7 +572,6 @@ class KeyManager {
* @param string $uid
*/
public function deleteUserKeys($uid) {
- $this->backupAllKeys('password_reset');
$this->deletePublicKey($uid);
$this->deletePrivateKey($uid);
}
diff --git a/apps/encryption/tests/Hooks/UserHooksTest.php b/apps/encryption/tests/Hooks/UserHooksTest.php
index 43cc54f8901..f9477e3e038 100644
--- a/apps/encryption/tests/Hooks/UserHooksTest.php
+++ b/apps/encryption/tests/Hooks/UserHooksTest.php
@@ -120,6 +120,31 @@ class UserHooksTest extends TestCase {
$this->assertTrue(true);
}
+ public function testPrePasswordReset() {
+ $params = ['uid' => 'user1'];
+ $expected = ['user1' => true];
+ $this->instance->prePasswordReset($params);
+ $passwordResetUsers = $this->invokePrivate($this->instance, 'passwordResetUsers');
+
+ $this->assertSame($expected, $passwordResetUsers);
+ }
+
+ public function testPostPasswordReset() {
+ $params = ['uid' => 'user1', 'password' => 'password'];
+ $this->invokePrivate($this->instance, 'passwordResetUsers', [['user1' => true]]);
+ $this->keyManagerMock->expects($this->once())->method('backupUserKeys')
+ ->with('passwordReset', 'user1');
+ $this->keyManagerMock->expects($this->once())->method('deleteUserKeys')
+ ->with('user1');
+ $this->userSetupMock->expects($this->once())->method('setupUser')
+ ->with('user1', 'password');
+
+ $this->instance->postPasswordReset($params);
+ $passwordResetUsers = $this->invokePrivate($this->instance, 'passwordResetUsers');
+ $this->assertEmpty($passwordResetUsers);
+
+ }
+
/**
* @dataProvider dataTestPreSetPassphrase
*/
@@ -252,6 +277,15 @@ class UserHooksTest extends TestCase {
$this->assertNull($this->instance->setPassphrase($this->params));
}
+ public function testSetPassphraseResetUserMode() {
+ $params = ['uid' => 'user1', 'password' => 'password'];
+ $this->invokePrivate($this->instance, 'passwordResetUsers', [[$params['uid'] => true]]);
+ $this->sessionMock->expects($this->never())->method('getPrivateKey');
+ $this->keyManagerMock->expects($this->never())->method('setPrivateKey');
+ $this->assertTrue($this->instance->setPassphrase($params));
+ $this->invokePrivate($this->instance, 'passwordResetUsers', [[]]);
+ }
+
public function testSetPasswordNoUser() {
$this->sessionMock->expects($this->once())
->method('getPrivateKey')
@@ -287,19 +321,6 @@ class UserHooksTest extends TestCase {
$this->assertNull($userHooks->setPassphrase($this->params));
}
- public function testPostPasswordReset() {
- $this->keyManagerMock->expects($this->once())
- ->method('deleteUserKeys')
- ->with('testUser');
-
- $this->userSetupMock->expects($this->once())
- ->method('setupUser')
- ->with('testUser', 'password');
-
- $this->instance->postPasswordReset($this->params);
- $this->assertTrue(true);
- }
-
protected function setUp() {
parent::setUp();
$this->loggerMock = $this->createMock(ILogger::class);
diff --git a/apps/encryption/tests/KeyManagerTest.php b/apps/encryption/tests/KeyManagerTest.php
index fec311afa35..40def135816 100644
--- a/apps/encryption/tests/KeyManagerTest.php
+++ b/apps/encryption/tests/KeyManagerTest.php
@@ -657,4 +657,10 @@ class KeyManagerTest extends TestCase {
$this->instance->setVersion('/admin/files/myfile.txt', 5, $view);
}
+ public function testBackupUserKeys() {
+ $this->keyStorageMock->expects($this->once())->method('backupUserKeys')
+ ->with('OC_DEFAULT_MODULE', 'test', 'user1');
+ $this->instance->backupUserKeys('test', 'user1');
+ }
+
}
diff --git a/apps/federatedfilesharing/l10n/cs_CZ.js b/apps/federatedfilesharing/l10n/cs_CZ.js
index b8189cb5b87..bb7b85319af 100644
--- a/apps/federatedfilesharing/l10n/cs_CZ.js
+++ b/apps/federatedfilesharing/l10n/cs_CZ.js
@@ -41,6 +41,7 @@ OC.L10N.register(
"Open documentation" : "Otevřít dokumentaci",
"Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
"Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů",
+ "Search global and public address book for users" : "Hledat uživatele v globálním a veřejném adresáři",
"Federated Cloud" : "Sdružený cloud",
"Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
"Share it:" : "Sdílet:",
diff --git a/apps/federatedfilesharing/l10n/cs_CZ.json b/apps/federatedfilesharing/l10n/cs_CZ.json
index 44f052e8a84..f2784299888 100644
--- a/apps/federatedfilesharing/l10n/cs_CZ.json
+++ b/apps/federatedfilesharing/l10n/cs_CZ.json
@@ -39,6 +39,7 @@
"Open documentation" : "Otevřít dokumentaci",
"Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
"Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů",
+ "Search global and public address book for users" : "Hledat uživatele v globálním a veřejném adresáři",
"Federated Cloud" : "Sdružený cloud",
"Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
"Share it:" : "Sdílet:",
diff --git a/apps/federatedfilesharing/l10n/de.js b/apps/federatedfilesharing/l10n/de.js
index ef4085d222a..1cf098f5b7e 100644
--- a/apps/federatedfilesharing/l10n/de.js
+++ b/apps/federatedfilesharing/l10n/de.js
@@ -41,7 +41,7 @@ OC.L10N.register(
"Open documentation" : "Dokumentation öffnen",
"Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
"Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Search global and public address book for users" : "Globale Suche und ein öffentliches Adresbuch für Nutzer",
+ "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Nutzer",
"Federated Cloud" : "Federated Cloud",
"Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:",
"Share it:" : "Zum Teilen:",
diff --git a/apps/federatedfilesharing/l10n/de.json b/apps/federatedfilesharing/l10n/de.json
index 4e02478be20..060aa326652 100644
--- a/apps/federatedfilesharing/l10n/de.json
+++ b/apps/federatedfilesharing/l10n/de.json
@@ -39,7 +39,7 @@
"Open documentation" : "Dokumentation öffnen",
"Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
"Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Search global and public address book for users" : "Globale Suche und ein öffentliches Adresbuch für Nutzer",
+ "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Nutzer",
"Federated Cloud" : "Federated Cloud",
"Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:",
"Share it:" : "Zum Teilen:",
diff --git a/apps/federatedfilesharing/l10n/de_DE.js b/apps/federatedfilesharing/l10n/de_DE.js
index 6bb9513d048..ff34a3cddcf 100644
--- a/apps/federatedfilesharing/l10n/de_DE.js
+++ b/apps/federatedfilesharing/l10n/de_DE.js
@@ -41,7 +41,7 @@ OC.L10N.register(
"Open documentation" : "Dokumentation öffnen",
"Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
"Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Search global and public address book for users" : "Globale Suche und ein öffentliches Adresbuch für Nutzer",
+ "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Nutzer",
"Federated Cloud" : "Federated Cloud",
"Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
"Share it:" : "Zum Teilen:",
diff --git a/apps/federatedfilesharing/l10n/de_DE.json b/apps/federatedfilesharing/l10n/de_DE.json
index 6a9be77cda4..9531d53b801 100644
--- a/apps/federatedfilesharing/l10n/de_DE.json
+++ b/apps/federatedfilesharing/l10n/de_DE.json
@@ -39,7 +39,7 @@
"Open documentation" : "Dokumentation öffnen",
"Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
"Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Search global and public address book for users" : "Globale Suche und ein öffentliches Adresbuch für Nutzer",
+ "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Nutzer",
"Federated Cloud" : "Federated Cloud",
"Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
"Share it:" : "Zum Teilen:",
diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js
index 4a1d7767965..092b87fb9e8 100644
--- a/apps/federatedfilesharing/l10n/fr.js
+++ b/apps/federatedfilesharing/l10n/fr.js
@@ -29,7 +29,7 @@ OC.L10N.register(
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Le partage de %s a échoué, impossible de trouver %s, le serveur est peut-être momentanément injoignable ou utilise un certificat auto-signé.",
"Could not find share" : "Impossible de trouver le partage",
- "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Vous avez reçu {share} comme partage distant de la part de {user} (de la part de {behalf})",
"You received \"%3$s\" as a remote share from %1$s" : "Vous avez reçu \"%3$s\" comme partage distant de %1$s",
"You received {share} as a remote share from {user}" : "Vous avez reçu {share} comme partage distant de la part de {user}",
diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json
index 670a3bd043c..f90620b940d 100644
--- a/apps/federatedfilesharing/l10n/fr.json
+++ b/apps/federatedfilesharing/l10n/fr.json
@@ -27,7 +27,7 @@
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
"Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Le partage de %s a échoué, impossible de trouver %s, le serveur est peut-être momentanément injoignable ou utilise un certificat auto-signé.",
"Could not find share" : "Impossible de trouver le partage",
- "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)",
"You received {share} as a remote share from {user} (on behalf of {behalf})" : "Vous avez reçu {share} comme partage distant de la part de {user} (de la part de {behalf})",
"You received \"%3$s\" as a remote share from %1$s" : "Vous avez reçu \"%3$s\" comme partage distant de %1$s",
"You received {share} as a remote share from {user}" : "Vous avez reçu {share} comme partage distant de la part de {user}",
diff --git a/apps/federatedfilesharing/l10n/sq.js b/apps/federatedfilesharing/l10n/sq.js
index ae500204ce4..4e55e171b81 100644
--- a/apps/federatedfilesharing/l10n/sq.js
+++ b/apps/federatedfilesharing/l10n/sq.js
@@ -2,13 +2,26 @@ OC.L10N.register(
"federatedfilesharing",
{
"Federated sharing" : "Ndarje e federuar",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Doni që të shtoni ndarjen në remote {name} nga {owner}@{remote}?",
+ "Remote share" : "Ndarje në largësi",
+ "Remote share password" : "Fjalëkalim ndarjeje të largët",
+ "Cancel" : "Anulo",
+ "Copy" : "Kopjo",
+ "Copied!" : "U kopjua!",
+ "Not supported!" : "Nuk mbështetet!",
+ "Press ⌘-C to copy." : "Shtyp ⌘-C për të kopjuar.",
+ "Press Ctrl-C to copy." : "Shtypni Ctrl-C për të kopjuar",
"Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme",
+ "Server to server sharing is not enabled on this server" : "Shpërndarja server në server nuk është e mundësuar në këtë server",
+ "Storage not valid" : "memorja nuk është e vlefshme",
+ "Couldn't add remote share" : "Nuk mund të shtohet ndarja në largësi",
"Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s",
"Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues",
- "File is already shared with %s" : "Kartelë e ndarë tashmë me %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
- "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s (në emër të %2$s)",
- "You received \"/%3$s\" as a remote share from %1$s" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s",
+ "File is already shared with %s" : "Skedari është ndarë tashmë me %s",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Ndarja e %s dështoi, nuk mund të gjendet %s, ndoshta serveri është për momentin i paaksesueshëm ose përdor një çertifikatë të vetë-nënshkruar",
+ "Could not find share" : "Nuk mund të gjenim ndarjen",
+ "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Ju ",
+ "You received \"%3$s\" as a remote share from %1$s" : "Ju pranuat \"%3$s\" si një shpërndarje në distancë nga %1$s",
"Accept" : "Pranoje",
"Decline" : "Hidhe poshtë",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #Nextcloud Federated Cloud, shihni %s",
@@ -22,6 +35,9 @@ OC.L10N.register(
"Share it:" : "Ndajeni:",
"Add to your website" : "Shtojeni te sajti juaj",
"Share with me via Nextcloud" : "Ndani me mua përmes Nextcloud-it",
- "HTML Code:" : "Kod HTML:"
+ "HTML Code:" : "Kod HTML:",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
+ "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s (në emër të %2$s)",
+ "You received \"/%3$s\" as a remote share from %1$s" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/sq.json b/apps/federatedfilesharing/l10n/sq.json
index 57961c2c2ae..07858aa6434 100644
--- a/apps/federatedfilesharing/l10n/sq.json
+++ b/apps/federatedfilesharing/l10n/sq.json
@@ -1,12 +1,25 @@
{ "translations": {
"Federated sharing" : "Ndarje e federuar",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Doni që të shtoni ndarjen në remote {name} nga {owner}@{remote}?",
+ "Remote share" : "Ndarje në largësi",
+ "Remote share password" : "Fjalëkalim ndarjeje të largët",
+ "Cancel" : "Anulo",
+ "Copy" : "Kopjo",
+ "Copied!" : "U kopjua!",
+ "Not supported!" : "Nuk mbështetet!",
+ "Press ⌘-C to copy." : "Shtyp ⌘-C për të kopjuar.",
+ "Press Ctrl-C to copy." : "Shtypni Ctrl-C për të kopjuar",
"Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme",
+ "Server to server sharing is not enabled on this server" : "Shpërndarja server në server nuk është e mundësuar në këtë server",
+ "Storage not valid" : "memorja nuk është e vlefshme",
+ "Couldn't add remote share" : "Nuk mund të shtohet ndarja në largësi",
"Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s",
"Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues",
- "File is already shared with %s" : "Kartelë e ndarë tashmë me %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
- "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s (në emër të %2$s)",
- "You received \"/%3$s\" as a remote share from %1$s" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s",
+ "File is already shared with %s" : "Skedari është ndarë tashmë me %s",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Ndarja e %s dështoi, nuk mund të gjendet %s, ndoshta serveri është për momentin i paaksesueshëm ose përdor një çertifikatë të vetë-nënshkruar",
+ "Could not find share" : "Nuk mund të gjenim ndarjen",
+ "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Ju ",
+ "You received \"%3$s\" as a remote share from %1$s" : "Ju pranuat \"%3$s\" si një shpërndarje në distancë nga %1$s",
"Accept" : "Pranoje",
"Decline" : "Hidhe poshtë",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #Nextcloud Federated Cloud, shihni %s",
@@ -20,6 +33,9 @@
"Share it:" : "Ndajeni:",
"Add to your website" : "Shtojeni te sajti juaj",
"Share with me via Nextcloud" : "Ndani me mua përmes Nextcloud-it",
- "HTML Code:" : "Kod HTML:"
+ "HTML Code:" : "Kod HTML:",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
+ "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s (në emër të %2$s)",
+ "You received \"/%3$s\" as a remote share from %1$s" : "\"/%3$s\" e morët si një ndarje të largët prej %1$s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sv.js b/apps/federatedfilesharing/l10n/sv.js
index f205f0b5741..0f5b0798825 100644
--- a/apps/federatedfilesharing/l10n/sv.js
+++ b/apps/federatedfilesharing/l10n/sv.js
@@ -43,7 +43,7 @@ OC.L10N.register(
"Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
"Search global and public address book for users" : "Sök global och offentlig adressbok för användare",
"Federated Cloud" : "Federerat Moln",
- "Your Federated Cloud ID:" : "Ditt Federerade Moln-ID",
+ "Your Federated Cloud ID:" : "Ditt Federerade Moln-ID:",
"Share it:" : "Dela detta:",
"Add to your website" : "Lägg till på din hemsida",
"Share with me via Nextcloud" : "Dela med mig via Nextcloud",
diff --git a/apps/federatedfilesharing/l10n/sv.json b/apps/federatedfilesharing/l10n/sv.json
index 47c8ebf23b7..5eff9e9f0d2 100644
--- a/apps/federatedfilesharing/l10n/sv.json
+++ b/apps/federatedfilesharing/l10n/sv.json
@@ -41,7 +41,7 @@
"Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
"Search global and public address book for users" : "Sök global och offentlig adressbok för användare",
"Federated Cloud" : "Federerat Moln",
- "Your Federated Cloud ID:" : "Ditt Federerade Moln-ID",
+ "Your Federated Cloud ID:" : "Ditt Federerade Moln-ID:",
"Share it:" : "Dela detta:",
"Add to your website" : "Lägg till på din hemsida",
"Share with me via Nextcloud" : "Dela med mig via Nextcloud",
diff --git a/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php b/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php
index 55329338a92..3c399268124 100644
--- a/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php
+++ b/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php
@@ -25,18 +25,24 @@
namespace OCA\FederatedFileSharing\Controller;
+use OC\Files\Filesystem;
use OC\HintException;
+use OC\Share\Helper;
use OCA\FederatedFileSharing\AddressHandler;
+use OCA\FederatedFileSharing\DiscoveryManager;
use OCA\FederatedFileSharing\FederatedShareProvider;
+use OCA\Files_Sharing\External\Manager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
+use OCP\Files\StorageInvalidException;
use OCP\Http\Client\IClientService;
use OCP\IL10N;
use OCP\IRequest;
use OCP\ISession;
use OCP\IUserSession;
use OCP\Share\IManager;
+use OCP\Util;
/**
* Class MountPublicLinkController
@@ -107,6 +113,7 @@ class MountPublicLinkController extends Controller {
*
* @NoCSRFRequired
* @PublicPage
+ * @BruteForceProtection publicLink2FederatedShare
*
* @param string $shareWith
* @param string $token
@@ -226,22 +233,22 @@ class MountPublicLinkController extends Controller {
private function legacyMountPublicLink($token, $remote, $password, $name, $owner, $ownerDisplayName) {
// Check for invalid name
- if (!\OCP\Util::isValidFileName($name)) {
+ if (!Util::isValidFileName($name)) {
return new JSONResponse(['message' => $this->l->t('The mountpoint name contains invalid characters.')], Http::STATUS_BAD_REQUEST);
}
$currentUser = $this->userSession->getUser()->getUID();
$currentServer = $this->addressHandler->generateRemoteURL();
- if (\OC\Share\Helper::isSameUserOnSameServer($owner, $remote, $currentUser, $currentServer)) {
+ if (Helper::isSameUserOnSameServer($owner, $remote, $currentUser, $currentServer)) {
return new JSONResponse(['message' => $this->l->t('Not allowed to create a federated share with the owner.')], Http::STATUS_BAD_REQUEST);
}
- $discoveryManager = new \OCA\FederatedFileSharing\DiscoveryManager(
+ $discoveryManager = new DiscoveryManager(
\OC::$server->getMemCacheFactory(),
\OC::$server->getHTTPClientService()
);
- $externalManager = new \OCA\Files_Sharing\External\Manager(
+ $externalManager = new Manager(
\OC::$server->getDatabaseConnection(),
- \OC\Files\Filesystem::getMountManager(),
- \OC\Files\Filesystem::getLoader(),
+ Filesystem::getMountManager(),
+ Filesystem::getLoader(),
\OC::$server->getHTTPClientService(),
\OC::$server->getNotificationManager(),
$discoveryManager,
@@ -249,7 +256,8 @@ class MountPublicLinkController extends Controller {
);
// check for ssl cert
- if (substr($remote, 0, 5) === 'https') {
+
+ if (strpos($remote, 'https') === 0) {
try {
$client = $this->clientService->newClient();
$client->get($remote, [
@@ -268,19 +276,19 @@ class MountPublicLinkController extends Controller {
try {
// check if storage exists
$storage->checkStorageAvailability();
- } catch (\OCP\Files\StorageInvalidException $e) {
+ } catch (StorageInvalidException $e) {
// note: checkStorageAvailability will already remove the invalid share
- \OCP\Util::writeLog(
+ Util::writeLog(
'federatedfilesharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
- \OCP\Util::DEBUG
+ Util::DEBUG
);
return new JSONResponse(['message' => $this->l->t('Could not authenticate to remote share, password might be wrong')], Http::STATUS_BAD_REQUEST);
} catch (\Exception $e) {
- \OCP\Util::writeLog(
+ Util::writeLog(
'federatedfilesharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
- \OCP\Util::DEBUG
+ Util::DEBUG
);
$externalManager->removeShare($mount->getMountPoint());
return new JSONResponse(['message' => $this->l->t('Storage not valid')], Http::STATUS_BAD_REQUEST);
@@ -295,27 +303,27 @@ class MountPublicLinkController extends Controller {
'legacyMount' => '1'
]
);
- } catch (\OCP\Files\StorageInvalidException $e) {
- \OCP\Util::writeLog(
+ } catch (StorageInvalidException $e) {
+ Util::writeLog(
'federatedfilesharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
- \OCP\Util::DEBUG
+ Util::DEBUG
);
return new JSONResponse(['message' => $this->l->t('Storage not valid')], Http::STATUS_BAD_REQUEST);
} catch (\Exception $e) {
- \OCP\Util::writeLog(
+ Util::writeLog(
'federatedfilesharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
- \OCP\Util::DEBUG
+ Util::DEBUG
);
return new JSONResponse(['message' => $this->l->t('Couldn\'t add remote share')], Http::STATUS_BAD_REQUEST);
}
} else {
$externalManager->removeShare($mount->getMountPoint());
- \OCP\Util::writeLog(
+ Util::writeLog(
'federatedfilesharing',
'Couldn\'t add remote share',
- \OCP\Util::DEBUG
+ Util::DEBUG
);
return new JSONResponse(['message' => $this->l->t('Couldn\'t add remote share')], Http::STATUS_BAD_REQUEST);
}
diff --git a/apps/federation/l10n/cs_CZ.js b/apps/federation/l10n/cs_CZ.js
index 529cf164bfd..df0f9bbfb41 100644
--- a/apps/federation/l10n/cs_CZ.js
+++ b/apps/federation/l10n/cs_CZ.js
@@ -8,6 +8,9 @@ OC.L10N.register(
"Federation" : "Sdružování",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Sdružování vám umožňuje se připojit k dalším důvěryhodným serverům za účelem výměny uživatelských adresářů. Používá se to např. pro automatické doplňování uživatelů při sdruženém sdílení.",
"Add server automatically once a federated share was created successfully" : "Přidat server automaticky jakmile je úspěšně vytvořeno sdružené sdílení",
+ "Trusted servers" : "Důvěryhodné servery",
+ "+ Add trusted server" : "+ Přidat důvěryhodný server",
+ "Trusted server" : "Důvěryhodný server",
"Add" : "Přidat",
"Trusted Servers" : "Důvěryhodné servery",
"+ Add Nextcloud server" : "+ Přidat Nextcloud server",
diff --git a/apps/federation/l10n/cs_CZ.json b/apps/federation/l10n/cs_CZ.json
index ccbc912ef5e..f28d002dc44 100644
--- a/apps/federation/l10n/cs_CZ.json
+++ b/apps/federation/l10n/cs_CZ.json
@@ -6,6 +6,9 @@
"Federation" : "Sdružování",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Sdružování vám umožňuje se připojit k dalším důvěryhodným serverům za účelem výměny uživatelských adresářů. Používá se to např. pro automatické doplňování uživatelů při sdruženém sdílení.",
"Add server automatically once a federated share was created successfully" : "Přidat server automaticky jakmile je úspěšně vytvořeno sdružené sdílení",
+ "Trusted servers" : "Důvěryhodné servery",
+ "+ Add trusted server" : "+ Přidat důvěryhodný server",
+ "Trusted server" : "Důvěryhodný server",
"Add" : "Přidat",
"Trusted Servers" : "Důvěryhodné servery",
"+ Add Nextcloud server" : "+ Přidat Nextcloud server",
diff --git a/apps/files/css/mobile.css b/apps/files/css/mobile.css
index 2de99689839..4a37bf15a4b 100644
--- a/apps/files/css/mobile.css
+++ b/apps/files/css/mobile.css
@@ -58,7 +58,7 @@ table td.filename .nametext {
/* ellipsis on file names */
table td.filename .nametext .innernametext {
- max-width: 50%;
+ max-width: calc(100% - 175px);
}
/* proper notification area for multi line messages */
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index cd0eb390ee3..bb50814dfdc 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -1180,7 +1180,7 @@
var innernameSpan = $('<span></span>').addClass('innernametext').text(basename);
if (path && path !== '/') {
- var conflictingItems = this.$fileList.find('tr[data-file="' + name.replace( /(:|\.|\[|\]|,|=)/g, "\\$1") + '"]');
+ var conflictingItems = this.$fileList.find('tr[data-file="' + this._jqSelEscape(name) + '"]');
if (conflictingItems.length !== 0) {
if (conflictingItems.length === 1) {
// Update the path on the first conflicting item
@@ -1266,6 +1266,14 @@
return tr;
},
+ /* escape a selector expression for jQuery */
+ _jqSelEscape: function (expression) {
+ if (expression) {
+ return expression.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
+ }
+ return null;
+ },
+
/**
* Adds an entry to the files array and also into the DOM
* in a sorted manner.
diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js
index d2fea9773f0..0acc6a31af2 100644
--- a/apps/files/l10n/cs_CZ.js
+++ b/apps/files/l10n/cs_CZ.js
@@ -28,6 +28,7 @@ OC.L10N.register(
"Delete" : "Smazat",
"Disconnect storage" : "Odpojit úložiště",
"Unshare" : "Zrušit sdílení",
+ "Could not load info for file \"{file}\"" : "Nepodařilo se načíst informace pro soubor {file}",
"Details" : "Podrobnosti",
"Select" : "Vybrat",
"Pending" : "Nevyřízené",
@@ -72,7 +73,31 @@ OC.L10N.register(
"New folder" : "Nový adresář",
"Upload" : "Odeslat",
"An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba",
+ "Added to favorites" : "Přidán k oblíbeným",
+ "Removed from favorites" : "Odebráno z oblíbených",
+ "You added {file} to your favorites" : "Do svých oblíbených jste přidal(a) {file}",
+ "You removed {file} from your favorites" : "Odstranil(a) jste {file} ze svých oblíbených",
"File changes" : "Změny souboru",
+ "Created by {user}" : "Vytvořil {user}",
+ "Changed by {user}" : "Změnil {user}",
+ "Deleted by {user}" : "Odstranil {user}",
+ "Restored by {user}" : "Obnovil {user}",
+ "Renamed by {user}" : "Přejmenoval {user}",
+ "Moved by {user}" : "Přesunul {user}",
+ "You created {file}" : "Vytvořil(a) jste {file}",
+ "{user} created {file}" : "{user} vytvořil(a) {file}",
+ "{file} was created in a public folder" : "Soubor {file} byl vytvořen ve veřejné složce",
+ "You changed {file}" : "Změnil(a) jste {file}",
+ "{user} changed {file}" : "{user} změnil(a) {file}",
+ "You deleted {file}" : "Odstranil(a) jste {file}",
+ "{user} deleted {file}" : "{user} smazal(a) {file}",
+ "You restored {file}" : "Obnovil(a) jste {file}",
+ "{user} restored {file}" : "{user} obnovil {file}",
+ "You renamed {oldfile} to {newfile}" : "Přejmenoval(a) jste {oldfile} na {newfile}",
+ "{user} renamed {oldfile} to {newfile}" : "{user} přejmenoval {oldfile} na {newfile}",
+ "You moved {oldfile} to {newfile}" : "{oldfile} jste přesunul(a) do {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} přesunul(a) {oldfile} do {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Soubor byl přidán, nebo odstraněn z vašich <strong>oblíbených</strong>",
"A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong> nebo <strong>přejmenován</strong>",
"A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo adresář",
"A new file or folder has been <strong>deleted</strong>" : "Nový soubor nebo adresář byl <strong>smazán</strong>",
diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json
index 19f05a04bc4..49d2855cc2e 100644
--- a/apps/files/l10n/cs_CZ.json
+++ b/apps/files/l10n/cs_CZ.json
@@ -26,6 +26,7 @@
"Delete" : "Smazat",
"Disconnect storage" : "Odpojit úložiště",
"Unshare" : "Zrušit sdílení",
+ "Could not load info for file \"{file}\"" : "Nepodařilo se načíst informace pro soubor {file}",
"Details" : "Podrobnosti",
"Select" : "Vybrat",
"Pending" : "Nevyřízené",
@@ -70,7 +71,31 @@
"New folder" : "Nový adresář",
"Upload" : "Odeslat",
"An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba",
+ "Added to favorites" : "Přidán k oblíbeným",
+ "Removed from favorites" : "Odebráno z oblíbených",
+ "You added {file} to your favorites" : "Do svých oblíbených jste přidal(a) {file}",
+ "You removed {file} from your favorites" : "Odstranil(a) jste {file} ze svých oblíbených",
"File changes" : "Změny souboru",
+ "Created by {user}" : "Vytvořil {user}",
+ "Changed by {user}" : "Změnil {user}",
+ "Deleted by {user}" : "Odstranil {user}",
+ "Restored by {user}" : "Obnovil {user}",
+ "Renamed by {user}" : "Přejmenoval {user}",
+ "Moved by {user}" : "Přesunul {user}",
+ "You created {file}" : "Vytvořil(a) jste {file}",
+ "{user} created {file}" : "{user} vytvořil(a) {file}",
+ "{file} was created in a public folder" : "Soubor {file} byl vytvořen ve veřejné složce",
+ "You changed {file}" : "Změnil(a) jste {file}",
+ "{user} changed {file}" : "{user} změnil(a) {file}",
+ "You deleted {file}" : "Odstranil(a) jste {file}",
+ "{user} deleted {file}" : "{user} smazal(a) {file}",
+ "You restored {file}" : "Obnovil(a) jste {file}",
+ "{user} restored {file}" : "{user} obnovil {file}",
+ "You renamed {oldfile} to {newfile}" : "Přejmenoval(a) jste {oldfile} na {newfile}",
+ "{user} renamed {oldfile} to {newfile}" : "{user} přejmenoval {oldfile} na {newfile}",
+ "You moved {oldfile} to {newfile}" : "{oldfile} jste přesunul(a) do {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} přesunul(a) {oldfile} do {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Soubor byl přidán, nebo odstraněn z vašich <strong>oblíbených</strong>",
"A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong> nebo <strong>přejmenován</strong>",
"A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo adresář",
"A new file or folder has been <strong>deleted</strong>" : "Nový soubor nebo adresář byl <strong>smazán</strong>",
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index afd1f8142c2..8b373e82894 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -76,7 +76,7 @@ OC.L10N.register(
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Du hast {file} zu deinen Favoriten hinzugefügt",
- "You removed {file} from your favorites" : "Du hast {file} aus deinen Favoriten hentfernt",
+ "You removed {file} from your favorites" : "Du hast {file} aus deinen Favoriten entfernt",
"File changes" : "Dateiänderungen",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 30a2730b47c..8b131cd728d 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -74,7 +74,7 @@
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Du hast {file} zu deinen Favoriten hinzugefügt",
- "You removed {file} from your favorites" : "Du hast {file} aus deinen Favoriten hentfernt",
+ "You removed {file} from your favorites" : "Du hast {file} aus deinen Favoriten entfernt",
"File changes" : "Dateiänderungen",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 9ef2aed2802..17961360c98 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -76,7 +76,7 @@ OC.L10N.register(
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Sie haben {file} zu Ihren Favoriten hinzugefügt",
- "You removed {file} from your favorites" : "Sie haben {file} aus Ihren Favoriten hentfernt",
+ "You removed {file} from your favorites" : "Sie haben {file} aus Ihren Favoriten entfernt",
"File changes" : "Datei geändert",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 3466d7ebd9a..926434c523c 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -74,7 +74,7 @@
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Sie haben {file} zu Ihren Favoriten hinzugefügt",
- "You removed {file} from your favorites" : "Sie haben {file} aus Ihren Favoriten hentfernt",
+ "You removed {file} from your favorites" : "Sie haben {file} aus Ihren Favoriten entfernt",
"File changes" : "Datei geändert",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index dcd0928ca25..123dcfdaa1a 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -1,24 +1,24 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Le support de stockage est temporairement non disponible",
- "Storage invalid" : "Support de stockage non valable",
+ "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
+ "Storage invalid" : "Support de stockage invalide",
"Unknown error" : "Erreur inconnue ",
"Files" : "Fichiers",
"All files" : "Tous les fichiers",
"Recent" : "Récent",
- "File could not be found" : "Ce fichier n'a pu être trouvé.",
+ "File could not be found" : "Fichier introuvable",
"Home" : "Mes fichiers",
"Close" : "Fermer",
"Favorites" : "Favoris",
"Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
- "Upload cancelled." : "Envoi annulé.",
+ "Upload cancelled." : "Téléversement annulé.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles",
"Target folder \"{dir}\" does not exist any more" : "Le dossier cible « {dir} » n'existe plus",
- "Not enough free space" : "Pas assez d'espace disponible",
+ "Not enough free space" : "Espace disponible insuffisant",
"Uploading..." : "Téléversement en cours…",
- "..." : "...",
+ "..." : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
"Actions" : "Actions",
"Download" : "Télécharger",
@@ -34,7 +34,7 @@ OC.L10N.register(
"Pending" : "En attente",
"Unable to determine date" : "Impossible de déterminer la date",
"This operation is forbidden" : "Cette opération est interdite",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ce dossier n'est pas disponible. Consultez les logs ou contactez votre administrateur",
"Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe",
"Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
"{newName} already exists" : "{newName} existe déjà",
@@ -53,13 +53,13 @@ OC.L10N.register(
"_%n file_::_%n files_" : ["%n fichier","%n fichiers"],
"{dirs} and {files}" : "{dirs} et {files}",
"_including %n hidden_::_including %n hidden_" : ["inclus %n caché","inclus %n cachés"],
- "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'ajouter des fichiers ici",
+ "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici",
"_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"],
"New" : "Nouveau",
"\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.",
"File name cannot be empty." : "Le nom de fichier ne peut être vide.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ou synchronisés!",
- "Your storage is full, files can not be updated or synced anymore!" : "Votre espage de stockage est plein, les fichiers ne peuvent plus être ajoutés ou synchronisés !",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être ajoutés ni synchronisés !",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "L'espace de stockage de {owner} est presque plein ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Votre espace de stockage est presque plein ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["correspond à '{filter}'","correspondent à '{filter}'"],
@@ -133,7 +133,7 @@ OC.L10N.register(
"Unable to set upload directory." : "Impossible de définir le dossier de destination.",
"Invalid Token" : "Jeton non valide",
"No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue",
- "There is no error, the file uploaded with success" : "Aucune erreur, le fichier a été envoyé avec succès.",
+ "There is no error, the file uploaded with success" : "Aucune erreur, le fichier a été envoyé avec succès",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini :",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui était spécifiée dans le formulaire HTML.",
"The uploaded file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé.",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index e990093bbbb..8645a644dd7 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -1,22 +1,22 @@
{ "translations": {
- "Storage is temporarily not available" : "Le support de stockage est temporairement non disponible",
- "Storage invalid" : "Support de stockage non valable",
+ "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
+ "Storage invalid" : "Support de stockage invalide",
"Unknown error" : "Erreur inconnue ",
"Files" : "Fichiers",
"All files" : "Tous les fichiers",
"Recent" : "Récent",
- "File could not be found" : "Ce fichier n'a pu être trouvé.",
+ "File could not be found" : "Fichier introuvable",
"Home" : "Mes fichiers",
"Close" : "Fermer",
"Favorites" : "Favoris",
"Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
- "Upload cancelled." : "Envoi annulé.",
+ "Upload cancelled." : "Téléversement annulé.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles",
"Target folder \"{dir}\" does not exist any more" : "Le dossier cible « {dir} » n'existe plus",
- "Not enough free space" : "Pas assez d'espace disponible",
+ "Not enough free space" : "Espace disponible insuffisant",
"Uploading..." : "Téléversement en cours…",
- "..." : "...",
+ "..." : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
"Actions" : "Actions",
"Download" : "Télécharger",
@@ -32,7 +32,7 @@
"Pending" : "En attente",
"Unable to determine date" : "Impossible de déterminer la date",
"This operation is forbidden" : "Cette opération est interdite",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ce dossier n'est pas disponible. Consultez les logs ou contactez votre administrateur",
"Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe",
"Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
"{newName} already exists" : "{newName} existe déjà",
@@ -51,13 +51,13 @@
"_%n file_::_%n files_" : ["%n fichier","%n fichiers"],
"{dirs} and {files}" : "{dirs} et {files}",
"_including %n hidden_::_including %n hidden_" : ["inclus %n caché","inclus %n cachés"],
- "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'ajouter des fichiers ici",
+ "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici",
"_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"],
"New" : "Nouveau",
"\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.",
"File name cannot be empty." : "Le nom de fichier ne peut être vide.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ou synchronisés!",
- "Your storage is full, files can not be updated or synced anymore!" : "Votre espage de stockage est plein, les fichiers ne peuvent plus être ajoutés ou synchronisés !",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être ajoutés ni synchronisés !",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "L'espace de stockage de {owner} est presque plein ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Votre espace de stockage est presque plein ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["correspond à '{filter}'","correspondent à '{filter}'"],
@@ -131,7 +131,7 @@
"Unable to set upload directory." : "Impossible de définir le dossier de destination.",
"Invalid Token" : "Jeton non valide",
"No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue",
- "There is no error, the file uploaded with success" : "Aucune erreur, le fichier a été envoyé avec succès.",
+ "There is no error, the file uploaded with success" : "Aucune erreur, le fichier a été envoyé avec succès",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini :",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui était spécifiée dans le formulaire HTML.",
"The uploaded file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé.",
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 2325929ac21..a3dbb702802 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -75,7 +75,7 @@ OC.L10N.register(
"An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna",
"Added to favorites" : "Lades till i favoriter",
"Removed from favorites" : "Togs bort från favoriter",
- "You added {file} to your favorites" : "Du lade till {file} till dina favoriter",
+ "You added {file} to your favorites" : "Du la till {file} till dina favoriter",
"You removed {file} from your favorites" : "Du tog bort {file} från dina favoriter",
"File changes" : "Filändringar",
"Created by {user}" : "Skapad av {user}",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index cb66007b384..dbee5345bf0 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -73,7 +73,7 @@
"An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna",
"Added to favorites" : "Lades till i favoriter",
"Removed from favorites" : "Togs bort från favoriter",
- "You added {file} to your favorites" : "Du lade till {file} till dina favoriter",
+ "You added {file} to your favorites" : "Du la till {file} till dina favoriter",
"You removed {file} from your favorites" : "Du tog bort {file} från dina favoriter",
"File changes" : "Filändringar",
"Created by {user}" : "Skapad av {user}",
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 8f053b231d6..0a8e66d18c9 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -1,82 +1,82 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "存储器当前无法访问",
+ "Storage is temporarily not available" : "存储暂时不可用",
"Storage invalid" : "存储空间无效",
"Unknown error" : "未知错误",
"Files" : "文件",
"All files" : "全部文件",
"Recent" : "最近",
"File could not be found" : "文件未找到",
- "Home" : "家庭",
+ "Home" : "首页",
"Close" : "关闭",
"Favorites" : "收藏",
- "Could not create folder \"{dir}\"" : "不能创建文件夹 \"{dir}\"",
+ "Could not create folder \"{dir}\"" : "无法创建文件夹 \"{dir}\"",
"Upload cancelled." : "上传已取消",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。",
- "Target folder \"{dir}\" does not exist any more" : "目标目录\"{dir}\" 不存在",
- "Not enough free space" : "没有足够空间",
- "Uploading..." : "上传中...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传文件 {filename}, 因为其是一个目录或者长度为0字节",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足, 您上传的文件大小为 {size1}, 但可用空间仅剩 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
+ "Not enough free space" : "可用空间不足",
+ "Uploading..." : "正在上传...",
"..." : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Actions" : "动作",
+ "Actions" : "操作",
"Download" : "下载",
"Rename" : "重命名",
"Move" : "移动",
"Target folder" : "目标目录",
"Delete" : "删除",
- "Disconnect storage" : "断开储存连接",
+ "Disconnect storage" : "断开存储链接",
"Unshare" : "取消共享",
- "Could not load info for file \"{file}\"" : "无法载入\"{file}\"文件信息",
+ "Could not load info for file \"{file}\"" : "无法加载 \"{file}\" 文件信息",
"Details" : "详细信息",
"Select" : "选择",
"Pending" : "等待",
"Unable to determine date" : "无法确定日期",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。",
- "Could not move \"{file}\"" : "不能移动 \"{file}\"",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
+ "Could not move \"{file}\", target exists" : "无法移动 \"{file}\", 目标已存在",
+ "Could not move \"{file}\"" : "无法移动 \"{file}\"",
"{newName} already exists" : "{newname} 已经存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "不能重命名 \"{fileName}\",此文件已经不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。",
- "Could not rename \"{fileName}\"" : "不能重命名 \"{fileName}\"",
- "Could not create file \"{file}\"" : "不能创建文件 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "不能创建文件 \"{file}\" ,因为它已经存在",
- "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在",
- "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
- "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}'标签的结果",
+ "Could not rename \"{fileName}\", it does not exist any more" : "无法重命名 \"{fileName}\", 此文件已经不存在",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "文件夹 \"{dir}\" 中已经存在 \"{targetName}\". 请尝试其他的名称.",
+ "Could not rename \"{fileName}\"" : "无法重命名 \"{fileName}\"",
+ "Could not create file \"{file}\"" : "无法创建文件 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "无法创建文件 \"{file}\", 因为其已经存在",
+ "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹 \"{dir}\", 因为其已经存在",
+ "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错.",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}' 标签的结果",
"Name" : "名称",
"Size" : "大小",
"Modified" : "修改日期",
- "_%n folder_::_%n folders_" : ["%n 文件夹"],
+ "_%n folder_::_%n folders_" : ["%n 个文件夹"],
"_%n file_::_%n files_" : ["%n个文件"],
"{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 隐藏的"],
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
"You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件",
"_Uploading %n file_::_Uploading %n files_" : ["上传 %n 个文件"],
"New" : "新建",
- "\"{name}\" is an invalid file name." : "“{name}”是一个无效的文件名。",
- "File name cannot be empty." : "文件名不能为空。",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满,文件将无法更新或同步!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
+ "\"{name}\" is an invalid file name." : "\"{name}\" 是一个无效的文件名",
+ "File name cannot be empty." : "文件名不能为空.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满, 文件将无法更新或同步!",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满, 文件将无法更新或同步!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} 的存储空间即将用完 ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "您的存储空间即将用完 ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["匹配“{filter}”"],
- "View in folder" : "在文件夹里查看",
+ "_matches '{filter}'_::_match '{filter}'_" : ["匹配 '{filter}'"],
+ "View in folder" : "在文件夹中查看",
"Path" : "路径",
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
"Copy local link" : "复制本地链接",
"Folder" : "文件夹",
- "New folder" : "增加文件夹",
+ "New folder" : "新建文件夹",
"Upload" : "上传",
"An error occurred while trying to update the tags" : "更新标签时出错",
"Added to favorites" : "添加到收藏",
"Removed from favorites" : "取消收藏",
- "You added {file} to your favorites" : "您添加了 {file} 文件到您的收藏夹",
- "You removed {file} from your favorites" : "您从您的收藏夹删除了 {file} 文件",
+ "You added {file} to your favorites" : "您已经添加 {file} 到您的收藏夹",
+ "You removed {file} from your favorites" : "您已从收藏夹中删除 {file}",
"File changes" : "文件发生变化",
"Created by {user}" : "由 {user} 创建",
"Changed by {user}" : "由 {user} 更改",
@@ -97,29 +97,29 @@ OC.L10N.register(
"{user} renamed {oldfile} to {newfile}" : "{user} 将 {oldfile} 改名为 {newfile}",
"You moved {oldfile} to {newfile}" : "您移动 {oldfile} 到 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 移动 {oldfile} 到 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "一个文件从您的 <strong>收藏夹</strong> 添加或者删除",
- "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "一个文件或者文件夹被 <strong>更改</strong> 或者 <strong>重命名</strong>",
- "A new file or folder has been <strong>created</strong>" : "一个新的文件或文件夹已被<strong>创建</strong>",
- "A new file or folder has been <strong>deleted</strong>" : "一个新文件或者文件夹被 <strong>删除</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "针对<strong>已收藏文件</strong>的新建和修改发送有限的通知 <em>(仅流)</em>",
- "A new file or folder has been <strong>restored</strong>" : "一个新文件或者文件夹被<strong>恢复</strong>",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的 <strong>收藏夹</strong> 中",
+ "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "文件/文件夹已经 <strong>更改</strong> 或者 <strong>重命名</strong>",
+ "A new file or folder has been <strong>created</strong>" : "新的文件/文件夹已经 <strong>创建</strong>",
+ "A new file or folder has been <strong>deleted</strong>" : "新的文件/文件夹已经 <strong>删除</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "仅限 <strong>收藏文件</strong>的创建和更改通知 <em>(仅限流)</em>",
+ "A new file or folder has been <strong>restored</strong>" : "新的文件/文件夹已经<strong>恢复</strong>",
"Upload (max. %s)" : "上传 (最大 %s)",
"File handling" : "文件处理",
"Maximum upload size" : "最大上传大小",
"max. possible: " : "最大允许: ",
"Save" : "保存",
- "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。",
- "Missing permissions to edit from here." : "没有从这里进行编辑的权限",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
+ "Missing permissions to edit from here." : "没有权限编辑",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">通过 WebDAV 访问您的文件</a>",
"No files in here" : "无文件",
- "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
- "No entries found in this folder" : "此文件夹中无项目",
+ "Upload some content or sync with your devices!" : "上传或从您的设备中同步!",
+ "No entries found in this folder" : "文件夹中无项目",
"Select all" : "全部选择",
"Upload too large" : "上传文件过大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "正在上传的文件超过了此服务器允许上传的最大容量限制",
"No favorites" : "无收藏",
"Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
"Shared with you" : "与您分享",
@@ -130,43 +130,43 @@ OC.L10N.register(
"Text file" : "文本文件",
"New text file.txt" : "创建文本文件 .txt",
"Storage not available" : "存储空间不可用",
- "Unable to set upload directory." : "无法设置上传文件夹。",
+ "Unable to set upload directory." : "无法设置上传文件夹.",
"Invalid Token" : "无效密匙",
- "No file was uploaded. Unknown error" : "没有文件被上传。未知错误",
- "There is no error, the file uploaded with success" : "文件上传成功,没有错误发生",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件大小已超过php.ini中upload_max_filesize所规定的值",
+ "No file was uploaded. Unknown error" : "没有文件被上传. 未知错误",
+ "There is no error, the file uploaded with success" : "文件上传成功, 没有任何错误",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件的大小已超过 php.ini 中 upload_max_filesize 设置的值",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上传的文件长度超出了 HTML 表单中 MAX_FILE_SIZE 的限制",
- "The uploaded file was only partially uploaded" : "已上传文件只上传了部分(不完整)",
+ "The uploaded file was only partially uploaded" : "文件仅部分上传",
"No file was uploaded" : "没有文件被上传",
- "Missing a temporary folder" : "缺少临时目录",
+ "Missing a temporary folder" : "临时目录缺失",
"Failed to write to disk" : "写入磁盘失败",
"Not enough storage available" : "没有足够的存储空间",
- "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。",
- "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件",
- "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。",
- "Invalid directory." : "无效文件夹。",
+ "The target folder has been moved or deleted." : "目标文件夹已被移动或删除.",
+ "Upload failed. Could not find uploaded file" : "上传失败. 未发现上传的文件",
+ "Upload failed. Could not get file info." : "上传失败. 无法获取文件信息.",
+ "Invalid directory." : "无效文件夹.",
"Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}",
"Error uploading file \"{fileName}\": {message}" : "上传文件错误 \"{fileName}\": {message}",
- "Could not get result from server." : "不能从服务器得到结果",
- "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间:{hours}:{minutes}:{seconds} ",
+ "Could not get result from server." : "无法从服务器获取结果",
+ "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间: {hours}:{minutes}:{seconds} ",
"{hours}:{minutes}h" : "{hours}:{minutes}",
- "{minutes}:{seconds} minute{plural_s} left" : "剩余分钟:{minutes}:{seconds} ",
+ "{minutes}:{seconds} minute{plural_s} left" : "剩余 {minutes}:{seconds} 分钟",
"{minutes}:{seconds}m" : "{minutes}:{seconds}",
- "{seconds} second{plural_s} left" : "剩下{seconds} 秒",
- "{seconds}s" : "{seconds}秒",
+ "{seconds} second{plural_s} left" : "剩余 {seconds} 秒",
+ "{seconds}s" : "{seconds}s",
"Any moment now..." : "现在任何时候...",
"Soon..." : "很快...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
- "No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”",
+ "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中. 离开此页将会取消上传.",
+ "No entries in this folder match '{filter}'" : "文件夹中不存在 \"{filter}\"",
"Local link" : "本地链接",
"{newname} already exists" : "{newname} 已经存在",
- "A file or folder has been <strong>changed</strong>" : "一个文件或文件夹已被<strong>修改</strong>",
- "A file or folder has been <strong>deleted</strong>" : "一个文件或文件夹已被<strong>删除</strong>",
- "A file or folder has been <strong>restored</strong>" : "一个文件或文件夹已经被 <strong>恢复</strong>",
- "You created %1$s" : "您创建了%1$s",
+ "A file or folder has been <strong>changed</strong>" : "文件/文件夹已经 <strong>修改</strong>",
+ "A file or folder has been <strong>deleted</strong>" : "文件/文件夹已经 <strong>删除</strong>",
+ "A file or folder has been <strong>restored</strong>" : "文件/文件夹已经 <strong>恢复</strong>",
+ "You created %1$s" : "您创建了 %1$s",
"%2$s created %1$s" : "%2$s 创建了 %1$s",
"%1$s was created in a public folder" : "%1$s 被创建在公开文件夹中",
- "You changed %1$s" : "您修改了%1$s",
+ "You changed %1$s" : "您修改了 %1$s",
"%2$s changed %1$s" : "%2$s 修改了 %1$s",
"You deleted %1$s" : "您删除了 %1$s",
"%2$s deleted %1$s" : "%2$s 删除了 %1$s",
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 68e15813cdb..26ed83ac15c 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -1,80 +1,80 @@
{ "translations": {
- "Storage is temporarily not available" : "存储器当前无法访问",
+ "Storage is temporarily not available" : "存储暂时不可用",
"Storage invalid" : "存储空间无效",
"Unknown error" : "未知错误",
"Files" : "文件",
"All files" : "全部文件",
"Recent" : "最近",
"File could not be found" : "文件未找到",
- "Home" : "家庭",
+ "Home" : "首页",
"Close" : "关闭",
"Favorites" : "收藏",
- "Could not create folder \"{dir}\"" : "不能创建文件夹 \"{dir}\"",
+ "Could not create folder \"{dir}\"" : "无法创建文件夹 \"{dir}\"",
"Upload cancelled." : "上传已取消",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。",
- "Target folder \"{dir}\" does not exist any more" : "目标目录\"{dir}\" 不存在",
- "Not enough free space" : "没有足够空间",
- "Uploading..." : "上传中...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传文件 {filename}, 因为其是一个目录或者长度为0字节",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足, 您上传的文件大小为 {size1}, 但可用空间仅剩 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
+ "Not enough free space" : "可用空间不足",
+ "Uploading..." : "正在上传...",
"..." : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Actions" : "动作",
+ "Actions" : "操作",
"Download" : "下载",
"Rename" : "重命名",
"Move" : "移动",
"Target folder" : "目标目录",
"Delete" : "删除",
- "Disconnect storage" : "断开储存连接",
+ "Disconnect storage" : "断开存储链接",
"Unshare" : "取消共享",
- "Could not load info for file \"{file}\"" : "无法载入\"{file}\"文件信息",
+ "Could not load info for file \"{file}\"" : "无法加载 \"{file}\" 文件信息",
"Details" : "详细信息",
"Select" : "选择",
"Pending" : "等待",
"Unable to determine date" : "无法确定日期",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。",
- "Could not move \"{file}\"" : "不能移动 \"{file}\"",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
+ "Could not move \"{file}\", target exists" : "无法移动 \"{file}\", 目标已存在",
+ "Could not move \"{file}\"" : "无法移动 \"{file}\"",
"{newName} already exists" : "{newname} 已经存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "不能重命名 \"{fileName}\",此文件已经不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。",
- "Could not rename \"{fileName}\"" : "不能重命名 \"{fileName}\"",
- "Could not create file \"{file}\"" : "不能创建文件 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "不能创建文件 \"{file}\" ,因为它已经存在",
- "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在",
- "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
- "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}'标签的结果",
+ "Could not rename \"{fileName}\", it does not exist any more" : "无法重命名 \"{fileName}\", 此文件已经不存在",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "文件夹 \"{dir}\" 中已经存在 \"{targetName}\". 请尝试其他的名称.",
+ "Could not rename \"{fileName}\"" : "无法重命名 \"{fileName}\"",
+ "Could not create file \"{file}\"" : "无法创建文件 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "无法创建文件 \"{file}\", 因为其已经存在",
+ "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹 \"{dir}\", 因为其已经存在",
+ "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错.",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : " 在其他文件夹未找到包含 '{tag}{filter}{endtag}' 标签的结果",
"Name" : "名称",
"Size" : "大小",
"Modified" : "修改日期",
- "_%n folder_::_%n folders_" : ["%n 文件夹"],
+ "_%n folder_::_%n folders_" : ["%n 个文件夹"],
"_%n file_::_%n files_" : ["%n个文件"],
"{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 隐藏的"],
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
"You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件",
"_Uploading %n file_::_Uploading %n files_" : ["上传 %n 个文件"],
"New" : "新建",
- "\"{name}\" is an invalid file name." : "“{name}”是一个无效的文件名。",
- "File name cannot be empty." : "文件名不能为空。",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满,文件将无法更新或同步!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
+ "\"{name}\" is an invalid file name." : "\"{name}\" 是一个无效的文件名",
+ "File name cannot be empty." : "文件名不能为空.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满, 文件将无法更新或同步!",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满, 文件将无法更新或同步!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} 的存储空间即将用完 ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "您的存储空间即将用完 ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["匹配“{filter}”"],
- "View in folder" : "在文件夹里查看",
+ "_matches '{filter}'_::_match '{filter}'_" : ["匹配 '{filter}'"],
+ "View in folder" : "在文件夹中查看",
"Path" : "路径",
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
"Copy local link" : "复制本地链接",
"Folder" : "文件夹",
- "New folder" : "增加文件夹",
+ "New folder" : "新建文件夹",
"Upload" : "上传",
"An error occurred while trying to update the tags" : "更新标签时出错",
"Added to favorites" : "添加到收藏",
"Removed from favorites" : "取消收藏",
- "You added {file} to your favorites" : "您添加了 {file} 文件到您的收藏夹",
- "You removed {file} from your favorites" : "您从您的收藏夹删除了 {file} 文件",
+ "You added {file} to your favorites" : "您已经添加 {file} 到您的收藏夹",
+ "You removed {file} from your favorites" : "您已从收藏夹中删除 {file}",
"File changes" : "文件发生变化",
"Created by {user}" : "由 {user} 创建",
"Changed by {user}" : "由 {user} 更改",
@@ -95,29 +95,29 @@
"{user} renamed {oldfile} to {newfile}" : "{user} 将 {oldfile} 改名为 {newfile}",
"You moved {oldfile} to {newfile}" : "您移动 {oldfile} 到 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 移动 {oldfile} 到 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "一个文件从您的 <strong>收藏夹</strong> 添加或者删除",
- "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "一个文件或者文件夹被 <strong>更改</strong> 或者 <strong>重命名</strong>",
- "A new file or folder has been <strong>created</strong>" : "一个新的文件或文件夹已被<strong>创建</strong>",
- "A new file or folder has been <strong>deleted</strong>" : "一个新文件或者文件夹被 <strong>删除</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "针对<strong>已收藏文件</strong>的新建和修改发送有限的通知 <em>(仅流)</em>",
- "A new file or folder has been <strong>restored</strong>" : "一个新文件或者文件夹被<strong>恢复</strong>",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的 <strong>收藏夹</strong> 中",
+ "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "文件/文件夹已经 <strong>更改</strong> 或者 <strong>重命名</strong>",
+ "A new file or folder has been <strong>created</strong>" : "新的文件/文件夹已经 <strong>创建</strong>",
+ "A new file or folder has been <strong>deleted</strong>" : "新的文件/文件夹已经 <strong>删除</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "仅限 <strong>收藏文件</strong>的创建和更改通知 <em>(仅限流)</em>",
+ "A new file or folder has been <strong>restored</strong>" : "新的文件/文件夹已经<strong>恢复</strong>",
"Upload (max. %s)" : "上传 (最大 %s)",
"File handling" : "文件处理",
"Maximum upload size" : "最大上传大小",
"max. possible: " : "最大允许: ",
"Save" : "保存",
- "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。",
- "Missing permissions to edit from here." : "没有从这里进行编辑的权限",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
+ "Missing permissions to edit from here." : "没有权限编辑",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">通过 WebDAV 访问您的文件</a>",
"No files in here" : "无文件",
- "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
- "No entries found in this folder" : "此文件夹中无项目",
+ "Upload some content or sync with your devices!" : "上传或从您的设备中同步!",
+ "No entries found in this folder" : "文件夹中无项目",
"Select all" : "全部选择",
"Upload too large" : "上传文件过大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "正在上传的文件超过了此服务器允许上传的最大容量限制",
"No favorites" : "无收藏",
"Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
"Shared with you" : "与您分享",
@@ -128,43 +128,43 @@
"Text file" : "文本文件",
"New text file.txt" : "创建文本文件 .txt",
"Storage not available" : "存储空间不可用",
- "Unable to set upload directory." : "无法设置上传文件夹。",
+ "Unable to set upload directory." : "无法设置上传文件夹.",
"Invalid Token" : "无效密匙",
- "No file was uploaded. Unknown error" : "没有文件被上传。未知错误",
- "There is no error, the file uploaded with success" : "文件上传成功,没有错误发生",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件大小已超过php.ini中upload_max_filesize所规定的值",
+ "No file was uploaded. Unknown error" : "没有文件被上传. 未知错误",
+ "There is no error, the file uploaded with success" : "文件上传成功, 没有任何错误",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "上传文件的大小已超过 php.ini 中 upload_max_filesize 设置的值",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上传的文件长度超出了 HTML 表单中 MAX_FILE_SIZE 的限制",
- "The uploaded file was only partially uploaded" : "已上传文件只上传了部分(不完整)",
+ "The uploaded file was only partially uploaded" : "文件仅部分上传",
"No file was uploaded" : "没有文件被上传",
- "Missing a temporary folder" : "缺少临时目录",
+ "Missing a temporary folder" : "临时目录缺失",
"Failed to write to disk" : "写入磁盘失败",
"Not enough storage available" : "没有足够的存储空间",
- "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。",
- "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件",
- "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。",
- "Invalid directory." : "无效文件夹。",
+ "The target folder has been moved or deleted." : "目标文件夹已被移动或删除.",
+ "Upload failed. Could not find uploaded file" : "上传失败. 未发现上传的文件",
+ "Upload failed. Could not get file info." : "上传失败. 无法获取文件信息.",
+ "Invalid directory." : "无效文件夹.",
"Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}",
"Error uploading file \"{fileName}\": {message}" : "上传文件错误 \"{fileName}\": {message}",
- "Could not get result from server." : "不能从服务器得到结果",
- "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间:{hours}:{minutes}:{seconds} ",
+ "Could not get result from server." : "无法从服务器获取结果",
+ "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间: {hours}:{minutes}:{seconds} ",
"{hours}:{minutes}h" : "{hours}:{minutes}",
- "{minutes}:{seconds} minute{plural_s} left" : "剩余分钟:{minutes}:{seconds} ",
+ "{minutes}:{seconds} minute{plural_s} left" : "剩余 {minutes}:{seconds} 分钟",
"{minutes}:{seconds}m" : "{minutes}:{seconds}",
- "{seconds} second{plural_s} left" : "剩下{seconds} 秒",
- "{seconds}s" : "{seconds}秒",
+ "{seconds} second{plural_s} left" : "剩余 {seconds} 秒",
+ "{seconds}s" : "{seconds}s",
"Any moment now..." : "现在任何时候...",
"Soon..." : "很快...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
- "No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”",
+ "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中. 离开此页将会取消上传.",
+ "No entries in this folder match '{filter}'" : "文件夹中不存在 \"{filter}\"",
"Local link" : "本地链接",
"{newname} already exists" : "{newname} 已经存在",
- "A file or folder has been <strong>changed</strong>" : "一个文件或文件夹已被<strong>修改</strong>",
- "A file or folder has been <strong>deleted</strong>" : "一个文件或文件夹已被<strong>删除</strong>",
- "A file or folder has been <strong>restored</strong>" : "一个文件或文件夹已经被 <strong>恢复</strong>",
- "You created %1$s" : "您创建了%1$s",
+ "A file or folder has been <strong>changed</strong>" : "文件/文件夹已经 <strong>修改</strong>",
+ "A file or folder has been <strong>deleted</strong>" : "文件/文件夹已经 <strong>删除</strong>",
+ "A file or folder has been <strong>restored</strong>" : "文件/文件夹已经 <strong>恢复</strong>",
+ "You created %1$s" : "您创建了 %1$s",
"%2$s created %1$s" : "%2$s 创建了 %1$s",
"%1$s was created in a public folder" : "%1$s 被创建在公开文件夹中",
- "You changed %1$s" : "您修改了%1$s",
+ "You changed %1$s" : "您修改了 %1$s",
"%2$s changed %1$s" : "%2$s 修改了 %1$s",
"You deleted %1$s" : "您删除了 %1$s",
"%2$s deleted %1$s" : "%2$s 删除了 %1$s",
diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml
index b2f73dce621..8482b8b25ed 100644
--- a/apps/files_external/appinfo/info.xml
+++ b/apps/files_external/appinfo/info.xml
@@ -3,9 +3,9 @@
<id>files_external</id>
<name>External storage support</name>
<description>
- This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, Google Drive, Dropbox, other ownCloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root ownCloud directory, which they can access and use like any other ownCloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.
-
- External storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation.
+This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, Google Drive, Dropbox, other ownCloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root ownCloud directory, which they can access and use like any other ownCloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.
+
+External storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation.
</description>
<licence>AGPL</licence>
<author>Robin Appelman, Michael Gapczynski, Vincent Petry</author>
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index 56f581e7d2c..1dbb8d0bb47 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -114,7 +114,7 @@ OC.L10N.register(
"Enable encryption" : "Verschlüsselung aktivieren",
"Enable previews" : "Vorschau aktivieren",
"Enable sharing" : "Teilen aktivieren",
- "Check for changes" : "Auf Änderungen überprüfen",
+ "Check for changes" : "Auf Änderungen prüfen",
"Never" : "Nie",
"Once every direct access" : "Einmal bei jedem Direktzugriff",
"Folder name" : "Ordnername",
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index da4efa098ab..06141581b71 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -112,7 +112,7 @@
"Enable encryption" : "Verschlüsselung aktivieren",
"Enable previews" : "Vorschau aktivieren",
"Enable sharing" : "Teilen aktivieren",
- "Check for changes" : "Auf Änderungen überprüfen",
+ "Check for changes" : "Auf Änderungen prüfen",
"Never" : "Nie",
"Once every direct access" : "Einmal bei jedem Direktzugriff",
"Folder name" : "Ordnername",
diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php
index e6e26e3547a..9dab25f7197 100644
--- a/apps/files_external/lib/Lib/Storage/AmazonS3.php
+++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php
@@ -42,6 +42,7 @@ require_once 'aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
use OC\Files\ObjectStore\S3ConnectionTrait;
@@ -366,14 +367,15 @@ class AmazonS3 extends \OC\Files\Storage\Common {
$ext = '';
}
$tmpFile = \OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
file_put_contents($tmpFile, $source);
}
- self::$tmpFiles[$tmpFile] = $path;
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function() use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
return false;
}
@@ -514,15 +516,11 @@ class AmazonS3 extends \OC\Files\Storage\Common {
return $this->id;
}
- public function writeBack($tmpFile) {
- if (!isset(self::$tmpFiles[$tmpFile])) {
- return false;
- }
-
+ public function writeBack($tmpFile, $path) {
try {
$this->getConnection()->putObject(array(
'Bucket' => $this->bucket,
- 'Key' => $this->cleanKey(self::$tmpFiles[$tmpFile]),
+ 'Key' => $this->cleanKey($path),
'SourceFile' => $tmpFile,
'ContentType' => \OC::$server->getMimeTypeDetector()->detect($tmpFile),
'ContentLength' => filesize($tmpFile)
diff --git a/apps/files_external/lib/Lib/Storage/Dropbox.php b/apps/files_external/lib/Lib/Storage/Dropbox.php
index 45bc6cd0e98..d2ba1cca751 100644
--- a/apps/files_external/lib/Lib/Storage/Dropbox.php
+++ b/apps/files_external/lib/Lib/Storage/Dropbox.php
@@ -31,6 +31,7 @@
namespace OCA\Files_External\Lib\Storage;
use GuzzleHttp\Exception\RequestException;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
use Icewind\Streams\RetryWrapper;
use OCP\Files\StorageNotAvailableException;
@@ -45,8 +46,6 @@ class Dropbox extends \OC\Files\Storage\Common {
private $metaData = array();
private $oauth;
- private static $tempFiles = array();
-
public function __construct($params) {
if (isset($params['configured']) && $params['configured'] == 'true'
&& isset($params['app_key'])
@@ -305,27 +304,26 @@ class Dropbox extends \OC\Files\Storage\Common {
$ext = '';
}
$tmpFile = \OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
file_put_contents($tmpFile, $source);
}
- self::$tempFiles[$tmpFile] = $path;
- return fopen('close://'.$tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
return false;
}
- public function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $handle = fopen($tmpFile, 'r');
- try {
- $this->dropbox->putFile(self::$tempFiles[$tmpFile], $handle);
- unlink($tmpFile);
- $this->deleteMetaData(self::$tempFiles[$tmpFile]);
- } catch (\Exception $exception) {
- \OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
- }
+ public function writeBack($tmpFile, $path) {
+ $handle = fopen($tmpFile, 'r');
+ try {
+ $this->dropbox->putFile($path, $handle);
+ unlink($tmpFile);
+ $this->deleteMetaData($path);
+ } catch (\Exception $exception) {
+ \OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
}
}
diff --git a/apps/files_external/lib/Lib/Storage/FTP.php b/apps/files_external/lib/Lib/Storage/FTP.php
index 6f34416d111..22fe2090f30 100644
--- a/apps/files_external/lib/Lib/Storage/FTP.php
+++ b/apps/files_external/lib/Lib/Storage/FTP.php
@@ -33,6 +33,7 @@
namespace OCA\Files_External\Lib\Storage;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\RetryWrapper;
class FTP extends StreamWrapper{
@@ -127,21 +128,20 @@ class FTP extends StreamWrapper{
$ext='';
}
$tmpFile=\OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$this->getFile($path, $tmpFile);
}
- self::$tempFiles[$tmpFile]=$path;
- return fopen('close://'.$tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
return false;
}
- public function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]);
- unlink($tmpFile);
- }
+ public function writeBack($tmpFile, $path) {
+ $this->uploadFile($tmpFile, $path);
+ unlink($tmpFile);
}
/**
diff --git a/apps/files_external/lib/Lib/Storage/Google.php b/apps/files_external/lib/Lib/Storage/Google.php
index a3133cb4743..b22b0c29263 100644
--- a/apps/files_external/lib/Lib/Storage/Google.php
+++ b/apps/files_external/lib/Lib/Storage/Google.php
@@ -36,6 +36,7 @@
namespace OCA\Files_External\Lib\Storage;
use GuzzleHttp\Exception\RequestException;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
use Icewind\Streams\RetryWrapper;
@@ -50,8 +51,6 @@ class Google extends \OC\Files\Storage\Common {
private $service;
private $driveFiles;
- private static $tempFiles = array();
-
// Google Doc mimetypes
const FOLDER = 'application/vnd.google-apps.folder';
const DOCUMENT = 'application/vnd.google-apps.document';
@@ -495,94 +494,91 @@ class Google extends \OC\Files\Storage\Common {
case 'c':
case 'c+':
$tmpFile = \OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'rb');
file_put_contents($tmpFile, $source);
}
- self::$tempFiles[$tmpFile] = $path;
- return fopen('close://'.$tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
- public function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $path = self::$tempFiles[$tmpFile];
- $parentFolder = $this->getDriveFile(dirname($path));
- if ($parentFolder) {
- $mimetype = \OC::$server->getMimeTypeDetector()->detect($tmpFile);
- $params = array(
- 'mimeType' => $mimetype,
- 'uploadType' => 'media'
- );
- $result = false;
+ public function writeBack($tmpFile, $path) {
+ $parentFolder = $this->getDriveFile(dirname($path));
+ if ($parentFolder) {
+ $mimetype = \OC::$server->getMimeTypeDetector()->detect($tmpFile);
+ $params = array(
+ 'mimeType' => $mimetype,
+ 'uploadType' => 'media'
+ );
+ $result = false;
+
+ $chunkSizeBytes = 10 * 1024 * 1024;
+
+ $useChunking = false;
+ $size = filesize($tmpFile);
+ if ($size > $chunkSizeBytes) {
+ $useChunking = true;
+ } else {
+ $params['data'] = file_get_contents($tmpFile);
+ }
- $chunkSizeBytes = 10 * 1024 * 1024;
+ if ($this->file_exists($path)) {
+ $file = $this->getDriveFile($path);
+ $this->client->setDefer($useChunking);
+ $request = $this->service->files->update($file->getId(), $file, $params);
+ } else {
+ $file = new \Google_Service_Drive_DriveFile();
+ $file->setTitle(basename($path));
+ $file->setMimeType($mimetype);
+ $parent = new \Google_Service_Drive_ParentReference();
+ $parent->setId($parentFolder->getId());
+ $file->setParents(array($parent));
+ $this->client->setDefer($useChunking);
+ $request = $this->service->files->insert($file, $params);
+ }
- $useChunking = false;
- $size = filesize($tmpFile);
- if ($size > $chunkSizeBytes) {
- $useChunking = true;
- } else {
- $params['data'] = file_get_contents($tmpFile);
+ if ($useChunking) {
+ // Create a media file upload to represent our upload process.
+ $media = new \Google_Http_MediaFileUpload(
+ $this->client,
+ $request,
+ 'text/plain',
+ null,
+ true,
+ $chunkSizeBytes
+ );
+ $media->setFileSize($size);
+
+ // Upload the various chunks. $status will be false until the process is
+ // complete.
+ $status = false;
+ $handle = fopen($tmpFile, 'rb');
+ while (!$status && !feof($handle)) {
+ $chunk = fread($handle, $chunkSizeBytes);
+ $status = $media->nextChunk($chunk);
}
- if ($this->file_exists($path)) {
- $file = $this->getDriveFile($path);
- $this->client->setDefer($useChunking);
- $request = $this->service->files->update($file->getId(), $file, $params);
- } else {
- $file = new \Google_Service_Drive_DriveFile();
- $file->setTitle(basename($path));
- $file->setMimeType($mimetype);
- $parent = new \Google_Service_Drive_ParentReference();
- $parent->setId($parentFolder->getId());
- $file->setParents(array($parent));
- $this->client->setDefer($useChunking);
- $request = $this->service->files->insert($file, $params);
+ // The final value of $status will be the data from the API for the object
+ // that has been uploaded.
+ $result = false;
+ if ($status !== false) {
+ $result = $status;
}
- if ($useChunking) {
- // Create a media file upload to represent our upload process.
- $media = new \Google_Http_MediaFileUpload(
- $this->client,
- $request,
- 'text/plain',
- null,
- true,
- $chunkSizeBytes
- );
- $media->setFileSize($size);
-
- // Upload the various chunks. $status will be false until the process is
- // complete.
- $status = false;
- $handle = fopen($tmpFile, 'rb');
- while (!$status && !feof($handle)) {
- $chunk = fread($handle, $chunkSizeBytes);
- $status = $media->nextChunk($chunk);
- }
-
- // The final value of $status will be the data from the API for the object
- // that has been uploaded.
- $result = false;
- if ($status !== false) {
- $result = $status;
- }
-
- fclose($handle);
- } else {
- $result = $request;
- }
+ fclose($handle);
+ } else {
+ $result = $request;
+ }
- // Reset to the client to execute requests immediately in the future.
- $this->client->setDefer(false);
+ // Reset to the client to execute requests immediately in the future.
+ $this->client->setDefer(false);
- if ($result) {
- $this->setDriveFile($path, $result);
- }
+ if ($result) {
+ $this->setDriveFile($path, $result);
}
- unlink($tmpFile);
}
}
diff --git a/apps/files_external/lib/Lib/Storage/Swift.php b/apps/files_external/lib/Lib/Storage/Swift.php
index ba0b4898e2e..5fec278ef3d 100644
--- a/apps/files_external/lib/Lib/Storage/Swift.php
+++ b/apps/files_external/lib/Lib/Storage/Swift.php
@@ -37,6 +37,7 @@ namespace OCA\Files_External\Lib\Storage;
use Guzzle\Http\Url;
use Guzzle\Http\Exception\ClientErrorResponseException;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
use OpenCloud;
use OpenCloud\Common\Exceptions;
@@ -410,7 +411,6 @@ class Swift extends \OC\Files\Storage\Common {
$ext = '';
}
$tmpFile = \OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
// Fetch existing file if required
if ($mode[0] !== 'w' && $this->file_exists($path)) {
if ($mode[0] === 'x') {
@@ -424,9 +424,10 @@ class Swift extends \OC\Files\Storage\Common {
fseek($tmpFile, 0, SEEK_END);
}
}
- self::$tmpFiles[$tmpFile] = $path;
-
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
@@ -615,12 +616,9 @@ class Swift extends \OC\Files\Storage\Common {
return $this->container;
}
- public function writeBack($tmpFile) {
- if (!isset(self::$tmpFiles[$tmpFile])) {
- return false;
- }
+ public function writeBack($tmpFile, $path) {
$fileData = fopen($tmpFile, 'r');
- $this->getContainer()->uploadObject(self::$tmpFiles[$tmpFile], $fileData);
+ $this->getContainer()->uploadObject($path, $fileData);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove(self::$tmpFiles[$tmpFile]);
unlink($tmpFile);
diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js
index f2eba22fa17..4dff7b988e4 100644
--- a/apps/files_sharing/l10n/cs_CZ.js
+++ b/apps/files_sharing/l10n/cs_CZ.js
@@ -18,52 +18,82 @@ OC.L10N.register(
"No expiration date set" : "Není nastaveno datum vypršení platnosti",
"Shared by" : "Sdílí",
"Sharing" : "Sdílení",
- "A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>",
- "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>",
- "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> soubor nebo adresář sdílený jako veřejný odkaz",
- "You received a new remote share %2$s from %1$s" : "Obdrželi jste nové vzdálené sdílení %2$s od uživatele %1$s",
- "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s",
- "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s",
- "%1$s declined remote share %2$s" : "%1$s odmítl(a) vzdálené sdílení %2$s",
- "%1$s unshared %2$s from you" : "%1$s již více nesdílí %2$s",
- "Public shared folder %1$s was downloaded" : "Byl stažen veřejně sdílený adresář %1$s ",
- "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ",
- "You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s",
- "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s",
- "You removed the share of %2$s for %1$s" : "Odstranil(a) jsi sdílení %2$s pro %1$s",
- "%2$s removed the share of %3$s for %1$s" : "%2$s odstranil(a) sdílení %3$s pro %1$s",
- "You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s",
- "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s",
- "You removed the share of group %2$s for %1$s" : "Odstranil(a) jsi sdílení skupině %2$s pro %1$s",
- "%2$s removed the share of group %3$s for %1$s" : "%2$s odstranil(a) sdílení skupině %3$s pro %1$s",
- "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz",
- "You shared %1$s via link" : "Sdílíte %1$s přes odkaz",
- "You removed the public link for %1$s" : "Odstranil(a) jsi veřejný odkaz na %1$s",
- "%2$s removed the public link for %1$s" : "%2$s odstranil(a) veřejný odkaz na %1$s",
- "Your public link for %1$s expired" : "Veřejný odkaz pro %1$s vypršel",
- "The public link of %2$s for %1$s expired" : "Veřejný odkaz na %2$s pro %1$s vypršel",
- "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s",
- "%2$s removed the share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s",
- "File %1$s shared by email with %2$s was downloaded" : "Soubor %1$s sdílen pomocí emailu s %2$s byl stažen",
- "Folder %1$s shared by email with %2$s was downloaded" : "Adresář %1$s sdílen pomocí emailu s %2$s byl stažen",
+ "File shares" : "Sdílení souboru",
"Downloaded via public link" : "Staženo pomocí veřejného odkazu",
- "Shared with %2$s" : "Sdíleno s %2$s",
- "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s",
- "Removed share for %2$s" : "Odstranil(a) sdílení pro %2$s",
- "%2$s removed share for %3$s" : "%2$s odstranil(a) sdílení pro %3$s",
- "Shared with group %2$s" : "Sdíleno se skupinou %2$s",
- "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s",
- "Removed share of group %2$s" : "Odstranil(a) sdílení skupině %2$s",
- "%2$s removed share of group %3$s" : "%2$s odstranil(a) sdílení skupině %3$s",
- "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz",
- "Shared via public link" : "Sdíleno jako veřejný odkaz",
+ "Downloaded by %1$s" : "Stáhnul(o) %1$s",
+ "Downloaded by {email}" : "Stáhl {email}",
+ "%1$s downloaded via public link" : "%1$s stažen pomocí veřejného odkazu",
+ "{file} downloaded via public link" : "{file} stažen pomocí veřejného odkazu",
+ "%1$s downloaded %2$s" : "%1$s stáhl(a) %2$s",
+ "{email} downloaded {file}" : "{email} stáhnul {file}",
+ "Shared with group %1$s" : "Sdíleno se skupinou %1$s",
+ "Shared with group {group}" : "Sdíleno se skupinou {group}",
+ "Removed share for group %1$s" : "Odstraněno sdílení pro skupinu %1$s",
+ "Removed share for group {group}" : "Odstranil sdílení pro skupinu {group}",
+ "%2$s shared with group %1$s" : "%2$s sdílel se skupinou %1$s",
+ "{actor} shared with group {group}" : "{actor} sdílel(a) se skupinou {group}",
+ "%2$s removed share for group %1$s" : "%2$s odstranil(a) sdílení pro skupinu %1$s",
+ "{actor} removed share for group {group}" : "{actor} odstranil(a) sdílení pro skupinu {group}",
+ "You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s",
+ "You shared {file} with group {group}" : "Se skupinou {group} jste nasdílel(a) {file}",
+ "You removed group %2$s from %1$s" : "Z %1$s jste odstranil(a) skupinu %2$s",
+ "You removed group {group} from {file}" : "Z {file} jste odstranil(a) skupinu {group}",
+ "%3$s shared %1$s with group %2$s" : "%3$s sdílel %1$s se skupinou %2$s",
+ "{actor} shared {file} with group {group}" : "{actor} sdílel(a) {file} se skupinou {group}",
+ "%3$s removed group %2$s from %1$s" : "%3$s odstranil(a) z %1$s skupinu %2$s",
+ "{actor} removed group {group} from {file}" : "{actor} odstranil(a) skupinu {group} z {file}",
+ "Shared as public link" : "Sdíleno jako veřejný odkaz",
"Removed public link" : "Odstranil(a) veřejný odkaz",
- "%2$s removed public link" : "%2$s odstranil(a) veřejný odkaz",
- "Public link expired" : "Veřejný odkaz vypršel",
- "Public link of %2$s expired" : "Veřejný odkaz %2$s vypršel",
- "Shared by %2$s" : "%2$s sdílel(a)",
- "Downloaded by %2$s" : "Staženo uživatelem %2$s",
- "File shares" : "Sdílení souboru",
+ "%1$s shared as public link" : "%1$s sdílen jako veřejný odkaz",
+ "{actor} shared as public link" : "{actor} sdílel(a) jako veřejný odkaz",
+ "%1$s removed public link" : "%1$s odstranil(a) veřejný odkaz",
+ "{actor} removed public link" : "{actor} odstranil(a) veřejný odkaz",
+ "You shared %1$s as public link" : "Sdílel(a) jste %1$s jako veřejný odkaz",
+ "You shared {file} as public link" : "Sdílel(a) jste {file} jako veřejný odkaz",
+ "You removed public link for %1$s" : "Odstranil(a) jste veřejný odkaz pro %1$s",
+ "You removed public link for {file}" : "Odstranil(a) jste veřejný odkaz pro {file}",
+ "%2$s shared %1$s as public link" : "%2$s sdílel(a) %1$s jako veřejný odkaz",
+ "{actor} shared {file} as public link" : "{actor} sdílel(a) {file} jako veřejný odkaz",
+ "%2$s removed public link for %1$s" : "%2$s odstranil veřejný odkaz z %1$s",
+ "{actor} removed public link for {file}" : "{actor} odstranil(a) veřejný odkaz pro {file}",
+ "%1$s accepted the remote share" : "%1$s přijal(a) vzdálené sdílení",
+ "{user} accepted the remote share" : "{user} přijal(a) vzdálené sdílení",
+ "%1$s declined the remote share" : "%1$s odmítl(a) vzdálené sdílení",
+ "{user} declined the remote share" : "{user} odmítl vzdálené sdílení",
+ "You received a new remote share %1$s from %2$s" : "Obdržel(a) jste nové vzdálené sdílení %1$s z %2$s",
+ "You received a new remote share {file} from {user}" : "Obdržel(a) jste nové vzdálené sdílení souboru {file} od {user}",
+ "%2$s accepted the remote share of %1$s" : "%2$s přijal(a) vzdálené sdílení %1$s",
+ "{user} accepted the remote share of {file}" : "{user} přijal vzdálené sdílení souboru {file}",
+ "%2$s declined the remote share of %1$s" : "%2$s odmítl vzdálené sdílení %1$s",
+ "{user} declined the remote share of {file}" : "{user} odmítl(a) vzdálené sdílení {file}",
+ "%2$s unshared %1$s from you" : "%2$s s vámi přestal(a) sdílet %1$s",
+ "{user} unshared {file} from you" : "{user} s vámi již nesdílí soubor {file}",
+ "Shared with %1$s" : "Sdíleno s %1$s",
+ "Shared with {user}" : "Sdíleno s {user}",
+ "Removed share for %1$s" : "Odstraněno sdílení %1$s",
+ "Removed share for {user}" : "Odstraněno sdílení pro {user}",
+ "%2$s shared with %1$s" : "%2$s sdíleno s %1$s",
+ "{actor} shared with {user}" : "{actor} sdílel(a) s {user}",
+ "%2$s removed share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s",
+ "{actor} removed share for {user}" : "{actor} odstranil(a) sdílení pro {user}",
+ "Shared by %1$s" : "Sdíleno %1$s",
+ "Shared by {actor}" : "Sdílel {actor}",
+ "%1$s removed share" : "%1$s odstranil(a) sdílení",
+ "{actor} removed share" : "{actor} odebral(a) sdílení",
+ "You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s",
+ "You shared {file} with {user}" : "Sdílel(a) jste {file} s {user}",
+ "You removed %2$s from %1$s" : "Odstranil(a) jste %2$s z %1$s",
+ "You removed {user} from {file}" : "Odstranil(a) jste uživatele {user} z {file}",
+ "%3$s shared %1$s with %2$s" : "%3$s s %2$s sdílel(a) %1$s",
+ "{actor} removed {user} from {file}" : "{actor} odstranil(a) uživatele {user} z {file}",
+ "%3$s removed %2$s from %1$s" : "%3$s odstranil(a) %2$s z %1$s",
+ "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s",
+ "{actor} shared {file} with you" : "{actor} s vámi sdílel(a) soubor {file}",
+ "%2$s removed you from %1$s" : "%2$s vás odstranil(a) z %1$s",
+ "{actor} removed you from {file}" : "{actor} vás odstranil(a) ze souboru {file}",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> soubor nebo adresář sdílený jako veřejný odkaz",
+ "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>",
+ "A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>",
"Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje",
"could not delete share" : "nelze smazat sdílení",
"Could not delete share" : "Nelze smazat sdílení",
@@ -109,36 +139,40 @@ OC.L10N.register(
"Uploading files…" : "Probíhá nahrávání souborů...",
"Uploaded files:" : "Nahrané soubory:",
"A public shared file or folder was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> veřejně sdílený soubor nebo adresář",
- "Shares" : "Sdílení",
- "Server to server sharing is not enabled on this server" : "Sdílení mezi servery není na tomto serveru povoleno",
- "The mountpoint name contains invalid characters." : "Jméno přípojného bodu obsahuje nepovolené znaky.",
- "Not allowed to create a federated share with the same user server" : "Není povoleno vytvořit propojené sdílení s tím samým serverem",
- "Invalid or untrusted SSL certificate" : "Neplatný nebo nedůvěryhodný SSL certifikát",
- "Could not authenticate to remote share, password might be wrong" : "Nezdařilo se přihlášení ke vzdálenému úložišti, nejspíše bylo zadáno chybné heslo",
- "Storage not valid" : "Úložiště není platné",
- "Couldn't add remote share" : "Nelze přidat vzdálené úložiště",
- "Federated sharing" : "Propojené sdílení",
- "Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete přidat vzdálené úložiště {name} uživatele {owner}@{remote}?",
- "Remote share" : "Vzdálené úložiště",
- "Remote share password" : "Heslo ke vzdálenému úložišti",
- "Cancel" : "Zrušit",
- "Add remote share" : "Přidat vzdálené úložiště",
- "No ownCloud installation (7 or higher) found at {remote}" : "Nebyla nalezena instalace ownCloud (7 nebo vyšší) na {remote}",
- "Invalid ownCloud url" : "Neplatná ownCloud url",
- "You received \"/%2$s\" as a remote share from %1$s" : "Obdrželi jste \"/%2$s\" jako vzdálené sdílení od %1$s",
- "Accept" : "Přijmout",
- "Decline" : "Zamítnout",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID",
- "Federated Cloud Sharing" : "Propojené cloudové sdílení",
- "Open documentation" : "Otevřít dokumentaci",
- "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
- "Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů",
- "Federated Cloud" : "Sdružený cloud",
- "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
- "Share it:" : "Sdílet:",
- "Add to your website" : "Přidat na svou webovou stránku",
- "Share with me via Nextcloud" : "Sdíleno se mnou přes Nextcloud",
- "HTML Code:" : "HTML kód:"
+ "You received a new remote share %2$s from %1$s" : "Obdrželi jste nové vzdálené sdílení %2$s od uživatele %1$s",
+ "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s",
+ "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s",
+ "%1$s declined remote share %2$s" : "%1$s odmítl(a) vzdálené sdílení %2$s",
+ "%1$s unshared %2$s from you" : "%1$s již více nesdílí %2$s",
+ "Public shared folder %1$s was downloaded" : "Byl stažen veřejně sdílený adresář %1$s ",
+ "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ",
+ "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s",
+ "You removed the share of %2$s for %1$s" : "Odstranil(a) jsi sdílení %2$s pro %1$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s odstranil(a) sdílení %3$s pro %1$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s",
+ "You removed the share of group %2$s for %1$s" : "Odstranil(a) jsi sdílení skupině %2$s pro %1$s",
+ "%2$s removed the share of group %3$s for %1$s" : "%2$s odstranil(a) sdílení skupině %3$s pro %1$s",
+ "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz",
+ "You shared %1$s via link" : "Sdílíte %1$s přes odkaz",
+ "You removed the public link for %1$s" : "Odstranil(a) jsi veřejný odkaz na %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s odstranil(a) veřejný odkaz na %1$s",
+ "Your public link for %1$s expired" : "Veřejný odkaz pro %1$s vypršel",
+ "The public link of %2$s for %1$s expired" : "Veřejný odkaz na %2$s pro %1$s vypršel",
+ "%2$s removed the share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s",
+ "Shared with %2$s" : "Sdíleno s %2$s",
+ "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s",
+ "Removed share for %2$s" : "Odstranil(a) sdílení pro %2$s",
+ "%2$s removed share for %3$s" : "%2$s odstranil(a) sdílení pro %3$s",
+ "Shared with group %2$s" : "Sdíleno se skupinou %2$s",
+ "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s",
+ "Removed share of group %2$s" : "Odstranil(a) sdílení skupině %2$s",
+ "%2$s removed share of group %3$s" : "%2$s odstranil(a) sdílení skupině %3$s",
+ "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz",
+ "Shared via public link" : "Sdíleno jako veřejný odkaz",
+ "%2$s removed public link" : "%2$s odstranil(a) veřejný odkaz",
+ "Public link expired" : "Veřejný odkaz vypršel",
+ "Public link of %2$s expired" : "Veřejný odkaz %2$s vypršel",
+ "Shared by %2$s" : "%2$s sdílel(a)",
+ "Shares" : "Sdílení"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json
index 9d82343e895..a96d2fd6f7e 100644
--- a/apps/files_sharing/l10n/cs_CZ.json
+++ b/apps/files_sharing/l10n/cs_CZ.json
@@ -16,52 +16,82 @@
"No expiration date set" : "Není nastaveno datum vypršení platnosti",
"Shared by" : "Sdílí",
"Sharing" : "Sdílení",
- "A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>",
- "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>",
- "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> soubor nebo adresář sdílený jako veřejný odkaz",
- "You received a new remote share %2$s from %1$s" : "Obdrželi jste nové vzdálené sdílení %2$s od uživatele %1$s",
- "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s",
- "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s",
- "%1$s declined remote share %2$s" : "%1$s odmítl(a) vzdálené sdílení %2$s",
- "%1$s unshared %2$s from you" : "%1$s již více nesdílí %2$s",
- "Public shared folder %1$s was downloaded" : "Byl stažen veřejně sdílený adresář %1$s ",
- "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ",
- "You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s",
- "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s",
- "You removed the share of %2$s for %1$s" : "Odstranil(a) jsi sdílení %2$s pro %1$s",
- "%2$s removed the share of %3$s for %1$s" : "%2$s odstranil(a) sdílení %3$s pro %1$s",
- "You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s",
- "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s",
- "You removed the share of group %2$s for %1$s" : "Odstranil(a) jsi sdílení skupině %2$s pro %1$s",
- "%2$s removed the share of group %3$s for %1$s" : "%2$s odstranil(a) sdílení skupině %3$s pro %1$s",
- "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz",
- "You shared %1$s via link" : "Sdílíte %1$s přes odkaz",
- "You removed the public link for %1$s" : "Odstranil(a) jsi veřejný odkaz na %1$s",
- "%2$s removed the public link for %1$s" : "%2$s odstranil(a) veřejný odkaz na %1$s",
- "Your public link for %1$s expired" : "Veřejný odkaz pro %1$s vypršel",
- "The public link of %2$s for %1$s expired" : "Veřejný odkaz na %2$s pro %1$s vypršel",
- "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s",
- "%2$s removed the share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s",
- "File %1$s shared by email with %2$s was downloaded" : "Soubor %1$s sdílen pomocí emailu s %2$s byl stažen",
- "Folder %1$s shared by email with %2$s was downloaded" : "Adresář %1$s sdílen pomocí emailu s %2$s byl stažen",
+ "File shares" : "Sdílení souboru",
"Downloaded via public link" : "Staženo pomocí veřejného odkazu",
- "Shared with %2$s" : "Sdíleno s %2$s",
- "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s",
- "Removed share for %2$s" : "Odstranil(a) sdílení pro %2$s",
- "%2$s removed share for %3$s" : "%2$s odstranil(a) sdílení pro %3$s",
- "Shared with group %2$s" : "Sdíleno se skupinou %2$s",
- "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s",
- "Removed share of group %2$s" : "Odstranil(a) sdílení skupině %2$s",
- "%2$s removed share of group %3$s" : "%2$s odstranil(a) sdílení skupině %3$s",
- "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz",
- "Shared via public link" : "Sdíleno jako veřejný odkaz",
+ "Downloaded by %1$s" : "Stáhnul(o) %1$s",
+ "Downloaded by {email}" : "Stáhl {email}",
+ "%1$s downloaded via public link" : "%1$s stažen pomocí veřejného odkazu",
+ "{file} downloaded via public link" : "{file} stažen pomocí veřejného odkazu",
+ "%1$s downloaded %2$s" : "%1$s stáhl(a) %2$s",
+ "{email} downloaded {file}" : "{email} stáhnul {file}",
+ "Shared with group %1$s" : "Sdíleno se skupinou %1$s",
+ "Shared with group {group}" : "Sdíleno se skupinou {group}",
+ "Removed share for group %1$s" : "Odstraněno sdílení pro skupinu %1$s",
+ "Removed share for group {group}" : "Odstranil sdílení pro skupinu {group}",
+ "%2$s shared with group %1$s" : "%2$s sdílel se skupinou %1$s",
+ "{actor} shared with group {group}" : "{actor} sdílel(a) se skupinou {group}",
+ "%2$s removed share for group %1$s" : "%2$s odstranil(a) sdílení pro skupinu %1$s",
+ "{actor} removed share for group {group}" : "{actor} odstranil(a) sdílení pro skupinu {group}",
+ "You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s",
+ "You shared {file} with group {group}" : "Se skupinou {group} jste nasdílel(a) {file}",
+ "You removed group %2$s from %1$s" : "Z %1$s jste odstranil(a) skupinu %2$s",
+ "You removed group {group} from {file}" : "Z {file} jste odstranil(a) skupinu {group}",
+ "%3$s shared %1$s with group %2$s" : "%3$s sdílel %1$s se skupinou %2$s",
+ "{actor} shared {file} with group {group}" : "{actor} sdílel(a) {file} se skupinou {group}",
+ "%3$s removed group %2$s from %1$s" : "%3$s odstranil(a) z %1$s skupinu %2$s",
+ "{actor} removed group {group} from {file}" : "{actor} odstranil(a) skupinu {group} z {file}",
+ "Shared as public link" : "Sdíleno jako veřejný odkaz",
"Removed public link" : "Odstranil(a) veřejný odkaz",
- "%2$s removed public link" : "%2$s odstranil(a) veřejný odkaz",
- "Public link expired" : "Veřejný odkaz vypršel",
- "Public link of %2$s expired" : "Veřejný odkaz %2$s vypršel",
- "Shared by %2$s" : "%2$s sdílel(a)",
- "Downloaded by %2$s" : "Staženo uživatelem %2$s",
- "File shares" : "Sdílení souboru",
+ "%1$s shared as public link" : "%1$s sdílen jako veřejný odkaz",
+ "{actor} shared as public link" : "{actor} sdílel(a) jako veřejný odkaz",
+ "%1$s removed public link" : "%1$s odstranil(a) veřejný odkaz",
+ "{actor} removed public link" : "{actor} odstranil(a) veřejný odkaz",
+ "You shared %1$s as public link" : "Sdílel(a) jste %1$s jako veřejný odkaz",
+ "You shared {file} as public link" : "Sdílel(a) jste {file} jako veřejný odkaz",
+ "You removed public link for %1$s" : "Odstranil(a) jste veřejný odkaz pro %1$s",
+ "You removed public link for {file}" : "Odstranil(a) jste veřejný odkaz pro {file}",
+ "%2$s shared %1$s as public link" : "%2$s sdílel(a) %1$s jako veřejný odkaz",
+ "{actor} shared {file} as public link" : "{actor} sdílel(a) {file} jako veřejný odkaz",
+ "%2$s removed public link for %1$s" : "%2$s odstranil veřejný odkaz z %1$s",
+ "{actor} removed public link for {file}" : "{actor} odstranil(a) veřejný odkaz pro {file}",
+ "%1$s accepted the remote share" : "%1$s přijal(a) vzdálené sdílení",
+ "{user} accepted the remote share" : "{user} přijal(a) vzdálené sdílení",
+ "%1$s declined the remote share" : "%1$s odmítl(a) vzdálené sdílení",
+ "{user} declined the remote share" : "{user} odmítl vzdálené sdílení",
+ "You received a new remote share %1$s from %2$s" : "Obdržel(a) jste nové vzdálené sdílení %1$s z %2$s",
+ "You received a new remote share {file} from {user}" : "Obdržel(a) jste nové vzdálené sdílení souboru {file} od {user}",
+ "%2$s accepted the remote share of %1$s" : "%2$s přijal(a) vzdálené sdílení %1$s",
+ "{user} accepted the remote share of {file}" : "{user} přijal vzdálené sdílení souboru {file}",
+ "%2$s declined the remote share of %1$s" : "%2$s odmítl vzdálené sdílení %1$s",
+ "{user} declined the remote share of {file}" : "{user} odmítl(a) vzdálené sdílení {file}",
+ "%2$s unshared %1$s from you" : "%2$s s vámi přestal(a) sdílet %1$s",
+ "{user} unshared {file} from you" : "{user} s vámi již nesdílí soubor {file}",
+ "Shared with %1$s" : "Sdíleno s %1$s",
+ "Shared with {user}" : "Sdíleno s {user}",
+ "Removed share for %1$s" : "Odstraněno sdílení %1$s",
+ "Removed share for {user}" : "Odstraněno sdílení pro {user}",
+ "%2$s shared with %1$s" : "%2$s sdíleno s %1$s",
+ "{actor} shared with {user}" : "{actor} sdílel(a) s {user}",
+ "%2$s removed share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s",
+ "{actor} removed share for {user}" : "{actor} odstranil(a) sdílení pro {user}",
+ "Shared by %1$s" : "Sdíleno %1$s",
+ "Shared by {actor}" : "Sdílel {actor}",
+ "%1$s removed share" : "%1$s odstranil(a) sdílení",
+ "{actor} removed share" : "{actor} odebral(a) sdílení",
+ "You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s",
+ "You shared {file} with {user}" : "Sdílel(a) jste {file} s {user}",
+ "You removed %2$s from %1$s" : "Odstranil(a) jste %2$s z %1$s",
+ "You removed {user} from {file}" : "Odstranil(a) jste uživatele {user} z {file}",
+ "%3$s shared %1$s with %2$s" : "%3$s s %2$s sdílel(a) %1$s",
+ "{actor} removed {user} from {file}" : "{actor} odstranil(a) uživatele {user} z {file}",
+ "%3$s removed %2$s from %1$s" : "%3$s odstranil(a) %2$s z %1$s",
+ "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s",
+ "{actor} shared {file} with you" : "{actor} s vámi sdílel(a) soubor {file}",
+ "%2$s removed you from %1$s" : "%2$s vás odstranil(a) z %1$s",
+ "{actor} removed you from {file}" : "{actor} vás odstranil(a) ze souboru {file}",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> soubor nebo adresář sdílený jako veřejný odkaz",
+ "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>",
+ "A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>",
"Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje",
"could not delete share" : "nelze smazat sdílení",
"Could not delete share" : "Nelze smazat sdílení",
@@ -107,36 +137,40 @@
"Uploading files…" : "Probíhá nahrávání souborů...",
"Uploaded files:" : "Nahrané soubory:",
"A public shared file or folder was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> veřejně sdílený soubor nebo adresář",
- "Shares" : "Sdílení",
- "Server to server sharing is not enabled on this server" : "Sdílení mezi servery není na tomto serveru povoleno",
- "The mountpoint name contains invalid characters." : "Jméno přípojného bodu obsahuje nepovolené znaky.",
- "Not allowed to create a federated share with the same user server" : "Není povoleno vytvořit propojené sdílení s tím samým serverem",
- "Invalid or untrusted SSL certificate" : "Neplatný nebo nedůvěryhodný SSL certifikát",
- "Could not authenticate to remote share, password might be wrong" : "Nezdařilo se přihlášení ke vzdálenému úložišti, nejspíše bylo zadáno chybné heslo",
- "Storage not valid" : "Úložiště není platné",
- "Couldn't add remote share" : "Nelze přidat vzdálené úložiště",
- "Federated sharing" : "Propojené sdílení",
- "Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete přidat vzdálené úložiště {name} uživatele {owner}@{remote}?",
- "Remote share" : "Vzdálené úložiště",
- "Remote share password" : "Heslo ke vzdálenému úložišti",
- "Cancel" : "Zrušit",
- "Add remote share" : "Přidat vzdálené úložiště",
- "No ownCloud installation (7 or higher) found at {remote}" : "Nebyla nalezena instalace ownCloud (7 nebo vyšší) na {remote}",
- "Invalid ownCloud url" : "Neplatná ownCloud url",
- "You received \"/%2$s\" as a remote share from %1$s" : "Obdrželi jste \"/%2$s\" jako vzdálené sdílení od %1$s",
- "Accept" : "Přijmout",
- "Decline" : "Zamítnout",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID",
- "Federated Cloud Sharing" : "Propojené cloudové sdílení",
- "Open documentation" : "Otevřít dokumentaci",
- "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
- "Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů",
- "Federated Cloud" : "Sdružený cloud",
- "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
- "Share it:" : "Sdílet:",
- "Add to your website" : "Přidat na svou webovou stránku",
- "Share with me via Nextcloud" : "Sdíleno se mnou přes Nextcloud",
- "HTML Code:" : "HTML kód:"
+ "You received a new remote share %2$s from %1$s" : "Obdrželi jste nové vzdálené sdílení %2$s od uživatele %1$s",
+ "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s",
+ "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s",
+ "%1$s declined remote share %2$s" : "%1$s odmítl(a) vzdálené sdílení %2$s",
+ "%1$s unshared %2$s from you" : "%1$s již více nesdílí %2$s",
+ "Public shared folder %1$s was downloaded" : "Byl stažen veřejně sdílený adresář %1$s ",
+ "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ",
+ "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s",
+ "You removed the share of %2$s for %1$s" : "Odstranil(a) jsi sdílení %2$s pro %1$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s odstranil(a) sdílení %3$s pro %1$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s",
+ "You removed the share of group %2$s for %1$s" : "Odstranil(a) jsi sdílení skupině %2$s pro %1$s",
+ "%2$s removed the share of group %3$s for %1$s" : "%2$s odstranil(a) sdílení skupině %3$s pro %1$s",
+ "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz",
+ "You shared %1$s via link" : "Sdílíte %1$s přes odkaz",
+ "You removed the public link for %1$s" : "Odstranil(a) jsi veřejný odkaz na %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s odstranil(a) veřejný odkaz na %1$s",
+ "Your public link for %1$s expired" : "Veřejný odkaz pro %1$s vypršel",
+ "The public link of %2$s for %1$s expired" : "Veřejný odkaz na %2$s pro %1$s vypršel",
+ "%2$s removed the share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s",
+ "Shared with %2$s" : "Sdíleno s %2$s",
+ "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s",
+ "Removed share for %2$s" : "Odstranil(a) sdílení pro %2$s",
+ "%2$s removed share for %3$s" : "%2$s odstranil(a) sdílení pro %3$s",
+ "Shared with group %2$s" : "Sdíleno se skupinou %2$s",
+ "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s",
+ "Removed share of group %2$s" : "Odstranil(a) sdílení skupině %2$s",
+ "%2$s removed share of group %3$s" : "%2$s odstranil(a) sdílení skupině %3$s",
+ "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz",
+ "Shared via public link" : "Sdíleno jako veřejný odkaz",
+ "%2$s removed public link" : "%2$s odstranil(a) veřejný odkaz",
+ "Public link expired" : "Veřejný odkaz vypršel",
+ "Public link of %2$s expired" : "Veřejný odkaz %2$s vypršel",
+ "Shared by %2$s" : "%2$s sdílel(a)",
+ "Shares" : "Sdílení"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index ce7f6154280..095483d6167 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -13,7 +13,7 @@ OC.L10N.register(
"You can upload into this folder" : "Vous pouvez téléverser dans ce dossier",
"No compatible server found at {remote}" : "Aucun serveur compatible trouvé sur {remote}",
"Invalid server URL" : "URL serveur invalide",
- "Failed to add the public link to your Nextcloud" : "Echec de l'ajout du lien public à votre Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Échec de l'ajout du lien public à votre Nextcloud",
"Share" : "Partager",
"No expiration date set" : "Aucune date d'expiration définie",
"Shared by" : "Partagé par",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index ba1cc34f790..024e9f7983d 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -11,7 +11,7 @@
"You can upload into this folder" : "Vous pouvez téléverser dans ce dossier",
"No compatible server found at {remote}" : "Aucun serveur compatible trouvé sur {remote}",
"Invalid server URL" : "URL serveur invalide",
- "Failed to add the public link to your Nextcloud" : "Echec de l'ajout du lien public à votre Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Échec de l'ajout du lien public à votre Nextcloud",
"Share" : "Partager",
"No expiration date set" : "Aucune date d'expiration définie",
"Shared by" : "Partagé par",
diff --git a/apps/files_sharing/l10n/pl.js b/apps/files_sharing/l10n/pl.js
index e1bec669533..0e2339b6581 100644
--- a/apps/files_sharing/l10n/pl.js
+++ b/apps/files_sharing/l10n/pl.js
@@ -1,55 +1,168 @@
OC.L10N.register(
"files_sharing",
{
- "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",
+ "Files and folders you share will show up here" : "Pliki 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",
- "Cancel" : "Anuluj",
- "Add remote share" : "Dodaj zdalny zasób",
- "No ownCloud installation (7 or higher) found at {remote}" : "Nie znaleziono instalacji ownCloud (w wersji 7 lub nowszej) na {remote}",
- "Invalid ownCloud url" : "Błędny adres URL",
+ "Files and folders you share by link will show up here" : "Pliki i foldery, które udostępniasz, pokażą się tutaj",
+ "You can upload into this folder" : "Możesz przesłać do tego folderu",
+ "No compatible server found at {remote}" : "Nie znaleziono kompatybilnego serwera na {remote}",
+ "Invalid server URL" : "Błędny adres serwera",
+ "Failed to add the public link to your Nextcloud" : "Nie udało się dodać linku do publicznego Nextcloud",
+ "Share" : "Udostępnij",
+ "No expiration date set" : "Nie ustawiono daty wygaśnięcia",
"Shared by" : "Udostępniane przez",
"Sharing" : "Udostępnianie",
+ "File shares" : "Udziały",
+ "Downloaded via public link" : "Pobierane poprzez link publiczny",
+ "Downloaded by %1$s" : "Pobierane przez %1$s",
+ "Downloaded by {email}" : "Pobierane przez {email}",
+ "%1$s downloaded via public link" : "%1$s pobierane za pośrednictwem łącza publicznego",
+ "{file} downloaded via public link" : "{file} pobierane za pośrednictwem łącza publicznego",
+ "%1$s downloaded %2$s" : "%1$s pobierane %2$s",
+ "{email} downloaded {file}" : "{email} pobierane {file}",
+ "Shared with group %1$s" : "Udostępnione grupie %1$s",
+ "Shared with group {group}" : "Udostępnione grupie {group}",
+ "Removed share for group %1$s" : "Zakończono udostępnianie grupie %1$s",
+ "Removed share for group {group}" : "Zakończono udostępnianie grupie {group}",
+ "%2$s shared with group %1$s" : "%2$s jest udostępniane grupie %1$s",
+ "{actor} shared with group {group}" : "{actor} udostępnił grupie {group}",
+ "%2$s removed share for group %1$s" : "%2$s zakończył udostępnianie grupie %1$s",
+ "{actor} removed share for group {group}" : "{actor} zakończył udostępnianie grupie {group}",
+ "You shared %1$s with group %2$s" : "Współdzielisz %1$s z grupą %2$s",
+ "You shared {file} with group {group}" : "Udostępniasz {file} grupie {group}",
+ "You removed group %2$s from %1$s" : "Usunąłeś grupę %2$s z %1$s",
+ "You removed group {group} from {file}" : "Usunąłeś grupę {group} z {file}",
+ "%3$s shared %1$s with group %2$s" : "%3$s udostępnił %1$s grupie %2$s",
+ "{actor} shared {file} with group {group}" : "{actor} udostępnił {file} grupie {group}",
+ "%3$s removed group %2$s from %1$s" : "%3$s usunął grupę %2$s z %1$s",
+ "{actor} removed group {group} from {file}" : "{actor} usunął grupę {group} z {file}",
+ "Shared as public link" : "Udostępnione jako publiczny link",
+ "Removed public link" : "Usunięto link publiczny",
+ "%1$s shared as public link" : "%1$s udostępnione jako publiczny link",
+ "{actor} shared as public link" : "{actor} udostępniony jako publiczny link",
+ "%1$s removed public link" : "%1$s usunąłeś publiczny link",
+ "{actor} removed public link" : "{actor} usunął publiczny link",
+ "You shared %1$s as public link" : "Udostępniasz %1$s jako publiczny link",
+ "You shared {file} as public link" : "Udostępniasz {file} jako publiczny link",
+ "You removed public link for %1$s" : "Usuwasz link publiczny dla %1$s",
+ "You removed public link for {file}" : "Usuwasz link publiczny dla {file}",
+ "%2$s shared %1$s as public link" : "%2$s udostępnił %1$s jako publiczne łącze",
+ "{actor} shared {file} as public link" : "{actor} udostępnił {file} jako publiczne łącze",
+ "%2$s removed public link for %1$s" : "%2$s usunął publiczne łącze do %1$s",
+ "{actor} removed public link for {file}" : "{actor} usunął publiczne łącze do {file}",
+ "%1$s accepted the remote share" : "%1$s zaakceptował zdalny udział",
+ "{user} accepted the remote share" : "{user} zaakceptował zdalny udział",
+ "%1$s declined the remote share" : "%1$s odrzucił zdalny udział",
+ "{user} declined the remote share" : "{user} odrzucił zdalny udział",
+ "You received a new remote share %1$s from %2$s" : "Otrzymałeś nowy zdalny udział %1$s od użytkownika %2$s",
+ "You received a new remote share {file} from {user}" : "Otrzymałeś nowy zdalny udział {file} od użytkownika {user}",
+ "%2$s accepted the remote share of %1$s" : "%2$s zaakceptował zdalny udział %1$s",
+ "{user} accepted the remote share of {file}" : "{user} zaakceptował zdalny udział {file}",
+ "%2$s declined the remote share of %1$s" : "%2$s odrzucił zdalny udział %1$s",
+ "{user} declined the remote share of {file}" : "{user} odrzucił zadalny udział {file}",
+ "%2$s unshared %1$s from you" : "%2$s przestał ci udostępniać %1$s",
+ "{user} unshared {file} from you" : "{user} przestał ci udostępniać {file}",
+ "Shared with %1$s" : "Udostępnione %1$s",
+ "Shared with {user}" : "Udostępnione użytkownikowi {user}",
+ "Removed share for %1$s" : "Zakończono udostępnianie użytkownikowi %1$s",
+ "Removed share for {user}" : "Zakończono udostępnianie użytkownikowi {user}",
+ "%2$s shared with %1$s" : "%2$s udostępnia użytkownikowi %1$s",
+ "{actor} shared with {user}" : "{actor} udostępnia użytkownikowi {user}",
+ "%2$s removed share for %1$s" : "%2$s usuwa udostępnienie dla użytkownika %1$s",
+ "{actor} removed share for {user}" : "{actor} usuwa udostępnienie dla użytkownika {user}",
+ "Shared by %1$s" : "Udostępnione przez użytkownika %1$s",
+ "Shared by {actor}" : "Udostępnione przez użytkownika {actor}",
+ "%1$s removed share" : "%1$s usunął udostępnienie",
+ "{actor} removed share" : "{actor} usunął udostępnienie",
+ "You shared %1$s with %2$s" : "Współdzielisz %1$s z %2$s",
+ "You shared {file} with {user}" : "Współdzielisz {file} z {user}",
+ "You removed %2$s from %1$s" : "Usunąłeś użytkownika %2$s z %1$s",
+ "You removed {user} from {file}" : "Usunąłeś użytkownika {user} z {file}",
+ "%3$s shared %1$s with %2$s" : "%3$s udostępnił %1$s użytkownikowi %2$s",
+ "{actor} removed {user} from {file}" : "{actor} usunął użytkownika {user} z {file}",
+ "%3$s removed %2$s from %1$s" : "%3$s usunął użytkownika %2$s z %1$s",
+ "%2$s shared %1$s with you" : "%2$s współdzieli %1$s z Tobą",
+ "{actor} shared {file} with you" : "{actor} udostępnił ci {file}",
+ "%2$s removed you from %1$s" : "%2$s usunął cię z %1$s",
+ "{actor} removed you from {file}" : "{actor} usunął cie z {file}",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Plik lub folder udostępniony za pomocą maila lub publicznego łącza został <strong>pobrany</strong>",
+ "A file or folder was shared from <strong>another server</strong>" : "Plik lub folder został udostępniony z <strong>innego serwera</strong>",
+ "A file or folder has been <strong>shared</strong>" : "Plik lub folder stał się <strong>współdzielony</strong>",
+ "Wrong share ID, share doesn't exist" : "Złe ID udziału, udział nie istnieje",
+ "could not delete share" : "nie można usunąć udział",
+ "Could not delete share" : "Nie można usunąć udział",
+ "Please specify a file or folder path" : "Proszę podać pliku lub ścieżkę do folderu",
+ "Wrong path, file/folder doesn't exist" : "Ścieżka nieprawidłowa, plik/folder nie istnieje",
+ "Could not create share" : "Nie można utworzyć udział",
+ "invalid permissions" : "nieprawidłowe uprawnienia",
+ "Please specify a valid user" : "Proszę podać poprawnego użytkownika",
+ "Group sharing is disabled by the administrator" : "Udostępnianie grupy zostało wyłączone przez administratora",
+ "Please specify a valid group" : "Proszę podać prawidłową grupę",
"Public link sharing is disabled by the administrator" : "Udostępnianie linków publicznych zostało zablokowane przez twojego administratora",
"Public upload disabled by the administrator" : "Publiczne wczytywanie zostało zablokowane przez twojego administratora",
"Public upload is only possible for publicly shared folders" : "Publiczne wczytywanie jest możliwe wyłącznie do katalogów publicznych",
- "A file or folder has been <strong>shared</strong>" : "Plik lub folder stał się <strong>współdzielony</strong>",
- "You shared %1$s with %2$s" : "Współdzielisz %1$s z %2$s",
- "You shared %1$s with group %2$s" : "Współdzielisz %1$s z grupą %2$s",
- "You shared %1$s via link" : "Udostępniasz %1$s przez link",
- "%2$s shared %1$s with you" : "%2$s współdzieli %1$s z Tobą",
- "%2$s removed the share for %1$s" : "%2$s usunął udział dla %1$s",
- "Shares" : "Udziały",
+ "Invalid date, date format must be YYYY-MM-DD" : "Nieprawidłowa data, format daty musi być YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Udostępnienie %s nie powiodło się ponieważ backend nie zezwala na udziały typu %s",
+ "Unknown share type" : "Nieznany typ udziału",
+ "Not a directory" : "Nie jest katalogiem",
+ "Could not lock path" : "Nie udało się zablokować ścieżki",
+ "Wrong or no update parameter given" : "Brakujący lub błędny parametr aktualizacji",
+ "Can't change permissions for public share links" : "Nie można zmienić uprawnień dla publicznych udziałów",
+ "Cannot increase permissions" : "Nie można zwiększyć uprawnień",
+ "%s is publicly shared" : "%s jest publicznie dostępny",
+ "Share API is disabled" : "API udostępniania jest wyłączone",
"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",
+ "Expiration date" : "Data wygaśnięcia",
"Sorry, this link doesn’t seem to work anymore." : "Przepraszamy ale wygląda na to, że ten link już nie działa.",
"Reasons might be:" : "Możliwe powody:",
"the item was removed" : "element został usunięty",
"the link expired" : "link wygasł",
"sharing is disabled" : "udostępnianie jest wyłączone",
"For more info, please ask the person who sent this link." : "Aby uzyskać więcej informacji proszę poprosić osobę, która wysłał ten link.",
- "Add to your ownCloud" : "Dodaj do twojego ownCloud",
+ "Add to your Nextcloud" : "Dodaj do swojego Nextcloud",
"Download" : "Pobierz",
"Download %s" : "Pobierz %s",
- "Direct link" : "Bezpośredni link"
+ "Direct link" : "Bezpośredni link",
+ "Upload files to %s" : "Prześlij pliki do %s",
+ "Select or drop files" : "Wybierz i upuść pliki",
+ "Uploading files…" : "Wysyłanie plików...",
+ "Uploaded files:" : "Wysłane pliki:",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Publicznie udostępniony plik lub katalog został <strong>pobrany</strong>",
+ "You received a new remote share %2$s from %1$s" : "Otrzymałeś nowy udział zdalny %2$s z %1$s",
+ "You received a new remote share from %s" : "Otrzymałeś nowy zdalny udział z %s",
+ "%1$s accepted remote share %2$s" : "%1$s zaakceptował zdalny udział %2$s",
+ "%1$s declined remote share %2$s" : "%1$s odrzucił zdalny udział %2$s",
+ "%1$s unshared %2$s from you" : "%1$s zakończył udostępnianie Ci %2$s",
+ "Public shared folder %1$s was downloaded" : "Udostępniony publicznie folder %1$s został pobrany",
+ "Public shared file %1$s was downloaded" : "Udostępniony publicznie plik %1$s został pobrany",
+ "%2$s shared %1$s with %3$s" : "%2$s udostępnił %1$s użytkownikowi %3$s",
+ "You removed the share of %2$s for %1$s" : "Zakończyłeś udostępnianie %2$s użytkownikowi %1$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s zakończył udostępnianie %3$s użytkownikowi %1$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s udostępnił %1$s grupie %3$s",
+ "%2$s shared %1$s via link" : "%2$s udostępnił %1$s poprzez łącze",
+ "You shared %1$s via link" : "Udostępniasz %1$s przez link",
+ "Your public link for %1$s expired" : "Twoje publiczne łącze do %1$s wygasło",
+ "%2$s removed the share for %1$s" : "%2$s usunął udział dla %1$s",
+ "Shared with %2$s" : "Współdzielone z %2$s",
+ "Shared with %3$s by %2$s" : "Udostępniono użytkownikowi %3$s przez %2$s",
+ "Shared with group %2$s" : "Udostępniono grupie %2$s",
+ "Shared with group %3$s by %2$s" : "Udostępniono grupie %3$s przez użytkownika %2$s",
+ "Shared via link by %2$s" : "Udostępniono za pomocą łącza przez użytkownika %2$s",
+ "Shared via public link" : "Udostępniono przez publiczne łącze",
+ "%2$s removed public link" : "%2$s usunął publiczne łącze",
+ "Public link expired" : "Link publiczny wygasł",
+ "Shared by %2$s" : "Udostępniane przez %2$s",
+ "Shares" : "Udziały"
},
"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/pl.json b/apps/files_sharing/l10n/pl.json
index 6190871b16f..955222647b3 100644
--- a/apps/files_sharing/l10n/pl.json
+++ b/apps/files_sharing/l10n/pl.json
@@ -1,53 +1,166 @@
{ "translations": {
- "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",
+ "Files and folders you share will show up here" : "Pliki 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",
- "Cancel" : "Anuluj",
- "Add remote share" : "Dodaj zdalny zasób",
- "No ownCloud installation (7 or higher) found at {remote}" : "Nie znaleziono instalacji ownCloud (w wersji 7 lub nowszej) na {remote}",
- "Invalid ownCloud url" : "Błędny adres URL",
+ "Files and folders you share by link will show up here" : "Pliki i foldery, które udostępniasz, pokażą się tutaj",
+ "You can upload into this folder" : "Możesz przesłać do tego folderu",
+ "No compatible server found at {remote}" : "Nie znaleziono kompatybilnego serwera na {remote}",
+ "Invalid server URL" : "Błędny adres serwera",
+ "Failed to add the public link to your Nextcloud" : "Nie udało się dodać linku do publicznego Nextcloud",
+ "Share" : "Udostępnij",
+ "No expiration date set" : "Nie ustawiono daty wygaśnięcia",
"Shared by" : "Udostępniane przez",
"Sharing" : "Udostępnianie",
+ "File shares" : "Udziały",
+ "Downloaded via public link" : "Pobierane poprzez link publiczny",
+ "Downloaded by %1$s" : "Pobierane przez %1$s",
+ "Downloaded by {email}" : "Pobierane przez {email}",
+ "%1$s downloaded via public link" : "%1$s pobierane za pośrednictwem łącza publicznego",
+ "{file} downloaded via public link" : "{file} pobierane za pośrednictwem łącza publicznego",
+ "%1$s downloaded %2$s" : "%1$s pobierane %2$s",
+ "{email} downloaded {file}" : "{email} pobierane {file}",
+ "Shared with group %1$s" : "Udostępnione grupie %1$s",
+ "Shared with group {group}" : "Udostępnione grupie {group}",
+ "Removed share for group %1$s" : "Zakończono udostępnianie grupie %1$s",
+ "Removed share for group {group}" : "Zakończono udostępnianie grupie {group}",
+ "%2$s shared with group %1$s" : "%2$s jest udostępniane grupie %1$s",
+ "{actor} shared with group {group}" : "{actor} udostępnił grupie {group}",
+ "%2$s removed share for group %1$s" : "%2$s zakończył udostępnianie grupie %1$s",
+ "{actor} removed share for group {group}" : "{actor} zakończył udostępnianie grupie {group}",
+ "You shared %1$s with group %2$s" : "Współdzielisz %1$s z grupą %2$s",
+ "You shared {file} with group {group}" : "Udostępniasz {file} grupie {group}",
+ "You removed group %2$s from %1$s" : "Usunąłeś grupę %2$s z %1$s",
+ "You removed group {group} from {file}" : "Usunąłeś grupę {group} z {file}",
+ "%3$s shared %1$s with group %2$s" : "%3$s udostępnił %1$s grupie %2$s",
+ "{actor} shared {file} with group {group}" : "{actor} udostępnił {file} grupie {group}",
+ "%3$s removed group %2$s from %1$s" : "%3$s usunął grupę %2$s z %1$s",
+ "{actor} removed group {group} from {file}" : "{actor} usunął grupę {group} z {file}",
+ "Shared as public link" : "Udostępnione jako publiczny link",
+ "Removed public link" : "Usunięto link publiczny",
+ "%1$s shared as public link" : "%1$s udostępnione jako publiczny link",
+ "{actor} shared as public link" : "{actor} udostępniony jako publiczny link",
+ "%1$s removed public link" : "%1$s usunąłeś publiczny link",
+ "{actor} removed public link" : "{actor} usunął publiczny link",
+ "You shared %1$s as public link" : "Udostępniasz %1$s jako publiczny link",
+ "You shared {file} as public link" : "Udostępniasz {file} jako publiczny link",
+ "You removed public link for %1$s" : "Usuwasz link publiczny dla %1$s",
+ "You removed public link for {file}" : "Usuwasz link publiczny dla {file}",
+ "%2$s shared %1$s as public link" : "%2$s udostępnił %1$s jako publiczne łącze",
+ "{actor} shared {file} as public link" : "{actor} udostępnił {file} jako publiczne łącze",
+ "%2$s removed public link for %1$s" : "%2$s usunął publiczne łącze do %1$s",
+ "{actor} removed public link for {file}" : "{actor} usunął publiczne łącze do {file}",
+ "%1$s accepted the remote share" : "%1$s zaakceptował zdalny udział",
+ "{user} accepted the remote share" : "{user} zaakceptował zdalny udział",
+ "%1$s declined the remote share" : "%1$s odrzucił zdalny udział",
+ "{user} declined the remote share" : "{user} odrzucił zdalny udział",
+ "You received a new remote share %1$s from %2$s" : "Otrzymałeś nowy zdalny udział %1$s od użytkownika %2$s",
+ "You received a new remote share {file} from {user}" : "Otrzymałeś nowy zdalny udział {file} od użytkownika {user}",
+ "%2$s accepted the remote share of %1$s" : "%2$s zaakceptował zdalny udział %1$s",
+ "{user} accepted the remote share of {file}" : "{user} zaakceptował zdalny udział {file}",
+ "%2$s declined the remote share of %1$s" : "%2$s odrzucił zdalny udział %1$s",
+ "{user} declined the remote share of {file}" : "{user} odrzucił zadalny udział {file}",
+ "%2$s unshared %1$s from you" : "%2$s przestał ci udostępniać %1$s",
+ "{user} unshared {file} from you" : "{user} przestał ci udostępniać {file}",
+ "Shared with %1$s" : "Udostępnione %1$s",
+ "Shared with {user}" : "Udostępnione użytkownikowi {user}",
+ "Removed share for %1$s" : "Zakończono udostępnianie użytkownikowi %1$s",
+ "Removed share for {user}" : "Zakończono udostępnianie użytkownikowi {user}",
+ "%2$s shared with %1$s" : "%2$s udostępnia użytkownikowi %1$s",
+ "{actor} shared with {user}" : "{actor} udostępnia użytkownikowi {user}",
+ "%2$s removed share for %1$s" : "%2$s usuwa udostępnienie dla użytkownika %1$s",
+ "{actor} removed share for {user}" : "{actor} usuwa udostępnienie dla użytkownika {user}",
+ "Shared by %1$s" : "Udostępnione przez użytkownika %1$s",
+ "Shared by {actor}" : "Udostępnione przez użytkownika {actor}",
+ "%1$s removed share" : "%1$s usunął udostępnienie",
+ "{actor} removed share" : "{actor} usunął udostępnienie",
+ "You shared %1$s with %2$s" : "Współdzielisz %1$s z %2$s",
+ "You shared {file} with {user}" : "Współdzielisz {file} z {user}",
+ "You removed %2$s from %1$s" : "Usunąłeś użytkownika %2$s z %1$s",
+ "You removed {user} from {file}" : "Usunąłeś użytkownika {user} z {file}",
+ "%3$s shared %1$s with %2$s" : "%3$s udostępnił %1$s użytkownikowi %2$s",
+ "{actor} removed {user} from {file}" : "{actor} usunął użytkownika {user} z {file}",
+ "%3$s removed %2$s from %1$s" : "%3$s usunął użytkownika %2$s z %1$s",
+ "%2$s shared %1$s with you" : "%2$s współdzieli %1$s z Tobą",
+ "{actor} shared {file} with you" : "{actor} udostępnił ci {file}",
+ "%2$s removed you from %1$s" : "%2$s usunął cię z %1$s",
+ "{actor} removed you from {file}" : "{actor} usunął cie z {file}",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Plik lub folder udostępniony za pomocą maila lub publicznego łącza został <strong>pobrany</strong>",
+ "A file or folder was shared from <strong>another server</strong>" : "Plik lub folder został udostępniony z <strong>innego serwera</strong>",
+ "A file or folder has been <strong>shared</strong>" : "Plik lub folder stał się <strong>współdzielony</strong>",
+ "Wrong share ID, share doesn't exist" : "Złe ID udziału, udział nie istnieje",
+ "could not delete share" : "nie można usunąć udział",
+ "Could not delete share" : "Nie można usunąć udział",
+ "Please specify a file or folder path" : "Proszę podać pliku lub ścieżkę do folderu",
+ "Wrong path, file/folder doesn't exist" : "Ścieżka nieprawidłowa, plik/folder nie istnieje",
+ "Could not create share" : "Nie można utworzyć udział",
+ "invalid permissions" : "nieprawidłowe uprawnienia",
+ "Please specify a valid user" : "Proszę podać poprawnego użytkownika",
+ "Group sharing is disabled by the administrator" : "Udostępnianie grupy zostało wyłączone przez administratora",
+ "Please specify a valid group" : "Proszę podać prawidłową grupę",
"Public link sharing is disabled by the administrator" : "Udostępnianie linków publicznych zostało zablokowane przez twojego administratora",
"Public upload disabled by the administrator" : "Publiczne wczytywanie zostało zablokowane przez twojego administratora",
"Public upload is only possible for publicly shared folders" : "Publiczne wczytywanie jest możliwe wyłącznie do katalogów publicznych",
- "A file or folder has been <strong>shared</strong>" : "Plik lub folder stał się <strong>współdzielony</strong>",
- "You shared %1$s with %2$s" : "Współdzielisz %1$s z %2$s",
- "You shared %1$s with group %2$s" : "Współdzielisz %1$s z grupą %2$s",
- "You shared %1$s via link" : "Udostępniasz %1$s przez link",
- "%2$s shared %1$s with you" : "%2$s współdzieli %1$s z Tobą",
- "%2$s removed the share for %1$s" : "%2$s usunął udział dla %1$s",
- "Shares" : "Udziały",
+ "Invalid date, date format must be YYYY-MM-DD" : "Nieprawidłowa data, format daty musi być YYYY-MM-DD",
+ "Sharing %s failed because the back end does not allow shares from type %s" : "Udostępnienie %s nie powiodło się ponieważ backend nie zezwala na udziały typu %s",
+ "Unknown share type" : "Nieznany typ udziału",
+ "Not a directory" : "Nie jest katalogiem",
+ "Could not lock path" : "Nie udało się zablokować ścieżki",
+ "Wrong or no update parameter given" : "Brakujący lub błędny parametr aktualizacji",
+ "Can't change permissions for public share links" : "Nie można zmienić uprawnień dla publicznych udziałów",
+ "Cannot increase permissions" : "Nie można zwiększyć uprawnień",
+ "%s is publicly shared" : "%s jest publicznie dostępny",
+ "Share API is disabled" : "API udostępniania jest wyłączone",
"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",
+ "Expiration date" : "Data wygaśnięcia",
"Sorry, this link doesn’t seem to work anymore." : "Przepraszamy ale wygląda na to, że ten link już nie działa.",
"Reasons might be:" : "Możliwe powody:",
"the item was removed" : "element został usunięty",
"the link expired" : "link wygasł",
"sharing is disabled" : "udostępnianie jest wyłączone",
"For more info, please ask the person who sent this link." : "Aby uzyskać więcej informacji proszę poprosić osobę, która wysłał ten link.",
- "Add to your ownCloud" : "Dodaj do twojego ownCloud",
+ "Add to your Nextcloud" : "Dodaj do swojego Nextcloud",
"Download" : "Pobierz",
"Download %s" : "Pobierz %s",
- "Direct link" : "Bezpośredni link"
+ "Direct link" : "Bezpośredni link",
+ "Upload files to %s" : "Prześlij pliki do %s",
+ "Select or drop files" : "Wybierz i upuść pliki",
+ "Uploading files…" : "Wysyłanie plików...",
+ "Uploaded files:" : "Wysłane pliki:",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Publicznie udostępniony plik lub katalog został <strong>pobrany</strong>",
+ "You received a new remote share %2$s from %1$s" : "Otrzymałeś nowy udział zdalny %2$s z %1$s",
+ "You received a new remote share from %s" : "Otrzymałeś nowy zdalny udział z %s",
+ "%1$s accepted remote share %2$s" : "%1$s zaakceptował zdalny udział %2$s",
+ "%1$s declined remote share %2$s" : "%1$s odrzucił zdalny udział %2$s",
+ "%1$s unshared %2$s from you" : "%1$s zakończył udostępnianie Ci %2$s",
+ "Public shared folder %1$s was downloaded" : "Udostępniony publicznie folder %1$s został pobrany",
+ "Public shared file %1$s was downloaded" : "Udostępniony publicznie plik %1$s został pobrany",
+ "%2$s shared %1$s with %3$s" : "%2$s udostępnił %1$s użytkownikowi %3$s",
+ "You removed the share of %2$s for %1$s" : "Zakończyłeś udostępnianie %2$s użytkownikowi %1$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s zakończył udostępnianie %3$s użytkownikowi %1$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s udostępnił %1$s grupie %3$s",
+ "%2$s shared %1$s via link" : "%2$s udostępnił %1$s poprzez łącze",
+ "You shared %1$s via link" : "Udostępniasz %1$s przez link",
+ "Your public link for %1$s expired" : "Twoje publiczne łącze do %1$s wygasło",
+ "%2$s removed the share for %1$s" : "%2$s usunął udział dla %1$s",
+ "Shared with %2$s" : "Współdzielone z %2$s",
+ "Shared with %3$s by %2$s" : "Udostępniono użytkownikowi %3$s przez %2$s",
+ "Shared with group %2$s" : "Udostępniono grupie %2$s",
+ "Shared with group %3$s by %2$s" : "Udostępniono grupie %3$s przez użytkownika %2$s",
+ "Shared via link by %2$s" : "Udostępniono za pomocą łącza przez użytkownika %2$s",
+ "Shared via public link" : "Udostępniono przez publiczne łącze",
+ "%2$s removed public link" : "%2$s usunął publiczne łącze",
+ "Public link expired" : "Link publiczny wygasł",
+ "Shared by %2$s" : "Udostępniane przez %2$s",
+ "Shares" : "Udziały"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 88e750943d0..e12622cd00e 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -13,7 +13,7 @@ OC.L10N.register(
"You can upload into this folder" : "Вы можете загружать в этот каталог",
"No compatible server found at {remote}" : "Не найден совместимый сервер на {remote}",
"Invalid server URL" : "Неверный URL сервера",
- "Failed to add the public link to your Nextcloud" : "Не получилось добавить публичную ссылку на ваш Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Не получилось добавить общедоступную ссылку в ваш Nextcloud",
"Share" : "Поделиться",
"No expiration date set" : "Дата истечения не установлена",
"Shared by" : "Поделился",
@@ -22,8 +22,8 @@ OC.L10N.register(
"Downloaded via public link" : "Скачано по открытой ссылке",
"Downloaded by %1$s" : "Скачано %1$s",
"Downloaded by {email}" : "Скачано {email}",
- "%1$s downloaded via public link" : "%1$s скачано по публичной ссылке",
- "{file} downloaded via public link" : "{file} скачан по публичной ссылке",
+ "%1$s downloaded via public link" : "%1$s скачано по общедоступной ссылке",
+ "{file} downloaded via public link" : "{file} скачан по общедоступной ссылке",
"%1$s downloaded %2$s" : "%1$s скачан %2$s",
"{email} downloaded {file}" : "{email} скачал {file}",
"Shared with group %1$s" : "Поделился с группой %1$s",
@@ -42,20 +42,20 @@ OC.L10N.register(
"{actor} shared {file} with group {group}" : "{actor} поделился {file} с группой {group}",
"%3$s removed group %2$s from %1$s" : "%3$s удалил группу %2$s из %1$s",
"{actor} removed group {group} from {file}" : "{actor} удалил группу {group} из {file}",
- "Shared as public link" : "Поделился публичной ссылкой",
- "Removed public link" : "Удалена публичная ссылка",
- "%1$s shared as public link" : "%1$s поделился публичной ссылкой",
- "{actor} shared as public link" : "{actor} поделился публичной ссылкой",
- "%1$s removed public link" : "%1$s удалил публичную сслыку",
- "{actor} removed public link" : "{actor} удалил публичную ссылку",
- "You shared %1$s as public link" : "Вы поделись %1$s в виде публичной ссылки",
- "You shared {file} as public link" : "Вы поделись {file} в виде публичной ссылки",
- "You removed public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "You removed public link for {file}" : "Вы удалили публичную ссылку к {file}",
- "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде публичной ссылки",
- "{actor} shared {file} as public link" : "{actor} поделился {file} в виде публичной ссылки",
- "%2$s removed public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "{actor} removed public link for {file}" : "{actor} удалил публичную ссылку к {file}",
+ "Shared as public link" : "Поделился общедоступной ссылкой",
+ "Removed public link" : "Удалена общедоступная ссылка",
+ "%1$s shared as public link" : "%1$s поделился общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} поделился общедоступной ссылкой",
+ "%1$s removed public link" : "%1$s удалил общедоступной сслыку",
+ "{actor} removed public link" : "{actor} удалил общедоступной ссылку",
+ "You shared %1$s as public link" : "Вы поделись %1$s в виде общедоступной ссылки",
+ "You shared {file} as public link" : "Вы поделись {file} в виде общедоступной ссылки",
+ "You removed public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "You removed public link for {file}" : "Вы удалили общедоступную ссылку к {file}",
+ "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} поделился {file} в виде общедоступной ссылки",
+ "%2$s removed public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "{actor} removed public link for {file}" : "{actor} удалил общедоступную ссылку к {file}",
"%1$s accepted the remote share" : "%1$s принял удаленный общий ресурс",
"{user} accepted the remote share" : "{user} принял удаленный общий ресурс",
"%1$s declined the remote share" : "%1$s отклонил удаленный общий ресурс",
@@ -91,7 +91,7 @@ OC.L10N.register(
"{actor} shared {file} with you" : "{actor} поделился {file} с вами",
"%2$s removed you from %1$s" : "%2$s удалил вас из %1$s",
"{actor} removed you from {file}" : "{actor} удалил вас из {file}",
- "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или публичной ссылке, были <strong>скачаны</strong>",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Файлом или каталогом поделились с <strong>удаленного сервера</strong>",
"A file or folder has been <strong>shared</strong>" : "<strong>Опубликован</strong> файл или каталог",
"Wrong share ID, share doesn't exist" : "Неверный идентификатор публикации, публикация не существует",
@@ -154,10 +154,10 @@ OC.L10N.register(
"%2$s removed the share of group %3$s for %1$s" : "%2$s удалил общий доступ к группе %3$s для %1$s",
"%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке",
"You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки",
- "You removed the public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "%2$s removed the public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "Your public link for %1$s expired" : "Срок действия Вашей публичной ссылки к %1$s закончился",
- "The public link of %2$s for %1$s expired" : "Срок действия публичной ссылки к %2$s для %1$s закончился",
+ "You removed the public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "Your public link for %1$s expired" : "Срок действия Вашей общедоступной ссылки к %1$s закончился",
+ "The public link of %2$s for %1$s expired" : "Срок действия общедоступной ссылки к %2$s для %1$s закончился",
"%2$s removed the share for %1$s" : "%2$s удалил общий доступ к %1$s",
"Shared with %2$s" : "Поделился с %2$s",
"Shared with %3$s by %2$s" : "Поделился %2$s с %3$s",
@@ -169,9 +169,9 @@ OC.L10N.register(
"%2$s removed share of group %3$s" : "%2$s удалил общий доступ к группе %3$s",
"Shared via link by %2$s" : "Поделился ссылкой %2$s",
"Shared via public link" : "Поделился открытой ссылкой",
- "%2$s removed public link" : "%2$s удалил публичную ссылку",
- "Public link expired" : "Срок действия публичной ссылки закончился",
- "Public link of %2$s expired" : "Срок действия публичной ссылки к %2$s закончился",
+ "%2$s removed public link" : "%2$s удалил общедоступную ссылку",
+ "Public link expired" : "Срок действия общедоступнной ссылки закончился",
+ "Public link of %2$s expired" : "Срок действия общедоступной ссылки к %2$s закончился",
"Shared by %2$s" : "Поделился %2$s",
"Shares" : "События обмена файлами"
},
diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index 3f5a707ed7b..fe9b1660292 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -11,7 +11,7 @@
"You can upload into this folder" : "Вы можете загружать в этот каталог",
"No compatible server found at {remote}" : "Не найден совместимый сервер на {remote}",
"Invalid server URL" : "Неверный URL сервера",
- "Failed to add the public link to your Nextcloud" : "Не получилось добавить публичную ссылку на ваш Nextcloud",
+ "Failed to add the public link to your Nextcloud" : "Не получилось добавить общедоступную ссылку в ваш Nextcloud",
"Share" : "Поделиться",
"No expiration date set" : "Дата истечения не установлена",
"Shared by" : "Поделился",
@@ -20,8 +20,8 @@
"Downloaded via public link" : "Скачано по открытой ссылке",
"Downloaded by %1$s" : "Скачано %1$s",
"Downloaded by {email}" : "Скачано {email}",
- "%1$s downloaded via public link" : "%1$s скачано по публичной ссылке",
- "{file} downloaded via public link" : "{file} скачан по публичной ссылке",
+ "%1$s downloaded via public link" : "%1$s скачано по общедоступной ссылке",
+ "{file} downloaded via public link" : "{file} скачан по общедоступной ссылке",
"%1$s downloaded %2$s" : "%1$s скачан %2$s",
"{email} downloaded {file}" : "{email} скачал {file}",
"Shared with group %1$s" : "Поделился с группой %1$s",
@@ -40,20 +40,20 @@
"{actor} shared {file} with group {group}" : "{actor} поделился {file} с группой {group}",
"%3$s removed group %2$s from %1$s" : "%3$s удалил группу %2$s из %1$s",
"{actor} removed group {group} from {file}" : "{actor} удалил группу {group} из {file}",
- "Shared as public link" : "Поделился публичной ссылкой",
- "Removed public link" : "Удалена публичная ссылка",
- "%1$s shared as public link" : "%1$s поделился публичной ссылкой",
- "{actor} shared as public link" : "{actor} поделился публичной ссылкой",
- "%1$s removed public link" : "%1$s удалил публичную сслыку",
- "{actor} removed public link" : "{actor} удалил публичную ссылку",
- "You shared %1$s as public link" : "Вы поделись %1$s в виде публичной ссылки",
- "You shared {file} as public link" : "Вы поделись {file} в виде публичной ссылки",
- "You removed public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "You removed public link for {file}" : "Вы удалили публичную ссылку к {file}",
- "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде публичной ссылки",
- "{actor} shared {file} as public link" : "{actor} поделился {file} в виде публичной ссылки",
- "%2$s removed public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "{actor} removed public link for {file}" : "{actor} удалил публичную ссылку к {file}",
+ "Shared as public link" : "Поделился общедоступной ссылкой",
+ "Removed public link" : "Удалена общедоступная ссылка",
+ "%1$s shared as public link" : "%1$s поделился общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} поделился общедоступной ссылкой",
+ "%1$s removed public link" : "%1$s удалил общедоступной сслыку",
+ "{actor} removed public link" : "{actor} удалил общедоступной ссылку",
+ "You shared %1$s as public link" : "Вы поделись %1$s в виде общедоступной ссылки",
+ "You shared {file} as public link" : "Вы поделись {file} в виде общедоступной ссылки",
+ "You removed public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "You removed public link for {file}" : "Вы удалили общедоступную ссылку к {file}",
+ "%2$s shared %1$s as public link" : "%2$s поделился %1$s в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} поделился {file} в виде общедоступной ссылки",
+ "%2$s removed public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "{actor} removed public link for {file}" : "{actor} удалил общедоступную ссылку к {file}",
"%1$s accepted the remote share" : "%1$s принял удаленный общий ресурс",
"{user} accepted the remote share" : "{user} принял удаленный общий ресурс",
"%1$s declined the remote share" : "%1$s отклонил удаленный общий ресурс",
@@ -89,7 +89,7 @@
"{actor} shared {file} with you" : "{actor} поделился {file} с вами",
"%2$s removed you from %1$s" : "%2$s удалил вас из %1$s",
"{actor} removed you from {file}" : "{actor} удалил вас из {file}",
- "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или публичной ссылке, были <strong>скачаны</strong>",
+ "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Файлом или каталогом поделились с <strong>удаленного сервера</strong>",
"A file or folder has been <strong>shared</strong>" : "<strong>Опубликован</strong> файл или каталог",
"Wrong share ID, share doesn't exist" : "Неверный идентификатор публикации, публикация не существует",
@@ -152,10 +152,10 @@
"%2$s removed the share of group %3$s for %1$s" : "%2$s удалил общий доступ к группе %3$s для %1$s",
"%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке",
"You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки",
- "You removed the public link for %1$s" : "Вы удалили публичную ссылку к %1$s",
- "%2$s removed the public link for %1$s" : "%2$s удалил публичную ссылку к %1$s",
- "Your public link for %1$s expired" : "Срок действия Вашей публичной ссылки к %1$s закончился",
- "The public link of %2$s for %1$s expired" : "Срок действия публичной ссылки к %2$s для %1$s закончился",
+ "You removed the public link for %1$s" : "Вы удалили общедоступную ссылку к %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s удалил общедоступную ссылку к %1$s",
+ "Your public link for %1$s expired" : "Срок действия Вашей общедоступной ссылки к %1$s закончился",
+ "The public link of %2$s for %1$s expired" : "Срок действия общедоступной ссылки к %2$s для %1$s закончился",
"%2$s removed the share for %1$s" : "%2$s удалил общий доступ к %1$s",
"Shared with %2$s" : "Поделился с %2$s",
"Shared with %3$s by %2$s" : "Поделился %2$s с %3$s",
@@ -167,9 +167,9 @@
"%2$s removed share of group %3$s" : "%2$s удалил общий доступ к группе %3$s",
"Shared via link by %2$s" : "Поделился ссылкой %2$s",
"Shared via public link" : "Поделился открытой ссылкой",
- "%2$s removed public link" : "%2$s удалил публичную ссылку",
- "Public link expired" : "Срок действия публичной ссылки закончился",
- "Public link of %2$s expired" : "Срок действия публичной ссылки к %2$s закончился",
+ "%2$s removed public link" : "%2$s удалил общедоступную ссылку",
+ "Public link expired" : "Срок действия общедоступнной ссылки закончился",
+ "Public link of %2$s expired" : "Срок действия общедоступной ссылки к %2$s закончился",
"Shared by %2$s" : "Поделился %2$s",
"Shares" : "События обмена файлами"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php
index 922db7dac75..403d30ae2e6 100644
--- a/apps/files_sharing/lib/AppInfo/Application.php
+++ b/apps/files_sharing/lib/AppInfo/Application.php
@@ -111,7 +111,9 @@ class Application extends App {
$c->query('AppName'),
$server->getConfig(),
$server->getAppManager(),
- $c['ControllerMethodReflector']
+ $c['ControllerMethodReflector'],
+ $server->getShareManager(),
+ $server->getRequest()
);
});
diff --git a/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php b/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php
index 7e9109bf2d1..5712b96b97d 100644
--- a/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php
+++ b/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php
@@ -25,6 +25,8 @@
namespace OCA\Files_Sharing\Middleware;
+use OCA\Files_Sharing\Controller\ExternalSharesController;
+use OCA\Files_Sharing\Controller\ShareController;
use OCP\App\IAppManager;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Middleware;
@@ -33,6 +35,8 @@ use OCP\IConfig;
use OCP\AppFramework\Utility\IControllerMethodReflector;
use OCA\Files_Sharing\Exceptions\S2SException;
use OCP\AppFramework\Http\JSONResponse;
+use OCP\IRequest;
+use OCP\Share\IManager;
/**
* Checks whether the "sharing check" is enabled
@@ -49,21 +53,32 @@ class SharingCheckMiddleware extends Middleware {
protected $appManager;
/** @var IControllerMethodReflector */
protected $reflector;
+ /** @var IManager */
+ protected $shareManager;
+ /** @var IRequest */
+ protected $request;
/***
* @param string $appName
* @param IConfig $config
* @param IAppManager $appManager
+ * @param IControllerMethodReflector $reflector
+ * @param IManager $shareManager
+ * @param IRequest $request
*/
public function __construct($appName,
IConfig $config,
IAppManager $appManager,
- IControllerMethodReflector $reflector
+ IControllerMethodReflector $reflector,
+ IManager $shareManager,
+ IRequest $request
) {
$this->appName = $appName;
$this->config = $config;
$this->appManager = $appManager;
$this->reflector = $reflector;
+ $this->shareManager = $shareManager;
+ $this->request = $request;
}
/**
@@ -72,18 +87,23 @@ class SharingCheckMiddleware extends Middleware {
* @param \OCP\AppFramework\Controller $controller
* @param string $methodName
* @throws NotFoundException
+ * @throws S2SException
*/
public function beforeController($controller, $methodName) {
if(!$this->isSharingEnabled()) {
throw new NotFoundException('Sharing is disabled.');
}
- if ($controller instanceof \OCA\Files_Sharing\Controller\ExternalSharesController &&
+ if ($controller instanceof ExternalSharesController &&
!$this->externalSharesChecks()) {
throw new S2SException('Federated sharing not allowed');
- } else if ($controller instanceof \OCA\Files_Sharing\Controller\ShareController &&
- !$this->isLinkSharingEnabled()) {
- throw new NotFoundException('Link sharing is disabled');
+ } else if ($controller instanceof ShareController) {
+ $token = $this->request->getParam('token');
+ $share = $this->shareManager->getShareByToken($token);
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK
+ && !$this->isLinkSharingEnabled()) {
+ throw new NotFoundException('Link sharing is disabled');
+ }
}
}
diff --git a/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php b/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php
index c2965d04b6b..8d7d42722b9 100644
--- a/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php
+++ b/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php
@@ -34,6 +34,9 @@ use OCP\AppFramework\Utility\IControllerMethodReflector;
use OCA\Files_Sharing\Exceptions\S2SException;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IConfig;
+use OCP\IRequest;
+use OCP\Share\IManager;
+use OCP\Share\IShare;
/**
* @package OCA\Files_Sharing\Middleware\SharingCheckMiddleware
@@ -50,6 +53,10 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
private $controllerMock;
/** @var IControllerMethodReflector|\PHPUnit_Framework_MockObject_MockObject */
private $reflector;
+ /** @var IManager | \PHPUnit_Framework_MockObject_MockObject */
+ private $shareManager;
+ /** @var IRequest | \PHPUnit_Framework_MockObject_MockObject */
+ private $request;
protected function setUp() {
parent::setUp();
@@ -58,12 +65,16 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
$this->appManager = $this->createMock(IAppManager::class);
$this->controllerMock = $this->createMock(Controller::class);
$this->reflector = $this->createMock(IControllerMethodReflector::class);
+ $this->shareManager = $this->createMock(IManager::class);
+ $this->request = $this->createMock(IRequest::class);
$this->sharingCheckMiddleware = new SharingCheckMiddleware(
'files_sharing',
$this->config,
$this->appManager,
- $this->reflector);
+ $this->reflector,
+ $this->shareManager,
+ $this->request);
}
public function testIsSharingEnabledWithAppEnabled() {
@@ -215,6 +226,9 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
}
public function testBeforeControllerWithShareControllerWithSharingEnabled() {
+
+ $share = $this->createMock(IShare::class);
+
$this->appManager
->expects($this->once())
->method('isEnabledForUser')
@@ -233,6 +247,13 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
->with('core', 'shareapi_allow_links', 'yes')
->will($this->returnValue('yes'));
+ $this->request->expects($this->once())->method('getParam')->with('token')
+ ->willReturn('token');
+ $this->shareManager->expects($this->once())->method('getShareByToken')
+ ->with('token')->willReturn($share);
+
+ $share->expects($this->once())->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK);
+
$controller = $this->createMock(ShareController::class);
$this->sharingCheckMiddleware->beforeController($controller, 'myMethod');
@@ -243,6 +264,9 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
* @expectedExceptionMessage Link sharing is disabled
*/
public function testBeforeControllerWithShareControllerWithSharingEnabledAPIDisabled() {
+
+ $share = $this->createMock(IShare::class);
+
$this->appManager
->expects($this->once())
->method('isEnabledForUser')
@@ -251,6 +275,14 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
$controller = $this->createMock(ShareController::class);
+ $this->request->expects($this->once())->method('getParam')->with('token')
+ ->willReturn('token');
+ $this->shareManager->expects($this->once())->method('getShareByToken')
+ ->with('token')->willReturn($share);
+
+ $share->expects($this->once())->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK);
+
+
$this->sharingCheckMiddleware->beforeController($controller, 'myMethod');
}
diff --git a/apps/files_trashbin/l10n/zh_CN.js b/apps/files_trashbin/l10n/zh_CN.js
index be1eeab9348..8e1d4317ca4 100644
--- a/apps/files_trashbin/l10n/zh_CN.js
+++ b/apps/files_trashbin/l10n/zh_CN.js
@@ -1,15 +1,15 @@
OC.L10N.register(
"files_trashbin",
{
- "Couldn't delete %s permanently" : "无法彻底删除文件%s",
- "Couldn't restore %s" : "无法恢复%s",
+ "Couldn't delete %s permanently" : "无法彻底删除文件 %s",
+ "Couldn't restore %s" : "无法恢复 %s",
"Deleted files" : "已删除文件",
"Restore" : "恢复",
"Delete" : "删除",
"Delete permanently" : "永久删除",
"Error" : "错误",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
"restored" : "已恢复",
"No deleted files" : "无已删除文件",
"You will be able to recover deleted files from here" : "你可以在此处恢复已删除的文件",
diff --git a/apps/files_trashbin/l10n/zh_CN.json b/apps/files_trashbin/l10n/zh_CN.json
index 5d458254b87..b7d27ce5168 100644
--- a/apps/files_trashbin/l10n/zh_CN.json
+++ b/apps/files_trashbin/l10n/zh_CN.json
@@ -1,13 +1,13 @@
{ "translations": {
- "Couldn't delete %s permanently" : "无法彻底删除文件%s",
- "Couldn't restore %s" : "无法恢复%s",
+ "Couldn't delete %s permanently" : "无法彻底删除文件 %s",
+ "Couldn't restore %s" : "无法恢复 %s",
"Deleted files" : "已删除文件",
"Restore" : "恢复",
"Delete" : "删除",
"Delete permanently" : "永久删除",
"Error" : "错误",
"This operation is forbidden" : "操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用, 请检查日志或联系管理员",
"restored" : "已恢复",
"No deleted files" : "无已删除文件",
"You will be able to recover deleted files from here" : "你可以在此处恢复已删除的文件",
diff --git a/apps/files_versions/l10n/cs_CZ.js b/apps/files_versions/l10n/cs_CZ.js
index e833455da0b..bb1700c74fb 100644
--- a/apps/files_versions/l10n/cs_CZ.js
+++ b/apps/files_versions/l10n/cs_CZ.js
@@ -6,6 +6,7 @@ OC.L10N.register(
"Failed to revert {file} to revision {timestamp}." : "Selhalo vrácení souboru {file} na verzi {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"],
"Restore" : "Obnovit",
+ "No versions available" : "Nejsou dostupné žádné verze",
"More versions..." : "Více verzí...",
"No other versions available" : "Žádné další verze nejsou dostupné"
},
diff --git a/apps/files_versions/l10n/cs_CZ.json b/apps/files_versions/l10n/cs_CZ.json
index 5e79397e24f..47cc35a03fc 100644
--- a/apps/files_versions/l10n/cs_CZ.json
+++ b/apps/files_versions/l10n/cs_CZ.json
@@ -4,6 +4,7 @@
"Failed to revert {file} to revision {timestamp}." : "Selhalo vrácení souboru {file} na verzi {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"],
"Restore" : "Obnovit",
+ "No versions available" : "Nejsou dostupné žádné verze",
"More versions..." : "Více verzí...",
"No other versions available" : "Žádné další verze nejsou dostupné"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
diff --git a/apps/files_versions/l10n/de_DE.js b/apps/files_versions/l10n/de_DE.js
index 22a2fb3034c..4b3c9135857 100644
--- a/apps/files_versions/l10n/de_DE.js
+++ b/apps/files_versions/l10n/de_DE.js
@@ -6,7 +6,7 @@ OC.L10N.register(
"Failed to revert {file} to revision {timestamp}." : "Konnte {file} nicht auf Revision {timestamp} zurücksetzen.",
"_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
"Restore" : "Wiederherstellen",
- "No versions available" : "Neue Versionen verfügbar",
+ "No versions available" : "Keine Versionen verfügbar",
"More versions..." : "Weitere Versionen…",
"No other versions available" : "Keine anderen Versionen verfügbar"
},
diff --git a/apps/files_versions/l10n/de_DE.json b/apps/files_versions/l10n/de_DE.json
index 9351b4d829c..caedef871c7 100644
--- a/apps/files_versions/l10n/de_DE.json
+++ b/apps/files_versions/l10n/de_DE.json
@@ -4,7 +4,7 @@
"Failed to revert {file} to revision {timestamp}." : "Konnte {file} nicht auf Revision {timestamp} zurücksetzen.",
"_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
"Restore" : "Wiederherstellen",
- "No versions available" : "Neue Versionen verfügbar",
+ "No versions available" : "Keine Versionen verfügbar",
"More versions..." : "Weitere Versionen…",
"No other versions available" : "Keine anderen Versionen verfügbar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php
index cb013acd4de..e09ca308f31 100644
--- a/apps/sharebymail/lib/ShareByMailProvider.php
+++ b/apps/sharebymail/lib/ShareByMailProvider.php
@@ -31,6 +31,7 @@ use OCP\IDBConnection;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IURLGenerator;
+use OCP\IUser;
use OCP\IUserManager;
use OCP\Mail\IMailer;
use OCP\Security\ISecureRandom;
@@ -167,14 +168,14 @@ class ShareByMailProvider implements IShareProvider {
if ($share->getShareOwner() !== $share->getSharedBy()) {
$ownerFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
$fileId = $share->getNode()->getId();
- $node = $ownerFolder->getById($fileId);
- $ownerPath = $node[0]->getPath();
+ $nodes = $ownerFolder->getById($fileId);
+ $ownerPath = $nodes[0]->getPath();
$this->publishActivity(
Activity::SUBJECT_SHARED_EMAIL_BY,
[$ownerFolder->getRelativePath($ownerPath), $share->getSharedWith(), $share->getSharedBy()],
$share->getShareOwner(),
$fileId,
- $userFolder->getRelativePath($ownerPath)
+ $ownerFolder->getRelativePath($ownerPath)
);
}
@@ -240,15 +241,19 @@ class ShareByMailProvider implements IShareProvider {
}
protected function sendMailNotification($filename, $link, $owner, $initiator, $shareWith) {
+ $ownerUser = $this->userManager->get($owner);
+ $initiatorUser = $this->userManager->get($initiator);
+ $ownerDisplayName = ($ownerUser instanceof IUser) ? $ownerUser->getDisplayName() : $owner;
+ $initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
if ($owner === $initiator) {
- $subject = (string)$this->l->t('%s shared »%s« with you', array($owner, $filename));
+ $subject = (string)$this->l->t('%s shared »%s« with you', array($ownerDisplayName, $filename));
} else {
- $subject = (string)$this->l->t('%s shared »%s« with you on behalf of %s', array($owner, $filename, $initiator));
+ $subject = (string)$this->l->t('%s shared »%s« with you on behalf of %s', array($ownerDisplayName, $filename, $initiatorDisplayName));
}
$message = $this->mailer->createMessage();
- $htmlBody = $this->createMailBody('mail', $filename, $link, $owner, $initiator);
- $textBody = $this->createMailBody('altmail', $filename, $link, $owner, $initiator);
+ $htmlBody = $this->createMailBody('mail', $filename, $link, $ownerDisplayName, $initiatorDisplayName);
+ $textBody = $this->createMailBody('altmail', $filename, $link, $ownerDisplayName, $initiatorDisplayName);
$message->setTo([$shareWith]);
$message->setSubject($subject);
$message->setBody($textBody, 'text/plain');
diff --git a/apps/systemtags/l10n/cs_CZ.js b/apps/systemtags/l10n/cs_CZ.js
index a58f4456d74..1cd9e4224c6 100644
--- a/apps/systemtags/l10n/cs_CZ.js
+++ b/apps/systemtags/l10n/cs_CZ.js
@@ -10,23 +10,37 @@ OC.L10N.register(
"No tags found" : "Nebyly nalezeny žádné tagy",
"Please select tags to filter by" : "Vyberte prosím tagy pro filtrování",
"No files found for the selected tags" : "Nebyly nalezeny žádné soubory s vybranými tagy",
- "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny",
- "You added system tag %3$s" : "Přidal jste systémový štítek %3$s",
- "%1$s added system tag %3$s" : "%1$s přidal systémový štítek %3$s",
- "You removed system tag %3$s" : "Odstranil jste systémový tag %3$s",
- "%1$s removed system tag %3$s" : "%1$s odstranil systémový štítek %3$s",
- "You created system tag %2$s" : "Vytvořili jste systémový tag %2$s",
+ "Added system tag %1$s" : "Přidán systémový tag %1$s",
+ "Added system tag {systemtag}" : "Přidán systémový tag {systemtag}",
+ "%1$s added system tag %2$s" : "%1$s přidal(a) systémový tag %2$s",
+ "{actor} added system tag {systemtag}" : "{actor} přidal(a) systémový tag {systemtag}",
+ "Removed system tag %1$s" : "Odstraněn systémový tag %1$s",
+ "Removed system tag {systemtag}" : "Odstraněn systémový tag {systemtag}",
+ "%1$s removed system tag %2$s" : "%1$s odstranil(a) systémový tag %2$s",
+ "{actor} removed system tag {systemtag}" : "{actor} odstranil(a) systémový tag {systemtag}",
+ "You created system tag %1$s" : "Vytvořil(a) jste systémový tag %1$s",
+ "You created system tag {systemtag}" : "Vytvořil(a) jste systémový tag {systemtag}",
"%1$s created system tag %2$s" : "%1$s vytvořil systémový tag %2$s",
- "You deleted system tag %2$s" : "Smazali jste systémový tag %2$s",
+ "{actor} created system tag {systemtag}" : "{actor} vytvořil(a) systémový tag {systemtag}",
+ "You deleted system tag %1$s" : "Odstranil(a) jste systémový tag %1$s",
+ "You deleted system tag {systemtag}" : "Odstranil(a) jste systémový tag {systemtag}",
"%1$s deleted system tag %2$s" : "%1$s smazal systémový tag %2$s",
- "You updated system tag %3$s to %2$s" : "Aktualizovali jste systémový tag %3$s na %2$s",
+ "{actor} deleted system tag {systemtag}" : "{actor} odstranil(a) systémový tag {systemtag}",
+ "You updated system tag %2$s to %1$s" : "Aktualizoval(a) jste systémový tag %2$s na %1$s",
+ "You updated system tag {oldsystemtag} to {newsystemtag}" : "Aktualizoval(a) jste systémový tag {oldsystemtag} na {newsystemtag}",
"%1$s updated system tag %3$s to %2$s" : "%1$s aktualizoval systémový tag %3$s na %2$s",
- "You added system tag %3$s to %2$s" : "K %2$s jste přidal systémový štítek %3$s",
+ "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} aktualizoval(a) systémový tag {oldsystemtag} na { newsystemtag}",
+ "You added system tag %2$s to %1$s" : "Přidal(a) jste systémový tag %2$s k %1$s",
+ "You added system tag {systemtag} to {file}" : "K {file} jste přidal(a) systémový tag {systemtag}",
"%1$s added system tag %3$s to %2$s" : "%1$s k %2$s přidal systémový štítek %3$s",
- "You removed system tag %3$s from %2$s" : "Z %2$s jste odstranil systémový štítek %3$s",
+ "{actor} added system tag {systemtag} to {file}" : "{actor} přidal(a) systémový tag {systemtag} k {file}",
+ "You removed system tag %2$s from %1$s" : "Z %2$s jste odstranil(a) systémový tag %1$s",
+ "You removed system tag {systemtag} from {file}" : "Z {file} jste odstranil(a) systémový tag {systemtag}",
"%1$s removed system tag %3$s from %2$s" : "%1$s odstranil systémový štítek %3$s z %2$s",
+ "{actor} removed system tag {systemtag} from {file}" : "{actor} odstranil(a) systémotý tag {systemtag} z {file}",
"%s (restricted)" : "%s (omezeno)",
"%s (invisible)" : "%s (neviditelný)",
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny",
"Collaborative tags" : "Značky pro spolupráci",
"Name" : "Název",
"Delete" : "Smazat",
@@ -42,10 +56,12 @@ OC.L10N.register(
"%1$s assigned system tag %3$s" : "%1$s přiřadil systémový tag %3$s",
"You unassigned system tag %3$s" : "Odebrali jste systémový tag %3$s",
"%1$s unassigned system tag %3$s" : "%1$s odebral systémový tag %3$s",
+ "You created system tag %2$s" : "Vytvořili jste systémový tag %2$s",
+ "You deleted system tag %2$s" : "Smazali jste systémový tag %2$s",
+ "You updated system tag %3$s to %2$s" : "Aktualizovali jste systémový tag %3$s na %2$s",
"You assigned system tag %3$s to %2$s" : "Přiřadili jste systémový tag %3$s na %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s přiřadil systémový tag %3$s na %2$s",
"You unassigned system tag %3$s from %2$s" : "Odebrali jste systémový tag %3$s z %2$s",
- "%1$s unassigned system tag %3$s from %2$s" : "%1$s odebral systémový tag %3$s ze %2$s",
- "%s (not-assignable)" : "%s (nepřiřaditelné)"
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s odebral systémový tag %3$s ze %2$s"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/systemtags/l10n/cs_CZ.json b/apps/systemtags/l10n/cs_CZ.json
index 4c431198836..4f37860393e 100644
--- a/apps/systemtags/l10n/cs_CZ.json
+++ b/apps/systemtags/l10n/cs_CZ.json
@@ -8,23 +8,37 @@
"No tags found" : "Nebyly nalezeny žádné tagy",
"Please select tags to filter by" : "Vyberte prosím tagy pro filtrování",
"No files found for the selected tags" : "Nebyly nalezeny žádné soubory s vybranými tagy",
- "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny",
- "You added system tag %3$s" : "Přidal jste systémový štítek %3$s",
- "%1$s added system tag %3$s" : "%1$s přidal systémový štítek %3$s",
- "You removed system tag %3$s" : "Odstranil jste systémový tag %3$s",
- "%1$s removed system tag %3$s" : "%1$s odstranil systémový štítek %3$s",
- "You created system tag %2$s" : "Vytvořili jste systémový tag %2$s",
+ "Added system tag %1$s" : "Přidán systémový tag %1$s",
+ "Added system tag {systemtag}" : "Přidán systémový tag {systemtag}",
+ "%1$s added system tag %2$s" : "%1$s přidal(a) systémový tag %2$s",
+ "{actor} added system tag {systemtag}" : "{actor} přidal(a) systémový tag {systemtag}",
+ "Removed system tag %1$s" : "Odstraněn systémový tag %1$s",
+ "Removed system tag {systemtag}" : "Odstraněn systémový tag {systemtag}",
+ "%1$s removed system tag %2$s" : "%1$s odstranil(a) systémový tag %2$s",
+ "{actor} removed system tag {systemtag}" : "{actor} odstranil(a) systémový tag {systemtag}",
+ "You created system tag %1$s" : "Vytvořil(a) jste systémový tag %1$s",
+ "You created system tag {systemtag}" : "Vytvořil(a) jste systémový tag {systemtag}",
"%1$s created system tag %2$s" : "%1$s vytvořil systémový tag %2$s",
- "You deleted system tag %2$s" : "Smazali jste systémový tag %2$s",
+ "{actor} created system tag {systemtag}" : "{actor} vytvořil(a) systémový tag {systemtag}",
+ "You deleted system tag %1$s" : "Odstranil(a) jste systémový tag %1$s",
+ "You deleted system tag {systemtag}" : "Odstranil(a) jste systémový tag {systemtag}",
"%1$s deleted system tag %2$s" : "%1$s smazal systémový tag %2$s",
- "You updated system tag %3$s to %2$s" : "Aktualizovali jste systémový tag %3$s na %2$s",
+ "{actor} deleted system tag {systemtag}" : "{actor} odstranil(a) systémový tag {systemtag}",
+ "You updated system tag %2$s to %1$s" : "Aktualizoval(a) jste systémový tag %2$s na %1$s",
+ "You updated system tag {oldsystemtag} to {newsystemtag}" : "Aktualizoval(a) jste systémový tag {oldsystemtag} na {newsystemtag}",
"%1$s updated system tag %3$s to %2$s" : "%1$s aktualizoval systémový tag %3$s na %2$s",
- "You added system tag %3$s to %2$s" : "K %2$s jste přidal systémový štítek %3$s",
+ "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} aktualizoval(a) systémový tag {oldsystemtag} na { newsystemtag}",
+ "You added system tag %2$s to %1$s" : "Přidal(a) jste systémový tag %2$s k %1$s",
+ "You added system tag {systemtag} to {file}" : "K {file} jste přidal(a) systémový tag {systemtag}",
"%1$s added system tag %3$s to %2$s" : "%1$s k %2$s přidal systémový štítek %3$s",
- "You removed system tag %3$s from %2$s" : "Z %2$s jste odstranil systémový štítek %3$s",
+ "{actor} added system tag {systemtag} to {file}" : "{actor} přidal(a) systémový tag {systemtag} k {file}",
+ "You removed system tag %2$s from %1$s" : "Z %2$s jste odstranil(a) systémový tag %1$s",
+ "You removed system tag {systemtag} from {file}" : "Z {file} jste odstranil(a) systémový tag {systemtag}",
"%1$s removed system tag %3$s from %2$s" : "%1$s odstranil systémový štítek %3$s z %2$s",
+ "{actor} removed system tag {systemtag} from {file}" : "{actor} odstranil(a) systémotý tag {systemtag} z {file}",
"%s (restricted)" : "%s (omezeno)",
"%s (invisible)" : "%s (neviditelný)",
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny",
"Collaborative tags" : "Značky pro spolupráci",
"Name" : "Název",
"Delete" : "Smazat",
@@ -40,10 +54,12 @@
"%1$s assigned system tag %3$s" : "%1$s přiřadil systémový tag %3$s",
"You unassigned system tag %3$s" : "Odebrali jste systémový tag %3$s",
"%1$s unassigned system tag %3$s" : "%1$s odebral systémový tag %3$s",
+ "You created system tag %2$s" : "Vytvořili jste systémový tag %2$s",
+ "You deleted system tag %2$s" : "Smazali jste systémový tag %2$s",
+ "You updated system tag %3$s to %2$s" : "Aktualizovali jste systémový tag %3$s na %2$s",
"You assigned system tag %3$s to %2$s" : "Přiřadili jste systémový tag %3$s na %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s přiřadil systémový tag %3$s na %2$s",
"You unassigned system tag %3$s from %2$s" : "Odebrali jste systémový tag %3$s z %2$s",
- "%1$s unassigned system tag %3$s from %2$s" : "%1$s odebral systémový tag %3$s ze %2$s",
- "%s (not-assignable)" : "%s (nepřiřaditelné)"
+ "%1$s unassigned system tag %3$s from %2$s" : "%1$s odebral systémový tag %3$s ze %2$s"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index 73e3ed3a4b4..24ac1c7d8d5 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -374,6 +374,7 @@ class ThemingController extends Controller {
';
$responseCss .= sprintf('.nc-theming-main-background {background-color: %s}' . "\n", $color);
$responseCss .= sprintf('.nc-theming-main-text {color: %s}' . "\n", $color);
+ $responseCss .= sprintf('#app-navigation li:hover > a, #app-navigation li:focus > a, #app-navigation a:focus, #app-navigation .selected, #app-navigation .selected a, #app-navigation .active, #app-navigation .active a {box-shadow: inset 2px 0 %s}' . "\n", $color);
}
$logo = $this->config->getAppValue($this->appName, 'logoMime');
@@ -445,8 +446,7 @@ class ThemingController extends Controller {
cacheBuster: ' . json_encode($cacheBusterValue). '
};
})();';
- $response = new Http\DataDisplayResponse($responseJS);
- $response->addHeader('Content-type', 'text/javascript');
+ $response = new DataDownloadResponse($responseJS, 'javascript', 'text/javascript');
$response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
$response->addHeader('Pragma', 'cache');
$response->cacheFor(3600);
diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php
index d42e5afb245..97a5e985860 100644
--- a/apps/theming/tests/Controller/ThemingControllerTest.php
+++ b/apps/theming/tests/Controller/ThemingControllerTest.php
@@ -487,6 +487,7 @@ class ThemingControllerTest extends TestCase {
';
$expectedData .= sprintf('.nc-theming-main-background {background-color: %s}' . "\n", $color);
$expectedData .= sprintf('.nc-theming-main-text {color: %s}' . "\n", $color);
+ $expectedData .= sprintf('#app-navigation li:hover > a, #app-navigation li:focus > a, #app-navigation a:focus, #app-navigation .selected, #app-navigation .selected a, #app-navigation .active, #app-navigation .active a {box-shadow: inset 2px 0 %s}' . "\n", $color);
$expectedData .= '.nc-theming-contrast {color: #ffffff}' . "\n";
$expectedData .= '.icon-file,.icon-filetype-text {' .
'background-image: url(\'./img/core/filetypes/text.svg?v=0\');' . "}\n" .
@@ -581,6 +582,7 @@ class ThemingControllerTest extends TestCase {
';
$expectedData .= sprintf('.nc-theming-main-background {background-color: %s}' . "\n", $color);
$expectedData .= sprintf('.nc-theming-main-text {color: %s}' . "\n", $color);
+ $expectedData .= sprintf('#app-navigation li:hover > a, #app-navigation li:focus > a, #app-navigation a:focus, #app-navigation .selected, #app-navigation .selected a, #app-navigation .active, #app-navigation .active a {box-shadow: inset 2px 0 %s}' . "\n", $color);
$expectedData .= '#header .header-appname, #expandDisplayName { color: #000000; }' . "\n";
$expectedData .= '#header .icon-caret { background-image: url(\'' . \OC::$WEBROOT . '/core/img/actions/caret-dark.svg\'); }' . "\n";
$expectedData .= '.searchbox input[type="search"] { background: transparent url(\'' . \OC::$WEBROOT . '/core/img/actions/search.svg\') no-repeat 6px center; color: #000; }' . "\n";
@@ -768,6 +770,7 @@ class ThemingControllerTest extends TestCase {
';
$expectedData .= sprintf('.nc-theming-main-background {background-color: %s}' . "\n", $color);
$expectedData .= sprintf('.nc-theming-main-text {color: %s}' . "\n", $color);
+ $expectedData .= sprintf('#app-navigation li:hover > a, #app-navigation li:focus > a, #app-navigation a:focus, #app-navigation .selected, #app-navigation .selected a, #app-navigation .active, #app-navigation .active a {box-shadow: inset 2px 0 %s}' . "\n", $color);
$expectedData .= sprintf(
'#header .logo {' .
'background-image: url(\'./logo?v=0\');' .
@@ -879,6 +882,7 @@ class ThemingControllerTest extends TestCase {
';
$expectedData .= sprintf('.nc-theming-main-background {background-color: %s}' . "\n", $color);
$expectedData .= sprintf('.nc-theming-main-text {color: %s}' . "\n", $color);
+ $expectedData .= sprintf('#app-navigation li:hover > a, #app-navigation li:focus > a, #app-navigation a:focus, #app-navigation .selected, #app-navigation .selected a, #app-navigation .active, #app-navigation .active a {box-shadow: inset 2px 0 %s}' . "\n", $color);
$expectedData .= sprintf(
'#header .logo {' .
'background-image: url(\'./logo?v=0\');' .
@@ -910,7 +914,6 @@ class ThemingControllerTest extends TestCase {
'background-image: url(\'./img/core/filetypes/folder.svg?v=0\');' . "}\n" .
'.icon-filetype-folder-drag-accept {' .
'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v=0\')!important;' . "}\n";
- $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css');
$expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css');
$expected->cacheFor(3600);
@@ -948,8 +951,7 @@ class ThemingControllerTest extends TestCase {
cacheBuster: null
};
})();';
- $expected = new Http\DataDisplayResponse($expectedResponse);
- $expected->addHeader("Content-type","text/javascript");
+ $expected = new Http\DataDownloadResponse($expectedResponse, 'javascript', 'text/javascript');
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
$expected->addHeader('Pragma', 'cache');
$expected->cacheFor(3600);
@@ -983,8 +985,7 @@ class ThemingControllerTest extends TestCase {
cacheBuster: null
};
})();';
- $expected = new Http\DataDisplayResponse($expectedResponse);
- $expected->addHeader("Content-type","text/javascript");
+ $expected = new Http\DataDownloadResponse($expectedResponse, 'javascript', 'text/javascript');
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
$expected->addHeader('Pragma', 'cache');
$expected->cacheFor(3600);
diff --git a/apps/twofactor_backupcodes/appinfo/app.php b/apps/twofactor_backupcodes/appinfo/app.php
index 31f9b6b8eae..0cb10531360 100644
--- a/apps/twofactor_backupcodes/appinfo/app.php
+++ b/apps/twofactor_backupcodes/appinfo/app.php
@@ -19,4 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
+
+// @codeCoverageIgnoreStart
OC_App::registerPersonal('twofactor_backupcodes', 'settings/personal');
+// @codeCoverageIgnoreEnd
diff --git a/apps/twofactor_backupcodes/appinfo/routes.php b/apps/twofactor_backupcodes/appinfo/routes.php
index f2af12e9b45..0119bfd0b08 100644
--- a/apps/twofactor_backupcodes/appinfo/routes.php
+++ b/apps/twofactor_backupcodes/appinfo/routes.php
@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
+// @codeCoverageIgnoreStart
return [
'routes' => [
[
@@ -33,3 +34,4 @@ return [
],
]
];
+// @codeCoverageIgnoreEnd
diff --git a/apps/twofactor_backupcodes/l10n/cs_CZ.js b/apps/twofactor_backupcodes/l10n/cs_CZ.js
index 346fc3ab1ca..126b5b20ec1 100644
--- a/apps/twofactor_backupcodes/l10n/cs_CZ.js
+++ b/apps/twofactor_backupcodes/l10n/cs_CZ.js
@@ -10,6 +10,10 @@ OC.L10N.register(
"If you regenerate backup codes, you automatically invalidate old codes." : "Pokud vytvoříte nové záložní kódy, staré budou automaticky zrušeny.",
"An error occurred while generating your backup codes" : "Při pokusu o vytvoření záložních kódů nastala chyba.",
"Nextcloud backup codes" : "Nextcloud záložní kódy",
+ "Two-factor authentication" : "Dvoufázová autentizace",
+ "You successfully logged in using two-factor authentication (%1$s)" : "Úspěšně jste se přihlásil(a) pomocí dvoufázové autentizace (%1$s)",
+ "A login attempt using two-factor authentication failed (%1$s)" : "Pokus o přihlášení s použitím dvoufázové autentizace selhal (%1$s)",
+ "You created two-factor backup codes for your account" : "Vytvořil(a) jste záložní kódy dvoufázové autentizace pro váš účet",
"Backup code" : "Záložní kód",
"Use backup code" : "Použít záložní kód",
"Second-factor backup codes" : "Dvoufázové záložní kódy"
diff --git a/apps/twofactor_backupcodes/l10n/cs_CZ.json b/apps/twofactor_backupcodes/l10n/cs_CZ.json
index a397a5ba8db..98005f8e6ee 100644
--- a/apps/twofactor_backupcodes/l10n/cs_CZ.json
+++ b/apps/twofactor_backupcodes/l10n/cs_CZ.json
@@ -8,6 +8,10 @@
"If you regenerate backup codes, you automatically invalidate old codes." : "Pokud vytvoříte nové záložní kódy, staré budou automaticky zrušeny.",
"An error occurred while generating your backup codes" : "Při pokusu o vytvoření záložních kódů nastala chyba.",
"Nextcloud backup codes" : "Nextcloud záložní kódy",
+ "Two-factor authentication" : "Dvoufázová autentizace",
+ "You successfully logged in using two-factor authentication (%1$s)" : "Úspěšně jste se přihlásil(a) pomocí dvoufázové autentizace (%1$s)",
+ "A login attempt using two-factor authentication failed (%1$s)" : "Pokus o přihlášení s použitím dvoufázové autentizace selhal (%1$s)",
+ "You created two-factor backup codes for your account" : "Vytvořil(a) jste záložní kódy dvoufázové autentizace pro váš účet",
"Backup code" : "Záložní kód",
"Use backup code" : "Použít záložní kód",
"Second-factor backup codes" : "Dvoufázové záložní kódy"
diff --git a/apps/twofactor_backupcodes/l10n/de.js b/apps/twofactor_backupcodes/l10n/de.js
index 96e1fca0759..039b8bea68b 100644
--- a/apps/twofactor_backupcodes/l10n/de.js
+++ b/apps/twofactor_backupcodes/l10n/de.js
@@ -13,7 +13,7 @@ OC.L10N.register(
"Two-factor authentication" : "Zwei-Faktor Authentifizierung",
"You successfully logged in using two-factor authentication (%1$s)" : "Erfolgreich mittels Zwei-Faktorauthentifizierung angemeldet (%1$s)",
"A login attempt using two-factor authentication failed (%1$s)" : "Ein Anmeldeversuch mittels Zwei-Faktorauthentifizierung gescheitert (%1$s)",
- "You created two-factor backup codes for your account" : "Du hast Zwei-Faktor Sicherungs-Codes für Ihr Konto erstellt",
+ "You created two-factor backup codes for your account" : "Du hast Zwei-Faktor Sicherungs-Codes für Dein Konto erstellt",
"Backup code" : "Backup-Code",
"Use backup code" : "Backup-Code verwenden",
"Second-factor backup codes" : "Zweitfaktor-Backup-Codes"
diff --git a/apps/twofactor_backupcodes/l10n/de.json b/apps/twofactor_backupcodes/l10n/de.json
index 6f582fc8bf0..6afdfa52ac4 100644
--- a/apps/twofactor_backupcodes/l10n/de.json
+++ b/apps/twofactor_backupcodes/l10n/de.json
@@ -11,7 +11,7 @@
"Two-factor authentication" : "Zwei-Faktor Authentifizierung",
"You successfully logged in using two-factor authentication (%1$s)" : "Erfolgreich mittels Zwei-Faktorauthentifizierung angemeldet (%1$s)",
"A login attempt using two-factor authentication failed (%1$s)" : "Ein Anmeldeversuch mittels Zwei-Faktorauthentifizierung gescheitert (%1$s)",
- "You created two-factor backup codes for your account" : "Du hast Zwei-Faktor Sicherungs-Codes für Ihr Konto erstellt",
+ "You created two-factor backup codes for your account" : "Du hast Zwei-Faktor Sicherungs-Codes für Dein Konto erstellt",
"Backup code" : "Backup-Code",
"Use backup code" : "Backup-Code verwenden",
"Second-factor backup codes" : "Zweitfaktor-Backup-Codes"
diff --git a/apps/twofactor_backupcodes/lib/Activity/Provider.php b/apps/twofactor_backupcodes/lib/Activity/Provider.php
index cfb16c9f8d3..9c7aaeae630 100644
--- a/apps/twofactor_backupcodes/lib/Activity/Provider.php
+++ b/apps/twofactor_backupcodes/lib/Activity/Provider.php
@@ -40,6 +40,11 @@ class Provider implements IProvider {
/** @var ILogger */
private $logger;
+ /**
+ * @param L10nFactory $l10n
+ * @param IURLGenerator $urlGenerator
+ * @param ILogger $logger
+ */
public function __construct(L10nFactory $l10n, IURLGenerator $urlGenerator, ILogger $logger) {
$this->logger = $logger;
$this->urlGenerator = $urlGenerator;
diff --git a/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php b/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php
index f64e2e9e60b..85cc174fb6a 100644
--- a/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php
+++ b/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php
@@ -22,7 +22,6 @@
namespace OCA\TwoFactorBackupCodes\Db;
use OCP\AppFramework\Db\Mapper;
-use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IUser;
diff --git a/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php b/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php
index ecb16305e92..1cf62d18801 100644
--- a/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php
+++ b/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php
@@ -33,6 +33,8 @@ use OCP\Security\ISecureRandom;
class BackupCodeStorage {
+ private static $CODE_LENGTH = 16;
+
/** @var BackupCodeMapper */
private $mapper;
@@ -48,6 +50,13 @@ class BackupCodeStorage {
/** @var ILogger */
private $logger;
+ /**
+ * @param BackupCodeMapper $mapper
+ * @param ISecureRandom $random
+ * @param IHasher $hasher
+ * @param IManager $activityManager
+ * @param ILogger $logger
+ */
public function __construct(BackupCodeMapper $mapper, ISecureRandom $random, IHasher $hasher,
IManager $activityManager, ILogger $logger) {
$this->mapper = $mapper;
@@ -69,7 +78,7 @@ class BackupCodeStorage {
$uid = $user->getUID();
foreach (range(1, min([$number, 20])) as $i) {
- $code = $this->random->generate(10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
+ $code = $this->random->generate(self::$CODE_LENGTH, ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS);
$dbCode = new BackupCode();
$dbCode->setUserId($uid);
diff --git a/apps/twofactor_backupcodes/settings/personal.php b/apps/twofactor_backupcodes/settings/personal.php
index 037516e39a3..0a018c0ff28 100644
--- a/apps/twofactor_backupcodes/settings/personal.php
+++ b/apps/twofactor_backupcodes/settings/personal.php
@@ -1,5 +1,6 @@
<?php
-
+// @codeCoverageIgnoreStart
$tmpl = new \OCP\Template('twofactor_backupcodes', 'personal');
return $tmpl->fetchPage();
+// @codeCoverageIgnoreEnd
diff --git a/apps/twofactor_backupcodes/tests/Unit/Activity/GenericProviderTest.php b/apps/twofactor_backupcodes/tests/Unit/Activity/GenericProviderTest.php
new file mode 100644
index 00000000000..242c4ab4e8d
--- /dev/null
+++ b/apps/twofactor_backupcodes/tests/Unit/Activity/GenericProviderTest.php
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @copyright Copyright (c) 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * Two-factor backup codes
+ *
+ * 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\TwoFactorBackupCodes\Test\Unit\Activity;
+
+use InvalidArgumentException;
+use OCA\TwoFactorBackupCodes\Activity\GenericProvider;
+use OCP\Activity\IEvent;
+use OCP\IL10N;
+use OCP\ILogger;
+use OCP\IURLGenerator;
+use OCP\L10N\IFactory;
+use PHPUnit_Framework_MockObject_MockObject;
+use Test\TestCase;
+
+class GenericProviderTest extends TestCase {
+
+ /** @var IL10N|PHPUnit_Framework_MockObject_MockObject */
+ private $l10n;
+
+ /** @var IURLGenerator|PHPUnit_Framework_MockObject_MockObject */
+ private $urlGenerator;
+
+ /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */
+ private $logger;
+
+ /** @var GenericProvider */
+ private $provider;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->l10n = $this->createMock(IFactory::class);
+ $this->urlGenerator = $this->createMock(IURLGenerator::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->provider = new GenericProvider($this->l10n, $this->urlGenerator, $this->logger);
+ }
+
+ public function testParseUnrelated() {
+ $lang = 'ru';
+ $event = $this->createMock(IEvent::class);
+ $event->expects($this->once())
+ ->method('getType')
+ ->willReturn('comments');
+ $this->setExpectedException(InvalidArgumentException::class);
+
+ $this->provider->parse($lang, $event);
+ }
+
+ public function subjectData() {
+ return [
+ ['twofactor_success'],
+ ['twofactor_failed'],
+ ];
+ }
+
+ /**
+ * @dataProvider subjectData
+ */
+ public function testParse($subject) {
+ $lang = 'ru';
+ $event = $this->createMock(IEvent::class);
+ $l = $this->createMock(IL10N::class);
+
+ $event->expects($this->once())
+ ->method('getType')
+ ->willReturn('twofactor');
+ $this->l10n->expects($this->once())
+ ->method('get')
+ ->with('core', $lang)
+ ->willReturn($l);
+ $this->urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with('core', 'actions/password.svg')
+ ->willReturn('path/to/image');
+ $this->urlGenerator->expects($this->once())
+ ->method('getAbsoluteURL')
+ ->with('path/to/image')
+ ->willReturn('absolute/path/to/image');
+ $event->expects($this->once())
+ ->method('setIcon')
+ ->with('absolute/path/to/image');
+ $event->expects($this->once())
+ ->method('getSubject')
+ ->willReturn($subject);
+ $event->expects($this->once())
+ ->method('setParsedSubject');
+
+ $this->provider->parse($lang, $event);
+ }
+
+ public function testParseInvalidSubject() {
+ $lang = 'ru';
+ $l = $this->createMock(IL10N::class);
+ $event = $this->createMock(IEvent::class);
+
+ $event->expects($this->once())
+ ->method('getType')
+ ->willReturn('twofactor');
+ $this->l10n->expects($this->once())
+ ->method('get')
+ ->with('core', $lang)
+ ->willReturn($l);
+ $event->expects($this->once())
+ ->method('getSubject')
+ ->willReturn('unrelated');
+
+ $this->expectException(InvalidArgumentException::class);
+ $this->provider->parse($lang, $event);
+ }
+
+}
diff --git a/apps/twofactor_backupcodes/tests/Unit/Activity/ProviderTest.php b/apps/twofactor_backupcodes/tests/Unit/Activity/ProviderTest.php
index 36e85ec1872..e1a13c89c10 100644
--- a/apps/twofactor_backupcodes/tests/Unit/Activity/ProviderTest.php
+++ b/apps/twofactor_backupcodes/tests/Unit/Activity/ProviderTest.php
@@ -2,7 +2,7 @@
/**
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @copyright Copyright (c) 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @copyright Copyright (c) 2017 Christoph Wurst <christoph@winzerhof-wurst.at>
*
* Two-factor backup codes
*
@@ -23,21 +23,27 @@
namespace OCA\TwoFactorBackupCodes\Test\Unit\Activity;
use InvalidArgumentException;
-use OCA\TwoFactorBackupCodes\Activity\GenericProvider;
+use OCA\TwoFactorBackupCodes\Activity\Provider;
use OCP\Activity\IEvent;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IURLGenerator;
use OCP\L10N\IFactory;
+use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
class ProviderTest extends TestCase {
+ /** @var IL10N|PHPUnit_Framework_MockObject_MockObject */
private $l10n;
+
+ /** @var IURLGenerator|PHPUnit_Framework_MockObject_MockObject */
private $urlGenerator;
+
+ /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */
private $logger;
- /** @var GenericProvider */
+ /** @var Provider */
private $provider;
protected function setUp() {
@@ -47,15 +53,15 @@ class ProviderTest extends TestCase {
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->logger = $this->createMock(ILogger::class);
- $this->provider = new GenericProvider($this->l10n, $this->urlGenerator, $this->logger);
+ $this->provider = new Provider($this->l10n, $this->urlGenerator, $this->logger);
}
public function testParseUnrelated() {
$lang = 'ru';
$event = $this->createMock(IEvent::class);
$event->expects($this->once())
- ->method('getType')
- ->will($this->returnValue('comments'));
+ ->method('getApp')
+ ->willReturn('comments');
$this->setExpectedException(InvalidArgumentException::class);
$this->provider->parse($lang, $event);
@@ -63,8 +69,7 @@ class ProviderTest extends TestCase {
public function subjectData() {
return [
- ['twofactor_success'],
- ['twofactor_failed'],
+ ['codes_generated'],
];
}
@@ -77,30 +82,50 @@ class ProviderTest extends TestCase {
$l = $this->createMock(IL10N::class);
$event->expects($this->once())
- ->method('getType')
- ->will($this->returnValue('twofactor'));
+ ->method('getApp')
+ ->willReturn('twofactor_backupcodes');
$this->l10n->expects($this->once())
->method('get')
- ->with('core', $lang)
- ->will($this->returnValue($l));
+ ->with('twofactor_backupcodes', $lang)
+ ->willReturn($l);
$this->urlGenerator->expects($this->once())
->method('imagePath')
->with('core', 'actions/password.svg')
- ->will($this->returnValue('path/to/image'));
+ ->willReturn('path/to/image');
$this->urlGenerator->expects($this->once())
->method('getAbsoluteURL')
->with('path/to/image')
- ->will($this->returnValue('absolute/path/to/image'));
+ ->willReturn('absolute/path/to/image');
$event->expects($this->once())
->method('setIcon')
->with('absolute/path/to/image');
$event->expects($this->once())
->method('getSubject')
- ->will($this->returnValue($subject));
+ ->willReturn($subject);
$event->expects($this->once())
->method('setParsedSubject');
$this->provider->parse($lang, $event);
}
+ public function testParseInvalidSubject() {
+ $lang = 'ru';
+ $l = $this->createMock(IL10N::class);
+ $event = $this->createMock(IEvent::class);
+
+ $event->expects($this->once())
+ ->method('getApp')
+ ->willReturn('twofactor_backupcodes');
+ $this->l10n->expects($this->once())
+ ->method('get')
+ ->with('twofactor_backupcodes', $lang)
+ ->willReturn($l);
+ $event->expects($this->once())
+ ->method('getSubject')
+ ->willReturn('unrelated');
+
+ $this->expectException(InvalidArgumentException::class);
+ $this->provider->parse($lang, $event);
+ }
+
}
diff --git a/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php b/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php
index 54738f74600..109db7f688c 100644
--- a/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php
+++ b/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php
@@ -31,23 +31,24 @@ use OCP\ILogger;
use OCP\IUser;
use OCP\Security\IHasher;
use OCP\Security\ISecureRandom;
+use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
class BackupCodeStorageTest extends TestCase {
- /** @var BackupCodeMapper|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var BackupCodeMapper|PHPUnit_Framework_MockObject_MockObject */
private $mapper;
- /** @var ISecureRandom|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var ISecureRandom|PHPUnit_Framework_MockObject_MockObject */
private $random;
- /** @var IHasher|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var IHasher|PHPUnit_Framework_MockObject_MockObject */
private $hasher;
- /** @var IManager|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var IManager|PHPUnit_Framework_MockObject_MockObject */
private $activityManager;
- /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */
private $logger;
/** @var BackupCodeStorage */
@@ -56,11 +57,9 @@ class BackupCodeStorageTest extends TestCase {
protected function setUp() {
parent::setUp();
- $this->mapper = $this->getMockBuilder(BackupCodeMapper::class)
- ->disableOriginalConstructor()
- ->getMock();
- $this->random = $this->getMockBuilder(ISecureRandom::class)->getMock();
- $this->hasher = $this->getMockBuilder(IHasher::class)->getMock();
+ $this->mapper = $this->createMock(BackupCodeMapper::class);
+ $this->random = $this->createMock(ISecureRandom::class);
+ $this->hasher = $this->createMock(IHasher::class);
$this->activityManager = $this->createMock(IManager::class);
$this->logger = $this->createMock(ILogger::class);
@@ -68,7 +67,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testCreateCodes() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$number = 5;
$event = $this->createMock(IEvent::class);
@@ -77,7 +76,7 @@ class BackupCodeStorageTest extends TestCase {
->will($this->returnValue('fritz'));
$this->random->expects($this->exactly($number))
->method('generate')
- ->with(10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
+ ->with(16, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
->will($this->returnValue('CODEABCDEF'));
$this->hasher->expects($this->exactly($number))
->method('hash')
@@ -121,7 +120,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testHasBackupCodes() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$codes = [
new BackupCode(),
new BackupCode(),
@@ -136,7 +135,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testHasBackupCodesNoCodes() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$codes = [];
$this->mapper->expects($this->once())
@@ -148,7 +147,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testGetBackupCodeState() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$code1 = new BackupCode();
$code1->setUsed(1);
@@ -173,7 +172,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testGetBackupCodeDisabled() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$codes = [];
@@ -191,7 +190,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testValidateCode() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$code = new BackupCode();
$code->setUsed(0);
$code->setCode('HASHEDVALUE');
@@ -217,7 +216,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testValidateUsedCode() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$code = new BackupCode();
$code->setUsed('1');
$code->setCode('HASHEDVALUE');
@@ -238,7 +237,7 @@ class BackupCodeStorageTest extends TestCase {
}
public function testValidateCodeWithWrongHash() {
- $user = $this->getMockBuilder(IUser::class)->getMock();
+ $user = $this->createMock(IUser::class);
$code = new BackupCode();
$code->setUsed(0);
$code->setCode('HASHEDVALUE');
diff --git a/apps/updatenotification/l10n/cs_CZ.js b/apps/updatenotification/l10n/cs_CZ.js
index e155238cb85..b8fcc5a8e92 100644
--- a/apps/updatenotification/l10n/cs_CZ.js
+++ b/apps/updatenotification/l10n/cs_CZ.js
@@ -7,6 +7,7 @@ OC.L10N.register(
"Channel updated" : "Kanál aktualizován",
"Update to %1$s is available." : "Je dostupná aktualizace na %1$s.",
"Update for %1$s to version %2$s is available." : "Je dostupná aktualizace pro %1$s na verzi %2$s.",
+ "Update for {app} to version %s is available." : "Pro {app} je dostupná aktualizace na verzi %s.",
"A new version is available: %s" : "Je dostupná nová verze: %s",
"Open updater" : "Otevřít aktualizátor",
"Download now" : "Stáhnout nyní",
@@ -17,6 +18,7 @@ OC.L10N.register(
"Notify members of the following groups about available updates:" : "Upozorňovat členy následujících skupin na dostupné aktualizace:",
"Only notification for app updates are available." : "Je možné pouze upozornění na dostupné aktualizace aplikací.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Zvolený kanál aktualizací označuje dedikovaná upozornění pro server za zastaralá.",
- "The selected update channel does not support updates of the server." : "Vybraný kanál aktualizací nepodporuje aktualizace serveru."
+ "The selected update channel does not support updates of the server." : "Vybraný kanál aktualizací nepodporuje aktualizace serveru.",
+ "You are running PHP %s. To allow you to upgrade to Nextcloud 11 and higher you need to run at least PHP 5.6. Once you upgraded your PHP version you will be able to receive update notifications for these newer versions." : "Provozujete PHP %s. Abyste mohl provozovat Nextcloud 11 a vyšší, musíte mít aspoň PHP 5.6. Přijímat oznámení o těchto novějších verzích budete moct až po aktualizaci verze PHP."
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/updatenotification/l10n/cs_CZ.json b/apps/updatenotification/l10n/cs_CZ.json
index 8fea09b7524..cdb176f8d0f 100644
--- a/apps/updatenotification/l10n/cs_CZ.json
+++ b/apps/updatenotification/l10n/cs_CZ.json
@@ -5,6 +5,7 @@
"Channel updated" : "Kanál aktualizován",
"Update to %1$s is available." : "Je dostupná aktualizace na %1$s.",
"Update for %1$s to version %2$s is available." : "Je dostupná aktualizace pro %1$s na verzi %2$s.",
+ "Update for {app} to version %s is available." : "Pro {app} je dostupná aktualizace na verzi %s.",
"A new version is available: %s" : "Je dostupná nová verze: %s",
"Open updater" : "Otevřít aktualizátor",
"Download now" : "Stáhnout nyní",
@@ -15,6 +16,7 @@
"Notify members of the following groups about available updates:" : "Upozorňovat členy následujících skupin na dostupné aktualizace:",
"Only notification for app updates are available." : "Je možné pouze upozornění na dostupné aktualizace aplikací.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Zvolený kanál aktualizací označuje dedikovaná upozornění pro server za zastaralá.",
- "The selected update channel does not support updates of the server." : "Vybraný kanál aktualizací nepodporuje aktualizace serveru."
+ "The selected update channel does not support updates of the server." : "Vybraný kanál aktualizací nepodporuje aktualizace serveru.",
+ "You are running PHP %s. To allow you to upgrade to Nextcloud 11 and higher you need to run at least PHP 5.6. Once you upgraded your PHP version you will be able to receive update notifications for these newer versions." : "Provozujete PHP %s. Abyste mohl provozovat Nextcloud 11 a vyšší, musíte mít aspoň PHP 5.6. Přijímat oznámení o těchto novějších verzích budete moct až po aktualizaci verze PHP."
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/updatenotification/lib/Notification/BackgroundJob.php b/apps/updatenotification/lib/Notification/BackgroundJob.php
index 7bcc0e86905..83a9bdb599a 100644
--- a/apps/updatenotification/lib/Notification/BackgroundJob.php
+++ b/apps/updatenotification/lib/Notification/BackgroundJob.php
@@ -30,8 +30,6 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IGroup;
use OCP\IGroupManager;
-use OCP\IURLGenerator;
-use OCP\IUser;
use OCP\Notification\IManager;
class BackgroundJob extends TimedJob {
@@ -51,10 +49,7 @@ class BackgroundJob extends TimedJob {
/** @var IClientService */
protected $client;
- /** @var IURLGenerator */
- protected $urlGenerator;
-
- /** @var IUser[] */
+ /** @var string[] */
protected $users;
/**
@@ -65,9 +60,8 @@ class BackgroundJob extends TimedJob {
* @param IGroupManager $groupManager
* @param IAppManager $appManager
* @param IClientService $client
- * @param IURLGenerator $urlGenerator
*/
- public function __construct(IConfig $config, IManager $notificationManager, IGroupManager $groupManager, IAppManager $appManager, IClientService $client, IURLGenerator $urlGenerator) {
+ public function __construct(IConfig $config, IManager $notificationManager, IGroupManager $groupManager, IAppManager $appManager, IClientService $client) {
// Run once a day
$this->setInterval(60 * 60 * 24);
@@ -76,7 +70,6 @@ class BackgroundJob extends TimedJob {
$this->groupManager = $groupManager;
$this->appManager = $appManager;
$this->client = $client;
- $this->urlGenerator = $urlGenerator;
}
protected function run($argument) {
@@ -97,8 +90,7 @@ class BackgroundJob extends TimedJob {
$status = $updater->check();
if (isset($status['version'])) {
- $url = $this->urlGenerator->linkToRouteAbsolute('settings.AdminSettings.index') . '#updater';
- $this->createNotifications('core', $status['version'], $url, $status['versionstring']);
+ $this->createNotifications('core', $status['version'], $status['versionstring']);
}
}
@@ -110,8 +102,7 @@ class BackgroundJob extends TimedJob {
foreach ($apps as $app) {
$update = $this->isUpdateAvailable($app);
if ($update !== false) {
- $url = $this->urlGenerator->linkToRouteAbsolute('settings.AppSettings.viewApps') . '#app-' . $app;
- $this->createNotifications($app, $update, $url);
+ $this->createNotifications($app, $update);
}
}
}
@@ -121,10 +112,9 @@ class BackgroundJob extends TimedJob {
*
* @param string $app
* @param string $version
- * @param string $url
* @param string $visibleVersion
*/
- protected function createNotifications($app, $version, $url, $visibleVersion = '') {
+ protected function createNotifications($app, $version, $visibleVersion = '') {
$lastNotification = $this->config->getAppValue('updatenotification', $app, false);
if ($lastNotification === $version) {
// We already notified about this update
@@ -138,8 +128,7 @@ class BackgroundJob extends TimedJob {
$notification = $this->notificationManager->createNotification();
$notification->setApp('updatenotification')
->setDateTime(new \DateTime())
- ->setObject($app, $version)
- ->setLink($url);
+ ->setObject($app, $version);
if ($visibleVersion !== '') {
$notification->setSubject('update_available', ['version' => $visibleVersion]);
diff --git a/apps/updatenotification/lib/Notification/Notifier.php b/apps/updatenotification/lib/Notification/Notifier.php
index 00cc94095ca..079ec4c5e0a 100644
--- a/apps/updatenotification/lib/Notification/Notifier.php
+++ b/apps/updatenotification/lib/Notification/Notifier.php
@@ -24,7 +24,10 @@
namespace OCA\UpdateNotification\Notification;
+use OCP\IGroupManager;
use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\IUserSession;
use OCP\L10N\IFactory;
use OCP\Notification\IManager;
use OCP\Notification\INotification;
@@ -41,6 +44,12 @@ class Notifier implements INotifier {
/** @var IFactory */
protected $l10NFactory;
+ /** @var IUserSession */
+ protected $userSession;
+
+ /** @var IGroupManager */
+ protected $groupManager;
+
/** @var string[] */
protected $appVersions;
@@ -50,11 +59,15 @@ class Notifier implements INotifier {
* @param IURLGenerator $url
* @param IManager $notificationManager
* @param IFactory $l10NFactory
+ * @param IUserSession $userSession
+ * @param IGroupManager $groupManager
*/
- public function __construct(IURLGenerator $url, IManager $notificationManager, IFactory $l10NFactory) {
+ public function __construct(IURLGenerator $url, IManager $notificationManager, IFactory $l10NFactory, IUserSession $userSession, IGroupManager $groupManager) {
$this->url = $url;
$this->notificationManager = $notificationManager;
$this->l10NFactory = $l10NFactory;
+ $this->userSession = $userSession;
+ $this->groupManager = $groupManager;
$this->appVersions = $this->getAppVersions();
}
@@ -76,6 +89,10 @@ class Notifier implements INotifier {
$parameters = $notification->getSubjectParameters();
$notification->setParsedSubject($l->t('Update to %1$s is available.', [$parameters['version']]));
+
+ if ($this->isAdmin()) {
+ $notification->setLink($this->url->linkToRouteAbsolute('settings.AdminSettings.index') . '#updater');
+ }
} else {
$appInfo = $this->getAppInfo($notification->getObjectType());
$appName = ($appInfo === null) ? $notification->getObjectType() : $appInfo['name'];
@@ -92,6 +109,10 @@ class Notifier implements INotifier {
'name' => $appName,
]
]);
+
+ if ($this->isAdmin()) {
+ $notification->setLink($this->url->linkToRouteAbsolute('settings.AppSettings.viewApps') . '#app-' . $notification->getObjectType());
+ }
}
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('updatenotification', 'notification.svg')));
@@ -113,6 +134,19 @@ class Notifier implements INotifier {
}
}
+ /**
+ * @return bool
+ */
+ protected function isAdmin() {
+ $user = $this->userSession->getUser();
+
+ if ($user instanceof IUser) {
+ return $this->groupManager->isAdmin($user->getUID());
+ }
+
+ return false;
+ }
+
protected function getCoreVersions() {
return implode('.', \OCP\Util::getVersion());
}
diff --git a/apps/updatenotification/tests/Notification/BackgroundJobTest.php b/apps/updatenotification/tests/Notification/BackgroundJobTest.php
index 911b1cc8e2f..57771ec0ae9 100644
--- a/apps/updatenotification/tests/Notification/BackgroundJobTest.php
+++ b/apps/updatenotification/tests/Notification/BackgroundJobTest.php
@@ -45,18 +45,15 @@ class BackgroundJobTest extends TestCase {
protected $appManager;
/** @var IClientService|\PHPUnit_Framework_MockObject_MockObject */
protected $client;
- /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */
- protected $urlGenerator;
public function setUp() {
parent::setUp();
- $this->config = $this->getMockBuilder('OCP\IConfig')->getMock();
- $this->notificationManager = $this->getMockBuilder('OCP\Notification\IManager')->getMock();
- $this->groupManager = $this->getMockBuilder('OCP\IGroupManager')->getMock();
- $this->appManager = $this->getMockBuilder('OCP\App\IAppManager')->getMock();
- $this->client = $this->getMockBuilder('OCP\Http\Client\IClientService')->getMock();
- $this->urlGenerator = $this->getMockBuilder('OCP\IURLGenerator')->getMock();
+ $this->config = $this->createMock(\OCP\IConfig::class);
+ $this->notificationManager = $this->createMock(\OCP\Notification\IManager::class);
+ $this->groupManager = $this->createMock(\OCP\IGroupManager::class);
+ $this->appManager = $this->createMock(\OCP\App\IAppManager::class);
+ $this->client = $this->createMock(\OCP\Http\Client\IClientService::class);
}
/**
@@ -70,8 +67,7 @@ class BackgroundJobTest extends TestCase {
$this->notificationManager,
$this->groupManager,
$this->appManager,
- $this->client,
- $this->urlGenerator
+ $this->client
);
} {
return $this->getMockBuilder('OCA\UpdateNotification\Notification\BackgroundJob')
@@ -81,7 +77,6 @@ class BackgroundJobTest extends TestCase {
$this->groupManager,
$this->appManager,
$this->client,
- $this->urlGenerator,
])
->setMethods($methods)
->getMock();
@@ -160,20 +155,12 @@ class BackgroundJobTest extends TestCase {
}
if ($notification === null) {
- $this->urlGenerator->expects($this->never())
- ->method('linkToRouteAbsolute');
-
$job->expects($this->never())
->method('createNotifications');
} else {
- $this->urlGenerator->expects($this->once())
- ->method('linkToRouteAbsolute')
- ->with('settings.AdminSettings.index')
- ->willReturn('admin-url');
-
$job->expects($this->once())
->method('createNotifications')
- ->willReturn('core', $notification, 'admin-url#updater', $readableVersion);
+ ->willReturn('core', $notification, $readableVersion);
}
$this->invokePrivate($job, 'checkCoreUpdate');
@@ -188,7 +175,7 @@ class BackgroundJobTest extends TestCase {
['app2', '1.9.2'],
],
[
- ['app2', '1.9.2', 'apps-url#app-app2'],
+ ['app2', '1.9.2'],
],
],
];
@@ -215,11 +202,6 @@ class BackgroundJobTest extends TestCase {
->method('isUpdateAvailable')
->willReturnMap($isUpdateAvailable);
- $this->urlGenerator->expects($this->exactly(sizeof($notifications)))
- ->method('linkToRouteAbsolute')
- ->with('settings.AppSettings.viewApps')
- ->willReturn('apps-url');
-
$mockedMethod = $job->expects($this->exactly(sizeof($notifications)))
->method('createNotifications');
call_user_func_array([$mockedMethod, 'withConsecutive'], $notifications);
@@ -229,9 +211,9 @@ class BackgroundJobTest extends TestCase {
public function dataCreateNotifications() {
return [
- ['app1', '1.0.0', 'link1', '1.0.0', false, false, null, null],
- ['app2', '1.0.1', 'link2', '1.0.0', '1.0.0', true, ['user1'], [['user1']]],
- ['app3', '1.0.1', 'link3', false, false, true, ['user2', 'user3'], [['user2'], ['user3']]],
+ ['app1', '1.0.0', '1.0.0', false, false, null, null],
+ ['app2', '1.0.1', '1.0.0', '1.0.0', true, ['user1'], [['user1']]],
+ ['app3', '1.0.1', false, false, true, ['user2', 'user3'], [['user2'], ['user3']]],
];
}
@@ -240,14 +222,13 @@ class BackgroundJobTest extends TestCase {
*
* @param string $app
* @param string $version
- * @param string $url
* @param string|false $lastNotification
* @param string|false $callDelete
* @param bool $createNotification
* @param string[]|null $users
* @param array|null $userNotifications
*/
- public function testCreateNotifications($app, $version, $url, $lastNotification, $callDelete, $createNotification, $users, $userNotifications) {
+ public function testCreateNotifications($app, $version, $lastNotification, $callDelete, $createNotification, $users, $userNotifications) {
$job = $this->getJob([
'deleteOutdatedNotifications',
'getUsersToNotify',
@@ -299,10 +280,6 @@ class BackgroundJobTest extends TestCase {
->method('setSubject')
->with('update_available')
->willReturnSelf();
- $notification->expects($this->once())
- ->method('setLink')
- ->with($url)
- ->willReturnSelf();
if ($userNotifications !== null) {
$mockedMethod = $notification->expects($this->exactly(sizeof($userNotifications)))
@@ -323,7 +300,7 @@ class BackgroundJobTest extends TestCase {
->method('createNotification');
}
- $this->invokePrivate($job, 'createNotifications', [$app, $version, $url]);
+ $this->invokePrivate($job, 'createNotifications', [$app, $version]);
}
public function dataGetUsersToNotify() {
diff --git a/apps/updatenotification/tests/Notification/NotifierTest.php b/apps/updatenotification/tests/Notification/NotifierTest.php
index 421fcada689..e809ce11635 100644
--- a/apps/updatenotification/tests/Notification/NotifierTest.php
+++ b/apps/updatenotification/tests/Notification/NotifierTest.php
@@ -24,7 +24,9 @@ namespace OCA\UpdateNotification\Tests\Notification;
use OCA\UpdateNotification\Notification\Notifier;
+use OCP\IGroupManager;
use OCP\IURLGenerator;
+use OCP\IUserSession;
use OCP\L10N\IFactory;
use OCP\Notification\IManager;
use OCP\Notification\INotification;
@@ -38,6 +40,10 @@ class NotifierTest extends TestCase {
protected $notificationManager;
/** @var IFactory|\PHPUnit_Framework_MockObject_MockObject */
protected $l10nFactory;
+ /** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */
+ protected $userSession;
+ /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */
+ protected $groupManager;
public function setUp() {
parent::setUp();
@@ -45,6 +51,8 @@ class NotifierTest extends TestCase {
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->notificationManager = $this->createMock(IManager::class);
$this->l10nFactory = $this->createMock(IFactory::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->groupManager = $this->createMock(IGroupManager::class);
}
/**
@@ -56,7 +64,9 @@ class NotifierTest extends TestCase {
return new Notifier(
$this->urlGenerator,
$this->notificationManager,
- $this->l10nFactory
+ $this->l10nFactory,
+ $this->userSession,
+ $this->groupManager
);
} {
return $this->getMockBuilder(Notifier::class)
@@ -64,6 +74,8 @@ class NotifierTest extends TestCase {
$this->urlGenerator,
$this->notificationManager,
$this->l10nFactory,
+ $this->userSession,
+ $this->groupManager,
])
->setMethods($methods)
->getMock();
diff --git a/apps/user_ldap/l10n/cs_CZ.js b/apps/user_ldap/l10n/cs_CZ.js
index f788628e851..c9fc3c62586 100644
--- a/apps/user_ldap/l10n/cs_CZ.js
+++ b/apps/user_ldap/l10n/cs_CZ.js
@@ -40,12 +40,14 @@ OC.L10N.register(
"Select attributes" : "Vyberte atributy",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Uživatel nenalezen. Zkontrolujte prosím své přihlašovací údaje a jméno. Použitý filtr (pro zkopírování a ověření v příkazovém řádku): <br/>",
"User found and settings verified." : "Uživatel nalezen a nastavení ověřeno.",
+ "Settings verified, but more than one user found. Only the first will be able to login. Consider a more narrow filter." : "Nastavení ověřena, ale byl nalezen víc než jeden uživatel. Jen ten první se bude moci přihlásit. Zvažte užší filtr.",
"An unspecified error occurred. Please check the settings and the log." : "Došlo k nespecifikované chybě. Zkontrolujte prosím nastavení a soubor logu.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání je neplatný, pravděpodobně z důvodu chybné syntax jako třeba neuzavřené závorky. Ověřte to.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo k chybě připojení k LDAP / AD, zkontrolujte prosím host, port a přihlašovací údaje.",
"The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Chybí zástupný znak %uid. Bude nahrazen přihlašovacím jménem při dotazování LDAP / AD.",
"Please provide a login name to test against" : "Zadejte prosím přihlašovací jméno pro otestování",
"The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupinové pole bylo vypnuto, protože LDAP / AD server nepodporuje memberOf.",
+ "Password change rejected. Hint: " : "Změna hesla zamítnuta. Nápověda: ",
"LDAP / AD integration" : "LDAP / AD propojení",
"_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin"],
"_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů"],
@@ -141,6 +143,9 @@ OC.L10N.register(
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Pokud zapnuto, je možno používat skupiny, které obsahují jiné skupiny. (Funguje pouze pokud atribut člena skupiny obsahuje DN.)",
"Paging chunksize" : "Velikost bloku stránkování",
"Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Velikost bloku použitá pro stránkování vyhledávání v LDAP, které může vracet objemné výsledky jako třeba výčet uživatelů či skupin. (Nastavení na 0 zakáže stránkovaná vyhledávání pro tyto situace.)",
+ "Enable LDAP password changes per user" : "Povolit změny LDAP hesla pro každého uživatele",
+ "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Povolit LDAP uživatelům změnu jejich hesla a povolit Super Administrátorům a skupinovým Administrátorům změnu hesel jejich LDAP uživatelů. Funguje pouze, pokud jsou na LDAP serveru příslušně nakonfigurovány seznamy řízení přístupu. Protože hesla jsou LDAP serveru zasílána v čisté podobě, musí být použito šifrování při transportu a na LDAP serveru by mělo být nakonfigurováno hashování hesel.",
+ "(New password is sent as plain text to LDAP)" : "(Nové heslo je LDAPu zasláno jako prostý text)",
"Special Attributes" : "Speciální atributy",
"Quota Field" : "Pole pro kvótu",
"Quota Default" : "Výchozí kvóta",
diff --git a/apps/user_ldap/l10n/cs_CZ.json b/apps/user_ldap/l10n/cs_CZ.json
index 9ed158e2bce..6f374d73d7f 100644
--- a/apps/user_ldap/l10n/cs_CZ.json
+++ b/apps/user_ldap/l10n/cs_CZ.json
@@ -38,12 +38,14 @@
"Select attributes" : "Vyberte atributy",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Uživatel nenalezen. Zkontrolujte prosím své přihlašovací údaje a jméno. Použitý filtr (pro zkopírování a ověření v příkazovém řádku): <br/>",
"User found and settings verified." : "Uživatel nalezen a nastavení ověřeno.",
+ "Settings verified, but more than one user found. Only the first will be able to login. Consider a more narrow filter." : "Nastavení ověřena, ale byl nalezen víc než jeden uživatel. Jen ten první se bude moci přihlásit. Zvažte užší filtr.",
"An unspecified error occurred. Please check the settings and the log." : "Došlo k nespecifikované chybě. Zkontrolujte prosím nastavení a soubor logu.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání je neplatný, pravděpodobně z důvodu chybné syntax jako třeba neuzavřené závorky. Ověřte to.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo k chybě připojení k LDAP / AD, zkontrolujte prosím host, port a přihlašovací údaje.",
"The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Chybí zástupný znak %uid. Bude nahrazen přihlašovacím jménem při dotazování LDAP / AD.",
"Please provide a login name to test against" : "Zadejte prosím přihlašovací jméno pro otestování",
"The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupinové pole bylo vypnuto, protože LDAP / AD server nepodporuje memberOf.",
+ "Password change rejected. Hint: " : "Změna hesla zamítnuta. Nápověda: ",
"LDAP / AD integration" : "LDAP / AD propojení",
"_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin"],
"_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů"],
@@ -139,6 +141,9 @@
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Pokud zapnuto, je možno používat skupiny, které obsahují jiné skupiny. (Funguje pouze pokud atribut člena skupiny obsahuje DN.)",
"Paging chunksize" : "Velikost bloku stránkování",
"Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Velikost bloku použitá pro stránkování vyhledávání v LDAP, které může vracet objemné výsledky jako třeba výčet uživatelů či skupin. (Nastavení na 0 zakáže stránkovaná vyhledávání pro tyto situace.)",
+ "Enable LDAP password changes per user" : "Povolit změny LDAP hesla pro každého uživatele",
+ "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Povolit LDAP uživatelům změnu jejich hesla a povolit Super Administrátorům a skupinovým Administrátorům změnu hesel jejich LDAP uživatelů. Funguje pouze, pokud jsou na LDAP serveru příslušně nakonfigurovány seznamy řízení přístupu. Protože hesla jsou LDAP serveru zasílána v čisté podobě, musí být použito šifrování při transportu a na LDAP serveru by mělo být nakonfigurováno hashování hesel.",
+ "(New password is sent as plain text to LDAP)" : "(Nové heslo je LDAPu zasláno jako prostý text)",
"Special Attributes" : "Speciální atributy",
"Quota Field" : "Pole pro kvótu",
"Quota Default" : "Výchozí kvóta",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index cbbe871d9cc..9539e20adf8 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"No action specified" : "Aucune action spécifiée",
"No configuration specified" : "Aucune configuration spécifiée",
"No data specified" : "Aucune donnée spécifiée",
- " Could not set configuration %s" : "Impossible de spécifier la configuration %s",
+ " Could not set configuration %s" : "Impossible d'appliquer la configuration %s",
"Action does not exist" : "L'action n'existe pas",
"The Base DN appears to be wrong" : "Le DN de base est erroné",
"Testing configuration…" : "Test de configuration",
@@ -36,7 +36,7 @@ OC.L10N.register(
"LDAP Operations error. Anonymous bind might not be allowed." : "Erreur LDAP. La connexion anonyme au serveur n'est probablement pas acceptée.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "La sauvegarde a échoué. Veuillez vérifier que la base de données est opérationnelle. Rechargez avant de poursuivre.",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Changer de mode activera les requêtes LDAP automatiques. Selon la taille de votre annuaire LDAP, cela peut prendre du temps. Voulez-vous toujours changer de mode ?",
- "Mode switch" : "Changer de mode",
+ "Mode switch" : "Basculer de mode",
"Select attributes" : "Sélectionner les attributs",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilisateur introuvable. Veuillez vérifier les attributs de login et le nom d'utilisateur. Filtre effectif (à copier-coller pour valider en ligne de commande):<br/>",
"User found and settings verified." : "Utilisateur trouvé et paramètres vérifiés.",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index e31c5f7fbe2..4e15829e84a 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -8,7 +8,7 @@
"No action specified" : "Aucune action spécifiée",
"No configuration specified" : "Aucune configuration spécifiée",
"No data specified" : "Aucune donnée spécifiée",
- " Could not set configuration %s" : "Impossible de spécifier la configuration %s",
+ " Could not set configuration %s" : "Impossible d'appliquer la configuration %s",
"Action does not exist" : "L'action n'existe pas",
"The Base DN appears to be wrong" : "Le DN de base est erroné",
"Testing configuration…" : "Test de configuration",
@@ -34,7 +34,7 @@
"LDAP Operations error. Anonymous bind might not be allowed." : "Erreur LDAP. La connexion anonyme au serveur n'est probablement pas acceptée.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "La sauvegarde a échoué. Veuillez vérifier que la base de données est opérationnelle. Rechargez avant de poursuivre.",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Changer de mode activera les requêtes LDAP automatiques. Selon la taille de votre annuaire LDAP, cela peut prendre du temps. Voulez-vous toujours changer de mode ?",
- "Mode switch" : "Changer de mode",
+ "Mode switch" : "Basculer de mode",
"Select attributes" : "Sélectionner les attributs",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilisateur introuvable. Veuillez vérifier les attributs de login et le nom d'utilisateur. Filtre effectif (à copier-coller pour valider en ligne de commande):<br/>",
"User found and settings verified." : "Utilisateur trouvé et paramètres vérifiés.",
diff --git a/apps/user_ldap/l10n/sv.js b/apps/user_ldap/l10n/sv.js
index aba8488f0d1..9a1768fe01e 100644
--- a/apps/user_ldap/l10n/sv.js
+++ b/apps/user_ldap/l10n/sv.js
@@ -44,6 +44,7 @@ OC.L10N.register(
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ett anslutningsfel till LDAP / AD uppstod. Var god granska värd, port och inloggningsuppgifter.",
"Please provide a login name to test against" : "Vänligen ange ett inloggningsnamn att försöka ansluta med",
"Password change rejected. Hint: " : "Lösenordsbyte nekad. Anledning/tips: ",
+ "LDAP / AD integration" : "LDAP / AD integration",
"_%s group found_::_%s groups found_" : ["%s grupp hittad","%s grupper hittade"],
"_%s user found_::_%s users found_" : ["%s användare hittad","%s användare hittade"],
"Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunde inte upptäcka attributet användarvisningsnamn. Vänligen ange det själv i de avancerade LDAP-inställningarna.",
diff --git a/apps/user_ldap/l10n/sv.json b/apps/user_ldap/l10n/sv.json
index 8f5b48cbf7e..a4019761f96 100644
--- a/apps/user_ldap/l10n/sv.json
+++ b/apps/user_ldap/l10n/sv.json
@@ -42,6 +42,7 @@
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ett anslutningsfel till LDAP / AD uppstod. Var god granska värd, port och inloggningsuppgifter.",
"Please provide a login name to test against" : "Vänligen ange ett inloggningsnamn att försöka ansluta med",
"Password change rejected. Hint: " : "Lösenordsbyte nekad. Anledning/tips: ",
+ "LDAP / AD integration" : "LDAP / AD integration",
"_%s group found_::_%s groups found_" : ["%s grupp hittad","%s grupper hittade"],
"_%s user found_::_%s users found_" : ["%s användare hittad","%s användare hittade"],
"Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunde inte upptäcka attributet användarvisningsnamn. Vänligen ange det själv i de avancerade LDAP-inställningarna.",
diff --git a/apps/workflowengine/l10n/sk_SK.js b/apps/workflowengine/l10n/sk_SK.js
new file mode 100644
index 00000000000..b524bd9d956
--- /dev/null
+++ b/apps/workflowengine/l10n/sk_SK.js
@@ -0,0 +1,58 @@
+OC.L10N.register(
+ "workflowengine",
+ {
+ "Successfully saved" : "Úspešne uložené",
+ "Saving failed:" : "Ukladanie neúspešné:",
+ "File mime type" : "Mime typ súboru",
+ "is" : "je",
+ "is not" : "nie je",
+ "matches" : "súhlasí",
+ "does not match" : "nesúhlasí",
+ "File size (upload)" : "Veľkosť súboru (upload)",
+ "less" : "menej",
+ "less or equals" : "menej alebo rovné",
+ "greater or equals" : "viac alebo rovné",
+ "greater" : "viac",
+ "File system tag" : "Štítok súborového systému",
+ "is tagged with" : "je označený",
+ "is not tagged with" : "nie je označený",
+ "Select tag…" : "Vyber štítok...",
+ "Request remote address" : "Vyžiadať vzdialenú adresu",
+ "matches IPv4" : "súhlasí s IPv4",
+ "does not match IPv4" : "nesúhlasí s IPv4",
+ "matches IPv6" : "súhlasí s IPv6",
+ "does not match IPv6" : "nesúhlasí s IPv6",
+ "between" : "medzi",
+ "not between" : "nie je medzi",
+ "Start" : "Začiatok",
+ "End" : "Koniec",
+ "Request URL" : "Vyžiadať URL",
+ "Files WebDAV" : "WebDAV súbory",
+ "Sync clients" : "Synchronizovať klientov",
+ "Android client" : "Android klient",
+ "iOS client" : "iOS klient",
+ "Desktop client" : "Desktopový klient",
+ "is member of" : "Je členom",
+ "is not member of" : "Nie je členom",
+ "The given file size is invalid" : "Zadaná veľkosť súboru je neplatná",
+ "The given tag id is invalid" : "Zadaný identifikátor štítku je neplatný",
+ "The given IP range is invalid" : "Zadaný rozsah IP je neplatný",
+ "The given IP range is not valid for IPv4" : "Zadaný IP rozsah nie je platný pre IPv4",
+ "The given IP range is not valid for IPv6" : "Zadaný IP rozsah nie je platný pre IPv6",
+ "The given time span is invalid" : "Zadané časové rozpätie nie je platné",
+ "The given start time is invalid" : "Zadaný čas začatia nie je platný",
+ "The given end time is invalid" : "Zadaný čas ukončenia nie je platný",
+ "The given group does not exist" : "Zadaná skupina neexistuje",
+ "Operation #%s does not exist" : "Operácia #%s neexistuje",
+ "Operation %s does not exist" : "Operácia %s neexistuje",
+ "Operation %s is invalid" : "Operácia #%s nie je platná",
+ "Open documentation" : "Otvoriť dokumentáciu",
+ "Add rule group" : "Pridať skupinu pravidiel",
+ "Short rule description" : "Zobraziť popis pravidla",
+ "Add rule" : "Pridať pravidlo",
+ "Reset" : "Vynulovať",
+ "Save" : "Uložiť",
+ "Saving…" : "Ukladá sa...",
+ "Loading…" : "Načítava sa..."
+},
+"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/workflowengine/l10n/sk_SK.json b/apps/workflowengine/l10n/sk_SK.json
new file mode 100644
index 00000000000..4cad6608288
--- /dev/null
+++ b/apps/workflowengine/l10n/sk_SK.json
@@ -0,0 +1,56 @@
+{ "translations": {
+ "Successfully saved" : "Úspešne uložené",
+ "Saving failed:" : "Ukladanie neúspešné:",
+ "File mime type" : "Mime typ súboru",
+ "is" : "je",
+ "is not" : "nie je",
+ "matches" : "súhlasí",
+ "does not match" : "nesúhlasí",
+ "File size (upload)" : "Veľkosť súboru (upload)",
+ "less" : "menej",
+ "less or equals" : "menej alebo rovné",
+ "greater or equals" : "viac alebo rovné",
+ "greater" : "viac",
+ "File system tag" : "Štítok súborového systému",
+ "is tagged with" : "je označený",
+ "is not tagged with" : "nie je označený",
+ "Select tag…" : "Vyber štítok...",
+ "Request remote address" : "Vyžiadať vzdialenú adresu",
+ "matches IPv4" : "súhlasí s IPv4",
+ "does not match IPv4" : "nesúhlasí s IPv4",
+ "matches IPv6" : "súhlasí s IPv6",
+ "does not match IPv6" : "nesúhlasí s IPv6",
+ "between" : "medzi",
+ "not between" : "nie je medzi",
+ "Start" : "Začiatok",
+ "End" : "Koniec",
+ "Request URL" : "Vyžiadať URL",
+ "Files WebDAV" : "WebDAV súbory",
+ "Sync clients" : "Synchronizovať klientov",
+ "Android client" : "Android klient",
+ "iOS client" : "iOS klient",
+ "Desktop client" : "Desktopový klient",
+ "is member of" : "Je členom",
+ "is not member of" : "Nie je členom",
+ "The given file size is invalid" : "Zadaná veľkosť súboru je neplatná",
+ "The given tag id is invalid" : "Zadaný identifikátor štítku je neplatný",
+ "The given IP range is invalid" : "Zadaný rozsah IP je neplatný",
+ "The given IP range is not valid for IPv4" : "Zadaný IP rozsah nie je platný pre IPv4",
+ "The given IP range is not valid for IPv6" : "Zadaný IP rozsah nie je platný pre IPv6",
+ "The given time span is invalid" : "Zadané časové rozpätie nie je platné",
+ "The given start time is invalid" : "Zadaný čas začatia nie je platný",
+ "The given end time is invalid" : "Zadaný čas ukončenia nie je platný",
+ "The given group does not exist" : "Zadaná skupina neexistuje",
+ "Operation #%s does not exist" : "Operácia #%s neexistuje",
+ "Operation %s does not exist" : "Operácia %s neexistuje",
+ "Operation %s is invalid" : "Operácia #%s nie je platná",
+ "Open documentation" : "Otvoriť dokumentáciu",
+ "Add rule group" : "Pridať skupinu pravidiel",
+ "Short rule description" : "Zobraziť popis pravidla",
+ "Add rule" : "Pridať pravidlo",
+ "Reset" : "Vynulovať",
+ "Save" : "Uložiť",
+ "Saving…" : "Ukladá sa...",
+ "Loading…" : "Načítava sa..."
+},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
+} \ No newline at end of file
diff --git a/bower.json b/bower.json
index b4256b0c7aa..0735f4eb5a0 100644
--- a/bower.json
+++ b/bower.json
@@ -20,6 +20,7 @@
"jquery-migrate": "~1.4.0",
"jquery-ui": "1.10.0",
"jsTimezoneDetect": "~1.0.5",
+ "marked": "^0.3.6",
"moment": "^2.15.0",
"select2": "~3.4.8",
"zxcvbn": "*",
diff --git a/config/config.sample.php b/config/config.sample.php
index a9bb0067e5b..4f018d189da 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -74,8 +74,10 @@ $CONFIG = array(
/**
- * Where user files are stored; this defaults to ``data/`` in the Nextcloud
- * directory. The SQLite database is also stored here, when you use SQLite.
+ * Where user files are stored. The SQLite database is also stored here, when
+ * you use SQLite.
+ *
+ * Default to ``data/`` in the Nextcloud directory.
*/
'datadirectory' => '/var/www/nextcloud/data',
@@ -93,7 +95,8 @@ $CONFIG = array(
* - sqlite (SQLite3)
* - mysql (MySQL/MariaDB)
* - pgsql (PostgreSQL)
- * - oci (Oracle)
+ *
+ * Defaults to ``sqlite``
*/
'dbtype' => 'sqlite',
@@ -126,6 +129,8 @@ $CONFIG = array(
/**
* Prefix for the Nextcloud tables in the database.
+ *
+ * Default to ``oc_``
*/
'dbtableprefix' => '',
@@ -134,6 +139,8 @@ $CONFIG = array(
* Indicates whether the Nextcloud instance was installed successfully; ``true``
* indicates a successful installation, and ``false`` indicates an unsuccessful
* installation.
+ *
+ * Defaults to ``false``
*/
'installed' => false,
@@ -151,6 +158,8 @@ $CONFIG = array(
* French. It overrides automatic language detection on public pages like login
* or shared items. User's language preferences configured under "personal ->
* language" override this setting after they have logged in.
+ *
+ * Defaults to ``en``
*/
'default_language' => 'en',
@@ -160,6 +169,8 @@ $CONFIG = array(
* gallery. You can use a comma-separated list of app names, so if the first
* app is not enabled for a user then Nextcloud will try the second one, and so
* on. If no enabled apps are found it defaults to the Files app.
+ *
+ * Defaults to ``files``
*/
'defaultapp' => 'files',
@@ -173,6 +184,8 @@ $CONFIG = array(
* ``true`` enables avatars, or user profile photos. These appear on the User
* page, on user's Personal pages and are used by some apps (contacts, mail,
* etc). ``false`` disables them.
+ *
+ * Defaults to ``true``
*/
'enable_avatars' => true,
@@ -183,21 +196,25 @@ $CONFIG = array(
'allow_user_to_change_display_name' => true,
/**
- * Lifetime of the remember login cookie, which is set when the user clicks the
- * ``remember`` checkbox on the login screen. The default is 15 days, expressed
- * in seconds.
+ * Lifetime of the remember login cookie, which is set when the user clicks
+ * the ``remember`` checkbox on the login screen.
+ *
+ * Defaults to ``60*60*24*15`` seconds (15 days)
*/
'remember_login_cookie_lifetime' => 60*60*24*15,
/**
- * The lifetime of a session after inactivity; the default is 24 hours,
- * expressed in seconds.
+ * The lifetime of a session after inactivity.
+ *
+ * Defaults to ``60*60*24`` seconds (24 hours)
*/
'session_lifetime' => 60 * 60 * 24,
/**
* Enable or disable session keep-alive when a user is logged in to the Web UI.
* Enabling this sends a "heartbeat" to the server to keep it from timing out.
+ *
+ * Defaults to ``true``
*/
'session_keepalive' => true,
@@ -205,6 +222,8 @@ $CONFIG = array(
* Enforce token authentication for clients, which blocks requests using the user
* password for enhanced security. Users need to generate tokens in personal settings
* which can be used as passwords on their clients.
+ *
+ * Defaults to ``false``
*/
'token_auth_enforced' => false,
@@ -212,6 +231,8 @@ $CONFIG = array(
* Whether the bruteforce protection shipped with Nextcloud should be enabled or not.
*
* Disabling this is discouraged for security reasons.
+ *
+ * Defaults to ``true``
*/
'auth.bruteforce.protection.enabled' => true,
@@ -219,6 +240,8 @@ $CONFIG = array(
* The directory where the skeleton files are located. These files will be
* copied to the data directory of new users. Leave empty to not copy any
* skeleton files.
+ *
+ * Defaults to ``core/skeleton`` in the Nextcloud directory.
*/
'skeletondirectory' => '/path/to/nextcloud/core/skeleton',
@@ -259,11 +282,15 @@ $CONFIG = array(
/**
* FROM address that overrides the built-in ``sharing-noreply`` and
* ``lostpassword-noreply`` FROM addresses.
+ *
+ * Defaults to different from addresses depending on the feature.
*/
'mail_from_address' => 'nextcloud',
/**
* Enable SMTP class debugging.
+ *
+ * Defaults to ``false``
*/
'mail_smtpdebug' => false,
@@ -282,19 +309,25 @@ $CONFIG = array(
*
* For ``qmail`` the binary is /var/qmail/bin/sendmail, and it must be installed
* on your Unix system.
+ *
+ * Defaults to ``php``
*/
-'mail_smtpmode' => 'sendmail',
+'mail_smtpmode' => 'php',
/**
* This depends on ``mail_smtpmode``. Specify the IP address of your mail
* server host. This may contain multiple hosts separated by a semi-colon. If
* you need to specify the port number append it to the IP address separated by
* a colon, like this: ``127.0.0.1:24``.
+ *
+ * Defaults to ``127.0.0.1``
*/
'mail_smtphost' => '127.0.0.1',
/**
* This depends on ``mail_smtpmode``. Specify the port for sending mail.
+ *
+ * Defaults to ``25``
*/
'mail_smtpport' => 25,
@@ -302,36 +335,48 @@ $CONFIG = array(
* This depends on ``mail_smtpmode``. This sets the SMTP server timeout, in
* seconds. You may need to increase this if you are running an anti-malware or
* spam scanner.
+ *
+ * Defaults to ``10`` seconds
*/
'mail_smtptimeout' => 10,
/**
* This depends on ``mail_smtpmode``. Specify when you are using ``ssl`` or
* ``tls``, or leave empty for no encryption.
+ *
+ * Defaults to ``''`` (empty string)
*/
'mail_smtpsecure' => '',
/**
* This depends on ``mail_smtpmode``. Change this to ``true`` if your mail
* server requires authentication.
+ *
+ * Defaults to ``false``
*/
'mail_smtpauth' => false,
/**
* This depends on ``mail_smtpmode``. If SMTP authentication is required, choose
- * the authentication type as ``LOGIN`` (default) or ``PLAIN``.
+ * the authentication type as ``LOGIN`` or ``PLAIN``.
+ *
+ * Defaults to ``LOGIN``
*/
'mail_smtpauthtype' => 'LOGIN',
/**
* This depends on ``mail_smtpauth``. Specify the username for authenticating to
* the SMTP server.
+ *
+ * Defaults to ``''`` (empty string)
*/
'mail_smtpname' => '',
/**
* This depends on ``mail_smtpauth``. Specify the password for authenticating to
* the SMTP server.
+ *
+ * Default to ``''`` (empty string)
*/
'mail_smtppassword' => '',
@@ -371,6 +416,8 @@ $CONFIG = array(
* expression for the remote IP address. For example, defining a range of IP
* addresses starting with ``10.0.0.`` and ending with 1 to 3:
* ``^10\.0\.0\.[1-3]$``
+ *
+ * Defaults to ``''`` (empty string)
*/
'overwritecondaddr' => '',
@@ -379,6 +426,8 @@ $CONFIG = array(
* are generated within Nextcloud using any kind of command line tools (cron or
* occ). The value should contain the full base URL:
* ``https://www.example.com/nextcloud``
+ *
+ * Defaults to ``''`` (empty string)
*/
'overwrite.cli.url' => '',
@@ -404,6 +453,8 @@ $CONFIG = array(
*
* - `mod_rewrite` is installed
* - `mod_env` is installed
+ *
+ * Defaults to ``''`` (empty string)
*/
'htaccess.RewriteBase' => '/',
@@ -420,12 +471,16 @@ $CONFIG = array(
/**
* The URL of your proxy server, for example ``proxy.example.com:8081``.
+ *
+ * Defaults to ``''`` (empty string)
*/
'proxy' => '',
/**
* The optional authentication for the proxy to use to connect to the internet.
* The format is: ``username:password``.
+ *
+ * Defaults to ``''`` (empty string)
*/
'proxyuserpwd' => '',
@@ -466,6 +521,8 @@ $CONFIG = array(
* delete when exceeds D2 days
* * ``disabled``
* trash bin auto clean disabled, files and folders will be kept forever
+ *
+ * Defaults to ``auto``
*/
'trashbin_retention_obligation' => 'auto',
@@ -505,6 +562,8 @@ $CONFIG = array(
* keep versions for at least D1 days and delete when exceeds D2 days
* * ``disabled``
* versions auto clean disabled, versions will be kept forever
+ *
+ * Defaults to ``auto``
*/
'versions_retention_obligation' => 'auto',
@@ -519,17 +578,23 @@ $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 only allow to install or
* enable apps that pass this check.
+ *
+ * Defaults to ``false``
*/
'appcodechecker' => true,
/**
* Check if Nextcloud is up-to-date and shows a notification if a new version is
* available.
+ *
+ * Defaults to ``true``
*/
'updatechecker' => true,
/**
* URL that Nextcloud should use to look for updates
+ *
+ * Defaults to ``https://updates.nextcloud.com/updater_server/``
*/
'updater.server.url' => 'https://updates.nextcloud.com/updater_server/',
@@ -538,7 +603,7 @@ $CONFIG = array(
*
* Supported values:
* - ``daily``
- * - ``beta`
+ * - ``beta``
* - ``stable``
* - ``production``
*/
@@ -546,6 +611,8 @@ $CONFIG = array(
/**
* Is Nextcloud connected to the Internet or running in a closed network?
+ *
+ * Defaults to ``true``
*/
'has_internet_connection' => true,
@@ -559,6 +626,8 @@ $CONFIG = array(
* Allows Nextcloud to verify a working .well-known URL redirects. This is done
* by attempting to make a request from JS to
* https://your-domain.com/.well-known/caldav/
+ *
+ * Defaults to ``true``
*/
'check_for_working_wellknown_setup' => true,
@@ -568,6 +637,8 @@ $CONFIG = array(
* If it is not, then any options controlled by ``.htaccess``, such as large
* file uploads, will not work. It also runs checks on the ``data/`` directory,
* which verifies that it can't be accessed directly through the Web server.
+ *
+ * Defaults to ``true``
*/
'check_for_working_htaccess' => true,
@@ -578,6 +649,8 @@ $CONFIG = array(
* all options via the Web interface. Furthermore, when updating Nextcloud
* it is required to make the configuration file writable again for the update
* process.
+ *
+ * Defaults to ``false``
*/
'config_is_read_only' => false,
@@ -591,11 +664,14 @@ $CONFIG = array(
* If syslogging is desired, set this parameter to ``syslog``.
* Setting this parameter to ``errorlog`` will use the PHP error_log function
* for logging.
+ *
+ * Defaults to ``file``
*/
'log_type' => 'file',
/**
* Log file path for the Nextcloud logging type.
+ *
* Defaults to ``[datadirectory]/nextcloud.log``
*/
'logfile' => '/var/log/nextcloud.log',
@@ -603,6 +679,8 @@ $CONFIG = array(
/**
* Loglevel to start logging at. Valid values are: 0 = Debug, 1 = Info, 2 =
* Warning, 3 = Error, and 4 = Fatal. The default value is Warning.
+ *
+ * Defaults to ``2``
*/
'loglevel' => 2,
@@ -637,12 +715,16 @@ $CONFIG = array(
/**
* This uses PHP.date formatting; see http://php.net/manual/en/function.date.php
+ *
+ * Defaults to ``Y-m-d\TH:i:sO`` (ISO8601)
*/
'logdateformat' => 'F d, Y H:i:s',
/**
- * The default timezone for logfiles is UTC. You may change this; see
+ * The timezone for logfiles. You may change this; see
* http://php.net/manual/en/timezones.php
+ *
+ * Defaults to ``UTC``
*/
'logtimezone' => 'Europe/Berlin',
@@ -654,6 +736,8 @@ $CONFIG = array(
/**
* Log successful cron runs.
+ *
+ * Defaults to ``true``
*/
'cron_log' => true,
@@ -663,6 +747,8 @@ $CONFIG = array(
* = 100 * 1024 * 1024 bytes). A new logfile is created with a new name when the
* old logfile reaches your limit. If a rotated log file is already present, it
* will be overwritten.
+ *
+ * Defaults to ``0`` (no rotation)
*/
'log_rotate_size' => false,
@@ -676,6 +762,11 @@ $CONFIG = array(
/**
* This section is for configuring the download links for Nextcloud clients, as
* seen in the first-run wizard and on Personal pages.
+ *
+ * Defaults to
+ * * Desktop client: ``https://nextcloud.com/install/#install-clients``
+ * * Android client: ``https://play.google.com/store/apps/details?id=com.nextcloud.client``
+ * * iOS client : ``https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8``
*/
'customclient_desktop' =>
'https://nextcloud.com/install/#install-clients',
@@ -692,6 +783,8 @@ $CONFIG = array(
/**
* When enabled, admins may install apps from the Nextcloud app store.
+ *
+ * Defaults to ``true``
*/
'appstoreenabled' => true,
@@ -733,16 +826,22 @@ $CONFIG = array(
*
* Valid values are ``true``, to enable previews, or
* ``false``, to disable previews
+ *
+ * Defaults to ``true``
*/
'enable_previews' => true,
/**
* The maximum width, in pixels, of a preview. A value of ``null`` means there
* is no limit.
+ *
+ * Defaults to ``2048``
*/
'preview_max_x' => 2048,
/**
* The maximum height, in pixels, of a preview. A value of ``null`` means there
* is no limit.
+ *
+ * Defaults to ``2048``
*/
'preview_max_y' => 2048,
/**
@@ -750,26 +849,30 @@ $CONFIG = array(
* preview system generates blurry previews, you might want to consider setting
* a maximum scale factor. By default, pictures are upscaled to 10 times the
* original size. A value of ``1`` or ``null`` disables scaling.
+ *
+ * Defaults to ``2``
*/
'preview_max_scale_factor' => 10,
/**
* max file size for generating image previews with imagegd (default behaviour)
- * If the image is bigger, it'll try other preview generators,
- * but will most likely show the default mimetype icon
+ * If the image is bigger, it'll try other preview generators, but will most
+ * likely show the default mimetype icon. Set to -1 for no limit.
*
- * Value represents the maximum filesize in megabytes
- * Default is 50
- * Set to -1 for no limit
+ * Defaults to ``50`` megabytes
*/
'preview_max_filesize_image' => 50,
/**
* custom path for LibreOffice/OpenOffice binary
+ *
+ * Defaults to ``''`` (empty string)
*/
'preview_libreoffice_path' => '/usr/bin/libreoffice',
/**
* Use this if LibreOffice/OpenOffice requires additional arguments.
+ *
+ * Defaults to ``''`` (empty string)
*/
'preview_office_cl_parameters' =>
' --headless --nologo --nofirststartwizard --invisible --norestore '.
@@ -778,17 +881,6 @@ $CONFIG = array(
/**
* Only register providers that have been explicitly enabled
*
- * The following providers are enabled by default:
- *
- * - OC\Preview\PNG
- * - OC\Preview\JPEG
- * - OC\Preview\GIF
- * - OC\Preview\BMP
- * - OC\Preview\XBitmap
- * - OC\Preview\MarkDown
- * - OC\Preview\MP3
- * - OC\Preview\TXT
- *
* The following providers are disabled by default due to performance or privacy
* concerns:
*
@@ -818,6 +910,17 @@ $CONFIG = array(
* - OC\Preview\MSOffice2007
* - OC\Preview\OpenDocument
* - OC\Preview\StarOffice
+ *
+ * Defaults to the following providers:
+ *
+ * - OC\Preview\BMP
+ * - OC\Preview\GIF
+ * - OC\Preview\JPEG
+ * - OC\Preview\MarkDown
+ * - OC\Preview\MP3
+ * - OC\Preview\PNG
+ * - OC\Preview\TXT
+ * - OC\Preview\XBitmap
*/
'enabledPreviewProviders' => array(
'OC\Preview\PNG',
@@ -841,6 +944,8 @@ $CONFIG = array(
* existence and marks them as ready to be cleaned up. The number is always
* minutes. Setting it to 0 disables the feature.
* See command line (occ) methods ``ldap:show-remnants`` and ``user:delete``
+ *
+ * Defaults to ``51`` minutes
*/
'ldapUserCleanupInterval' => 51,
@@ -854,6 +959,8 @@ $CONFIG = array(
* Replaces the default Comments Manager Factory. This can be utilized if an
* own or 3rdParty CommentsManager should be used that – for instance – uses the
* filesystem instead of the database to keep the comments.
+ *
+ * Defaults to ``\OC\Comments\ManagerFactory``
*/
'comments.managerFactory' => '\OC\Comments\ManagerFactory',
@@ -861,6 +968,8 @@ $CONFIG = array(
* Replaces the default System Tags Manager Factory. This can be utilized if an
* own or 3rdParty SystemTagsManager should be used that – for instance – uses the
* filesystem instead of the database to keep the comments.
+ *
+ * Defaults to ``\OC\SystemTag\ManagerFactory``
*/
'systemtags.managerFactory' => '\OC\SystemTag\ManagerFactory',
@@ -878,12 +987,16 @@ $CONFIG = array(
* doing some maintenance work, you need to set the value of the maintenance
* parameter to true. Please keep in mind that users who are already logged-in
* are kicked out of Nextcloud instantly.
+ *
+ * Defaults to ``false``
*/
'maintenance' => false,
/**
* When set to ``true``, the Nextcloud instance will be unavailable for all
* users who are not in the ``admin`` group.
+ *
+ * Defaults to ``false``
*/
'singleuser' => false,
@@ -894,6 +1007,8 @@ $CONFIG = array(
/**
* Extra SSL options to be used for configuration.
+ *
+ * Defaults to an empty array.
*/
'openssl' => array(
'config' => '/absolute/location/of/openssl.cnf',
@@ -927,6 +1042,8 @@ $CONFIG = array(
* Memory caching backend for locally stored data
*
* * Used for host-specific data, e.g. file paths
+ *
+ * Defaults to ``none``
*/
'memcache.local' => '\OC\Memcache\APCu',
@@ -935,6 +1052,8 @@ $CONFIG = array(
*
* * Used for installation-specific data, e.g. database caching
* * If unset, defaults to the value of memcache.local
+ *
+ * Defaults to ``none``
*/
'memcache.distributed' => '\OC\Memcache\Memcached',
@@ -994,6 +1113,8 @@ $CONFIG = array(
* ``$user`` is the current user. When specified, the format will change to
* ``$cache_path/$user`` where ``$cache_path`` is the configured cache directory
* and ``$user`` is the user.
+ *
+ * Defaults to ``''`` (empty string)
*/
'cache_path' => '',
@@ -1002,8 +1123,10 @@ $CONFIG = array(
* garbage collection (in seconds). Increase this value if users have
* issues uploading very large files via the Nextcloud Client as upload isn't
* completed within one day.
+ *
+ * Defaults to ``60*60*24`` (1 day)
*/
-'cache_chunk_gc_ttl' => 86400, // 60*60*24 = 1 day
+'cache_chunk_gc_ttl' => 60*60*24,
/**
* Using Object Store with Nextcloud
@@ -1065,6 +1188,8 @@ $CONFIG = array(
* Replaces the default Share Provider Factory. This can be utilized if
* own or 3rdParty Share Providers be used that – for instance – uses the
* filesystem instead of the database to keep the share information.
+ *
+ * Defaults to ``\OC\Share20\ProviderFactory``
*/
'sharing.managerFactory' => '\OC\Share20\ProviderFactory',
@@ -1125,6 +1250,11 @@ $CONFIG = array(
* - mysql (MySQL)
* - pgsql (PostgreSQL)
* - oci (Oracle)
+ *
+ * Defaults to the following databases:
+ * - sqlite (SQLite3)
+ * - mysql (MySQL)
+ * - pgsql (PostgreSQL)
*/
'supportedDatabases' => array(
'sqlite',
@@ -1153,17 +1283,23 @@ $CONFIG = array(
* Blacklist a specific file or files and disallow the upload of files
* with this name. ``.htaccess`` is blocked by default.
* WARNING: USE THIS ONLY IF YOU KNOW WHAT YOU ARE DOING.
+ *
+ * Defaults to ``array('.htaccess')``
*/
'blacklisted_files' => array('.htaccess'),
/**
* Define a default folder for shared files and folders other than root.
+ *
+ * Defaults to ``/``
*/
'share_folder' => '/',
/**
* If you are applying a theme to Nextcloud, enter the name of the theme here.
* The default location for themes is ``nextcloud/themes/``.
+ *
+ * Defaults to the theming app which is shipped since Nextcloud 9
*/
'theme' => '',
@@ -1182,12 +1318,16 @@ $CONFIG = array(
* When changing this, note that older unsupported versions of the Nextcloud desktop
* client may not function as expected, and could lead to permanent data loss for
* clients or other unexpected results.
+ *
+ * Defaults to ``2.0.0``
*/
'minimum.supported.desktop.version' => '2.0.0',
/**
* EXPERIMENTAL: option whether to include external storage in quota
* calculation, defaults to false.
+ *
+ * Defaults to ``false``
*/
'quota_include_external_storage' => false,
@@ -1202,6 +1342,8 @@ $CONFIG = array(
*
* 1 -> Check each file or folder at most once per request, recommended for
* general use if outside changes might happen.
+ *
+ * Defaults to ``0``
*/
'filesystem_check_changes' => 0,
@@ -1210,18 +1352,24 @@ $CONFIG = array(
* same storage as the upload target. Setting this to false will store the part
* files in the root of the users folder which might be required to work with certain
* external storage setups that have limited rename capabilities.
+ *
+ * Defaults to ``true``
*/
'part_file_in_storage' => true,
/**
* Where ``mount.json`` file should be stored, defaults to ``data/mount.json``
* in the Nextcloud directory.
+ *
+ * Defaults to ``data/mount.json`` in the Nextcloud directory.
*/
'mount_file' => '/var/www/nextcloud/data/mount.json',
/**
* When ``true``, prevent Nextcloud from changing the cache due to changes in
* the filesystem for all storage.
+ *
+ * Defaults to ``false``
*/
'filesystem_cache_readonly' => false,
@@ -1236,6 +1384,7 @@ $CONFIG = array(
*
* If you configure these also consider setting `forwarded_for_headers` which
* otherwise defaults to `HTTP_X_FORWARDED_FOR` (the `X-Forwarded-For` header).
+ * Defaults to an empty array.
*/
'trusted_proxies' => array('203.0.113.45', '198.51.100.128'),
@@ -1247,7 +1396,7 @@ $CONFIG = array(
* If set incorrectly, a client can spoof their IP address as visible to
* Nextcloud, bypassing access controls and making logs useless!
*
- * Defaults to 'HTTP_X_FORWARED_FOR' if unset
+ * Defaults to ``'HTTP_X_FORWARED_FOR'``
*/
'forwarded_for_headers' => array('HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR'),
@@ -1255,8 +1404,10 @@ $CONFIG = array(
* max file size for animating gifs on public-sharing-site.
* If the gif is bigger, it'll show a static preview
*
- * Value represents the maximum filesize in megabytes. Default is ``10``. Set to
- * ``-1`` for no limit.
+ * Value represents the maximum filesize in megabytes. Set to ``-1`` for
+ * no limit.
+ *
+ * Defaults to ``10`` megabytes
*/
'max_filesize_animated_gifs_public_sharing' => 10,
@@ -1270,6 +1421,8 @@ $CONFIG = array(
* be caused by concurrent operations. Mainly relevant for
* very large installations with many users working with
* shared files.
+ *
+ * Defaults to ``true``
*/
'filelocking.enabled' => true,
@@ -1278,15 +1431,18 @@ $CONFIG = array(
*
* Any lock older than this will be automatically cleaned up.
*
- * If not set this defaults to either 1 hour or the php max_execution_time, whichever is higher.
+ * Defaults to ``60*60`` seconds (1 hour) or the php
+ * max_execution_time, whichever is higher.
*/
-'filelocking.ttl' => 3600,
+'filelocking.ttl' => 60*60,
/**
* Memory caching backend for file locking
*
* Because most memcache backends can clean values without warning using redis
* is highly recommended to *avoid data loss*.
+ *
+ * Defaults to ``none``
*/
'memcache.locking' => '\\OC\\Memcache\\Redis',
@@ -1300,6 +1456,8 @@ $CONFIG = array(
*
* Only enable this for local development and not in production environments
* This will disable the minifier and outputs some additional debug information
+ *
+ * Defaults to ``false``
*/
'debug' => false,
@@ -1313,6 +1471,8 @@ $CONFIG = array(
*
* Updating/Deleting this value can make connected clients stall until
* the user has resolved conflicts.
+ *
+ * Defaults to ``''`` (empty string)
*/
'data-fingerprint' => '',
diff --git a/core/Command/Config/ListConfigs.php b/core/Command/Config/ListConfigs.php
index 2737bc2cea4..94b493c9244 100644
--- a/core/Command/Config/ListConfigs.php
+++ b/core/Command/Config/ListConfigs.php
@@ -89,14 +89,14 @@ class ListConfigs extends Base {
'apps' => [],
];
foreach ($apps as $appName) {
- $configs['apps'][$appName] = $this->appConfig->getValues($appName, false);
+ $configs['apps'][$appName] = $this->getAppConfigs($appName, $noSensitiveValues);
}
break;
default:
$configs = [
'apps' => [
- $app => $this->appConfig->getValues($app, false),
+ $app => $this->getAppConfigs($app, $noSensitiveValues),
],
];
}
@@ -130,6 +130,21 @@ class ListConfigs extends Base {
}
/**
+ * Get the app configs
+ *
+ * @param string $app
+ * @param bool $noSensitiveValues
+ * @return array
+ */
+ protected function getAppConfigs($app, $noSensitiveValues) {
+ if ($noSensitiveValues) {
+ return $this->appConfig->getFilteredValues($app, false);
+ } else {
+ return $this->appConfig->getValues($app, false);
+ }
+ }
+
+ /**
* @param string $argumentName
* @param CompletionContext $context
* @return string[]
diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php
index a2d490cb240..2509cdf0bde 100644
--- a/core/Controller/LoginController.php
+++ b/core/Controller/LoginController.php
@@ -207,8 +207,8 @@ class LoginController extends Controller {
* @return RedirectResponse
*/
public function tryLogin($user, $password, $redirect_url, $remember_login = false, $timezone = '', $timezone_offset = '') {
- $currentDelay = $this->throttler->getDelay($this->request->getRemoteAddress());
- $this->throttler->sleepDelay($this->request->getRemoteAddress());
+ $currentDelay = $this->throttler->getDelay($this->request->getRemoteAddress(), 'login');
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), 'login');
// If the user is already logged in and the CSRF check does not pass then
// simply redirect the user to the correct page as required. This is the
@@ -232,7 +232,7 @@ class LoginController extends Controller {
if ($loginResult === false) {
$this->throttler->registerAttempt('login', $this->request->getRemoteAddress(), ['user' => $originalUser]);
if($currentDelay === 0) {
- $this->throttler->sleepDelay($this->request->getRemoteAddress());
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), 'login');
}
$this->session->set('loginMessages', [
['invalidpassword'], []
@@ -297,15 +297,15 @@ class LoginController extends Controller {
* @return DataResponse
*/
public function confirmPassword($password) {
- $currentDelay = $this->throttler->getDelay($this->request->getRemoteAddress());
- $this->throttler->sleepDelay($this->request->getRemoteAddress());
+ $currentDelay = $this->throttler->getDelay($this->request->getRemoteAddress(), 'sudo');
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), 'sudo');
$loginName = $this->userSession->getLoginName();
$loginResult = $this->userManager->checkPassword($loginName, $password);
if ($loginResult === false) {
$this->throttler->registerAttempt('sudo', $this->request->getRemoteAddress(), ['user' => $loginName]);
if ($currentDelay === 0) {
- $this->throttler->sleepDelay($this->request->getRemoteAddress());
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), 'sudo');
}
return new DataResponse([], Http::STATUS_FORBIDDEN);
diff --git a/core/Controller/LostController.php b/core/Controller/LostController.php
index b12abf38142..8a8a50343ed 100644
--- a/core/Controller/LostController.php
+++ b/core/Controller/LostController.php
@@ -202,6 +202,7 @@ class LostController extends Controller {
/**
* @PublicPage
+ * @BruteForceProtection passwordResetEmail
*
* @param string $user
* @return array
@@ -234,6 +235,8 @@ class LostController extends Controller {
$this->checkPasswordResetToken($token, $userId);
$user = $this->userManager->get($userId);
+ \OC_Hook::emit('\OC\Core\LostPassword\Controller\LostController', 'pre_passwordReset', array('uid' => $userId, 'password' => $password));
+
if (!$user->setPassword($password)) {
throw new \Exception();
}
@@ -242,11 +245,6 @@ class LostController extends Controller {
$this->config->deleteUserValue($userId, 'core', 'lostpassword');
@\OC_User::unsetMagicInCookie();
- } catch (PrivateKeyMissingException $e) {
- // in this case it is OK if we couldn't reset the users private key
- // They chose explicitely to continue at the password reset dialog
- // (see $proceed flag)
- return $this->success();
} catch (\Exception $e){
return $this->error($e->getMessage());
}
diff --git a/core/Controller/OCSController.php b/core/Controller/OCSController.php
index c59b0d7ad3f..dc9775f2603 100644
--- a/core/Controller/OCSController.php
+++ b/core/Controller/OCSController.php
@@ -128,7 +128,7 @@ class OCSController extends \OCP\AppFramework\OCSController {
*/
public function personCheck($login = '', $password = '') {
if ($login !== '' && $password !== '') {
- $this->throttler->sleepDelay($this->request->getRemoteAddress());
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), 'login');
if ($this->userManager->checkPassword($login, $password)) {
return new DataResponse([
'person' => [
diff --git a/core/Controller/TwoFactorChallengeController.php b/core/Controller/TwoFactorChallengeController.php
index 34f0092bea8..fd4811d3ff6 100644
--- a/core/Controller/TwoFactorChallengeController.php
+++ b/core/Controller/TwoFactorChallengeController.php
@@ -29,6 +29,7 @@ use OC_Util;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\Authentication\TwoFactorAuth\TwoFactorException;
use OCP\IRequest;
use OCP\ISession;
use OCP\IURLGenerator;
@@ -115,16 +116,19 @@ class TwoFactorChallengeController extends Controller {
$backupProvider = null;
}
+ $errorMessage = '';
+ $error = false;
if ($this->session->exists('two_factor_auth_error')) {
$this->session->remove('two_factor_auth_error');
$error = true;
- } else {
- $error = false;
+ $errorMessage = $this->session->get("two_factor_auth_error_message");
+ $this->session->remove('two_factor_auth_error_message');
}
$tmpl = $provider->getTemplate($user);
$tmpl->assign('redirect_url', $redirect_url);
$data = [
'error' => $error,
+ 'error_message' => $errorMessage,
'provider' => $provider,
'backupProvider' => $backupProvider,
'logout_attribute' => $this->getLogoutAttribute(),
@@ -151,11 +155,20 @@ class TwoFactorChallengeController extends Controller {
return new RedirectResponse($this->urlGenerator->linkToRoute('core.TwoFactorChallenge.selectChallenge'));
}
- if ($this->twoFactorManager->verifyChallenge($challengeProviderId, $user, $challenge)) {
- if (!is_null($redirect_url)) {
- return new RedirectResponse($this->urlGenerator->getAbsoluteURL(urldecode($redirect_url)));
+ try {
+ if ($this->twoFactorManager->verifyChallenge($challengeProviderId, $user, $challenge)) {
+ if (!is_null($redirect_url)) {
+ return new RedirectResponse($this->urlGenerator->getAbsoluteURL(urldecode($redirect_url)));
+ }
+ return new RedirectResponse(OC_Util::getDefaultPageUrl());
}
- return new RedirectResponse(OC_Util::getDefaultPageUrl());
+ } catch (TwoFactorException $e) {
+ /*
+ * The 2FA App threw an TwoFactorException. Now we display more
+ * information to the user. The exception text is stored in the
+ * session to be used in showChallenge()
+ */
+ $this->session->set('two_factor_auth_error_message', $e->getMessage());
}
$this->session->set('two_factor_auth_error', true);
diff --git a/core/css/apps.scss b/core/css/apps.scss
index 8bb380ad0ae..93e60fbfbf1 100644
--- a/core/css/apps.scss
+++ b/core/css/apps.scss
@@ -1,3 +1,31 @@
+/**
+ * @copyright Copyright (c) 2014, Jan-Christoph Borchardt (http://jancborchardt.net)
+ * @copyright Copyright (c) 2017, John Molakvoæ (skjnldsv@protonmail.com)
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ */
+
+/* HEADING STYLING ---------------------------------------------------------- */
+
+h2 {
+ font-size: 20px;
+ font-weight: 300;
+ margin-bottom: 12px;
+ line-height: 140%;
+}
+h3 {
+ font-size: 15px;
+ font-weight: 300;
+ margin: 12px 0;
+}
+/* do not use italic typeface style, instead lighter color */
+em {
+ font-style: normal;
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)';
+ opacity: .5;
+}
+
/* APP STYLING -------------------------------------------------------------- */
#app {
@@ -39,13 +67,15 @@
&.without-app-settings {
padding-bottom: 0;
}
- .active.with-menu > a, .with-counter > a {
+ .active.with-menu > a,
+ .with-counter > a {
padding-right: 50px;
}
.active.with-menu.with-counter > a {
padding-right: 90px;
}
- .with-icon a, .app-navigation-entry-loading a {
+ .with-icon a,
+ .app-navigation-entry-loading a {
padding-left: 44px;
background-size: 16px 16px;
background-position: 14px center;
@@ -64,25 +94,15 @@
color: #000;
opacity: .57;
}
- .active {
- opacity: 1;
- a {
- opacity: 1;
- }
- }
- li {
- &:hover > a, &:focus > a {
- opacity: 1;
- }
- }
- a:focus {
+ li:hover > a,
+ li:focus > a,
+ a:focus,
+ .selected,
+ .selected a,
+ .active,
+ .active a {
opacity: 1;
- }
- .selected {
- opacity: 1;
- a {
- opacity: 1;
- }
+ box-shadow: inset 2px 0 #0082c9;
}
.collapse {
display: none;
@@ -105,11 +125,15 @@
outline: none !important;
box-shadow: none;
}
- &:hover > a, &:focus > a {
+ &:hover > a,
+ &:focus > a {
background-image: none;
}
- &:hover > .collapse, &:focus > .collapse {
- display: block;
+ &:hover,
+ &:focus {
+ > .collapse {
+ display: block;
+ }
}
.collapse {
-webkit-transform: rotate(-90deg);
@@ -128,6 +152,7 @@
}
}
> {
+ /* Second level nesting for lists */
ul ul {
display: none;
li > a {
@@ -135,20 +160,23 @@
}
}
.with-icon ul li {
- > a, &.app-navigation-entry-loading > a {
+ > a,
+ &.app-navigation-entry-loading > a {
padding-left: 68px;
background-position: 44px center;
}
}
}
> ul .collapsible.open {
- &:hover, &:focus {
+ &:hover,
+ &:focus {
box-shadow: inset 0 0 3px #ddd;
}
ul {
display: block;
}
}
+ /* Deleted entries with undo button */
.app-navigation-entry-deleted {
display: inline-block;
height: 44px;
@@ -178,6 +206,7 @@
opacity: 1;
}
}
+ /* counter and actions, legacy code */
.utils {
position: absolute;
padding: 7px 7px 0 0;
@@ -191,6 +220,7 @@
padding-top: 12px;
}
}
+ /* drag and drop */
.drag-and-drop {
-webkit-transition: padding-bottom 500ms ease 0s;
transition: padding-bottom 500ms ease 0s;
@@ -202,32 +232,34 @@
.app-navigation-separator {
border-bottom: 1px solid #ddd;
}
+
+ /**
+ * App navigation utils, buttons and counters for drop down menu
+ */
.app-navigation-entry-utils {
position: absolute;
top: 0;
right: 0;
z-index: 105;
ul {
- display: block !important;
+ display: flex !important;
+ align-items: center;
+ justify-content: flex-end;
}
li {
- float: left;
width: 44px !important;
height: 44px;
- line-height: 44px;
}
}
.active > .app-navigation-entry-utils li {
display: inline-block;
}
.app-navigation-entry-utils button {
- height: 38px;
- width: 38px;
- line-height: 38px;
- float: left;
+ height: 100%;
+ width: 100%;
+ margin: 0;
}
.app-navigation-entry-utils-menu-button {
- display: none;
button {
border: 0;
opacity: .5;
@@ -236,7 +268,8 @@
background-position: center;
background-image: url('../img/actions/more.svg?v=1');
}
- &:hover button, &:focus button {
+ &:hover button,
+ &:focus button {
background-color: transparent;
opacity: 1;
}
@@ -253,109 +286,8 @@
.app-navigation-entry-utils ul, .app-navigation-entry-menu ul {
list-style-type: none;
}
-}
-/* Second level nesting for lists */
-
-/* Deleted entries with undo button */
-
-/* counter and actions, legacy code */
-
-/* drag and drop */
-
-/**
- * App navigation utils, buttons and counters for drop down menu
- */
-
-/* menu bubble / popover */
-
-.bubble, #app-navigation .app-navigation-entry-menu {
- position: absolute;
- background-color: #fff;
- color: #333;
- border-radius: 3px;
- border-top-right-radius: 0;
- z-index: 110;
- margin: 5px;
- margin-top: -5px;
- right: 0;
- -webkit-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
- -moz-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
- -ms-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
- -o-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
- filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
-}
-
-.ie {
- .bubble, #app-navigation .app-navigation-entry-menu, .bubble:after, #app-navigation .app-navigation-entry-menu:after {
- border: 1px solid #eee;
- }
-}
-
-.edge {
- .bubble, #app-navigation .app-navigation-entry-menu, .bubble:after, #app-navigation .app-navigation-entry-menu:after {
- border: 1px solid #eee;
- }
-}
-
-/* miraculous border arrow stuff */
-
-.bubble:after, #app-navigation .app-navigation-entry-menu:after {
- bottom: 100%;
- right: 6px;
- /* change this to adjust the arrow position */
- border: solid transparent;
- content: ' ';
- height: 0;
- width: 0;
- position: absolute;
- pointer-events: none;
-}
-
-.bubble:after, #app-navigation .app-navigation-entry-menu:after {
- border-color: rgba(238, 238, 238, 0);
- border-bottom-color: #fff;
- border-width: 10px;
-}
-
-.bubble .action {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)' !important;
- filter: alpha(opacity = 50) !important;
- opacity: .5 !important;
- &:hover, &:focus, &.active {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)' !important;
- filter: alpha(opacity = 100) !important;
- opacity: 1 !important;
- }
-}
-
-#app-navigation {
- .app-navigation-entry-menu {
- display: none;
- &.open {
- display: block;
- }
- ul {
- display: block !important;
- }
- li {
- float: left;
- width: 38px !important;
- button {
- float: right;
- width: 36px !important;
- height: 36px;
- line-height: 36px;
- border: 0;
- opacity: .5;
- background-color: transparent;
- &:hover, &:focus {
- opacity: 1;
- background-color: transparent;
- }
- }
- }
- }
+ /* editing an entry */
.app-navigation-entry-edit {
padding-left: 5px;
padding-right: 5px;
@@ -372,7 +304,8 @@
float: left;
border: 1px solid rgba(190, 190, 190, 0.9);
}
- button, input[type='submit'] {
+ button,
+ input[type='submit'] {
width: 36px;
height: 38px;
float: left;
@@ -386,18 +319,19 @@
}
}
-/* list of options for an entry */
-
-/* editing an entry */
-
/* APP-CONTENT ---------------------------------------------------------------*/
-
/* Part where the content will be loaded into */
-
#app-content {
position: relative;
height: 100%;
overflow-y: auto;
+ /* no top border for first settings item */
+ > .section:first-child {
+ border-top: none;
+ }
+ &.with-app-sidebar {
+ margin-right: 27%;
+ }
}
#app-content-wrapper {
@@ -412,7 +346,6 @@
have it as first element within app-content in order to shrink other
sibling containers properly. Compare Files app for example.
*/
-
#app-sidebar {
position: fixed;
top: 45px;
@@ -430,27 +363,22 @@
overflow-y: auto;
visibility: visible;
z-index: 500;
-}
-
-#app-content.with-app-sidebar {
- margin-right: 27%;
-}
-
-#app-sidebar.disappear {
- visibility: hidden;
+ &.disappear {
+ visibility: hidden;
+ }
}
/* APP-SETTINGS ---------------------------------------------------------------*/
/* settings area */
-
#app-settings {
position: fixed;
width: 250px;
/* change to 100% when layout positions are absolute */
bottom: 0;
z-index: 140;
- &.open #app-settings-content, &.opened #app-settings-content {
+ &.open #app-settings-content,
+ &.opened #app-settings-content {
display: block;
}
}
@@ -465,6 +393,11 @@
border-right: 1px solid #eee;
width: 250px;
box-sizing: border-box;
+
+ /* display input fields at full width */
+ input[type='text'] {
+ width: 93%;
+ }
}
#app-settings-header {
@@ -473,12 +406,6 @@
box-sizing: border-box;
}
-/* display input fields at full width */
-
-#app-settings-content input[type='text'] {
- width: 93%;
-}
-
.settings-button {
display: block;
height: 44px;
@@ -495,7 +422,8 @@
text-align: left;
padding-left: 42px;
font-weight: normal;
- &:hover, &:focus {
+ &:hover,
+ &:focus {
background-color: #fff;
}
&.opened {
@@ -505,18 +433,7 @@
}
}
-/* buttons */
-
-button.loading {
- background-image: url('../img/loading.gif');
- background-position: right 10px center;
- background-repeat: no-repeat;
- background-size: 16px;
- padding-right: 30px;
-}
-
-/* general styles for the content area */
-
+/* GENERAL SECTION ---------------------------------------------------------- */
.section {
display: block;
padding: 30px;
@@ -525,8 +442,15 @@ button.loading {
&.hidden {
display: none !important;
}
+ /* slight position correction of checkboxes and radio buttons */
+ input {
+ &[type='checkbox'],
+ &[type='radio'] {
+ vertical-align: -2px;
+ margin-right: 4px;
+ }
+ }
}
-
.sub-section {
position: relative;
margin-top: 10px;
@@ -534,36 +458,6 @@ button.loading {
margin-bottom: 10px;
}
-/* no top border for first settings item */
-
-#app-content > .section:first-child {
- border-top: none;
-}
-
-/* heading styles */
-
-h2 {
- font-size: 20px;
- font-weight: 300;
- margin-bottom: 12px;
- line-height: 140%;
-}
-
-h3 {
- font-size: 15px;
- font-weight: 300;
- margin: 12px 0;
-}
-
-/* slight position correction of checkboxes and radio buttons */
-
-.section input {
- &[type='checkbox'], &[type='radio'] {
- vertical-align: -2px;
- margin-right: 4px;
- }
-}
-
.appear {
opacity: 1;
-webkit-transition: opacity 500ms ease 0s;
@@ -576,16 +470,7 @@ h3 {
}
}
-/* do not use italic typeface style, instead lighter color */
-
-em {
- font-style: normal;
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)';
- opacity: .5;
-}
-
-/* generic dropdown style */
-
+/* DROPDOWN ----------------------------------------------------------------- */
.dropdown {
background: #eee;
border-bottom-left-radius: 5px;
@@ -600,8 +485,7 @@ em {
padding: 16px;
}
-/* generic tab styles */
-
+/* TABS --------------------------------------------------------------------- */
.tabHeaders {
display: inline-block;
margin: 15px;
@@ -632,7 +516,6 @@ em {
}
}
}
-
.tabsContainer {
clear: left;
.tab {
@@ -640,50 +523,144 @@ em {
}
}
-/* popover menu styles (use together with 'bubble' class) */
+/* POPOVER MENU ------------------------------------------------------------- */
+.ie,
+.edge {
+ .bubble, .bubble:after,
+ .popovermenu, .popovermenu:after,
+ #app-navigation .app-navigation-entry-menu,
+ #app-navigation .app-navigation-entry-menu:after {
+ border: 1px solid #eee;
+ }
+}
+.bubble,
+.app-navigation-entry-menu,
.popovermenu {
- .menuitem {
- cursor: pointer;
- vertical-align: middle;
- > span {
- cursor: pointer;
- vertical-align: middle;
- }
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)';
- filter: alpha(opacity = 50);
- opacity: .5;
- &:hover, &:focus, &.active {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- filter: alpha(opacity = 100);
- opacity: 1;
- }
- img {
- padding: initial;
- }
- }
- a.menuitem, label.menuitem, .menuitem {
- padding: 10px !important;
- width: auto;
- }
- &.hidden {
- display: none;
+ position: absolute;
+ background-color: #fff;
+ color: #333;
+ border-radius: 3px;
+ border-top-right-radius: 0;
+ z-index: 110;
+ margin: 5px;
+ margin-top: -5px;
+ right: 0;
+ -webkit-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
+ -moz-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
+ -ms-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
+ -o-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
+ filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
+ display: none;
+
+ &:after {
+ bottom: 100%;
+ /* Min-width of popover is 36px and arrow width is 20px
+ wich leaves us 8px right and 8px left */
+ right: 8px;
+ /* change this to adjust the arrow position */
+ border: solid transparent;
+ content: ' ';
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+ border-color: rgba(238, 238, 238, 0);
+ border-bottom-color: #fff;
+ border-width: 10px;
+ }
+ /* Center the popover */
+ &.menu-center {
+ transform: translateX(50%);
+ right: 50%;
+ margin-right: 0;
+ border-top-right-radius: 3px;
+ &:after {
+ right: 50%;
+ transform: translateX(50%);
+ }
+ }
+ /* Align the popover to the left */
+ &.menu-left {
+ right: auto;
+ left: 0;
+ margin-right: 0;
+ border-top-left-radius: 0;
+ border-top-right-radius: 3px;
+ &:after {
+ left: 6px;
+ right: auto;
+ }
+ }
+
+ &.open {
+ display: block;
}
- .menuitem {
+
+ ul {
+ /* Overwrite #app-navigation > ul ul */
display: flex !important;
- line-height: 30px;
- color: #000;
- align-items: center;
- .icon, .no-icon {
- display: inline-block;
- width: 16px;
- height: 16px;
- margin-right: 10px;
- vertical-align: middle;
- }
- opacity: 0.5;
+ flex-direction: column;
}
- li:hover .menuitem {
- opacity: 1;
+ li {
+ display: flex;
+ > button,
+ > a,
+ > .menuitem {
+ cursor: pointer;
+ line-height: 36px;
+ border: 0;
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)' !important;
+ filter: alpha(opacity = 50) !important;
+ opacity: .5 !important;
+ background-color: transparent;
+ display: flex;
+ align-items: center;
+ width: auto;
+ height: auto;
+ margin: 0;
+ font-weight: inherit;
+ /* prevent .action class to break the design */
+ &.action {
+ padding: inherit !important;
+ }
+ &:hover, &:focus {
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)' !important;
+ filter: alpha(opacity = 100) !important;
+ opacity: 1 !important;
+ background-color: transparent;
+ }
+ > span {
+ cursor: pointer;
+ }
+ > p {
+ width: 150px;
+ line-height: 1.6em;
+ padding: 8px 0;
+ > span {
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=70)' !important;
+ filter: alpha(opacity = 70) !important;
+ opacity: .7 !important;
+ }
+ }
+ /* Add padding if contains icon+text */
+ &:not(:empty) {
+ padding: 0 !important;
+ padding-right: 10px !important;
+ }
+ > img {
+ width: 16px;
+ padding: 0 10px;
+ }
+ }
+ [class^='icon-'],
+ [class*=' icon-']{
+ /* Keep padding to define the width to
+ assure correct position of a possible text */
+ padding: 18px 0 18px 36px;
+ min-width: 0; /* Overwrite icons*/
+ min-height: 0;
+ background-position: 10px center
+ }
}
}
diff --git a/core/css/header.scss b/core/css/header.scss
index 8035f7e568a..886c2489a63 100644
--- a/core/css/header.scss
+++ b/core/css/header.scss
@@ -1,13 +1,23 @@
-/* prevent ugly selection effect on accidental selection */
+/**
+ * @copyright Copyright (c) 2017, John Molakvoæ (skjnldsv@protonmail.com)
+ * @copyright Copyright (c) 2016, Lukas Reschke (lukas@statuscode.ch)
+ * @copyright Copyright (c) 2016, Julius Härtl (jus@bitgrid.net)
+ * @copyright Copyright (c) 2016, Jos Poortvliet (jospoortvliet@gmail.com)
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ */
-#header, #navigation, #expanddiv {
+/* prevent ugly selection effect on accidental selection */
+#header,
+#navigation,
+#expanddiv {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
}
/* removed until content-focusing issue is fixed */
-
#skip-to-content a {
position: absolute;
left: -10000px;
@@ -25,8 +35,9 @@
}
/* HEADERS ------------------------------------------------------------------ */
-
-#body-user #header, #body-settings #header, #body-public #header {
+#body-user #header,
+#body-settings #header,
+#body-public #header {
position: fixed;
top: 0;
left: 0;
@@ -39,7 +50,6 @@
}
/* LOGO and APP NAME -------------------------------------------------------- */
-
#nextcloud {
position: absolute;
top: 0;
@@ -88,6 +98,16 @@
padding-top: 18px;
padding-right: 10px;
}
+ /* show caret indicator next to logo to make clear it is tappable */
+ .icon-caret {
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ margin: 0;
+ margin-top: -21px;
+ padding: 0;
+ vertical-align: middle;
+ }
}
/* hover effect for app switcher label */
@@ -123,7 +143,6 @@
}
/* show appname next to logo */
-
.header-appname {
display: inline-block;
position: relative;
@@ -136,26 +155,14 @@
vertical-align: middle;
}
-/* show caret indicator next to logo to make clear it is tappable */
-#header .icon-caret {
- display: inline-block;
- width: 12px;
- height: 12px;
- margin: 0;
- margin-top: -21px;
- padding: 0;
- vertical-align: middle;
-}
/* do not show menu toggle on public share links as there is no menu */
-
#body-public #header .icon-caret {
display: none;
}
/* NAVIGATION --------------------------------------------------------------- */
-
#navigation {
position: fixed;
top: 45px;
@@ -170,6 +177,7 @@
border-top-left-radius: 0;
border-top-right-radius: 0;
display: none;
+ box-sizing: border-box;
/*overflow-y: auto;
overflow-x: hidden;*/
z-index: 2000;
@@ -185,37 +193,8 @@
border-bottom-color: rgba(255, 255, 255, 0.97);
border-width: 10px;
margin-left: -10px;
+ left: 47%;
}
-}
-
-/* arrow look */
-
-#expanddiv:after {
- bottom: 100%;
- border: solid transparent;
- content: ' ';
- height: 0;
- width: 0;
- position: absolute;
- pointer-events: none;
- border-color: rgba(0, 0, 0, 0);
- border-bottom-color: rgba(255, 255, 255, 0.97);
- border-width: 10px;
- margin-left: -10px;
-}
-
-/* position of dropdown arrow */
-
-#navigation:after {
- left: 47%;
-}
-
-#expanddiv:after {
- right: 15px;
-}
-
-#navigation {
- box-sizing: border-box;
* {
box-sizing: border-box;
}
@@ -241,11 +220,15 @@
overflow: hidden;
text-overflow: ellipsis;
}
- svg, span {
+ svg,
+ span {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)';
opacity: .5;
}
- &:hover svg, &:focus svg, &:hover span, &:focus span {
+ &:hover svg,
+ &:focus svg,
+ &:hover span,
+ &:focus span {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
opacity: 1;
}
@@ -256,52 +239,50 @@
}
}
}
-}
-
-/* icon opacity and hover effect */
-
-#apps-management a {
- &:hover svg, &:focus svg, &.active svg, &:hover span, &:focus span, &.active span {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
+ .app-icon {
+ margin: 0 auto;
+ padding: 0;
+ max-height: 32px;
+ max-width: 32px;
+ }
+ /* loading feedback for apps */
+ .app-loading {
+ .icon-loading-dark {
+ display: inline !important;
+ position: absolute;
+ top: 20px;
+ left: 24px;
+ width: 32px;
+ height: 32px;
+ }
+ .app-icon {
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';
+ opacity: 0;
+ }
}
-}
-
-#navigation .app-icon {
- margin: 0 auto;
- padding: 0;
- max-height: 32px;
- max-width: 32px;
}
/* Apps management */
-
#apps-management {
min-height: initial;
height: initial;
margin: 0;
a {
- svg, span {
+ svg,
+ span {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=30)';
opacity: .3;
}
- }
-}
-
-/* loading feedback for apps */
-
-#navigation .app-loading {
- .icon-loading-dark {
- display: inline !important;
- position: absolute;
- top: 20px;
- left: 24px;
- width: 32px;
- height: 32px;
- }
- .app-icon {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';
- opacity: 0;
+ /* icon opacity and hover effect */
+ &:hover svg,
+ &:focus svg,
+ &.active svg,
+ &:hover span,
+ &:focus span,
+ &.active span {
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
+ opacity: 1;
+ }
}
}
@@ -313,7 +294,6 @@
/* USER MENU -----------------------------------------------------------------*/
/* info part on the right, used e.g. for info on who shared something */
-
.header-right {
position: absolute;
right: 0;
@@ -325,21 +305,6 @@
box-sizing: border-box;
}
-/* Profile picture in header */
-
-#header .avatardiv {
- float: left;
- display: inline-block;
- margin-right: 8px;
- cursor: pointer;
- height: 32px;
- width: 32px;
- img {
- opacity: 1;
- cursor: pointer;
- }
-}
-
#settings {
float: right;
color: #ddd;
@@ -352,6 +317,7 @@
}
}
+/* User menu on the right */
#expand {
display: block;
padding: 7px 30px 6px 10px;
@@ -359,21 +325,41 @@
* {
cursor: pointer;
}
- &:hover, &:focus, &:active {
- color: #fff;
- }
img {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=70)';
opacity: .7;
margin-bottom: -2px;
}
- &:hover img, &:focus img, &:active img {
- -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
- opacity: 1;
+ &:hover,
+ &:focus,
+ &:active {
+ color: #fff;
+ img {
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
+ opacity: 1;
+ }
}
.icon-caret {
margin-top: 0;
}
+
+ /* Profile picture in header */
+ .avatardiv {
+ float: left;
+ display: inline-block;
+ margin-right: 8px;
+ cursor: pointer;
+ height: 32px;
+ width: 32px;
+ img {
+ opacity: 1;
+ cursor: pointer;
+ }
+ /* do not show display name when profile picture is present */
+ &.avatardiv-shown + #expandDisplayName {
+ display: none;
+ }
+ }
}
#expanddiv {
@@ -389,8 +375,19 @@
border-top-right-radius: 0;
box-sizing: border-box;
&:after {
+ /* position of dropdown arrow */
+ right: 15px;
border-color: rgba(0, 0, 0, 0);
border-bottom-color: rgba(255, 255, 255, 1);
+ bottom: 100%;
+ border: solid transparent;
+ content: ' ';
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+ border-width: 10px;
+ margin-left: -10px;
}
a {
display: block;
@@ -404,20 +401,12 @@
margin-bottom: -3px;
margin-right: 6px;
}
- &:hover, &:focus, &:active, &.active {
+ &:hover,
+ &:focus,
+ &:active,
+ &.active {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
opacity: 1;
}
}
}
-
-/* do not show display name when profile picture is present */
-
-#header {
- .avatardiv.avatardiv-shown + #expandDisplayName {
- display: none;
- }
- #expand {
- display: block;
- }
-}
diff --git a/core/css/icons.scss b/core/css/icons.scss
index 9afb5630181..b1f9cc6df67 100644
--- a/core/css/icons.scss
+++ b/core/css/icons.scss
@@ -1,3 +1,11 @@
+/**
+ * @copyright Copyright (c) 2017, John Molakvoæ (skjnldsv@protonmail.com)
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ */
+
+/* GLOBAL ------------------------------------------------------------------- */
[class^='icon-'], [class*=' icon-'] {
background-repeat: no-repeat;
background-position: center;
@@ -5,99 +13,76 @@
min-height: 16px;
}
-/* general assets */
-
.icon-breadcrumb {
background-image: url('../img/breadcrumb.svg?v=1');
}
+/* LOADING ------------------------------------------------------------------ */
.loading, .loading-small, .icon-loading, .icon-loading-dark, .icon-loading-small, .icon-loading-small-dark {
position: relative;
+ &:after {
+ z-index: 2;
+ content: '';
+ height: 30px;
+ width: 30px;
+ margin: -16px 0 0 -16px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ border-radius: 100%;
+ -webkit-animation: rotate .8s infinite linear;
+ animation: rotate .8s infinite linear;
+ -webkit-transform-origin: center;
+ -ms-transform-origin: center;
+ transform-origin: center;
+ border: 2px solid rgba(150, 150, 150, 0.5);
+ border-top-color: rgb(100, 100, 100);
+ }
}
-.loading:after, .loading-small:after, .icon-loading:after, .icon-loading-dark:after, .icon-loading-small:after, .icon-loading-small-dark:after {
- z-index: 2;
- content: '';
- height: 30px;
- width: 30px;
- margin: -16px 0 0 -16px;
- position: absolute;
- top: 50%;
- left: 50%;
- border-radius: 100%;
- -webkit-animation: rotate .8s infinite linear;
- animation: rotate .8s infinite linear;
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
-}
-
-.loading:after, .loading-small:after, .icon-loading:after, .icon-loading-dark:after, .icon-loading-small:after, .icon-loading-small-dark:after {
- border: 2px solid rgba(150, 150, 150, 0.5);
- border-top-color: rgb(100, 100, 100);
-}
-
-.icon-loading-dark:after, .icon-loading-small-dark:after {
+.icon-loading-dark:after,
+.icon-loading-small-dark:after {
border: 2px solid rgba(187, 187, 187, 0.5);
border-top-color: #bbb;
}
-.icon-loading-small:after, .icon-loading-small-dark:after {
+.icon-loading-small:after,
+.icon-loading-small-dark:after {
height: 14px;
width: 14px;
margin: -8px 0 0 -8px;
}
/* Css replaced elements don't have ::after nor ::before */
-
-img.icon-loading, object.icon-loading, video.icon-loading, button.icon-loading, textarea.icon-loading, input.icon-loading, select.icon-loading {
- background-image: url('../img/loading.gif');
-}
-
-img.icon-loading-dark, object.icon-loading-dark, video.icon-loading-dark, button.icon-loading-dark, textarea.icon-loading-dark, input.icon-loading-dark, select.icon-loading-dark {
- background-image: url('../img/loading-dark.gif');
-}
-
-img.icon-loading-small, object.icon-loading-small, video.icon-loading-small, button.icon-loading-small, textarea.icon-loading-small, input.icon-loading-small, select.icon-loading-small {
- background-image: url('../img/loading-small.gif');
-}
-
-img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading-small-dark, button.icon-loading-small-dark, textarea.icon-loading-small-dark, input.icon-loading-small-dark, select.icon-loading-small-dark {
- background-image: url('../img/loading-small-dark.gif');
-}
-
-@-webkit-keyframes rotate {
- from {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
+img, object, video, button, textarea, input, select {
+ .icon-loading {
+ background-image: url('../img/loading.gif');
}
-
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
+ .icon-loading-dark {
+ background-image: url('../img/loading-dark.gif');
+ }
+ .icon-loading-small {
+ background-image: url('../img/loading-small.gif');
+ }
+ .icon-loading-small-dark {
+ background-image: url('../img/loading-small-dark.gif');
}
}
-
@keyframes rotate {
from {
- -webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
-
to {
- -webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
-
.icon-32 {
background-size: 32px !important;
}
-/* action icons */
-
+/* ICONS -------------------------------------------------------------------- */
.icon-add {
background-image: url('../img/actions/add.svg?v=1');
}
@@ -172,6 +157,14 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading-
.icon-delete-white {
background-image: url('../img/actions/delete-white.svg?v=1');
+ &.no-permission {
+ &:hover, &:focus {
+ background-image: url('../img/actions/delete-white.svg?v=1');
+ }
+ }
+ &:hover, &:focus {
+ background-image: url('../img/actions/delete-hover.svg?v=1');
+ }
}
.icon-details {
@@ -407,8 +400,7 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading-
background-image: url('../img/actions/view-previous.svg?v=1');
}
-/* places icons */
-
+/* PLACES ------------------------------------------------------------------- */
.icon-calendar-dark {
background-image: url('../img/places/calendar-dark.svg?v=1');
}
diff --git a/core/css/multiselect.scss b/core/css/multiselect.scss
index ea7a481f360..024e5818a40 100644
--- a/core/css/multiselect.scss
+++ b/core/css/multiselect.scss
@@ -1,6 +1,9 @@
-/* Copyright (c) 2011, Jan-Christoph Borchardt, http: //jancborchardt.net
-This file is licensed under the Affero General Public License version 3 or later.
-See the COPYING-README file. */
+/**
+ * @copyright Copyright (c) 2011, Jan-Christoph Borchardt <hey@jancborchardt.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ */
ul.multiselectoptions {
background-color: #fff;
@@ -45,9 +48,26 @@ ul.multiselectoptions {
}
}
}
+ input.new {
+ padding-bottom: 3px;
+ padding-top: 3px;
+ margin: 0;
+ }
+ > li.creator {
+ padding: 10px;
+ margin: 0;
+ font-weight: bold;
+ > input {
+ width: 95% !important;
+ /* do not constrain size of text input */
+ padding: 5px;
+ margin: -5px;
+ }
+ }
}
-div.multiselect {
+div.multiselect,
+select.multiselect {
display: inline-block;
max-width: 200px;
min-width: 150px !important;
@@ -58,19 +78,11 @@ div.multiselect {
}
select.multiselect {
- display: inline-block;
- max-width: 200px;
- min-width: 150px !important;
- padding-right: 10px;
- min-height: 20px;
- position: relative;
- vertical-align: bottom;
height: 30px;
min-width: 113px;
}
/* To make a select look like a multiselect until it's initialized */
-
div.multiselect {
&.active {
background-color: #fff;
@@ -103,22 +115,3 @@ div.multiselect {
}
}
}
-
-ul.multiselectoptions {
- input.new {
- padding-bottom: 3px;
- padding-top: 3px;
- margin: 0;
- }
- > li.creator {
- padding: 10px;
- margin: 0;
- font-weight: bold;
- > input {
- width: 95% !important;
- /* do not constrain size of text input */
- padding: 5px;
- margin: -5px;
- }
- }
-}
diff --git a/core/css/share.scss b/core/css/share.scss
index a72437c4aeb..7ce365a1454 100644
--- a/core/css/share.scss
+++ b/core/css/share.scss
@@ -1,28 +1,12 @@
-/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
- This file is licensed under the Affero General Public License version 3 or later.
- See the COPYING-README file. */
-
-#dropdown {
- background: #eee;
- border-bottom-left-radius: 3px;
- border-bottom-right-radius: 3px;
- box-shadow: 0 2px 3px rgba(50, 50, 50, 0.4);
- display: block;
- margin-right: 0;
- position: absolute;
- right: 0;
- width: 420px;
- z-index: 500;
- padding: 16px;
-}
-
-@media only screen and (min-width: 768px) and (max-width: 990px) {
- #dropdown {
- /* this limits the dropdown to float below the sidebar for mid narrow screens */
- left: 20px;
- }
-}
-
+/**
+ * @copyright Copyright (c) 2011, Jan-Christoph Borchardt <hey@jancborchardt.net>
+ * @copyright Copyright (c) 2017, John Molakvoæ (skjnldsv@protonmail.com)
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ */
+
+/* SHARE TAB STYLING -------------------------------------------------------- */
.shareTabView {
.unshare.icon-loading-small {
margin-top: 1px;
@@ -47,6 +31,30 @@
width: 32px;
height: 32px;
}
+ label {
+ font-weight: 400;
+ white-space: nowrap;
+ }
+ input[type='checkbox'] {
+ margin: 0 3px 0 8px;
+ vertical-align: middle;
+ }
+ input[type='submit'] {
+ margin-left: 7px;
+ }
+ form {
+ font-size: 100%;
+ margin-left: 0;
+ margin-right: 0;
+ }
+ .error {
+ color: #e9322d;
+ border-color: #e9322d;
+ box-shadow: 0 0 6px #f8b9b7;
+ }
+ .mailView .icon-mail {
+ opacity: 0.5;
+ }
}
.share-autocomplete-item {
@@ -86,7 +94,8 @@
white-space: nowrap;
display: inline-block;
}
- .unshare img, .showCruds img {
+ .unshare img,
+ .showCruds img {
vertical-align: text-bottom;
/* properly align icons */
}
@@ -108,17 +117,6 @@
}
}
-.shareTabView {
- label {
- font-weight: 400;
- white-space: nowrap;
- }
- input[type='checkbox'] {
- margin: 0 3px 0 8px;
- vertical-align: middle;
- }
-}
-
a {
&.showCruds {
display: inline;
@@ -129,45 +127,28 @@ a {
opacity: .5;
padding: 10px;
}
+ &.showCruds:hover,
+ &.unshare:hover {
+ opacity: 1;
+ }
}
#link {
border-top: 1px solid #ddd;
padding-top: 8px;
-}
-
-.shareTabView {
- input[type='submit'] {
- margin-left: 7px;
+ #showPassword img {
+ padding-left: 5px;
+ width: 12px;
}
- form {
- font-size: 100%;
- margin-left: 0;
- margin-right: 0;
- }
- .error {
- color: #e9322d;
- border-color: #e9322d;
- box-shadow: 0 0 6px #f8b9b7;
- }
-}
-
-#link #showPassword img {
- padding-left: 5px;
- width: 12px;
}
-.reshare, #link label, #expiration label {
+.reshare,
+#link label,
+#expiration label {
display: inline-block;
padding: 6px 4px;
}
-a {
- &.showCruds:hover, &.unshare:hover {
- opacity: 1;
- }
-}
-
#defaultExpireMessage, .reshare {
/* fix shared by text going out of box */
white-space: normal;
@@ -193,7 +174,3 @@ a {
padding-top: 12px;
color: #999;
}
-
-.shareTabView .mailView .icon-mail {
- opacity: 0.5;
-}
diff --git a/core/css/systemtags.scss b/core/css/systemtags.scss
index adbd36ebab1..1ae26710108 100644
--- a/core/css/systemtags.scss
+++ b/core/css/systemtags.scss
@@ -1,10 +1,7 @@
-/*
- * Copyright (c) 2016
+/**
+ * @copyright Copyright (c) 2017
*
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
+ * @license GNU AGPL version 3 or any later version
*
*/
@@ -44,17 +41,16 @@
width: calc(100% - 40px);
}
}
-}
-
-.systemtags-select2-container {
- width: 100%;
-}
-
-#select2-drop.systemtags-select2-dropdown .select2-results li.select2-result {
- padding: 5px;
-}
-
-.systemtags-select2-dropdown {
+ .label {
+ width: 85%;
+ display: -moz-inline-box;
+ display: inline-block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ &.hidden {
+ display: none;
+ }
+ }
span {
line-height: 25px;
}
@@ -68,17 +64,13 @@
}
}
-.systemtags-select2-container .select2-choices .select2-search-choice.select2-locked .label {
- opacity: 0.5;
+.systemtags-select2-container {
+ width: 100%;
+ .select2-choices .select2-search-choice.select2-locked .label {
+ opacity: 0.5;
+ }
}
-.systemtags-select2-dropdown .label {
- width: 85%;
- display: -moz-inline-box;
- display: inline-block;
- overflow: hidden;
- text-overflow: ellipsis;
- &.hidden {
- display: none;
- }
+#select2-drop.systemtags-select2-dropdown .select2-results li.select2-result {
+ padding: 5px;
}
diff --git a/core/css/tooltip.scss b/core/css/tooltip.scss
index 42289787e8d..96073962884 100644
--- a/core/css/tooltip.scss
+++ b/core/css/tooltip.scss
@@ -30,96 +30,95 @@
opacity: 0.9;
filter: alpha(opacity = 90);
}
+
&.top {
margin-top: -3px;
padding: 5px 0;
}
- &.right {
- margin-left: 3px;
- padding: 0 5px;
- }
&.bottom {
margin-top: 3px;
padding: 5px 0;
}
+
+ &.right {
+ margin-left: 3px;
+ padding: 0 5px;
+ .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000000;
+ }
+ }
&.left {
margin-left: -3px;
padding: 0 5px;
+ .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000000;
+ }
}
-}
-
-.tooltip-inner {
- max-width: 350px;
- padding: 3px 8px;
- color: #ffffff;
- text-align: center;
- background-color: #000000;
- border-radius: 4px;
-}
-
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.tooltip {
- &.top .tooltip-arrow {
+ /* TOP */
+ &.top .tooltip-arrow,
+ &.top-left .tooltip-arrow,
+ &.top-right .tooltip-arrow {
bottom: 0;
- left: 50%;
- margin-left: -5px;
border-width: 5px 5px 0;
border-top-color: #000000;
}
+ &.top .tooltip-arrow {
+ left: 50%;
+ margin-left: -5px;
+ }
&.top-left .tooltip-arrow {
- bottom: 0;
right: 5px;
margin-bottom: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
}
&.top-right .tooltip-arrow {
- bottom: 0;
left: 5px;
margin-bottom: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
- }
- &.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-width: 5px 5px 5px 0;
- border-right-color: #000000;
}
- &.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-width: 5px 0 5px 5px;
- border-left-color: #000000;
+
+ /* BOTTOM */
+ &.bottom .tooltip-arrow,
+ &.bottom-left .tooltip-arrow,
+ &.bottom-right .tooltip-arrow {
+ top: 0;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000000;
}
&.bottom .tooltip-arrow {
- top: 0;
left: 50%;
margin-left: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
}
&.bottom-left .tooltip-arrow {
- top: 0;
right: 5px;
margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
}
&.bottom-right .tooltip-arrow {
- top: 0;
left: 5px;
margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
}
}
+
+.tooltip-inner {
+ max-width: 350px;
+ padding: 3px 8px;
+ color: #ffffff;
+ text-align: center;
+ background-color: #000000;
+ border-radius: 4px;
+}
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
diff --git a/core/js/lostpassword.js b/core/js/lostpassword.js
index 30d7b98f4e8..6e18dcc1f8b 100644
--- a/core/js/lostpassword.js
+++ b/core/js/lostpassword.js
@@ -4,7 +4,7 @@ OC.Lostpassword = {
sendSuccessMsg : t('core', '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.'),
- encryptedMsg : t('core', "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?")
+ encryptedMsg : t('core', "Your files are encrypted. 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 /><input type="checkbox" id="encrypted-continue" value="Yes" />')
+ '<label for="encrypted-continue">'
+ t('core', 'I know what I\'m doing')
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index 370ebc6ba2d..d83c0cd9a38 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -967,8 +967,9 @@ describe('Core base tests', function() {
fadeOutStub.restore();
});
it('hides the first notification when calling hide without arguments', function() {
- var $row1 = OC.Notification.show('One');
+ OC.Notification.show('One');
var $row2 = OC.Notification.show('Two');
+ spyOn(console, 'warn');
var $el = $('#notification');
var $rows = $el.find('.row');
@@ -976,6 +977,7 @@ describe('Core base tests', function() {
OC.Notification.hide();
+ expect(console.warn).toHaveBeenCalled();
$rows = $el.find('.row');
expect($rows.length).toEqual(1);
expect($rows.eq(0).is($row2)).toEqual(true);
diff --git a/core/js/tests/specs/l10nSpec.js b/core/js/tests/specs/l10nSpec.js
index 2ceb2f4a916..064b27aa34a 100644
--- a/core/js/tests/specs/l10nSpec.js
+++ b/core/js/tests/specs/l10nSpec.js
@@ -21,6 +21,7 @@ describe('OC.L10N tests', function() {
describe('text translation', function() {
beforeEach(function() {
+ spyOn(console, 'warn');
OC.L10N.register(TEST_APP, {
'Hello world!': 'Hallo Welt!',
'Hello {name}, the weather is {weather}': 'Hallo {name}, das Wetter ist {weather}',
@@ -78,8 +79,10 @@ describe('OC.L10N tests', function() {
}
it('generates plural for default text when translation does not exist', function() {
+ spyOn(console, 'warn');
OC.L10N.register(TEST_APP, {
});
+ expect(console.warn).toHaveBeenCalled();
expect(
n(TEST_APP, 'download %n file', 'download %n files', 0)
).toEqual('download 0 files');
@@ -94,10 +97,12 @@ describe('OC.L10N tests', function() {
).toEqual('download 1024 files');
});
it('generates plural with default function when no forms specified', function() {
+ spyOn(console, 'warn');
OC.L10N.register(TEST_APP, {
'_download %n file_::_download %n files_':
['%n Datei herunterladen', '%n Dateien herunterladen']
});
+ expect(console.warn).toHaveBeenCalled();
checkPlurals();
});
it('generates plural with generated function when forms is specified', function() {
@@ -150,9 +155,11 @@ describe('OC.L10N tests', function() {
it('calls callback if translation already available', function() {
var promiseStub = sinon.stub();
var callbackStub = sinon.stub();
+ spyOn(console, 'warn');
OC.L10N.register(TEST_APP, {
'Hello world!': 'Hallo Welt!'
});
+ expect(console.warn).toHaveBeenCalled();
OC.L10N.load(TEST_APP, callbackStub).then(promiseStub);
expect(callbackStub.calledOnce).toEqual(true);
expect(promiseStub.calledOnce).toEqual(true);
diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js
index 92a5a5577cb..cb41f4e1437 100644
--- a/core/l10n/bg_BG.js
+++ b/core/l10n/bg_BG.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "преди секунди",
"Logging in …" : "Вписване ...",
"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." : "Връзката за възстановяване на паролата беше изпратена до вашия имейл. Ако не я получите в разумен период от време, проверете спам и junk папките.<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." : "Паролата не може да бъде промена. Моля, свържете се с администратора.",
"No" : "Не",
@@ -338,6 +337,7 @@ OC.L10N.register(
"Oct." : "окт",
"Nov." : "ное",
"Dec." : "дек",
+ "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/>Наистина ли желаете да продължите?",
"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." : "Сървърът няма работеща интернет връзка. Това означава, че някои функции като прикачването на външни дискови устройства, уведомления за обновяване или инсталиране на външни приложения няма да работят. Достъпът на файлове отвън или изпращане на имейли за уведомление вероятно също няма да работят. Препоръчваме да включиш интернет връзката за този сървър ако искаш да използваш всички тези функции.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Хедърите за обратно прокси са невалидни, или достъпвате Nextcloud от доверено прокси. Ако не достъпвате Nextcloud от доверено прокси, то това е проблем в сигурността и може да позволи на хакер да прикрие IP адреса си в Nextcloud. Допълнителна информация може да бъде намерена в нашата <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документация</a>.",
"Allow editing" : "Позволяване на редактиране",
diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json
index be6ad11a95c..91ea33e4c87 100644
--- a/core/l10n/bg_BG.json
+++ b/core/l10n/bg_BG.json
@@ -58,7 +58,6 @@
"seconds ago" : "преди секунди",
"Logging in …" : "Вписване ...",
"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." : "Връзката за възстановяване на паролата беше изпратена до вашия имейл. Ако не я получите в разумен период от време, проверете спам и junk папките.<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." : "Паролата не може да бъде промена. Моля, свържете се с администратора.",
"No" : "Не",
@@ -336,6 +335,7 @@
"Oct." : "окт",
"Nov." : "ное",
"Dec." : "дек",
+ "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/>Наистина ли желаете да продължите?",
"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." : "Сървърът няма работеща интернет връзка. Това означава, че някои функции като прикачването на външни дискови устройства, уведомления за обновяване или инсталиране на външни приложения няма да работят. Достъпът на файлове отвън или изпращане на имейли за уведомление вероятно също няма да работят. Препоръчваме да включиш интернет връзката за този сървър ако искаш да използваш всички тези функции.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Хедърите за обратно прокси са невалидни, или достъпвате Nextcloud от доверено прокси. Ако не достъпвате Nextcloud от доверено прокси, то това е проблем в сигурността и може да позволи на хакер да прикрие IP адреса си в Nextcloud. Допълнителна информация може да бъде намерена в нашата <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документация</a>.",
"Allow editing" : "Позволяване на редактиране",
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index 4bd4c977597..9d6b70e7f37 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "před pár sekundami",
"Logging in …" : "Přihlašování …",
"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." : "Odkaz na obnovení hesla byl odeslán na vaši emailovou adresu. Pokud jej v krátké době neobdržíte, zkontrolujte nevyžádanou poštu a koš.<br>Pokud jej nenaleznete, kontaktujte svého správce systému.",
- "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?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?",
+ "Your files are encrypted. 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?" : "Vaše soubory jsou šifrovány. Po vyresetování vašeho hesla nebudete moc získat data zpět.<br/>Pokud si nejste jisti tím co děláte, předtím než budete pokračovat, kontaktujte vašeho administrátora.<br/>Opravdu chcete pokračovat?",
"I know what I'm doing" : "Vím co dělám",
"Password can not be changed. Please contact your administrator." : "Heslo nelze změnit. Kontaktujte prosím svého správce systému.",
"No" : "Ne",
@@ -122,6 +122,7 @@ OC.L10N.register(
"Link" : "Odkaz",
"Password protect" : "Chránit heslem",
"Allow upload and editing" : "Povolit nahrávání a úpravy",
+ "File drop (upload only)" : "Přetažení souboru (pouze nahrání)",
"Email link to person" : "Odeslat osobě odkaz emailem",
"Send" : "Odeslat",
"Shared with you and the group {group} by {owner}" : "S Vámi a skupinou {group} sdílí {owner}",
@@ -229,6 +230,7 @@ OC.L10N.register(
"Database name" : "Název databáze",
"Database tablespace" : "Tabulkový prostor databáze",
"Database host" : "Hostitel databáze",
+ "Please specify the port number along with the host name (e.g., localhost:5432)." : "Prosím, specifikujte port spolu se jménem hostitele (t. j., localhost:5432).",
"Performance warning" : "Varování o výkonu",
"SQLite will be used as database." : "Bude použita SQLite databáze.",
"For larger installations we recommend to choose a different database backend." : "Pro větší instalace doporučujeme vybrat jiné databázové řešení.",
@@ -337,6 +339,7 @@ OC.L10N.register(
"Oct." : "íjen",
"Nov." : "listopad",
"Dec." : "prosinec",
+ "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?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?",
"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." : "Tento server nemá funkční připojení k Internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích emailů také nemusí fungovat. Pokud chcete využívat všechny možnosti ownCloud, doporučujeme povolit pro tento server připojení k Internetu.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurace hlaviček reverzní proxy není správná nebo přistupujete na ownCloud z důvěryhodné proxy. Pokud nepřistupujete k ownCloud z důvěryhodné proxy, potom je toto bezpečností chyba a může útočníkovi umožnit falšovat IP adresu, kterou ownCloud vidí. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</a>.",
"Allow editing" : "Povolit úpravy",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index e4d00d658f0..74a5ed41189 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -58,7 +58,7 @@
"seconds ago" : "před pár sekundami",
"Logging in …" : "Přihlašování …",
"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." : "Odkaz na obnovení hesla byl odeslán na vaši emailovou adresu. Pokud jej v krátké době neobdržíte, zkontrolujte nevyžádanou poštu a koš.<br>Pokud jej nenaleznete, kontaktujte svého správce systému.",
- "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?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?",
+ "Your files are encrypted. 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?" : "Vaše soubory jsou šifrovány. Po vyresetování vašeho hesla nebudete moc získat data zpět.<br/>Pokud si nejste jisti tím co děláte, předtím než budete pokračovat, kontaktujte vašeho administrátora.<br/>Opravdu chcete pokračovat?",
"I know what I'm doing" : "Vím co dělám",
"Password can not be changed. Please contact your administrator." : "Heslo nelze změnit. Kontaktujte prosím svého správce systému.",
"No" : "Ne",
@@ -120,6 +120,7 @@
"Link" : "Odkaz",
"Password protect" : "Chránit heslem",
"Allow upload and editing" : "Povolit nahrávání a úpravy",
+ "File drop (upload only)" : "Přetažení souboru (pouze nahrání)",
"Email link to person" : "Odeslat osobě odkaz emailem",
"Send" : "Odeslat",
"Shared with you and the group {group} by {owner}" : "S Vámi a skupinou {group} sdílí {owner}",
@@ -227,6 +228,7 @@
"Database name" : "Název databáze",
"Database tablespace" : "Tabulkový prostor databáze",
"Database host" : "Hostitel databáze",
+ "Please specify the port number along with the host name (e.g., localhost:5432)." : "Prosím, specifikujte port spolu se jménem hostitele (t. j., localhost:5432).",
"Performance warning" : "Varování o výkonu",
"SQLite will be used as database." : "Bude použita SQLite databáze.",
"For larger installations we recommend to choose a different database backend." : "Pro větší instalace doporučujeme vybrat jiné databázové řešení.",
@@ -335,6 +337,7 @@
"Oct." : "íjen",
"Nov." : "listopad",
"Dec." : "prosinec",
+ "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?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?",
"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." : "Tento server nemá funkční připojení k Internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích emailů také nemusí fungovat. Pokud chcete využívat všechny možnosti ownCloud, doporučujeme povolit pro tento server připojení k Internetu.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurace hlaviček reverzní proxy není správná nebo přistupujete na ownCloud z důvěryhodné proxy. Pokud nepřistupujete k ownCloud z důvěryhodné proxy, potom je toto bezpečností chyba a může útočníkovi umožnit falšovat IP adresu, kterou ownCloud vidí. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</a>.",
"Allow editing" : "Povolit úpravy",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index 2b073d2ddca..8b8bfa3c9de 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -50,7 +50,6 @@ OC.L10N.register(
"Cancel" : "Annuller",
"seconds ago" : "sekunder siden",
"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." : "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.",
- "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?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?",
"I know what I'm doing" : "Jeg ved, hvad jeg har gang i",
"Password can not be changed. Please contact your administrator." : "Adgangskoden kunne ikke ændres. Kontakt venligst din administrator.",
"No" : "Nej",
@@ -279,6 +278,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurationen af reverse proxy-headere er ikke korrekt eller du tilgår ownCloud fra en betroet proxy. Hvis du ikke tilgår ownCloud fra en betroet proxy, så er dette et sikkerhedsproblem og kan tillade en angriber af forfalske deres IP-adresse som synlig for ownCloud. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"Allow editing" : "Tillad redigering",
"Sending ..." : "Sender ...",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index d04da242f44..c94b4019f56 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -48,7 +48,6 @@
"Cancel" : "Annuller",
"seconds ago" : "sekunder siden",
"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." : "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.",
- "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?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?",
"I know what I'm doing" : "Jeg ved, hvad jeg har gang i",
"Password can not be changed. Please contact your administrator." : "Adgangskoden kunne ikke ændres. Kontakt venligst din administrator.",
"No" : "Nej",
@@ -277,6 +276,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurationen af reverse proxy-headere er ikke korrekt eller du tilgår ownCloud fra en betroet proxy. Hvis du ikke tilgår ownCloud fra en betroet proxy, så er dette et sikkerhedsproblem og kan tillade en angriber af forfalske deres IP-adresse som synlig for ownCloud. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"Allow editing" : "Tillad redigering",
"Sending ..." : "Sender ...",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index d8c6aeb93e8..9c558ffd2a8 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"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." : "Der Link zum Rücksetzen deines Passwortes ist an deine E-Mail-Adresse versandt worden. Solltest du in Kürze keine entsprechende E-Mail erhalten, überprüfe bitte deinen Spam-Ordner.<br>Ansonsten kannst du dich bei deinem lokalen Administrator melden.",
- "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?" : "Deine Dateien sind verschlüsselt. Solltest du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, deine Daten zurückzuerlangen, nachdem dein Passwort zurückgesetzt wurde.<br />Falls du dir nicht sicher bist, was zu tun ist, kontaktiere bitte deinen Administrator, bevor du fortfährst<br />Möchtest du wirklich fortfahren?",
+ "Your files are encrypted. 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?" : "Deine Dateien sind verschlüsselt. Es gibt keinen Weg Deine Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Du Dir nicht sicher bist, kontaktiere Deinen Administrator.<br />Möchtest Du wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktiere deinen Administrator.",
"No" : "Nein",
@@ -339,6 +339,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Deine Dateien sind verschlüsselt. Solltest du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, deine Daten zurückzuerlangen, nachdem dein Passwort zurückgesetzt wurde.<br />Falls du dir nicht sicher bist, was zu tun ist, kontaktiere bitte deinen Administrator, bevor du fortfährst<br />Möchtest du wirklich fortfahren?",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn du alle Funktionen nutzen möchtest.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder du greifst auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn du nicht über einen vertrauenswürdigen Proxy zugreifst, dann liegt ein Sicherheitsproblem vor, das es einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fälschen. Weitere Informationen hierzu findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
"Allow editing" : "Bearbeitung erlauben",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index bac614b3e1e..9491465ac37 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -58,7 +58,7 @@
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"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." : "Der Link zum Rücksetzen deines Passwortes ist an deine E-Mail-Adresse versandt worden. Solltest du in Kürze keine entsprechende E-Mail erhalten, überprüfe bitte deinen Spam-Ordner.<br>Ansonsten kannst du dich bei deinem lokalen Administrator melden.",
- "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?" : "Deine Dateien sind verschlüsselt. Solltest du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, deine Daten zurückzuerlangen, nachdem dein Passwort zurückgesetzt wurde.<br />Falls du dir nicht sicher bist, was zu tun ist, kontaktiere bitte deinen Administrator, bevor du fortfährst<br />Möchtest du wirklich fortfahren?",
+ "Your files are encrypted. 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?" : "Deine Dateien sind verschlüsselt. Es gibt keinen Weg Deine Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Du Dir nicht sicher bist, kontaktiere Deinen Administrator.<br />Möchtest Du wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktiere deinen Administrator.",
"No" : "Nein",
@@ -337,6 +337,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Deine Dateien sind verschlüsselt. Solltest du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, deine Daten zurückzuerlangen, nachdem dein Passwort zurückgesetzt wurde.<br />Falls du dir nicht sicher bist, was zu tun ist, kontaktiere bitte deinen Administrator, bevor du fortfährst<br />Möchtest du wirklich fortfahren?",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn du alle Funktionen nutzen möchtest.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder du greifst auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn du nicht über einen vertrauenswürdigen Proxy zugreifst, dann liegt ein Sicherheitsproblem vor, das es einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fälschen. Weitere Informationen hierzu findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
"Allow editing" : "Bearbeitung erlauben",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index 1080d9eda49..c73bccbf0b2 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"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." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn nicht in Kürze erhalten, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn die E-Mail sich nicht darin befindet, wenden Sie sich bette an Ihrem lokalen Administrator.",
- "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?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?",
+ "Your files are encrypted. 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?" : "Ihre Dateien sind verschlüsselt. Es gibt keinen Weg Ihre Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Sie sich nicht sicher sind, kontaktieren Sie Ihren Administrator.<br />Möchten Sie wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator.",
"No" : "Nein",
@@ -224,7 +224,7 @@ OC.L10N.register(
"Configure the database" : "Datenbank einrichten",
"Only %s is available." : "Es ist nur %s verfügbar.",
"Install and activate additional PHP modules to choose other database types." : "Installieren und aktivieren Sie zusätzliche PHP-Module, um andere Datenbank-Typen auswählen zu können.",
- "For more details check out the documentation." : "Schauen Sie für weitere Informationen in die Dokumentation.",
+ "For more details check out the documentation." : "Weitere Informationen finden Sie in der Dokumentation.",
"Database user" : "Datenbank-Benutzer",
"Database password" : "Datenbank-Passwort",
"Database name" : "Datenbank-Name",
@@ -265,7 +265,7 @@ OC.L10N.register(
"Thank you for your patience." : "Vielen Dank für Ihre Geduld.",
"Two-factor authentication" : "Zwei-Faktor Authentifizierung",
"Enhanced security is enabled for your account. Please authenticate using a second factor." : "Die erweiterte Sicherheit wurde für Ihr Konto aktiviert. Bitte authentifizieren Sie sich mit einem zweiten Faktor. ",
- "Cancel log in" : "Anmelden abbrechen",
+ "Cancel log in" : "Anmeldung abbrechen",
"Use backup code" : "Backup-Code benutzen",
"Error while validating your second factor" : "Fehler beim Bestätigen des zweiten Sicherheitsfaktors",
"You are accessing the server from an untrusted domain." : "Sie greifen von einer nicht vertrauenswürdigen Domain auf den Server zu.",
@@ -339,6 +339,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Sie alle Funktionen nutzen möchten.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder Sie greifen auf die Nextcloud von einem vertrauenswürdigen Proxy zu. Wenn Sie auf die Nextcloud nicht von einem vertrauenswürdigen Proxy zugreifen, dann liegt ein Sicherheitsproblem vor, das einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fäschen. Weitere Informationen hierzu finden Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
"Allow editing" : "Bearbeitung erlauben",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index b747333e912..024fb770198 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -58,7 +58,7 @@
"seconds ago" : "Gerade eben",
"Logging in …" : "Melde an ...",
"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." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn nicht in Kürze erhalten, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn die E-Mail sich nicht darin befindet, wenden Sie sich bette an Ihrem lokalen Administrator.",
- "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?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?",
+ "Your files are encrypted. 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?" : "Ihre Dateien sind verschlüsselt. Es gibt keinen Weg Ihre Dateien nach dem Rücksetzen des Passwortes wiederherzustellen.<br />Falls Sie sich nicht sicher sind, kontaktieren Sie Ihren Administrator.<br />Möchten Sie wirklich fortfahren?",
"I know what I'm doing" : "Ich weiß, was ich mache",
"Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator.",
"No" : "Nein",
@@ -222,7 +222,7 @@
"Configure the database" : "Datenbank einrichten",
"Only %s is available." : "Es ist nur %s verfügbar.",
"Install and activate additional PHP modules to choose other database types." : "Installieren und aktivieren Sie zusätzliche PHP-Module, um andere Datenbank-Typen auswählen zu können.",
- "For more details check out the documentation." : "Schauen Sie für weitere Informationen in die Dokumentation.",
+ "For more details check out the documentation." : "Weitere Informationen finden Sie in der Dokumentation.",
"Database user" : "Datenbank-Benutzer",
"Database password" : "Datenbank-Passwort",
"Database name" : "Datenbank-Name",
@@ -263,7 +263,7 @@
"Thank you for your patience." : "Vielen Dank für Ihre Geduld.",
"Two-factor authentication" : "Zwei-Faktor Authentifizierung",
"Enhanced security is enabled for your account. Please authenticate using a second factor." : "Die erweiterte Sicherheit wurde für Ihr Konto aktiviert. Bitte authentifizieren Sie sich mit einem zweiten Faktor. ",
- "Cancel log in" : "Anmelden abbrechen",
+ "Cancel log in" : "Anmeldung abbrechen",
"Use backup code" : "Backup-Code benutzen",
"Error while validating your second factor" : "Fehler beim Bestätigen des zweiten Sicherheitsfaktors",
"You are accessing the server from an untrusted domain." : "Sie greifen von einer nicht vertrauenswürdigen Domain auf den Server zu.",
@@ -337,6 +337,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Sie alle Funktionen nutzen möchten.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder Sie greifen auf die Nextcloud von einem vertrauenswürdigen Proxy zu. Wenn Sie auf die Nextcloud nicht von einem vertrauenswürdigen Proxy zugreifen, dann liegt ein Sicherheitsproblem vor, das einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fäschen. Weitere Informationen hierzu finden Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
"Allow editing" : "Bearbeitung erlauben",
diff --git a/core/l10n/el.js b/core/l10n/el.js
index 4f5da96d218..fe3def81035 100644
--- a/core/l10n/el.js
+++ b/core/l10n/el.js
@@ -47,7 +47,6 @@ OC.L10N.register(
"Cancel" : "Άκυρο",
"seconds ago" : "δευτερόλεπτα πριν",
"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." : "Ο σύνδεσμος για την επαναφορά του κωδικού πρόσβασής σας απεστάλη στο ηλ. ταχυδρομείο σας. Εάν δεν το παραλάβετε μέσα σε ένα εύλογο χρονικό διάστημα, ελέγξτε το φάκελο ανεπιθύμητων μηνυμάτων σας. <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." : "Ο κωδικός πρόσβασης δεν μπορεί να αλλάξει. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.",
"No" : "Όχι",
@@ -274,6 +273,7 @@ OC.L10N.register(
"Oct." : "Οκτ.",
"Nov." : "Νοε.",
"Dec." : "Δεκ.",
+ "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 />Θέλετε στ' αλήθεια να συνεχίσετε;",
"Allow editing" : "Επιτρέπεται η επεξεργασία",
"Sending ..." : "Αποστολή...",
"Email sent" : "Το Email απεστάλη ",
diff --git a/core/l10n/el.json b/core/l10n/el.json
index a121073f136..b2ba470c7b0 100644
--- a/core/l10n/el.json
+++ b/core/l10n/el.json
@@ -45,7 +45,6 @@
"Cancel" : "Άκυρο",
"seconds ago" : "δευτερόλεπτα πριν",
"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." : "Ο σύνδεσμος για την επαναφορά του κωδικού πρόσβασής σας απεστάλη στο ηλ. ταχυδρομείο σας. Εάν δεν το παραλάβετε μέσα σε ένα εύλογο χρονικό διάστημα, ελέγξτε το φάκελο ανεπιθύμητων μηνυμάτων σας. <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." : "Ο κωδικός πρόσβασης δεν μπορεί να αλλάξει. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.",
"No" : "Όχι",
@@ -272,6 +271,7 @@
"Oct." : "Οκτ.",
"Nov." : "Νοε.",
"Dec." : "Δεκ.",
+ "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 />Θέλετε στ' αλήθεια να συνεχίσετε;",
"Allow editing" : "Επιτρέπεται η επεξεργασία",
"Sending ..." : "Αποστολή...",
"Email sent" : "Το Email απεστάλη ",
diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js
index 8d1d504281f..a12d3a48840 100644
--- a/core/l10n/en_GB.js
+++ b/core/l10n/en_GB.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "seconds ago",
"Logging in …" : "Logging in …",
"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." : "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.",
- "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?" : "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?",
"I know what I'm doing" : "I know what I'm doing",
"Password can not be changed. Please contact your administrator." : "Password can not be changed. Please contact your administrator.",
"No" : "No",
@@ -304,6 +303,7 @@ OC.L10N.register(
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "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?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.",
"Allow editing" : "Allow editing",
"Hide file listing" : "Hide file listing",
diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json
index a354899f282..b5cb70086ef 100644
--- a/core/l10n/en_GB.json
+++ b/core/l10n/en_GB.json
@@ -58,7 +58,6 @@
"seconds ago" : "seconds ago",
"Logging in …" : "Logging in …",
"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." : "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.",
- "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?" : "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?",
"I know what I'm doing" : "I know what I'm doing",
"Password can not be changed. Please contact your administrator." : "Password can not be changed. Please contact your administrator.",
"No" : "No",
@@ -302,6 +301,7 @@
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "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?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.",
"Allow editing" : "Allow editing",
"Hide file listing" : "Hide file listing",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index 64fe3afd8fa..e8b699a87d2 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "hace segundos",
"Logging in …" : "Iniciando sesión ...",
"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." : "Se ha enviado un enlace para restablecer su contraseña a su correo electrónico. Si usted no lo recibe en un tiempo razonable, revise su carpeta de spam/chatarra/basura.<br>Si no lo encuentra, consulte a su administrador local.",
- "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?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?",
"I know what I'm doing" : "Sé lo que estoy haciendo",
"Password can not be changed. Please contact your administrator." : "La contraseña no se puede cambiar. Por favor, contacte a su administrador.",
"No" : "No",
@@ -339,6 +338,7 @@ OC.L10N.register(
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Dic.",
+ "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?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?",
"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." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionarán. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</a>.",
"Allow editing" : "Permitir edición",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index d4f1f460277..3d239d2c769 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -58,7 +58,6 @@
"seconds ago" : "hace segundos",
"Logging in …" : "Iniciando sesión ...",
"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." : "Se ha enviado un enlace para restablecer su contraseña a su correo electrónico. Si usted no lo recibe en un tiempo razonable, revise su carpeta de spam/chatarra/basura.<br>Si no lo encuentra, consulte a su administrador local.",
- "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?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?",
"I know what I'm doing" : "Sé lo que estoy haciendo",
"Password can not be changed. Please contact your administrator." : "La contraseña no se puede cambiar. Por favor, contacte a su administrador.",
"No" : "No",
@@ -337,6 +336,7 @@
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Dic.",
+ "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?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?",
"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." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionarán. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</a>.",
"Allow editing" : "Permitir edición",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index db377f8b270..bce3567feae 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -53,7 +53,6 @@ OC.L10N.register(
"Cancel" : "Peru",
"seconds ago" : "sekunteja sitten",
"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." : "Linkki salasanan palauttamista varten on lähetetty sähköpostitse. Jos et saa sähköpostiviestiä kohtuullisessa ajassa, tarkista roskapostikansiot.<br>Jos et saa sähköpostiviestiä, ota yhteys paikalliseen ylläpitäjään.",
- "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?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?",
"I know what I'm doing" : "Tiedän mitä teen",
"Password can not be changed. Please contact your administrator." : "Salasanan vaihtaminen ei onnistunut. Ota yhteys ylläpitäjään.",
"No" : "Ei",
@@ -308,6 +307,7 @@ OC.L10N.register(
"Oct." : "Loka",
"Nov." : "Marras",
"Dec." : "Joulu",
+ "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?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?",
"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." : "Tällä palvelimella ei ole toimivaa internetyhteyttä. Sen seurauksena jotkin ominaisuudet, kuten erillinen tallennustila, ilmoitukset päivityksistä ja kolmansien osapuolten sovellusten asennus eivät toimi. Tiedostojen käyttö etänä tai ilmoitusten lähetys sähköpostitse eivät välttämättä toimi myöskään. Suosittelemme kytkemään palvelimen internetyhteyteen, jos haluat käyttää kaikkia ominaisuuksia.",
"Allow editing" : "Salli muokkaus",
"Hide file listing" : "Piilota tiedostolistaus",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 2c70e45b0de..205eb023c05 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -51,7 +51,6 @@
"Cancel" : "Peru",
"seconds ago" : "sekunteja sitten",
"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." : "Linkki salasanan palauttamista varten on lähetetty sähköpostitse. Jos et saa sähköpostiviestiä kohtuullisessa ajassa, tarkista roskapostikansiot.<br>Jos et saa sähköpostiviestiä, ota yhteys paikalliseen ylläpitäjään.",
- "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?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?",
"I know what I'm doing" : "Tiedän mitä teen",
"Password can not be changed. Please contact your administrator." : "Salasanan vaihtaminen ei onnistunut. Ota yhteys ylläpitäjään.",
"No" : "Ei",
@@ -306,6 +305,7 @@
"Oct." : "Loka",
"Nov." : "Marras",
"Dec." : "Joulu",
+ "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?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?",
"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." : "Tällä palvelimella ei ole toimivaa internetyhteyttä. Sen seurauksena jotkin ominaisuudet, kuten erillinen tallennustila, ilmoitukset päivityksistä ja kolmansien osapuolten sovellusten asennus eivät toimi. Tiedostojen käyttö etänä tai ilmoitusten lähetys sähköpostitse eivät välttämättä toimi myöskään. Suosittelemme kytkemään palvelimen internetyhteyteen, jos haluat käyttää kaikkia ominaisuuksia.",
"Allow editing" : "Salli muokkaus",
"Hide file listing" : "Piilota tiedostolistaus",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index ab1004d7d02..660cedc31a0 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "à l'instant",
"Logging in …" : "Connexion…",
"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." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!",
- "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?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clé de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
+ "Your files are encrypted. 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?" : "Vos fichiers sont chiffrés. Il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
"I know what I'm doing" : "Je sais ce que je fais",
"Password can not be changed. Please contact your administrator." : "Le mot de passe ne peut être modifié. Veuillez contacter votre administrateur.",
"No" : "Non",
@@ -339,6 +339,7 @@ OC.L10N.register(
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Déc.",
+ "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?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clé de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
"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." : "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par courriel peuvent aussi être indisponibles. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.",
"Allow editing" : "Permettre la modification",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index 4933a1993fb..e99e1adc9ad 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -58,7 +58,7 @@
"seconds ago" : "à l'instant",
"Logging in …" : "Connexion…",
"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." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!",
- "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?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clé de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
+ "Your files are encrypted. 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?" : "Vos fichiers sont chiffrés. Il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
"I know what I'm doing" : "Je sais ce que je fais",
"Password can not be changed. Please contact your administrator." : "Le mot de passe ne peut être modifié. Veuillez contacter votre administrateur.",
"No" : "Non",
@@ -337,6 +337,7 @@
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Déc.",
+ "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?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clé de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?",
"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." : "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par courriel peuvent aussi être indisponibles. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.",
"Allow editing" : "Permettre la modification",
diff --git a/core/l10n/he.js b/core/l10n/he.js
index 69d12e3e277..dc544b6eece 100644
--- a/core/l10n/he.js
+++ b/core/l10n/he.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "ביטול",
"seconds ago" : "שניות",
"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." : "הקישור לאיפוס הסיסמא שלך נשלח אליך בדואר אלקטרוני. אם לא קיבלת את הקישור תוך זמן סביר, מוטב לבדוק את תיבת דואר הזבל/ספאם שלך.<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 />אם אין לך מושג מה לעשות what to do, מוטב לפנות למנהל שלך לפני ההמשך. <br />האם באמת ברצונך להמשיך?",
"I know what I'm doing" : "אני יודע/ת מה אני עושה",
"Password can not be changed. Please contact your administrator." : "לא ניתן לשנות את הסיסמא. יש לפנות למנהל שלך.",
"No" : "לא",
@@ -289,6 +288,7 @@ OC.L10N.register(
"Oct." : "אוק׳",
"Nov." : "נוב׳",
"Dec." : "דצמ׳",
+ "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 />אם אין לך מושג מה לעשות what to do, מוטב לפנות למנהל שלך לפני ההמשך. <br />האם באמת ברצונך להמשיך?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.",
"Allow editing" : "אישור עריכה",
"Sending ..." : "מתבצעת שליחה ...",
diff --git a/core/l10n/he.json b/core/l10n/he.json
index e8dbb2161d5..aa562c78360 100644
--- a/core/l10n/he.json
+++ b/core/l10n/he.json
@@ -50,7 +50,6 @@
"Cancel" : "ביטול",
"seconds ago" : "שניות",
"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." : "הקישור לאיפוס הסיסמא שלך נשלח אליך בדואר אלקטרוני. אם לא קיבלת את הקישור תוך זמן סביר, מוטב לבדוק את תיבת דואר הזבל/ספאם שלך.<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 />אם אין לך מושג מה לעשות what to do, מוטב לפנות למנהל שלך לפני ההמשך. <br />האם באמת ברצונך להמשיך?",
"I know what I'm doing" : "אני יודע/ת מה אני עושה",
"Password can not be changed. Please contact your administrator." : "לא ניתן לשנות את הסיסמא. יש לפנות למנהל שלך.",
"No" : "לא",
@@ -287,6 +286,7 @@
"Oct." : "אוק׳",
"Nov." : "נוב׳",
"Dec." : "דצמ׳",
+ "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 />אם אין לך מושג מה לעשות what to do, מוטב לפנות למנהל שלך לפני ההמשך. <br />האם באמת ברצונך להמשיך?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.",
"Allow editing" : "אישור עריכה",
"Sending ..." : "מתבצעת שליחה ...",
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index 53f60ffe974..a3b04dc33e3 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "pár másodperce",
"Logging in …" : "Bejelentkezés ...",
"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." : "A jelszó visszaállításához a hivatkozást e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.",
- "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?" : "Az Ön fájljai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne.<br />Biztos, hogy folytatni kívánja?",
"I know what I'm doing" : "Tudom mit csinálok.",
"Password can not be changed. Please contact your administrator." : "A jelszót nem lehet visszaállítani. Kérjük, lépjen kapcsolatba a redszergazdával.",
"No" : "Nem",
@@ -339,6 +338,7 @@ OC.L10N.register(
"Oct." : "okt.",
"Nov." : "nov.",
"Dec." : "dec.",
+ "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?" : "Az Ön fájljai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne.<br />Biztos, hogy folytatni kívánja?",
"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." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány funkció, mint pl. külső tárolók csatolása, frissítési értesítések, vagy a harmadik féltől származó alkalmazások telepítése nem fog működni. A fájlok távoli elérése és az e-mail értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden funkciót használni szeretnél.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
"Allow editing" : "Szerkesztés engedélyezése",
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index 210c0bc4f75..81458973e3d 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -58,7 +58,6 @@
"seconds ago" : "pár másodperce",
"Logging in …" : "Bejelentkezés ...",
"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." : "A jelszó visszaállításához a hivatkozást e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.",
- "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?" : "Az Ön fájljai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne.<br />Biztos, hogy folytatni kívánja?",
"I know what I'm doing" : "Tudom mit csinálok.",
"Password can not be changed. Please contact your administrator." : "A jelszót nem lehet visszaállítani. Kérjük, lépjen kapcsolatba a redszergazdával.",
"No" : "Nem",
@@ -337,6 +336,7 @@
"Oct." : "okt.",
"Nov." : "nov.",
"Dec." : "dec.",
+ "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?" : "Az Ön fájljai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne.<br />Biztos, hogy folytatni kívánja?",
"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." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány funkció, mint pl. külső tárolók csatolása, frissítési értesítések, vagy a harmadik féltől származó alkalmazások telepítése nem fog működni. A fájlok távoli elérése és az e-mail értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden funkciót használni szeretnél.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
"Allow editing" : "Szerkesztés engedélyezése",
diff --git a/core/l10n/id.js b/core/l10n/id.js
index e91e62f6a25..1f8d96e4001 100644
--- a/core/l10n/id.js
+++ b/core/l10n/id.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "beberapa detik yang lalu",
"Logging in …" : "Log masuk...",
"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." : "Sebuah tautan untuk setel ulang sandi Anda telah dikirim ke email Anda. Jika Anda tidak menerima dalam jangka waktu yang wajar, periksa folder spam/sampah Anda.<br>Jika tidak ada, tanyakan pada administrator Anda.",
- "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?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?",
"I know what I'm doing" : "Saya tahu apa yang saya lakukan",
"Password can not be changed. Please contact your administrator." : "Sandi tidak dapat diubah. Silakan hubungi administrator Anda",
"No" : "Tidak",
@@ -312,6 +311,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Des.",
+ "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?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?",
"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." : "Server ini tidak tersambung ke internet. Ini berarti beberapa fitur seperti me-mount penyimpanan eksternal, notifikasi pembaruan atau instalasi aplikasi pihak ketiga tidak akan bekerja. Mengakses berkas secara remote dan mengirim notifikasi email juga tidak bekerja. Kami menyarankan untuk mengaktifkan koneksi internet untuk server ini jika Anda ingin memiliki fitur ini.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurasi proxy header terbalik salah, atau Anda mengakses ownCloud dari proxy terpercaya. Apabila Anda tidak mengakses ownCloud dari proxy terpercaya, ini adalah masalah keamanan dan penyerang dapat memalsukan alamat IP mereka ke ownCloud. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.",
"Allow editing" : "Izinkan penyuntingan",
diff --git a/core/l10n/id.json b/core/l10n/id.json
index b84ee92d69c..8ca0ea8a28d 100644
--- a/core/l10n/id.json
+++ b/core/l10n/id.json
@@ -58,7 +58,6 @@
"seconds ago" : "beberapa detik yang lalu",
"Logging in …" : "Log masuk...",
"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." : "Sebuah tautan untuk setel ulang sandi Anda telah dikirim ke email Anda. Jika Anda tidak menerima dalam jangka waktu yang wajar, periksa folder spam/sampah Anda.<br>Jika tidak ada, tanyakan pada administrator Anda.",
- "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?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?",
"I know what I'm doing" : "Saya tahu apa yang saya lakukan",
"Password can not be changed. Please contact your administrator." : "Sandi tidak dapat diubah. Silakan hubungi administrator Anda",
"No" : "Tidak",
@@ -310,6 +309,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Des.",
+ "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?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?",
"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." : "Server ini tidak tersambung ke internet. Ini berarti beberapa fitur seperti me-mount penyimpanan eksternal, notifikasi pembaruan atau instalasi aplikasi pihak ketiga tidak akan bekerja. Mengakses berkas secara remote dan mengirim notifikasi email juga tidak bekerja. Kami menyarankan untuk mengaktifkan koneksi internet untuk server ini jika Anda ingin memiliki fitur ini.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurasi proxy header terbalik salah, atau Anda mengakses ownCloud dari proxy terpercaya. Apabila Anda tidak mengakses ownCloud dari proxy terpercaya, ini adalah masalah keamanan dan penyerang dapat memalsukan alamat IP mereka ke ownCloud. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.",
"Allow editing" : "Izinkan penyuntingan",
diff --git a/core/l10n/is.js b/core/l10n/is.js
index 22a8c461365..1c20ea4faa6 100644
--- a/core/l10n/is.js
+++ b/core/l10n/is.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "Hætta við",
"seconds ago" : "sekúndum síðan",
"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." : "Tengillinn til að endurstilla lykilorðið þitt hefur verið sendur á netfangið þitt. Ef þú færð ekki póstinn innan hæfilegs tíma, athugaðu þá ruslpóstmöppuna.<br>Ef hann er ekki þar, spurðu þá kerfisstjórann þinn.",
- "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?" : "Skrárnar þínar eru dulritaðar. Ef þú hefur ekki virkjað endurheimtingarlykilinn, þá verður engin leið til að fá gögnin þín til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað eigi að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?",
"I know what I'm doing" : "Ég veit hvað ég er að gera",
"Password can not be changed. Please contact your administrator." : "Ekki er hægt að breyta lykilorði. Hafðu samband við kerfisstjóra.",
"No" : "Nei",
@@ -305,6 +304,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nóv.",
"Dec." : "Des.",
+ "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?" : "Skrárnar þínar eru dulritaðar. Ef þú hefur ekki virkjað endurheimtingarlykilinn, þá verður engin leið til að fá gögnin þín til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað eigi að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?",
"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." : "Þessi þjónn er ekki með virka nettengingu. Þetta þýðir að sumir eiginleikar eins og að virkja ytri gagnageymslu, tilkynningar um uppfærslur eða uppsetningu á forritum þriðja aðila, mun ekki virka. Fjartengdur aðgangur að skrám og sending tilkynninga í tölvupósti virka líklega ekki heldur. Við leggjum til að internettenging sé virkjuð fyrir þennan vefþjón ef þú vilt hafa alla eiginleika tiltæka.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Uppsetning gagnstæðs milliþjónshauss (reverse proxy header) er röng, eða að þú ert að tengjast Nextcloud frá treystum milliþjóni. Ef þú ert ekki að tengjast Nextcloud frá treystum milliþjóni, þá er þetta er öryggisvandamál og getur leyft árásaraðilum að dulbúa IP-vistfang þeirra sem sýnilegt Nextcloud. Nánari upplýsingar má finna í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.",
"Allow editing" : "Leyfa breytingar",
diff --git a/core/l10n/is.json b/core/l10n/is.json
index f7bb254466e..c4b579cd2bd 100644
--- a/core/l10n/is.json
+++ b/core/l10n/is.json
@@ -50,7 +50,6 @@
"Cancel" : "Hætta við",
"seconds ago" : "sekúndum síðan",
"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." : "Tengillinn til að endurstilla lykilorðið þitt hefur verið sendur á netfangið þitt. Ef þú færð ekki póstinn innan hæfilegs tíma, athugaðu þá ruslpóstmöppuna.<br>Ef hann er ekki þar, spurðu þá kerfisstjórann þinn.",
- "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?" : "Skrárnar þínar eru dulritaðar. Ef þú hefur ekki virkjað endurheimtingarlykilinn, þá verður engin leið til að fá gögnin þín til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað eigi að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?",
"I know what I'm doing" : "Ég veit hvað ég er að gera",
"Password can not be changed. Please contact your administrator." : "Ekki er hægt að breyta lykilorði. Hafðu samband við kerfisstjóra.",
"No" : "Nei",
@@ -303,6 +302,7 @@
"Oct." : "Okt.",
"Nov." : "Nóv.",
"Dec." : "Des.",
+ "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?" : "Skrárnar þínar eru dulritaðar. Ef þú hefur ekki virkjað endurheimtingarlykilinn, þá verður engin leið til að fá gögnin þín til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað eigi að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?",
"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." : "Þessi þjónn er ekki með virka nettengingu. Þetta þýðir að sumir eiginleikar eins og að virkja ytri gagnageymslu, tilkynningar um uppfærslur eða uppsetningu á forritum þriðja aðila, mun ekki virka. Fjartengdur aðgangur að skrám og sending tilkynninga í tölvupósti virka líklega ekki heldur. Við leggjum til að internettenging sé virkjuð fyrir þennan vefþjón ef þú vilt hafa alla eiginleika tiltæka.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Uppsetning gagnstæðs milliþjónshauss (reverse proxy header) er röng, eða að þú ert að tengjast Nextcloud frá treystum milliþjóni. Ef þú ert ekki að tengjast Nextcloud frá treystum milliþjóni, þá er þetta er öryggisvandamál og getur leyft árásaraðilum að dulbúa IP-vistfang þeirra sem sýnilegt Nextcloud. Nánari upplýsingar má finna í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.",
"Allow editing" : "Leyfa breytingar",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 5f570ff238e..1e8630be362 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "secondi fa",
"Logging in …" : "Accesso in corso...",
"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." : "Il collegamento per reimpostare la password è stato inviato al tuo indirizzo di posta. Se non lo ricevi in tempi ragionevoli, controlla le cartelle della posta indesiderata.<br>Se non dovesse essere nemmeno lì, contatta il tuo amministratore locale.",
- "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?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?",
"I know what I'm doing" : "So cosa sto facendo",
"Password can not be changed. Please contact your administrator." : "La password non può essere cambiata. Contatta il tuo amministratore.",
"No" : "No",
@@ -339,6 +338,7 @@ OC.L10N.register(
"Oct." : "Ott.",
"Nov." : "Nov.",
"Dec." : "Dic.",
+ "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?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?",
"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." : "Questo server non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</a>.",
"Allow editing" : "Consenti la modifica",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index 1012b41adb1..a2269c3dea2 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -58,7 +58,6 @@
"seconds ago" : "secondi fa",
"Logging in …" : "Accesso in corso...",
"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." : "Il collegamento per reimpostare la password è stato inviato al tuo indirizzo di posta. Se non lo ricevi in tempi ragionevoli, controlla le cartelle della posta indesiderata.<br>Se non dovesse essere nemmeno lì, contatta il tuo amministratore locale.",
- "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?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?",
"I know what I'm doing" : "So cosa sto facendo",
"Password can not be changed. Please contact your administrator." : "La password non può essere cambiata. Contatta il tuo amministratore.",
"No" : "No",
@@ -337,6 +336,7 @@
"Oct." : "Ott.",
"Nov." : "Nov.",
"Dec." : "Dic.",
+ "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?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?",
"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." : "Questo server non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</a>.",
"Allow editing" : "Consenti la modifica",
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index 8013a8d1c49..c27c4f1c2ff 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "数秒前",
"Logging in …" : "ログイン中...",
"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." : "パスワードをリセットするリンクをクリックしたので、メールを送信しました。しばらくたってもメールが届かなかった場合は、スパム/ジャンクフォルダーを確認してください。<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." : "パスワードは変更できません。管理者に問い合わせてください。",
"No" : "いいえ",
@@ -339,6 +338,7 @@ OC.L10N.register(
"Oct." : "10月",
"Nov." : "11月",
"Dec." : "12月",
+ "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 />続けてよろしいでしょうか?",
"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." : "このサーバーはインターネットに接続していません。この場合、外部ストレージのマウント、更新の通知やサードパーティ製のアプリ、といった一部の機能が利用できません。また、リモート接続でのファイルアクセス、通知メールの送信のような機能も利用できないことがあります。すべての機能を利用するには、このサーバーのインターネット接続を有効にすることをお勧めします。",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスされているのでないなら、攻撃者の詐称されたIPアドレスから ownCloudを見ることができるように許可されていて、セキュリティに問題があります。詳細な情報は、 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</a>を確認してください。",
"Allow editing" : "編集を許可",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index fb7673968bd..f43227e85b4 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -58,7 +58,6 @@
"seconds ago" : "数秒前",
"Logging in …" : "ログイン中...",
"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." : "パスワードをリセットするリンクをクリックしたので、メールを送信しました。しばらくたってもメールが届かなかった場合は、スパム/ジャンクフォルダーを確認してください。<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." : "パスワードは変更できません。管理者に問い合わせてください。",
"No" : "いいえ",
@@ -337,6 +336,7 @@
"Oct." : "10月",
"Nov." : "11月",
"Dec." : "12月",
+ "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 />続けてよろしいでしょうか?",
"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." : "このサーバーはインターネットに接続していません。この場合、外部ストレージのマウント、更新の通知やサードパーティ製のアプリ、といった一部の機能が利用できません。また、リモート接続でのファイルアクセス、通知メールの送信のような機能も利用できないことがあります。すべての機能を利用するには、このサーバーのインターネット接続を有効にすることをお勧めします。",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスされているのでないなら、攻撃者の詐称されたIPアドレスから ownCloudを見ることができるように許可されていて、セキュリティに問題があります。詳細な情報は、 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</a>を確認してください。",
"Allow editing" : "編集を許可",
diff --git a/core/l10n/ko.js b/core/l10n/ko.js
index 2db961440c9..446672597f0 100644
--- a/core/l10n/ko.js
+++ b/core/l10n/ko.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "초 지남",
"Logging in …" : "로그인 ...",
"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." : "암호 재설정 링크를 포함하고 있는 이메일을 보냈습니다. 이메일이 도착하지 않은 경우 스팸함을 확인해 보십시오.<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." : "암호를 변경할 수 없습니다. 관리자에게 문의하십시오.",
"No" : "아니요",
@@ -320,6 +319,7 @@ OC.L10N.register(
"Oct." : "10월",
"Nov." : "11월",
"Dec." : "12월",
+ "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 />그래도 계속 진행하시겠습니까?",
"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." : "서버에서 인터넷 연결을 사용할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 3자 앱 설치 등 기능을 사용할 수 없습니다. 원격에서 파일에 접근하거나, 알림 이메일을 보내지 못할 수도 있습니다. 모든 기능을 사용하려면 인터넷에 연결하는 것을 추천합니다.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "역방향 프록시 헤더 설정이 올바르지 않거나 Trusted Proxy를 통해 ownCloud에 접근하고 있을 수 있습니다. 만약 ownCloud를 Trusted Proxy를 통해 접근하고 있지 않다면 이는 보안 문제이며 공격자가 IP 주소를 속이고 있을 수 있습니다. 자세한 내용은 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">사용 설명서</a>를 참고하십시오.",
"Allow editing" : "편집 허용",
diff --git a/core/l10n/ko.json b/core/l10n/ko.json
index 3525c535a4a..8341f8a846a 100644
--- a/core/l10n/ko.json
+++ b/core/l10n/ko.json
@@ -58,7 +58,6 @@
"seconds ago" : "초 지남",
"Logging in …" : "로그인 ...",
"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." : "암호 재설정 링크를 포함하고 있는 이메일을 보냈습니다. 이메일이 도착하지 않은 경우 스팸함을 확인해 보십시오.<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." : "암호를 변경할 수 없습니다. 관리자에게 문의하십시오.",
"No" : "아니요",
@@ -318,6 +317,7 @@
"Oct." : "10월",
"Nov." : "11월",
"Dec." : "12월",
+ "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 />그래도 계속 진행하시겠습니까?",
"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." : "서버에서 인터넷 연결을 사용할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 3자 앱 설치 등 기능을 사용할 수 없습니다. 원격에서 파일에 접근하거나, 알림 이메일을 보내지 못할 수도 있습니다. 모든 기능을 사용하려면 인터넷에 연결하는 것을 추천합니다.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "역방향 프록시 헤더 설정이 올바르지 않거나 Trusted Proxy를 통해 ownCloud에 접근하고 있을 수 있습니다. 만약 ownCloud를 Trusted Proxy를 통해 접근하고 있지 않다면 이는 보안 문제이며 공격자가 IP 주소를 속이고 있을 수 있습니다. 자세한 내용은 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">사용 설명서</a>를 참고하십시오.",
"Allow editing" : "편집 허용",
diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js
index 5d7f62d6df0..c8083c8fe3a 100644
--- a/core/l10n/nb_NO.js
+++ b/core/l10n/nb_NO.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "for få sekunder siden",
"Logging in …" : "Logger inn...",
"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." : "Lenken for tilbakestilling av passordet ditt er sendt til din e-postadresse. Hvis du ikke mottar den innen rimelig tid, sjekk mappen for søppelpost.<br>Hvis du ikke finner den der, kontakt din lokale administrator.",
- "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?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?",
"I know what I'm doing" : "Jeg vet hva jeg gjør",
"Password can not be changed. Please contact your administrator." : "Passordet kan ikke endres. Kontakt administratoren din.",
"No" : "Nei",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Des.",
+ "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?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?",
"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." : "Denne serveren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne serveren hvis du vil ha full funksjonalitet.",
"Allow editing" : "Tillat redigering",
"Hide file listing" : "Skjul filliste",
diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json
index 0c658061d37..4e7eeedb33a 100644
--- a/core/l10n/nb_NO.json
+++ b/core/l10n/nb_NO.json
@@ -58,7 +58,6 @@
"seconds ago" : "for få sekunder siden",
"Logging in …" : "Logger inn...",
"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." : "Lenken for tilbakestilling av passordet ditt er sendt til din e-postadresse. Hvis du ikke mottar den innen rimelig tid, sjekk mappen for søppelpost.<br>Hvis du ikke finner den der, kontakt din lokale administrator.",
- "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?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?",
"I know what I'm doing" : "Jeg vet hva jeg gjør",
"Password can not be changed. Please contact your administrator." : "Passordet kan ikke endres. Kontakt administratoren din.",
"No" : "Nei",
@@ -331,6 +330,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Des.",
+ "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?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?",
"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." : "Denne serveren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne serveren hvis du vil ha full funksjonalitet.",
"Allow editing" : "Tillat redigering",
"Hide file listing" : "Skjul filliste",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index c8706bd3dc0..4c3dc21b210 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "seconden geleden",
"Logging in …" : "Inloggen...",
"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." : "De link om je wachtwoord te herstellen is per e-mail naar je verstuurd. Als je dit bericht niet binnen redelijke tijd hebt ontvangen, controleer dan je spammap. <br>Als het daar niet in zit, neem dan contact op met je beheerder.",
- "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?" : "Je bestanden zijn versleuteld. Als je de herstelsleutel niet hebt geactiveerd, is het niet mogelijk om je gegevens terug te krijgen nadat je wachtwoord is hersteld. <br>Als je niet weet wat je moet doen, neem dan eerst contact op met je beheerder. <br>Wil je echt verder gaan?",
+ "Your files are encrypted. 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?" : "Je bestanden zijn versleuteld. Het is niet mogelijk om je gegevens terug te krijgen als je wachtwoord wordt gereset.<br />Als je niet zeker weer wat je moet doen, neem dan contact op met je beheerder voordat je verdergaat. <br />Wil je echt verder gaan?",
"I know what I'm doing" : "Ik weet wat ik doe",
"Password can not be changed. Please contact your administrator." : "Het wachtwoord kan niet worden gewijzigd. Neem contact op met uw beheerder.",
"No" : "Nee",
@@ -339,6 +339,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Je bestanden zijn versleuteld. Als je de herstelsleutel niet hebt geactiveerd, is het niet mogelijk om je gegevens terug te krijgen nadat je wachtwoord is hersteld. <br>Als je niet weet wat je moet doen, neem dan eerst contact op met je beheerder. <br>Wil je echt verder gaan?",
"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." : "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie e-mails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of je hebt toegang tot Nextcloud via een vertrouwde proxy. Als je Nextcloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat Nextcloud ziet kan vervalsen. Meer informatie is te vinden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
"Allow editing" : "Toestaan bewerken",
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index b7a4c35f6b8..9109a279abb 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -58,7 +58,7 @@
"seconds ago" : "seconden geleden",
"Logging in …" : "Inloggen...",
"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." : "De link om je wachtwoord te herstellen is per e-mail naar je verstuurd. Als je dit bericht niet binnen redelijke tijd hebt ontvangen, controleer dan je spammap. <br>Als het daar niet in zit, neem dan contact op met je beheerder.",
- "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?" : "Je bestanden zijn versleuteld. Als je de herstelsleutel niet hebt geactiveerd, is het niet mogelijk om je gegevens terug te krijgen nadat je wachtwoord is hersteld. <br>Als je niet weet wat je moet doen, neem dan eerst contact op met je beheerder. <br>Wil je echt verder gaan?",
+ "Your files are encrypted. 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?" : "Je bestanden zijn versleuteld. Het is niet mogelijk om je gegevens terug te krijgen als je wachtwoord wordt gereset.<br />Als je niet zeker weer wat je moet doen, neem dan contact op met je beheerder voordat je verdergaat. <br />Wil je echt verder gaan?",
"I know what I'm doing" : "Ik weet wat ik doe",
"Password can not be changed. Please contact your administrator." : "Het wachtwoord kan niet worden gewijzigd. Neem contact op met uw beheerder.",
"No" : "Nee",
@@ -337,6 +337,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Je bestanden zijn versleuteld. Als je de herstelsleutel niet hebt geactiveerd, is het niet mogelijk om je gegevens terug te krijgen nadat je wachtwoord is hersteld. <br>Als je niet weet wat je moet doen, neem dan eerst contact op met je beheerder. <br>Wil je echt verder gaan?",
"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." : "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie e-mails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of je hebt toegang tot Nextcloud via een vertrouwde proxy. Als je Nextcloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat Nextcloud ziet kan vervalsen. Meer informatie is te vinden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.",
"Allow editing" : "Toestaan bewerken",
diff --git a/core/l10n/pl.js b/core/l10n/pl.js
index b534f01fdeb..6fef626b0ea 100644
--- a/core/l10n/pl.js
+++ b/core/l10n/pl.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "sekund temu",
"Logging in …" : "Logowanie …",
"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." : "Link do zresetowanego hasła, został wysłany na twój adres e-mail. Jeśli nie dostałeś wiadomości w rozsądnym czasie, sprawdź folder ze spamem.<br> Jeśli nie ma wiadomości w tym folderze, skontaktuj się ze swoim administratorem.",
- "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?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ",
"I know what I'm doing" : "Wiem co robię",
"Password can not be changed. Please contact your administrator." : "Hasło nie może zostać zmienione. Skontaktuj się z administratorem.",
"No" : "Nie",
@@ -326,6 +325,7 @@ OC.L10N.register(
"Oct." : "Paź.",
"Nov." : "Lis.",
"Dec." : "Gru.",
+ "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?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ",
"Allow editing" : "Pozwól na edycję",
"Hide file listing" : "Schowaj listę plików",
"Sending ..." : "Wysyłanie...",
diff --git a/core/l10n/pl.json b/core/l10n/pl.json
index 5573e429def..c768d3bf79f 100644
--- a/core/l10n/pl.json
+++ b/core/l10n/pl.json
@@ -58,7 +58,6 @@
"seconds ago" : "sekund temu",
"Logging in …" : "Logowanie …",
"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." : "Link do zresetowanego hasła, został wysłany na twój adres e-mail. Jeśli nie dostałeś wiadomości w rozsądnym czasie, sprawdź folder ze spamem.<br> Jeśli nie ma wiadomości w tym folderze, skontaktuj się ze swoim administratorem.",
- "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?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ",
"I know what I'm doing" : "Wiem co robię",
"Password can not be changed. Please contact your administrator." : "Hasło nie może zostać zmienione. Skontaktuj się z administratorem.",
"No" : "Nie",
@@ -324,6 +323,7 @@
"Oct." : "Paź.",
"Nov." : "Lis.",
"Dec." : "Gru.",
+ "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?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ",
"Allow editing" : "Pozwól na edycję",
"Hide file listing" : "Schowaj listę plików",
"Sending ..." : "Wysyłanie...",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index 0f51aba5a94..0f073a81176 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "segundos atrás",
"Logging in …" : "Logando ...",
"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." : "O link para redefinir sua senha foi enviado para seu e-mail. Se você não recebê-lo dentro de um período razoável de tempo, verifique suas pastas de spam/lixo.<br> Se ele não estiver lá, pergunte ao administrador do local.",
- "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?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida.<br/>Se não tiver certeza do que deve fazer, contate o administrador antes de continuar. <br/>Deseja realmente continuar?",
+ "Your files are encrypted. 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?" : "Seus arquivos são criptografados. Não existe nenhuma maneira de ter seus dados de volta depois que sua senha seja redefinida.<br /> Se você não tem certeza do que fazer, por favor contate seu administrador antes de continuar.<br />Você realmente deseja continuar?",
"I know what I'm doing" : "Eu sei o que estou fazendo",
"Password can not be changed. Please contact your administrator." : "A senha não pode ser alterada. Por favor, contate o administrador.",
"No" : "Não",
@@ -339,6 +339,7 @@ OC.L10N.register(
"Oct." : "Out.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida.<br/>Se não tiver certeza do que deve fazer, contate o administrador antes de continuar. <br/>Deseja realmente continuar?",
"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." : "Este servidor não tem nenhuma conexão com a Internet. Isso significa que alguns dos recursos como montar armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não estiver acessando ownCloud de um proxy de confiança, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"Allow editing" : "Permitir edição",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index ff998612ffa..83f931be39c 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -58,7 +58,7 @@
"seconds ago" : "segundos atrás",
"Logging in …" : "Logando ...",
"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." : "O link para redefinir sua senha foi enviado para seu e-mail. Se você não recebê-lo dentro de um período razoável de tempo, verifique suas pastas de spam/lixo.<br> Se ele não estiver lá, pergunte ao administrador do local.",
- "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?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida.<br/>Se não tiver certeza do que deve fazer, contate o administrador antes de continuar. <br/>Deseja realmente continuar?",
+ "Your files are encrypted. 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?" : "Seus arquivos são criptografados. Não existe nenhuma maneira de ter seus dados de volta depois que sua senha seja redefinida.<br /> Se você não tem certeza do que fazer, por favor contate seu administrador antes de continuar.<br />Você realmente deseja continuar?",
"I know what I'm doing" : "Eu sei o que estou fazendo",
"Password can not be changed. Please contact your administrator." : "A senha não pode ser alterada. Por favor, contate o administrador.",
"No" : "Não",
@@ -337,6 +337,7 @@
"Oct." : "Out.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida.<br/>Se não tiver certeza do que deve fazer, contate o administrador antes de continuar. <br/>Deseja realmente continuar?",
"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." : "Este servidor não tem nenhuma conexão com a Internet. Isso significa que alguns dos recursos como montar armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não estiver acessando ownCloud de um proxy de confiança, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"Allow editing" : "Permitir edição",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index a7d1b015faa..3dc75f4f190 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "Cancelar",
"seconds ago" : "segundos atrás",
"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." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.",
- "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?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?",
"I know what I'm doing" : "Eu sei o que eu estou a fazer",
"Password can not be changed. Please contact your administrator." : "A palavra-passe não pode ser alterada. Por favor, contacte o seu administrador.",
"No" : "Não",
@@ -289,6 +288,7 @@ OC.L10N.register(
"Oct." : "Out.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"Allow editing" : "Permitir edição",
"Sending ..." : "A enviar...",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index 8c9cced5982..54693ed0609 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -50,7 +50,6 @@
"Cancel" : "Cancelar",
"seconds ago" : "segundos atrás",
"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." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.",
- "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?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?",
"I know what I'm doing" : "Eu sei o que eu estou a fazer",
"Password can not be changed. Please contact your administrator." : "A palavra-passe não pode ser alterada. Por favor, contacte o seu administrador.",
"No" : "Não",
@@ -287,6 +286,7 @@
"Oct." : "Out.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "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?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"Allow editing" : "Permitir edição",
"Sending ..." : "A enviar...",
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 79f75a564d6..ee9b5d8a270 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -26,8 +26,8 @@ OC.L10N.register(
"Repair error: " : "Ошибка восстановления:",
"Please use the command line updater because automatic updating is disabled in the config.php." : "Пожалуйста, используйте обновление через командную строку, так как автоматические обновления отключены в config.php.",
"[%d / %d]: Checking table %s" : "[%d / %d]: Проверка таблицы %s",
- "Turned on maintenance mode" : "Режим обслуживания включён",
- "Turned off maintenance mode" : "Режим обслуживания отключён",
+ "Turned on maintenance mode" : "Включён режим обслуживания ",
+ "Turned off maintenance mode" : "Отключён режим обслуживания",
"Maintenance mode is kept active" : "Режим обслуживания оставлен включенным",
"Updating database schema" : "Обновление схемы базы данных",
"Updated database" : "База данных обновлена",
@@ -37,8 +37,8 @@ OC.L10N.register(
"Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Проверка возможности обновления схемы базы данных для %s (это может занять длительное время в зависимости от размера базы данных)",
"Checked database schema update for apps" : "Проверено обновление схемы БД приложений",
"Updated \"%s\" to %s" : "Обновлено \"%s\" до %s",
- "Set log level to debug" : "Установить журнал в режим отладки",
- "Reset log level" : "Сбросить уровень журнала",
+ "Set log level to debug" : "Установлен отладочный уровень протоколирования",
+ "Reset log level" : "Сброс уровня протоколирования",
"Starting code integrity check" : "Начинается проверка целостности кода",
"Finished code integrity check" : "Проверка целостности кода завершина",
"%s (3rdparty)" : "%s (стороннее)",
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "несколько секунд назад",
"Logging in …" : "Вход в систему …",
"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 />Вы действительно хотите продолжить?",
+ "Your files are encrypted. 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." : "Пароль не может быть изменён. Пожалуйста, свяжитесь с вашим администратором.",
"No" : "Нет",
@@ -76,7 +76,7 @@ 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." : "При выборе обеих версий к названию копируемого файла будет добавлена цифра",
"Continue" : "Продолжить",
"(all selected)" : "(все выбранные)",
"({count} selected)" : "(выбрано: {count})",
@@ -107,11 +107,11 @@ OC.L10N.register(
"Error while sharing" : "При попытке поделиться произошла ошибка",
"Error while unsharing" : "При закрытии доступа произошла ошибка",
"Error setting expiration date" : "Ошибка при установке срока доступа",
- "The public link will expire no later than {days} days after it is created" : "Срок действия публичной ссылки истекает не позже чем через {days} дней после её создания",
+ "The public link will expire no later than {days} days after it is created" : "Срок действия общедоступной ссылки истекает не позже чем через {days} дней после её создания",
"Set expiration date" : "Установить срок действия",
"Expiration" : "Срок действия",
"Expiration date" : "Дата окончания",
- "Choose a password for the public link" : "Укажите пароль для публичной ссылки",
+ "Choose a password for the public link" : "Укажите пароль для общедоступной ссылки",
"Copied!" : "Скопировано!",
"Copy" : "Копировать",
"Not supported!" : "Не поддерживается!",
@@ -280,7 +280,7 @@ OC.L10N.register(
"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:" : "Чтобы избежать тайм-аутов в крупных установках, вместо этого можно выполнить следующую команду в каталоге установки:",
- "Detailed logs" : "Подбробные логи",
+ "Detailed logs" : "Подробные журналы",
"Update needed" : "Требуется обновление",
"Please use the command line updater because you have a big instance." : "Пожалуйста, используйте обновление через командную строку, так как данная установка имеет большой размер.",
"For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Для помощи, ознакомьтесь с <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документацией</a>.",
@@ -339,6 +339,7 @@ OC.L10N.register(
"Oct." : "Окт.",
"Nov." : "Ноя.",
"Dec." : "Дек.",
+ "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 />Вы действительно хотите продолжить?",
"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." : "Этот сервер не имеет подключения к Интернету. Это означает, что некоторые из функций, таких как внешнее хранилище, уведомления об обновлениях и установка сторонних приложений не будут работать. Доступ к файлам удаленно и отправки уведомлений по почте могут не работать. Рекомендуется разрешить данному серверу доступ в Интернет если хотите, чтобы все функции работали.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси не верна, либо доступ к nextCloud осуществлён через доверенный прокси. Если nextCloud открыт не через доверенный прокси то это проблема безопасности, которая может позволить атакующему подделать IP адрес, который видит nextCloud. Дополнительная информация доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
"Allow editing" : "Разрешить редактирование",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index 5a353dc5e69..f55f0e0cca2 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -24,8 +24,8 @@
"Repair error: " : "Ошибка восстановления:",
"Please use the command line updater because automatic updating is disabled in the config.php." : "Пожалуйста, используйте обновление через командную строку, так как автоматические обновления отключены в config.php.",
"[%d / %d]: Checking table %s" : "[%d / %d]: Проверка таблицы %s",
- "Turned on maintenance mode" : "Режим обслуживания включён",
- "Turned off maintenance mode" : "Режим обслуживания отключён",
+ "Turned on maintenance mode" : "Включён режим обслуживания ",
+ "Turned off maintenance mode" : "Отключён режим обслуживания",
"Maintenance mode is kept active" : "Режим обслуживания оставлен включенным",
"Updating database schema" : "Обновление схемы базы данных",
"Updated database" : "База данных обновлена",
@@ -35,8 +35,8 @@
"Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Проверка возможности обновления схемы базы данных для %s (это может занять длительное время в зависимости от размера базы данных)",
"Checked database schema update for apps" : "Проверено обновление схемы БД приложений",
"Updated \"%s\" to %s" : "Обновлено \"%s\" до %s",
- "Set log level to debug" : "Установить журнал в режим отладки",
- "Reset log level" : "Сбросить уровень журнала",
+ "Set log level to debug" : "Установлен отладочный уровень протоколирования",
+ "Reset log level" : "Сброс уровня протоколирования",
"Starting code integrity check" : "Начинается проверка целостности кода",
"Finished code integrity check" : "Проверка целостности кода завершина",
"%s (3rdparty)" : "%s (стороннее)",
@@ -58,7 +58,7 @@
"seconds ago" : "несколько секунд назад",
"Logging in …" : "Вход в систему …",
"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 />Вы действительно хотите продолжить?",
+ "Your files are encrypted. 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." : "Пароль не может быть изменён. Пожалуйста, свяжитесь с вашим администратором.",
"No" : "Нет",
@@ -74,7 +74,7 @@
"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." : "При выборе обеих версий к названию копируемого файла будет добавлена цифра",
"Continue" : "Продолжить",
"(all selected)" : "(все выбранные)",
"({count} selected)" : "(выбрано: {count})",
@@ -105,11 +105,11 @@
"Error while sharing" : "При попытке поделиться произошла ошибка",
"Error while unsharing" : "При закрытии доступа произошла ошибка",
"Error setting expiration date" : "Ошибка при установке срока доступа",
- "The public link will expire no later than {days} days after it is created" : "Срок действия публичной ссылки истекает не позже чем через {days} дней после её создания",
+ "The public link will expire no later than {days} days after it is created" : "Срок действия общедоступной ссылки истекает не позже чем через {days} дней после её создания",
"Set expiration date" : "Установить срок действия",
"Expiration" : "Срок действия",
"Expiration date" : "Дата окончания",
- "Choose a password for the public link" : "Укажите пароль для публичной ссылки",
+ "Choose a password for the public link" : "Укажите пароль для общедоступной ссылки",
"Copied!" : "Скопировано!",
"Copy" : "Копировать",
"Not supported!" : "Не поддерживается!",
@@ -278,7 +278,7 @@
"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:" : "Чтобы избежать тайм-аутов в крупных установках, вместо этого можно выполнить следующую команду в каталоге установки:",
- "Detailed logs" : "Подбробные логи",
+ "Detailed logs" : "Подробные журналы",
"Update needed" : "Требуется обновление",
"Please use the command line updater because you have a big instance." : "Пожалуйста, используйте обновление через командную строку, так как данная установка имеет большой размер.",
"For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Для помощи, ознакомьтесь с <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документацией</a>.",
@@ -337,6 +337,7 @@
"Oct." : "Окт.",
"Nov." : "Ноя.",
"Dec." : "Дек.",
+ "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 />Вы действительно хотите продолжить?",
"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." : "Этот сервер не имеет подключения к Интернету. Это означает, что некоторые из функций, таких как внешнее хранилище, уведомления об обновлениях и установка сторонних приложений не будут работать. Доступ к файлам удаленно и отправки уведомлений по почте могут не работать. Рекомендуется разрешить данному серверу доступ в Интернет если хотите, чтобы все функции работали.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси не верна, либо доступ к nextCloud осуществлён через доверенный прокси. Если nextCloud открыт не через доверенный прокси то это проблема безопасности, которая может позволить атакующему подделать IP адрес, который видит nextCloud. Дополнительная информация доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.",
"Allow editing" : "Разрешить редактирование",
diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js
index 5897a8b804b..f09fefc1343 100644
--- a/core/l10n/sk_SK.js
+++ b/core/l10n/sk_SK.js
@@ -59,7 +59,6 @@ OC.L10N.register(
"seconds ago" : "pred sekundami",
"Logging in …" : "Prihlasujem ...",
"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." : "Odkaz na obnovu hesla bol odoslaný na váš email. Pokiaľ ho neobdržíte v primeranom čase, skontrolujte spam / priečinok nevyžiadanej pošty. <br> Ak tam nie je, kontaktujte svojho administrátora.",
- "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?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?",
"I know what I'm doing" : "Viem, čo robím",
"Password can not be changed. Please contact your administrator." : "Heslo nemožno zmeniť. Kontaktujte prosím vášho administrátora.",
"No" : "Nie",
@@ -297,6 +296,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.",
"Allow editing" : "Povoliť úpravy",
"Sending ..." : "Odosielam ...",
diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json
index 89015de6393..52cd2b135d4 100644
--- a/core/l10n/sk_SK.json
+++ b/core/l10n/sk_SK.json
@@ -57,7 +57,6 @@
"seconds ago" : "pred sekundami",
"Logging in …" : "Prihlasujem ...",
"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." : "Odkaz na obnovu hesla bol odoslaný na váš email. Pokiaľ ho neobdržíte v primeranom čase, skontrolujte spam / priečinok nevyžiadanej pošty. <br> Ak tam nie je, kontaktujte svojho administrátora.",
- "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?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?",
"I know what I'm doing" : "Viem, čo robím",
"Password can not be changed. Please contact your administrator." : "Heslo nemožno zmeniť. Kontaktujte prosím vášho administrátora.",
"No" : "Nie",
@@ -295,6 +294,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.",
"Allow editing" : "Povoliť úpravy",
"Sending ..." : "Odosielam ...",
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index 259b5bcbe24..17f6185aa0d 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "Prekliči",
"seconds ago" : "pred nekaj sekundami",
"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." : "Povezava za ponastavitev gesla je bila poslana na naveden elektronski naslov. V kolikor sporočila ne dobite v kratkem, preverite tudi mapo neželene pošte.<br> Če sporočila ni niti v tej mapi, stopite v stik s skrbnikom.",
- "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?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?",
"I know what I'm doing" : "Vem, kaj delam!",
"Password can not be changed. Please contact your administrator." : "Gesla ni mogoče spremeniti. Stopite v stik s skrbnikom.",
"No" : "Ne",
@@ -302,6 +301,7 @@ OC.L10N.register(
"Oct." : "okt",
"Nov." : "nov",
"Dec." : "dec",
+ "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?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?",
"Allow editing" : "Dovoli urejanje",
"Hide file listing" : "Skrij spisek datotek",
"Sending ..." : "Pošiljanje ...",
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index f0dc30a366f..a9c6cd78d1a 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -50,7 +50,6 @@
"Cancel" : "Prekliči",
"seconds ago" : "pred nekaj sekundami",
"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." : "Povezava za ponastavitev gesla je bila poslana na naveden elektronski naslov. V kolikor sporočila ne dobite v kratkem, preverite tudi mapo neželene pošte.<br> Če sporočila ni niti v tej mapi, stopite v stik s skrbnikom.",
- "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?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?",
"I know what I'm doing" : "Vem, kaj delam!",
"Password can not be changed. Please contact your administrator." : "Gesla ni mogoče spremeniti. Stopite v stik s skrbnikom.",
"No" : "Ne",
@@ -300,6 +299,7 @@
"Oct." : "okt",
"Nov." : "nov",
"Dec." : "dec",
+ "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?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?",
"Allow editing" : "Dovoli urejanje",
"Hide file listing" : "Skrij spisek datotek",
"Sending ..." : "Pošiljanje ...",
diff --git a/core/l10n/sq.js b/core/l10n/sq.js
index 6d4d5d932a1..729ce181d33 100644
--- a/core/l10n/sq.js
+++ b/core/l10n/sq.js
@@ -60,7 +60,6 @@ OC.L10N.register(
"seconds ago" : "sekonda më parë",
"Logging in …" : "Duke u loguar ...",
"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." : "Lidhja për ricaktimin e fjalëkalimi tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme/postës së pavlerë.<br>Nëse s’është as aty, pyetni përgjegjësin tuaj lokal.",
- "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?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?",
"I know what I'm doing" : "E di se ç’bëj",
"Password can not be changed. Please contact your administrator." : "Fjalëkalimi nuk mund të ndryshohet. Ju lutemi, lidhuni me përgjegjësin tuaj.",
"No" : "Jo",
@@ -339,6 +338,7 @@ OC.L10N.register(
"Oct." : "Tet.",
"Nov." : "Nën.",
"Dec." : "Dhj.",
+ "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?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?",
"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." : "Ky shërbyes nuk ka lidhje Internet funksionale. Kjo do të thotë që disa nga karakteristikat e lidhjes së ngarkesës së jashtme, njoftimet rreth përditësimit ose instalimit të aplikacioneve të palës së tretë nuk do të punojnë. Duke aksesuar skedarët në distancë dhe duke dërguar njoftimin me postë elektronike mund të mos punojë. Ne sygjerojmë të aktivizoni lidhjen e Internet për këtë shërbyes nëse doni të keni të gjitha karakteristikat.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.",
"Allow editing" : "Lejo përpunim",
diff --git a/core/l10n/sq.json b/core/l10n/sq.json
index 3bdfb50f065..5e15937e5b4 100644
--- a/core/l10n/sq.json
+++ b/core/l10n/sq.json
@@ -58,7 +58,6 @@
"seconds ago" : "sekonda më parë",
"Logging in …" : "Duke u loguar ...",
"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." : "Lidhja për ricaktimin e fjalëkalimi tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme/postës së pavlerë.<br>Nëse s’është as aty, pyetni përgjegjësin tuaj lokal.",
- "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?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?",
"I know what I'm doing" : "E di se ç’bëj",
"Password can not be changed. Please contact your administrator." : "Fjalëkalimi nuk mund të ndryshohet. Ju lutemi, lidhuni me përgjegjësin tuaj.",
"No" : "Jo",
@@ -337,6 +336,7 @@
"Oct." : "Tet.",
"Nov." : "Nën.",
"Dec." : "Dhj.",
+ "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?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?",
"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." : "Ky shërbyes nuk ka lidhje Internet funksionale. Kjo do të thotë që disa nga karakteristikat e lidhjes së ngarkesës së jashtme, njoftimet rreth përditësimit ose instalimit të aplikacioneve të palës së tretë nuk do të punojnë. Duke aksesuar skedarët në distancë dhe duke dërguar njoftimin me postë elektronike mund të mos punojë. Ne sygjerojmë të aktivizoni lidhjen e Internet për këtë shërbyes nëse doni të keni të gjitha karakteristikat.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.",
"Allow editing" : "Lejo përpunim",
diff --git a/core/l10n/sv.js b/core/l10n/sv.js
index dea783f3b12..9baad587919 100644
--- a/core/l10n/sv.js
+++ b/core/l10n/sv.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"seconds ago" : "sekunder sedan",
"Logging in …" : "Loggar in ...",
"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." : "Länken för att återställa ditt lösenord har skickats till din e-mail. Om du inte mottar något inom kort, kontrollera spam/skräpkorgen.<br>Om det inte finns något där, vänligen kontakta din lokala administratör.",
- "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?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?",
+ "Your files are encrypted. 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?" : "Dina filer är krypterade. Det kommer inte att finnas något sätt att få tillbaka din data efter att ditt lösenord om ditt lösenord återställs..<br />Om du är osäker på hur du ska göra, vänligen kontakta din administratör innan du fortsätter..<br />Är du verkligen säker på att du vill fortsätta?",
"I know what I'm doing" : "Jag är säker på vad jag gör",
"Password can not be changed. Please contact your administrator." : "Lösenordet kan inte ändras. Vänligen kontakta din administratör.",
"No" : "Nej",
@@ -90,14 +90,14 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Din webbserver är inte konfigurerad korrekt för att tillåta filsynkronisering eftersom WebDAV gränssnittet verkar otillgängligt.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Din webbserver är inte konfigurerad riktigt för att lösa \"{url}\". Vidare information kan hittas i vår <a target=\"_blank\" rel\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"This server has no working Internet connection: Multiple endpoints could not be reached. 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." : "Servern har ingen fungerande internetuppkoppling. Detta betyder att vissa funktioner såsom extern lagring, notifikationer om uppdateringar eller installationer utav tredjepartsapplikationer inte kommer fungera. Åtkomst av filer utifrån och att skicka notifieringar via epost kanske inte fungerar heller. Vi föreslår att internetanslutningen aktiveras för denna server om man vill använda samtliga funktioner.",
- "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ingen minnes cache har blivit konfigurerad. För att förbättra din prestanda var god konfigurera memcache om tillgängligt. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ingen minnescache har blivit konfigurerad. För att förbättra din prestanda var god konfigurera memcache om tillgängligt. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom är inte läsbar av PHP vilket definitivt inte är rekommenderat av säkerhetsskäl. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Du kör för närvarande PHP {version}. Vi rekommenderar dig att uppgradera din PHP version så att ta fördel utav <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestanda och säkerhetsuppdateringar från PHP Group</a> så fort som din distribution stödjer det.",
"The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Nextcloud från en betrodd proxy. Om du inte försöker nå Nextcloud från en betrodd proxy, så är detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Nextcloud. Vidare information kan hittas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached är konfigurerad som distribuerad cache, men fel PHP modul \"memcache\" är installerad. \\OC\\Memcache\\Memcached stödjer bara \"memcached\" och inte \"memcache\". Se wiki för <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached för båda modulerna</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Några filer passerade inte integritetskontrollen. Vidare information om hur man löser dessa problem kan finnas i vår dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista över felaktiga filer…</a> / <a href=\"{rescanEndpoint}\">Sök igenom igen…</a>)",
- "Error occurred while checking server setup" : "Ett fel inträffade när en kontroll utav servens setup gjordes",
- "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." : "Din datakatalog och dina filer är sannolikt tillgängliga över internet. .htaccess filen fungerar ej korrekt. Vi uppmuntrar starkt att du konfigurerar din webbserver på ett sätt som inte gör din datakatalog tillgänglig på nätet eller att man flyttar hela datakatalogen ut ifrån webbserverns webbrot.",
+ "Error occurred while checking server setup" : "Ett fel inträffade när en kontroll utav servens konfiguration gjordes",
+ "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." : "Din datakatalog och dina filer är sannolikt tillgängliga för vem som helst på internet. .htaccess filen fungerar inte korrekt. Vi rekommenderar starkt att du konfigurerar din webbserver på ett sätt som gör din datakatalog otillgänglig för vem som helst på internet eller att du flyttar ut hela datakatalogen ifrån webbserverns webbrot.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP headern är inte konfigurerad att evalueras till \"{expected}\". Detta är en potensiell säkerhetsrisk och vi rekommenderar dig åtgärda denna inställning.",
"The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "The \"Strict-Transport-Security\" HTTP headern är inte konfigurerad till minst \"{seconds}\" sekunder. För förbättrad säkerhet rekommenderas aktivering utav HSTS som beskrivs i våra <a href=\"{docUrl}\" rel=\"noreferrer\">säkerhetstips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du har begärt denna sidan över HTTP. Vi föreslår starkt att du konfigurerar din webbserver att kräva använding utav HTTPS istället, som beskrivs i våra <a href=\"{docUrl}\">säkerhetstips</a>.",
@@ -339,8 +339,9 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?",
"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." : "Servern har ingen fungerande internetuppkoppling. Detta betyder att vissa funktioner så som extern lagring, notifikationer om uppdateringar eller installationer utav tredjepartsapplikationer inte kommer fungera. Åtkomst av filer utifrån och att skicka notifieringar via epost kanske inte fungerar heller. Vi föreslår att internetanslutningen aktiveras för denna server om man vill använda samtliga funktioner.",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Owncloud från en betrodd proxy. Om du inte försöker nå Owncloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Owncloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Nextcloud från en betrodd proxy. Om du inte försöker nå Nextcloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Nextcloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"Allow editing" : "Tillåt redigering",
"Hide file listing" : "Dölj filer i mappen",
"Sending ..." : "Skickar ...",
diff --git a/core/l10n/sv.json b/core/l10n/sv.json
index 4deb658786c..5b4221885f0 100644
--- a/core/l10n/sv.json
+++ b/core/l10n/sv.json
@@ -58,7 +58,7 @@
"seconds ago" : "sekunder sedan",
"Logging in …" : "Loggar in ...",
"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." : "Länken för att återställa ditt lösenord har skickats till din e-mail. Om du inte mottar något inom kort, kontrollera spam/skräpkorgen.<br>Om det inte finns något där, vänligen kontakta din lokala administratör.",
- "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?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?",
+ "Your files are encrypted. 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?" : "Dina filer är krypterade. Det kommer inte att finnas något sätt att få tillbaka din data efter att ditt lösenord om ditt lösenord återställs..<br />Om du är osäker på hur du ska göra, vänligen kontakta din administratör innan du fortsätter..<br />Är du verkligen säker på att du vill fortsätta?",
"I know what I'm doing" : "Jag är säker på vad jag gör",
"Password can not be changed. Please contact your administrator." : "Lösenordet kan inte ändras. Vänligen kontakta din administratör.",
"No" : "Nej",
@@ -88,14 +88,14 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Din webbserver är inte konfigurerad korrekt för att tillåta filsynkronisering eftersom WebDAV gränssnittet verkar otillgängligt.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Din webbserver är inte konfigurerad riktigt för att lösa \"{url}\". Vidare information kan hittas i vår <a target=\"_blank\" rel\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"This server has no working Internet connection: Multiple endpoints could not be reached. 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." : "Servern har ingen fungerande internetuppkoppling. Detta betyder att vissa funktioner såsom extern lagring, notifikationer om uppdateringar eller installationer utav tredjepartsapplikationer inte kommer fungera. Åtkomst av filer utifrån och att skicka notifieringar via epost kanske inte fungerar heller. Vi föreslår att internetanslutningen aktiveras för denna server om man vill använda samtliga funktioner.",
- "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ingen minnes cache har blivit konfigurerad. För att förbättra din prestanda var god konfigurera memcache om tillgängligt. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ingen minnescache har blivit konfigurerad. För att förbättra din prestanda var god konfigurera memcache om tillgängligt. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom är inte läsbar av PHP vilket definitivt inte är rekommenderat av säkerhetsskäl. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Du kör för närvarande PHP {version}. Vi rekommenderar dig att uppgradera din PHP version så att ta fördel utav <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestanda och säkerhetsuppdateringar från PHP Group</a> så fort som din distribution stödjer det.",
"The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Nextcloud från en betrodd proxy. Om du inte försöker nå Nextcloud från en betrodd proxy, så är detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Nextcloud. Vidare information kan hittas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached är konfigurerad som distribuerad cache, men fel PHP modul \"memcache\" är installerad. \\OC\\Memcache\\Memcached stödjer bara \"memcached\" och inte \"memcache\". Se wiki för <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached för båda modulerna</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Några filer passerade inte integritetskontrollen. Vidare information om hur man löser dessa problem kan finnas i vår dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista över felaktiga filer…</a> / <a href=\"{rescanEndpoint}\">Sök igenom igen…</a>)",
- "Error occurred while checking server setup" : "Ett fel inträffade när en kontroll utav servens setup gjordes",
- "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." : "Din datakatalog och dina filer är sannolikt tillgängliga över internet. .htaccess filen fungerar ej korrekt. Vi uppmuntrar starkt att du konfigurerar din webbserver på ett sätt som inte gör din datakatalog tillgänglig på nätet eller att man flyttar hela datakatalogen ut ifrån webbserverns webbrot.",
+ "Error occurred while checking server setup" : "Ett fel inträffade när en kontroll utav servens konfiguration gjordes",
+ "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." : "Din datakatalog och dina filer är sannolikt tillgängliga för vem som helst på internet. .htaccess filen fungerar inte korrekt. Vi rekommenderar starkt att du konfigurerar din webbserver på ett sätt som gör din datakatalog otillgänglig för vem som helst på internet eller att du flyttar ut hela datakatalogen ifrån webbserverns webbrot.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP headern är inte konfigurerad att evalueras till \"{expected}\". Detta är en potensiell säkerhetsrisk och vi rekommenderar dig åtgärda denna inställning.",
"The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "The \"Strict-Transport-Security\" HTTP headern är inte konfigurerad till minst \"{seconds}\" sekunder. För förbättrad säkerhet rekommenderas aktivering utav HSTS som beskrivs i våra <a href=\"{docUrl}\" rel=\"noreferrer\">säkerhetstips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du har begärt denna sidan över HTTP. Vi föreslår starkt att du konfigurerar din webbserver att kräva använding utav HTTPS istället, som beskrivs i våra <a href=\"{docUrl}\">säkerhetstips</a>.",
@@ -337,8 +337,9 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "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?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?",
"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." : "Servern har ingen fungerande internetuppkoppling. Detta betyder att vissa funktioner så som extern lagring, notifikationer om uppdateringar eller installationer utav tredjepartsapplikationer inte kommer fungera. Åtkomst av filer utifrån och att skicka notifieringar via epost kanske inte fungerar heller. Vi föreslår att internetanslutningen aktiveras för denna server om man vill använda samtliga funktioner.",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Owncloud från en betrodd proxy. Om du inte försöker nå Owncloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Owncloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Nextcloud från en betrodd proxy. Om du inte försöker nå Nextcloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Nextcloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.",
"Allow editing" : "Tillåt redigering",
"Hide file listing" : "Dölj filer i mappen",
"Sending ..." : "Skickar ...",
diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js
index 4ca348c6dc9..beb7f903de8 100644
--- a/core/l10n/th_TH.js
+++ b/core/l10n/th_TH.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "ยกเลิก",
"seconds ago" : "วินาที ก่อนหน้านี้",
"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." : "ลิงค์ที่ใช้สำหรับตั้งค่ารหัสผ่านใหม่ ของคุณ ได้ถูกส่งไปยังอีเมลของคุณ หากคุณยังไม่ได้รับอีกเมล ลองไปดูที่โฟลเดอร์ สแปม/ถังขยะ ในอีเมลของคุณ <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." : "หากคุณไม่สามารถเปลี่ยนแปลงรหัสผ่าน กรุณาติดต่อผู้ดูแลระบบ",
"No" : "ไม่ตกลง",
@@ -268,6 +267,7 @@ OC.L10N.register(
"Oct." : "ต.ค.",
"Nov." : "พ.ย.",
"Dec." : "ธ.ค.",
+ "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 /> คุณต้องการดำเนินการต่อ?",
"Allow editing" : "อนุญาตให้แก้ไข",
"Sending ..." : "กำลังส่ง...",
"Email sent" : "ส่งอีเมล์แล้ว",
diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json
index c55b076fb55..745b520128a 100644
--- a/core/l10n/th_TH.json
+++ b/core/l10n/th_TH.json
@@ -50,7 +50,6 @@
"Cancel" : "ยกเลิก",
"seconds ago" : "วินาที ก่อนหน้านี้",
"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." : "ลิงค์ที่ใช้สำหรับตั้งค่ารหัสผ่านใหม่ ของคุณ ได้ถูกส่งไปยังอีเมลของคุณ หากคุณยังไม่ได้รับอีกเมล ลองไปดูที่โฟลเดอร์ สแปม/ถังขยะ ในอีเมลของคุณ <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." : "หากคุณไม่สามารถเปลี่ยนแปลงรหัสผ่าน กรุณาติดต่อผู้ดูแลระบบ",
"No" : "ไม่ตกลง",
@@ -266,6 +265,7 @@
"Oct." : "ต.ค.",
"Nov." : "พ.ย.",
"Dec." : "ธ.ค.",
+ "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 /> คุณต้องการดำเนินการต่อ?",
"Allow editing" : "อนุญาตให้แก้ไข",
"Sending ..." : "กำลังส่ง...",
"Email sent" : "ส่งอีเมล์แล้ว",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index 706cb56da47..92e3ce5ba70 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "İptal",
"seconds ago" : "saniyeler önce",
"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." : "Parolanızı değiştirme bağlantısı e-posta adresinize gönderildi. Makul bir süre içerisinde almadıysanız spam/gereksiz klasörlerini kontrol ediniz.<br>Bu konumlarda da yoksa yerel sistem yöneticinize sorunuz.",
- "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?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?",
"I know what I'm doing" : "Ne yaptığımı biliyorum",
"Password can not be changed. Please contact your administrator." : "Parola değiştirilemedi. Lütfen yöneticiniz ile iletişime geçin.",
"No" : "Hayır",
@@ -296,6 +295,7 @@ OC.L10N.register(
"Oct." : "Eki.",
"Nov." : "Kas.",
"Dec." : "Ara.",
+ "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?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ters vekil sunucu başlık yapılandırmanız hatalı veya ownCloud'a güvenilen bir vekil sunucudan erişiyorsunuz. Eğer erişiminiz güvenilen bir vekil sunucu aracılığıyla gerçekleşmiyorsa bu bir güvenlik sorunudur ve bir saldırganın IP adresini farklıymış gibi göstermesine neden olabilir. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.",
"Allow editing" : "Düzenlemeye izin ver",
"Hide file listing" : "Dosya listelemesini gizle",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index 13b9d838185..764d16e978a 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -50,7 +50,6 @@
"Cancel" : "İptal",
"seconds ago" : "saniyeler önce",
"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." : "Parolanızı değiştirme bağlantısı e-posta adresinize gönderildi. Makul bir süre içerisinde almadıysanız spam/gereksiz klasörlerini kontrol ediniz.<br>Bu konumlarda da yoksa yerel sistem yöneticinize sorunuz.",
- "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?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?",
"I know what I'm doing" : "Ne yaptığımı biliyorum",
"Password can not be changed. Please contact your administrator." : "Parola değiştirilemedi. Lütfen yöneticiniz ile iletişime geçin.",
"No" : "Hayır",
@@ -294,6 +293,7 @@
"Oct." : "Eki.",
"Nov." : "Kas.",
"Dec." : "Ara.",
+ "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?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ters vekil sunucu başlık yapılandırmanız hatalı veya ownCloud'a güvenilen bir vekil sunucudan erişiyorsunuz. Eğer erişiminiz güvenilen bir vekil sunucu aracılığıyla gerçekleşmiyorsa bu bir güvenlik sorunudur ve bir saldırganın IP adresini farklıymış gibi göstermesine neden olabilir. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.",
"Allow editing" : "Düzenlemeye izin ver",
"Hide file listing" : "Dosya listelemesini gizle",
diff --git a/core/l10n/uk.js b/core/l10n/uk.js
index 39a1f4132bb..45b8810cd50 100644
--- a/core/l10n/uk.js
+++ b/core/l10n/uk.js
@@ -52,7 +52,6 @@ OC.L10N.register(
"Cancel" : "Скасувати",
"seconds ago" : "секунди тому",
"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." : "Пароль не може бути змінено. Будь ласка, зверніться до вашого адміністратора",
"No" : "Ні",
@@ -278,6 +277,7 @@ OC.L10N.register(
"Oct." : "Жов.",
"Nov." : "Лис.",
"Dec." : "Гру.",
+ "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 /> Ви дійсно хочете продовжити?",
"Allow editing" : "Дозволити редагування",
"Sending ..." : "Надсилання...",
"Email sent" : "Лист надіслано",
diff --git a/core/l10n/uk.json b/core/l10n/uk.json
index 06aa5ceb1a9..d93853483d5 100644
--- a/core/l10n/uk.json
+++ b/core/l10n/uk.json
@@ -50,7 +50,6 @@
"Cancel" : "Скасувати",
"seconds ago" : "секунди тому",
"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." : "Пароль не може бути змінено. Будь ласка, зверніться до вашого адміністратора",
"No" : "Ні",
@@ -276,6 +275,7 @@
"Oct." : "Жов.",
"Nov." : "Лис.",
"Dec." : "Гру.",
+ "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 /> Ви дійсно хочете продовжити?",
"Allow editing" : "Дозволити редагування",
"Sending ..." : "Надсилання...",
"Email sent" : "Лист надіслано",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index 1e3c8e717bb..9018b26d645 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -3,39 +3,39 @@ OC.L10N.register(
{
"Please select a file." : "请选择一个文件",
"File is too big" : "文件太大",
- "The selected file is not an image." : "所选文件不是一张图片",
- "The selected file cannot be read." : "无法读取所选文件",
+ "The selected file is not an image." : "所选文件不是一张图片.",
+ "The selected file cannot be read." : "无法读取所选文件.",
"Invalid file provided" : "提供了无效文件",
"No image or file provided" : "没有提供图片或文件",
"Unknown filetype" : "未知的文件类型",
"Invalid image" : "无效的图像",
- "An error occurred. Please contact your admin." : "发生了一个错误,请联系管理员。",
- "No temporary profile picture available, try again" : "没有临时概览页图片可用,请重试",
- "No crop data provided" : "没有提供相应数据",
+ "An error occurred. Please contact your admin." : "发生了一个错误, 请联系管理员.",
+ "No temporary profile picture available, try again" : "没有临时个人页图片可用, 请重试",
+ "No crop data provided" : "没有提供剪裁数据",
"No valid crop data provided" : "没有提供有效的裁剪数据",
"Crop is not square" : "裁剪的不是正方形",
- "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码",
- "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期",
- "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "此用户名的电子邮件地址不存在导致无法发送重置邮件,请联系管理员。",
+ "Couldn't reset password because the token is invalid" : "令牌无效, 无法重置密码",
+ "Couldn't reset password because the token is expired" : "令牌已过期, 无法重置密码",
+ "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件, 请检查您的用户名是否正确.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "该用户没有设置电子邮件地址, 无发送重置邮件. 请联系管理员.",
"%s password reset" : "重置 %s 的密码",
- "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。",
+ "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件, 请联系管理员.",
"Preparing update" : "正在准备更新",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "修复警告:",
- "Repair error: " : "修复错误:",
- "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用,请使用命令行更新。",
+ "Repair warning: " : "修复警告:",
+ "Repair error: " : "修复错误:",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用, 请使用命令行更新.",
"[%d / %d]: Checking table %s" : "[%d / %d]: 检查数据表 %s",
"Turned on maintenance mode" : "启用维护模式",
"Turned off maintenance mode" : "关闭维护模式",
- "Maintenance mode is kept active" : "维护模式已被启用",
- "Updating database schema" : "正在更新数据库架构",
+ "Maintenance mode is kept active" : "维护模式已启用",
+ "Updating database schema" : "正在更新数据库结构",
"Updated database" : "数据库已更新",
- "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update" : "已经检查数据库架构更新",
+ "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update" : "已经检查数据库结构更新",
"Checking updates of apps" : "检查更新应用",
- "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update for apps" : "已经检查应用的数据库架构更新",
+ "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update for apps" : "已经检查应用的数据库结构更新",
"Updated \"%s\" to %s" : "更新 \"%s\" 为 %s",
"Set log level to debug" : "设置日志级别为 调试",
"Reset log level" : "重设日志级别",
@@ -43,12 +43,12 @@ OC.L10N.register(
"Finished code integrity check" : "代码完整性检查完成",
"%s (3rdparty)" : "%s (第三方)",
"%s (incompatible)" : "%s (不兼容)",
- "Following apps have been disabled: %s" : "下列应用已经被禁用:%s",
+ "Following apps have been disabled: %s" : "下列应用已经被禁用: %s",
"Already up to date" : "已经是最新",
- "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常,点击查看详细信息...</a>",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常, 点击查看详细信息...</a>",
"Settings" : "设置",
"Connection to server lost" : "与服务器的连接断开",
- "Problem loading page, reloading in 5 seconds" : "加载页面出现问题,在 5 秒内重新载入",
+ "Problem loading page, reloading in 5 seconds" : "加载页面出现问题, 在 5 秒内重新加载",
"Saving..." : "保存中...",
"Dismiss" : "忽略",
"This action requires you to confirm your password" : "请您确认您的密码",
@@ -56,84 +56,84 @@ OC.L10N.register(
"Password" : "密码",
"Cancel" : "取消",
"Confirm" : "确认",
- "Failed to authenticate, try again" : "授权失败,请重试",
+ "Failed to authenticate, try again" : "授权失败, 请重试",
"seconds ago" : "几秒前",
- "Logging in …" : "正在登陆...",
- "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." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<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 />确认继续?",
+ "Logging in …" : "正在登录...",
+ "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." : "密码重置邮件已经发送到您的电子邮箱中. 如果您长时间没能收到邮件, 请检查您邮箱的垃圾/广告文件夹 <br>如果未能收到邮件请联系管理员.",
+ "Your files are encrypted. 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." : "无法修改密码,请联系管理员。",
+ "Password can not be changed. Please contact your administrator." : "无法修改密码, 请联系管理员.",
"No" : "否",
"Yes" : "是",
"No files in here" : "未找到文件",
"Choose" : "选择",
- "Error loading file picker template: {error}" : "加载文件分拣模板出错: {error}",
+ "Error loading file picker template: {error}" : "加载文件选择模板出错: {error}",
"Ok" : "确定",
"Error loading message template: {error}" : "加载消息模板出错: {error}",
"read-only" : "只读",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} 个文件冲突"],
- "One file conflict" : "1个文件冲突",
+ "One file conflict" : "1 个文件冲突",
"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." : "如果同时选择了两个版本,复制的文件名将会增加上一个数字。",
+ "Which files do you want to keep?" : "请选择需要保留的文件?",
+ "If you select both versions, the copied file will have a number added to its name." : "如果同时选择了两个版本, 副本的文件名中将会追加数字.",
"Continue" : "继续",
"(all selected)" : "(选中全部)",
- "({count} selected)" : "(选择了{count}个)",
+ "({count} selected)" : "(选择了 {count} 个)",
"Error loading file exists template" : "加载文件存在性模板失败",
- "Pending" : "挂起",
+ "Pending" : "等待",
"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 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
- "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的web服务器未正确设置以解析 \"{url}\"。您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息。",
- "This server has no working Internet connection: Multiple endpoints could not be reached. 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." : "此服务器没有有效的英特网连接:无法访问多个节点。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a> 。",
- "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom 无法被 PHP 读取,出于安全原因,这是强烈不推荐的。请查看<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>了解详情。",
- "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "你的 PHP 版本 ({version}) 不再被 <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> PHP </a>支持。我们建议您升级您的PHP版本,以便获得 PHP 性能和安全提升。",
- "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "方向代理配置不正确,或者您正在通过可信的代理访问 Nextcloud 。如果您不是通过可信代理访问 Nextcloud ,这将会是一个安全问题,将允许攻击者通过伪装IP地址访问 Nextcloud。要获得更进一步的信息,请访问 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
- "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 配置为分布式缓存,但是已经安装的 PHP 模块是 \"memcache\" 。 \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\"。点击 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\"> memcached wiki 了解两个模块的不同</a>.",
- "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查。如何解决此问题的详细信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
- "Error occurred while checking server setup" : "当检查服务器启动时出错",
- "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 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
- "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 头部没有配置和 \"{expected}\" 的一样。这是一个潜在的安全或者隐私风险,我们调整这项设置。",
- "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 严格传输安全(Strict-Transport-Security)报头未配置到至少“{seconds}”秒。处于增强安全性考虑,我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>启用 HSTS。",
- "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点,我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>配置服务器强制使用 HTTPS。",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏, 因此你的 Web 服务器没有正确地设置允许文件同步。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的 Web 服务器未正确设置以解析 \"{url}\". 您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. 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." : "此服务器没有可用的互联网连接: 多个节点无法访问. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置. 如果可用, 请配置 memcache 以增强性能. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP 无法访问 /dev/urandom, 由于安全原因, 这是强烈不推荐的. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "您当前的 PHP 版本 {version}. 我们建议您尽快升级您的 PHP 版本, 以便获得<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">来自 PHP 官方的性能和安全</a>的提升.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 Nextcloud. 如果您不是通过可信代理访问 Nextcloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 Nextcloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 当前配置为分布式缓存, 但是当前安装的 PHP 模块是 \"memcache\". \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\". 点击<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki</a>了解两者的不同.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查. 了解如何解决该问题请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效的文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
+ "Error occurred while checking server setup" : "检查服务器设置时出错",
+ "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 文件没有工作. 我们强烈建议您在 Web 服务器上配置不可以访问数据目录, 或者将数据目录移动到 Web 服务器根目录之外.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP 请求头 \"{header}\" 没有配置为 \"{expected}\". 这是一个潜在的安全或隐私风险, 我们建议您调整这项设置.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 请求头 \"Strict-Transport-Security\" 没有配置为至少 “{seconds}” 秒. 出于增强安全性考虑, 我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>中的说明启用 HSTS.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点, 我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>中的说明配置服务器强制使用 HTTPS.",
"Shared" : "已共享",
- "Shared with {recipients}" : "由{recipients}分享",
+ "Shared with {recipients}" : "由 {recipients} 分享",
"Error" : "错误",
"Error while sharing" : "共享时出错",
"Error while unsharing" : "取消共享时出错",
"Error setting expiration date" : "设置过期日期时出错",
- "The public link will expire no later than {days} days after it is created" : "这个共享链接将在创建后 {days} 天失效",
+ "The public link will expire no later than {days} days after it is created" : "该共享链接将在创建后 {days} 天失效",
"Set expiration date" : "设置过期日期",
"Expiration" : "过期",
"Expiration date" : "过期日期",
"Choose a password for the public link" : "为共享链接设置密码",
- "Copied!" : "已经复制!",
+ "Copied!" : "已经复制!",
"Copy" : "复制",
- "Not supported!" : "不被支持!",
- "Press ⌘-C to copy." : "按 ⌘ + C 进行复制。",
- "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制。",
+ "Not supported!" : "无法支持!",
+ "Press ⌘-C to copy." : "按 ⌘ + C 进行复制.",
+ "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制.",
"Resharing is not allowed" : "不允许二次共享",
"Share link" : "分享链接",
"Link" : "链接",
"Password protect" : "密码保护",
"Allow upload and editing" : "允许上传和编辑",
- "File drop (upload only)" : "文件访问(只允许上传)",
+ "File drop (upload only)" : "文件拖拽 (仅上传)",
"Email link to person" : "发送链接到个人",
"Send" : "发送",
- "Shared with you and the group {group} by {owner}" : "{owner} 共享给您及 {group} 组",
- "Shared with you by {owner}" : "{owner} 与您共享",
+ "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组",
+ "Shared with you by {owner}" : "{owner} 分享给您",
"{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 通过链接分享",
"group" : "群组",
- "remote" : "远程",
+ "remote" : "外部",
"email" : "邮件",
"Unshare" : "取消共享",
"can reshare" : "允许重新分享",
- "can edit" : "可以修改",
+ "can edit" : "允许修改",
"can create" : "允许创建",
"can change" : "允许改变",
"can delete" : "允许删除",
@@ -142,20 +142,20 @@ OC.L10N.register(
"Share details could not be loaded for this item." : "无法加载这个项目的分享详情",
"No users or groups found for {search}" : "{search} 条件下没有找到用户或用户组",
"No users found for {search}" : "没有找到 {search} 用户",
- "An error occurred. Please try again" : "发生错误。请重试。",
- "{sharee} (group)" : "{sharee} (组)",
- "{sharee} (remote)" : "{sharee} (远程)",
+ "An error occurred. Please try again" : "发生错误. 请重试.",
+ "{sharee} (group)" : "{sharee} (分组)",
+ "{sharee} (remote)" : "{sharee} (外部)",
"{sharee} (email)" : "{sharee} (邮件)",
"Share" : "分享",
- "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用云ID格式与其他服务器的用户分享,如 用户名@example.com/nextcloud",
+ "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用联合云ID与其他服务器的用户分享, 如 用户名@example.com/nextcloud",
"Share with users or by mail..." : "通过邮件分享...",
- "Share with users or remote users..." : "和用户或者远程用户分享...",
- "Share with users, remote users or by mail..." : "和用户或者远程用户通过邮件分享...",
- "Share with users or groups..." : "和用户或者组分享...",
- "Share with users, groups or by mail..." : "和用户或者组通过邮件分享...",
- "Share with users, groups or remote users..." : "和用户、组群或者远程用户分享...",
- "Share with users, groups, remote users or by mail..." : "和用户、组群或者远程用户通过邮件分享...",
- "Share with users..." : "和用户分享...",
+ "Share with users or remote users..." : "分享给其他用户或外部用户...",
+ "Share with users, remote users or by mail..." : "通过邮件分享给其他用户或外部用户...",
+ "Share with users or groups..." : "分享给其他用户或分组...",
+ "Share with users, groups or by mail..." : "通过邮件分享给其他用户或分组...",
+ "Share with users, groups or remote users..." : "分享给其他用户, 分组或外部用户...",
+ "Share with users, groups, remote users or by mail..." : "通过邮件分享给其他用户, 分组或外部用户...",
+ "Share with users..." : "分享给其他用户...",
"Error removing share" : "移除分享时出错",
"Non-existing tag #{tag}" : "标签 #{tag} 不存在",
"restricted" : "受限",
@@ -165,29 +165,29 @@ OC.L10N.register(
"Rename" : "重命名",
"Collaborative tags" : "协作标签",
"No tags found" : "标签未找到",
- "The object type is not specified." : "未指定对象类型。",
+ "The object type is not specified." : "未指定对象类型.",
"Enter new" : "输入新...",
"Add" : "增加",
"Edit tags" : "编辑标签",
"Error loading dialog template: {error}" : "加载对话框模板出错: {error}",
- "No tags selected for deletion." : "请选择要删除的标签。",
+ "No tags selected for deletion." : "没有选择删除的标签",
"unknown text" : "未知文字",
"Hello world!" : "Hello world!",
"sunny" : "晴",
- "Hello {name}, the weather is {weather}" : "您好 {name},今天天气是{weather}",
+ "Hello {name}, the weather is {weather}" : "您好 {name}, 今天天气是 {weather}",
"Hello {name}" : "你好 {name}",
"new" : "新建",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
- "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新升级,离开当前页面可能导致某些环境中断。",
+ "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新, 在某些环境下离开当前页面可能会中断.",
"Update to {version}" : "升级到 {version}",
- "An error occurred." : "发生了一个错误",
- "Please reload the page." : "请重新加载页面。",
- "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功。有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
- "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功。请此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
+ "An error occurred." : "发生错误",
+ "Please reload the page." : "请重新加载页面",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功. 有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
+ "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功. 请将此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
"Continue to Nextcloud" : "继续访问 Nextcloud",
- "The update was successful. Redirecting you to Nextcloud now." : "升级成功。将重新打开Nextcloud。",
- "Searching other places" : "搜索其他地方",
- "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}'的结果",
+ "The update was successful. Redirecting you to Nextcloud now." : "升级成功. 正在重新访问 Nextcloud.",
+ "Searching other places" : "搜索其他位置",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}' 的结果",
"_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"],
"Personal" : "个人",
"Users" : "用户",
@@ -196,96 +196,96 @@ OC.L10N.register(
"Help" : "帮助",
"Access forbidden" : "访问禁止",
"File not found" : "文件未找到",
- "The specified document has not been found on the server." : "在服务器上没找到指定的文件。",
- "You can click here to return to %s." : "你可以点击这里返回 %s。",
+ "The specified document has not been found on the server." : "在服务器上没找到指定的文件.",
+ "You can click here to return to %s." : "你可以点击这里返回 %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "嗨、你好,\n\n只想让你知道 %s 分享了 %s 给你。\n现在查看: %s\n",
- "The share will expire on %s." : "此分享将在 %s 过期。",
+ "The share will expire on %s." : "此分享将在 %s 过期.",
"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." : "请联系服务器管理员,如果多次出现这个错误,请把下面的技术细节包含在您的报告里。",
- "More details can be found in the server log." : "更多细节能在服务器日志中找到。",
+ "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." : "如果多次出现这个错误, 请联系服务器管理员, 请把下面的技术细节包含在您的报告中.",
+ "More details can be found in the server log." : "更多细节可以在服务器日志中找到.",
"Technical details" : "技术细节",
- "Remote Address: %s" : "远程地址: %s",
+ "Remote Address: %s" : "远程地址: %s",
"Request ID: %s" : "请求 ID: %s",
- "Type: %s" : "类型:%s",
+ "Type: %s" : "类型: %s",
"Code: %s" : "代码: %s",
"Message: %s" : "消息: %s",
"File: %s" : "文件: %s",
"Line: %s" : "行: %s",
"Trace" : "追踪",
"Security warning" : "安全警告",
- "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "您的数据目录和文件可能可以直接被互联网访问,因为 .htaccess 并未正常工作。",
- "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "关于如何正确配置服务器,请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">此文档</a>.。",
- "Create an <strong>admin account</strong>" : "创建<strong>管理员账号</strong>",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "因为 .htaccess 文件没有工作, 您的数据目录和文件可从互联网被访问. ",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "了解如何正确配置服务器, 请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">文档</a>.",
+ "Create an <strong>admin account</strong>" : "创建 <strong>管理员账号</strong>",
"Username" : "用户名",
"Storage & database" : "存储 & 数据库",
"Data folder" : "数据目录",
"Configure the database" : "配置数据库",
"Only %s is available." : "仅 %s 可用。",
- "Install and activate additional PHP modules to choose other database types." : "安装或激活额外的 PHP 模块以选择其他数据库类型。",
- "For more details check out the documentation." : "请查阅文档获得详细信息。",
+ "Install and activate additional PHP modules to choose other database types." : "安装并激活额外的 PHP 模块以选择其他数据库类型.",
+ "For more details check out the documentation." : "请查阅文档获得详细信息.",
"Database user" : "数据库用户",
"Database password" : "数据库密码",
"Database name" : "数据库名",
"Database tablespace" : "数据库表空间",
"Database host" : "数据库主机",
- "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号(示例, localhost:5432)。",
+ "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号 (示例, localhost:5432).",
"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 。",
+ "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 …" : "正在结束 ...",
- "Need help?" : "需要帮助?",
+ "Finishing …" : "正在完成...",
+ "Need help?" : "需要帮助?",
"See the documentation" : "查看文档",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作,该应用要求 JavaScript 。请 {linkstart} 打开 JavaScript {linkend} ,然后重新载入页面。",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作, 该应用需要使用 JavaScript. 请 {linkstart}启用 JavaScript{linkend}, 并重新加载页面.",
"Log out" : "注销",
"Search" : "搜索",
- "This action requires you to confirm your password:" : "需要您确认您的密码:",
+ "This action requires you to confirm your password:" : "此操作需要确认您的密码:",
"Confirm your password" : "确认您的密码",
- "Server side authentication failed!" : "服务端验证失败!",
- "Please contact your administrator." : "请联系你的管理员。",
- "An internal error occurred." : "发生了内部错误。",
- "Please try again or contact your administrator." : "请重试或联系管理员。",
+ "Server side authentication failed!" : "服务端认证失败!",
+ "Please contact your administrator." : "请联系您的管理员.",
+ "An internal error occurred." : "发生了内部错误.",
+ "Please try again or contact your administrator." : "请重试或联系您的管理员.",
"Username or email" : "用户名或邮箱",
- "Wrong password. Reset it?" : "密码错误。要重置么?",
+ "Wrong password. Reset it?" : "密码错误. 是否要重置?",
"Wrong password." : "密码错误",
"Log in" : "登录",
"Stay logged in" : "保持登录",
"Alternative Logins" : "其他登录方式",
- "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}",
+ "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码: {link}",
"New password" : "新密码",
"New Password" : "新密码",
"Reset password" : "重置密码",
"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 分享了 <strong>%s</strong> 给你。<br><a href=\"%s\">现在查看!</a><br><br>",
- "This Nextcloud instance is currently in single user mode." : "当前Nextcloud实例运行在单用户模式下。",
- "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。",
- "Thank you for your patience." : "感谢让你久等了。",
- "Two-factor authentication" : "双项认证",
- "Enhanced security is enabled for your account. Please authenticate using a second factor." : "已为您的帐户启用增强的安全性。 请使用附加项目进行验证。",
- "Cancel log in" : "取消登陆",
- "Use backup code" : "使用备份口令",
+ "This Nextcloud instance is currently in single user mode." : "当前 Nextcloud 实例运行在单用户模式下.",
+ "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现, 请联系你的系统管理员.",
+ "Thank you for your patience." : "感谢您久等了.",
+ "Two-factor authentication" : "双重认证",
+ "Enhanced security is enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
+ "Cancel log in" : "取消登录",
+ "Use backup code" : "使用备用口令",
"Error while validating your second factor" : "验证您的第二项时出错",
- "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器。",
- "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系你的系统管理员。如果你是系统管理员,配置 config/config.php 文件中参数 \"trusted_domain\" 设置。可以在 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\"为信任域",
+ "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系您的系统管理员. 如果您是系统管理员, 在 config/config.php 文件中设置 \"trusted_domain\". 可以在 config/config.sample.php 文件中找到例子.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于您的配置, 作为系统管理员, 您还可以点击下面的按钮来信任该域名. ",
+ "Add \"%s\" as trusted domain" : "添加 \"%s\" 为信任域名",
"App update required" : "必须的应用更新",
"%s will be updated to version %s" : "%s 将会更新至版本 %s",
- "These apps will be updated:" : "以下应用将被更新:",
- "These incompatible apps will be disabled:" : "这些不兼容的应用程序将被禁用:",
- "The theme %s has been disabled." : "%s 主题已被禁用。",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
+ "These apps will be updated:" : "以下应用将被更新:",
+ "These incompatible apps will be disabled:" : "下述不兼容的应用将被禁用:",
+ "The theme %s has been disabled." : "%s 主题已被禁用.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前, 请确认数据库、配置文件夹和数据文件夹已经备份.",
"Start update" : "开始更新",
- "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:" : "为避免较大安装时的超时, 您可以在安装目录下执行下述的命令:",
"Detailed logs" : "详细日志",
"Update needed" : "需要更新",
- "Please use the command line updater because you have a big instance." : "请使用命令行更新。",
- "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助,请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
- "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 再次可用时这个页面将刷新。",
+ "Please use the command line updater because you have a big instance." : "由于您的实例较大, 请使用命令行更新.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助, 请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
+ "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 再次可用时此页面将刷新.",
"Error loading tags" : "加载标签出错",
"Tag already exists" : "标签已存在",
"Error deleting tag(s)" : "删除标签时出错",
@@ -339,8 +339,9 @@ OC.L10N.register(
"Oct." : "十月",
"Nov." : "十一月",
"Dec." : "十二月",
- "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." : "此服务器没有有效的英特网连接。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>。",
+ "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/>您是否真的要继续?",
+ "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." : "此服务器没有可用的互联网连接. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 ownCloud. 如果您不是通过可信代理访问 ownCloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 ownCloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
"Allow editing" : "允许编辑",
"Hide file listing" : "隐藏列出的文件",
"Sending ..." : "正在发送...",
@@ -352,20 +353,20 @@ OC.L10N.register(
"change" : "更改",
"delete" : "删除",
"{sharee} (at {server})" : "{sharee} (位于 {server})",
- "Share with users…" : "与用户分享...",
- "Share with users, groups or remote users…" : "与用户,组或远程用户分享...",
- "Share with users or groups…" : "与用户或组分享...",
- "Share with users or remote users…" : "与用户或远程用户分享...",
+ "Share with users…" : "分享给其他用户...",
+ "Share with users, groups or remote users…" : "分享给其他用户, 分组或外部用户...",
+ "Share with users or groups…" : "分享给其他用户或分组...",
+ "Share with users or remote users…" : "分享给其他用户或外部用户...",
"Warning" : "警告",
"Error while sending notification" : "发送通知时出现错误",
- "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在更新,如果离开当前页面可能会中断当前环境。",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在升级, 在某些环境下离开当前页面可能会中断.",
"Updating to {version}" : "升级到 {version}",
- "The update was successful. There were warnings." : "更新成功。更新过程中出现一些警告。",
- "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果",
+ "The update was successful. There were warnings." : "更新成功. 更新过程中出现一些警告.",
+ "No search results in other folders" : "在其他文件夹内未找到任何结果",
"Two-step verification" : "两步验证",
- "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。",
+ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
"Cancel login" : "取消登录",
- "Please authenticate using the selected factor." : "请使用所选择的因素验证。",
- "An error occured while verifying the token" : "在验证令牌时出错"
+ "Please authenticate using the selected factor." : "请使用所选择的方式验证.",
+ "An error occured while verifying the token" : "验证令牌时出错"
},
"nplurals=1; plural=0;");
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index 87c7f85b3fb..c6efd72710f 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -1,39 +1,39 @@
{ "translations": {
"Please select a file." : "请选择一个文件",
"File is too big" : "文件太大",
- "The selected file is not an image." : "所选文件不是一张图片",
- "The selected file cannot be read." : "无法读取所选文件",
+ "The selected file is not an image." : "所选文件不是一张图片.",
+ "The selected file cannot be read." : "无法读取所选文件.",
"Invalid file provided" : "提供了无效文件",
"No image or file provided" : "没有提供图片或文件",
"Unknown filetype" : "未知的文件类型",
"Invalid image" : "无效的图像",
- "An error occurred. Please contact your admin." : "发生了一个错误,请联系管理员。",
- "No temporary profile picture available, try again" : "没有临时概览页图片可用,请重试",
- "No crop data provided" : "没有提供相应数据",
+ "An error occurred. Please contact your admin." : "发生了一个错误, 请联系管理员.",
+ "No temporary profile picture available, try again" : "没有临时个人页图片可用, 请重试",
+ "No crop data provided" : "没有提供剪裁数据",
"No valid crop data provided" : "没有提供有效的裁剪数据",
"Crop is not square" : "裁剪的不是正方形",
- "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码",
- "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期",
- "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "此用户名的电子邮件地址不存在导致无法发送重置邮件,请联系管理员。",
+ "Couldn't reset password because the token is invalid" : "令牌无效, 无法重置密码",
+ "Couldn't reset password because the token is expired" : "令牌已过期, 无法重置密码",
+ "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件, 请检查您的用户名是否正确.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "该用户没有设置电子邮件地址, 无发送重置邮件. 请联系管理员.",
"%s password reset" : "重置 %s 的密码",
- "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。",
+ "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件, 请联系管理员.",
"Preparing update" : "正在准备更新",
"[%d / %d]: %s" : "[%d / %d]: %s",
- "Repair warning: " : "修复警告:",
- "Repair error: " : "修复错误:",
- "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用,请使用命令行更新。",
+ "Repair warning: " : "修复警告:",
+ "Repair error: " : "修复错误:",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "由于自动更新在 config.php 中已禁用, 请使用命令行更新.",
"[%d / %d]: Checking table %s" : "[%d / %d]: 检查数据表 %s",
"Turned on maintenance mode" : "启用维护模式",
"Turned off maintenance mode" : "关闭维护模式",
- "Maintenance mode is kept active" : "维护模式已被启用",
- "Updating database schema" : "正在更新数据库架构",
+ "Maintenance mode is kept active" : "维护模式已启用",
+ "Updating database schema" : "正在更新数据库结构",
"Updated database" : "数据库已更新",
- "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update" : "已经检查数据库架构更新",
+ "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "检查数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update" : "已经检查数据库结构更新",
"Checking updates of apps" : "检查更新应用",
- "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库架构是否可以更新 (这可能需要很长的时间,这取决于数据库大小)",
- "Checked database schema update for apps" : "已经检查应用的数据库架构更新",
+ "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "检查 %s 的数据库结构是否可以更新 (这可能需要很长的时间, 这取决于数据库大小)",
+ "Checked database schema update for apps" : "已经检查应用的数据库结构更新",
"Updated \"%s\" to %s" : "更新 \"%s\" 为 %s",
"Set log level to debug" : "设置日志级别为 调试",
"Reset log level" : "重设日志级别",
@@ -41,12 +41,12 @@
"Finished code integrity check" : "代码完整性检查完成",
"%s (3rdparty)" : "%s (第三方)",
"%s (incompatible)" : "%s (不兼容)",
- "Following apps have been disabled: %s" : "下列应用已经被禁用:%s",
+ "Following apps have been disabled: %s" : "下列应用已经被禁用: %s",
"Already up to date" : "已经是最新",
- "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常,点击查看详细信息...</a>",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常, 点击查看详细信息...</a>",
"Settings" : "设置",
"Connection to server lost" : "与服务器的连接断开",
- "Problem loading page, reloading in 5 seconds" : "加载页面出现问题,在 5 秒内重新载入",
+ "Problem loading page, reloading in 5 seconds" : "加载页面出现问题, 在 5 秒内重新加载",
"Saving..." : "保存中...",
"Dismiss" : "忽略",
"This action requires you to confirm your password" : "请您确认您的密码",
@@ -54,84 +54,84 @@
"Password" : "密码",
"Cancel" : "取消",
"Confirm" : "确认",
- "Failed to authenticate, try again" : "授权失败,请重试",
+ "Failed to authenticate, try again" : "授权失败, 请重试",
"seconds ago" : "几秒前",
- "Logging in …" : "正在登陆...",
- "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." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<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 />确认继续?",
+ "Logging in …" : "正在登录...",
+ "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." : "密码重置邮件已经发送到您的电子邮箱中. 如果您长时间没能收到邮件, 请检查您邮箱的垃圾/广告文件夹 <br>如果未能收到邮件请联系管理员.",
+ "Your files are encrypted. 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." : "无法修改密码,请联系管理员。",
+ "Password can not be changed. Please contact your administrator." : "无法修改密码, 请联系管理员.",
"No" : "否",
"Yes" : "是",
"No files in here" : "未找到文件",
"Choose" : "选择",
- "Error loading file picker template: {error}" : "加载文件分拣模板出错: {error}",
+ "Error loading file picker template: {error}" : "加载文件选择模板出错: {error}",
"Ok" : "确定",
"Error loading message template: {error}" : "加载消息模板出错: {error}",
"read-only" : "只读",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} 个文件冲突"],
- "One file conflict" : "1个文件冲突",
+ "One file conflict" : "1 个文件冲突",
"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." : "如果同时选择了两个版本,复制的文件名将会增加上一个数字。",
+ "Which files do you want to keep?" : "请选择需要保留的文件?",
+ "If you select both versions, the copied file will have a number added to its name." : "如果同时选择了两个版本, 副本的文件名中将会追加数字.",
"Continue" : "继续",
"(all selected)" : "(选中全部)",
- "({count} selected)" : "(选择了{count}个)",
+ "({count} selected)" : "(选择了 {count} 个)",
"Error loading file exists template" : "加载文件存在性模板失败",
- "Pending" : "挂起",
+ "Pending" : "等待",
"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 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
- "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的web服务器未正确设置以解析 \"{url}\"。您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息。",
- "This server has no working Internet connection: Multiple endpoints could not be reached. 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." : "此服务器没有有效的英特网连接:无法访问多个节点。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a> 。",
- "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom 无法被 PHP 读取,出于安全原因,这是强烈不推荐的。请查看<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>了解详情。",
- "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "你的 PHP 版本 ({version}) 不再被 <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> PHP </a>支持。我们建议您升级您的PHP版本,以便获得 PHP 性能和安全提升。",
- "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "方向代理配置不正确,或者您正在通过可信的代理访问 Nextcloud 。如果您不是通过可信代理访问 Nextcloud ,这将会是一个安全问题,将允许攻击者通过伪装IP地址访问 Nextcloud。要获得更进一步的信息,请访问 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
- "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 配置为分布式缓存,但是已经安装的 PHP 模块是 \"memcache\" 。 \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\"。点击 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\"> memcached wiki 了解两个模块的不同</a>.",
- "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查。如何解决此问题的详细信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
- "Error occurred while checking server setup" : "当检查服务器启动时出错",
- "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 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
- "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 头部没有配置和 \"{expected}\" 的一样。这是一个潜在的安全或者隐私风险,我们调整这项设置。",
- "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 严格传输安全(Strict-Transport-Security)报头未配置到至少“{seconds}”秒。处于增强安全性考虑,我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>启用 HSTS。",
- "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点,我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>配置服务器强制使用 HTTPS。",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏, 因此你的 Web 服务器没有正确地设置允许文件同步。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的 Web 服务器未正确设置以解析 \"{url}\". 您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息.",
+ "This server has no working Internet connection: Multiple endpoints could not be reached. 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." : "此服务器没有可用的互联网连接: 多个节点无法访问. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "内存缓存未配置. 如果可用, 请配置 memcache 以增强性能. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP 无法访问 /dev/urandom, 由于安全原因, 这是强烈不推荐的. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "您当前的 PHP 版本 {version}. 我们建议您尽快升级您的 PHP 版本, 以便获得<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">来自 PHP 官方的性能和安全</a>的提升.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 Nextcloud. 如果您不是通过可信代理访问 Nextcloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 Nextcloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 当前配置为分布式缓存, 但是当前安装的 PHP 模块是 \"memcache\". \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\". 点击<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki</a>了解两者的不同.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "一些文件没有通过完整性检查. 了解如何解决该问题请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效的文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)",
+ "Error occurred while checking server setup" : "检查服务器设置时出错",
+ "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 文件没有工作. 我们强烈建议您在 Web 服务器上配置不可以访问数据目录, 或者将数据目录移动到 Web 服务器根目录之外.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP 请求头 \"{header}\" 没有配置为 \"{expected}\". 这是一个潜在的安全或隐私风险, 我们建议您调整这项设置.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "HTTP 请求头 \"Strict-Transport-Security\" 没有配置为至少 “{seconds}” 秒. 出于增强安全性考虑, 我们推荐按照<a href=\"{docUrl}\" rel=\"noreferrer\">安全提示</a>中的说明启用 HSTS.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点, 我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>中的说明配置服务器强制使用 HTTPS.",
"Shared" : "已共享",
- "Shared with {recipients}" : "由{recipients}分享",
+ "Shared with {recipients}" : "由 {recipients} 分享",
"Error" : "错误",
"Error while sharing" : "共享时出错",
"Error while unsharing" : "取消共享时出错",
"Error setting expiration date" : "设置过期日期时出错",
- "The public link will expire no later than {days} days after it is created" : "这个共享链接将在创建后 {days} 天失效",
+ "The public link will expire no later than {days} days after it is created" : "该共享链接将在创建后 {days} 天失效",
"Set expiration date" : "设置过期日期",
"Expiration" : "过期",
"Expiration date" : "过期日期",
"Choose a password for the public link" : "为共享链接设置密码",
- "Copied!" : "已经复制!",
+ "Copied!" : "已经复制!",
"Copy" : "复制",
- "Not supported!" : "不被支持!",
- "Press ⌘-C to copy." : "按 ⌘ + C 进行复制。",
- "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制。",
+ "Not supported!" : "无法支持!",
+ "Press ⌘-C to copy." : "按 ⌘ + C 进行复制.",
+ "Press Ctrl-C to copy." : "按 Ctrl + C 进行复制.",
"Resharing is not allowed" : "不允许二次共享",
"Share link" : "分享链接",
"Link" : "链接",
"Password protect" : "密码保护",
"Allow upload and editing" : "允许上传和编辑",
- "File drop (upload only)" : "文件访问(只允许上传)",
+ "File drop (upload only)" : "文件拖拽 (仅上传)",
"Email link to person" : "发送链接到个人",
"Send" : "发送",
- "Shared with you and the group {group} by {owner}" : "{owner} 共享给您及 {group} 组",
- "Shared with you by {owner}" : "{owner} 与您共享",
+ "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组",
+ "Shared with you by {owner}" : "{owner} 分享给您",
"{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 通过链接分享",
"group" : "群组",
- "remote" : "远程",
+ "remote" : "外部",
"email" : "邮件",
"Unshare" : "取消共享",
"can reshare" : "允许重新分享",
- "can edit" : "可以修改",
+ "can edit" : "允许修改",
"can create" : "允许创建",
"can change" : "允许改变",
"can delete" : "允许删除",
@@ -140,20 +140,20 @@
"Share details could not be loaded for this item." : "无法加载这个项目的分享详情",
"No users or groups found for {search}" : "{search} 条件下没有找到用户或用户组",
"No users found for {search}" : "没有找到 {search} 用户",
- "An error occurred. Please try again" : "发生错误。请重试。",
- "{sharee} (group)" : "{sharee} (组)",
- "{sharee} (remote)" : "{sharee} (远程)",
+ "An error occurred. Please try again" : "发生错误. 请重试.",
+ "{sharee} (group)" : "{sharee} (分组)",
+ "{sharee} (remote)" : "{sharee} (外部)",
"{sharee} (email)" : "{sharee} (邮件)",
"Share" : "分享",
- "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用云ID格式与其他服务器的用户分享,如 用户名@example.com/nextcloud",
+ "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "使用联合云ID与其他服务器的用户分享, 如 用户名@example.com/nextcloud",
"Share with users or by mail..." : "通过邮件分享...",
- "Share with users or remote users..." : "和用户或者远程用户分享...",
- "Share with users, remote users or by mail..." : "和用户或者远程用户通过邮件分享...",
- "Share with users or groups..." : "和用户或者组分享...",
- "Share with users, groups or by mail..." : "和用户或者组通过邮件分享...",
- "Share with users, groups or remote users..." : "和用户、组群或者远程用户分享...",
- "Share with users, groups, remote users or by mail..." : "和用户、组群或者远程用户通过邮件分享...",
- "Share with users..." : "和用户分享...",
+ "Share with users or remote users..." : "分享给其他用户或外部用户...",
+ "Share with users, remote users or by mail..." : "通过邮件分享给其他用户或外部用户...",
+ "Share with users or groups..." : "分享给其他用户或分组...",
+ "Share with users, groups or by mail..." : "通过邮件分享给其他用户或分组...",
+ "Share with users, groups or remote users..." : "分享给其他用户, 分组或外部用户...",
+ "Share with users, groups, remote users or by mail..." : "通过邮件分享给其他用户, 分组或外部用户...",
+ "Share with users..." : "分享给其他用户...",
"Error removing share" : "移除分享时出错",
"Non-existing tag #{tag}" : "标签 #{tag} 不存在",
"restricted" : "受限",
@@ -163,29 +163,29 @@
"Rename" : "重命名",
"Collaborative tags" : "协作标签",
"No tags found" : "标签未找到",
- "The object type is not specified." : "未指定对象类型。",
+ "The object type is not specified." : "未指定对象类型.",
"Enter new" : "输入新...",
"Add" : "增加",
"Edit tags" : "编辑标签",
"Error loading dialog template: {error}" : "加载对话框模板出错: {error}",
- "No tags selected for deletion." : "请选择要删除的标签。",
+ "No tags selected for deletion." : "没有选择删除的标签",
"unknown text" : "未知文字",
"Hello world!" : "Hello world!",
"sunny" : "晴",
- "Hello {name}, the weather is {weather}" : "您好 {name},今天天气是{weather}",
+ "Hello {name}, the weather is {weather}" : "您好 {name}, 今天天气是 {weather}",
"Hello {name}" : "你好 {name}",
"new" : "新建",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
- "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新升级,离开当前页面可能导致某些环境中断。",
+ "The update is in progress, leaving this page might interrupt the process in some environments." : "正在更新, 在某些环境下离开当前页面可能会中断.",
"Update to {version}" : "升级到 {version}",
- "An error occurred." : "发生了一个错误",
- "Please reload the page." : "请重新加载页面。",
- "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功。有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
- "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功。请此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
+ "An error occurred." : "发生错误",
+ "Please reload the page." : "请重新加载页面",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功. 有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
+ "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "升级成功. 请将此问题报告给 <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud 社区</a>.",
"Continue to Nextcloud" : "继续访问 Nextcloud",
- "The update was successful. Redirecting you to Nextcloud now." : "升级成功。将重新打开Nextcloud。",
- "Searching other places" : "搜索其他地方",
- "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}'的结果",
+ "The update was successful. Redirecting you to Nextcloud now." : "升级成功. 正在重新访问 Nextcloud.",
+ "Searching other places" : "搜索其他位置",
+ "No search results in other folders for '{tag}{filter}{endtag}'" : "在其他文件夹内未找到含有 '{tag}{filter}{endtag}' 的结果",
"_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"],
"Personal" : "个人",
"Users" : "用户",
@@ -194,96 +194,96 @@
"Help" : "帮助",
"Access forbidden" : "访问禁止",
"File not found" : "文件未找到",
- "The specified document has not been found on the server." : "在服务器上没找到指定的文件。",
- "You can click here to return to %s." : "你可以点击这里返回 %s。",
+ "The specified document has not been found on the server." : "在服务器上没找到指定的文件.",
+ "You can click here to return to %s." : "你可以点击这里返回 %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "嗨、你好,\n\n只想让你知道 %s 分享了 %s 给你。\n现在查看: %s\n",
- "The share will expire on %s." : "此分享将在 %s 过期。",
+ "The share will expire on %s." : "此分享将在 %s 过期.",
"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." : "请联系服务器管理员,如果多次出现这个错误,请把下面的技术细节包含在您的报告里。",
- "More details can be found in the server log." : "更多细节能在服务器日志中找到。",
+ "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." : "如果多次出现这个错误, 请联系服务器管理员, 请把下面的技术细节包含在您的报告中.",
+ "More details can be found in the server log." : "更多细节可以在服务器日志中找到.",
"Technical details" : "技术细节",
- "Remote Address: %s" : "远程地址: %s",
+ "Remote Address: %s" : "远程地址: %s",
"Request ID: %s" : "请求 ID: %s",
- "Type: %s" : "类型:%s",
+ "Type: %s" : "类型: %s",
"Code: %s" : "代码: %s",
"Message: %s" : "消息: %s",
"File: %s" : "文件: %s",
"Line: %s" : "行: %s",
"Trace" : "追踪",
"Security warning" : "安全警告",
- "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "您的数据目录和文件可能可以直接被互联网访问,因为 .htaccess 并未正常工作。",
- "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "关于如何正确配置服务器,请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">此文档</a>.。",
- "Create an <strong>admin account</strong>" : "创建<strong>管理员账号</strong>",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "因为 .htaccess 文件没有工作, 您的数据目录和文件可从互联网被访问. ",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "了解如何正确配置服务器, 请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">文档</a>.",
+ "Create an <strong>admin account</strong>" : "创建 <strong>管理员账号</strong>",
"Username" : "用户名",
"Storage & database" : "存储 & 数据库",
"Data folder" : "数据目录",
"Configure the database" : "配置数据库",
"Only %s is available." : "仅 %s 可用。",
- "Install and activate additional PHP modules to choose other database types." : "安装或激活额外的 PHP 模块以选择其他数据库类型。",
- "For more details check out the documentation." : "请查阅文档获得详细信息。",
+ "Install and activate additional PHP modules to choose other database types." : "安装并激活额外的 PHP 模块以选择其他数据库类型.",
+ "For more details check out the documentation." : "请查阅文档获得详细信息.",
"Database user" : "数据库用户",
"Database password" : "数据库密码",
"Database name" : "数据库名",
"Database tablespace" : "数据库表空间",
"Database host" : "数据库主机",
- "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号(示例, localhost:5432)。",
+ "Please specify the port number along with the host name (e.g., localhost:5432)." : "请填写主机名称和端口号 (示例, localhost:5432).",
"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 。",
+ "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 …" : "正在结束 ...",
- "Need help?" : "需要帮助?",
+ "Finishing …" : "正在完成...",
+ "Need help?" : "需要帮助?",
"See the documentation" : "查看文档",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作,该应用要求 JavaScript 。请 {linkstart} 打开 JavaScript {linkend} ,然后重新载入页面。",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作, 该应用需要使用 JavaScript. 请 {linkstart}启用 JavaScript{linkend}, 并重新加载页面.",
"Log out" : "注销",
"Search" : "搜索",
- "This action requires you to confirm your password:" : "需要您确认您的密码:",
+ "This action requires you to confirm your password:" : "此操作需要确认您的密码:",
"Confirm your password" : "确认您的密码",
- "Server side authentication failed!" : "服务端验证失败!",
- "Please contact your administrator." : "请联系你的管理员。",
- "An internal error occurred." : "发生了内部错误。",
- "Please try again or contact your administrator." : "请重试或联系管理员。",
+ "Server side authentication failed!" : "服务端认证失败!",
+ "Please contact your administrator." : "请联系您的管理员.",
+ "An internal error occurred." : "发生了内部错误.",
+ "Please try again or contact your administrator." : "请重试或联系您的管理员.",
"Username or email" : "用户名或邮箱",
- "Wrong password. Reset it?" : "密码错误。要重置么?",
+ "Wrong password. Reset it?" : "密码错误. 是否要重置?",
"Wrong password." : "密码错误",
"Log in" : "登录",
"Stay logged in" : "保持登录",
"Alternative Logins" : "其他登录方式",
- "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}",
+ "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码: {link}",
"New password" : "新密码",
"New Password" : "新密码",
"Reset password" : "重置密码",
"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 分享了 <strong>%s</strong> 给你。<br><a href=\"%s\">现在查看!</a><br><br>",
- "This Nextcloud instance is currently in single user mode." : "当前Nextcloud实例运行在单用户模式下。",
- "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。",
- "Thank you for your patience." : "感谢让你久等了。",
- "Two-factor authentication" : "双项认证",
- "Enhanced security is enabled for your account. Please authenticate using a second factor." : "已为您的帐户启用增强的安全性。 请使用附加项目进行验证。",
- "Cancel log in" : "取消登陆",
- "Use backup code" : "使用备份口令",
+ "This Nextcloud instance is currently in single user mode." : "当前 Nextcloud 实例运行在单用户模式下.",
+ "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现, 请联系你的系统管理员.",
+ "Thank you for your patience." : "感谢您久等了.",
+ "Two-factor authentication" : "双重认证",
+ "Enhanced security is enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
+ "Cancel log in" : "取消登录",
+ "Use backup code" : "使用备用口令",
"Error while validating your second factor" : "验证您的第二项时出错",
- "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器。",
- "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系你的系统管理员。如果你是系统管理员,配置 config/config.php 文件中参数 \"trusted_domain\" 设置。可以在 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\"为信任域",
+ "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系您的系统管理员. 如果您是系统管理员, 在 config/config.php 文件中设置 \"trusted_domain\". 可以在 config/config.sample.php 文件中找到例子.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于您的配置, 作为系统管理员, 您还可以点击下面的按钮来信任该域名. ",
+ "Add \"%s\" as trusted domain" : "添加 \"%s\" 为信任域名",
"App update required" : "必须的应用更新",
"%s will be updated to version %s" : "%s 将会更新至版本 %s",
- "These apps will be updated:" : "以下应用将被更新:",
- "These incompatible apps will be disabled:" : "这些不兼容的应用程序将被禁用:",
- "The theme %s has been disabled." : "%s 主题已被禁用。",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
+ "These apps will be updated:" : "以下应用将被更新:",
+ "These incompatible apps will be disabled:" : "下述不兼容的应用将被禁用:",
+ "The theme %s has been disabled." : "%s 主题已被禁用.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前, 请确认数据库、配置文件夹和数据文件夹已经备份.",
"Start update" : "开始更新",
- "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:" : "为避免较大安装时的超时, 您可以在安装目录下执行下述的命令:",
"Detailed logs" : "详细日志",
"Update needed" : "需要更新",
- "Please use the command line updater because you have a big instance." : "请使用命令行更新。",
- "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助,请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
- "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 再次可用时这个页面将刷新。",
+ "Please use the command line updater because you have a big instance." : "由于您的实例较大, 请使用命令行更新.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "获取更多帮助, 请查看 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">文档</a>.",
+ "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 再次可用时此页面将刷新.",
"Error loading tags" : "加载标签出错",
"Tag already exists" : "标签已存在",
"Error deleting tag(s)" : "删除标签时出错",
@@ -337,8 +337,9 @@
"Oct." : "十月",
"Nov." : "十一月",
"Dec." : "十二月",
- "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." : "此服务器没有有效的英特网连接。这意味着某些功能比如加载外部存储器,更新或者安装第三方应用程序的通知程序无法工作。访问本地文件和发送通知邮件可能也不工作。我们建议您如果想使用所有功能,请启用此服务器的英特网连接服务。",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>。",
+ "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/>您是否真的要继续?",
+ "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." : "此服务器没有可用的互联网连接. 这意味着某些功能比如挂载外部存储, 更新通知以及安装第三方应用将无法工作. 远程访问文件和发送通知邮件可能也不工作. 如果您想使用所有的功能, 我们建议启用互联网连接.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理配置错误, 或者您正在通过可信的代理访问 ownCloud. 如果您不是通过可信代理访问 ownCloud, 这将是一个安全问题, 并允许攻击者通过伪装 IP 地址访问 ownCloud. 更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>.",
"Allow editing" : "允许编辑",
"Hide file listing" : "隐藏列出的文件",
"Sending ..." : "正在发送...",
@@ -350,20 +351,20 @@
"change" : "更改",
"delete" : "删除",
"{sharee} (at {server})" : "{sharee} (位于 {server})",
- "Share with users…" : "与用户分享...",
- "Share with users, groups or remote users…" : "与用户,组或远程用户分享...",
- "Share with users or groups…" : "与用户或组分享...",
- "Share with users or remote users…" : "与用户或远程用户分享...",
+ "Share with users…" : "分享给其他用户...",
+ "Share with users, groups or remote users…" : "分享给其他用户, 分组或外部用户...",
+ "Share with users or groups…" : "分享给其他用户或分组...",
+ "Share with users or remote users…" : "分享给其他用户或外部用户...",
"Warning" : "警告",
"Error while sending notification" : "发送通知时出现错误",
- "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在更新,如果离开当前页面可能会中断当前环境。",
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "正在升级, 在某些环境下离开当前页面可能会中断.",
"Updating to {version}" : "升级到 {version}",
- "The update was successful. There were warnings." : "更新成功。更新过程中出现一些警告。",
- "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果",
+ "The update was successful. There were warnings." : "更新成功. 更新过程中出现一些警告.",
+ "No search results in other folders" : "在其他文件夹内未找到任何结果",
"Two-step verification" : "两步验证",
- "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。",
+ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性, 请使用第二因子验证.",
"Cancel login" : "取消登录",
- "Please authenticate using the selected factor." : "请使用所选择的因素验证。",
- "An error occured while verifying the token" : "在验证令牌时出错"
+ "Please authenticate using the selected factor." : "请使用所选择的方式验证.",
+ "An error occured while verifying the token" : "验证令牌时出错"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js
index 97b472d453a..45fa22b72a8 100644
--- a/core/l10n/zh_TW.js
+++ b/core/l10n/zh_TW.js
@@ -53,7 +53,6 @@ OC.L10N.register(
"Cancel" : "取消",
"seconds ago" : "幾秒前",
"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 至你的信箱,如果你在一段時間內沒收到,請檢查垃圾郵件資料夾,如果還是找不到,請聯絡系統管理員。",
- "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." : "無法變更密碼,請聯絡您的系統管理員",
"No" : "否",
@@ -297,6 +296,7 @@ OC.L10N.register(
"Oct." : "十月",
"Nov." : "十一月",
"Dec." : "十二月",
+ "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/>您確定要繼續嗎?",
"Allow editing" : "允許編輯",
"Hide file listing" : "隱藏檔案列表",
"Sending ..." : "正在傳送…",
diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json
index cab98810923..e3a8544d9db 100644
--- a/core/l10n/zh_TW.json
+++ b/core/l10n/zh_TW.json
@@ -51,7 +51,6 @@
"Cancel" : "取消",
"seconds ago" : "幾秒前",
"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 至你的信箱,如果你在一段時間內沒收到,請檢查垃圾郵件資料夾,如果還是找不到,請聯絡系統管理員。",
- "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." : "無法變更密碼,請聯絡您的系統管理員",
"No" : "否",
@@ -295,6 +294,7 @@
"Oct." : "十月",
"Nov." : "十一月",
"Dec." : "十二月",
+ "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/>您確定要繼續嗎?",
"Allow editing" : "允許編輯",
"Hide file listing" : "隱藏檔案列表",
"Sending ..." : "正在傳送…",
diff --git a/core/templates/twofactorshowchallenge.php b/core/templates/twofactorshowchallenge.php
index 20b92be9520..4f3741b5dfe 100644
--- a/core/templates/twofactorshowchallenge.php
+++ b/core/templates/twofactorshowchallenge.php
@@ -3,6 +3,8 @@
/** @var $_ array */
/* @var $error boolean */
$error = $_['error'];
+/* @var $error_message string */
+$error_message = $_['error_message'];
/* @var $provider OCP\Authentication\TwoFactorAuth\IProvider */
$provider = $_['provider'];
/* @var $template string */
@@ -12,7 +14,11 @@ $template = $_['template'];
<div class="warning">
<h2 class="two-factor-header"><?php p($provider->getDisplayName()); ?></h2>
<?php if ($error): ?>
- <p><strong><?php p($l->t('Error while validating your second factor')); ?></strong></p>
+ <?php if($error_message): ?>
+ <p><strong><?php p($error_message); ?></strong></p>
+ <?php else: ?>
+ <p><strong><?php p($l->t('Error while validating your second factor')); ?></strong></p>
+ <?php endif; ?>
<?php endif; ?>
<?php print_unescaped($template); ?>
</div>
diff --git a/core/vendor/.gitignore b/core/vendor/.gitignore
index fe078fdd291..19bd084f76e 100644
--- a/core/vendor/.gitignore
+++ b/core/vendor/.gitignore
@@ -1,12 +1,14 @@
test/
src/
bower.json
+component.json
.jshintrc
.travis.yml
CHANGELOG*
Gemfile
gruntfile.js
Gruntfile.js
+Gulpfile.js
Makefile
package.json
README*
@@ -156,3 +158,17 @@ autosize/**
!autosize/dist/autosize.js
!autosize/.bower.json
!autosize/LICENCE.md
+
+#marked
+marked/bin
+marked/doc
+marked/index.js
+marked/lib
+marked/man
+
+# DOMPurity
+DOMPurify/**
+!DOMPurify/dist
+!DOMPurify/dist/purify.min.js
+!DOMPurify/.bower.json
+!DOMPurify/LICENSE \ No newline at end of file
diff --git a/core/vendor/DOMPurify/.bower.json b/core/vendor/DOMPurify/.bower.json
new file mode 100644
index 00000000000..45f4fa47258
--- /dev/null
+++ b/core/vendor/DOMPurify/.bower.json
@@ -0,0 +1,42 @@
+{
+ "name": "DOMPurify",
+ "version": "0.8.4",
+ "homepage": "https://github.com/cure53/DOMPurify",
+ "author": "Cure53 <info@cure53.de>",
+ "description": "A DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG",
+ "main": "src/purify.js",
+ "keywords": [
+ "dom",
+ "xss",
+ "cross site scripting",
+ "html",
+ "svg",
+ "mathml",
+ "sanitizer",
+ "filter",
+ "sanitize",
+ "security",
+ "secure"
+ ],
+ "license": [
+ "MPL-2.0",
+ "Apache-2.0"
+ ],
+ "ignore": [
+ "**/.*",
+ "demos",
+ "scripts",
+ "test",
+ "website"
+ ],
+ "_release": "0.8.4",
+ "_resolution": {
+ "type": "version",
+ "tag": "0.8.4",
+ "commit": "9be8f9def3124ccf2db71b7711027b55f9b90f48"
+ },
+ "_source": "https://github.com/cure53/DOMPurify.git",
+ "_target": "^0.8.4",
+ "_originalSource": "DOMPurify",
+ "_direct": true
+} \ No newline at end of file
diff --git a/core/vendor/DOMPurify/LICENSE b/core/vendor/DOMPurify/LICENSE
new file mode 100644
index 00000000000..e099aad0f09
--- /dev/null
+++ b/core/vendor/DOMPurify/LICENSE
@@ -0,0 +1,378 @@
+DOMPurify
+Copyright 2015 Mario Heiderich
+
+DOMPurify is free software; you can redistribute it and/or modify it under the
+terms of either:
+
+a) the Apache License Version 2.0, or
+b) the Mozilla Public License Version 2.0
+
+-----------------------------------------------------------------------------
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-----------------------------------------------------------------------------
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. “Contributor”
+
+ means each individual or legal entity that creates, contributes to the
+ creation of, or owns Covered Software.
+
+1.2. “Contributor Version”
+
+ means the combination of the Contributions of others (if any) used by a
+ Contributor and that particular Contributor’s Contribution.
+
+1.3. “Contribution”
+
+ means Covered Software of a particular Contributor.
+
+1.4. “Covered Software”
+
+ means Source Code Form to which the initial Contributor has attached the
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
+ Modifications of such Source Code Form, in each case including portions
+ thereof.
+
+1.5. “Incompatible With Secondary Licenses”
+ means
+
+ a. that the initial Contributor has attached the notice described in
+ Exhibit B to the Covered Software; or
+
+ b. that the Covered Software was made available under the terms of version
+ 1.1 or earlier of the License, but not also under the terms of a
+ Secondary License.
+
+1.6. “Executable Form”
+
+ means any form of the work other than Source Code Form.
+
+1.7. “Larger Work”
+
+ means a work that combines Covered Software with other material, in a separate
+ file or files, that is not Covered Software.
+
+1.8. “License”
+
+ means this document.
+
+1.9. “Licensable”
+
+ means having the right to grant, to the maximum extent possible, whether at the
+ time of the initial grant or subsequently, any and all of the rights conveyed by
+ this License.
+
+1.10. “Modifications”
+
+ means any of the following:
+
+ a. any file in Source Code Form that results from an addition to, deletion
+ from, or modification of the contents of Covered Software; or
+
+ b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. “Patent Claims” of a Contributor
+
+ means any patent claim(s), including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by such Contributor that
+ would be infringed, but for the grant of the License, by the making,
+ using, selling, offering for sale, having made, import, or transfer of
+ either its Contributions or its Contributor Version.
+
+1.12. “Secondary License”
+
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
+ General Public License, Version 2.1, the GNU Affero General Public
+ License, Version 3.0, or any later versions of those licenses.
+
+1.13. “Source Code Form”
+
+ means the form of the work preferred for making modifications.
+
+1.14. “You” (or “Your”)
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, “You” includes any entity that controls, is
+ controlled by, or is under common control with You. For purposes of this
+ definition, “control” means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+ Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ a. under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or as
+ part of a Larger Work; and
+
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
+ sale, have made, import, and otherwise transfer either its Contributions
+ or its Contributor Version.
+
+2.2. Effective Date
+
+ The licenses granted in Section 2.1 with respect to any Contribution become
+ effective for each Contribution on the date the Contributor first distributes
+ such Contribution.
+
+2.3. Limitations on Grant Scope
+
+ The licenses granted in this Section 2 are the only rights granted under this
+ License. No additional rights or licenses will be implied from the distribution
+ or licensing of Covered Software under this License. Notwithstanding Section
+ 2.1(b) above, no patent license is granted by a Contributor:
+
+ a. for any code that a Contributor has removed from Covered Software; or
+
+ b. for infringements caused by: (i) Your and any other third party’s
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ c. under Patent Claims infringed by Covered Software in the absence of its
+ Contributions.
+
+ This License does not grant any rights in the trademarks, service marks, or
+ logos of any Contributor (except as may be necessary to comply with the
+ notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+ No Contributor makes additional grants as a result of Your choice to
+ distribute the Covered Software under a subsequent version of this License
+ (see Section 10.2) or under the terms of a Secondary License (if permitted
+ under the terms of Section 3.3).
+
+2.5. Representation
+
+ Each Contributor represents that the Contributor believes its Contributions
+ are its original creation(s) or it has sufficient rights to grant the
+ rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+ This License is not intended to limit any rights You have under applicable
+ copyright doctrines of fair use, fair dealing, or other equivalents.
+
+2.7. Conditions
+
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+ Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+ All distribution of Covered Software in Source Code Form, including any
+ Modifications that You create or to which You contribute, must be under the
+ terms of this License. You must inform recipients that the Source Code Form
+ of the Covered Software is governed by the terms of this License, and how
+ they can obtain a copy of this License. You may not attempt to alter or
+ restrict the recipients’ rights in the Source Code Form.
+
+3.2. Distribution of Executable Form
+
+ If You distribute Covered Software in Executable Form then:
+
+ a. such Covered Software must also be made available in Source Code Form,
+ as described in Section 3.1, and You must inform recipients of the
+ Executable Form how they can obtain a copy of such Source Code Form by
+ reasonable means in a timely manner, at a charge no more than the cost
+ of distribution to the recipient; and
+
+ b. You may distribute such Executable Form under the terms of this License,
+ or sublicense it under different terms, provided that the license for
+ the Executable Form does not attempt to limit or alter the recipients’
+ rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+ You may create and distribute a Larger Work under terms of Your choice,
+ provided that You also comply with the requirements of this License for the
+ Covered Software. If the Larger Work is a combination of Covered Software
+ with a work governed by one or more Secondary Licenses, and the Covered
+ Software is not Incompatible With Secondary Licenses, this License permits
+ You to additionally distribute such Covered Software under the terms of
+ such Secondary License(s), so that the recipient of the Larger Work may, at
+ their option, further distribute the Covered Software under the terms of
+ either this License or such Secondary License(s).
+
+3.4. Notices
+
+ You may not remove or alter the substance of any license notices (including
+ copyright notices, patent notices, disclaimers of warranty, or limitations
+ of liability) contained within the Source Code Form of the Covered
+ Software, except that You may alter any license notices to the extent
+ required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+ You may choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of Covered
+ Software. However, You may do so only on Your own behalf, and not on behalf
+ of any Contributor. You must make it absolutely clear that any such
+ warranty, support, indemnity, or liability obligation is offered by You
+ alone, and You hereby agree to indemnify every Contributor for any
+ liability incurred by such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer. You may include additional
+ disclaimers of warranty and limitations of liability specific to any
+ jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+ If it is impossible for You to comply with any of the terms of this License
+ with respect to some or all of the Covered Software due to statute, judicial
+ order, or regulation then You must: (a) comply with the terms of this License
+ to the maximum extent possible; and (b) describe the limitations and the code
+ they affect. Such description must be placed in a text file included with all
+ distributions of the Covered Software under this License. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+ fail to comply with any of its terms. However, if You become compliant,
+ then the rights granted under this License from a particular Contributor
+ are reinstated (a) provisionally, unless and until such Contributor
+ explicitly and finally terminates Your grants, and (b) on an ongoing basis,
+ if such Contributor fails to notify You of the non-compliance by some
+ reasonable means prior to 60 days after You have come back into compliance.
+ Moreover, Your grants from a particular Contributor are reinstated on an
+ ongoing basis if such Contributor notifies You of the non-compliance by
+ some reasonable means, this is the first time You have received notice of
+ non-compliance with this License from such Contributor, and You become
+ compliant prior to 30 days after Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+ infringement claim (excluding declaratory judgment actions, counter-claims,
+ and cross-claims) alleging that a Contributor Version directly or
+ indirectly infringes any patent, then the rights granted to You by any and
+ all Contributors for the Covered Software under Section 2.1 of this License
+ shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+ license agreements (excluding distributors and resellers) which have been
+ validly granted by You or Your distributors under this License prior to
+ termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+ Covered Software is provided under this License on an “as is” basis, without
+ warranty of any kind, either expressed, implied, or statutory, including,
+ without limitation, warranties that the Covered Software is free of defects,
+ merchantable, fit for a particular purpose or non-infringing. The entire
+ risk as to the quality and performance of the Covered Software is with You.
+ Should any Covered Software prove defective in any respect, You (not any
+ Contributor) assume the cost of any necessary servicing, repair, or
+ correction. This disclaimer of warranty constitutes an essential part of this
+ License. No use of any Covered Software is authorized under this License
+ except under this disclaimer.
+
+7. Limitation of Liability
+
+ Under no circumstances and under no legal theory, whether tort (including
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
+ distributes Covered Software as permitted above, be liable to You for any
+ direct, indirect, special, incidental, or consequential damages of any
+ character including, without limitation, damages for lost profits, loss of
+ goodwill, work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses, even if such party shall have been
+ informed of the possibility of such damages. This limitation of liability
+ shall not apply to liability for death or personal injury resulting from such
+ party’s negligence to the extent applicable law prohibits such limitation.
+ Some jurisdictions do not allow the exclusion or limitation of incidental or
+ consequential damages, so this exclusion and limitation may not apply to You.
+
+8. Litigation
+
+ Any litigation relating to this License may be brought only in the courts of
+ a jurisdiction where the defendant maintains its principal place of business
+ and such litigation shall be governed by laws of that jurisdiction, without
+ reference to its conflict-of-law provisions. Nothing in this Section shall
+ prevent a party’s ability to bring cross-claims or counter-claims.
+
+9. Miscellaneous
+
+ This License represents the complete agreement concerning the subject matter
+ hereof. If any provision of this License is held to be unenforceable, such
+ provision shall be reformed only to the extent necessary to make it
+ enforceable. Any law or regulation which provides that the language of a
+ contract shall be construed against the drafter shall not be used to construe
+ this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+ Mozilla Foundation is the license steward. Except as provided in Section
+ 10.3, no one other than the license steward has the right to modify or
+ publish new versions of this License. Each version will be given a
+ distinguishing version number.
+
+10.2. Effect of New Versions
+
+ You may distribute the Covered Software under the terms of the version of
+ the License under which You originally received the Covered Software, or
+ under the terms of any subsequent version published by the license
+ steward.
+
+10.3. Modified Versions
+
+ If you create software not governed by this License, and you want to
+ create a new license for such software, you may create and use a modified
+ version of this License if you rename the license and remove any
+ references to the name of the license steward (except to note that such
+ modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+ If You choose to distribute Source Code Form that is Incompatible With
+ Secondary Licenses under the terms of this version of the License, the
+ notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the
+ terms of the Mozilla Public License, v.
+ 2.0. If a copy of the MPL was not
+ distributed with this file, You can
+ obtain one at
+ http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file, then
+You may include the notice in a location (such as a LICENSE file in a relevant
+directory) where a recipient would be likely to look for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+ This Source Code Form is “Incompatible
+ With Secondary Licenses”, as defined by
+ the Mozilla Public License, v. 2.0.
+
diff --git a/core/vendor/DOMPurify/dist/purify.min.js b/core/vendor/DOMPurify/dist/purify.min.js
new file mode 100644
index 00000000000..d95d80fc231
--- /dev/null
+++ b/core/vendor/DOMPurify/dist/purify.min.js
@@ -0,0 +1,2 @@
+(function(e){"use strict";var t=typeof window==="undefined"?null:window;if(typeof define==="function"&&define.amd){define(function(){return e(t)})}else if(typeof module!=="undefined"){module.exports=e(t)}else{t.DOMPurify=e(t)}})(function e(t){"use strict";var r=function(t){return e(t)};r.version="0.8.4";r.removed=[];if(!t||!t.document||t.document.nodeType!==9){r.isSupported=false;return r}var n=t.document;var a=n;var i=t.DocumentFragment;var o=t.HTMLTemplateElement;var l=t.NodeFilter;var s=t.NamedNodeMap||t.MozNamedAttrMap;var f=t.Text;var c=t.Comment;var u=t.DOMParser;if(typeof o==="function"){var d=n.createElement("template");if(d.content&&d.content.ownerDocument){n=d.content.ownerDocument}}var m=n.implementation;var p=n.createNodeIterator;var v=n.getElementsByTagName;var h=n.createDocumentFragment;var g=a.importNode;var y={};r.isSupported=typeof m.createHTMLDocument!=="undefined"&&n.documentMode!==9;var b=function(e,t){var r=t.length;while(r--){if(typeof t[r]==="string"){t[r]=t[r].toLowerCase()}e[t[r]]=true}return e};var T=function(e){var t={};var r;for(r in e){if(e.hasOwnProperty(r)){t[r]=e[r]}}return t};var x=null;var k=b({},["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr","svg","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","switch","symbol","text","textpath","title","tref","tspan","view","vkern","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmuliscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mpspace","msqrt","mystyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","#text"]);var A=null;var w=b({},["accept","action","align","alt","autocomplete","background","bgcolor","border","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","coords","datetime","default","dir","disabled","download","enctype","face","for","headers","height","hidden","high","href","hreflang","id","ismap","label","lang","list","loop","low","max","maxlength","media","method","min","multiple","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","rows","rowspan","spellcheck","scope","selected","shape","size","span","srclang","start","src","step","style","summary","tabindex","title","type","usemap","valign","value","width","xmlns","accent-height","accumulate","additivive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mode","min","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","surfacescale","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","u1","u2","unicode","values","viewbox","visibility","vert-adv-y","vert-origin-x","vert-origin-y","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","y","y1","y2","z","zoomandpan","accent","accentunder","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","display","displaystyle","fence","frame","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]);var E=null;var S=null;var M=true;var O=false;var N=false;var L=false;var D=/\{\{[\s\S]*|[\s\S]*\}\}/gm;var _=/<%[\s\S]*|[\s\S]*%>/gm;var C=false;var z=false;var R=false;var F=false;var H=true;var B=true;var W=b({},["audio","head","math","script","style","svg","video"]);var j=b({},["audio","video","img","source"]);var G=b({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]);var I=null;var q=n.createElement("form");var P=function(e){if(typeof e!=="object"){e={}}x="ALLOWED_TAGS"in e?b({},e.ALLOWED_TAGS):k;A="ALLOWED_ATTR"in e?b({},e.ALLOWED_ATTR):w;E="FORBID_TAGS"in e?b({},e.FORBID_TAGS):{};S="FORBID_ATTR"in e?b({},e.FORBID_ATTR):{};M=e.ALLOW_DATA_ATTR!==false;O=e.ALLOW_UNKNOWN_PROTOCOLS||false;N=e.SAFE_FOR_JQUERY||false;L=e.SAFE_FOR_TEMPLATES||false;C=e.WHOLE_DOCUMENT||false;z=e.RETURN_DOM||false;R=e.RETURN_DOM_FRAGMENT||false;F=e.RETURN_DOM_IMPORT||false;H=e.SANITIZE_DOM!==false;B=e.KEEP_CONTENT!==false;if(L){M=false}if(R){z=true}if(e.ADD_TAGS){if(x===k){x=T(x)}b(x,e.ADD_TAGS)}if(e.ADD_ATTR){if(A===w){A=T(A)}b(A,e.ADD_ATTR)}if(B){x["#text"]=true}if(Object&&"freeze"in Object){Object.freeze(e)}I=e};var U=function(e){r.removed.push({element:e});try{e.parentNode.removeChild(e)}catch(t){e.outerHTML=""}};var V=function(e,t){r.removed.push({attribute:t.getAttributeNode(e),from:t});t.removeAttribute(e)};var K=function(e){var t,r;try{t=(new u).parseFromString(e,"text/html")}catch(n){}if(!t||!t.documentElement){t=m.createHTMLDocument("");r=t.body;r.parentNode.removeChild(r.parentNode.firstElementChild);r.outerHTML=e}if(typeof t.getElementsByTagName==="function"){return t.getElementsByTagName(C?"html":"body")[0]}return v.call(t,C?"html":"body")[0]};var J=function(e){return p.call(e.ownerDocument||e,e,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT,function(){return l.FILTER_ACCEPT},false)};var Q=function(e){if(e instanceof f||e instanceof c){return false}if(typeof e.nodeName!=="string"||typeof e.textContent!=="string"||typeof e.removeChild!=="function"||!(e.attributes instanceof s)||typeof e.removeAttribute!=="function"||typeof e.setAttribute!=="function"){return true}return false};var X=function(e){var t,n;ne("beforeSanitizeElements",e,null);if(Q(e)){U(e);return true}t=e.nodeName.toLowerCase();ne("uponSanitizeElement",e,{tagName:t,allowedTags:x});if(!x[t]||E[t]){if(B&&!W[t]&&typeof e.insertAdjacentHTML==="function"){try{e.insertAdjacentHTML("AfterEnd",e.innerHTML)}catch(a){}}U(e);return true}if(N&&!e.firstElementChild&&(!e.content||!e.content.firstElementChild)&&/</g.test(e.textContent)){r.removed.push({element:e.cloneNode()});e.innerHTML=e.textContent.replace(/</g,"&lt;")}if(L&&e.nodeType===3){n=e.textContent;n=n.replace(D," ");n=n.replace(_," ");if(e.textContent!==n){r.removed.push({element:e.cloneNode()});e.textContent=n}}ne("afterSanitizeElements",e,null);return false};var Y=/^data-[\-\w.\u00B7-\uFFFF]/;var Z=/^(?:(?:(?:f|ht)tps?|mailto|tel):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;var $=/^(?:\w+script|data):/i;var ee=/[\x00-\x20\xA0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;var te=function(e){var a,i,o,l,s,f,c,u;ne("beforeSanitizeAttributes",e,null);f=e.attributes;if(!f){return}c={attrName:"",attrValue:"",keepAttr:true,allowedAttributes:A};u=f.length;while(u--){a=f[u];i=a.name;o=a.value;l=i.toLowerCase();c.attrName=l;c.attrValue=o;c.keepAttr=true;ne("uponSanitizeAttribute",e,c);o=c.attrValue;if(l==="name"&&e.nodeName==="IMG"&&f.id){s=f.id;f=Array.prototype.slice.apply(f);V("id",e);V(i,e);if(f.indexOf(s)>u){e.setAttribute("id",s.value)}}else{if(i==="id"){e.setAttribute(i,"")}V(i,e)}if(!c.keepAttr){continue}if(H&&(l==="id"||l==="name")&&(o in t||o in n||o in q)){continue}if(L){o=o.replace(D," ");o=o.replace(_," ")}if(M&&Y.test(l)){}else if(!A[l]||S[l]){continue}else if(G[l]){}else if(Z.test(o.replace(ee,""))){}else if(l==="src"&&o.indexOf("data:")===0&&j[e.nodeName.toLowerCase()]){}else if(O&&!$.test(o.replace(ee,""))){}else if(!o){}else{continue}try{e.setAttribute(i,o);r.removed.pop()}catch(d){}}ne("afterSanitizeAttributes",e,null)};var re=function(e){var t;var r=J(e);ne("beforeSanitizeShadowDOM",e,null);while(t=r.nextNode()){ne("uponSanitizeShadowNode",t,null);if(X(t)){continue}if(t.content instanceof i){re(t.content)}te(t)}ne("afterSanitizeShadowDOM",e,null)};var ne=function(e,t,n){if(!y[e]){return}y[e].forEach(function(e){e.call(r,t,n,I)})};r.sanitize=function(e,n){var o,l,s,f,c;if(!e){e=""}if(typeof e!=="string"){if(typeof e.toString!=="function"){throw new TypeError("toString is not a function")}else{e=e.toString()}}if(!r.isSupported){if(typeof t.toStaticHTML==="object"||typeof t.toStaticHTML==="function"){return t.toStaticHTML(e)}return e}P(n);r.removed=[];if(!z&&!C&&e.indexOf("<")===-1){return e}o=K(e);if(!o){return z?null:""}f=J(o);while(l=f.nextNode()){if(l.nodeType===3&&l===s){continue}if(X(l)){continue}if(l.content instanceof i){re(l.content)}te(l);s=l}if(z){if(R){c=h.call(o.ownerDocument);while(o.firstChild){c.appendChild(o.firstChild)}}else{c=o}if(F){c=g.call(a,c,true)}return c}return C?o.outerHTML:o.innerHTML};r.addHook=function(e,t){if(typeof t!=="function"){return}y[e]=y[e]||[];y[e].push(t)};r.removeHook=function(e){if(y[e]){y[e].pop()}};r.removeHooks=function(e){if(y[e]){y[e]=[]}};r.removeAllHooks=function(){y={}};return r});
+//# sourceMappingURL=./dist/purify.min.js.map \ No newline at end of file
diff --git a/core/vendor/marked/.bower.json b/core/vendor/marked/.bower.json
new file mode 100644
index 00000000000..058b951d4b7
--- /dev/null
+++ b/core/vendor/marked/.bower.json
@@ -0,0 +1,33 @@
+{
+ "name": "marked",
+ "version": "0.3.6",
+ "homepage": "https://github.com/chjj/marked",
+ "authors": [
+ "Christopher Jeffrey <chjjeffrey@gmail.com>"
+ ],
+ "description": "A markdown parser built for speed",
+ "keywords": [
+ "markdown",
+ "markup",
+ "html"
+ ],
+ "main": "lib/marked.js",
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "app/bower_components",
+ "test",
+ "tests"
+ ],
+ "_release": "0.3.6",
+ "_resolution": {
+ "type": "version",
+ "tag": "v0.3.6",
+ "commit": "eddec20467c2d10c7769061ee9074e268500966f"
+ },
+ "_source": "https://github.com/chjj/marked.git",
+ "_target": "0.3.6",
+ "_originalSource": "marked"
+} \ No newline at end of file
diff --git a/core/vendor/marked/LICENSE b/core/vendor/marked/LICENSE
new file mode 100644
index 00000000000..a7b812ed618
--- /dev/null
+++ b/core/vendor/marked/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/core/vendor/marked/marked.min.js b/core/vendor/marked/marked.min.js
new file mode 100644
index 00000000000..555c1dc1d9d
--- /dev/null
+++ b/core/vendor/marked/marked.min.js
@@ -0,0 +1,6 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
+(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1].charAt(cap[1].length-1)==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",text:cap[0]});continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"<pre><code>"+(escaped?code:escape(code,true))+"\n</code></pre>"}return'<pre><code class="'+this.options.langPrefix+escape(lang,true)+'">'+(escaped?code:escape(code,true))+"\n</code></pre>\n"};Renderer.prototype.blockquote=function(quote){return"<blockquote>\n"+quote+"</blockquote>\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"<h"+level+' id="'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\w]+/g,"-")+'">'+text+"</h"+level+">\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"</"+type+">\n"};Renderer.prototype.listitem=function(text){return"<li>"+text+"</li>\n"};Renderer.prototype.paragraph=function(text){return"<p>"+text+"</p>\n"};Renderer.prototype.table=function(header,body){return"<table>\n"+"<thead>\n"+header+"</thead>\n"+"<tbody>\n"+body+"</tbody>\n"+"</table>\n"};Renderer.prototype.tablerow=function(content){return"<tr>\n"+content+"</tr>\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"</"+type+">\n"};Renderer.prototype.strong=function(text){return"<strong>"+text+"</strong>"};Renderer.prototype.em=function(text){return"<em>"+text+"</em>"};Renderer.prototype.codespan=function(text){return"<code>"+text+"</code>"};Renderer.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"};Renderer.prototype.del=function(text){return"<del>"+text+"</del>"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='<a href="'+href+'"';if(title){out+=' title="'+title+'"'}out+=">"+text+"</a>";return out};Renderer.prototype.image=function(href,title,text){var out='<img src="'+href+'" alt="'+text+'"';if(title){out+=' title="'+title+'"'}out+=this.options.xhtml?"/>":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell="";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case"blockquote_start":{var body="";while(this.next().type!=="blockquote_end"){body+=this.tok()}return this.renderer.blockquote(body)}case"list_start":{var body="",ordered=this.token.ordered;while(this.next().type!=="list_end"){body+=this.tok()}return this.renderer.list(body,ordered)}case"list_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.token.type==="text"?this.parseText():this.tok()}return this.renderer.listitem(body)}case"loose_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.tok()}return this.renderer.listitem(body)}case"html":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case"paragraph":{return this.renderer.paragraph(this.inline.output(this.token.text))}case"text":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(err){if(err){opt.highlight=highlight;return callback(err)}var out;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!=="code"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(err)return done(err);if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";if((opt||marked.defaults).silent){return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); \ No newline at end of file
diff --git a/lib/base.php b/lib/base.php
index 386fc0a5760..3ba0755eaab 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -669,9 +669,6 @@ class OC {
OC\Log\ErrorHandler::register($debug);
}
- // register the stream wrappers
- stream_wrapper_register('close', 'OC\Files\Stream\Close');
-
\OC::$server->getEventLogger()->start('init_session', 'Initialize session');
OC_App::loadApps(array('session'));
if (!self::$CLI) {
@@ -751,9 +748,6 @@ class OC {
self::registerCacheHooks();
self::registerFilesystemHooks();
- if ($systemConfig->getValue('enable_previews', true)) {
- self::registerPreviewHooks();
- }
self::registerShareHooks();
self::registerLogRotate();
self::registerEncryptionWrapper();
@@ -890,7 +884,7 @@ class OC {
if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) {
//don't try to do this before we are properly setup
//use custom logfile path if defined, otherwise use default of nextcloud.log in data directory
- \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/nextcloud.log'));
+ \OC::$server->getJobList()->add('OC\Log\Rotate');
}
}
@@ -904,20 +898,6 @@ class OC {
}
/**
- * register hooks for previews
- */
- public static function registerPreviewHooks() {
- OC_Hook::connect('OC_Filesystem', 'post_write', 'OC\Preview', 'post_write');
- OC_Hook::connect('OC_Filesystem', 'delete', 'OC\Preview', 'prepare_delete_files');
- OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete');
- OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete');
- OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files');
- OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions');
- OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
- OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions');
- }
-
- /**
* register hooks for sharing
*/
public static function registerShareHooks() {
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index c32383521fd..d0ca4646e52 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -56,6 +56,7 @@ return array(
'OCP\\App\\ManagerEvent' => $baseDir . '/lib/public/App/ManagerEvent.php',
'OCP\\Authentication\\IApacheBackend' => $baseDir . '/lib/public/Authentication/IApacheBackend.php',
'OCP\\Authentication\\TwoFactorAuth\\IProvider' => $baseDir . '/lib/public/Authentication/TwoFactorAuth/IProvider.php',
+ 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorException' => $baseDir . '/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php',
'OCP\\AutoloadNotAllowedException' => $baseDir . '/lib/public/AutoloadNotAllowedException.php',
'OCP\\BackgroundJob' => $baseDir . '/lib/public/BackgroundJob.php',
'OCP\\BackgroundJob\\IJob' => $baseDir . '/lib/public/BackgroundJob/IJob.php',
@@ -554,7 +555,6 @@ return array(
'OC\\Files\\Storage\\Wrapper\\PermissionsMask' => $baseDir . '/lib/private/Files/Storage/Wrapper/PermissionsMask.php',
'OC\\Files\\Storage\\Wrapper\\Quota' => $baseDir . '/lib/private/Files/Storage/Wrapper/Quota.php',
'OC\\Files\\Storage\\Wrapper\\Wrapper' => $baseDir . '/lib/private/Files/Storage/Wrapper/Wrapper.php',
- 'OC\\Files\\Stream\\Close' => $baseDir . '/lib/private/Files/Stream/Close.php',
'OC\\Files\\Stream\\Encryption' => $baseDir . '/lib/private/Files/Stream/Encryption.php',
'OC\\Files\\Stream\\Quota' => $baseDir . '/lib/private/Files/Stream/Quota.php',
'OC\\Files\\Type\\Detection' => $baseDir . '/lib/private/Files/Type/Detection.php',
@@ -630,7 +630,6 @@ return array(
'OC\\OCS\\PrivateData' => $baseDir . '/lib/private/OCS/PrivateData.php',
'OC\\OCS\\Provider' => $baseDir . '/lib/private/OCS/Provider.php',
'OC\\OCS\\Result' => $baseDir . '/lib/private/OCS/Result.php',
- 'OC\\Preview' => $baseDir . '/lib/private/Preview.php',
'OC\\PreviewManager' => $baseDir . '/lib/private/PreviewManager.php',
'OC\\PreviewNotAvailableException' => $baseDir . '/lib/private/PreviewNotAvailableException.php',
'OC\\Preview\\BMP' => $baseDir . '/lib/private/Preview/BMP.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index ad5e39326ab..6fe9a95c249 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -86,6 +86,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\App\\ManagerEvent' => __DIR__ . '/../../..' . '/lib/public/App/ManagerEvent.php',
'OCP\\Authentication\\IApacheBackend' => __DIR__ . '/../../..' . '/lib/public/Authentication/IApacheBackend.php',
'OCP\\Authentication\\TwoFactorAuth\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Authentication/TwoFactorAuth/IProvider.php',
+ 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorException' => __DIR__ . '/../../..' . '/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php',
'OCP\\AutoloadNotAllowedException' => __DIR__ . '/../../..' . '/lib/public/AutoloadNotAllowedException.php',
'OCP\\BackgroundJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob.php',
'OCP\\BackgroundJob\\IJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/IJob.php',
@@ -584,7 +585,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Files\\Storage\\Wrapper\\PermissionsMask' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/PermissionsMask.php',
'OC\\Files\\Storage\\Wrapper\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/Quota.php',
'OC\\Files\\Storage\\Wrapper\\Wrapper' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/Wrapper.php',
- 'OC\\Files\\Stream\\Close' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Close.php',
'OC\\Files\\Stream\\Encryption' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Encryption.php',
'OC\\Files\\Stream\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Quota.php',
'OC\\Files\\Type\\Detection' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Detection.php',
@@ -660,7 +660,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\OCS\\PrivateData' => __DIR__ . '/../../..' . '/lib/private/OCS/PrivateData.php',
'OC\\OCS\\Provider' => __DIR__ . '/../../..' . '/lib/private/OCS/Provider.php',
'OC\\OCS\\Result' => __DIR__ . '/../../..' . '/lib/private/OCS/Result.php',
- 'OC\\Preview' => __DIR__ . '/../../..' . '/lib/private/Preview.php',
'OC\\PreviewManager' => __DIR__ . '/../../..' . '/lib/private/PreviewManager.php',
'OC\\PreviewNotAvailableException' => __DIR__ . '/../../..' . '/lib/private/PreviewNotAvailableException.php',
'OC\\Preview\\BMP' => __DIR__ . '/../../..' . '/lib/private/Preview/BMP.php',
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index 11fae69eafb..ff0b5705cea 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -8,6 +8,10 @@ OC.L10N.register(
"The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Soubory aplikace %$1s nebyly řádně nahrazeny. Ujistěte se, že je to verze kompatibilní se serverem.",
"Sample configuration detected" : "Byla detekována vzorová konfigurace",
"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" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php",
+ "%1$s and %2$s" : "%1$s a %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s a %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
"%sbit or higher PHP required." : "Je vyžadováno PHP %sbit nebo vyšší.",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index 3d7cef315cc..ae66663d49c 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -6,6 +6,10 @@
"The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Soubory aplikace %$1s nebyly řádně nahrazeny. Ujistěte se, že je to verze kompatibilní se serverem.",
"Sample configuration detected" : "Byla detekována vzorová konfigurace",
"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" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php",
+ "%1$s and %2$s" : "%1$s a %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s a %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
"%sbit or higher PHP required." : "Je vyžadováno PHP %sbit nebo vyšší.",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index a0c048ef6da..794e2648b2b 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -53,7 +53,7 @@ OC.L10N.register(
"%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s geben Sie den Datenbank-Namen an.",
"%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten",
- "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.",
+ "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht hergestellt werden.",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
"DB Error: \"%s\"" : "DB-Fehler: „%s“",
"Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
@@ -65,7 +65,7 @@ OC.L10N.register(
"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." : "Es scheint, dass diese %s-Instanz unter einer 32-Bit-PHP-Umgebung läuft und open_basedir in der Datei php.ini konfiguriert worden ist. Von einem solchen Betrieb wird dringend abgeraten, weil es dabei zu Problemen mit Dateien kommt, deren Größe 4 GB übersteigt.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Bitte entfernen Sie die open_basedir-Einstellung in Ihrer php.ini oder wechseln Sie zu 64-Bit-PHP.",
"Set an admin username." : "Einen Administrator-Benutzernamen setzen.",
- "Set an admin password." : "Setze Administrator Passwort",
+ "Set an admin password." : "Ein Administrator-Passwort setzen.",
"Can't create or write into the data directory %s" : "Das Datenverzeichnis %s kann nicht erstellt oder es kann darin nicht geschrieben werden.",
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"%s shared »%s« with you" : "%s hat „%s“ mit Ihnen geteilt",
@@ -153,7 +153,7 @@ OC.L10N.register(
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Nur die folgenden Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“, and „_.@-'“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"Username contains whitespace at the beginning or at the end" : "Benutzername enthält Leerzeichen am Anfang oder Ende",
- "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
+ "A valid password must be provided" : "Es muss ein gültiges Passwort eingegeben werden",
"The username is already being used" : "Der Benutzername existiert bereits",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
"User disabled" : "Nutzer deaktiviert",
@@ -167,17 +167,17 @@ OC.L10N.register(
"App '%s' could not be installed!" : "'%s' - App konnte nicht installiert werden!",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Die App „%s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %s",
"a safe home for all your data" : "ein sicherer Ort für all Ihre Daten",
- "File is currently busy, please try again later" : "Die Datei ist zur Zeit in Benutzung, bitte versuchen Sie es später noch einmal",
+ "File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuchen Sie es später noch einmal",
"Can't read file" : "Datei kann nicht gelesen werden",
"Application is not enabled" : "Die Anwendung ist nicht aktiviert",
"Authentication error" : "Authentifizierungsfehler",
"Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.",
"Unknown user" : "Unbekannter Benutzer",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Keine Datenbanktreiber (SQLite, MYSQL oder PostgreSQL) installiert.",
- "Cannot write into \"config\" directory" : "Das Schreiben in das „config“-Verzeichnis ist nicht möglich",
- "Cannot write into \"apps\" directory" : "Das Schreiben in das „apps“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das App-Verzeichnis gegeben wird%s oder der App Store in der Konfigurationsdatei deaktiviert wird.",
- "Cannot create \"data\" directory (%s)" : "Das Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
+ "Cannot create \"data\" directory (%s)" : "Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
"This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\">Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>.",
"Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Berechtigungen können normalerweise repariert werden, indem dem Webserver %s Schreibzugriff auf das Wurzelverzeichnis %s gegeben wird.",
"Setting locale to %s failed" : "Das Setzen der Umgebungslokale auf %s fehlgeschlagen",
@@ -217,7 +217,7 @@ OC.L10N.register(
"No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
"Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
"Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App does not provide an info.xml file" : "Die Anwendung enthält keine info.xml Datei",
"App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
"App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index ef1c75fb152..6228b9645ac 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -51,7 +51,7 @@
"%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s geben Sie den Datenbank-Namen an.",
"%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten",
- "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.",
+ "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht hergestellt werden.",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
"DB Error: \"%s\"" : "DB-Fehler: „%s“",
"Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
@@ -63,7 +63,7 @@
"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." : "Es scheint, dass diese %s-Instanz unter einer 32-Bit-PHP-Umgebung läuft und open_basedir in der Datei php.ini konfiguriert worden ist. Von einem solchen Betrieb wird dringend abgeraten, weil es dabei zu Problemen mit Dateien kommt, deren Größe 4 GB übersteigt.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Bitte entfernen Sie die open_basedir-Einstellung in Ihrer php.ini oder wechseln Sie zu 64-Bit-PHP.",
"Set an admin username." : "Einen Administrator-Benutzernamen setzen.",
- "Set an admin password." : "Setze Administrator Passwort",
+ "Set an admin password." : "Ein Administrator-Passwort setzen.",
"Can't create or write into the data directory %s" : "Das Datenverzeichnis %s kann nicht erstellt oder es kann darin nicht geschrieben werden.",
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"%s shared »%s« with you" : "%s hat „%s“ mit Ihnen geteilt",
@@ -151,7 +151,7 @@
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Nur die folgenden Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“, and „_.@-'“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"Username contains whitespace at the beginning or at the end" : "Benutzername enthält Leerzeichen am Anfang oder Ende",
- "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
+ "A valid password must be provided" : "Es muss ein gültiges Passwort eingegeben werden",
"The username is already being used" : "Der Benutzername existiert bereits",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
"User disabled" : "Nutzer deaktiviert",
@@ -165,17 +165,17 @@
"App '%s' could not be installed!" : "'%s' - App konnte nicht installiert werden!",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Die App „%s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %s",
"a safe home for all your data" : "ein sicherer Ort für all Ihre Daten",
- "File is currently busy, please try again later" : "Die Datei ist zur Zeit in Benutzung, bitte versuchen Sie es später noch einmal",
+ "File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuchen Sie es später noch einmal",
"Can't read file" : "Datei kann nicht gelesen werden",
"Application is not enabled" : "Die Anwendung ist nicht aktiviert",
"Authentication error" : "Authentifizierungsfehler",
"Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.",
"Unknown user" : "Unbekannter Benutzer",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Keine Datenbanktreiber (SQLite, MYSQL oder PostgreSQL) installiert.",
- "Cannot write into \"config\" directory" : "Das Schreiben in das „config“-Verzeichnis ist nicht möglich",
- "Cannot write into \"apps\" directory" : "Das Schreiben in das „apps“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das App-Verzeichnis gegeben wird%s oder der App Store in der Konfigurationsdatei deaktiviert wird.",
- "Cannot create \"data\" directory (%s)" : "Das Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
+ "Cannot create \"data\" directory (%s)" : "Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
"This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\">Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>.",
"Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Berechtigungen können normalerweise repariert werden, indem dem Webserver %s Schreibzugriff auf das Wurzelverzeichnis %s gegeben wird.",
"Setting locale to %s failed" : "Das Setzen der Umgebungslokale auf %s fehlgeschlagen",
@@ -215,7 +215,7 @@
"No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
"Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
"Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App does not provide an info.xml file" : "Die Anwendung enthält keine info.xml Datei",
"App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
"App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js
index 3fab4582a28..91bfe834f95 100644
--- a/lib/l10n/sk_SK.js
+++ b/lib/l10n/sk_SK.js
@@ -16,6 +16,8 @@ OC.L10N.register(
"Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.",
"Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
+ "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
+ "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
"today" : "dnes",
@@ -80,6 +82,7 @@ OC.L10N.register(
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend",
"Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený",
"Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený",
+ "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ",
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
"Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s",
@@ -134,8 +137,10 @@ OC.L10N.register(
"Dec." : "Dec.",
"Apps" : "Aplikácie",
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
+ "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
+ "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou",
"User disabled" : "Používateľ zakázaný",
"Help" : "Pomoc",
"Personal" : "Osobné",
diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json
index eb02b2ad93b..f67c99dd28c 100644
--- a/lib/l10n/sk_SK.json
+++ b/lib/l10n/sk_SK.json
@@ -14,6 +14,8 @@
"Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.",
"Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
+ "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
+ "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
"today" : "dnes",
@@ -78,6 +80,7 @@
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend",
"Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený",
"Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený",
+ "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ",
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
"Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s",
@@ -132,8 +135,10 @@
"Dec." : "Dec.",
"Apps" : "Aplikácie",
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
+ "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
+ "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou",
"User disabled" : "Používateľ zakázaný",
"Help" : "Pomoc",
"Personal" : "Osobné",
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
index e8515196205..af52142692c 100644
--- a/lib/l10n/sv.js
+++ b/lib/l10n/sv.js
@@ -158,7 +158,7 @@ OC.L10N.register(
"Login canceled by app" : "Inloggningen avbruten av appen",
"User disabled" : "Användare inaktiverad",
"Help" : "Hjälp",
- "Personal" : "Personligt",
+ "Personal" : "Personliga Inställningar",
"Users" : "Användare",
"Admin" : "Administration",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Applikationen \"%s\" kan ej installeras eftersom informationen från appen ej kunde läsas.",
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
index bfbafe34ffc..ac8d56e125f 100644
--- a/lib/l10n/sv.json
+++ b/lib/l10n/sv.json
@@ -156,7 +156,7 @@
"Login canceled by app" : "Inloggningen avbruten av appen",
"User disabled" : "Användare inaktiverad",
"Help" : "Hjälp",
- "Personal" : "Personligt",
+ "Personal" : "Personliga Inställningar",
"Users" : "Användare",
"Admin" : "Administration",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Applikationen \"%s\" kan ej installeras eftersom informationen från appen ej kunde läsas.",
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index 4e13d70371b..1f59e677a54 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -68,7 +68,7 @@ class AllConfig implements \OCP\IConfig {
/**
* @param SystemConfig $systemConfig
*/
- function __construct(SystemConfig $systemConfig) {
+ public function __construct(SystemConfig $systemConfig) {
$this->userCache = new CappedMemoryCache();
$this->systemConfig = $systemConfig;
}
@@ -358,12 +358,17 @@ class AllConfig implements \OCP\IConfig {
* ]
*/
private function getUserValues($userId) {
- // TODO - FIXME
- $this->fixDIInit();
-
if (isset($this->userCache[$userId])) {
return $this->userCache[$userId];
}
+ if ($userId === null || $userId === '') {
+ $this->userCache[$userId]=array();
+ return $this->userCache[$userId];
+ }
+
+ // TODO - FIXME
+ $this->fixDIInit();
+
$data = array();
$query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?';
$result = $this->connection->executeQuery($query, array($userId));
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index d92e8965b5c..4e102522550 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -1,5 +1,6 @@
<?php
/**
+ * @copyright Copyright (c) 2017, Joas Schilling <coding@schilljs.com>
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
@@ -29,7 +30,9 @@
namespace OC;
+use OC\DB\OracleConnection;
use OCP\IAppConfig;
+use OCP\IConfig;
use OCP\IDBConnection;
/**
@@ -37,12 +40,25 @@ use OCP\IDBConnection;
* database.
*/
class AppConfig implements IAppConfig {
- /**
- * @var \OCP\IDBConnection $conn
- */
+
+ /** @var array[] */
+ protected $sensitiveValues = [
+ 'spreed' => [
+ 'turn_server_secret',
+ ],
+ 'user_ldap' => [
+ 'ldap_agent_password',
+ ],
+ ];
+
+ /** @var \OCP\IDBConnection */
protected $conn;
- private $cache = array();
+ /** @var array[] */
+ private $cache = [];
+
+ /** @var bool */
+ private $configLoaded = false;
/**
* @param IDBConnection $conn
@@ -85,6 +101,7 @@ class AppConfig implements IAppConfig {
*
* @param string $app the app we are looking for
* @return array an array of key names
+ * @deprecated 8.0.0 use method getAppKeys of \OCP\IConfig
*
* This function gets all keys of an app. Please note that the values are
* not returned.
@@ -112,6 +129,7 @@ class AppConfig implements IAppConfig {
* @param string $key key
* @param string $default = null, default value if the key does not exist
* @return string the value or $default
+ * @deprecated 8.0.0 use method getAppValue of \OCP\IConfig
*
* This function gets a value from the appconfig table. If the key does
* not exist the default value will be returned
@@ -146,6 +164,7 @@ class AppConfig implements IAppConfig {
* @param string $key key
* @param string|float|int $value value
* @return bool True if the value was inserted or updated, false if the value was the same
+ * @deprecated 8.0.0 use method setAppValue of \OCP\IConfig
*/
public function setValue($app, $key, $value) {
if (!$this->hasKey($app, $key)) {
@@ -182,7 +201,7 @@ class AppConfig implements IAppConfig {
* http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions002.htm#i1033286
* > Large objects (LOBs) are not supported in comparison conditions.
*/
- if (!($this->conn instanceof \OC\DB\OracleConnection)) {
+ if (!($this->conn instanceof OracleConnection)) {
// Only update the value when it is not the same
$sql->andWhere($sql->expr()->neq('configvalue', $sql->createParameter('configvalue')))
->setParameter('configvalue', $value);
@@ -200,7 +219,8 @@ class AppConfig implements IAppConfig {
*
* @param string $app app
* @param string $key key
- * @return boolean|null
+ * @return boolean
+ * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig
*/
public function deleteKey($app, $key) {
$this->loadConfigValues();
@@ -214,13 +234,15 @@ class AppConfig implements IAppConfig {
$sql->execute();
unset($this->cache[$app][$key]);
+ return false;
}
/**
* Remove app from appconfig
*
* @param string $app app
- * @return boolean|null
+ * @return boolean
+ * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig
*
* Removes all keys in appconfig belonging to the app.
*/
@@ -234,6 +256,7 @@ class AppConfig implements IAppConfig {
$sql->execute();
unset($this->cache[$app]);
+ return false;
}
/**
@@ -262,10 +285,30 @@ class AppConfig implements IAppConfig {
}
/**
+ * get all values of the app or and filters out sensitive data
+ *
+ * @param string $app
+ * @return array
+ */
+ public function getFilteredValues($app) {
+ $values = $this->getValues($app, false);
+
+ foreach ($this->sensitiveValues[$app] as $sensitiveKey) {
+ if (isset($values[$sensitiveKey])) {
+ $values[$sensitiveKey] = IConfig::SENSITIVE_VALUE;
+ }
+ }
+
+ return $values;
+ }
+
+ /**
* Load all the app config values
*/
protected function loadConfigValues() {
- if ($this->configLoaded) return;
+ if ($this->configLoaded) {
+ return;
+ }
$this->cache = [];
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index ac42960f54d..57499f3ffe8 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -43,8 +43,10 @@ use OC\AppFramework\Middleware\OCSMiddleware;
use OC\AppFramework\Middleware\Security\SecurityMiddleware;
use OC\AppFramework\Middleware\SessionMiddleware;
use OC\AppFramework\Utility\SimpleContainer;
+use OC\AppFramework\Utility\TimeFactory;
use OC\Core\Middleware\TwoFactorMiddleware;
use OC\RichObjectStrings\Validator;
+use OC\Security\Bruteforce\Throttler;
use OCP\AppFramework\IApi;
use OCP\AppFramework\IAppContainer;
use OCP\Files\IAppData;
@@ -376,20 +378,25 @@ class DIContainer extends SimpleContainer implements IAppContainer {
*/
$app = $this;
$this->registerService('SecurityMiddleware', function($c) use ($app){
+ /** @var \OC\Server $server */
+ $server = $app->getServer();
+
return new SecurityMiddleware(
$c['Request'],
$c['ControllerMethodReflector'],
- $app->getServer()->getNavigationManager(),
- $app->getServer()->getURLGenerator(),
- $app->getServer()->getLogger(),
- $app->getServer()->getSession(),
+ $server->getNavigationManager(),
+ $server->getURLGenerator(),
+ $server->getLogger(),
+ $server->getSession(),
$c['AppName'],
$app->isLoggedIn(),
$app->isAdminUser(),
- $app->getServer()->getContentSecurityPolicyManager(),
- $app->getServer()->getCsrfTokenManager(),
- $app->getServer()->getContentSecurityPolicyNonceManager()
+ $server->getContentSecurityPolicyManager(),
+ $server->getCsrfTokenManager(),
+ $server->getContentSecurityPolicyNonceManager(),
+ $server->getBruteForceThrottler()
);
+
});
$this->registerService('CORSMiddleware', function($c) {
diff --git a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
index d60d5749d57..edba6a3e759 100644
--- a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
@@ -36,6 +36,7 @@ use OC\AppFramework\Middleware\Security\Exceptions\NotConfirmedException;
use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException;
use OC\AppFramework\Middleware\Security\Exceptions\StrictCookieMissingException;
use OC\AppFramework\Utility\ControllerMethodReflector;
+use OC\Security\Bruteforce\Throttler;
use OC\Security\CSP\ContentSecurityPolicyManager;
use OC\Security\CSP\ContentSecurityPolicyNonceManager;
use OC\Security\CSRF\CsrfTokenManager;
@@ -87,6 +88,8 @@ class SecurityMiddleware extends Middleware {
private $csrfTokenManager;
/** @var ContentSecurityPolicyNonceManager */
private $cspNonceManager;
+ /** @var Throttler */
+ private $throttler;
/**
* @param IRequest $request
@@ -101,6 +104,7 @@ class SecurityMiddleware extends Middleware {
* @param ContentSecurityPolicyManager $contentSecurityPolicyManager
* @param CSRFTokenManager $csrfTokenManager
* @param ContentSecurityPolicyNonceManager $cspNonceManager
+ * @param Throttler $throttler
*/
public function __construct(IRequest $request,
ControllerMethodReflector $reflector,
@@ -113,7 +117,8 @@ class SecurityMiddleware extends Middleware {
$isAdminUser,
ContentSecurityPolicyManager $contentSecurityPolicyManager,
CsrfTokenManager $csrfTokenManager,
- ContentSecurityPolicyNonceManager $cspNonceManager) {
+ ContentSecurityPolicyNonceManager $cspNonceManager,
+ Throttler $throttler) {
$this->navigationManager = $navigationManager;
$this->request = $request;
$this->reflector = $reflector;
@@ -126,6 +131,7 @@ class SecurityMiddleware extends Middleware {
$this->contentSecurityPolicyManager = $contentSecurityPolicyManager;
$this->csrfTokenManager = $csrfTokenManager;
$this->cspNonceManager = $cspNonceManager;
+ $this->throttler = $throttler;
}
@@ -185,6 +191,12 @@ class SecurityMiddleware extends Middleware {
}
}
+ if($this->reflector->hasAnnotation('BruteForceProtection')) {
+ $action = $this->reflector->getAnnotationParameter('BruteForceProtection');
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), $action);
+ $this->throttler->registerAttempt($action, $this->request->getRemoteAddress());
+ }
+
/**
* FIXME: Use DI once available
* Checks if app is enabled (also includes a check whether user is allowed to access the resource)
diff --git a/lib/private/AppFramework/Utility/ControllerMethodReflector.php b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
index 33a117d8121..034fc3a1759 100644
--- a/lib/private/AppFramework/Utility/ControllerMethodReflector.php
+++ b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
@@ -55,8 +55,10 @@ class ControllerMethodReflector implements IControllerMethodReflector{
$docs = $reflection->getDocComment();
// extract everything prefixed by @ and first letter uppercase
- preg_match_all('/@([A-Z]\w+)/', $docs, $matches);
- $this->annotations = $matches[1];
+ preg_match_all('/^\h+\*\h+@(?P<annotation>[A-Z]\w+)(\h+(?P<parameter>\w+))?$/m', $docs, $matches);
+ foreach($matches['annotation'] as $key => $annontation) {
+ $this->annotations[$annontation] = $matches['parameter'][$key];
+ }
// extract type parameter information
preg_match_all('/@param\h+(?P<type>\w+)\h+\$(?P<var>\w+)/', $docs, $matches);
@@ -112,7 +114,22 @@ class ControllerMethodReflector implements IControllerMethodReflector{
* @return bool true if the annotation is found
*/
public function hasAnnotation($name){
- return in_array($name, $this->annotations);
+ return array_key_exists($name, $this->annotations);
+ }
+
+
+ /**
+ * Get optional annotation parameter
+ * @param string $name the name of the annotation
+ * @return string
+ */
+ public function getAnnotationParameter($name){
+ $parameter = '';
+ if($this->hasAnnotation($name)) {
+ $parameter = $this->annotations[$name];
+ }
+
+ return $parameter;
}
diff --git a/lib/private/Archive/TAR.php b/lib/private/Archive/TAR.php
index bbd24bd05a1..07ccd09f399 100644
--- a/lib/private/Archive/TAR.php
+++ b/lib/private/Archive/TAR.php
@@ -33,6 +33,8 @@
namespace OC\Archive;
+use Icewind\Streams\CallbackWrapper;
+
class TAR extends Archive {
const PLAIN = 0;
const GZIP = 1;
@@ -359,22 +361,19 @@ class TAR extends Archive {
if ($mode == 'r' or $mode == 'rb') {
return fopen($tmpFile, $mode);
} else {
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
- self::$tempFiles[$tmpFile] = $path;
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
- private static $tempFiles = array();
-
/**
* write back temporary files
*/
- function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $this->addFile(self::$tempFiles[$tmpFile], $tmpFile);
- unlink($tmpFile);
- }
+ function writeBack($tmpFile, $path) {
+ $this->addFile($path, $tmpFile);
+ unlink($tmpFile);
}
/**
diff --git a/lib/private/Archive/ZIP.php b/lib/private/Archive/ZIP.php
index 9e9fe40b2b4..0ed0f48acc4 100644
--- a/lib/private/Archive/ZIP.php
+++ b/lib/private/Archive/ZIP.php
@@ -31,6 +31,8 @@
namespace OC\Archive;
+use Icewind\Streams\CallbackWrapper;
+
class ZIP extends Archive{
/**
* @var \ZipArchive zip
@@ -198,24 +200,22 @@ class ZIP extends Archive{
$ext='';
}
$tmpFile=\OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if($this->fileExists($path)) {
$this->extractFile($path, $tmpFile);
}
- self::$tempFiles[$tmpFile]=$path;
- return fopen('close://'.$tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
- private static $tempFiles=array();
/**
* write back temporary files
*/
- function writeBack($tmpFile) {
- if(isset(self::$tempFiles[$tmpFile])) {
- $this->addFile(self::$tempFiles[$tmpFile], $tmpFile);
- unlink($tmpFile);
- }
+ function writeBack($tmpFile, $path) {
+ $this->addFile($path, $tmpFile);
+ unlink($tmpFile);
}
/**
diff --git a/lib/private/Encryption/Keys/Storage.php b/lib/private/Encryption/Keys/Storage.php
index 8149ffe9dce..e8d152581fe 100644
--- a/lib/private/Encryption/Keys/Storage.php
+++ b/lib/private/Encryption/Keys/Storage.php
@@ -51,6 +51,9 @@ class Storage implements IStorage {
/** @var string */
private $encryption_base_dir;
+ /** @var string */
+ private $backup_base_dir;
+
/** @var array */
private $keyCache = [];
@@ -64,6 +67,7 @@ class Storage implements IStorage {
$this->encryption_base_dir = '/files_encryption';
$this->keys_base_dir = $this->encryption_base_dir .'/keys';
+ $this->backup_base_dir = $this->encryption_base_dir .'/backup';
$this->root_dir = $this->util->getKeyStorageRoot();
}
@@ -287,6 +291,37 @@ class Storage implements IStorage {
}
/**
+ * backup keys of a given encryption module
+ *
+ * @param string $encryptionModuleId
+ * @param string $purpose
+ * @param string $uid
+ * @return bool
+ * @since 12.0.0
+ */
+ public function backupUserKeys($encryptionModuleId, $purpose, $uid) {
+ $source = $uid . $this->encryption_base_dir . '/' . $encryptionModuleId;
+ $backupDir = $uid . $this->backup_base_dir;
+ if (!$this->view->file_exists($backupDir)) {
+ $this->view->mkdir($backupDir);
+ }
+
+ $backupDir = $backupDir . '/' . $purpose . '.' . $encryptionModuleId . '.' . $this->getTimestamp();
+ $this->view->mkdir($backupDir);
+
+ return $this->view->copy($source, $backupDir);
+ }
+
+ /**
+ * get the current timestamp
+ *
+ * @return int
+ */
+ protected function getTimestamp() {
+ return time();
+ }
+
+ /**
* get system wide path and detect mount points
*
* @param string $path
diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index 2dcf830cc1e..ab77c21e6c4 100644
--- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
@@ -25,16 +25,12 @@
namespace OC\Files\ObjectStore;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
use OC\Files\Cache\CacheEntry;
use OCP\Files\ObjectStore\IObjectStore;
class ObjectStoreStorage extends \OC\Files\Storage\Common {
-
- /**
- * @var array
- */
- private static $tmpFiles = array();
/**
* @var \OCP\Files\ObjectStore\IObjectStore $objectStore
*/
@@ -291,14 +287,14 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
$ext = '';
}
$tmpFile = \OC::$server->getTempManager()->getTemporaryFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
file_put_contents($tmpFile, $source);
}
- self::$tmpFiles[$tmpFile] = $path;
-
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
return false;
}
@@ -368,12 +364,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
return true;
}
- public function writeBack($tmpFile) {
- if (!isset(self::$tmpFiles[$tmpFile])) {
- return;
- }
-
- $path = self::$tmpFiles[$tmpFile];
+ public function writeBack($tmpFile, $path) {
$stat = $this->stat($path);
if (empty($stat)) {
// create new file
diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php
index ea4bbba2748..abe219f99f2 100644
--- a/lib/private/Files/Storage/DAV.php
+++ b/lib/private/Files/Storage/DAV.php
@@ -36,6 +36,7 @@ namespace OC\Files\Storage;
use Exception;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Message\ResponseInterface;
+use Icewind\Streams\CallbackWrapper;
use OC\Files\Filesystem;
use OC\Files\Stream\Close;
use Icewind\Streams\IteratorDirectory;
@@ -48,7 +49,6 @@ use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
use OCP\Util;
use Sabre\DAV\Client;
-use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\Xml\Property\ResourceType;
use Sabre\HTTP\ClientException;
use Sabre\HTTP\ClientHttpException;
@@ -77,8 +77,6 @@ class DAV extends Common {
private $client;
/** @var ArrayCache */
private $statCache;
- /** @var array */
- private static $tempFiles = [];
/** @var \OCP\Http\Client\IClientService */
private $httpClientService;
@@ -203,13 +201,15 @@ class DAV extends Common {
$this->init();
$path = $this->cleanPath($path);
try {
- $response = $this->client->propfind(
+ $response = $this->client->propFind(
$this->encodePath($path),
- array(),
+ [],
1
);
- $id = md5('webdav' . $this->root . $path);
- $content = array();
+ if ($response === false) {
+ return false;
+ }
+ $content = [];
$files = array_keys($response);
array_shift($files); //the first entry is the current directory
@@ -226,13 +226,6 @@ class DAV extends Common {
$content[] = $file;
}
return IteratorDirectory::wrap($content);
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- $this->statCache->clear($path . '/');
- $this->statCache->set($path, false);
- return false;
- }
- $this->convertException($e, $path);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -247,22 +240,18 @@ class DAV extends Common {
*
* @param string $path path to propfind
*
- * @return array propfind response
+ * @return array|boolean propfind response or false if the entry was not found
*
- * @throws NotFound
+ * @throws ClientHttpException
*/
protected function propfind($path) {
$path = $this->cleanPath($path);
$cachedResponse = $this->statCache->get($path);
- if ($cachedResponse === false) {
- // we know it didn't exist
- throw new NotFound();
- }
// we either don't know it, or we know it exists but need more details
if (is_null($cachedResponse) || $cachedResponse === true) {
$this->init();
try {
- $response = $this->client->propfind(
+ $response = $this->client->propFind(
$this->encodePath($path),
array(
'{DAV:}getlastmodified',
@@ -275,11 +264,15 @@ class DAV extends Common {
)
);
$this->statCache->set($path, $response);
- } catch (NotFound $e) {
- // remember that this path did not exist
- $this->statCache->clear($path . '/');
- $this->statCache->set($path, false);
- throw $e;
+ } catch (ClientHttpException $e) {
+ if ($e->getHttpStatus() === 404) {
+ $this->statCache->clear($path . '/');
+ $this->statCache->set($path, false);
+ return false;
+ }
+ $this->convertException($e, $path);
+ } catch (\Exception $e) {
+ $this->convertException($e, $path);
}
} else {
$response = $cachedResponse;
@@ -291,17 +284,15 @@ class DAV extends Common {
public function filetype($path) {
try {
$response = $this->propfind($path);
- $responseType = array();
+ if ($response === false) {
+ return false;
+ }
+ $responseType = [];
if (isset($response["{DAV:}resourcetype"])) {
/** @var ResourceType[] $response */
$responseType = $response["{DAV:}resourcetype"]->getValue();
}
return (count($responseType) > 0 and $responseType[0] == "{DAV:}collection") ? 'dir' : 'file';
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return false;
- }
- $this->convertException($e, $path);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -320,13 +311,7 @@ class DAV extends Common {
return true;
}
// need to get from server
- $this->propfind($path);
- return true; //no 404 exception
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return false;
- }
- $this->convertException($e, $path);
+ return ($this->propfind($path) !== false);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -409,20 +394,19 @@ class DAV extends Common {
}
$tmpFile = $tempManager->getTemporaryFile($ext);
}
- Close::registerCallback($tmpFile, array($this, 'writeBack'));
- self::$tempFiles[$tmpFile] = $path;
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
/**
* @param string $tmpFile
*/
- public function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]);
- unlink($tmpFile);
- }
+ public function writeBack($tmpFile, $path) {
+ $this->uploadFile($tmpFile, $path);
+ unlink($tmpFile);
}
/** {@inheritdoc} */
@@ -431,7 +415,10 @@ class DAV extends Common {
$path = $this->cleanPath($path);
try {
// TODO: cacheable ?
- $response = $this->client->propfind($this->encodePath($path), array('{DAV:}quota-available-bytes'));
+ $response = $this->client->propfind($this->encodePath($path), ['{DAV:}quota-available-bytes']);
+ if ($response === false) {
+ return FileInfo::SPACE_UNKNOWN;
+ }
if (isset($response['{DAV:}quota-available-bytes'])) {
return (int)$response['{DAV:}quota-available-bytes'];
} else {
@@ -457,6 +444,9 @@ class DAV extends Common {
$this->client->proppatch($this->encodePath($path), ['{DAV:}lastmodified' => $mtime]);
// non-owncloud clients might not have accepted the property, need to recheck it
$response = $this->client->propfind($this->encodePath($path), ['{DAV:}getlastmodified'], 0);
+ if ($response === false) {
+ return false;
+ }
if (isset($response['{DAV:}getlastmodified'])) {
$remoteMtime = strtotime($response['{DAV:}getlastmodified']);
if ($remoteMtime !== $mtime) {
@@ -579,15 +569,13 @@ class DAV extends Common {
public function stat($path) {
try {
$response = $this->propfind($path);
- return array(
+ if ($response === false) {
+ return [];
+ }
+ return [
'mtime' => strtotime($response['{DAV:}getlastmodified']),
'size' => (int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0,
- );
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return array();
- }
- $this->convertException($e, $path);
+ ];
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -598,7 +586,10 @@ class DAV extends Common {
public function getMimeType($path) {
try {
$response = $this->propfind($path);
- $responseType = array();
+ if ($response === false) {
+ return false;
+ }
+ $responseType = [];
if (isset($response["{DAV:}resourcetype"])) {
/** @var ResourceType[] $response */
$responseType = $response["{DAV:}resourcetype"]->getValue();
@@ -611,11 +602,6 @@ class DAV extends Common {
} else {
return false;
}
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return false;
- }
- $this->convertException($e, $path);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -706,6 +692,9 @@ class DAV extends Common {
$this->init();
$path = $this->cleanPath($path);
$response = $this->propfind($path);
+ if ($response === false) {
+ return 0;
+ }
if (isset($response['{http://owncloud.org/ns}permissions'])) {
return $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
} else if ($this->is_dir($path)) {
@@ -722,6 +711,9 @@ class DAV extends Common {
$this->init();
$path = $this->cleanPath($path);
$response = $this->propfind($path);
+ if ($response === false) {
+ return null;
+ }
if (isset($response['{DAV:}getetag'])) {
return trim($response['{DAV:}getetag'], '"');
}
@@ -765,6 +757,13 @@ class DAV extends Common {
// force refresh for $path
$this->statCache->remove($path);
$response = $this->propfind($path);
+ if ($response === false) {
+ if ($path === '') {
+ // if root is gone it means the storage is not available
+ throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage());
+ }
+ return false;
+ }
if (isset($response['{DAV:}getetag'])) {
$cachedData = $this->getCache()->get($path);
$etag = null;
@@ -787,7 +786,7 @@ class DAV extends Common {
return $remoteMtime > $time;
}
} catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404 || $e->getHttpStatus() === 405) {
+ if ($e->getHttpStatus() === 405) {
if ($path === '') {
// if root is gone it means the storage is not available
throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage());
diff --git a/lib/private/Files/Stream/Close.php b/lib/private/Files/Stream/Close.php
deleted file mode 100644
index 7cc9903c912..00000000000
--- a/lib/private/Files/Stream/Close.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Files\Stream;
-
-/**
- * stream wrapper that provides a callback on stream close
- */
-class Close {
- private static $callBacks = array();
- private $path = '';
- private $source;
- private static $open = array();
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $path = substr($path, strlen('close://'));
- $this->path = $path;
- $this->source = fopen($path, $mode);
- if (is_resource($this->source)) {
- $this->meta = stream_get_meta_data($this->source);
- }
- self::$open[] = $path;
- return is_resource($this->source);
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- return fseek($this->source, $offset, $whence) === 0;
- }
-
- public function stream_tell() {
- return ftell($this->source);
- }
-
- public function stream_read($count) {
- return fread($this->source, $count);
- }
-
- public function stream_write($data) {
- return fwrite($this->source, $data);
- }
-
- public function stream_set_option($option, $arg1, $arg2) {
- switch ($option) {
- case STREAM_OPTION_BLOCKING:
- stream_set_blocking($this->source, $arg1);
- break;
- case STREAM_OPTION_READ_TIMEOUT:
- stream_set_timeout($this->source, $arg1, $arg2);
- break;
- case STREAM_OPTION_WRITE_BUFFER:
- stream_set_write_buffer($this->source, $arg1, $arg2);
- }
- }
-
- public function stream_stat() {
- return fstat($this->source);
- }
-
- public function stream_lock($mode) {
- flock($this->source, $mode);
- }
-
- public function stream_flush() {
- return fflush($this->source);
- }
-
- public function stream_eof() {
- return feof($this->source);
- }
-
- public function url_stat($path) {
- $path = substr($path, strlen('close://'));
- if (file_exists($path)) {
- return stat($path);
- } else {
- return false;
- }
- }
-
- public function stream_close() {
- fclose($this->source);
- if (isset(self::$callBacks[$this->path])) {
- call_user_func(self::$callBacks[$this->path], $this->path);
- }
- }
-
- public function unlink($path) {
- $path = substr($path, strlen('close://'));
- return unlink($path);
- }
-
- /**
- * @param string $path
- */
- public static function registerCallback($path, $callback) {
- self::$callBacks[$path] = $callback;
- }
-}
diff --git a/lib/private/Files/Utils/Scanner.php b/lib/private/Files/Utils/Scanner.php
index d26c601be1a..98e2c3c8ca2 100644
--- a/lib/private/Files/Utils/Scanner.php
+++ b/lib/private/Files/Utils/Scanner.php
@@ -31,6 +31,7 @@ use OC\Files\Filesystem;
use OC\ForbiddenException;
use OC\Hooks\PublicEmitter;
use OC\Lock\DBLockingProvider;
+use OCA\Files_Sharing\SharedStorage;
use OCP\Files\Storage\IStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\ILogger;
@@ -118,14 +119,19 @@ class Scanner extends PublicEmitter {
public function backgroundScan($dir) {
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
- if (is_null($mount->getStorage())) {
+ $storage = $mount->getStorage();
+ if (is_null($storage)) {
continue;
}
// don't scan the root storage
- if ($mount->getStorage()->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') {
+ if ($storage->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') {
+ continue;
+ }
+
+ // don't scan received local shares, these can be scanned when scanning the owner's storage
+ if ($storage->instanceOfStorage(SharedStorage::class)) {
continue;
}
- $storage = $mount->getStorage();
$scanner = $storage->getScanner();
$this->attachListener($mount);
@@ -156,10 +162,10 @@ class Scanner extends PublicEmitter {
}
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
- if (is_null($mount->getStorage())) {
+ $storage = $mount->getStorage();
+ if (is_null($storage)) {
continue;
}
- $storage = $mount->getStorage();
// if the home storage isn't writable then the scanner is run as the wrong user
if ($storage->instanceOfStorage('\OC\Files\Storage\Home') and
(!$storage->isCreatable('') or !$storage->isCreatable('files'))
@@ -171,6 +177,11 @@ class Scanner extends PublicEmitter {
}
}
+
+ // don't scan received local shares, these can be scanned when scanning the owner's storage
+ if ($storage->instanceOfStorage(SharedStorage::class)) {
+ continue;
+ }
$relativePath = $mount->getInternalPath($dir);
$scanner = $storage->getScanner();
$scanner->setUseTransactions(false);
diff --git a/lib/private/Group/Database.php b/lib/private/Group/Database.php
index e4144fdbe20..8be24fc50de 100644
--- a/lib/private/Group/Database.php
+++ b/lib/private/Group/Database.php
@@ -202,6 +202,11 @@ class Database extends \OC\Group\Backend {
* if the user exists at all.
*/
public function getUserGroups( $uid ) {
+ //guests has empty or null $uid
+ if ($uid === null || $uid === '') {
+ return [];
+ }
+
$this->fixDI();
// No magic!
diff --git a/lib/private/Log.php b/lib/private/Log.php
index ef1b70d3cb9..fddd3593127 100644
--- a/lib/private/Log.php
+++ b/lib/private/Log.php
@@ -106,12 +106,8 @@ class Log implements ILogger {
// FIXME: Add this for backwards compatibility, should be fixed at some point probably
if($logger === null) {
- // TODO: Drop backwards compatibility for config in the future
$logType = $this->config->getValue('log_type', 'file');
- if($logType==='owncloud') {
- $logType = 'file';
- }
- $this->logger = 'OC\\Log\\'.ucfirst($logType);
+ $this->logger = static::getLogClass($logType);
call_user_func(array($this->logger, 'init'));
} else {
$this->logger = $logger;
@@ -327,4 +323,26 @@ class Log implements ILogger {
$msg .= ': ' . json_encode($exception);
$this->error($msg, $context);
}
+
+ /**
+ * @param string $logType
+ * @return string
+ * @internal
+ */
+ public static function getLogClass($logType) {
+ switch (strtolower($logType)) {
+ case 'errorlog':
+ return \OC\Log\Errorlog::class;
+ case 'syslog':
+ return \OC\Log\Syslog::class;
+ case 'file':
+ return \OC\Log\File::class;
+
+ // Backwards compatibility for old and fallback for unknown log types
+ case 'owncloud':
+ case 'nextcloud':
+ default:
+ return \OC\Log\File::class;
+ }
+ }
}
diff --git a/lib/private/Log/Rotate.php b/lib/private/Log/Rotate.php
index 6c87c167378..866068433ff 100644
--- a/lib/private/Log/Rotate.php
+++ b/lib/private/Log/Rotate.php
@@ -32,7 +32,9 @@ namespace OC\Log;
*/
class Rotate extends \OC\BackgroundJob\Job {
private $max_log_size;
- public function run($logFile) {
+ public function run($dummy) {
+ $systemConfig = \OC::$server->getSystemConfig();
+ $logFile = $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', \OC::$SERVERROOT . '/data') . '/nextcloud.log');
$this->max_log_size = \OC::$server->getConfig()->getSystemValue('log_rotate_size', false);
if ($this->max_log_size) {
$filesize = @filesize($logFile);
diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php
index df8fa80f2c2..e704e8e3490 100644
--- a/lib/private/Mail/Mailer.php
+++ b/lib/private/Mail/Mailer.php
@@ -200,7 +200,7 @@ class Mailer implements IMailer {
* @return \Swift_SendmailTransport
*/
protected function getSendMailInstance() {
- switch ($this->config->getSystemValue('mail_smtpmode', 'sendmail')) {
+ switch ($this->config->getSystemValue('mail_smtpmode', 'php')) {
case 'qmail':
$binaryPath = '/var/qmail/bin/sendmail';
break;
diff --git a/lib/private/Preview.php b/lib/private/Preview.php
deleted file mode 100644
index caa1e89bacc..00000000000
--- a/lib/private/Preview.php
+++ /dev/null
@@ -1,1349 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Björn Schießle <bjoern@schiessle.org>
- * @author Frank Karlitschek <frank@karlitschek.de>
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Olivier Paroz <github@oparoz.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Tobias Kaminsky <tobias@kaminsky.me>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OC;
-
-use OC\Preview\Provider;
-use OCP\Files\FileInfo;
-use OCP\Files\NotFoundException;
-
-class Preview {
- //the thumbnail folder
- const THUMBNAILS_FOLDER = 'thumbnails';
-
- const MODE_FILL = 'fill';
- const MODE_COVER = 'cover';
-
- //config
- private $maxScaleFactor;
- /** @var int maximum width allowed for a preview */
- private $configMaxWidth;
- /** @var int maximum height allowed for a preview */
- private $configMaxHeight;
-
- //fileview object
- private $fileView = null;
- private $userView = null;
-
- //vars
- private $file;
- private $maxX;
- private $maxY;
- private $scalingUp;
- private $mimeType;
- private $keepAspect = false;
- private $mode = self::MODE_FILL;
-
- //used to calculate the size of the preview to generate
- /** @var int $maxPreviewWidth max width a preview can have */
- private $maxPreviewWidth;
- /** @var int $maxPreviewHeight max height a preview can have */
- private $maxPreviewHeight;
- /** @var int $previewWidth calculated width of the preview we're looking for */
- private $previewWidth;
- /** @var int $previewHeight calculated height of the preview we're looking for */
- private $previewHeight;
-
- //filemapper used for deleting previews
- // index is path, value is fileinfo
- static public $deleteFileMapper = array();
- static public $deleteChildrenMapper = array();
-
- /**
- * preview images object
- *
- * @var \OCP\IImage
- */
- private $preview;
-
- /**
- * @var \OCP\Files\FileInfo
- */
- protected $info;
-
- /**
- * check if thumbnail or bigger version of thumbnail of file is cached
- *
- * @param string $user userid - if no user is given, OC_User::getUser will be used
- * @param string $root path of root
- * @param string $file The path to the file where you want a thumbnail from
- * @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
- *
- * @throws \Exception
- * @return mixed (bool / string)
- * false if thumbnail does not exist
- * path to thumbnail if thumbnail exists
- */
- public function __construct(
- $user = '',
- $root = '/',
- $file = '', $maxX = 1,
- $maxY = 1,
- $scalingUp = true
- ) {
- //init fileviews
- if ($user === '') {
- $user = \OC_User::getUser();
- }
- $this->fileView = new \OC\Files\View('/' . $user . '/' . $root);
- $this->userView = new \OC\Files\View('/' . $user);
-
- //set config
- $sysConfig = \OC::$server->getConfig();
- $this->configMaxWidth = $sysConfig->getSystemValue('preview_max_x', 2048);
- $this->configMaxHeight = $sysConfig->getSystemValue('preview_max_y', 2048);
- $this->maxScaleFactor = $sysConfig->getSystemValue('preview_max_scale_factor', 1);
-
- //save parameters
- $this->setFile($file);
- $this->setMaxX((int)$maxX);
- $this->setMaxY((int)$maxY);
- $this->setScalingup($scalingUp);
-
- $this->preview = null;
-
- //check if there are preview backends
- if (!\OC::$server->getPreviewManager()
- ->hasProviders()
- && \OC::$server->getConfig()
- ->getSystemValue('enable_previews', true)
- ) {
- \OCP\Util::writeLog('core', 'No preview providers exist', \OCP\Util::ERROR);
- throw new \Exception('No preview providers');
- }
- }
-
- /**
- * returns the path of the file you want a thumbnail from
- *
- * @return string
- */
- public function getFile() {
- return $this->file;
- }
-
- /**
- * returns the max width of the preview
- *
- * @return integer
- */
- public function getMaxX() {
- return $this->maxX;
- }
-
- /**
- * returns the max height of the preview
- *
- * @return integer
- */
- public function getMaxY() {
- return $this->maxY;
- }
-
- /**
- * returns whether or not scalingup is enabled
- *
- * @return bool
- */
- public function getScalingUp() {
- return $this->scalingUp;
- }
-
- /**
- * returns the name of the thumbnailfolder
- *
- * @return string
- */
- public function getThumbnailsFolder() {
- return self::THUMBNAILS_FOLDER;
- }
-
- /**
- * returns the max scale factor
- *
- * @return string
- */
- public function getMaxScaleFactor() {
- return $this->maxScaleFactor;
- }
-
- /**
- * returns the max width set in ownCloud's config
- *
- * @return integer
- */
- public function getConfigMaxX() {
- return $this->configMaxWidth;
- }
-
- /**
- * returns the max height set in ownCloud's config
- *
- * @return integer
- */
- public function getConfigMaxY() {
- return $this->configMaxHeight;
- }
-
- /**
- * Returns the FileInfo object associated with the file to preview
- *
- * @return false|Files\FileInfo|\OCP\Files\FileInfo
- */
- protected function getFileInfo() {
- $absPath = $this->fileView->getAbsolutePath($this->file);
- $absPath = Files\Filesystem::normalizePath($absPath);
- if (array_key_exists($absPath, self::$deleteFileMapper)) {
- $this->info = self::$deleteFileMapper[$absPath];
- } else if (!$this->info) {
- $this->info = $this->fileView->getFileInfo($this->file);
- }
-
- return $this->info;
- }
-
-
- /**
- * @return array|null
- */
- private function getChildren() {
- $absPath = $this->fileView->getAbsolutePath($this->file);
- $absPath = Files\Filesystem::normalizePath($absPath);
-
- if (array_key_exists($absPath, self::$deleteChildrenMapper)) {
- return self::$deleteChildrenMapper[$absPath];
- }
-
- return null;
- }
-
- /**
- * Sets the path of the file you want a preview of
- *
- * @param string $file
- * @param \OCP\Files\FileInfo|null $info
- *
- * @return \OC\Preview
- */
- public function setFile($file, $info = null) {
- $this->file = $file;
- $this->info = $info;
-
- if ($file !== '') {
- $this->getFileInfo();
- if ($this->info instanceof \OCP\Files\FileInfo) {
- $this->mimeType = $this->info->getMimetype();
- }
- }
-
- return $this;
- }
-
- /**
- * Forces the use of a specific media type
- *
- * @param string $mimeType
- */
- public function setMimetype($mimeType) {
- $this->mimeType = $mimeType;
- }
-
- /**
- * Sets the max width of the preview. It's capped by the maximum allowed size set in the
- * configuration
- *
- * @param int $maxX
- *
- * @throws \Exception
- * @return \OC\Preview
- */
- public function setMaxX($maxX = 1) {
- if ($maxX <= 0) {
- throw new \Exception('Cannot set width of 0 or smaller!');
- }
- $configMaxX = $this->getConfigMaxX();
- $maxX = $this->limitMaxDim($maxX, $configMaxX, 'maxX');
- $this->maxX = $maxX;
-
- return $this;
- }
-
- /**
- * Sets the max height of the preview. It's capped by the maximum allowed size set in the
- * configuration
- *
- * @param int $maxY
- *
- * @throws \Exception
- * @return \OC\Preview
- */
- public function setMaxY($maxY = 1) {
- if ($maxY <= 0) {
- throw new \Exception('Cannot set height of 0 or smaller!');
- }
- $configMaxY = $this->getConfigMaxY();
- $maxY = $this->limitMaxDim($maxY, $configMaxY, 'maxY');
- $this->maxY = $maxY;
-
- return $this;
- }
-
- /**
- * Sets whether we're allowed to scale up when generating a preview. It's capped by the maximum
- * allowed scale factor set in the configuration
- *
- * @param bool $scalingUp
- *
- * @return \OC\Preview
- */
- public function setScalingup($scalingUp) {
- if ($this->getMaxScaleFactor() === 1) {
- $scalingUp = false;
- }
- $this->scalingUp = $scalingUp;
-
- return $this;
- }
-
- /**
- * Set whether to cover or fill the specified dimensions
- *
- * @param string $mode
- *
- * @return \OC\Preview
- */
- public function setMode($mode) {
- $this->mode = $mode;
-
- return $this;
- }
-
- /**
- * Sets whether we need to generate a preview which keeps the aspect ratio of the original file
- *
- * @param bool $keepAspect
- *
- * @return \OC\Preview
- */
- public function setKeepAspect($keepAspect) {
- $this->keepAspect = $keepAspect;
-
- return $this;
- }
-
- /**
- * Makes sure we were given a file to preview and that it exists in the filesystem
- *
- * @return bool
- */
- public function isFileValid() {
- $file = $this->getFile();
- if ($file === '') {
- \OCP\Util::writeLog('core', 'No filename passed', \OCP\Util::DEBUG);
-
- return false;
- }
-
- if (!$this->getFileInfo() instanceof FileInfo) {
- \OCP\Util::writeLog('core', 'File:"' . $file . '" not found', \OCP\Util::DEBUG);
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Deletes the preview of a file with specific width and height
- *
- * This should never delete the max preview, use deleteAllPreviews() instead
- *
- * @return bool
- */
- public function deletePreview() {
- $fileInfo = $this->getFileInfo();
- if ($fileInfo !== null && $fileInfo !== false) {
- $fileId = $fileInfo->getId();
-
- $previewPath = $this->buildCachePath($fileId);
- if (!strpos($previewPath, 'max')) {
- return $this->userView->unlink($previewPath);
- }
- }
-
- return false;
- }
-
- /**
- * Deletes all previews of a file
- */
- public function deleteAllPreviews() {
- $thumbnailMount = $this->userView->getMount($this->getThumbnailsFolder());
- $propagator = $thumbnailMount->getStorage()->getPropagator();
- $propagator->beginBatch();
-
- $toDelete = $this->getChildren();
- $toDelete[] = $this->getFileInfo();
-
- foreach ($toDelete as $delete) {
- if ($delete instanceof FileInfo) {
- /** @var \OCP\Files\FileInfo $delete */
- $fileId = $delete->getId();
-
- // getId() might return null, e.g. when the file is a
- // .ocTransferId*.part file from chunked file upload.
- if (!empty($fileId)) {
- $previewPath = $this->getPreviewPath($fileId);
- $this->userView->rmdir($previewPath);
- }
- }
- }
-
- $propagator->commitBatch();
- }
-
- /**
- * Checks if a preview matching the asked dimensions or a bigger version is already cached
- *
- * * We first retrieve the size of the max preview since this is what we be used to create
- * all our preview. If it doesn't exist we return false, so that it can be generated
- * * Using the dimensions of the max preview, we calculate what the size of the new
- * thumbnail should be
- * * And finally, we look for a suitable candidate in the cache
- *
- * @param int $fileId fileId of the original file we need a preview of
- *
- * @return string|false path to the cached preview if it exists or false
- */
- public function isCached($fileId) {
- if (is_null($fileId)) {
- return false;
- }
-
- /**
- * Phase 1: Looking for the max preview
- */
- $previewPath = $this->getPreviewPath($fileId);
- // We currently can't look for a single file due to bugs related to #16478
- $allThumbnails = $this->userView->getDirectoryContent($previewPath);
- list($maxPreviewWidth, $maxPreviewHeight) = $this->getMaxPreviewSize($allThumbnails);
-
- // Only use the cache if we have a max preview
- if (!is_null($maxPreviewWidth) && !is_null($maxPreviewHeight)) {
-
- /**
- * Phase 2: Calculating the size of the preview we need to send back
- */
- $this->maxPreviewWidth = $maxPreviewWidth;
- $this->maxPreviewHeight = $maxPreviewHeight;
-
- list($previewWidth, $previewHeight) = $this->simulatePreviewDimensions();
- if (empty($previewWidth) || empty($previewHeight)) {
- return false;
- }
-
- $this->previewWidth = $previewWidth;
- $this->previewHeight = $previewHeight;
-
- /**
- * Phase 3: We look for a preview of the exact size
- */
- // This gives us a calculated path to a preview of asked dimensions
- // thumbnailFolder/fileId/<maxX>-<maxY>(-max|-with-aspect).png
- $preview = $this->buildCachePath($fileId, $previewWidth, $previewHeight);
-
- // This checks if we have a preview of those exact dimensions in the cache
- if ($this->thumbnailSizeExists($allThumbnails, basename($preview))) {
- return $preview;
- }
-
- /**
- * Phase 4: We look for a larger preview, matching the aspect ratio
- */
- if (($this->getMaxX() >= $maxPreviewWidth)
- && ($this->getMaxY() >= $maxPreviewHeight)
- ) {
- // The preview we-re looking for is the exact size or larger than the max preview,
- // so return that
- return $this->buildCachePath($fileId, $maxPreviewWidth, $maxPreviewHeight);
- } else {
- // The last resort is to look for something bigger than what we've calculated,
- // but still smaller than the max preview
- return $this->isCachedBigger($fileId, $allThumbnails);
- }
- }
-
- return false;
- }
-
- /**
- * Returns the dimensions of the max preview
- *
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- *
- * @return int[]
- */
- private function getMaxPreviewSize($allThumbnails) {
- $maxPreviewX = null;
- $maxPreviewY = null;
-
- foreach ($allThumbnails as $thumbnail) {
- $name = $thumbnail['name'];
- if (strpos($name, 'max')) {
- list($maxPreviewX, $maxPreviewY) = $this->getDimensionsFromFilename($name);
- break;
- }
- }
-
- return [$maxPreviewX, $maxPreviewY];
- }
-
- /**
- * Check if a specific thumbnail size is cached
- *
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- * @param string $name
- * @return bool
- */
- private function thumbnailSizeExists(array $allThumbnails, $name) {
-
- foreach ($allThumbnails as $thumbnail) {
- if ($name === $thumbnail->getName()) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Determines the size of the preview we should be looking for in the cache
- *
- * @return integer[]
- */
- private function simulatePreviewDimensions() {
- $askedWidth = $this->getMaxX();
- $askedHeight = $this->getMaxY();
-
- if ($this->keepAspect) {
- list($newPreviewWidth, $newPreviewHeight) =
- $this->applyAspectRatio($askedWidth, $askedHeight);
- } else {
- list($newPreviewWidth, $newPreviewHeight) = $this->fixSize($askedWidth, $askedHeight);
- }
-
- return [(int)$newPreviewWidth, (int)$newPreviewHeight];
- }
-
- /**
- * Resizes the boundaries to match the aspect ratio
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @param int $originalWidth
- * @param int $originalHeight
- * @return integer[]
- */
- private function applyAspectRatio($askedWidth, $askedHeight, $originalWidth = 0, $originalHeight = 0) {
- if (!$originalWidth) {
- $originalWidth = $this->maxPreviewWidth;
- }
- if (!$originalHeight) {
- $originalHeight = $this->maxPreviewHeight;
- }
- $originalRatio = $originalWidth / $originalHeight;
- // Defines the box in which the preview has to fit
- $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1;
- $askedWidth = min($askedWidth, $originalWidth * $scaleFactor);
- $askedHeight = min($askedHeight, $originalHeight * $scaleFactor);
-
- if ($askedWidth / $originalRatio < $askedHeight) {
- // width restricted
- $askedHeight = round($askedWidth / $originalRatio);
- } else {
- $askedWidth = round($askedHeight * $originalRatio);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Resizes the boundaries to cover the area
- *
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- * @return integer[]
- */
- private function applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight) {
- $originalRatio = $previewWidth / $previewHeight;
- // Defines the box in which the preview has to fit
- $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1;
- $askedWidth = min($askedWidth, $previewWidth * $scaleFactor);
- $askedHeight = min($askedHeight, $previewHeight * $scaleFactor);
-
- if ($askedWidth / $originalRatio > $askedHeight) {
- // height restricted
- $askedHeight = round($askedWidth / $originalRatio);
- } else {
- $askedWidth = round($askedHeight * $originalRatio);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Makes sure an upscaled preview doesn't end up larger than the max dimensions defined in the
- * config
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @return integer[]
- */
- private function fixSize($askedWidth, $askedHeight) {
- if ($this->scalingUp) {
- $askedWidth = min($this->configMaxWidth, $askedWidth);
- $askedHeight = min($this->configMaxHeight, $askedHeight);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Checks if a bigger version of a file preview is cached and if not
- * return the preview of max allowed dimensions
- *
- * @param int $fileId fileId of the original image
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- *
- * @return string path to bigger thumbnail
- */
- private function isCachedBigger($fileId, $allThumbnails) {
- // This is used to eliminate any thumbnail narrower than what we need
- $maxX = $this->getMaxX();
-
- //array for usable cached thumbnails
- $possibleThumbnails = $this->getPossibleThumbnails($allThumbnails);
-
- foreach ($possibleThumbnails as $width => $path) {
- if ($width < $maxX) {
- continue;
- } else {
- return $path;
- }
- }
-
- // At this stage, we didn't find a preview, so we return the max preview
- return $this->buildCachePath($fileId, $this->maxPreviewWidth, $this->maxPreviewHeight);
- }
-
- /**
- * Get possible bigger thumbnails of the given image with the proper aspect ratio
- *
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- *
- * @return string[] an array of paths to bigger thumbnails
- */
- private function getPossibleThumbnails($allThumbnails) {
- if ($this->keepAspect) {
- $wantedAspectRatio = (float)($this->maxPreviewWidth / $this->maxPreviewHeight);
- } else {
- $wantedAspectRatio = (float)($this->getMaxX() / $this->getMaxY());
- }
-
- //array for usable cached thumbnails
- $possibleThumbnails = array();
- foreach ($allThumbnails as $thumbnail) {
- $name = rtrim($thumbnail['name'], '.png');
- list($x, $y, $aspectRatio) = $this->getDimensionsFromFilename($name);
- if (abs($aspectRatio - $wantedAspectRatio) >= 0.000001
- || $this->unscalable($x, $y)
- ) {
- continue;
- }
- $possibleThumbnails[$x] = $thumbnail['path'];
- }
-
- ksort($possibleThumbnails);
-
- return $possibleThumbnails;
- }
-
- /**
- * Looks at the preview filename from the cache and extracts the size of the preview
- *
- * @param string $name
- *
- * @return array<int,int,float>
- */
- private function getDimensionsFromFilename($name) {
- $size = explode('-', $name);
- $x = (int)$size[0];
- $y = (int)$size[1];
- $aspectRatio = (float)($x / $y);
-
- return array($x, $y, $aspectRatio);
- }
-
- /**
- * @param int $x
- * @param int $y
- *
- * @return bool
- */
- private function unscalable($x, $y) {
-
- $maxX = $this->getMaxX();
- $maxY = $this->getMaxY();
- $scalingUp = $this->getScalingUp();
- $maxScaleFactor = $this->getMaxScaleFactor();
-
- if ($x < $maxX || $y < $maxY) {
- if ($scalingUp) {
- $scaleFactor = $maxX / $x;
- if ($scaleFactor > $maxScaleFactor) {
- return true;
- }
- } else {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Returns a preview of a file
- *
- * The cache is searched first and if nothing usable was found then a preview is
- * generated by one of the providers
- *
- * @return \OCP\IImage
- */
- public function getPreview() {
- if (!is_null($this->preview) && $this->preview->valid()) {
- return $this->preview;
- }
-
- $this->preview = null;
- $fileInfo = $this->getFileInfo();
- if ($fileInfo === null || $fileInfo === false || !$fileInfo->isReadable()) {
- return new \OC_Image();
- }
-
- $fileId = $fileInfo->getId();
- $cached = $this->isCached($fileId);
- if ($cached) {
- $this->getCachedPreview($fileId, $cached);
- }
-
- if (is_null($this->preview)) {
- $this->generatePreview($fileId);
- }
-
- // We still don't have a preview, so we send back an empty object
- if (is_null($this->preview)) {
- $this->preview = new \OC_Image();
- }
-
- return $this->preview;
- }
-
- /**
- * Sends the preview, including the headers to client which requested it
- *
- * @param null|string $mimeTypeForHeaders the media type to use when sending back the reply
- *
- * @throws NotFoundException
- * @throws PreviewNotAvailableException
- */
- public function showPreview($mimeTypeForHeaders = null) {
- // Check if file is valid
- if ($this->isFileValid() === false) {
- throw new NotFoundException('File not found.');
- }
-
- if (is_null($this->preview)) {
- $this->getPreview();
- }
- if ($this->preview instanceof \OCP\IImage) {
- if ($this->preview->valid()) {
- \OCP\Response::enableCaching(3600 * 24); // 24 hours
- } else {
- $this->getMimeIcon();
- }
- $this->preview->show($mimeTypeForHeaders);
- }
- }
-
- /**
- * Retrieves the preview from the cache and resizes it if necessary
- *
- * @param int $fileId fileId of the original image
- * @param string $cached the path to the cached preview
- */
- private function getCachedPreview($fileId, $cached) {
- $stream = $this->userView->fopen($cached, 'r');
- $this->preview = null;
- if ($stream) {
- $image = new \OC_Image();
- $image->loadFromFileHandle($stream);
-
- $this->preview = $image->valid() ? $image : null;
-
- if (!is_null($this->preview)) {
- // Size of the preview we calculated
- $maxX = $this->previewWidth;
- $maxY = $this->previewHeight;
- // Size of the preview we retrieved from the cache
- $previewX = (int)$this->preview->width();
- $previewY = (int)$this->preview->height();
-
- // We don't have an exact match
- if ($previewX !== $maxX || $previewY !== $maxY) {
- $this->resizeAndStore($fileId);
- }
- }
-
- fclose($stream);
- }
- }
-
- /**
- * Resizes, crops, fixes orientation and stores in the cache
- *
- * @param int $fileId fileId of the original image
- */
- private function resizeAndStore($fileId) {
- $image = $this->preview;
- if (!($image instanceof \OCP\IImage)) {
- \OCP\Util::writeLog(
- 'core', '$this->preview is not an instance of \OCP\IImage', \OCP\Util::DEBUG
- );
-
- return;
- }
- $previewWidth = (int)$image->width();
- $previewHeight = (int)$image->height();
- $askedWidth = $this->getMaxX();
- $askedHeight = $this->getMaxY();
-
- if ($this->mode === self::MODE_COVER) {
- list($askedWidth, $askedHeight) =
- $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight);
- }
-
- /**
- * Phase 1: If required, adjust boundaries to keep aspect ratio
- */
- if ($this->keepAspect) {
- list($askedWidth, $askedHeight) =
- $this->applyAspectRatio($askedWidth, $askedHeight, $previewWidth, $previewHeight);
- }
-
- /**
- * Phase 2: Resizes preview to try and match requirements.
- * Takes the scaling ratio into consideration
- */
- list($newPreviewWidth, $newPreviewHeight) = $this->scale(
- $image, $askedWidth, $askedHeight, $previewWidth, $previewHeight
- );
-
- // The preview has been resized and should now have the asked dimensions
- if ($newPreviewWidth === $askedWidth && $newPreviewHeight === $askedHeight) {
- $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight);
-
- return;
- }
-
- /**
- * Phase 3: We're still not there yet, so we're clipping and filling
- * to match the asked dimensions
- */
- // It turns out the scaled preview is now too big, so we crop the image
- if ($newPreviewWidth >= $askedWidth && $newPreviewHeight >= $askedHeight) {
- $this->crop($image, $askedWidth, $askedHeight, $newPreviewWidth, $newPreviewHeight);
- $this->storePreview($fileId, $askedWidth, $askedHeight);
-
- return;
- }
-
- // At least one dimension of the scaled preview is too small,
- // so we fill the space with a transparent background
- if (($newPreviewWidth < $askedWidth || $newPreviewHeight < $askedHeight)) {
- $this->cropAndFill(
- $image, $askedWidth, $askedHeight, $newPreviewWidth, $newPreviewHeight
- );
- $this->storePreview($fileId, $askedWidth, $askedHeight);
-
- return;
- }
-
- // The preview is smaller, but we can't touch it
- $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight);
- }
-
- /**
- * Calculates the new dimensions of the preview
- *
- * The new dimensions can be larger or smaller than the ones of the preview we have to resize
- *
- * @param \OCP\IImage $image
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- *
- * @return int[]
- */
- private function scale($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight) {
- $scalingUp = $this->getScalingUp();
- $maxScaleFactor = $this->getMaxScaleFactor();
-
- $factorX = $askedWidth / $previewWidth;
- $factorY = $askedHeight / $previewHeight;
-
- if ($factorX >= $factorY) {
- $factor = $factorX;
- } else {
- $factor = $factorY;
- }
-
- if ($scalingUp === false) {
- if ($factor > 1) {
- $factor = 1;
- }
- }
-
- // We cap when upscaling
- if (!is_null($maxScaleFactor)) {
- if ($factor > $maxScaleFactor) {
- \OCP\Util::writeLog(
- 'core', 'scale factor reduced from ' . $factor . ' to ' . $maxScaleFactor,
- \OCP\Util::DEBUG
- );
- $factor = $maxScaleFactor;
- }
- }
-
- $newPreviewWidth = round($previewWidth * $factor);
- $newPreviewHeight = round($previewHeight * $factor);
-
- $image->preciseResize($newPreviewWidth, $newPreviewHeight);
- $this->preview = $image;
-
- return [$newPreviewWidth, $newPreviewHeight];
- }
-
- /**
- * Crops a preview which is larger than the dimensions we've received
- *
- * @param \OCP\IImage $image
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function crop($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight = null) {
- $cropX = floor(abs($askedWidth - $previewWidth) * 0.5);
- //don't crop previews on the Y axis, this sucks if it's a document.
- //$cropY = floor(abs($y - $newPreviewHeight) * 0.5);
- $cropY = 0;
- $image->crop($cropX, $cropY, $askedWidth, $askedHeight);
- $this->preview = $image;
- }
-
- /**
- * Crops an image if it's larger than the dimensions we've received and fills the empty space
- * with a transparent background
- *
- * @param \OCP\IImage $image
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function cropAndFill($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight) {
- if ($previewWidth > $askedWidth) {
- $cropX = floor(($previewWidth - $askedWidth) * 0.5);
- $image->crop($cropX, 0, $askedWidth, $previewHeight);
- $previewWidth = $askedWidth;
- }
-
- if ($previewHeight > $askedHeight) {
- $cropY = floor(($previewHeight - $askedHeight) * 0.5);
- $image->crop(0, $cropY, $previewWidth, $askedHeight);
- $previewHeight = $askedHeight;
- }
-
- // Creates a transparent background
- $backgroundLayer = imagecreatetruecolor($askedWidth, $askedHeight);
- imagealphablending($backgroundLayer, false);
- $transparency = imagecolorallocatealpha($backgroundLayer, 0, 0, 0, 127);
- imagefill($backgroundLayer, 0, 0, $transparency);
- imagesavealpha($backgroundLayer, true);
-
- $image = $image->resource();
-
- $mergeX = floor(abs($askedWidth - $previewWidth) * 0.5);
- $mergeY = floor(abs($askedHeight - $previewHeight) * 0.5);
-
- // Pastes the preview on top of the background
- imagecopy(
- $backgroundLayer, $image, $mergeX, $mergeY, 0, 0, $previewWidth,
- $previewHeight
- );
-
- $image = new \OC_Image($backgroundLayer);
-
- $this->preview = $image;
- }
-
- /**
- * Saves a preview in the cache to speed up future calls
- *
- * Do not nullify the preview as it might send the whole process in a loop
- *
- * @param int $fileId fileId of the original image
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function storePreview($fileId, $previewWidth, $previewHeight) {
- if (empty($previewWidth) || empty($previewHeight)) {
- \OCP\Util::writeLog(
- 'core', 'Cannot save preview of dimension ' . $previewWidth . 'x' . $previewHeight,
- \OCP\Util::DEBUG
- );
-
- } else {
- $cachePath = $this->buildCachePath($fileId, $previewWidth, $previewHeight);
- $this->userView->file_put_contents($cachePath, $this->preview->data());
- }
- }
-
- /**
- * Returns the path to a preview based on its dimensions and aspect
- *
- * @param int $fileId
- * @param int|null $maxX
- * @param int|null $maxY
- *
- * @return string
- */
- private function buildCachePath($fileId, $maxX = null, $maxY = null) {
- if (is_null($maxX)) {
- $maxX = $this->getMaxX();
- }
- if (is_null($maxY)) {
- $maxY = $this->getMaxY();
- }
-
- $previewPath = $this->getPreviewPath($fileId);
- $previewPath = $previewPath . strval($maxX) . '-' . strval($maxY);
- $isMaxPreview =
- ($maxX === $this->maxPreviewWidth && $maxY === $this->maxPreviewHeight) ? true : false;
- if ($isMaxPreview) {
- $previewPath .= '-max';
- }
- if ($this->keepAspect && !$isMaxPreview) {
- $previewPath .= '-with-aspect';
- }
- if ($this->mode === self::MODE_COVER) {
- $previewPath .= '-cover';
- }
- $previewPath .= '.png';
-
- return $previewPath;
- }
-
- /**
- * Returns the path to the folder where the previews are stored, identified by the fileId
- *
- * @param int $fileId
- *
- * @return string
- */
- private function getPreviewPath($fileId) {
- return $this->getThumbnailsFolder() . '/' . $fileId . '/';
- }
-
- /**
- * Asks the provider to send a preview of the file which respects the maximum dimensions
- * defined in the configuration and after saving it in the cache, it is then resized to the
- * asked dimensions
- *
- * This is only called once in order to generate a large PNG of dimensions defined in the
- * configuration file. We'll be able to quickly resize it later on.
- * We never upscale the original conversion as this will be done later by the resizing
- * operation
- *
- * @param int $fileId fileId of the original image
- */
- private function generatePreview($fileId) {
- $file = $this->getFile();
- $preview = null;
-
- $previewProviders = \OC::$server->getPreviewManager()
- ->getProviders();
- foreach ($previewProviders as $supportedMimeType => $providers) {
- if (!preg_match($supportedMimeType, $this->mimeType)) {
- continue;
- }
-
- foreach ($providers as $closure) {
- $provider = $closure();
- if (!($provider instanceof \OCP\Preview\IProvider)) {
- continue;
- }
-
- \OCP\Util::writeLog(
- 'core', 'Generating preview for "' . $file . '" with "' . get_class($provider)
- . '"', \OCP\Util::DEBUG
- );
-
- /** @var $provider Provider */
- $preview = $provider->getThumbnail(
- $file, $this->configMaxWidth, $this->configMaxHeight, $scalingUp = false,
- $this->fileView
- );
-
- if (!($preview instanceof \OCP\IImage)) {
- continue;
- }
-
- $this->preview = $preview;
- $previewPath = $this->getPreviewPath($fileId);
-
- 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 stores our large preview so that it can be used in subsequent resizing requests
- $this->storeMaxPreview($previewPath);
-
- break 2;
- }
- }
-
- // The providers have been kind enough to give us a preview
- if ($preview) {
- $this->resizeAndStore($fileId);
- }
- }
-
- /**
- * Defines the media icon, for the media type of the original file, as the preview
- * @throws PreviewNotAvailableException
- */
- private function getMimeIcon() {
- $image = new \OC_Image();
- $mimeIconWebPath = \OC::$server->getMimeTypeDetector()->mimeTypeIcon($this->mimeType);
- if (empty(\OC::$WEBROOT)) {
- $mimeIconServerPath = \OC::$SERVERROOT . $mimeIconWebPath;
- } else {
- $mimeIconServerPath = str_replace(\OC::$WEBROOT, \OC::$SERVERROOT, $mimeIconWebPath);
- }
- // we can't load SVGs into an image
- if (substr($mimeIconWebPath, -4) === '.svg') {
- throw new PreviewNotAvailableException('SVG mimetype cannot be rendered');
- }
- $image->loadFromFile($mimeIconServerPath);
-
- $this->preview = $image;
- }
-
- /**
- * Stores the max preview in the cache
- *
- * @param string $previewPath path to the preview
- */
- private function storeMaxPreview($previewPath) {
- $maxPreviewExists = false;
- $preview = $this->preview;
-
- $allThumbnails = $this->userView->getDirectoryContent($previewPath);
- // This is so that the cache doesn't need emptying when upgrading
- // Can be replaced by an upgrade script...
- foreach ($allThumbnails as $thumbnail) {
- $name = rtrim($thumbnail['name'], '.png');
- if (strpos($name, 'max')) {
- $maxPreviewExists = true;
- break;
- }
- }
- // We haven't found the max preview, so we create it
- if (!$maxPreviewExists) {
- $previewWidth = $preview->width();
- $previewHeight = $preview->height();
- $previewPath = $previewPath . strval($previewWidth) . '-' . strval($previewHeight);
- $previewPath .= '-max.png';
- $this->userView->file_put_contents($previewPath, $preview->data());
- $this->maxPreviewWidth = $previewWidth;
- $this->maxPreviewHeight = $previewHeight;
- }
- }
-
- /**
- * Limits a dimension to the maximum dimension provided as argument
- *
- * @param int $dim
- * @param int $maxDim
- * @param string $dimName
- *
- * @return integer
- */
- private function limitMaxDim($dim, $maxDim, $dimName) {
- if (!is_null($maxDim)) {
- if ($dim > $maxDim) {
- \OCP\Util::writeLog(
- 'core', $dimName . ' reduced from ' . $dim . ' to ' . $maxDim, \OCP\Util::DEBUG
- );
- $dim = $maxDim;
- }
- }
-
- return $dim;
- }
-
- /**
- * @param array $args
- */
- public static function post_write($args) {
- self::post_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- */
- public static function prepare_delete_files($args) {
- self::prepare_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- * @param string $prefix
- */
- public static function prepare_delete(array $args, $prefix = '') {
- $path = $args['path'];
- if (substr($path, 0, 1) === '/') {
- $path = substr($path, 1);
- }
-
- $view = new \OC\Files\View('/' . \OC_User::getUser() . '/' . $prefix);
-
- $absPath = Files\Filesystem::normalizePath($view->getAbsolutePath($path));
- $fileInfo = $view->getFileInfo($path);
- if ($fileInfo === false) {
- return;
- }
- self::addPathToDeleteFileMapper($absPath, $fileInfo);
- if ($view->is_dir($path)) {
- $children = self::getAllChildren($view, $path);
- self::$deleteChildrenMapper[$absPath] = $children;
- }
- }
-
- /**
- * @param string $absolutePath
- * @param \OCP\Files\FileInfo $info
- */
- private static function addPathToDeleteFileMapper($absolutePath, $info) {
- self::$deleteFileMapper[$absolutePath] = $info;
- }
-
- /**
- * @param \OC\Files\View $view
- * @param string $path
- *
- * @return array
- */
- private static function getAllChildren($view, $path) {
- $children = $view->getDirectoryContent($path);
- $childrensFiles = array();
-
- $fakeRootLength = strlen($view->getRoot());
-
- for ($i = 0; $i < count($children); $i++) {
- $child = $children[$i];
-
- $childsPath = substr($child->getPath(), $fakeRootLength);
-
- if ($view->is_dir($childsPath)) {
- $children = array_merge(
- $children,
- $view->getDirectoryContent($childsPath)
- );
- } else {
- $childrensFiles[] = $child;
- }
- }
-
- return $childrensFiles;
- }
-
- /**
- * @param array $args
- */
- public static function post_delete_files($args) {
- self::post_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- */
- public static function post_delete_versions($args) {
- self::post_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- * @param string $prefix
- */
- public static function post_delete($args, $prefix = '') {
- $path = Files\Filesystem::normalizePath($args['path']);
-
- $preview = new Preview(\OC_User::getUser(), $prefix, $path);
- $preview->deleteAllPreviews();
- }
-
-}
diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php
index 36b3730a720..8c5a7ad29f1 100644
--- a/lib/private/PreviewManager.php
+++ b/lib/private/PreviewManager.php
@@ -68,6 +68,9 @@ class PreviewManager implements IPreview {
/** @var array */
protected $defaultProviders;
+ /** @var string */
+ protected $userId;
+
/**
* PreviewManager constructor.
*
@@ -75,15 +78,18 @@ class PreviewManager implements IPreview {
* @param IRootFolder $rootFolder
* @param IAppData $appData
* @param EventDispatcherInterface $eventDispatcher
+ * @param string $userId
*/
public function __construct(IConfig $config,
IRootFolder $rootFolder,
IAppData $appData,
- EventDispatcherInterface $eventDispatcher) {
+ EventDispatcherInterface $eventDispatcher,
+ $userId) {
$this->config = $config;
$this->rootFolder = $rootFolder;
$this->appData = $appData;
$this->eventDispatcher = $eventDispatcher;
+ $this->userId = $userId;
}
/**
@@ -144,10 +150,22 @@ class PreviewManager implements IPreview {
* @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\IImage
+ * @deprecated 11 Use getPreview
*/
public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) {
- $preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp);
- return $preview->getPreview();
+ try {
+ $userRoot = $this->rootFolder->getUserFolder($this->userId)->getParent();
+ $node = $userRoot->get($file);
+ if (!($file instanceof File)) {
+ throw new NotFoundException();
+ }
+
+ $preview = $this->getPreview($node, $maxX, $maxY);
+ } catch (\Exception $e) {
+ return new \OC_Image();
+ }
+
+ return new \OC_Image($preview->getContent());
}
/**
diff --git a/lib/private/Repair/Collation.php b/lib/private/Repair/Collation.php
index 54de1a719bd..a3535fb33a2 100644
--- a/lib/private/Repair/Collation.php
+++ b/lib/private/Repair/Collation.php
@@ -75,6 +75,18 @@ class Collation implements IRepairStep {
$tables = $this->getAllNonUTF8BinTables($this->connection);
foreach ($tables as $table) {
+ $output->info("Change row format for $table ...");
+ $query = $this->connection->prepare('ALTER TABLE `' . $table . '` ROW_FORMAT = DYNAMIC;');
+ try {
+ $query->execute();
+ } catch (DriverException $e) {
+ // Just log this
+ $this->logger->logException($e);
+ if (!$this->ignoreFailures) {
+ throw $e;
+ }
+ }
+
$output->info("Change collation for $table ...");
$query = $this->connection->prepare('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET ' . $characterSet . ' COLLATE ' . $characterSet . '_bin;');
try {
diff --git a/lib/private/Security/Bruteforce/Throttler.php b/lib/private/Security/Bruteforce/Throttler.php
index 031c5ffd411..765f109fdb3 100644
--- a/lib/private/Security/Bruteforce/Throttler.php
+++ b/lib/private/Security/Bruteforce/Throttler.php
@@ -189,9 +189,10 @@ class Throttler {
* Get the throttling delay (in milliseconds)
*
* @param string $ip
+ * @param string $action optionally filter by action
* @return int
*/
- public function getDelay($ip) {
+ public function getDelay($ip, $action = '') {
$cutoffTime = (new \DateTime())
->sub($this->getCutoff(43200))
->getTimestamp();
@@ -201,6 +202,11 @@ class Throttler {
->from('bruteforce_attempts')
->where($qb->expr()->gt('occurred', $qb->createNamedParameter($cutoffTime)))
->andWhere($qb->expr()->eq('subnet', $qb->createNamedParameter($this->getSubnet($ip))));
+
+ if ($action !== '') {
+ $qb->andWhere($qb->expr()->eq('action', $qb->createNamedParameter($action)));
+ }
+
$attempts = count($qb->execute()->fetchAll());
if ($attempts === 0) {
@@ -225,10 +231,11 @@ class Throttler {
* Will sleep for the defined amount of time
*
* @param string $ip
+ * @param string $action optionally filter by action
* @return int the time spent sleeping
*/
- public function sleepDelay($ip) {
- $delay = $this->getDelay($ip);
+ public function sleepDelay($ip, $action = '') {
+ $delay = $this->getDelay($ip, $action);
usleep($delay * 1000);
return $delay;
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 147fa89582a..d88a687bbc4 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -124,7 +124,8 @@ class Server extends ServerContainer implements IServerContainer {
$c->getConfig(),
$c->getRootFolder(),
$c->getAppDataDir('preview'),
- $c->getEventDispatcher()
+ $c->getEventDispatcher(),
+ $c->getSession()->get('user_id')
);
});
@@ -418,9 +419,8 @@ class Server extends ServerContainer implements IServerContainer {
);
});
$this->registerService('Logger', function (Server $c) {
- $logClass = $c->query('AllConfig')->getSystemValue('log_type', 'file');
- // TODO: Drop backwards compatibility for config in the future
- $logger = 'OC\\Log\\' . ucfirst($logClass=='owncloud' ? 'file' : $logClass);
+ $logType = $c->query('AllConfig')->getSystemValue('log_type', 'file');
+ $logger = Log::getLogClass($logType);
call_user_func(array($logger, 'init'));
return new Log($logger);
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 6eab5e05a2f..acc142f62be 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -587,7 +587,6 @@ class Manager implements IManager {
$share->setPassword($this->hasher->hash($share->getPassword()));
}
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) {
- $this->linkCreateChecks($share);
$share->setToken(
$this->secureRandom->generate(
\OC\Share\Constants::TOKEN_LENGTH,
diff --git a/lib/private/SystemConfig.php b/lib/private/SystemConfig.php
index 1029a6619ff..e5f1adaf004 100644
--- a/lib/private/SystemConfig.php
+++ b/lib/private/SystemConfig.php
@@ -44,7 +44,6 @@ class SystemConfig {
'passwordsalt' => true,
'secret' => true,
'updater.secret' => true,
- 'ldap_agent_password' => true,
'proxyuserpwd' => true,
'log.condition' => [
'shared_secret' => true,
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index 5a35f6806c3..9b425bc0568 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -157,7 +157,7 @@ class TemplateLayout extends \OC_Template {
foreach($jsFiles as $info) {
$web = $info[1];
$file = $info[2];
- $this->append( 'jsfiles', $web.'/'.$file . '?v=' . self::$versionHash);
+ $this->append( 'jsfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
}
// Do not initialise scss appdata until we have a fully installed instance
@@ -177,13 +177,22 @@ class TemplateLayout extends \OC_Template {
$file = $info[2];
if (substr($file, -strlen('print.css')) === 'print.css') {
- $this->append( 'printcssfiles', $web.'/'.$file . '?v=' . self::$versionHash);
+ $this->append( 'printcssfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
} else {
- $this->append( 'cssfiles', $web.'/'.$file . '?v=' . self::$versionHash);
+ $this->append( 'cssfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
}
}
}
+ protected function getVersionHashSuffix() {
+ if(\OC::$server->getConfig()->getSystemValue('debug', false)) {
+ // allows chrome workspace mapping in debug mode
+ return "";
+ }
+
+ return '?v=' . self::$versionHash;
+ }
+
/**
* @param array $styles
* @return array
diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php
index 28cb3302858..a281572ad55 100644
--- a/lib/private/User/Database.php
+++ b/lib/private/User/Database.php
@@ -238,6 +238,12 @@ class Database extends Backend implements IUserBackend {
*/
private function loadUser($uid) {
if (!isset($this->cache[$uid])) {
+ //guests $uid could be NULL or ''
+ if ($uid === null || $uid === '') {
+ $this->cache[$uid]=false;
+ return true;
+ }
+
$query = \OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)');
$result = $query->execute(array($uid));
diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php
index 1834bd025d1..9cc42e671a8 100644
--- a/lib/private/User/Session.php
+++ b/lib/private/User/Session.php
@@ -317,7 +317,7 @@ class Session implements IUserSession, Emitter {
$password,
IRequest $request,
OC\Security\Bruteforce\Throttler $throttler) {
- $currentDelay = $throttler->sleepDelay($request->getRemoteAddress());
+ $currentDelay = $throttler->sleepDelay($request->getRemoteAddress(), 'login');
$isTokenPassword = $this->isTokenPassword($password);
if (!$isTokenPassword && $this->isTokenAuthEnforced()) {
@@ -334,7 +334,7 @@ class Session implements IUserSession, Emitter {
$throttler->registerAttempt('login', $request->getRemoteAddress(), ['uid' => $user]);
if($currentDelay === 0) {
- $throttler->sleepDelay($request->getRemoteAddress());
+ $throttler->sleepDelay($request->getRemoteAddress(), 'login');
}
return false;
}
@@ -768,7 +768,7 @@ class Session implements IUserSession, Emitter {
try {
$this->tokenProvider->invalidateToken($this->session->getId());
} catch (SessionNotAvailableException $ex) {
-
+
}
}
$this->setUser(null);
diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php
index 8ef7e08c733..a475b895d9f 100644
--- a/lib/private/legacy/app.php
+++ b/lib/private/legacy/app.php
@@ -1304,43 +1304,21 @@ class OC_App {
$data['summary'] = self::findBestL10NOption($data['summary'], $lang);
}
if ($lang && isset($data['description']) && is_array($data['description'])) {
- $data['description'] = self::findBestL10NOption($data['description'], $lang);
- }
-
- // just modify the description if it is available
- // otherwise this will create a $data element with an empty 'description'
- if (isset($data['description'])) {
- if (is_string($data['description'])) {
- // sometimes the description contains line breaks and they are then also
- // shown in this way in the app management which isn't wanted as HTML
- // manages line breaks itself
-
- // first of all we split on empty lines
- $paragraphs = preg_split("!\n[[:space:]]*\n!mu", $data['description']);
-
- $result = [];
- foreach ($paragraphs as $value) {
- // replace multiple whitespace (tabs, space, newlines) inside a paragraph
- // with a single space - also trims whitespace
- $result[] = trim(preg_replace('![[:space:]]+!mu', ' ', $value));
- }
-
- // join the single paragraphs with a empty line in between
- $data['description'] = implode("\n\n", $result);
-
- } else {
- $data['description'] = '';
- }
+ $data['description'] = trim(self::findBestL10NOption($data['description'], $lang));
+ } else if (isset($data['description']) && is_string($data['description'])) {
+ $data['description'] = trim($data['description']);
+ } else {
+ $data['description'] = '';
}
return $data;
}
/**
- * @param $config
- * @param $l
- * @param $info
- * @throws Exception
+ * @param \OCP\IConfig $config
+ * @param \OCP\IL10N $l
+ * @param array $info
+ * @throws \Exception
*/
protected static function checkAppDependencies($config, $l, $info) {
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php
index 8591d6abc68..051e68f3144 100644
--- a/lib/public/AppFramework/Http/Response.php
+++ b/lib/public/AppFramework/Http/Response.php
@@ -43,11 +43,11 @@ use OCP\AppFramework\Http;
class Response {
/**
- * Headers - defaults to ['Cache-Control' => 'no-cache, must-revalidate']
+ * Headers - defaults to ['Cache-Control' => 'no-cache, no-store, must-revalidate']
* @var array
*/
private $headers = array(
- 'Cache-Control' => 'no-cache, must-revalidate'
+ 'Cache-Control' => 'no-cache, no-store, must-revalidate'
);
diff --git a/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php b/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php
new file mode 100644
index 00000000000..76e728b6ab0
--- /dev/null
+++ b/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @author Cornelius Kölbel <cornelius.koelbel@netknights.it>
+ * @copyright Copyright (c) 2016, ownCloud GmbH.
+ *
+ * @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\Authentication\TwoFactorAuth;
+
+use Exception;
+
+/**
+ * Two Factor Authentication failed
+ *
+ * It defines an Exception a 2FA app can
+ * throw in case of an error. The 2FA Controller will catch this exception and
+ * display this error.
+ *
+ * @since 12
+ */
+class TwoFactorException extends Exception {
+
+}
diff --git a/lib/public/Encryption/Keys/IStorage.php b/lib/public/Encryption/Keys/IStorage.php
index e17de04316b..c96d1573b38 100644
--- a/lib/public/Encryption/Keys/IStorage.php
+++ b/lib/public/Encryption/Keys/IStorage.php
@@ -170,4 +170,14 @@ interface IStorage {
*/
public function copyKeys($source, $target);
+ /**
+ * backup keys of a given encryption module
+ *
+ * @param string $encryptionModuleId
+ * @param string $purpose
+ * @param string $uid
+ * @return bool
+ * @since 12.0.0
+ */
+ public function backupUserKeys($encryptionModuleId, $purpose, $uid);
}
diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php
index 01aca47ad81..4a92a224840 100644
--- a/lib/public/IAppConfig.php
+++ b/lib/public/IAppConfig.php
@@ -87,6 +87,15 @@ interface IAppConfig {
public function getValues($app, $key);
/**
+ * get all values of the app or and filters out sensitive data
+ *
+ * @param string $app
+ * @return array
+ * @since 12.0.0
+ */
+ public function getFilteredValues($app);
+
+ /**
* sets a value in the appconfig
* @param string $app app
* @param string $key key
diff --git a/lib/public/IPreview.php b/lib/public/IPreview.php
index a1a03fee3e1..207539b1170 100644
--- a/lib/public/IPreview.php
+++ b/lib/public/IPreview.php
@@ -86,7 +86,7 @@ interface IPreview {
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
* @return \OCP\IImage
* @since 6.0.0
- * @deprecated 9.2.0 Use getPreview
+ * @deprecated 11 Use getPreview
*/
public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false);
diff --git a/lib/public/RichObjectStrings/Definitions.php b/lib/public/RichObjectStrings/Definitions.php
index 4b5b0da978e..f1208ae0f2c 100644
--- a/lib/public/RichObjectStrings/Definitions.php
+++ b/lib/public/RichObjectStrings/Definitions.php
@@ -152,6 +152,31 @@ class Definitions {
],
],
],
+ 'call' => [
+ 'author' => 'Nextcloud',
+ 'app' => 'spreed',
+ 'since' => '11.0.2',
+ 'parameters' => [
+ 'id' => [
+ 'since' => '11.0.2',
+ 'required' => true,
+ 'description' => 'The id used to identify the call on the instance',
+ 'example' => '42',
+ ],
+ 'name' => [
+ 'since' => '11.0.2',
+ 'required' => true,
+ 'description' => 'The display name of the call which should be used in the visual representation',
+ 'example' => 'Company call',
+ ],
+ 'call-type' => [
+ 'since' => '11.0.2',
+ 'required' => true,
+ 'description' => 'The type of the call: one2one, group or public',
+ 'example' => 'one2one',
+ ],
+ ],
+ ],
'email' => [
'author' => 'Nextcloud',
'app' => 'sharebymail',
diff --git a/settings/css/settings.css b/settings/css/settings.css
index 46394d3f03d..557395c5717 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -551,6 +551,26 @@ span.version {
flex-basis: 90%;
}
+#apps-list .app-description p {
+ margin: 10px 0;
+}
+#apps-list .app-description ul {
+ list-style: disc;
+}
+#apps-list .app-description ol {
+ list-style: decimal;
+}
+#apps-list .app-description > ul,
+#apps-list .app-description > ol {
+ margin-left: 19px;
+}
+#apps-list .app-description ol ol,
+#apps-list .app-description ol ul,
+#apps-list .app-description ul ol,
+#apps-list .app-description ul ul {
+ padding-left: 15px;
+}
+
@media (min-width: 1601px) {
#apps-list .section {
width: 22%;
@@ -634,9 +654,6 @@ form.section {
.app-description {
clear: both;
}
-.app-description pre {
- white-space: pre-line;
-}
#apps-list .groups-enable {
margin-top: 8px;
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 61d817e43e4..1538e71a491 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -19,6 +19,8 @@ Handlebars.registerHelper('level', function() {
OC.Settings = OC.Settings || {};
OC.Settings.Apps = OC.Settings.Apps || {
+ markedOptions: {},
+
setupGroupsSelect: function($elements) {
OC.Settings.setupGroupsSelect($elements, {
placeholder: t('core', 'All')
@@ -186,6 +188,25 @@ OC.Settings.Apps = OC.Settings.Apps || {
app.author = app.author['@value'];
}
+ // Parse markdown in app description
+ app.description = DOMPurify.sanitize(
+ marked(app.description.trim(), OC.Settings.Apps.markedOptions),
+ {
+ SAFE_FOR_JQUERY: true,
+ ALLOWED_TAGS: [
+ 'strong',
+ 'p',
+ 'a',
+ 'ul',
+ 'ol',
+ 'li',
+ 'em',
+ 'del',
+ 'blockquote'
+ ]
+ }
+ );
+
var html = template(app);
if (selector) {
selector.html(html);
@@ -633,6 +654,50 @@ OC.Settings.Apps = OC.Settings.Apps || {
* Initializes the apps list
*/
initialize: function($el) {
+
+ var renderer = new marked.Renderer();
+ renderer.link = function(href, title, text) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return '';
+ }
+
+ if (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) {
+ return '';
+ }
+
+ var out = '<a href="' + href + '" rel="noreferrer noopener"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += '>' + text + '</a>';
+ return out;
+ };
+ renderer.image = function(href, title, text) {
+ if (text) {
+ return text;
+ }
+ return title;
+ };
+ renderer.blockquote = function(quote) {
+ return quote;
+ };
+
+ OC.Settings.Apps.markedOptions = {
+ renderer: renderer,
+ gfm: false,
+ highlight: false,
+ tables: false,
+ breaks: false,
+ pedantic: false,
+ sanitize: true,
+ smartLists: true,
+ smartypants: false
+ };
+
OC.Plugins.register('OCA.Search', OC.Settings.Apps.Search);
OC.Settings.Apps.loadCategories();
OC.Util.History.addOnPopStateHandler(_.bind(this._onPopState, this));
diff --git a/settings/js/federationscopemenu.js b/settings/js/federationscopemenu.js
index 0862556a2c3..872f59c5de8 100644
--- a/settings/js/federationscopemenu.js
+++ b/settings/js/federationscopemenu.js
@@ -37,7 +37,7 @@
*/
var FederationScopeMenu = OC.Backbone.View.extend({
tagName: 'div',
- className: 'federationScopeMenu popovermenu bubble hidden open menu',
+ className: 'federationScopeMenu popovermenu bubble hidden menu',
field: undefined,
_scopes: undefined,
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 0e3067db7c7..a2ccc059f15 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -704,9 +704,9 @@ $(document).ready(function () {
blurFunction = _.bind(blurFunction, $input);
if(isRestoreDisabled) {
$tr.addClass('row-warning');
- // add tipsy if the password change could cause data loss - no recovery enabled
- $input.tipsy({gravity:'s'});
+ // add tooltip if the password change could cause data loss - no recovery enabled
$input.attr('title', t('settings', 'Changing the password will result in data loss, because data recovery is not available for this user'));
+ $input.tooltip({placement:'bottom'});
}
$td.find('img').hide();
$td.children('span').replaceWith($input);
diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js
index 2079b0675b5..0d06d1a6042 100644
--- a/settings/l10n/cs_CZ.js
+++ b/settings/l10n/cs_CZ.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to delete user." : "Nelze smazat uživatele.",
"Settings saved" : "Nastavení uloženo",
"Unable to change full name" : "Nelze změnit celé jméno",
+ "Unable to change email address" : "Nepodařilo se změnit e-mailovou adresu",
"Your full name has been changed." : "Vaše celé jméno bylo změněno.",
"Forbidden" : "Zakázáno",
"Invalid user" : "Neplatný uživatel",
@@ -57,6 +58,7 @@ OC.L10N.register(
"Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Oficiální aplikace jsou vyvíjeny komunitou. Poskytují klíčovou funkcionalitu a jsou připravené na produkční nasazení.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Schválené aplikace jsou vyvíjeny důvěryhodnými vývojáři a prošly zběžným bezpečnostním prověřením. Jsou aktivně udržovány v repozitáři s otevřeným kódem a jejich správci je považují za stabilní pro občasné až normální použití.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "U této aplikace nebyla provedena kontrola na bezpečnostní problémy. Aplikace je nová nebo nestabilní. Instalujte pouze na vlastní nebezpečí.",
+ "Enabling app …" : "Povolování aplikace …",
"Error while disabling app" : "Chyba při zakazování aplikace",
"Disable" : "Zakázat",
"Enable" : "Povolit",
@@ -84,6 +86,8 @@ OC.L10N.register(
"Google Chrome" : "Google Chrome",
"Safari" : "Safari",
"Google Chrome for Android" : "Google Chrome pro Android",
+ "iPhone iOS" : "iPhone iOS",
+ "iPad iOS" : "iPad iOS",
"iOS Client" : "iOS klient",
"Android Client" : "Android klient",
"Sync client - {os}" : "Sync klient - {os}",
@@ -243,13 +247,16 @@ OC.L10N.register(
"This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Tato aplikace nemá nastavenou žádnou maximální verzi Nextcloudu. To se v budoucnu projeví jako chyba.",
"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:",
"Enable only for specific groups" : "Povolit pouze pro vybrané skupiny",
+ "Uninstall app" : "Odinstalovat aplikaci",
"SSL Root Certificates" : "Kořenové certifikáty SSL",
"Common Name" : "Common Name",
"Valid until" : "Platný do",
"Issued By" : "Vydal",
"Valid until %s" : "Platný do %s",
"Import root certificate" : "Import kořenového certifikátu",
+ "Hey there,<br><br>just letting you know that you now have a %s account.<br><br>Your username: <strong>%s</strong><br>Access it: <strong><a href=\"%s\">%s</a></strong><br><br>" : "Vítej,<br><br>jen ti dáváme vědět, že nyní máš %s účet.<br><br>Tvé uživatelské jméno: <strong>%s</strong><br>Přístup: <strong><a href=\"%s\">%s</a></strong><br><br>",
"Cheers!" : "Ať slouží!",
+ "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Vítej,\n\njen ti dáváme vědět, že nyní máš %s účet.\n\nTvé uživatelské jméno: %s\nPřístup: %s\n\n",
"Administrator documentation" : "Dokumentace administrátora",
"Online documentation" : "Online dokumentace",
"Forum" : "Fórum",
diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json
index 14f5747b739..30ce1f499e0 100644
--- a/settings/l10n/cs_CZ.json
+++ b/settings/l10n/cs_CZ.json
@@ -29,6 +29,7 @@
"Unable to delete user." : "Nelze smazat uživatele.",
"Settings saved" : "Nastavení uloženo",
"Unable to change full name" : "Nelze změnit celé jméno",
+ "Unable to change email address" : "Nepodařilo se změnit e-mailovou adresu",
"Your full name has been changed." : "Vaše celé jméno bylo změněno.",
"Forbidden" : "Zakázáno",
"Invalid user" : "Neplatný uživatel",
@@ -55,6 +56,7 @@
"Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Oficiální aplikace jsou vyvíjeny komunitou. Poskytují klíčovou funkcionalitu a jsou připravené na produkční nasazení.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Schválené aplikace jsou vyvíjeny důvěryhodnými vývojáři a prošly zběžným bezpečnostním prověřením. Jsou aktivně udržovány v repozitáři s otevřeným kódem a jejich správci je považují za stabilní pro občasné až normální použití.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "U této aplikace nebyla provedena kontrola na bezpečnostní problémy. Aplikace je nová nebo nestabilní. Instalujte pouze na vlastní nebezpečí.",
+ "Enabling app …" : "Povolování aplikace …",
"Error while disabling app" : "Chyba při zakazování aplikace",
"Disable" : "Zakázat",
"Enable" : "Povolit",
@@ -82,6 +84,8 @@
"Google Chrome" : "Google Chrome",
"Safari" : "Safari",
"Google Chrome for Android" : "Google Chrome pro Android",
+ "iPhone iOS" : "iPhone iOS",
+ "iPad iOS" : "iPad iOS",
"iOS Client" : "iOS klient",
"Android Client" : "Android klient",
"Sync client - {os}" : "Sync klient - {os}",
@@ -241,13 +245,16 @@
"This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Tato aplikace nemá nastavenou žádnou maximální verzi Nextcloudu. To se v budoucnu projeví jako chyba.",
"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:",
"Enable only for specific groups" : "Povolit pouze pro vybrané skupiny",
+ "Uninstall app" : "Odinstalovat aplikaci",
"SSL Root Certificates" : "Kořenové certifikáty SSL",
"Common Name" : "Common Name",
"Valid until" : "Platný do",
"Issued By" : "Vydal",
"Valid until %s" : "Platný do %s",
"Import root certificate" : "Import kořenového certifikátu",
+ "Hey there,<br><br>just letting you know that you now have a %s account.<br><br>Your username: <strong>%s</strong><br>Access it: <strong><a href=\"%s\">%s</a></strong><br><br>" : "Vítej,<br><br>jen ti dáváme vědět, že nyní máš %s účet.<br><br>Tvé uživatelské jméno: <strong>%s</strong><br>Přístup: <strong><a href=\"%s\">%s</a></strong><br><br>",
"Cheers!" : "Ať slouží!",
+ "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Vítej,\n\njen ti dáváme vědět, že nyní máš %s účet.\n\nTvé uživatelské jméno: %s\nPřístup: %s\n\n",
"Administrator documentation" : "Dokumentace administrátora",
"Online documentation" : "Online dokumentace",
"Forum" : "Fórum",
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index 9c31c66d356..2463552498f 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -198,8 +198,8 @@ OC.L10N.register(
"Cron" : "Cron",
"Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
"Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
- "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
- "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen",
+ "Cron was not executed yet!" : "Cron wurde bislang noch nicht ausgeführt!",
+ "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden einer Seite ausführen",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
"Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
"The cron.php needs to be executed by the system user \"%s\"." : "Die cron.php muss durch den Systemnutzer \"%s\" ausgeführt werden.",
@@ -236,13 +236,13 @@ OC.L10N.register(
"by %s" : "von %s",
"%s-licensed" : "%s-Lizensiert",
"Documentation:" : "Dokumentation:",
- "User documentation" : "Dokumentation für Benutzer",
- "Admin documentation" : "Dokumentation für Administratoren",
+ "User documentation" : "Benutzer-Dokumentation",
+ "Admin documentation" : "Administratoren-Dokumentation",
"Visit website" : "Webseite besuchen",
"Report a bug" : "Melden Sie einen technischen Fehler",
"Show description …" : "Beschreibung anzeigen…",
"Hide description …" : "Beschreibung ausblenden…",
- "This app has an update available." : "Es ist eine Aktualisierung für diese Anwendung verfügbar.",
+ "This app has an update available." : "Für diese Anwendung ist eine Aktualisierung verfügbar.",
"This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.",
"This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.",
"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:",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index 226028661a3..01c0883803d 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -196,8 +196,8 @@
"Cron" : "Cron",
"Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
"Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
- "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
- "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen",
+ "Cron was not executed yet!" : "Cron wurde bislang noch nicht ausgeführt!",
+ "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden einer Seite ausführen",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
"Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
"The cron.php needs to be executed by the system user \"%s\"." : "Die cron.php muss durch den Systemnutzer \"%s\" ausgeführt werden.",
@@ -234,13 +234,13 @@
"by %s" : "von %s",
"%s-licensed" : "%s-Lizensiert",
"Documentation:" : "Dokumentation:",
- "User documentation" : "Dokumentation für Benutzer",
- "Admin documentation" : "Dokumentation für Administratoren",
+ "User documentation" : "Benutzer-Dokumentation",
+ "Admin documentation" : "Administratoren-Dokumentation",
"Visit website" : "Webseite besuchen",
"Report a bug" : "Melden Sie einen technischen Fehler",
"Show description …" : "Beschreibung anzeigen…",
"Hide description …" : "Beschreibung ausblenden…",
- "This app has an update available." : "Es ist eine Aktualisierung für diese Anwendung verfügbar.",
+ "This app has an update available." : "Für diese Anwendung ist eine Aktualisierung verfügbar.",
"This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.",
"This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.",
"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:",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 40cd725c8e8..e8f7ffbe369 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -30,7 +30,7 @@ OC.L10N.register(
"Your %s account was created" : "Votre compte %s a été créé",
"Unable to delete user." : "Impossible de supprimer l'utilisateur.",
"Settings saved" : "Paramètres sauvegardés",
- "Unable to change full name" : "Impossible de changer le nom complet",
+ "Unable to change full name" : "Impossible de modifier le nom complet",
"Unable to change email address" : "Impossible de modifier l'adresse e-mail",
"Your full name has been changed." : "Votre nom complet a été modifié.",
"Forbidden" : "Interdit",
@@ -203,7 +203,7 @@ OC.L10N.register(
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP",
"Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.",
"The cron.php needs to be executed by the system user \"%s\"." : "Le cron.php doit être exécuté par l'utilisateur système \"%s\".",
- "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'executer, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.",
+ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'exécuter, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.",
"Version" : "Version",
"Sharing" : "Partage",
"Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage",
@@ -299,9 +299,9 @@ OC.L10N.register(
"If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si vous voulez apporter votre appui au projet {contributeopen}joignez-vous à son développement{linkclose} ou {contributeopen}passez le mot{linkclose}!",
"Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion",
"Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.",
- "Device" : "Périphérique",
+ "Device" : "Appareil",
"Last activity" : "Dernière activité",
- "Passcodes that give an app or device permissions to access your account." : "Un mot de passe d'application est un mot de passe qui autorise une application ou un périphérique d'accéder à votre compte.",
+ "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.",
"Name" : "Nom",
"App name" : "Nom de l'application",
"Create new app password" : "Créer un nouveau mot de passe d'application",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index 205d9d80fb4..06dcd98c16d 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -28,7 +28,7 @@
"Your %s account was created" : "Votre compte %s a été créé",
"Unable to delete user." : "Impossible de supprimer l'utilisateur.",
"Settings saved" : "Paramètres sauvegardés",
- "Unable to change full name" : "Impossible de changer le nom complet",
+ "Unable to change full name" : "Impossible de modifier le nom complet",
"Unable to change email address" : "Impossible de modifier l'adresse e-mail",
"Your full name has been changed." : "Votre nom complet a été modifié.",
"Forbidden" : "Interdit",
@@ -201,7 +201,7 @@
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP",
"Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.",
"The cron.php needs to be executed by the system user \"%s\"." : "Le cron.php doit être exécuté par l'utilisateur système \"%s\".",
- "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'executer, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.",
+ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'exécuter, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.",
"Version" : "Version",
"Sharing" : "Partage",
"Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage",
@@ -297,9 +297,9 @@
"If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si vous voulez apporter votre appui au projet {contributeopen}joignez-vous à son développement{linkclose} ou {contributeopen}passez le mot{linkclose}!",
"Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion",
"Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.",
- "Device" : "Périphérique",
+ "Device" : "Appareil",
"Last activity" : "Dernière activité",
- "Passcodes that give an app or device permissions to access your account." : "Un mot de passe d'application est un mot de passe qui autorise une application ou un périphérique d'accéder à votre compte.",
+ "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.",
"Name" : "Nom",
"App name" : "Nom de l'application",
"Create new app password" : "Créer un nouveau mot de passe d'application",
diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js
index 5a9432fee4a..60645a30070 100644
--- a/settings/l10n/lt_LT.js
+++ b/settings/l10n/lt_LT.js
@@ -33,11 +33,13 @@ OC.L10N.register(
"Unable to add user to group %s" : "Nepavyko pridėti naudotojo į grupę %s",
"Unable to remove user from group %s" : "Nepavyko pašalinti naudotojo iš grupės %s",
"Couldn't update app." : "Nepavyko atnaujinti programėlės.",
+ "Add trusted domain" : "Pridėti patikimą domeną",
"Not saved" : "Neįrašyta",
"Sending..." : "Siunčiama...",
"Official" : "Oficiali",
"All" : "Viskas",
"Update to %s" : "Atnaujinti į %s",
+ "Enabling app …" : "Programėlė įjungiama",
"Error while disabling app" : "Klaida, išjungiant programėlę",
"Disable" : "Išjungti",
"Enable" : "Įjungti",
@@ -45,8 +47,11 @@ OC.L10N.register(
"Updating...." : "Atnaujinama...",
"Error while updating app" : "Įvyko klaida atnaujinant programą",
"Updated" : "Atnaujinta",
+ "Uninstalling ...." : "Išdiegiama...",
+ "Uninstall" : "Išdiegti",
"Approved" : "Patvirtinta",
"Experimental" : "Eksperimentinė",
+ "Disconnect" : "Atjungti",
"Internet Explorer" : "Internet Explorer",
"Edge" : "Edge",
"Firefox" : "Firefox",
@@ -66,6 +71,7 @@ OC.L10N.register(
"Only visible to local users" : "Matoma tik vietiniams naudotojams",
"Only visible to you" : "Matoma tik jums",
"Visible to local users and to trusted servers" : "Matoma tik vietiniams naudotojams ir patikimiems serveriams",
+ "Public" : "Viešai",
"Select a profile picture" : "Pasirinkite profilio paveikslą",
"Very weak password" : "Labai silpnas slaptažodis",
"Weak password" : "Silpnas slaptažodis",
@@ -75,6 +81,7 @@ OC.L10N.register(
"Groups" : "Grupės",
"undo" : "anuliuoti",
"never" : "niekada",
+ "Add group" : "Pridėti grupę",
"Password successfully changed" : "Slaptažodis sėkmingai pakeistas",
"Changing the password will result in data loss, because data recovery is not available for this user" : "Slaptažodžio pakeitimas sąlygos duomenų praradimą, kadangi šiam naudotojui nėra prieinamas duomenų atkūrimas",
"A valid username must be provided" : "Privalo būti pateiktas tinkamas naudotojo vardas",
diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json
index f4ecfdf0b3f..cd359354248 100644
--- a/settings/l10n/lt_LT.json
+++ b/settings/l10n/lt_LT.json
@@ -31,11 +31,13 @@
"Unable to add user to group %s" : "Nepavyko pridėti naudotojo į grupę %s",
"Unable to remove user from group %s" : "Nepavyko pašalinti naudotojo iš grupės %s",
"Couldn't update app." : "Nepavyko atnaujinti programėlės.",
+ "Add trusted domain" : "Pridėti patikimą domeną",
"Not saved" : "Neįrašyta",
"Sending..." : "Siunčiama...",
"Official" : "Oficiali",
"All" : "Viskas",
"Update to %s" : "Atnaujinti į %s",
+ "Enabling app …" : "Programėlė įjungiama",
"Error while disabling app" : "Klaida, išjungiant programėlę",
"Disable" : "Išjungti",
"Enable" : "Įjungti",
@@ -43,8 +45,11 @@
"Updating...." : "Atnaujinama...",
"Error while updating app" : "Įvyko klaida atnaujinant programą",
"Updated" : "Atnaujinta",
+ "Uninstalling ...." : "Išdiegiama...",
+ "Uninstall" : "Išdiegti",
"Approved" : "Patvirtinta",
"Experimental" : "Eksperimentinė",
+ "Disconnect" : "Atjungti",
"Internet Explorer" : "Internet Explorer",
"Edge" : "Edge",
"Firefox" : "Firefox",
@@ -64,6 +69,7 @@
"Only visible to local users" : "Matoma tik vietiniams naudotojams",
"Only visible to you" : "Matoma tik jums",
"Visible to local users and to trusted servers" : "Matoma tik vietiniams naudotojams ir patikimiems serveriams",
+ "Public" : "Viešai",
"Select a profile picture" : "Pasirinkite profilio paveikslą",
"Very weak password" : "Labai silpnas slaptažodis",
"Weak password" : "Silpnas slaptažodis",
@@ -73,6 +79,7 @@
"Groups" : "Grupės",
"undo" : "anuliuoti",
"never" : "niekada",
+ "Add group" : "Pridėti grupę",
"Password successfully changed" : "Slaptažodis sėkmingai pakeistas",
"Changing the password will result in data loss, because data recovery is not available for this user" : "Slaptažodžio pakeitimas sąlygos duomenų praradimą, kadangi šiam naudotojui nėra prieinamas duomenų atkūrimas",
"A valid username must be provided" : "Privalo būti pateiktas tinkamas naudotojo vardas",
diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js
index b0341ed675f..906bf2e7b53 100644
--- a/settings/l10n/ru.js
+++ b/settings/l10n/ru.js
@@ -60,7 +60,7 @@ OC.L10N.register(
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Это приложение не проверялось на наличие проблем с безопасностью, также оно может работать нестабильно. Устанавливайте на свой страх и риск.",
"Enabling app …" : "Включение приложения",
"Error while disabling app" : "Ошибка при отключении приложения",
- "Disable" : "Выключить",
+ "Disable" : "Отключить",
"Enable" : "Включить",
"Error while enabling app" : "Ошибка при включении приложения",
"Error: this app cannot be enabled because it makes the server unstable" : "Ошибка: это приложение не может быть включено, так как оно делает сервер нестабильным",
diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json
index 4e7f9fa9385..acc42b2cb49 100644
--- a/settings/l10n/ru.json
+++ b/settings/l10n/ru.json
@@ -58,7 +58,7 @@
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Это приложение не проверялось на наличие проблем с безопасностью, также оно может работать нестабильно. Устанавливайте на свой страх и риск.",
"Enabling app …" : "Включение приложения",
"Error while disabling app" : "Ошибка при отключении приложения",
- "Disable" : "Выключить",
+ "Disable" : "Отключить",
"Enable" : "Включить",
"Error while enabling app" : "Ошибка при включении приложения",
"Error: this app cannot be enabled because it makes the server unstable" : "Ошибка: это приложение не может быть включено, так как оно делает сервер нестабильным",
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index f3829364552..cc738f841ed 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -187,7 +187,7 @@ OC.L10N.register(
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din databas kör inte \"READ COMMITED\" transaktionsisoleringsnvån. Detta kan orsaka problem när flera åtgärder körs parallellt.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s under version %2$s är installerad, för stabilitet och prestanda rekommenderar vi uppdatering till en nyare %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen 'fileinfo' saknas. Vi rekommenderar starkt att aktivera den här modulen för att kunna upptäcka korrekt mime-typ.",
- "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Transactional file locking är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentationen ↗</a> för mer information.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "\"Transactional file locking\" är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentationen ↗</a> för mer information.",
"System locale can not be set to a one which supports UTF-8." : "Systemspråk kan inte ställas in till ett som stödjer UTF-8.",
"This means that there might be problems with certain characters in file names." : "Detta betyder att där kan komma att uppstå problem med vissa tecken i filnamn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi rekommenderar starkt att installera de nödvändiga paketen på ditt system för att stödja en av följande språkversioner: %s.",
@@ -196,8 +196,8 @@ OC.L10N.register(
"Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Var god att dubbelkolla <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installationsguiden ↗</a>, och kolla efter några ändringar eller varningar i <a href=\"%s\">loggfilen</a>.",
"All checks passed." : "Alla kontroller lyckades!",
"Cron" : "Cron",
- "Last cron job execution: %s." : "Sista cron kördes %s",
- "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes %s. Något verkar vara fel.",
+ "Last cron job execution: %s." : "Sista cron kördes för %s",
+ "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes för %s. Något verkar vara fel.",
"Cron was not executed yet!" : "Cron har inte körts ännu!",
"Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.",
@@ -309,7 +309,7 @@ OC.L10N.register(
"For security reasons this password will only be shown once." : "Av säkerhetsskäl kommer lösenordet endast att visas en gång",
"Username" : "Användarnamn",
"Done" : "Färdig",
- "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utvecklat av {communityopen}Nextclouds community{linkclose}, {githubopen}källkoden{linkclose} är licensierad enligt {licenseopen}AGPL-standard{linkclose}.",
+ "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utvecklat av {communityopen}Nextclouds community{linkclose}, {githubopen}källkoden{linkclose} är licensierad enligt {licenseopen}AGPL-standard{linkclose}.",
"Follow us on Google Plus!" : "Fälj oss på Google Plus!",
"Like our facebook page!" : "Gilla vår Facebooksida!",
"Subscribe to our twitter channel!" : "Prenumerera på vårt Twitterkonto!",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index f672d6be427..55a40b7173a 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -185,7 +185,7 @@
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din databas kör inte \"READ COMMITED\" transaktionsisoleringsnvån. Detta kan orsaka problem när flera åtgärder körs parallellt.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s under version %2$s är installerad, för stabilitet och prestanda rekommenderar vi uppdatering till en nyare %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen 'fileinfo' saknas. Vi rekommenderar starkt att aktivera den här modulen för att kunna upptäcka korrekt mime-typ.",
- "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Transactional file locking är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentationen ↗</a> för mer information.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "\"Transactional file locking\" är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentationen ↗</a> för mer information.",
"System locale can not be set to a one which supports UTF-8." : "Systemspråk kan inte ställas in till ett som stödjer UTF-8.",
"This means that there might be problems with certain characters in file names." : "Detta betyder att där kan komma att uppstå problem med vissa tecken i filnamn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi rekommenderar starkt att installera de nödvändiga paketen på ditt system för att stödja en av följande språkversioner: %s.",
@@ -194,8 +194,8 @@
"Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Var god att dubbelkolla <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installationsguiden ↗</a>, och kolla efter några ändringar eller varningar i <a href=\"%s\">loggfilen</a>.",
"All checks passed." : "Alla kontroller lyckades!",
"Cron" : "Cron",
- "Last cron job execution: %s." : "Sista cron kördes %s",
- "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes %s. Något verkar vara fel.",
+ "Last cron job execution: %s." : "Sista cron kördes för %s",
+ "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes för %s. Något verkar vara fel.",
"Cron was not executed yet!" : "Cron har inte körts ännu!",
"Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.",
@@ -307,7 +307,7 @@
"For security reasons this password will only be shown once." : "Av säkerhetsskäl kommer lösenordet endast att visas en gång",
"Username" : "Användarnamn",
"Done" : "Färdig",
- "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utvecklat av {communityopen}Nextclouds community{linkclose}, {githubopen}källkoden{linkclose} är licensierad enligt {licenseopen}AGPL-standard{linkclose}.",
+ "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utvecklat av {communityopen}Nextclouds community{linkclose}, {githubopen}källkoden{linkclose} är licensierad enligt {licenseopen}AGPL-standard{linkclose}.",
"Follow us on Google Plus!" : "Fälj oss på Google Plus!",
"Like our facebook page!" : "Gilla vår Facebooksida!",
"Subscribe to our twitter channel!" : "Prenumerera på vårt Twitterkonto!",
diff --git a/settings/personal.php b/settings/personal.php
index a5cf88a781d..a79e9764a6b 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -88,7 +88,7 @@ foreach($languageCodes as $lang) {
if($l->getLanguageCode() === $lang && substr($potentialName, 0, 1) !== '_') {//first check if the language name is in the translation file
$ln = array('code' => $lang, 'name' => $potentialName);
} elseif ($lang === 'en') {
- $ln = ['code' => $lang, 'name' => 'English'];
+ $ln = ['code' => $lang, 'name' => 'English (US)'];
}else{//fallback to language code
$ln=array('code'=>$lang, 'name'=>$lang);
}
diff --git a/settings/templates/apps.php b/settings/templates/apps.php
index 9f27b53e5e8..a4b08f11693 100644
--- a/settings/templates/apps.php
+++ b/settings/templates/apps.php
@@ -3,7 +3,9 @@ style('settings', 'settings');
vendor_script(
'core',
[
- 'handlebars/handlebars'
+ 'handlebars/handlebars',
+ 'marked/marked.min',
+ 'DOMPurify/dist/purify.min',
]
);
script(
@@ -24,7 +26,7 @@ script(
<?php if($_['appstoreEnabled']): ?>
<li>
- <a class="app-external" target="_blank" rel="noreferrer" href="https://docs.nextcloud.org/server/11/developer_manual/"><?php p($l->t('Developer documentation'));?> ↗</a>
+ <a class="app-external" target="_blank" rel="noreferrer" href="https://docs.nextcloud.org/server/12/developer_manual/"><?php p($l->t('Developer documentation'));?> ↗</a>
</li>
<?php endif; ?>
</script>
@@ -59,7 +61,7 @@ script(
<div class="app-detailpage"></div>
<div class="app-description-container hidden">
- <div class="app-description"><pre>{{description}}</pre></div>
+ <div class="app-description">{{{description}}}</div>
<!--<div class="app-changed">{{changed}}</div>-->
{{#if documentation}}
<p class="documentation">
diff --git a/settings/tests/js/appsSpec.js b/settings/tests/js/appsSpec.js
index aa785a6768e..4b917b425c1 100644
--- a/settings/tests/js/appsSpec.js
+++ b/settings/tests/js/appsSpec.js
@@ -185,23 +185,27 @@ describe('OC.Settings.Apps tests', function() {
{
id: 'foo',
name: 'Foo app',
+ description: 'Hello',
level: 0,
author: 'foo'
},
{
id: 'alpha',
name: 'Alpha app',
+ description: 'Hello',
level: 300,
author: ['alpha', 'beta']
},
{
id: 'nolevel',
name: 'No level',
+ description: 'Hello',
author: 'bar'
},
{
id: 'zork',
name: 'Some famous adventure game',
+ description: 'Hello',
level: 200,
author: 'baz'
@@ -209,6 +213,7 @@ describe('OC.Settings.Apps tests', function() {
{
id: 'delta',
name: 'Mathematical symbol',
+ description: 'Hello',
level: 200,
author: 'foobar'
}
@@ -223,29 +228,34 @@ describe('OC.Settings.Apps tests', function() {
'foo': {
id: 'foo',
name: 'Foo app',
+ description: 'Hello',
level: 0,
author: 'foo'
},
'alpha': {
id: 'alpha',
name: 'Alpha app',
+ description: 'Hello',
level: 300,
author: ['alpha', 'beta']
},
'nolevel': {
id: 'nolevel',
name: 'No level',
+ description: 'Hello',
author: 'bar'
},
'zork': {
id: 'zork',
name: 'Some famous adventure game',
+ description: 'Hello',
level: 200,
author: 'baz',
},
'delta': {
id: 'delta',
name: 'Mathematical symbol',
+ description: 'Hello',
level: 200,
author: 'foobar'
}
diff --git a/tests/Core/Command/Config/ListConfigsTest.php b/tests/Core/Command/Config/ListConfigsTest.php
index 0f170cee840..861c1f59d5e 100644
--- a/tests/Core/Command/Config/ListConfigsTest.php
+++ b/tests/Core/Command/Config/ListConfigsTest.php
@@ -285,10 +285,16 @@ class ListConfigsTest extends TestCase {
$this->systemConfig->expects($this->any())
->method('getValue')
->willReturnMap($systemConfigMap);
+ $this->appConfig->expects($this->any())
+ ->method('getValues')
+ ->willReturnMap($appConfig);
} else {
$this->systemConfig->expects($this->any())
->method('getFilteredValue')
->willReturnMap($systemConfigMap);
+ $this->appConfig->expects($this->any())
+ ->method('getFilteredValues')
+ ->willReturnMap($appConfig);
}
$this->appConfig->expects($this->any())
diff --git a/tests/Core/Controller/LostControllerTest.php b/tests/Core/Controller/LostControllerTest.php
index 3e7456648e4..0f9dcaead35 100644
--- a/tests/Core/Controller/LostControllerTest.php
+++ b/tests/Core/Controller/LostControllerTest.php
@@ -591,42 +591,4 @@ class LostControllerTest extends \Test\TestCase {
$this->assertSame($expectedResponse, $response);
}
- public function testSetPasswordEncryptionProceed() {
-
- /** @var LostController | PHPUnit_Framework_MockObject_MockObject $lostController */
- $lostController = $this->getMockBuilder(LostController::class)
- ->setConstructorArgs(
- [
- 'Core',
- $this->request,
- $this->urlGenerator,
- $this->userManager,
- $this->defaults,
- $this->l10n,
- $this->config,
- $this->secureRandom,
- 'lostpassword-noreply@localhost',
- $this->encryptionManager,
- $this->mailer,
- $this->timeFactory,
- $this->crypto
- ]
- )->setMethods(['checkPasswordResetToken'])->getMock();
-
- $lostController->expects($this->once())->method('checkPasswordResetToken')->willReturn(true);
-
- $user = $this->createMock(IUser::class);
- $user->method('setPassword')->willReturnCallback(
- function() {
- throw new PrivateKeyMissingException('user');
- }
- );
- $this->userManager->method('get')->with('user')->willReturn($user);
-
- $response = $lostController->setPassword('myToken', 'user', 'newpass', true);
-
- $expectedResponse = ['status' => 'success'];
- $this->assertSame($expectedResponse, $response);
- }
-
}
diff --git a/tests/Core/Controller/TwoFactorChallengeControllerTest.php b/tests/Core/Controller/TwoFactorChallengeControllerTest.php
index 9421a2537e8..bef343f9043 100644
--- a/tests/Core/Controller/TwoFactorChallengeControllerTest.php
+++ b/tests/Core/Controller/TwoFactorChallengeControllerTest.php
@@ -22,32 +22,52 @@
namespace Test\Core\Controller;
+use OC\Authentication\TwoFactorAuth\Manager;
use OC\Core\Controller\TwoFactorChallengeController;
+use OC_Util;
+use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\Authentication\TwoFactorAuth\IProvider;
+use OCP\Authentication\TwoFactorAuth\TwoFactorException;
+use OCP\IRequest;
+use OCP\ISession;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\IUserSession;
+use OCP\Template;
+use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
class TwoFactorChallengeControllerTest extends TestCase {
+ /** @var IRequest|PHPUnit_Framework_MockObject_MockObject */
private $request;
+
+ /** @var Manager|PHPUnit_Framework_MockObject_MockObject */
private $twoFactorManager;
+
+ /** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */
private $userSession;
+
+ /** @var ISession|PHPUnit_Framework_MockObject_MockObject */
private $session;
+
+ /** @var IURLGenerator|PHPUnit_Framework_MockObject_MockObject */
private $urlGenerator;
- /** @var TwoFactorChallengeController|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var TwoFactorChallengeController|PHPUnit_Framework_MockObject_MockObject */
private $controller;
protected function setUp() {
parent::setUp();
- $this->request = $this->getMockBuilder('\OCP\IRequest')->getMock();
- $this->twoFactorManager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager')
- ->disableOriginalConstructor()
- ->getMock();
- $this->userSession = $this->getMockBuilder('\OCP\IUserSession')->getMock();
- $this->session = $this->getMockBuilder('\OCP\ISession')->getMock();
- $this->urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')->getMock();
+ $this->request = $this->createMock(IRequest::class);
+ $this->twoFactorManager = $this->createMock(Manager::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->session = $this->createMock(ISession::class);
+ $this->urlGenerator = $this->createMock(IURLGenerator::class);
- $this->controller = $this->getMockBuilder('OC\Core\Controller\TwoFactorChallengeController')
+ $this->controller = $this->getMockBuilder(TwoFactorChallengeController::class)
->setConstructorArgs([
'core',
$this->request,
@@ -64,7 +84,7 @@ class TwoFactorChallengeControllerTest extends TestCase {
}
public function testSelectChallenge() {
- $user = $this->getMockBuilder('\OCP\IUser')->getMock();
+ $user = $this->getMockBuilder(IUser::class)->getMock();
$providers = [
'prov1',
'prov2',
@@ -82,27 +102,21 @@ class TwoFactorChallengeControllerTest extends TestCase {
->with($user)
->will($this->returnValue('backup'));
- $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorselectchallenge', [
+ $expected = new TemplateResponse('core', 'twofactorselectchallenge', [
'providers' => $providers,
'backupProvider' => 'backup',
'redirect_url' => '/some/url',
'logout_attribute' => 'logoutAttribute',
- ], 'guest');
+ ], 'guest');
$this->assertEquals($expected, $this->controller->selectChallenge('/some/url'));
}
public function testShowChallenge() {
- $user = $this->getMockBuilder('\OCP\IUser')->getMock();
- $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider')
- ->disableOriginalConstructor()
- ->getMock();
- $backupProvider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider')
- ->disableOriginalConstructor()
- ->getMock();
- $tmpl = $this->getMockBuilder('\OCP\Template')
- ->disableOriginalConstructor()
- ->getMock();
+ $user = $this->createMock(IUser::class);
+ $provider = $this->createMock(IProvider::class);
+ $backupProvider = $this->createMock(IProvider::class);
+ $tmpl = $this->createMock(Template::class);
$this->userSession->expects($this->once())
->method('getUser')
@@ -126,9 +140,9 @@ class TwoFactorChallengeControllerTest extends TestCase {
->method('exists')
->with('two_factor_auth_error')
->will($this->returnValue(true));
- $this->session->expects($this->once())
+ $this->session->expects($this->exactly(2))
->method('remove')
- ->with('two_factor_auth_error');
+ ->with($this->logicalOr($this->equalTo('two_factor_auth_error'), $this->equalTo('two_factor_auth_error_message')));
$provider->expects($this->once())
->method('getTemplate')
->with($user)
@@ -137,20 +151,21 @@ class TwoFactorChallengeControllerTest extends TestCase {
->method('fetchPage')
->will($this->returnValue('<html/>'));
- $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorshowchallenge', [
+ $expected = new TemplateResponse('core', 'twofactorshowchallenge', [
'error' => true,
'provider' => $provider,
'backupProvider' => $backupProvider,
'logout_attribute' => 'logoutAttribute',
'template' => '<html/>',
'redirect_url' => '/re/dir/ect/url',
+ 'error_message' => null,
], 'guest');
$this->assertEquals($expected, $this->controller->showChallenge('myprovider', '/re/dir/ect/url'));
}
public function testShowInvalidChallenge() {
- $user = $this->getMockBuilder('\OCP\IUser')->getMock();
+ $user = $this->createMock(IUser::class);
$this->userSession->expects($this->once())
->method('getUser')
@@ -164,16 +179,14 @@ class TwoFactorChallengeControllerTest extends TestCase {
->with('core.TwoFactorChallenge.selectChallenge')
->will($this->returnValue('select/challenge/url'));
- $expected = new \OCP\AppFramework\Http\RedirectResponse('select/challenge/url');
+ $expected = new RedirectResponse('select/challenge/url');
$this->assertEquals($expected, $this->controller->showChallenge('myprovider', 'redirect/url'));
}
public function testSolveChallenge() {
- $user = $this->getMockBuilder('\OCP\IUser')->getMock();
- $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider')
- ->disableOriginalConstructor()
- ->getMock();
+ $user = $this->createMock(IUser::class);
+ $provider = $this->createMock(IProvider::class);
$this->userSession->expects($this->once())
->method('getUser')
@@ -188,12 +201,37 @@ class TwoFactorChallengeControllerTest extends TestCase {
->with('myprovider', $user, 'token')
->will($this->returnValue(true));
- $expected = new \OCP\AppFramework\Http\RedirectResponse(\OC_Util::getDefaultPageUrl());
+ $expected = new RedirectResponse(OC_Util::getDefaultPageUrl());
$this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token'));
}
+ public function testSolveValidChallengeAndRedirect() {
+ $user = $this->createMock(IUser::class);
+ $provider = $this->createMock(IProvider::class);
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+ $this->twoFactorManager->expects($this->once())
+ ->method('getProvider')
+ ->with($user, 'myprovider')
+ ->will($this->returnValue($provider));
+
+ $this->twoFactorManager->expects($this->once())
+ ->method('verifyChallenge')
+ ->with('myprovider', $user, 'token')
+ ->willReturn(true);
+ $this->urlGenerator->expects($this->once())
+ ->method('getAbsoluteURL')
+ ->with('redirect url')
+ ->willReturn('redirect/url');
+
+ $expected = new RedirectResponse('redirect/url');
+ $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', 'redirect%20url'));
+ }
+
public function testSolveChallengeInvalidProvider() {
- $user = $this->getMockBuilder('\OCP\IUser')->getMock();
+ $user = $this->getMockBuilder(IUser::class)->getMock();
$this->userSession->expects($this->once())
->method('getUser')
@@ -207,16 +245,14 @@ class TwoFactorChallengeControllerTest extends TestCase {
->with('core.TwoFactorChallenge.selectChallenge')
->will($this->returnValue('select/challenge/url'));
- $expected = new \OCP\AppFramework\Http\RedirectResponse('select/challenge/url');
+ $expected = new RedirectResponse('select/challenge/url');
$this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token'));
}
public function testSolveInvalidChallenge() {
- $user = $this->getMockBuilder('\OCP\IUser')->getMock();
- $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider')
- ->disableOriginalConstructor()
- ->getMock();
+ $user = $this->createMock(IUser::class);
+ $provider = $this->createMock(IProvider::class);
$this->userSession->expects($this->once())
->method('getUser')
@@ -244,7 +280,45 @@ class TwoFactorChallengeControllerTest extends TestCase {
->method('getId')
->will($this->returnValue('myprovider'));
- $expected = new \OCP\AppFramework\Http\RedirectResponse('files/index/url');
+ $expected = new RedirectResponse('files/index/url');
+ $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', '/url'));
+ }
+
+ public function testSolveChallengeTwoFactorException() {
+ $user = $this->createMock(IUser::class);
+ $provider = $this->createMock(IProvider::class);
+ $exception = new TwoFactorException("2FA failed");
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+ $this->twoFactorManager->expects($this->once())
+ ->method('getProvider')
+ ->with($user, 'myprovider')
+ ->will($this->returnValue($provider));
+
+ $this->twoFactorManager->expects($this->once())
+ ->method('verifyChallenge')
+ ->with('myprovider', $user, 'token')
+ ->will($this->throwException($exception));
+ $this->session->expects($this->at(0))
+ ->method('set')
+ ->with('two_factor_auth_error_message', "2FA failed");
+ $this->session->expects($this->at(1))
+ ->method('set')
+ ->with('two_factor_auth_error', true);
+ $this->urlGenerator->expects($this->once())
+ ->method('linkToRoute')
+ ->with('core.TwoFactorChallenge.showChallenge', [
+ 'challengeProviderId' => 'myprovider',
+ 'redirect_url' => '/url',
+ ])
+ ->will($this->returnValue('files/index/url'));
+ $provider->expects($this->once())
+ ->method('getId')
+ ->will($this->returnValue('myprovider'));
+
+ $expected = new RedirectResponse('files/index/url');
$this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', '/url'));
}
diff --git a/tests/karma.config.js b/tests/karma.config.js
index 933d6c57410..e9aa38dd66f 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -110,7 +110,9 @@ module.exports = function(config) {
name: 'settings',
srcFiles: [
'settings/js/apps.js',
- 'settings/js/users/deleteHandler.js'
+ 'settings/js/users/deleteHandler.js',
+ 'core/vendor/marked/marked.min.js',
+ 'core/vendor/DOMPurify/dist/purify.min.js'
],
testFiles: [
'settings/tests/js/appsSpec.js',
@@ -220,11 +222,15 @@ module.exports = function(config) {
// serve images to avoid warnings
files.push({pattern: 'core/img/**/*', watched: false, included: false, served: true});
+ files.push({pattern: 'core/css/images/*', watched: false, included: false, served: true});
// include core CSS
files.push({pattern: 'core/css/*.css', watched: true, included: true, served: true});
files.push({pattern: 'tests/css/*.css', watched: true, included: true, served: true});
+ // Allow fonts
+ files.push({pattern: 'core/fonts/*', watched: false, included: false, served: true});
+
config.set({
// base path, that will be used to resolve files and exclude
@@ -243,9 +249,11 @@ module.exports = function(config) {
proxies: {
// prevent warnings for images
- '/context.html//core/img/': 'http://localhost:9876/base/core/img/',
- '/context.html//core/css/': 'http://localhost:9876/base/core/css/',
- '/context.html//core/fonts/': 'http://localhost:9876/base/core/fonts/'
+ '/base/tests/img/': 'http://localhost:9876/base/core/img/',
+ '/base/tests/css/': 'http://localhost:9876/base/core/css/',
+ '/base/core/css/images/': 'http://localhost:9876/base/core/css/images/',
+ '/actions/': 'http://localhost:9876/base/core/img/actions/',
+ '/base/core/fonts/': 'http://localhost:9876/base/core/fonts/'
},
// test results reporter to use
@@ -266,7 +274,7 @@ module.exports = function(config) {
reporters: [
{ type: 'html' },
{ type: 'cobertura' },
- { type: 'lcovonly' },
+ { type: 'lcovonly' }
]
},
diff --git a/tests/lib/AppConfigTest.php b/tests/lib/AppConfigTest.php
index c4da7507752..fed929352d3 100644
--- a/tests/lib/AppConfigTest.php
+++ b/tests/lib/AppConfigTest.php
@@ -8,6 +8,7 @@
*/
namespace Test;
+use OCP\IConfig;
/**
* Class AppConfigTest
@@ -305,6 +306,28 @@ class AppConfigTest extends TestCase {
$this->assertEquals($expected, $values);
}
+ public function testGetFilteredValues() {
+ /** @var \OC\AppConfig|\PHPUnit_Framework_MockObject_MockObject $config */
+ $config = $this->getMockBuilder(\OC\AppConfig::class)
+ ->setConstructorArgs([\OC::$server->getDatabaseConnection()])
+ ->setMethods(['getValues'])
+ ->getMock();
+
+ $config->expects($this->once())
+ ->method('getValues')
+ ->with('user_ldap', false)
+ ->willReturn([
+ 'ldap_agent_password' => 'secret',
+ 'ldap_dn' => 'dn',
+ ]);
+
+ $values = $config->getFilteredValues('user_ldap');
+ $this->assertEquals([
+ 'ldap_agent_password' => IConfig::SENSITIVE_VALUE,
+ 'ldap_dn' => 'dn',
+ ], $values);
+ }
+
public function testSettingConfigParallel() {
$appConfig1 = new \OC\AppConfig(\OC::$server->getDatabaseConnection());
$appConfig2 = new \OC\AppConfig(\OC::$server->getDatabaseConnection());
diff --git a/tests/lib/AppFramework/Controller/ControllerTest.php b/tests/lib/AppFramework/Controller/ControllerTest.php
index 63cc2873575..640853ccda9 100644
--- a/tests/lib/AppFramework/Controller/ControllerTest.php
+++ b/tests/lib/AppFramework/Controller/ControllerTest.php
@@ -182,7 +182,7 @@ class ControllerTest extends \Test\TestCase {
public function testFormatDataResponseJSON() {
$expectedHeaders = [
'test' => 'something',
- 'Cache-Control' => 'no-cache, must-revalidate',
+ 'Cache-Control' => 'no-cache, no-store, must-revalidate',
'Content-Type' => 'application/json; charset=utf-8',
'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'",
];
diff --git a/tests/lib/AppFramework/Http/DataResponseTest.php b/tests/lib/AppFramework/Http/DataResponseTest.php
index cde553cdf5f..159efded97a 100644
--- a/tests/lib/AppFramework/Http/DataResponseTest.php
+++ b/tests/lib/AppFramework/Http/DataResponseTest.php
@@ -67,7 +67,7 @@ class DataResponseTest extends \Test\TestCase {
$response = new DataResponse($data, $code, $headers);
$expectedHeaders = [
- 'Cache-Control' => 'no-cache, must-revalidate',
+ 'Cache-Control' => 'no-cache, no-store, must-revalidate',
'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'",
];
$expectedHeaders = array_merge($expectedHeaders, $headers);
diff --git a/tests/lib/AppFramework/Http/ResponseTest.php b/tests/lib/AppFramework/Http/ResponseTest.php
index 0c582f8f6ea..3ed946dc6ca 100644
--- a/tests/lib/AppFramework/Http/ResponseTest.php
+++ b/tests/lib/AppFramework/Http/ResponseTest.php
@@ -97,7 +97,7 @@ class ResponseTest extends \Test\TestCase {
public function testCacheHeadersAreDisabledByDefault(){
$headers = $this->childResponse->getHeaders();
- $this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
+ $this->assertEquals('no-cache, no-store, must-revalidate', $headers['Cache-Control']);
}
diff --git a/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php
index 5a988751070..164ea48de70 100644
--- a/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php
+++ b/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php
@@ -34,6 +34,7 @@ use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
use OC\Appframework\Middleware\Security\Exceptions\StrictCookieMissingException;
use OC\AppFramework\Middleware\Security\SecurityMiddleware;
use OC\AppFramework\Utility\ControllerMethodReflector;
+use OC\Security\Bruteforce\Throttler;
use OC\Security\CSP\ContentSecurityPolicy;
use OC\Security\CSP\ContentSecurityPolicyManager;
use OC\Security\CSP\ContentSecurityPolicyNonceManager;
@@ -82,6 +83,8 @@ class SecurityMiddlewareTest extends \Test\TestCase {
private $csrfTokenManager;
/** @var ContentSecurityPolicyNonceManager|\PHPUnit_Framework_MockObject_MockObject */
private $cspNonceManager;
+ /** @var Throttler|\PHPUnit_Framework_MockObject_MockObject */
+ private $bruteForceThrottler;
protected function setUp() {
parent::setUp();
@@ -96,6 +99,7 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$this->contentSecurityPolicyManager = $this->createMock(ContentSecurityPolicyManager::class);
$this->csrfTokenManager = $this->createMock(CsrfTokenManager::class);
$this->cspNonceManager = $this->createMock(ContentSecurityPolicyNonceManager::class);
+ $this->bruteForceThrottler = $this->getMockBuilder(Throttler::class)->disableOriginalConstructor()->getMock();
$this->middleware = $this->getMiddleware(true, true);
$this->secException = new SecurityException('hey', false);
$this->secAjaxException = new SecurityException('hey', true);
@@ -119,7 +123,8 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$isAdminUser,
$this->contentSecurityPolicyManager,
$this->csrfTokenManager,
- $this->cspNonceManager
+ $this->cspNonceManager,
+ $this->bruteForceThrottler
);
}
@@ -652,4 +657,70 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$this->assertEquals($response, $this->middleware->afterController($this->controller, 'test', $response));
}
+
+ /**
+ * @dataProvider dataTestBeforeControllerBruteForce
+ */
+ public function testBeforeControllerBruteForce($bruteForceProtectionEnabled) {
+ /** @var ControllerMethodReflector|\PHPUnit_Framework_MockObject_MockObject $reader */
+ $reader = $this->getMockBuilder(ControllerMethodReflector::class)->disableOriginalConstructor()->getMock();
+
+ $middleware = new SecurityMiddleware(
+ $this->request,
+ $reader,
+ $this->navigationManager,
+ $this->urlGenerator,
+ $this->logger,
+ $this->session,
+ 'files',
+ false,
+ false,
+ $this->contentSecurityPolicyManager,
+ $this->csrfTokenManager,
+ $this->cspNonceManager,
+ $this->bruteForceThrottler
+ );
+
+ $reader->expects($this->any())->method('hasAnnotation')
+ ->willReturnCallback(
+ function($annotation) use ($bruteForceProtectionEnabled) {
+
+ switch ($annotation) {
+ case 'BruteForceProtection':
+ return $bruteForceProtectionEnabled;
+ case 'PasswordConfirmationRequired':
+ case 'StrictCookieRequired':
+ return false;
+ case 'PublicPage':
+ case 'NoCSRFRequired':
+ return true;
+ }
+
+ return true;
+ }
+ );
+
+ $reader->expects($this->any())->method('getAnnotationParameter')->willReturn('action');
+ $this->request->expects($this->any())->method('getRemoteAddress')->willReturn('remoteAddress');
+
+ if ($bruteForceProtectionEnabled) {
+ $this->bruteForceThrottler->expects($this->once())->method('sleepDelay')
+ ->with('remoteAddress', 'action');
+ $this->bruteForceThrottler->expects($this->once())->method('registerAttempt')
+ ->with('action', 'remoteAddress');
+ } else {
+ $this->bruteForceThrottler->expects($this->never())->method('sleepDelay');
+ $this->bruteForceThrottler->expects($this->never())->method('registerAttempt');
+ }
+
+ $middleware->beforeController($this->controller, 'test');
+
+ }
+
+ public function dataTestBeforeControllerBruteForce() {
+ return [
+ [true],
+ [false]
+ ];
+ }
}
diff --git a/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php b/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php
index 92d767e9987..644245e1967 100644
--- a/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php
+++ b/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php
@@ -77,6 +77,19 @@ class ControllerMethodReflectorTest extends \Test\TestCase {
/**
+ * @Annotation parameter
+ */
+ public function testGetAnnotationParameter(){
+ $reader = new ControllerMethodReflector();
+ $reader->reflect(
+ '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
+ 'testGetAnnotationParameter'
+ );
+
+ $this->assertSame('parameter', $reader->getAnnotationParameter('Annotation'));
+ }
+
+ /**
* @Annotation
* @param test
*/
diff --git a/tests/lib/AppTest.php b/tests/lib/AppTest.php
index 575e32dd60c..a60a03a07f5 100644
--- a/tests/lib/AppTest.php
+++ b/tests/lib/AppTest.php
@@ -8,6 +8,7 @@
*/
namespace Test;
+
use OC\AppConfig;
use OCP\IAppConfig;
@@ -24,7 +25,7 @@ class AppTest extends \Test\TestCase {
const TEST_GROUP1 = 'group1';
const TEST_GROUP2 = 'group2';
- function appVersionsProvider() {
+ public function appVersionsProvider() {
return array(
// exact match
array(
@@ -338,7 +339,7 @@ class AppTest extends \Test\TestCase {
/**
* Providers for the app config values
*/
- function appConfigValuesProvider() {
+ public function appConfigValuesProvider() {
return array(
// logged in user1
array(
@@ -561,27 +562,30 @@ class AppTest extends \Test\TestCase {
/**
* Providers for the app data values
*/
- function appDataProvider() {
+ public function appDataProvider() {
return [
[
['description' => " \t This is a multiline \n test with \n \t \n \n some new lines "],
- ['description' => "This is a multiline test with\n\nsome new lines"]
+ ['description' => "This is a multiline \n test with \n \t \n \n some new lines"],
],
[
['description' => " \t This is a multiline \n test with \n \t some new lines "],
- ['description' => "This is a multiline test with some new lines"]
+ ['description' => "This is a multiline \n test with \n \t some new lines"],
],
[
['description' => hex2bin('5065726d657420646520732761757468656e7469666965722064616e732070697769676f20646972656374656d656e74206176656320736573206964656e74696669616e7473206f776e636c6f75642073616e73206c65732072657461706572206574206d657420c3a0206a6f757273206365757820636920656e20636173206465206368616e67656d656e74206465206d6f742064652070617373652e0d0a0d')],
- ['description' => "Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe."]
+ ['description' => "Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe."],
],
[
['not-a-description' => " \t This is a multiline \n test with \n \t some new lines "],
- ['not-a-description' => " \t This is a multiline \n test with \n \t some new lines "]
+ [
+ 'not-a-description' => " \t This is a multiline \n test with \n \t some new lines ",
+ 'description' => '',
+ ],
],
[
['description' => [100, 'bla']],
- ['description' => ""]
+ ['description' => ''],
],
];
}
diff --git a/tests/lib/Encryption/Keys/StorageTest.php b/tests/lib/Encryption/Keys/StorageTest.php
index b5b91f886a3..4e9719351f3 100644
--- a/tests/lib/Encryption/Keys/StorageTest.php
+++ b/tests/lib/Encryption/Keys/StorageTest.php
@@ -510,4 +510,47 @@ class StorageTest extends TestCase {
];
}
+
+ /**
+ * @dataProvider dataTestBackupUserKeys
+ * @param bool $createBackupDir
+ */
+ public function testBackupUserKeys($createBackupDir) {
+
+ $storage = $this->getMockBuilder('OC\Encryption\Keys\Storage')
+ ->setConstructorArgs([$this->view, $this->util])
+ ->setMethods(['getTimestamp'])
+ ->getMock();
+
+ $storage->expects($this->any())->method('getTimestamp')->willReturn('1234567');
+
+ $this->view->expects($this->once())->method('file_exists')
+ ->with('user1/files_encryption/backup')->willReturn(!$createBackupDir);
+
+ if ($createBackupDir) {
+ $this->view->expects($this->at(1))->method('mkdir')
+ ->with('user1/files_encryption/backup');
+ $this->view->expects($this->at(2))->method('mkdir')
+ ->with('user1/files_encryption/backup/test.encryptionModule.1234567');
+ } else {
+ $this->view->expects($this->once())->method('mkdir')
+ ->with('user1/files_encryption/backup/test.encryptionModule.1234567');
+ }
+
+ $this->view->expects($this->once())->method('copy')
+ ->with(
+ 'user1/files_encryption/encryptionModule',
+ 'user1/files_encryption/backup/test.encryptionModule.1234567'
+ )->willReturn(true);
+
+ $this->assertTrue($storage->backupUserKeys('encryptionModule', 'test', 'user1'));
+
+ }
+
+ public function dataTestBackupUserKeys() {
+ return [
+ [true], [false]
+ ];
+ }
+
}
diff --git a/tests/lib/Files/Utils/ScannerTest.php b/tests/lib/Files/Utils/ScannerTest.php
index 7895331d615..1379bc2e906 100644
--- a/tests/lib/Files/Utils/ScannerTest.php
+++ b/tests/lib/Files/Utils/ScannerTest.php
@@ -11,6 +11,7 @@ namespace Test\Files\Utils;
use OC\Files\Filesystem;
use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Temporary;
+use OCA\Files_Sharing\SharedStorage;
use OCP\Files\Config\IMountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IUser;
@@ -188,4 +189,24 @@ class ScannerTest extends \Test\TestCase {
$this->assertNotEquals($oldRoot->getEtag(), $newRoot->getEtag());
}
+
+ public function testSkipLocalShares() {
+ $sharedStorage = $this->createMock(SharedStorage::class);
+ $sharedMount = new MountPoint($sharedStorage, '/share');
+ Filesystem::getMountManager()->addMount($sharedMount);
+
+ $sharedStorage->expects($this->any())
+ ->method('instanceOfStorage')
+ ->will($this->returnValueMap([
+ [SharedStorage::class, true],
+ ]));
+ $sharedStorage->expects($this->never())
+ ->method('getScanner');
+
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+ $scanner->addMount($sharedMount);
+ $scanner->scan('');
+
+ $scanner->backgroundScan('');
+ }
}
diff --git a/tests/lib/LoggerTest.php b/tests/lib/LoggerTest.php
index abb9deebd55..da9cedc9f56 100644
--- a/tests/lib/LoggerTest.php
+++ b/tests/lib/LoggerTest.php
@@ -138,4 +138,22 @@ class LoggerTest extends TestCase {
}
}
+ public function dataGetLogClass() {
+ return [
+ ['file', \OC\Log\File::class],
+ ['errorlog', \OC\Log\Errorlog::class],
+ ['syslog', \OC\Log\Syslog::class],
+
+ ['owncloud', \OC\Log\File::class],
+ ['nextcloud', \OC\Log\File::class],
+ ['foobar', \OC\Log\File::class],
+ ];
+ }
+
+ /**
+ * @dataProvider dataGetLogClass
+ */
+ public function testGetLogClass($type, $class) {
+ $this->assertEquals($class, Log::getLogClass($type));
+ }
}
diff --git a/tests/lib/Mail/MailerTest.php b/tests/lib/Mail/MailerTest.php
index c63ceb5982a..7a7ce0392e9 100644
--- a/tests/lib/Mail/MailerTest.php
+++ b/tests/lib/Mail/MailerTest.php
@@ -44,7 +44,7 @@ class MailerTest extends TestCase {
$this->config
->expects($this->once())
->method('getSystemValue')
- ->with('mail_smtpmode', 'sendmail')
+ ->with('mail_smtpmode', 'php')
->will($this->returnValue('sendmail'));
$this->assertEquals(\Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs'), self::invokePrivate($this->mailer, 'getSendMailInstance'));
@@ -54,7 +54,7 @@ class MailerTest extends TestCase {
$this->config
->expects($this->once())
->method('getSystemValue')
- ->with('mail_smtpmode', 'sendmail')
+ ->with('mail_smtpmode', 'php')
->will($this->returnValue('qmail'));
$this->assertEquals(\Swift_SendmailTransport::newInstance('/var/qmail/bin/sendmail -bs'), self::invokePrivate($this->mailer, 'getSendMailInstance'));
diff --git a/tests/lib/PreviewTest.php b/tests/lib/PreviewTest.php
deleted file mode 100644
index 2d6f53e2ce8..00000000000
--- a/tests/lib/PreviewTest.php
+++ /dev/null
@@ -1,963 +0,0 @@
-<?php
-/**
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Olivier Paroz <owncloud@interfasys.ch>
- *
- * @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 Test;
-
-use OC\Files\FileInfo;
-use OC\Files\Filesystem;
-use OC\Files\Storage\Temporary;
-use OC\Files\View;
-use OC\Preview;
-use Test\Traits\MountProviderTrait;
-use Test\Traits\UserTrait;
-
-/**
- * Class PreviewTest
- *
- * @group DB
- *
- * @package Test
- */
-class PreviewTest extends TestCase {
- use UserTrait;
- use MountProviderTrait;
-
- const TEST_PREVIEW_USER1 = "test-preview-user1";
-
- /** @var View */
- private $rootView;
- /**
- * Note that using 756 with an image with a ratio of 1.6 brings interesting rounding issues
- *
- * @var int maximum width allowed for a preview
- * */
- private $configMaxWidth = 756;
- /** @var int maximum height allowed for a preview */
- private $configMaxHeight = 756;
- private $keepAspect;
- private $scalingUp;
-
- private $samples = [];
- private $sampleFileId;
- private $sampleFilename;
- private $sampleWidth;
- private $sampleHeight;
- private $maxScaleFactor;
- /** @var int width of the max preview */
- private $maxPreviewWidth;
- /** @var int height of the max preview */
- private $maxPreviewHeight;
- /** @var int height of the max preview, which is the same as the one of the original image */
- private $maxPreviewRatio;
- private $cachedBigger = [];
-
- /**
- * Make sure your configuration file doesn't contain any additional providers
- */
- protected function setUp() {
- parent::setUp();
-
- $this->createUser(self::TEST_PREVIEW_USER1, self::TEST_PREVIEW_USER1);
- $this->loginAsUser(self::TEST_PREVIEW_USER1);
-
- $storage = new Temporary([]);
- Filesystem::mount($storage, [], '/' . self::TEST_PREVIEW_USER1 . '/');
-
- $this->rootView = new View('');
- $this->rootView->mkdir('/' . self::TEST_PREVIEW_USER1);
- $this->rootView->mkdir('/' . self::TEST_PREVIEW_USER1 . '/files');
-
- // We simulate the max dimension set in the config
- \OC::$server->getConfig()
- ->setSystemValue('preview_max_x', $this->configMaxWidth);
- \OC::$server->getConfig()
- ->setSystemValue('preview_max_y', $this->configMaxHeight);
- // Used to test upscaling
- $this->maxScaleFactor = 2;
- \OC::$server->getConfig()
- ->setSystemValue('preview_max_scale_factor', $this->maxScaleFactor);
-
- // We need to enable the providers we're going to use in the tests
- $providers = [
- 'OC\\Preview\\JPEG',
- 'OC\\Preview\\PNG',
- 'OC\\Preview\\GIF',
- 'OC\\Preview\\TXT',
- 'OC\\Preview\\Postscript'
- ];
- \OC::$server->getConfig()
- ->setSystemValue('enabledPreviewProviders', $providers);
-
- // Sample is 1680x1050 JPEG
- $this->prepareSample('testimage.jpg', 1680, 1050);
- // Sample is 2400x1707 EPS
- $this->prepareSample('testimage.eps', 2400, 1707);
- // Sample is 1200x450 PNG
- $this->prepareSample('testimage-wide.png', 1200, 450);
- // Sample is 64x64 GIF
- $this->prepareSample('testimage.gif', 64, 64);
- }
-
- protected function tearDown() {
- $this->logout();
-
- parent::tearDown();
- }
-
- /**
- * Tests if a preview can be deleted
- */
- public function testIsPreviewDeleted() {
-
- $sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/test.txt';
-
- $this->rootView->file_put_contents($sampleFile, 'dummy file data');
-
- $x = 50;
- $y = 50;
-
- $preview = new Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.txt', $x, $y);
- $preview->getPreview();
-
- $fileInfo = $this->rootView->getFileInfo($sampleFile);
- /** @var int $fileId */
- $fileId = $fileInfo['fileid'];
- $thumbCacheFile = $this->buildCachePath($fileId, $x, $y, true);
-
- $this->assertSame(
- true, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n"
- );
-
- $preview->deletePreview();
-
- $this->assertSame(false, $this->rootView->file_exists($thumbCacheFile));
- }
-
- /**
- * Tests if all previews can be deleted
- *
- * We test this first to make sure we'll be able to cleanup after each preview generating test
- */
- public function testAreAllPreviewsDeleted() {
-
- $sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/test.txt';
-
- $this->rootView->file_put_contents($sampleFile, 'dummy file data');
-
- $x = 50;
- $y = 50;
-
- $preview = new Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.txt', $x, $y);
- $preview->getPreview();
-
- $fileInfo = $this->rootView->getFileInfo($sampleFile);
- /** @var int $fileId */
- $fileId = $fileInfo['fileid'];
-
- $thumbCacheFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . Preview::THUMBNAILS_FOLDER .
- '/' . $fileId . '/';
-
- $this->assertSame(true, $this->rootView->is_dir($thumbCacheFolder), "$thumbCacheFolder \n");
-
- $preview->deleteAllPreviews();
-
- $this->assertSame(false, $this->rootView->is_dir($thumbCacheFolder));
- }
-
- public function txtBlacklist() {
- $txt = 'random text file';
-
- return [
- ['txt', $txt, false],
- ];
- }
-
- /**
- * @dataProvider txtBlacklist
- *
- * @param $extension
- * @param $data
- * @param $expectedResult
- */
- public function testIsTransparent($extension, $data, $expectedResult) {
-
- $x = 32;
- $y = 32;
-
- $sample = '/' . self::TEST_PREVIEW_USER1 . '/files/test.' . $extension;
- $this->rootView->file_put_contents($sample, $data);
- $preview = new Preview(
- self::TEST_PREVIEW_USER1, 'files/', 'test.' . $extension, $x,
- $y
- );
- $image = $preview->getPreview();
- $resource = $image->resource();
-
- //http://stackoverflow.com/questions/5702953/imagecolorat-and-transparency
- $colorIndex = imagecolorat($resource, 1, 1);
- $colorInfo = imagecolorsforindex($resource, $colorIndex);
- $this->assertSame(
- $expectedResult,
- $colorInfo['alpha'] === 127,
- 'Failed asserting that only previews for text files are transparent.'
- );
- }
-
- /**
- * Tests if unsupported previews return an empty object
- */
- public function testUnsupportedPreviewsReturnEmptyObject() {
- $width = 400;
- $height = 200;
-
- // Previews for odt files are not enabled
- $imgData = file_get_contents(\OC::$SERVERROOT . '/tests/data/testimage.odt');
- $imgPath = '/' . self::TEST_PREVIEW_USER1 . '/files/testimage.odt';
- $this->rootView->file_put_contents($imgPath, $imgData);
-
- $preview =
- new Preview(self::TEST_PREVIEW_USER1, 'files/', 'testimage.odt', $width, $height);
- $preview->getPreview();
- $image = $preview->getPreview();
-
- $this->assertSame(false, $image->valid());
- }
-
- /**
- * We generate the data to use as it makes it easier to adjust in case we need to test
- * something different
- *
- * @return array
- */
- public static function dimensionsDataProvider() {
- $data = [];
- $samples = [
- [200, 800],
- [200, 800],
- [50, 400],
- [4, 60],
- ];
- $keepAspect = false;
- $scalingUp = false;
-
- for ($a = 0; $a < sizeof($samples); $a++) {
- for ($b = 0; $b < 2; $b++) {
- for ($c = 0; $c < 2; $c++) {
- for ($d = 0; $d < 4; $d++) {
- $coordinates = [
- [
- -rand($samples[$a][0], $samples[$a][1]),
- -rand($samples[$a][0], $samples[$a][1])
- ],
- [
- rand($samples[$a][0], $samples[$a][1]),
- rand($samples[$a][0], $samples[$a][1])
- ],
- [
- -rand($samples[$a][0], $samples[$a][1]),
- rand($samples[$a][0], $samples[$a][1])
- ],
- [
- rand($samples[$a][0], $samples[$a][1]),
- -rand($samples[$a][0], $samples[$a][1])
- ]
- ];
- $row = [$a];
- $row[] = $coordinates[$d][0];
- $row[] = $coordinates[$d][1];
- $row[] = $keepAspect;
- $row[] = $scalingUp;
- $data[] = $row;
- }
- $scalingUp = !$scalingUp;
- }
- $keepAspect = !$keepAspect;
- }
- }
-
- return $data;
- }
-
- /**
- * Tests if a preview of max dimensions gets created
- *
- * @requires extension imagick
- * @dataProvider dimensionsDataProvider
- *
- * @param int $sampleId
- * @param int $widthAdjustment
- * @param int $heightAdjustment
- * @param bool $keepAspect
- * @param bool $scalingUp
- */
- public function testCreateMaxAndNormalPreviewsAtFirstRequest(
- $sampleId, $widthAdjustment, $heightAdjustment, $keepAspect = false, $scalingUp = false
- ) {
- // Get the right sample for the experiment
- $this->getSample($sampleId);
- $sampleWidth = $this->sampleWidth;
- $sampleHeight = $this->sampleHeight;
- $sampleFileId = $this->sampleFileId;
-
- // Adjust the requested size so that we trigger various test cases
- $previewWidth = $sampleWidth + $widthAdjustment;
- $previewHeight = $sampleHeight + $heightAdjustment;
- $this->keepAspect = $keepAspect;
- $this->scalingUp = $scalingUp;
-
- // Generates the max preview
- $preview = $this->createPreview($previewWidth, $previewHeight);
-
- // There should be no cached thumbnails
- $thumbnailFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . Preview::THUMBNAILS_FOLDER .
- '/' . $sampleFileId;
- $this->assertSame(false, $this->rootView->is_dir($thumbnailFolder));
-
- $image = $preview->getPreview();
- $this->assertNotSame(false, $image);
-
- $maxThumbCacheFile = $this->buildCachePath(
- $sampleFileId, $this->maxPreviewWidth, $this->maxPreviewHeight, true, '-max'
- );
-
- $this->assertSame(
- true, $this->rootView->file_exists($maxThumbCacheFile), "$maxThumbCacheFile \n"
- );
-
- // We check the dimensions of the file we've just stored
- $maxPreview = imagecreatefromstring($this->rootView->file_get_contents($maxThumbCacheFile));
-
- $this->assertEquals($this->maxPreviewWidth, imagesx($maxPreview));
- $this->assertEquals($this->maxPreviewHeight, imagesy($maxPreview));
-
- // A thumbnail of the asked dimensions should also have been created (within the constraints of the max preview)
- list($limitedPreviewWidth, $limitedPreviewHeight) =
- $this->simulatePreviewDimensions($previewWidth, $previewHeight);
-
- $actualWidth = $image->width();
- $actualHeight = $image->height();
-
- $this->assertEquals(
- (int)$limitedPreviewWidth, $image->width(), "$actualWidth x $actualHeight \n"
- );
- $this->assertEquals((int)$limitedPreviewHeight, $image->height());
-
- // And it should be cached
- $this->checkCache($sampleFileId, $limitedPreviewWidth, $limitedPreviewHeight);
-
- $preview->deleteAllPreviews();
- }
-
- /**
- * Tests if the second preview will be based off the cached max preview
- *
- * @requires extension imagick
- * @dataProvider dimensionsDataProvider
- *
- * @param int $sampleId
- * @param int $widthAdjustment
- * @param int $heightAdjustment
- * @param bool $keepAspect
- * @param bool $scalingUp
- */
- public function testSecondPreviewsGetCachedMax(
- $sampleId, $widthAdjustment, $heightAdjustment, $keepAspect = false, $scalingUp = false
- ) {
- //$this->markTestSkipped('Not testing this at this time');
-
- $this->getSample($sampleId);
- $sampleWidth = $this->sampleWidth;
- $sampleHeight = $this->sampleHeight;
- $sampleFileId = $this->sampleFileId;
-
- //Creates the Max preview which will be used in the rest of the test
- $this->createMaxPreview();
-
- // Adjust the requested size so that we trigger various test cases
- $previewWidth = $sampleWidth + $widthAdjustment;
- $previewHeight = $sampleHeight + $heightAdjustment;
- $this->keepAspect = $keepAspect;
- $this->scalingUp = $scalingUp;
-
- $preview = $this->createPreview($previewWidth, $previewHeight);
-
- // A cache query should return the thumbnail of max dimension
- $isCached = $preview->isCached($sampleFileId);
- $cachedMaxPreview = $this->buildCachePath(
- $sampleFileId, $this->maxPreviewWidth, $this->maxPreviewHeight, false, '-max'
- );
- $this->assertSame($cachedMaxPreview, $isCached);
- }
-
- /**
- * Make sure that the max preview can never be deleted
- *
- * For this test to work, the preview we generate first has to be the size of max preview
- */
- public function testMaxPreviewCannotBeDeleted() {
- //$this->markTestSkipped('Not testing this at this time');
-
- $this->keepAspect = true;
- $this->getSample(0);
- $fileId = $this->sampleFileId;
-
- //Creates the Max preview which we will try to delete
- $preview = $this->createMaxPreview();
-
- // We try to deleted the preview
- $preview->deletePreview();
- $this->assertNotSame(false, $preview->isCached($fileId));
-
- $preview->deleteAllPreviews();
- }
-
- public static function aspectDataProvider() {
- $data = [];
- $samples = 4;
- $keepAspect = false;
- $scalingUp = false;
- for ($a = 0; $a < $samples; $a++) {
- for ($b = 0; $b < 2; $b++) {
- for ($c = 0; $c < 2; $c++) {
- $row = [$a];
- $row[] = $keepAspect;
- $row[] = $scalingUp;
- $data[] = $row;
- $scalingUp = !$scalingUp;
- }
- $keepAspect = !$keepAspect;
- }
- }
-
- return $data;
- }
-
- /**
- * We ask for a preview larger than what is set in the configuration,
- * so we should be getting either the max preview or a preview the size
- * of the dimensions set in the config
- *
- * @requires extension imagick
- * @dataProvider aspectDataProvider
- *
- * @param int $sampleId
- * @param bool $keepAspect
- * @param bool $scalingUp
- */
- public function testDoNotCreatePreviewsLargerThanConfigMax(
- $sampleId, $keepAspect = false, $scalingUp = false
- ) {
- //$this->markTestSkipped('Not testing this at this time');
-
- $this->getSample($sampleId);
-
- //Creates the Max preview which will be used in the rest of the test
- $this->createMaxPreview();
-
- // Now we will create the real preview
- $previewWidth = 4000;
- $previewHeight = 4000;
- $this->keepAspect = $keepAspect;
- $this->scalingUp = $scalingUp;
-
- // Tries to create the very large preview
- $preview = $this->createPreview($previewWidth, $previewHeight);
-
- $image = $preview->getPreview();
- $this->assertNotSame(false, $image);
-
- list($expectedWidth, $expectedHeight) =
- $this->simulatePreviewDimensions($previewWidth, $previewHeight);
- $this->assertEquals($expectedWidth, $image->width());
- $this->assertEquals($expectedHeight, $image->height());
-
- // A preview of the asked size should not have been created since it's larger that our max dimensions
- $postfix = $this->getThumbnailPostfix($previewWidth, $previewHeight);
- $thumbCacheFile = $this->buildCachePath(
- $this->sampleFileId, $previewWidth, $previewHeight, false, $postfix
- );
- $this->assertSame(
- false, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n"
- );
-
- $preview->deleteAllPreviews();
- }
-
- /**
- * Makes sure we're getting the proper cached thumbnail
- *
- * When we start by generating a preview which keeps the aspect ratio
- * 200-125-with-aspect
- * 300-300 ✓
- *
- * When we start by generating a preview of exact dimensions
- * 200-200 ✓
- * 300-188-with-aspect
- *
- * @requires extension imagick
- * @dataProvider aspectDataProvider
- *
- * @param int $sampleId
- * @param bool $keepAspect
- * @param bool $scalingUp
- */
- public function testIsBiggerWithAspectRatioCached(
- $sampleId, $keepAspect = false, $scalingUp = false
- ) {
- //$this->markTestSkipped('Not testing this at this time');
-
- $previewWidth = 400;
- $previewHeight = 400;
- $this->getSample($sampleId);
- $fileId = $this->sampleFileId;
- $this->keepAspect = $keepAspect;
- $this->scalingUp = $scalingUp;
-
- // Caching the max preview in our preview array for the test
- $this->cachedBigger[] = $this->buildCachePath(
- $fileId, $this->maxPreviewWidth, $this->maxPreviewHeight, false, '-max'
- );
-
- $this->getSmallerThanMaxPreview($fileId, $previewWidth, $previewHeight);
- // We switch the aspect ratio, to generate a thumbnail we should not be picked up
- $this->keepAspect = !$keepAspect;
- $this->getSmallerThanMaxPreview($fileId, $previewWidth + 100, $previewHeight + 100);
-
- // Small thumbnails are always cropped
- $this->keepAspect = false;
- // Smaller previews should be based on the previous, larger preview, with the correct aspect ratio
- $this->createThumbnailFromBiggerCachedPreview($fileId, 32, 32);
-
- // 2nd cache query should indicate that we have a cached copy of the exact dimension
- $this->getCachedSmallThumbnail($fileId, 32, 32);
-
- // We create a preview in order to be able to delete the cache
- $preview = $this->createPreview(rand(), rand());
- $preview->deleteAllPreviews();
- $this->cachedBigger = [];
- }
-
- /**
- * Initialises the preview
- *
- * @param int $width
- * @param int $height
- *
- * @return Preview
- */
- private function createPreview($width, $height) {
- $preview = new Preview(
- self::TEST_PREVIEW_USER1, 'files/', $this->sampleFilename, $width,
- $height
- );
-
- $this->assertSame(true, $preview->isFileValid());
-
- $preview->setKeepAspect($this->keepAspect);
- $preview->setScalingup($this->scalingUp);
-
- return $preview;
- }
-
- /**
- * Creates the Max preview which will be used in the rest of the test
- *
- * @return Preview
- */
- private function createMaxPreview() {
- $this->keepAspect = true;
- $preview = $this->createPreview($this->maxPreviewWidth, $this->maxPreviewHeight);
- $preview->getPreview();
-
- return $preview;
- }
-
- /**
- * Makes sure the preview which was just created has been saved to disk
- *
- * @param int $fileId
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function checkCache($fileId, $previewWidth, $previewHeight) {
- $postfix = $this->getThumbnailPostfix($previewWidth, $previewHeight);
-
- $thumbCacheFile = $this->buildCachePath(
- $fileId, $previewWidth, $previewHeight, true, $postfix
- );
-
- $this->assertSame(
- true, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n"
- );
- }
-
- /**
- * Computes special filename postfixes
- *
- * @param int $width
- * @param int $height
- *
- * @return string
- */
- private function getThumbnailPostfix($width, $height) {
- // Need to take care of special postfix added to the dimensions
- $postfix = '';
- $isMaxPreview = ($width === $this->maxPreviewWidth
- && $height === $this->maxPreviewHeight) ? true : false;
- if ($isMaxPreview) {
- $postfix = '-max';
- }
- if ($this->keepAspect && !$isMaxPreview) {
- $postfix = '-with-aspect';
- }
-
- return $postfix;
- }
-
- private function getSmallerThanMaxPreview($fileId, $previewWidth, $previewHeight) {
- $preview = $this->createPreview($previewWidth, $previewHeight);
-
- $image = $preview->getPreview();
- $this->assertNotSame(false, $image);
-
- // A thumbnail of the asked dimensions should also have been created (within the constraints of the max preview)
- list($limitedPreviewWidth, $limitedPreviewHeight) =
- $this->simulatePreviewDimensions($previewWidth, $previewHeight);
-
- $this->assertEquals($limitedPreviewWidth, $image->width());
- $this->assertEquals($limitedPreviewHeight, $image->height());
-
- // And it should be cached
- $this->checkCache($fileId, $limitedPreviewWidth, $limitedPreviewHeight);
-
- $this->cachedBigger[] = $preview->isCached($fileId);
- }
-
- private function createThumbnailFromBiggerCachedPreview($fileId, $width, $height) {
- $preview = $this->createPreview($width, $height);
-
- // A cache query should return a thumbnail of slightly larger dimensions
- // and with the proper aspect ratio
- $isCached = $preview->isCached($fileId);
- $expectedCachedBigger = $this->getExpectedCachedBigger();
-
- $this->assertSame($expectedCachedBigger, $isCached);
-
- $image = $preview->getPreview();
- $this->assertNotSame(false, $image);
- }
-
- /**
- * Picks the bigger cached preview with the correct aspect ratio or the max preview if it's
- * smaller than that
- *
- * For non-upscaled images, we pick the only picture without aspect ratio
- *
- * @return string
- */
- private function getExpectedCachedBigger() {
- $foundPreview = null;
- $foundWidth = null;
- $foundHeight = null;
- $maxPreview = null;
- $maxWidth = null;
- $maxHeight = null;
-
- foreach ($this->cachedBigger as $cached) {
- $size = explode('-', basename($cached));
- $width = (int)$size[0];
- $height = (int)$size[1];
-
- if (strpos($cached, 'max')) {
- $maxWidth = $width;
- $maxHeight = $height;
- $maxPreview = $cached;
- continue;
- }
-
- // We pick the larger preview with no aspect ratio
- if (!strpos($cached, 'aspect') && !strpos($cached, 'max')) {
- $foundPreview = $cached;
- $foundWidth = $width;
- $foundHeight = $height;
- }
- }
- if ($foundWidth > $maxWidth && $foundHeight > $maxHeight) {
- $foundPreview = $maxPreview;
- }
-
- return $foundPreview;
- }
-
- /**
- * A small thumbnail of exact dimensions should be in the cache
- *
- * @param int $fileId
- * @param int $width
- * @param int $height
- */
- private function getCachedSmallThumbnail($fileId, $width, $height) {
- $preview = $this->createPreview($width, $height);
-
- $isCached = $preview->isCached($fileId);
- $thumbCacheFile = $this->buildCachePath($fileId, $width, $height);
-
- $this->assertSame($thumbCacheFile, $isCached, "$thumbCacheFile \n");
- }
-
- /**
- * Builds the complete path to a cached thumbnail starting from the user folder
- *
- * @param int $fileId
- * @param int $width
- * @param int $height
- * @param bool $user
- * @param string $postfix
- *
- * @return string
- */
- private function buildCachePath($fileId, $width, $height, $user = false, $postfix = '') {
- $userPath = '';
- if ($user) {
- $userPath = '/' . self::TEST_PREVIEW_USER1 . '/';
- }
-
- return $userPath . Preview::THUMBNAILS_FOLDER . '/' . $fileId
- . '/' . $width . '-' . $height . $postfix . '.png';
- }
-
- /**
- * Stores the sample in the filesystem and stores it in the $samples array
- *
- * @param string $fileName
- * @param int $sampleWidth
- * @param int $sampleHeight
- */
- private function prepareSample($fileName, $sampleWidth, $sampleHeight) {
- $imgData = file_get_contents(\OC::$SERVERROOT . '/tests/data/' . $fileName);
- $imgPath = '/' . self::TEST_PREVIEW_USER1 . '/files/' . $fileName;
- $this->rootView->file_put_contents($imgPath, $imgData);
- $fileInfo = $this->rootView->getFileInfo($imgPath);
-
- list($maxPreviewWidth, $maxPreviewHeight) =
- $this->setMaxPreview($sampleWidth, $sampleHeight);
-
- $this->samples[] =
- [
- 'sampleFileId' => $fileInfo['fileid'],
- 'sampleFileName' => $fileName,
- 'sampleWidth' => $sampleWidth,
- 'sampleHeight' => $sampleHeight,
- 'maxPreviewWidth' => $maxPreviewWidth,
- 'maxPreviewHeight' => $maxPreviewHeight
- ];
- }
-
- /**
- * Sets the variables used to define the boundaries which need to be respected when using a
- * specific sample
- *
- * @param $sampleId
- */
- private function getSample($sampleId) {
- // Corrects a rounding difference when using the EPS (Imagick converted) sample
- $filename = $this->samples[$sampleId]['sampleFileName'];
- $splitFileName = pathinfo($filename);
- $extension = $splitFileName['extension'];
- $correction = ($extension === 'eps' && PHP_MAJOR_VERSION < 7) ? 1 : 0;
- $maxPreviewHeight = $this->samples[$sampleId]['maxPreviewHeight'];
- $maxPreviewHeight = $maxPreviewHeight - $correction;
-
- $this->sampleFileId = $this->samples[$sampleId]['sampleFileId'];
- $this->sampleFilename = $this->samples[$sampleId]['sampleFileName'];
- $this->sampleWidth = $this->samples[$sampleId]['sampleWidth'];
- $this->sampleHeight = $this->samples[$sampleId]['sampleHeight'];
- $this->maxPreviewWidth = $this->samples[$sampleId]['maxPreviewWidth'];
- $this->maxPreviewHeight = $maxPreviewHeight;
- $ratio = $this->maxPreviewWidth / $this->maxPreviewHeight;
- $this->maxPreviewRatio = $ratio;
- }
-
- /**
- * Defines the size of the max preview
- *
- * @fixme the Imagick previews don't have the exact same size on disk as they're calculated here
- *
- * @param int $sampleWidth
- * @param int $sampleHeight
- *
- * @return array
- */
- private function setMaxPreview($sampleWidth, $sampleHeight) {
- // Max previews are never scaled up
- $this->scalingUp = false;
- // Max previews always keep the aspect ratio
- $this->keepAspect = true;
- // We set this variable in order to be able to calculate the max preview with the proper aspect ratio
- $this->maxPreviewRatio = $sampleWidth / $sampleHeight;
- $maxPreviewWidth = min($sampleWidth, $this->configMaxWidth);
- $maxPreviewHeight = min($sampleHeight, $this->configMaxHeight);
- list($maxPreviewWidth, $maxPreviewHeight) =
- $this->applyAspectRatio($maxPreviewWidth, $maxPreviewHeight);
-
- return [$maxPreviewWidth, $maxPreviewHeight];
- }
-
- /**
- * Calculates the expected dimensions of the preview to be able to assess if we've got the
- * right result
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @return array
- */
- private function simulatePreviewDimensions($askedWidth, $askedHeight) {
- $askedWidth = min($askedWidth, $this->configMaxWidth);
- $askedHeight = min($askedHeight, $this->configMaxHeight);
-
- if ($this->keepAspect) {
- // Defines the box in which the preview has to fit
- $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1;
- $newPreviewWidth = min($askedWidth, $this->maxPreviewWidth * $scaleFactor);
- $newPreviewHeight = min($askedHeight, $this->maxPreviewHeight * $scaleFactor);
- list($newPreviewWidth, $newPreviewHeight) =
- $this->applyAspectRatio($newPreviewWidth, $newPreviewHeight);
- } else {
- list($newPreviewWidth, $newPreviewHeight) =
- $this->fixSize($askedWidth, $askedHeight);
- }
-
- return [(int)$newPreviewWidth, (int)$newPreviewHeight];
- }
-
- /**
- * Resizes the boundaries to match the aspect ratio
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @return \int[]
- */
- private function applyAspectRatio($askedWidth, $askedHeight) {
- $originalRatio = $this->maxPreviewRatio;
- if ($askedWidth / $originalRatio < $askedHeight) {
- $askedHeight = round($askedWidth / $originalRatio);
- } else {
- $askedWidth = round($askedHeight * $originalRatio);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Clips or stretches the dimensions so that they fit in the boundaries
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @return array
- */
- private function fixSize($askedWidth, $askedHeight) {
- if ($this->scalingUp) {
- $askedWidth = min($this->configMaxWidth, $askedWidth);
- $askedHeight = min($this->configMaxHeight, $askedHeight);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- public function testKeepAspectRatio() {
- $originalWidth = 1680;
- $originalHeight = 1050;
- $originalAspectRation = $originalWidth / $originalHeight;
-
- $preview = new Preview(
- self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg',
- 150,
- 150
- );
- $preview->setKeepAspect(true);
- $image = $preview->getPreview();
-
- $aspectRatio = $image->width() / $image->height();
- $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2));
-
- $this->assertLessThanOrEqual(150, $image->width());
- $this->assertLessThanOrEqual(150, $image->height());
- }
-
- public function testKeepAspectRatioCover() {
- $originalWidth = 1680;
- $originalHeight = 1050;
- $originalAspectRation = $originalWidth / $originalHeight;
-
- $preview = new Preview(
- self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg',
- 150,
- 150
- );
- $preview->setKeepAspect(true);
- $preview->setMode(Preview::MODE_COVER);
- $image = $preview->getPreview();
-
- $aspectRatio = $image->width() / $image->height();
- $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2));
-
- $this->assertGreaterThanOrEqual(150, $image->width());
- $this->assertGreaterThanOrEqual(150, $image->height());
- }
-
- public function testSetFileWithInfo() {
- $info = new FileInfo('/foo', null, '/foo', ['mimetype' => 'foo/bar'], null);
- $preview = new Preview();
- $preview->setFile('/foo', $info);
- $this->assertEquals($info, $this->invokePrivate($preview, 'getFileInfo'));
- }
-
- public function testIsCached() {
- $sourceFile = __DIR__ . '/../data/testimage.png';
- $userId = $this->getUniqueID();
- $this->createUser($userId, 'pass');
-
- $storage = new Temporary();
- $storage->mkdir('files');
- $this->registerMount($userId, $storage, '/' . $userId);
-
- \OC_Util::tearDownFS();
- \OC_Util::setupFS($userId);
- $preview = new Preview($userId, 'files');
- $view = new View('/' . $userId . '/files');
- $view->file_put_contents('test.png', file_get_contents($sourceFile));
- $info = $view->getFileInfo('test.png');
- $preview->setFile('test.png', $info);
-
- $preview->setMaxX(64);
- $preview->setMaxY(64);
-
- $this->assertFalse($preview->isCached($info->getId()));
-
- $preview->getPreview();
-
- $this->assertEquals('thumbnails/' . $info->getId() . '/64-64.png', $preview->isCached($info->getId()));
- }
-}
diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php
index 00009a73b0e..7b01a8f9e70 100644
--- a/tests/lib/Share20/ManagerTest.php
+++ b/tests/lib/Share20/ManagerTest.php
@@ -1768,6 +1768,116 @@ class ManagerTest extends \Test\TestCase {
$this->assertEquals('hashed', $share->getPassword());
}
+ public function testCreateShareMail() {
+ $manager = $this->createManagerMock()
+ ->setMethods([
+ 'canShare',
+ 'generalCreateChecks',
+ 'linkCreateChecks',
+ 'pathCreateChecks',
+ 'validateExpirationDate',
+ 'verifyPassword',
+ 'setLinkParent',
+ ])
+ ->getMock();
+
+ $shareOwner = $this->createMock(IUser::class);
+ $shareOwner->method('getUID')->willReturn('shareOwner');
+
+ $storage = $this->createMock(Storage::class);
+ $path = $this->createMock(File::class);
+ $path->method('getOwner')->willReturn($shareOwner);
+ $path->method('getName')->willReturn('target');
+ $path->method('getId')->willReturn(1);
+ $path->method('getStorage')->willReturn($storage);
+
+ $share = $this->manager->newShare();
+ $share->setShareType(\OCP\Share::SHARE_TYPE_EMAIL)
+ ->setNode($path)
+ ->setSharedBy('sharedBy')
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+
+ $manager->expects($this->once())
+ ->method('canShare')
+ ->with($share)
+ ->willReturn(true);
+ $manager->expects($this->once())
+ ->method('generalCreateChecks')
+ ->with($share);;
+ $manager->expects($this->never())
+ ->method('linkCreateChecks');
+ $manager->expects($this->once())
+ ->method('pathCreateChecks')
+ ->with($path);
+ $manager->expects($this->never())
+ ->method('validateExpirationDate');
+ $manager->expects($this->never())
+ ->method('verifyPassword');
+ $manager->expects($this->never())
+ ->method('setLinkParent');
+
+ $this->secureRandom->method('getMediumStrengthGenerator')
+ ->will($this->returnSelf());
+ $this->secureRandom->method('generate')
+ ->willReturn('token');
+
+ $this->defaultProvider
+ ->expects($this->once())
+ ->method('create')
+ ->with($share)
+ ->will($this->returnCallback(function(Share $share) {
+ return $share->setId(42);
+ }));
+
+ $hookListner = $this->getMockBuilder('Dummy')->setMethods(['pre', 'post'])->getMock();
+ \OCP\Util::connectHook('OCP\Share', 'pre_shared', $hookListner, 'pre');
+ \OCP\Util::connectHook('OCP\Share', 'post_shared', $hookListner, 'post');
+
+ $hookListnerExpectsPre = [
+ 'itemType' => 'file',
+ 'itemSource' => 1,
+ 'shareType' => \OCP\Share::SHARE_TYPE_EMAIL,
+ 'uidOwner' => 'sharedBy',
+ 'permissions' => 31,
+ 'fileSource' => 1,
+ 'expiration' => null,
+ 'token' => 'token',
+ 'run' => true,
+ 'error' => '',
+ 'itemTarget' => '/target',
+ 'shareWith' => null,
+ ];
+
+ $hookListnerExpectsPost = [
+ 'itemType' => 'file',
+ 'itemSource' => 1,
+ 'shareType' => \OCP\Share::SHARE_TYPE_EMAIL,
+ 'uidOwner' => 'sharedBy',
+ 'permissions' => 31,
+ 'fileSource' => 1,
+ 'expiration' => null,
+ 'token' => 'token',
+ 'id' => 42,
+ 'itemTarget' => '/target',
+ 'fileTarget' => '/target',
+ 'shareWith' => null,
+ ];
+
+ $hookListner->expects($this->once())
+ ->method('pre')
+ ->with($this->equalTo($hookListnerExpectsPre));
+ $hookListner->expects($this->once())
+ ->method('post')
+ ->with($this->equalTo($hookListnerExpectsPost));
+
+ /** @var IShare $share */
+ $share = $manager->createShare($share);
+
+ $this->assertSame('shareOwner', $share->getShareOwner());
+ $this->assertEquals('/target', $share->getTarget());
+ $this->assertEquals('token', $share->getToken());
+ }
+
/**
* @expectedException Exception
* @expectedExceptionMessage I won't let you share
diff --git a/tests/lib/StreamWrappersTest.php b/tests/lib/StreamWrappersTest.php
deleted file mode 100644
index ee2f6a8b0b2..00000000000
--- a/tests/lib/StreamWrappersTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/**
- * ownCloud
- *
- * @author Robin Appelman
- * @copyright 2012 Robin Appelman icewind@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 Test;
-
-/**
- * Class StreamWrappersTest
- *
- * @group DB
- */
-class StreamWrappersTest extends \Test\TestCase {
-
- private static $trashBinStatus;
-
- public static function setUpBeforeClass() {
- self::$trashBinStatus = \OC_App::isEnabled('files_trashbin');
- \OC_App::disable('files_trashbin');
- }
-
- public static function tearDownAfterClass() {
- if (self::$trashBinStatus) {
- (new \OC_App())->enable('files_trashbin');
- }
- }
-
- public function testCloseStream() {
- //ensure all basic stream stuff works
- $sourceFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';
- $tmpFile = \OC::$server->getTempManager()->getTemporaryFile('.txt');
- $file = 'close://' . $tmpFile;
- $this->assertTrue(file_exists($file));
- file_put_contents($file, file_get_contents($sourceFile));
- $this->assertEquals(file_get_contents($sourceFile), file_get_contents($file));
- unlink($file);
- clearstatcache();
- $this->assertFalse(file_exists($file));
-
- //test callback
- $tmpFile = \OC::$server->getTempManager()->getTemporaryFile('.txt');
- $file = 'close://' . $tmpFile;
- $actual = false;
- $callback = function($path) use (&$actual) { $actual = $path; };
- \OC\Files\Stream\Close::registerCallback($tmpFile, $callback);
- $fh = fopen($file, 'w');
- fwrite($fh, 'asd');
- fclose($fh);
- $this->assertSame($tmpFile, $actual);
- }
-}
diff --git a/themes/example/defaults.php b/themes/example/defaults.php
index 25ec350ed1b..1a2389d0bc2 100644
--- a/themes/example/defaults.php
+++ b/themes/example/defaults.php
@@ -41,7 +41,7 @@ class OC_Theme {
* @return string URL
*/
public function getiOSClientUrl() {
- return 'https://itunes.apple.com/us/app/owncloud/id543672169?mt=8';
+ return 'https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8';
}
/**
@@ -49,7 +49,7 @@ class OC_Theme {
* @return string AppId
*/
public function getiTunesAppId() {
- return '543672169';
+ return '1125420102';
}
/**
@@ -65,7 +65,7 @@ class OC_Theme {
* @return string URL
*/
public function getDocBaseUrl() {
- return 'https://docs.nextcloud.org';
+ return 'https://docs.nextcloud.com';
}
/**