aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/admin_audit/composer/composer/ClassLoader.php96
-rw-r--r--apps/admin_audit/composer/composer/installed.php4
-rw-r--r--apps/admin_audit/lib/Actions/Security.php29
-rw-r--r--apps/admin_audit/lib/AppInfo/Application.php42
-rw-r--r--apps/admin_audit/tests/Actions/SecurityTest.php15
-rw-r--r--apps/cloud_federation_api/composer/composer/ClassLoader.php96
-rw-r--r--apps/cloud_federation_api/composer/composer/installed.php4
-rw-r--r--apps/cloud_federation_api/lib/Capabilities.php3
-rw-r--r--apps/comments/composer/composer/ClassLoader.php96
-rw-r--r--apps/comments/composer/composer/autoload_static.php4
-rw-r--r--apps/comments/composer/composer/installed.php4
-rw-r--r--apps/comments/lib/Activity/Provider.php2
-rw-r--r--apps/comments/lib/Notification/Notifier.php4
-rw-r--r--apps/contactsinteraction/composer/composer/ClassLoader.php96
-rw-r--r--apps/contactsinteraction/composer/composer/installed.php4
-rw-r--r--apps/dashboard/composer/composer/ClassLoader.php96
-rw-r--r--apps/dashboard/composer/composer/installed.php4
-rw-r--r--apps/dav/composer/composer/ClassLoader.php96
-rw-r--r--apps/dav/composer/composer/installed.php4
-rw-r--r--apps/dav/l10n/sl.js31
-rw-r--r--apps/dav/l10n/sl.json31
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php6
-rw-r--r--apps/dav/lib/CardDAV/Converter.php21
-rw-r--r--apps/dav/lib/HookManager.php7
-rw-r--r--apps/dav/tests/unit/CalDAV/CalDavBackendTest.php20
-rw-r--r--apps/dav/tests/unit/CardDAV/ConverterTest.php11
-rw-r--r--apps/dav/tests/unit/DAV/HookManagerTest.php13
-rw-r--r--apps/encryption/composer/composer/ClassLoader.php96
-rw-r--r--apps/encryption/composer/composer/installed.php4
-rw-r--r--apps/encryption/l10n/gl.js2
-rw-r--r--apps/encryption/l10n/gl.json2
-rw-r--r--apps/federatedfilesharing/composer/composer/ClassLoader.php96
-rw-r--r--apps/federatedfilesharing/composer/composer/installed.php4
-rw-r--r--apps/federatedfilesharing/lib/Notifier.php13
-rw-r--r--apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php43
-rw-r--r--apps/federation/composer/composer/ClassLoader.php96
-rw-r--r--apps/federation/composer/composer/installed.php4
-rw-r--r--apps/federation/lib/BackgroundJob/RequestSharedSecret.php89
-rw-r--r--apps/federation/tests/BackgroundJob/RequestSharedSecretTest.php40
-rw-r--r--apps/files/composer/composer/ClassLoader.php96
-rw-r--r--apps/files/composer/composer/installed.php4
-rw-r--r--apps/files/js/fileactions.js4
-rw-r--r--apps/files/lib/Capabilities.php2
-rw-r--r--apps/files/src/models/Tab.js12
-rw-r--r--apps/files/src/views/Sidebar.vue2
-rw-r--r--apps/files_external/composer/composer/ClassLoader.php96
-rw-r--r--apps/files_external/composer/composer/installed.php4
-rw-r--r--apps/files_sharing/composer/composer/ClassLoader.php96
-rw-r--r--apps/files_sharing/composer/composer/installed.php4
-rw-r--r--apps/files_sharing/l10n/et_EE.js1
-rw-r--r--apps/files_sharing/l10n/et_EE.json1
-rw-r--r--apps/files_sharing/l10n/gl.js2
-rw-r--r--apps/files_sharing/l10n/gl.json2
-rw-r--r--apps/files_sharing/l10n/sl.js1
-rw-r--r--apps/files_sharing/l10n/sl.json1
-rw-r--r--apps/files_sharing/l10n/uk.js12
-rw-r--r--apps/files_sharing/l10n/uk.json12
-rw-r--r--apps/files_sharing/lib/Activity/Providers/Base.php8
-rw-r--r--apps/files_sharing/lib/Activity/Providers/RemoteShares.php3
-rw-r--r--apps/files_sharing/lib/Capabilities.php2
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php138
-rw-r--r--apps/files_sharing/src/collaborationresources.js44
-rw-r--r--apps/files_trashbin/composer/composer/ClassLoader.php96
-rw-r--r--apps/files_trashbin/composer/composer/installed.php4
-rw-r--r--apps/files_trashbin/lib/Capabilities.php2
-rw-r--r--apps/files_versions/composer/composer/ClassLoader.php96
-rw-r--r--apps/files_versions/composer/composer/installed.php4
-rw-r--r--apps/files_versions/lib/Capabilities.php2
-rw-r--r--apps/files_versions/lib/Sabre/Plugin.php7
-rw-r--r--apps/files_versions/lib/Sabre/VersionFile.php1
-rw-r--r--apps/files_versions/src/components/Version.vue14
-rw-r--r--apps/files_versions/src/files_versions_tab.js3
-rw-r--r--apps/files_versions/src/utils/davRequest.js1
-rw-r--r--apps/files_versions/src/utils/versions.js2
-rw-r--r--apps/files_versions/src/views/VersionTab.vue9
-rw-r--r--apps/lookup_server_connector/composer/composer/ClassLoader.php96
-rw-r--r--apps/lookup_server_connector/composer/composer/installed.php4
-rw-r--r--apps/oauth2/composer/composer/ClassLoader.php96
-rw-r--r--apps/oauth2/composer/composer/LICENSE2
-rw-r--r--apps/oauth2/composer/composer/installed.php4
-rw-r--r--apps/provisioning_api/composer/composer/ClassLoader.php96
-rw-r--r--apps/provisioning_api/composer/composer/installed.php4
-rw-r--r--apps/provisioning_api/l10n/sl.js4
-rw-r--r--apps/provisioning_api/l10n/sl.json4
-rw-r--r--apps/provisioning_api/lib/Capabilities.php2
-rw-r--r--apps/settings/composer/composer/ClassLoader.php96
-rw-r--r--apps/settings/composer/composer/installed.php4
-rw-r--r--apps/settings/css/settings.css2
-rw-r--r--apps/settings/css/settings.css.map2
-rw-r--r--apps/settings/css/settings.scss58
-rw-r--r--apps/settings/l10n/af.js1
-rw-r--r--apps/settings/l10n/af.json1
-rw-r--r--apps/settings/l10n/ar.js68
-rw-r--r--apps/settings/l10n/ar.json68
-rw-r--r--apps/settings/l10n/az.js1
-rw-r--r--apps/settings/l10n/az.json1
-rw-r--r--apps/settings/l10n/bg.js5
-rw-r--r--apps/settings/l10n/bg.json5
-rw-r--r--apps/settings/l10n/br.js5
-rw-r--r--apps/settings/l10n/br.json5
-rw-r--r--apps/settings/l10n/ca.js5
-rw-r--r--apps/settings/l10n/ca.json5
-rw-r--r--apps/settings/l10n/cs.js10
-rw-r--r--apps/settings/l10n/cs.json10
-rw-r--r--apps/settings/l10n/da.js5
-rw-r--r--apps/settings/l10n/da.json5
-rw-r--r--apps/settings/l10n/de.js10
-rw-r--r--apps/settings/l10n/de.json10
-rw-r--r--apps/settings/l10n/de_DE.js10
-rw-r--r--apps/settings/l10n/de_DE.json10
-rw-r--r--apps/settings/l10n/el.js5
-rw-r--r--apps/settings/l10n/el.json5
-rw-r--r--apps/settings/l10n/en_GB.js10
-rw-r--r--apps/settings/l10n/en_GB.json10
-rw-r--r--apps/settings/l10n/eo.js1
-rw-r--r--apps/settings/l10n/eo.json1
-rw-r--r--apps/settings/l10n/es.js10
-rw-r--r--apps/settings/l10n/es.json10
-rw-r--r--apps/settings/l10n/es_419.js1
-rw-r--r--apps/settings/l10n/es_419.json1
-rw-r--r--apps/settings/l10n/es_AR.js1
-rw-r--r--apps/settings/l10n/es_AR.json1
-rw-r--r--apps/settings/l10n/es_CL.js1
-rw-r--r--apps/settings/l10n/es_CL.json1
-rw-r--r--apps/settings/l10n/es_CO.js1
-rw-r--r--apps/settings/l10n/es_CO.json1
-rw-r--r--apps/settings/l10n/es_CR.js1
-rw-r--r--apps/settings/l10n/es_CR.json1
-rw-r--r--apps/settings/l10n/es_DO.js1
-rw-r--r--apps/settings/l10n/es_DO.json1
-rw-r--r--apps/settings/l10n/es_EC.js1
-rw-r--r--apps/settings/l10n/es_EC.json1
-rw-r--r--apps/settings/l10n/es_GT.js1
-rw-r--r--apps/settings/l10n/es_GT.json1
-rw-r--r--apps/settings/l10n/es_HN.js1
-rw-r--r--apps/settings/l10n/es_HN.json1
-rw-r--r--apps/settings/l10n/es_MX.js1
-rw-r--r--apps/settings/l10n/es_MX.json1
-rw-r--r--apps/settings/l10n/es_NI.js1
-rw-r--r--apps/settings/l10n/es_NI.json1
-rw-r--r--apps/settings/l10n/es_PA.js1
-rw-r--r--apps/settings/l10n/es_PA.json1
-rw-r--r--apps/settings/l10n/es_PE.js1
-rw-r--r--apps/settings/l10n/es_PE.json1
-rw-r--r--apps/settings/l10n/es_PR.js1
-rw-r--r--apps/settings/l10n/es_PR.json1
-rw-r--r--apps/settings/l10n/es_PY.js1
-rw-r--r--apps/settings/l10n/es_PY.json1
-rw-r--r--apps/settings/l10n/es_SV.js1
-rw-r--r--apps/settings/l10n/es_SV.json1
-rw-r--r--apps/settings/l10n/es_UY.js1
-rw-r--r--apps/settings/l10n/es_UY.json1
-rw-r--r--apps/settings/l10n/et_EE.js1
-rw-r--r--apps/settings/l10n/et_EE.json1
-rw-r--r--apps/settings/l10n/eu.js5
-rw-r--r--apps/settings/l10n/eu.json5
-rw-r--r--apps/settings/l10n/fa.js3
-rw-r--r--apps/settings/l10n/fa.json3
-rw-r--r--apps/settings/l10n/fi.js16
-rw-r--r--apps/settings/l10n/fi.json16
-rw-r--r--apps/settings/l10n/fr.js12
-rw-r--r--apps/settings/l10n/fr.json12
-rw-r--r--apps/settings/l10n/gl.js10
-rw-r--r--apps/settings/l10n/gl.json10
-rw-r--r--apps/settings/l10n/he.js5
-rw-r--r--apps/settings/l10n/he.json5
-rw-r--r--apps/settings/l10n/hr.js5
-rw-r--r--apps/settings/l10n/hr.json5
-rw-r--r--apps/settings/l10n/hu.js5
-rw-r--r--apps/settings/l10n/hu.json5
-rw-r--r--apps/settings/l10n/ia.js1
-rw-r--r--apps/settings/l10n/ia.json1
-rw-r--r--apps/settings/l10n/id.js1
-rw-r--r--apps/settings/l10n/id.json1
-rw-r--r--apps/settings/l10n/is.js1
-rw-r--r--apps/settings/l10n/is.json1
-rw-r--r--apps/settings/l10n/it.js5
-rw-r--r--apps/settings/l10n/it.json5
-rw-r--r--apps/settings/l10n/ja.js5
-rw-r--r--apps/settings/l10n/ja.json5
-rw-r--r--apps/settings/l10n/ka_GE.js1
-rw-r--r--apps/settings/l10n/ka_GE.json1
-rw-r--r--apps/settings/l10n/ko.js3
-rw-r--r--apps/settings/l10n/ko.json3
-rw-r--r--apps/settings/l10n/lt_LT.js5
-rw-r--r--apps/settings/l10n/lt_LT.json5
-rw-r--r--apps/settings/l10n/lv.js1
-rw-r--r--apps/settings/l10n/lv.json1
-rw-r--r--apps/settings/l10n/mk.js5
-rw-r--r--apps/settings/l10n/mk.json5
-rw-r--r--apps/settings/l10n/nb.js3
-rw-r--r--apps/settings/l10n/nb.json3
-rw-r--r--apps/settings/l10n/nl.js5
-rw-r--r--apps/settings/l10n/nl.json5
-rw-r--r--apps/settings/l10n/nn_NO.js1
-rw-r--r--apps/settings/l10n/nn_NO.json1
-rw-r--r--apps/settings/l10n/oc.js3
-rw-r--r--apps/settings/l10n/oc.json3
-rw-r--r--apps/settings/l10n/pl.js5
-rw-r--r--apps/settings/l10n/pl.json5
-rw-r--r--apps/settings/l10n/pt_BR.js6
-rw-r--r--apps/settings/l10n/pt_BR.json6
-rw-r--r--apps/settings/l10n/pt_PT.js1
-rw-r--r--apps/settings/l10n/pt_PT.json1
-rw-r--r--apps/settings/l10n/ro.js1
-rw-r--r--apps/settings/l10n/ro.json1
-rw-r--r--apps/settings/l10n/ru.js26
-rw-r--r--apps/settings/l10n/ru.json26
-rw-r--r--apps/settings/l10n/sc.js5
-rw-r--r--apps/settings/l10n/sc.json5
-rw-r--r--apps/settings/l10n/sk.js5
-rw-r--r--apps/settings/l10n/sk.json5
-rw-r--r--apps/settings/l10n/sl.js6
-rw-r--r--apps/settings/l10n/sl.json6
-rw-r--r--apps/settings/l10n/sq.js1
-rw-r--r--apps/settings/l10n/sq.json1
-rw-r--r--apps/settings/l10n/sr.js25
-rw-r--r--apps/settings/l10n/sr.json25
-rw-r--r--apps/settings/l10n/sv.js11
-rw-r--r--apps/settings/l10n/sv.json11
-rw-r--r--apps/settings/l10n/th.js4
-rw-r--r--apps/settings/l10n/th.json4
-rw-r--r--apps/settings/l10n/tr.js10
-rw-r--r--apps/settings/l10n/tr.json10
-rw-r--r--apps/settings/l10n/uk.js5
-rw-r--r--apps/settings/l10n/uk.json5
-rw-r--r--apps/settings/l10n/vi.js1
-rw-r--r--apps/settings/l10n/vi.json1
-rw-r--r--apps/settings/l10n/zh_CN.js5
-rw-r--r--apps/settings/l10n/zh_CN.json5
-rw-r--r--apps/settings/l10n/zh_HK.js10
-rw-r--r--apps/settings/l10n/zh_HK.json10
-rw-r--r--apps/settings/l10n/zh_TW.js10
-rw-r--r--apps/settings/l10n/zh_TW.json10
-rw-r--r--apps/settings/src/components/GroupListItem.vue27
-rw-r--r--apps/settings/src/components/Users/UserRow.vue396
-rw-r--r--apps/settings/src/components/Users/UserRowActions.vue78
-rw-r--r--apps/settings/src/components/Users/UserRowSimple.vue43
-rw-r--r--apps/settings/src/views/Apps.vue10
-rw-r--r--apps/settings/src/views/Users.vue29
-rw-r--r--apps/sharebymail/composer/composer/ClassLoader.php96
-rw-r--r--apps/sharebymail/composer/composer/installed.php4
-rw-r--r--apps/sharebymail/l10n/ar.js57
-rw-r--r--apps/sharebymail/l10n/ar.json55
-rw-r--r--apps/sharebymail/l10n/uk.js12
-rw-r--r--apps/sharebymail/l10n/uk.json12
-rw-r--r--apps/systemtags/composer/composer/ClassLoader.php96
-rw-r--r--apps/systemtags/composer/composer/installed.php4
-rw-r--r--apps/testing/composer/composer/ClassLoader.php96
-rw-r--r--apps/testing/composer/composer/installed.php4
-rw-r--r--apps/theming/composer/composer/ClassLoader.php96
-rw-r--r--apps/theming/composer/composer/installed.php4
-rw-r--r--apps/theming/lib/Capabilities.php2
-rw-r--r--apps/theming/lib/ThemingDefaults.php6
-rw-r--r--apps/twofactor_backupcodes/composer/composer/ClassLoader.php96
-rw-r--r--apps/twofactor_backupcodes/composer/composer/installed.php4
-rw-r--r--apps/updatenotification/composer/composer/ClassLoader.php96
-rw-r--r--apps/updatenotification/composer/composer/installed.php4
-rw-r--r--apps/updatenotification/l10n/sl.js7
-rw-r--r--apps/updatenotification/l10n/sl.json7
-rw-r--r--apps/user_ldap/composer/composer/ClassLoader.php96
-rw-r--r--apps/user_ldap/composer/composer/installed.php4
-rw-r--r--apps/user_ldap/js/wizard/wizardTabAdvanced.js13
-rw-r--r--apps/user_ldap/l10n/ar.js208
-rw-r--r--apps/user_ldap/l10n/ar.json208
-rw-r--r--apps/user_ldap/l10n/cs.js2
-rw-r--r--apps/user_ldap/l10n/cs.json2
-rw-r--r--apps/user_ldap/l10n/de_DE.js2
-rw-r--r--apps/user_ldap/l10n/de_DE.json2
-rw-r--r--apps/user_ldap/l10n/en_GB.js2
-rw-r--r--apps/user_ldap/l10n/en_GB.json2
-rw-r--r--apps/user_ldap/l10n/gl.js2
-rw-r--r--apps/user_ldap/l10n/gl.json2
-rw-r--r--apps/user_ldap/l10n/ru.js2
-rw-r--r--apps/user_ldap/l10n/ru.json2
-rw-r--r--apps/user_ldap/l10n/sr.js2
-rw-r--r--apps/user_ldap/l10n/sr.json2
-rw-r--r--apps/user_ldap/l10n/sv.js2
-rw-r--r--apps/user_ldap/l10n/sv.json2
-rw-r--r--apps/user_ldap/l10n/tr.js2
-rw-r--r--apps/user_ldap/l10n/tr.json2
-rw-r--r--apps/user_ldap/l10n/zh_HK.js2
-rw-r--r--apps/user_ldap/l10n/zh_HK.json2
-rw-r--r--apps/user_ldap/l10n/zh_TW.js2
-rw-r--r--apps/user_ldap/l10n/zh_TW.json2
-rw-r--r--apps/user_ldap/lib/Configuration.php3
-rw-r--r--apps/user_ldap/lib/Connection.php1
-rw-r--r--apps/user_ldap/lib/User/DeletedUsersIndex.php51
-rw-r--r--apps/user_ldap/lib/User_LDAP.php66
-rw-r--r--apps/user_ldap/lib/User_Proxy.php53
-rw-r--r--apps/user_ldap/templates/settings.php25
-rw-r--r--apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php4
-rw-r--r--apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php4
-rw-r--r--apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php4
-rw-r--r--apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php3
-rw-r--r--apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php4
-rw-r--r--apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php4
-rw-r--r--apps/user_ldap/tests/User_LDAPTest.php189
-rw-r--r--apps/user_ldap/tests/User_ProxyTest.php12
-rw-r--r--apps/user_status/composer/composer/ClassLoader.php96
-rw-r--r--apps/user_status/composer/composer/installed.php4
-rw-r--r--apps/user_status/l10n/et_EE.js1
-rw-r--r--apps/user_status/l10n/et_EE.json1
-rw-r--r--apps/user_status/lib/Capabilities.php3
-rw-r--r--apps/user_status/src/components/CustomMessageInput.vue10
-rw-r--r--apps/user_status/src/components/SetStatusModal.vue86
-rw-r--r--apps/user_status/src/store/predefinedStatuses.js2
-rw-r--r--apps/weather_status/composer/composer/ClassLoader.php96
-rw-r--r--apps/weather_status/composer/composer/installed.php4
-rw-r--r--apps/weather_status/l10n/ar.js50
-rw-r--r--apps/weather_status/l10n/ar.json48
-rw-r--r--apps/weather_status/lib/Capabilities.php3
-rw-r--r--apps/workflowengine/composer/composer/ClassLoader.php96
-rw-r--r--apps/workflowengine/composer/composer/installed.php4
-rw-r--r--apps/workflowengine/l10n/ar.js86
-rw-r--r--apps/workflowengine/l10n/ar.json84
-rw-r--r--apps/workflowengine/l10n/gl.js12
-rw-r--r--apps/workflowengine/l10n/gl.json12
318 files changed, 3857 insertions, 2568 deletions
diff --git a/apps/admin_audit/composer/composer/ClassLoader.php b/apps/admin_audit/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/admin_audit/composer/composer/ClassLoader.php
+++ b/apps/admin_audit/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/admin_audit/composer/composer/installed.php b/apps/admin_audit/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/admin_audit/composer/composer/installed.php
+++ b/apps/admin_audit/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/admin_audit/lib/Actions/Security.php b/apps/admin_audit/lib/Actions/Security.php
index e4831ac6fc1..17cf0c3c2b9 100644
--- a/apps/admin_audit/lib/Actions/Security.php
+++ b/apps/admin_audit/lib/Actions/Security.php
@@ -26,6 +26,7 @@ declare(strict_types=1);
*/
namespace OCA\AdminAudit\Actions;
+use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\IUser;
/**
@@ -35,14 +36,14 @@ use OCP\IUser;
*/
class Security extends Action {
/**
- * Log twofactor auth enabled
- *
- * @param IUser $user
- * @param array $params
+ * Logs failed twofactor challenge
*/
- public function twofactorFailed(IUser $user, array $params): void {
- $params['uid'] = $user->getUID();
- $params['displayName'] = $user->getDisplayName();
+ public function twofactorFailed(IUser $user, IProvider $provider): void {
+ $params = [
+ 'displayName' => $user->getDisplayName(),
+ 'uid' => $user->getUID(),
+ 'provider' => $provider->getDisplayName(),
+ ];
$this->log(
'Failed two factor attempt by user %s (%s) with provider %s',
@@ -56,14 +57,14 @@ class Security extends Action {
}
/**
- * Logs unsharing of data
- *
- * @param IUser $user
- * @param array $params
+ * Logs successful twofactor challenge
*/
- public function twofactorSuccess(IUser $user, array $params): void {
- $params['uid'] = $user->getUID();
- $params['displayName'] = $user->getDisplayName();
+ public function twofactorSuccess(IUser $user, IProvider $provider): void {
+ $params = [
+ 'displayName' => $user->getDisplayName(),
+ 'uid' => $user->getUID(),
+ 'provider' => $provider->getDisplayName(),
+ ];
$this->log(
'Successful two factor attempt by user %s (%s) with provider %s',
diff --git a/apps/admin_audit/lib/AppInfo/Application.php b/apps/admin_audit/lib/AppInfo/Application.php
index 1160d151710..7a4d2d6e3d1 100644
--- a/apps/admin_audit/lib/AppInfo/Application.php
+++ b/apps/admin_audit/lib/AppInfo/Application.php
@@ -57,7 +57,10 @@ use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\Authentication\TwoFactorAuth\IProvider;
+use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengeFailed;
+use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengePassed;
use OCP\Console\ConsoleEvent;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IPreview;
@@ -65,6 +68,7 @@ use OCP\IServerContainer;
use OCP\IUserSession;
use OCP\Log\Audit\CriticalActionPerformedEvent;
use OCP\Log\ILogFactory;
+use OCP\Preview\BeforePreviewFetchedEvent;
use OCP\Share;
use OCP\Util;
use Psr\Container\ContainerInterface;
@@ -109,8 +113,9 @@ class Application extends App implements IBootstrap {
$this->groupHooks($logger, $serverContainer->get(IGroupManager::class));
$this->authHooks($logger);
- /** @var EventDispatcherInterface $eventDispatcher */
- $eventDispatcher = $serverContainer->get(EventDispatcherInterface::class);
+
+ /** @var IEventDispatcher $eventDispatcher */
+ $eventDispatcher = $serverContainer->get(IEventDispatcher::class);
$this->consoleHooks($logger, $eventDispatcher);
$this->appHooks($logger, $eventDispatcher);
@@ -169,7 +174,7 @@ class Application extends App implements IBootstrap {
}
private function appHooks(IAuditLogger $logger,
- EventDispatcherInterface $eventDispatcher): void {
+ IEventDispatcher $eventDispatcher): void {
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function (ManagerEvent $event) use ($logger) {
$appActions = new AppManagement($logger);
$appActions->enableApp($event->getAppID());
@@ -185,27 +190,26 @@ class Application extends App implements IBootstrap {
}
private function consoleHooks(IAuditLogger $logger,
- EventDispatcherInterface $eventDispatcher): void {
- $eventDispatcher->addListener(ConsoleEvent::EVENT_RUN, function (ConsoleEvent $event) use ($logger) {
+ IEventDispatcher $eventDispatcher): void {
+ $eventDispatcher->addListener(ConsoleEvent::class, function (ConsoleEvent $event) use ($logger) {
$appActions = new Console($logger);
$appActions->runCommand($event->getArguments());
});
}
private function fileHooks(IAuditLogger $logger,
- EventDispatcherInterface $eventDispatcher): void {
+ IEventDispatcher $eventDispatcher): void {
$fileActions = new Files($logger);
$eventDispatcher->addListener(
- IPreview::EVENT,
- function (GenericEvent $event) use ($fileActions) {
- /** @var File $file */
- $file = $event->getSubject();
+ BeforePreviewFetchedEvent::class,
+ function (BeforePreviewFetchedEvent $event) use ($fileActions) {
+ $file = $event->getNode();
$fileActions->preview([
'path' => mb_substr($file->getInternalPath(), 5),
- 'width' => $event->getArguments()['width'],
- 'height' => $event->getArguments()['height'],
- 'crop' => $event->getArguments()['crop'],
- 'mode' => $event->getArguments()['mode']
+ 'width' => $event->getWidth(),
+ 'height' => $event->getHeight(),
+ 'crop' => $event->isCrop(),
+ 'mode' => $event->getMode()
]);
}
);
@@ -267,14 +271,14 @@ class Application extends App implements IBootstrap {
}
private function securityHooks(IAuditLogger $logger,
- EventDispatcherInterface $eventDispatcher): void {
- $eventDispatcher->addListener(IProvider::EVENT_SUCCESS, function (GenericEvent $event) use ($logger) {
+ IEventDispatcher $eventDispatcher): void {
+ $eventDispatcher->addListener(TwoFactorProviderChallengePassed::class, function (TwoFactorProviderChallengePassed $event) use ($logger) {
$security = new Security($logger);
- $security->twofactorSuccess($event->getSubject(), $event->getArguments());
+ $security->twofactorSuccess($event->getUser(), $event->getProvider());
});
- $eventDispatcher->addListener(IProvider::EVENT_FAILED, function (GenericEvent $event) use ($logger) {
+ $eventDispatcher->addListener(TwoFactorProviderChallengeFailed::class, function (TwoFactorProviderChallengeFailed $event) use ($logger) {
$security = new Security($logger);
- $security->twofactorFailed($event->getSubject(), $event->getArguments());
+ $security->twofactorFailed($event->getUser(), $event->getProvider());
});
}
}
diff --git a/apps/admin_audit/tests/Actions/SecurityTest.php b/apps/admin_audit/tests/Actions/SecurityTest.php
index d45cbb75a64..bba819ad04d 100644
--- a/apps/admin_audit/tests/Actions/SecurityTest.php
+++ b/apps/admin_audit/tests/Actions/SecurityTest.php
@@ -27,8 +27,9 @@ declare(strict_types=1);
namespace OCA\AdminAudit\Tests\Actions;
use OCA\AdminAudit\Actions\Security;
-use OCP\IUser;
use OCA\AdminAudit\AuditLogger;
+use OCP\Authentication\TwoFactorAuth\IProvider;
+use OCP\IUser;
use Test\TestCase;
class SecurityTest extends TestCase {
@@ -60,7 +61,11 @@ class SecurityTest extends TestCase {
['app' => 'admin_audit']
);
- $this->security->twofactorFailed($this->user, ['provider' => 'myprovider']);
+ $provider = $this->createMock(IProvider::class);
+ $provider->method('getDisplayName')
+ ->willReturn('myprovider');
+
+ $this->security->twofactorFailed($this->user, $provider);
}
public function testTwofactorSuccess() {
@@ -71,6 +76,10 @@ class SecurityTest extends TestCase {
['app' => 'admin_audit']
);
- $this->security->twofactorSuccess($this->user, ['provider' => 'myprovider']);
+ $provider = $this->createMock(IProvider::class);
+ $provider->method('getDisplayName')
+ ->willReturn('myprovider');
+
+ $this->security->twofactorSuccess($this->user, $provider);
}
}
diff --git a/apps/cloud_federation_api/composer/composer/ClassLoader.php b/apps/cloud_federation_api/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/cloud_federation_api/composer/composer/ClassLoader.php
+++ b/apps/cloud_federation_api/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/cloud_federation_api/composer/composer/installed.php b/apps/cloud_federation_api/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/cloud_federation_api/composer/composer/installed.php
+++ b/apps/cloud_federation_api/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/cloud_federation_api/lib/Capabilities.php b/apps/cloud_federation_api/lib/Capabilities.php
index 6164c0e0dba..91fd5219215 100644
--- a/apps/cloud_federation_api/lib/Capabilities.php
+++ b/apps/cloud_federation_api/lib/Capabilities.php
@@ -36,9 +36,6 @@ class Capabilities implements ICapability {
/**
* Function an app uses to return the capabilities
- *
- * @return array Array containing the apps capabilities
- * @since 8.2.0
*/
public function getCapabilities() {
$url = $this->urlGenerator->linkToRouteAbsolute('cloud_federation_api.requesthandlercontroller.addShare');
diff --git a/apps/comments/composer/composer/ClassLoader.php b/apps/comments/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/comments/composer/composer/ClassLoader.php
+++ b/apps/comments/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/comments/composer/composer/autoload_static.php b/apps/comments/composer/composer/autoload_static.php
index 9732ee9f4ca..091dfce5931 100644
--- a/apps/comments/composer/composer/autoload_static.php
+++ b/apps/comments/composer/composer/autoload_static.php
@@ -7,14 +7,14 @@ namespace Composer\Autoload;
class ComposerStaticInitComments
{
public static $prefixLengthsPsr4 = array (
- 'O' =>
+ 'O' =>
array (
'OCA\\Comments\\' => 13,
),
);
public static $prefixDirsPsr4 = array (
- 'OCA\\Comments\\' =>
+ 'OCA\\Comments\\' =>
array (
0 => __DIR__ . '/..' . '/../lib',
),
diff --git a/apps/comments/composer/composer/installed.php b/apps/comments/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/comments/composer/composer/installed.php
+++ b/apps/comments/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/comments/lib/Activity/Provider.php b/apps/comments/lib/Activity/Provider.php
index 727f6d66b50..7ec22c68c16 100644
--- a/apps/comments/lib/Activity/Provider.php
+++ b/apps/comments/lib/Activity/Provider.php
@@ -182,7 +182,7 @@ class Provider implements IProvider {
}
$message = str_replace('@"' . $mention['id'] . '"', '{mention' . $mentionCount . '}', $message);
- if (strpos($mention['id'], ' ') === false && strpos($mention['id'], 'guest/') !== 0) {
+ if (!str_contains($mention['id'], ' ') && !str_starts_with($mention['id'], 'guest/')) {
$message = str_replace('@' . $mention['id'], '{mention' . $mentionCount . '}', $message);
}
diff --git a/apps/comments/lib/Notification/Notifier.php b/apps/comments/lib/Notification/Notifier.php
index 59f1ad5da5f..aa3f9ba6824 100644
--- a/apps/comments/lib/Notification/Notifier.php
+++ b/apps/comments/lib/Notification/Notifier.php
@@ -118,7 +118,7 @@ class Notifier implements INotifier {
$node = $nodes[0];
$path = rtrim($node->getPath(), '/');
- if (strpos($path, '/' . $notification->getUser() . '/files/') === 0) {
+ if (str_starts_with($path, '/' . $notification->getUser() . '/files/')) {
// Remove /user/files/...
$fullPath = $path;
[,,, $path] = explode('/', $fullPath, 4);
@@ -182,7 +182,7 @@ class Notifier implements INotifier {
// index of the mentions of that type.
$mentionParameterId = 'mention-' . $mention['type'] . $mentionTypeCount[$mention['type']];
$message = str_replace('@"' . $mention['id'] . '"', '{' . $mentionParameterId . '}', $message);
- if (strpos($mention['id'], ' ') === false && strpos($mention['id'], 'guest/') !== 0) {
+ if (!str_contains($mention['id'], ' ') && !str_starts_with($mention['id'], 'guest/')) {
$message = str_replace('@' . $mention['id'], '{' . $mentionParameterId . '}', $message);
}
diff --git a/apps/contactsinteraction/composer/composer/ClassLoader.php b/apps/contactsinteraction/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/contactsinteraction/composer/composer/ClassLoader.php
+++ b/apps/contactsinteraction/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/contactsinteraction/composer/composer/installed.php b/apps/contactsinteraction/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/contactsinteraction/composer/composer/installed.php
+++ b/apps/contactsinteraction/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/dashboard/composer/composer/ClassLoader.php b/apps/dashboard/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/dashboard/composer/composer/ClassLoader.php
+++ b/apps/dashboard/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/dashboard/composer/composer/installed.php b/apps/dashboard/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/dashboard/composer/composer/installed.php
+++ b/apps/dashboard/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/dav/composer/composer/ClassLoader.php b/apps/dav/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/dav/composer/composer/ClassLoader.php
+++ b/apps/dav/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/dav/composer/composer/installed.php b/apps/dav/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/dav/composer/composer/installed.php
+++ b/apps/dav/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/dav/l10n/sl.js b/apps/dav/l10n/sl.js
index 639daf8423d..9737702baff 100644
--- a/apps/dav/l10n/sl.js
+++ b/apps/dav/l10n/sl.js
@@ -37,9 +37,22 @@ OC.L10N.register(
"{actor} restored event {event} of calendar {calendar}" : "{actor} obnovi dogodek {event} v koledarju {calendar}",
"You restored event {event} of calendar {calendar}" : "Obnovite dogodek {event} v koledarju {calendar}",
"Busy" : "Zasedeno",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} ustvari nalogo {todo} v koledarju {calendar}",
+ "You created to-do {todo} in list {calendar}" : "Ustvarite nalogo {todo} v koledarju {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} izbriše nalogo {todo} iz koledarja {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "Izbrišete nalogo {todo} iz koledarja {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} posodobi nalogo {todo} v koledarju {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "Posodobite nalogo {todo} v seznamu {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} razreši nalogo {todo} v koledarju {calendar}",
+ "You solved to-do {todo} in list {calendar}" : "Razrešite nalogo {todo} v seznamu {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} ponovno odpre nalogo {todo} v koledarju {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Ponovno odprete nalogo {todo} v seznamu {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} premakne nalogo {todo} iz seznama koledarja {sourceCalendar} v koledar {targetCalendar}",
+ "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Premaknete nalogo {todo} iz seznama koledarja {sourceCalendar} v koledar {targetCalendar}",
"Calendar, contacts and tasks" : "Koledar, stiki in naloge",
"A <strong>calendar</strong> was modified" : "V <strong>koledar</strong> je vpisana sprememba",
"A calendar <strong>event</strong> was modified" : "Spremenjen je <strong>dogodek</strong> v koledarju",
+ "A calendar <strong>to-do</strong> was modified" : "Spremenjena je <strong>naloga</strong> koledarja",
"Contact birthdays" : "Obletnice stikov",
"Death of %s" : "%s (obletnica smrti)",
"Untitled calendar" : "Neimenovan koledar",
@@ -61,7 +74,14 @@ OC.L10N.register(
"%1$s via %2$s" : "%1$s prek %2$s",
"Cancelled: %1$s" : "Preklicano: %1$s",
"Re: %1$s" : "Odg: %1$s",
+ "%1$s has accepted your invitation" : "%1$ssprejme vaše povabilo",
+ "%1$s has tentatively accepted your invitation" : "%1$s pogojno sprejme vabilo",
+ "%1$s has declined your invitation" : "%1$s zavrne vaše povabilo.",
+ "%1$s has responded to your invitation" : "%1$s pošlje odziv na vaše povabilo.",
+ "Invitation updated: %1$s" : "Povabilo je posodobljeno: %1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s posodobi dogodek »%2$s«",
"Invitation: %1$s" : "Povabilo: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s vas želi povabiti na »%2$s«",
"Organizer:" : "Organizator:",
"Attendees:" : "Udeleženci:",
"Title:" : "Naslov:",
@@ -73,14 +93,24 @@ OC.L10N.register(
"More options …" : "Več možnosti ...",
"More options at %s" : "Več možnosti je na %s",
"Contacts" : "Stiki",
+ "{actor} created address book {addressbook}" : "{actor} ustvari imenik {addressbook}",
+ "You created address book {addressbook}" : "Ustvarite imenik {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} izbriše imenik {addressbook}",
"You deleted address book {addressbook}" : "Izbrišete imenik {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} posodobi imenik {addressbook}",
+ "You updated address book {addressbook}" : "Posodobite imenik {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Spremenjen je bil <strong>stik</strong> oziroma <strong>imenik</strong>",
+ "Accounts" : "Računi",
+ "System address book which holds all accounts" : "Sistemski imenik, ki združuje vse račune",
"File is not updatable: %1$s" : "Datoteke ni mogoče posodobiti: %1$s",
"Could not write file contents" : "Ni mogoče zapisati vsebine datoteke",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"],
"Could not rename part file to final file" : "Ni mogoče preimenovati delne datoteke v končno ime.",
"Failed to check file size: %1$s" : "Preverjanje velikosti je spodletelo: %1$s",
"Could not open file" : "Datoteke ni mogoče odpreti",
+ "Encryption not ready: %1$s" : "Šifriranje ni mogoče: %1$s",
"Failed to open file: %1$s" : "Odpiranje datoteke je spodletelo: %1$s",
+ "Failed to unlink: %1$s" : "Odstranjevanje povezave je spodletelo: %1$s",
"File not found: %1$s" : "Datoteke ni mogoče najti: %1$s",
"System is in maintenance mode." : "Sistem je v vzdrževalnem načinu.",
"Upgrade needed" : "Zahtevana je posodobitev",
@@ -93,6 +123,7 @@ OC.L10N.register(
"Completed on %s" : "Končana %s",
"Due on %s by %s" : "Poteče %s ob %s",
"Due on %s" : "Poteče %s",
+ "Calendars including events, details and attendees" : "Koledarji z dogodki, podrobnostmi in udeleženci",
"Contacts and groups" : "Stiki in skupine",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Končna točka WebDAV",
diff --git a/apps/dav/l10n/sl.json b/apps/dav/l10n/sl.json
index 70c31d3a60e..0a40e8cc946 100644
--- a/apps/dav/l10n/sl.json
+++ b/apps/dav/l10n/sl.json
@@ -35,9 +35,22 @@
"{actor} restored event {event} of calendar {calendar}" : "{actor} obnovi dogodek {event} v koledarju {calendar}",
"You restored event {event} of calendar {calendar}" : "Obnovite dogodek {event} v koledarju {calendar}",
"Busy" : "Zasedeno",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} ustvari nalogo {todo} v koledarju {calendar}",
+ "You created to-do {todo} in list {calendar}" : "Ustvarite nalogo {todo} v koledarju {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} izbriše nalogo {todo} iz koledarja {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "Izbrišete nalogo {todo} iz koledarja {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} posodobi nalogo {todo} v koledarju {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "Posodobite nalogo {todo} v seznamu {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} razreši nalogo {todo} v koledarju {calendar}",
+ "You solved to-do {todo} in list {calendar}" : "Razrešite nalogo {todo} v seznamu {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} ponovno odpre nalogo {todo} v koledarju {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Ponovno odprete nalogo {todo} v seznamu {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} premakne nalogo {todo} iz seznama koledarja {sourceCalendar} v koledar {targetCalendar}",
+ "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Premaknete nalogo {todo} iz seznama koledarja {sourceCalendar} v koledar {targetCalendar}",
"Calendar, contacts and tasks" : "Koledar, stiki in naloge",
"A <strong>calendar</strong> was modified" : "V <strong>koledar</strong> je vpisana sprememba",
"A calendar <strong>event</strong> was modified" : "Spremenjen je <strong>dogodek</strong> v koledarju",
+ "A calendar <strong>to-do</strong> was modified" : "Spremenjena je <strong>naloga</strong> koledarja",
"Contact birthdays" : "Obletnice stikov",
"Death of %s" : "%s (obletnica smrti)",
"Untitled calendar" : "Neimenovan koledar",
@@ -59,7 +72,14 @@
"%1$s via %2$s" : "%1$s prek %2$s",
"Cancelled: %1$s" : "Preklicano: %1$s",
"Re: %1$s" : "Odg: %1$s",
+ "%1$s has accepted your invitation" : "%1$ssprejme vaše povabilo",
+ "%1$s has tentatively accepted your invitation" : "%1$s pogojno sprejme vabilo",
+ "%1$s has declined your invitation" : "%1$s zavrne vaše povabilo.",
+ "%1$s has responded to your invitation" : "%1$s pošlje odziv na vaše povabilo.",
+ "Invitation updated: %1$s" : "Povabilo je posodobljeno: %1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s posodobi dogodek »%2$s«",
"Invitation: %1$s" : "Povabilo: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s vas želi povabiti na »%2$s«",
"Organizer:" : "Organizator:",
"Attendees:" : "Udeleženci:",
"Title:" : "Naslov:",
@@ -71,14 +91,24 @@
"More options …" : "Več možnosti ...",
"More options at %s" : "Več možnosti je na %s",
"Contacts" : "Stiki",
+ "{actor} created address book {addressbook}" : "{actor} ustvari imenik {addressbook}",
+ "You created address book {addressbook}" : "Ustvarite imenik {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} izbriše imenik {addressbook}",
"You deleted address book {addressbook}" : "Izbrišete imenik {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} posodobi imenik {addressbook}",
+ "You updated address book {addressbook}" : "Posodobite imenik {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Spremenjen je bil <strong>stik</strong> oziroma <strong>imenik</strong>",
+ "Accounts" : "Računi",
+ "System address book which holds all accounts" : "Sistemski imenik, ki združuje vse račune",
"File is not updatable: %1$s" : "Datoteke ni mogoče posodobiti: %1$s",
"Could not write file contents" : "Ni mogoče zapisati vsebine datoteke",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"],
"Could not rename part file to final file" : "Ni mogoče preimenovati delne datoteke v končno ime.",
"Failed to check file size: %1$s" : "Preverjanje velikosti je spodletelo: %1$s",
"Could not open file" : "Datoteke ni mogoče odpreti",
+ "Encryption not ready: %1$s" : "Šifriranje ni mogoče: %1$s",
"Failed to open file: %1$s" : "Odpiranje datoteke je spodletelo: %1$s",
+ "Failed to unlink: %1$s" : "Odstranjevanje povezave je spodletelo: %1$s",
"File not found: %1$s" : "Datoteke ni mogoče najti: %1$s",
"System is in maintenance mode." : "Sistem je v vzdrževalnem načinu.",
"Upgrade needed" : "Zahtevana je posodobitev",
@@ -91,6 +121,7 @@
"Completed on %s" : "Končana %s",
"Due on %s by %s" : "Poteče %s ob %s",
"Due on %s" : "Poteče %s",
+ "Calendars including events, details and attendees" : "Koledarji z dogodki, podrobnostmi in udeleženci",
"Contacts and groups" : "Stiki in skupine",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Končna točka WebDAV",
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index 94fe9acf356..c57d3a2764f 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -2732,7 +2732,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @param string $calendarData
* @return array
*/
- public function getDenormalizedData($calendarData) {
+ public function getDenormalizedData(string $calendarData): array {
$vObject = Reader::read($calendarData);
$vEvents = [];
$componentType = null;
@@ -2746,7 +2746,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
if ($component->name !== 'VTIMEZONE') {
// Finding all VEVENTs, and track them
if ($component->name === 'VEVENT') {
- array_push($vEvents, $component);
+ $vEvents[] = $component;
if ($component->DTSTART) {
$hasDTSTART = true;
}
@@ -2814,7 +2814,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'size' => strlen($calendarData),
'componentType' => $componentType,
'firstOccurence' => is_null($firstOccurrence) ? null : max(0, $firstOccurrence),
- 'lastOccurence' => $lastOccurrence,
+ 'lastOccurence' => is_null($lastOccurrence) ? null : max(0, $lastOccurrence),
'uid' => $uid,
'classification' => $classification
];
diff --git a/apps/dav/lib/CardDAV/Converter.php b/apps/dav/lib/CardDAV/Converter.php
index b3d8b094d69..e19b52b4783 100644
--- a/apps/dav/lib/CardDAV/Converter.php
+++ b/apps/dav/lib/CardDAV/Converter.php
@@ -29,6 +29,7 @@ namespace OCA\DAV\CardDAV;
use Exception;
use OCP\Accounts\IAccountManager;
+use OCP\IURLGenerator;
use OCP\IImage;
use OCP\IUser;
use OCP\IUserManager;
@@ -36,14 +37,17 @@ use Sabre\VObject\Component\VCard;
use Sabre\VObject\Property\Text;
class Converter {
+ /** @var IURLGenerator */
+ private $urlGenerator;
/** @var IAccountManager */
private $accountManager;
private IUserManager $userManager;
public function __construct(IAccountManager $accountManager,
- IUserManager $userManager) {
+ IUserManager $userManager, IURLGenerator $urlGenerator) {
$this->accountManager = $accountManager;
$this->userManager = $userManager;
+ $this->urlGenerator = $urlGenerator;
}
public function createCardFromUser(IUser $user): ?VCard {
@@ -88,6 +92,21 @@ class Converter {
case IAccountManager::PROPERTY_WEBSITE:
$vCard->add(new Text($vCard, 'URL', $property->getValue(), ['X-NC-SCOPE' => $scope]));
break;
+ case IAccountManager::PROPERTY_PROFILE_ENABLED:
+ if ($property->getValue()) {
+ $vCard->add(
+ new Text(
+ $vCard,
+ 'X-SOCIALPROFILE',
+ $this->urlGenerator->linkToRouteAbsolute('core.ProfilePage.index', ['targetUserId' => $user->getUID()]),
+ [
+ 'TYPE' => 'NEXTCLOUD',
+ 'X-NC-SCOPE' => IAccountManager::SCOPE_PUBLISHED
+ ]
+ )
+ );
+ }
+ break;
case IAccountManager::PROPERTY_PHONE:
$vCard->add(new Text($vCard, 'TEL', $property->getValue(), ['TYPE' => 'VOICE', 'X-NC-SCOPE' => $scope]));
break;
diff --git a/apps/dav/lib/HookManager.php b/apps/dav/lib/HookManager.php
index b69d9b0cd79..ae92a9c9335 100644
--- a/apps/dav/lib/HookManager.php
+++ b/apps/dav/lib/HookManager.php
@@ -67,21 +67,16 @@ class HookManager {
/** @var Defaults */
private $themingDefaults;
- /** @var EventDispatcherInterface */
- private $eventDispatcher;
-
public function __construct(IUserManager $userManager,
SyncService $syncService,
CalDavBackend $calDav,
CardDavBackend $cardDav,
- Defaults $themingDefaults,
- EventDispatcherInterface $eventDispatcher) {
+ Defaults $themingDefaults) {
$this->userManager = $userManager;
$this->syncService = $syncService;
$this->calDav = $calDav;
$this->cardDav = $cardDav;
$this->themingDefaults = $themingDefaults;
- $this->eventDispatcher = $eventDispatcher;
}
public function setup() {
diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
index 0fdd617943b..acf5504eb66 100644
--- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
@@ -29,6 +29,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+
namespace OCA\DAV\Tests\unit\CalDAV;
use DateTime;
@@ -663,16 +664,25 @@ EOS;
}
}
- public function providesCalDataForGetDenormalizedData() {
+ public function providesCalDataForGetDenormalizedData(): array {
return [
'first occurrence before unix epoch starts' => [0, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nDTSTART;VALUE=DATE:16040222\r\nDTEND;VALUE=DATE:16040223\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
'no first occurrence because yearly' => [null, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
+
'last occurrence is max when only last VEVENT in group is weekly' => [(new DateTime(CalDavBackend::MAX_DATE))->getTimestamp(), 'lastOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.3.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nDTSTART;TZID=America/Los_Angeles:20200812T103000\r\nDTEND;TZID=America/Los_Angeles:20200812T110000\r\nDTSTAMP:20200927T180638Z\r\nUID:asdfasdfasdf@google.com\r\nRECURRENCE-ID;TZID=America/Los_Angeles:20200811T123000\r\nCREATED:20200626T181848Z\r\nLAST-MODIFIED:20200922T192707Z\r\nSUMMARY:Weekly 1:1\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nDTSTART;TZID=America/Los_Angeles:20200728T123000\r\nDTEND;TZID=America/Los_Angeles:20200728T130000\r\nEXDATE;TZID=America/Los_Angeles:20200818T123000\r\nRRULE:FREQ=WEEKLY;BYDAY=TU\r\nDTSTAMP:20200927T180638Z\r\nUID:asdfasdfasdf@google.com\r\nCREATED:20200626T181848Z\r\nDESCRIPTION:Setting up recurring time on our calendars\r\nLAST-MODIFIED:20200922T192707Z\r\nSUMMARY:Weekly 1:1\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
+
+ 'last occurrence before unix epoch starts' => [0, 'lastOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.3.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:19110324\r\nDTEND;VALUE=DATE:19110325\r\nDTSTAMP:20200927T180638Z\r\nUID:asdfasdfasdf@google.com\r\nCREATED:20200626T181848Z\r\nDESCRIPTION:Very old event\r\nLAST-MODIFIED:20200922T192707Z\r\nSUMMARY:Some old event\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
+
'first occurrence is found when not first VEVENT in group' => [(new DateTime('2020-09-01T110000', new DateTimeZone("America/Los_Angeles")))->getTimestamp(), 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.3.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nDTSTART;TZID=America/Los_Angeles:20201013T110000\r\nDTEND;TZID=America/Los_Angeles:20201013T120000\r\nDTSTAMP:20200927T180638Z\r\nUID:asdf0000@google.com\r\nRECURRENCE-ID;TZID=America/Los_Angeles:20201013T110000\r\nCREATED:20160330T034726Z\r\nLAST-MODIFIED:20200925T042014Z\r\nSTATUS:CONFIRMED\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nDTSTART;TZID=America/Los_Angeles:20200901T110000\r\nDTEND;TZID=America/Los_Angeles:20200901T120000\r\nRRULE:FREQ=WEEKLY;BYDAY=TU\r\nEXDATE;TZID=America/Los_Angeles:20200922T110000\r\nEXDATE;TZID=America/Los_Angeles:20200915T110000\r\nEXDATE;TZID=America/Los_Angeles:20200908T110000\r\nDTSTAMP:20200927T180638Z\r\nUID:asdf0000@google.com\r\nCREATED:20160330T034726Z\r\nLAST-MODIFIED:20200915T162810Z\r\nSTATUS:CONFIRMED\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"],
+
'CLASS:PRIVATE' => [CalDavBackend::CLASSIFICATION_PRIVATE, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:PRIVATE\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+
'CLASS:PUBLIC' => [CalDavBackend::CLASSIFICATION_PUBLIC, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:PUBLIC\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+
'CLASS:CONFIDENTIAL' => [CalDavBackend::CLASSIFICATION_CONFIDENTIAL, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:CONFIDENTIAL\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+
'no class set -> public' => [CalDavBackend::CLASSIFICATION_PUBLIC, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nTRANSP:OPAQUE\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
+
'unknown class -> private' => [CalDavBackend::CLASSIFICATION_PRIVATE, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:VERTRAULICH\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"],
];
}
@@ -1348,7 +1358,7 @@ EOD;
// Create card
$uri = static::getUniqueID('calobj');
-$calData = <<<EOD
+ $calData = <<<EOD
BEGIN:VCALENDAR
VERSION:2.0
PRODID:Nextcloud Calendar
@@ -1371,7 +1381,7 @@ EOD;
$this->assertEquals(1, count($changes['added']));
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
-
+
// update the card
$calData = <<<'EOD'
BEGIN:VCALENDAR
@@ -1395,7 +1405,7 @@ EOD;
$changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
$this->assertEmpty($changes['added']);
$this->assertEquals(1, count($changes['modified']));
- $this->assertEmpty($changes['deleted']);
+ $this->assertEmpty($changes['deleted']);
// Delete all but last change
$deleted = $this->backend->pruneOutdatedSyncTokens(1);
@@ -1406,7 +1416,7 @@ EOD;
$this->assertEmpty($changes['added']);
$this->assertEquals(1, count($changes['modified']));
$this->assertEmpty($changes['deleted']);
-
+
// Check that no crash occurs when prune is called without current changes
$deleted = $this->backend->pruneOutdatedSyncTokens(1);
}
diff --git a/apps/dav/tests/unit/CardDAV/ConverterTest.php b/apps/dav/tests/unit/CardDAV/ConverterTest.php
index 6b589ec3874..7205cf56654 100644
--- a/apps/dav/tests/unit/CardDAV/ConverterTest.php
+++ b/apps/dav/tests/unit/CardDAV/ConverterTest.php
@@ -34,6 +34,7 @@ use OCA\DAV\CardDAV\Converter;
use OCP\Accounts\IAccount;
use OCP\Accounts\IAccountManager;
use OCP\Accounts\IAccountProperty;
+use OCP\IURLGenerator;
use OCP\IImage;
use OCP\IUser;
use OCP\IUserManager;
@@ -47,11 +48,15 @@ class ConverterTest extends TestCase {
/** @var IUserManager|(IUserManager&MockObject)|MockObject */
private IUserManager|MockObject $userManager;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
protected function setUp(): void {
parent::setUp();
$this->accountManager = $this->createMock(IAccountManager::class);
$this->userManager = $this->createMock(IUserManager::class);
+ $this->urlGenerator = $this->createMock(IURLGenerator::class);
}
/**
@@ -103,7 +108,7 @@ class ConverterTest extends TestCase {
$user = $this->getUserMock((string)$displayName, $eMailAddress, $cloudId);
$accountManager = $this->getAccountManager($user);
- $converter = new Converter($accountManager, $this->userManager);
+ $converter = new Converter($accountManager, $this->userManager, $this->urlGenerator);
$vCard = $converter->createCardFromUser($user);
if ($expectedVCard !== null) {
$this->assertInstanceOf('Sabre\VObject\Component\VCard', $vCard);
@@ -124,7 +129,7 @@ class ConverterTest extends TestCase {
->willReturn('Manager');
$accountManager = $this->getAccountManager($user);
- $converter = new Converter($accountManager, $this->userManager);
+ $converter = new Converter($accountManager, $this->userManager, $this->urlGenerator);
$vCard = $converter->createCardFromUser($user);
$this->compareData(
@@ -212,7 +217,7 @@ class ConverterTest extends TestCase {
* @param $fullName
*/
public function testNameSplitter($expected, $fullName): void {
- $converter = new Converter($this->accountManager, $this->userManager);
+ $converter = new Converter($this->accountManager, $this->userManager, $this->urlGenerator);
$r = $converter->splitFullName($fullName);
$r = implode(';', $r);
$this->assertEquals($expected, $r);
diff --git a/apps/dav/tests/unit/DAV/HookManagerTest.php b/apps/dav/tests/unit/DAV/HookManagerTest.php
index eeda27d8aa3..97abe3881c0 100644
--- a/apps/dav/tests/unit/DAV/HookManagerTest.php
+++ b/apps/dav/tests/unit/DAV/HookManagerTest.php
@@ -39,19 +39,14 @@ use OCP\IL10N;
use OCP\IUser;
use OCP\IUserManager;
use PHPUnit\Framework\MockObject\MockObject;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\TestCase;
class HookManagerTest extends TestCase {
/** @var IL10N */
private $l10n;
- /** @var EventDispatcherInterface | MockObject */
- private $eventDispatcher;
-
protected function setUp(): void {
parent::setUp();
- $this->eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$this->l10n = $this->createMock(IL10N::class);
$this->l10n
->expects($this->any())
@@ -106,7 +101,7 @@ class HookManagerTest extends TestCase {
'principals/users/newUser',
'contacts', ['{DAV:}displayname' => 'Contacts']);
- $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults, $this->eventDispatcher);
+ $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults);
$hm->firstLogin($user);
}
@@ -145,7 +140,7 @@ class HookManagerTest extends TestCase {
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(1);
$card->expects($this->never())->method('createAddressBook');
- $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults, $this->eventDispatcher);
+ $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults);
$hm->firstLogin($user);
}
@@ -193,7 +188,7 @@ class HookManagerTest extends TestCase {
'principals/users/newUser',
'contacts', ['{DAV:}displayname' => 'Contacts']);
- $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults, $this->eventDispatcher);
+ $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults);
$hm->firstLogin($user);
}
@@ -243,7 +238,7 @@ class HookManagerTest extends TestCase {
]);
$card->expects($this->once())->method('deleteAddressBook');
- $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults, $this->eventDispatcher);
+ $hm = new HookManager($userManager, $syncService, $cal, $card, $defaults);
$hm->preDeleteUser(['uid' => 'newUser']);
$hm->postDeleteUser(['uid' => 'newUser']);
}
diff --git a/apps/encryption/composer/composer/ClassLoader.php b/apps/encryption/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/encryption/composer/composer/ClassLoader.php
+++ b/apps/encryption/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/encryption/composer/composer/installed.php b/apps/encryption/composer/composer/installed.php
index 46be34510db..1a66c7f2416 100644
--- a/apps/encryption/composer/composer/installed.php
+++ b/apps/encryption/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'ffa8d21f37c8ccf968974b6aeb828e3e84287b94',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'ffa8d21f37c8ccf968974b6aeb828e3e84287b94',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/encryption/l10n/gl.js b/apps/encryption/l10n/gl.js
index 5046fcd5209..1db45b3189f 100644
--- a/apps/encryption/l10n/gl.js
+++ b/apps/encryption/l10n/gl.js
@@ -28,6 +28,8 @@ OC.L10N.register(
"Bad Signature" : "Sinatura errónea",
"Missing Signature" : "Non se atopa a sinatura",
"one-time password for server-side-encryption" : "Contrasinal de só un uso para o cifrado no lado do servidor",
+ "Encryption password" : "Contrasinal de cifrado",
+ "Please login to the web interface, go to the \"Security\" section 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." : "Acceda na interface web, vaia á sección «Seguranza» dos seus axustes persoais e actualice o seu contrasinal de cifrado introducindo este contrasinal no campo «Contrasinal antigo de acceso» e o seu contrasinal de acceso actual.",
"Default encryption module" : "Módulo de cifrado predeterminado",
"Default encryption module for server-side encryption" : "Módulo de cifrado predeterminado para o cifrado no lado do servidor",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as súas chaves non foron preparadas, saia da sesión e volva acceder de novo",
diff --git a/apps/encryption/l10n/gl.json b/apps/encryption/l10n/gl.json
index ed2802fd3ba..a4ba12b70d8 100644
--- a/apps/encryption/l10n/gl.json
+++ b/apps/encryption/l10n/gl.json
@@ -26,6 +26,8 @@
"Bad Signature" : "Sinatura errónea",
"Missing Signature" : "Non se atopa a sinatura",
"one-time password for server-side-encryption" : "Contrasinal de só un uso para o cifrado no lado do servidor",
+ "Encryption password" : "Contrasinal de cifrado",
+ "Please login to the web interface, go to the \"Security\" section 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." : "Acceda na interface web, vaia á sección «Seguranza» dos seus axustes persoais e actualice o seu contrasinal de cifrado introducindo este contrasinal no campo «Contrasinal antigo de acceso» e o seu contrasinal de acceso actual.",
"Default encryption module" : "Módulo de cifrado predeterminado",
"Default encryption module for server-side encryption" : "Módulo de cifrado predeterminado para o cifrado no lado do servidor",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as súas chaves non foron preparadas, saia da sesión e volva acceder de novo",
diff --git a/apps/federatedfilesharing/composer/composer/ClassLoader.php b/apps/federatedfilesharing/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/federatedfilesharing/composer/composer/ClassLoader.php
+++ b/apps/federatedfilesharing/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/federatedfilesharing/composer/composer/installed.php b/apps/federatedfilesharing/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/federatedfilesharing/composer/composer/installed.php
+++ b/apps/federatedfilesharing/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/federatedfilesharing/lib/Notifier.php b/apps/federatedfilesharing/lib/Notifier.php
index 87c05e19e4b..563b121ce5b 100644
--- a/apps/federatedfilesharing/lib/Notifier.php
+++ b/apps/federatedfilesharing/lib/Notifier.php
@@ -102,8 +102,9 @@ class Notifier implements INotifier {
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/share.svg')));
$params = $notification->getSubjectParameters();
+ $displayName = (count($params) > 3) ? $params[3] : '';
if ($params[0] !== $params[1] && $params[1] !== null) {
- $remoteInitiator = $this->createRemoteUser($params[0]);
+ $remoteInitiator = $this->createRemoteUser($params[0], $displayName);
$remoteOwner = $this->createRemoteUser($params[1]);
$params[3] = $remoteInitiator['name'] . '@' . $remoteInitiator['server'];
$params[4] = $remoteOwner['name'] . '@' . $remoteOwner['server'];
@@ -121,7 +122,7 @@ class Notifier implements INotifier {
]
);
} else {
- $remoteOwner = $this->createRemoteUser($params[0]);
+ $remoteOwner = $this->createRemoteUser($params[0], $displayName);
$params[3] = $remoteOwner['name'] . '@' . $remoteOwner['server'];
$notification->setRichSubject(
@@ -166,19 +167,21 @@ class Notifier implements INotifier {
/**
* @param string $cloudId
+ * @param string $displayName - overwrite display name
+ *
* @return array
*/
- protected function createRemoteUser($cloudId, $displayName = null) {
+ protected function createRemoteUser(string $cloudId, string $displayName = '') {
try {
$resolvedId = $this->cloudIdManager->resolveCloudId($cloudId);
- if ($displayName === null) {
+ if ($displayName === '') {
$displayName = $this->getDisplayName($resolvedId);
}
$user = $resolvedId->getUser();
$server = $resolvedId->getRemote();
} catch (HintException $e) {
$user = $cloudId;
- $displayName = $cloudId;
+ $displayName = ($displayName !== '') ? $displayName : $cloudId;
$server = '';
}
diff --git a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php
index 370ef8dc32a..5e2cafe0ce0 100644
--- a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php
+++ b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php
@@ -55,10 +55,13 @@ use OCP\ILogger;
use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Notification\IManager as INotificationManager;
+use OCP\Server;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
use OCP\Share\IShare;
use OCP\Util;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Log\LoggerInterface;
class CloudFederationProviderFiles implements ICloudFederationProvider {
@@ -250,26 +253,29 @@ class CloudFederationProviderFiles implements ICloudFederationProvider {
$this->externalShareManager->addShare($remote, $token, '', $name, $owner, $shareType,false, $shareWith, $remoteId);
$shareId = \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*share_external');
+ // get DisplayName about the owner of the share
+ $ownerDisplayName = $this->getUserDisplayName($ownerFederatedId);
+
if ($shareType === IShare::TYPE_USER) {
$event = $this->activityManager->generateEvent();
$event->setApp('files_sharing')
->setType('remote_share')
- ->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/')])
+ ->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/'), $ownerDisplayName])
->setAffectedUser($shareWith)
->setObject('remote_share', $shareId, $name);
\OC::$server->getActivityManager()->publish($event);
- $this->notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name);
+ $this->notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $ownerDisplayName);
} else {
$groupMembers = $this->groupManager->get($shareWith)->getUsers();
foreach ($groupMembers as $user) {
$event = $this->activityManager->generateEvent();
$event->setApp('files_sharing')
->setType('remote_share')
- ->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/')])
+ ->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/'), $ownerDisplayName])
->setAffectedUser($user->getUID())
->setObject('remote_share', $shareId, $name);
\OC::$server->getActivityManager()->publish($event);
- $this->notifyAboutNewShare($user->getUID(), $shareId, $ownerFederatedId, $sharedByFederatedId, $name);
+ $this->notifyAboutNewShare($user->getUID(), $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $ownerDisplayName);
}
}
return $shareId;
@@ -335,13 +341,13 @@ class CloudFederationProviderFiles implements ICloudFederationProvider {
return $result;
}
- private function notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name): void {
+ private function notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $displayName): void {
$notification = $this->notificationManager->createNotification();
$notification->setApp('files_sharing')
->setUser($shareWith)
->setDateTime(new \DateTime())
->setObject('remote_share', $shareId)
- ->setSubject('remote_share', [$ownerFederatedId, $sharedByFederatedId, trim($name, '/')]);
+ ->setSubject('remote_share', [$ownerFederatedId, $sharedByFederatedId, trim($name, '/'), $displayName]);
$declineAction = $notification->createAction();
$declineAction->setLabel('decline')
@@ -579,6 +585,8 @@ class CloudFederationProviderFiles implements ICloudFederationProvider {
->where($qb->expr()->eq('parent', $qb->createNamedParameter((int)$share['id'])));
$qb->execute();
+ $ownerDisplayName = $this->getUserDisplayName($owner->getId());
+
if ((int)$share['share_type'] === IShare::TYPE_USER) {
if ($share['accepted']) {
$path = trim($mountpoint, '/');
@@ -594,7 +602,7 @@ class CloudFederationProviderFiles implements ICloudFederationProvider {
$event = $this->activityManager->generateEvent();
$event->setApp('files_sharing')
->setType('remote_share')
- ->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_UNSHARED, [$owner->getId(), $path])
+ ->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_UNSHARED, [$owner->getId(), $path, $ownerDisplayName])
->setAffectedUser($user)
->setObject('remote_share', (int)$share['id'], $path);
\OC::$server->getActivityManager()->publish($event);
@@ -824,4 +832,25 @@ class CloudFederationProviderFiles implements ICloudFederationProvider {
public function getSupportedShareTypes() {
return ['user', 'group'];
}
+
+
+ public function getUserDisplayName(string $userId): string {
+ // check if gss is enabled and available
+ if (!$this->appManager->isInstalled('globalsiteselector')
+ || !class_exists('\OCA\GlobalSiteSelector\Service\SlaveService')) {
+ return '';
+ }
+
+ try {
+ $slaveService = Server::get(\OCA\GlobalSiteSelector\Service\SlaveService::class);
+ } catch (\Throwable $e) {
+ Server::get(LoggerInterface::class)->error(
+ $e->getMessage(),
+ ['exception' => $e]
+ );
+ return '';
+ }
+
+ return $slaveService->getUserDisplayName($this->cloudIdManager->removeProtocolFromUrl($userId), false);
+ }
}
diff --git a/apps/federation/composer/composer/ClassLoader.php b/apps/federation/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/federation/composer/composer/ClassLoader.php
+++ b/apps/federation/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/federation/composer/composer/installed.php b/apps/federation/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/federation/composer/composer/installed.php
+++ b/apps/federation/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
index 13ac9178eda..d410af2a7f4 100644
--- a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
@@ -1,10 +1,14 @@
<?php
+
+declare(strict_types=1);
+
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Bjoern Schiessle <bjoern@schiessle.org>
* @author Björn Schießle <bjoern@schiessle.org>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @author Côme Chilliet <come@chilliet.eu>
* @author Joas Schilling <coding@schilljs.com>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
@@ -37,9 +41,9 @@ use OCP\BackgroundJob\IJobList;
use OCP\BackgroundJob\Job;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
-use OCP\ILogger;
use OCP\IURLGenerator;
use OCP\OCS\IDiscoveryService;
+use Psr\Log\LoggerInterface;
/**
* Class RequestSharedSecret
@@ -49,74 +53,37 @@ use OCP\OCS\IDiscoveryService;
* @package OCA\Federation\Backgroundjob
*/
class RequestSharedSecret extends Job {
+ private IClient $httpClient;
- /** @var IClient */
- private $httpClient;
-
- /** @var IJobList */
- private $jobList;
-
- /** @var IURLGenerator */
- private $urlGenerator;
-
- /** @var TrustedServers */
- private $trustedServers;
-
- /** @var IDiscoveryService */
- private $ocsDiscoveryService;
-
- /** @var ILogger */
- private $logger;
+ protected bool $retainJob = false;
- /** @var bool */
- protected $retainJob = false;
+ private string $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret';
- private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret';
+ /** @var int 30 day = 2592000sec */
+ private int $maxLifespan = 2592000;
- /** @var int 30 day = 2592000sec */
- private $maxLifespan = 2592000;
-
- /**
- * RequestSharedSecret constructor.
- *
- * @param IClientService $httpClientService
- * @param IURLGenerator $urlGenerator
- * @param IJobList $jobList
- * @param TrustedServers $trustedServers
- * @param IDiscoveryService $ocsDiscoveryService
- * @param ILogger $logger
- * @param ITimeFactory $timeFactory
- */
public function __construct(
IClientService $httpClientService,
- IURLGenerator $urlGenerator,
- IJobList $jobList,
- TrustedServers $trustedServers,
- IDiscoveryService $ocsDiscoveryService,
- ILogger $logger,
- ITimeFactory $timeFactory
+ private IURLGenerator $urlGenerator,
+ private IJobList $jobList,
+ private TrustedServers $trustedServers,
+ private IDiscoveryService $ocsDiscoveryService,
+ private LoggerInterface $logger,
+ ITimeFactory $timeFactory,
) {
parent::__construct($timeFactory);
$this->httpClient = $httpClientService->newClient();
- $this->jobList = $jobList;
- $this->urlGenerator = $urlGenerator;
- $this->logger = $logger;
- $this->ocsDiscoveryService = $ocsDiscoveryService;
- $this->trustedServers = $trustedServers;
}
/**
* run the job, then remove it from the joblist
- *
- * @param IJobList $jobList
- * @param ILogger|null $logger
*/
- public function execute(IJobList $jobList, ILogger $logger = null) {
+ public function start(IJobList $jobList): void {
$target = $this->argument['url'];
// only execute if target is still in the list of trusted domains
if ($this->trustedServers->isTrustedServer($target)) {
- $this->parentExecute($jobList, $logger);
+ $this->parentStart($jobList);
}
$jobList->remove($this, $this->argument);
@@ -127,15 +94,17 @@ class RequestSharedSecret extends Job {
}
/**
- * call execute() method of parent
- *
- * @param IJobList $jobList
- * @param ILogger $logger
+ * Call start() method of parent
+ * Useful for unit tests
*/
- protected function parentExecute($jobList, $logger) {
- parent::execute($jobList, $logger);
+ protected function parentStart(IJobList $jobList): void {
+ parent::start($jobList);
}
+ /**
+ * @param array $argument
+ * @return void
+ */
protected function run($argument) {
$target = $argument['url'];
$created = isset($argument['created']) ? (int)$argument['created'] : $this->time->getTime();
@@ -185,7 +154,7 @@ class RequestSharedSecret extends Job {
$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
} catch (\Throwable $e) {
$status = Http::STATUS_INTERNAL_SERVER_ERROR;
- $this->logger->logException($e, ['app' => 'federation']);
+ $this->logger->error($e->getMessage(), ['app' => 'federation', 'exception' => $e]);
}
// if we received a unexpected response we try again later
@@ -199,10 +168,8 @@ class RequestSharedSecret extends Job {
/**
* re-add background job
- *
- * @param array $argument
*/
- protected function reAddJob(array $argument) {
+ protected function reAddJob(array $argument): void {
$url = $argument['url'];
$created = isset($argument['created']) ? (int)$argument['created'] : $this->time->getTime();
$token = $argument['token'];
diff --git a/apps/federation/tests/BackgroundJob/RequestSharedSecretTest.php b/apps/federation/tests/BackgroundJob/RequestSharedSecretTest.php
index d013ad221bc..5aca6005f94 100644
--- a/apps/federation/tests/BackgroundJob/RequestSharedSecretTest.php
+++ b/apps/federation/tests/BackgroundJob/RequestSharedSecretTest.php
@@ -34,38 +34,38 @@ use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\IResponse;
-use OCP\ILogger;
use OCP\IURLGenerator;
use OCP\OCS\IDiscoveryService;
+use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
use Test\TestCase;
class RequestSharedSecretTest extends TestCase {
-
- /** @var \PHPUnit\Framework\MockObject\MockObject|IClientService */
+ /** @var MockObject|IClientService */
private $httpClientService;
- /** @var \PHPUnit\Framework\MockObject\MockObject|IClient */
+ /** @var MockObject|IClient */
private $httpClient;
- /** @var \PHPUnit\Framework\MockObject\MockObject|IJobList */
+ /** @var MockObject|IJobList */
private $jobList;
- /** @var \PHPUnit\Framework\MockObject\MockObject|IURLGenerator */
+ /** @var MockObject|IURLGenerator */
private $urlGenerator;
- /** @var \PHPUnit\Framework\MockObject\MockObject|TrustedServers */
+ /** @var MockObject|TrustedServers */
private $trustedServers;
- /** @var \PHPUnit\Framework\MockObject\MockObject|IResponse */
+ /** @var MockObject|IResponse */
private $response;
- /** @var \PHPUnit\Framework\MockObject\MockObject|IDiscoveryService */
+ /** @var MockObject|IDiscoveryService */
private $discoveryService;
- /** @var \PHPUnit\Framework\MockObject\MockObject|ILogger */
+ /** @var MockObject|LoggerInterface */
private $logger;
- /** @var \PHPUnit\Framework\MockObject\MockObject|ITimeFactory */
+ /** @var MockObject|ITimeFactory */
private $timeFactory;
/** @var RequestSharedSecret */
@@ -82,7 +82,7 @@ class RequestSharedSecretTest extends TestCase {
->disableOriginalConstructor()->getMock();
$this->response = $this->getMockBuilder(IResponse::class)->getMock();
$this->discoveryService = $this->getMockBuilder(IDiscoveryService::class)->getMock();
- $this->logger = $this->createMock(ILogger::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
$this->timeFactory = $this->createMock(ITimeFactory::class);
$this->discoveryService->expects($this->any())->method('discover')->willReturn([]);
@@ -100,13 +100,13 @@ class RequestSharedSecretTest extends TestCase {
}
/**
- * @dataProvider dataTestExecute
+ * @dataProvider dataTestStart
*
* @param bool $isTrustedServer
* @param bool $retainBackgroundJob
*/
- public function testExecute($isTrustedServer, $retainBackgroundJob) {
- /** @var RequestSharedSecret |\PHPUnit\Framework\MockObject\MockObject $requestSharedSecret */
+ public function testStart($isTrustedServer, $retainBackgroundJob) {
+ /** @var RequestSharedSecret |MockObject $requestSharedSecret */
$requestSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\RequestSharedSecret')
->setConstructorArgs(
[
@@ -118,15 +118,15 @@ class RequestSharedSecretTest extends TestCase {
$this->logger,
$this->timeFactory
]
- )->setMethods(['parentExecute'])->getMock();
+ )->setMethods(['parentStart'])->getMock();
$this->invokePrivate($requestSharedSecret, 'argument', [['url' => 'url', 'token' => 'token']]);
$this->trustedServers->expects($this->once())->method('isTrustedServer')
->with('url')->willReturn($isTrustedServer);
if ($isTrustedServer) {
- $requestSharedSecret->expects($this->once())->method('parentExecute');
+ $requestSharedSecret->expects($this->once())->method('parentStart');
} else {
- $requestSharedSecret->expects($this->never())->method('parentExecute');
+ $requestSharedSecret->expects($this->never())->method('parentStart');
}
$this->invokePrivate($requestSharedSecret, 'retainJob', [$retainBackgroundJob]);
$this->jobList->expects($this->once())->method('remove');
@@ -148,10 +148,10 @@ class RequestSharedSecretTest extends TestCase {
$this->jobList->expects($this->never())->method('add');
}
- $requestSharedSecret->execute($this->jobList);
+ $requestSharedSecret->start($this->jobList);
}
- public function dataTestExecute() {
+ public function dataTestStart() {
return [
[true, true],
[true, false],
diff --git a/apps/files/composer/composer/ClassLoader.php b/apps/files/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/files/composer/composer/ClassLoader.php
+++ b/apps/files/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/files/composer/composer/installed.php b/apps/files/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/files/composer/composer/installed.php
+++ b/apps/files/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 7e3a0b9f40b..e7994291f38 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -597,8 +597,8 @@
Object.values = objectValues;
}
- var menuActions = Object.values(this.actions.all).filter(function (action) {
- return action.type !== OCA.Files.FileActions.TYPE_INLINE;
+ var menuActions = Object.values(actions).filter(function (action) {
+ return action.type !== OCA.Files.FileActions.TYPE_INLINE && (!defaultAction || action.name !== defaultAction.name)
});
// do not render the menu if nothing is in it
if (menuActions.length > 0) {
diff --git a/apps/files/lib/Capabilities.php b/apps/files/lib/Capabilities.php
index 3eb43578351..5cb976a47be 100644
--- a/apps/files/lib/Capabilities.php
+++ b/apps/files/lib/Capabilities.php
@@ -38,8 +38,6 @@ class Capabilities implements ICapability {
/**
* Return this classes capabilities
- *
- * @return array
*/
public function getCapabilities() {
return [
diff --git a/apps/files/src/models/Tab.js b/apps/files/src/models/Tab.js
index 63d1ad97ff6..f688fe9e007 100644
--- a/apps/files/src/models/Tab.js
+++ b/apps/files/src/models/Tab.js
@@ -28,6 +28,7 @@ export default class Tab {
_icon
_iconSvgSanitized
_mount
+ _setIsActive
_update
_destroy
_enabled
@@ -42,12 +43,13 @@ export default class Tab {
* @param {?string} options.icon the icon css class
* @param {?string} options.iconSvg the icon in svg format
* @param {Function} options.mount function to mount the tab
+ * @param {Function} [options.setIsActive] function to forward the active state of the tab
* @param {Function} options.update function to update the tab
* @param {Function} options.destroy function to destroy the tab
* @param {Function} [options.enabled] define conditions whether this tab is active. Must returns a boolean
* @param {Function} [options.scrollBottomReached] executed when the tab is scrolled to the bottom
*/
- constructor({ id, name, icon, iconSvg, mount, update, destroy, enabled, scrollBottomReached } = {}) {
+ constructor({ id, name, icon, iconSvg, mount, setIsActive, update, destroy, enabled, scrollBottomReached } = {}) {
if (enabled === undefined) {
enabled = () => true
}
@@ -68,6 +70,9 @@ export default class Tab {
if (typeof mount !== 'function') {
throw new Error('The mount argument should be a function')
}
+ if (setIsActive !== undefined && typeof setIsActive !== 'function') {
+ throw new Error('The setIsActive argument should be a function')
+ }
if (typeof update !== 'function') {
throw new Error('The update argument should be a function')
}
@@ -85,6 +90,7 @@ export default class Tab {
this._name = name
this._icon = icon
this._mount = mount
+ this._setIsActive = setIsActive
this._update = update
this._destroy = destroy
this._enabled = enabled
@@ -119,6 +125,10 @@ export default class Tab {
return this._mount
}
+ get setIsActive() {
+ return this._setIsActive || (() => undefined)
+ }
+
get update() {
return this._update
}
diff --git a/apps/files/src/views/Sidebar.vue b/apps/files/src/views/Sidebar.vue
index 915c8765b6c..ff6e1a52b43 100644
--- a/apps/files/src/views/Sidebar.vue
+++ b/apps/files/src/views/Sidebar.vue
@@ -366,6 +366,7 @@ export default {
*/
setActiveTab(id) {
OCA.Files.Sidebar.setActiveTab(id)
+ this.tabs.forEach(tab => tab.setIsActive(id === tab.id))
},
/**
@@ -453,6 +454,7 @@ export default {
if (this.$refs.tabs) {
this.$refs.tabs.updateTabs()
}
+ this.setActiveTab(this.Sidebar.activeTab || this.tabs[0].id)
})
} catch (error) {
this.error = t('files', 'Error while loading the file data')
diff --git a/apps/files_external/composer/composer/ClassLoader.php b/apps/files_external/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/files_external/composer/composer/ClassLoader.php
+++ b/apps/files_external/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/files_external/composer/composer/installed.php b/apps/files_external/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/files_external/composer/composer/installed.php
+++ b/apps/files_external/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/files_sharing/composer/composer/ClassLoader.php b/apps/files_sharing/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/files_sharing/composer/composer/ClassLoader.php
+++ b/apps/files_sharing/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/files_sharing/composer/composer/installed.php b/apps/files_sharing/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/files_sharing/composer/composer/installed.php
+++ b/apps/files_sharing/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/files_sharing/l10n/et_EE.js b/apps/files_sharing/l10n/et_EE.js
index ab13e879b20..e87e2dea408 100644
--- a/apps/files_sharing/l10n/et_EE.js
+++ b/apps/files_sharing/l10n/et_EE.js
@@ -145,6 +145,7 @@ OC.L10N.register(
"Expiration date (enforced)" : "Aegumise kuupäev (jõustatud)",
"Cancel" : "Loobu",
"Password protect" : "Parooliga kaitsmine",
+ "Add another link" : "Lisa veel üks link",
"Share link" : "Jaga link",
"No recommendations. Start typing." : "Soovitusi pole. Alusta trükkimist.",
"Resharing is not allowed" : "Edasijagamine pole lubatud",
diff --git a/apps/files_sharing/l10n/et_EE.json b/apps/files_sharing/l10n/et_EE.json
index 7aae4abfb89..6b4f7771a44 100644
--- a/apps/files_sharing/l10n/et_EE.json
+++ b/apps/files_sharing/l10n/et_EE.json
@@ -143,6 +143,7 @@
"Expiration date (enforced)" : "Aegumise kuupäev (jõustatud)",
"Cancel" : "Loobu",
"Password protect" : "Parooliga kaitsmine",
+ "Add another link" : "Lisa veel üks link",
"Share link" : "Jaga link",
"No recommendations. Start typing." : "Soovitusi pole. Alusta trükkimist.",
"Resharing is not allowed" : "Edasijagamine pole lubatud",
diff --git a/apps/files_sharing/l10n/gl.js b/apps/files_sharing/l10n/gl.js
index eb2725ab126..b06df80df58 100644
--- a/apps/files_sharing/l10n/gl.js
+++ b/apps/files_sharing/l10n/gl.js
@@ -244,7 +244,7 @@ OC.L10N.register(
"Error updating the share" : "Produciuse un erro ao actualizar a compartición",
"File \"{path}\" has been unshared" : "Foi retirado o ficheiro compartido «{path}».",
"Folder \"{path}\" has been unshared" : "Foi retirado o cartafol compartido «{path}».",
- "Share {propertyName} saved" : "Recurso compartido {propertyName} gardado",
+ "Share {propertyName} saved" : "{propertyName} do recurso compartido foi gardado",
"Shared" : "Compartido",
"Share" : "Compartir",
"Shared with" : "Compartido con",
diff --git a/apps/files_sharing/l10n/gl.json b/apps/files_sharing/l10n/gl.json
index 5b1a7b8ae2b..14cc9fd8afc 100644
--- a/apps/files_sharing/l10n/gl.json
+++ b/apps/files_sharing/l10n/gl.json
@@ -242,7 +242,7 @@
"Error updating the share" : "Produciuse un erro ao actualizar a compartición",
"File \"{path}\" has been unshared" : "Foi retirado o ficheiro compartido «{path}».",
"Folder \"{path}\" has been unshared" : "Foi retirado o cartafol compartido «{path}».",
- "Share {propertyName} saved" : "Recurso compartido {propertyName} gardado",
+ "Share {propertyName} saved" : "{propertyName} do recurso compartido foi gardado",
"Shared" : "Compartido",
"Share" : "Compartir",
"Shared with" : "Compartido con",
diff --git a/apps/files_sharing/l10n/sl.js b/apps/files_sharing/l10n/sl.js
index 430745d313b..1ceddfacccc 100644
--- a/apps/files_sharing/l10n/sl.js
+++ b/apps/files_sharing/l10n/sl.js
@@ -141,6 +141,7 @@ OC.L10N.register(
"Sharing" : "Souporaba",
"Accept user and group shares by default" : "Privzeto sprejmi uporabniško in skupinsko souporabo predmetov",
"Error while toggling options" : "Prišlo je do napake med preklapljanjem možnosti",
+ "Set default folder for accepted shares" : "Izbor privzete mape za sprejemanje map v souporabi",
"Reset" : "Ponastavi",
"Reset folder to system default" : "Ponastavi mapo na privzete sistemske vrednosti",
"Choose a default folder for accepted shares" : "Izbor privzete mape za sprejemanje map v souporabi",
diff --git a/apps/files_sharing/l10n/sl.json b/apps/files_sharing/l10n/sl.json
index 5c3f6c59c77..afc6739635b 100644
--- a/apps/files_sharing/l10n/sl.json
+++ b/apps/files_sharing/l10n/sl.json
@@ -139,6 +139,7 @@
"Sharing" : "Souporaba",
"Accept user and group shares by default" : "Privzeto sprejmi uporabniško in skupinsko souporabo predmetov",
"Error while toggling options" : "Prišlo je do napake med preklapljanjem možnosti",
+ "Set default folder for accepted shares" : "Izbor privzete mape za sprejemanje map v souporabi",
"Reset" : "Ponastavi",
"Reset folder to system default" : "Ponastavi mapo na privzete sistemske vrednosti",
"Choose a default folder for accepted shares" : "Izbor privzete mape za sprejemanje map v souporabi",
diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js
index 0e78998c0c2..292c5f22e56 100644
--- a/apps/files_sharing/l10n/uk.js
+++ b/apps/files_sharing/l10n/uk.js
@@ -49,12 +49,12 @@ OC.L10N.register(
"{email} downloaded {file}" : "{email} звантажено {file}",
"Shared with group {group}" : "Поділилися з групою {group}",
"Removed share for group {group}" : "Вилучено спільний доступ для групи {group}",
- "{actor} shared with group {group}" : "{actor} надано доступ групі {group}",
+ "{actor} shared with group {group}" : "{actor} надав(-ла) доступ групі {group}",
"{actor} removed share for group {group}" : "{actor} вилучив спільний доступ для групи {group}",
"Share for group {group} expired" : "Термін дії спільного доступу для групи {group} сплив",
"You shared {file} with group {group}" : "Ви поділилися {file} з групою {group}",
"You removed group {group} from {file}" : "Ви вилучили групу {group} з {file}",
- "{actor} shared {file} with group {group}" : "{actor} надано доступ до файлу {file} з групою {group}",
+ "{actor} shared {file} with group {group}" : "{actor} надав(-ла) доступ до файлу {file}, група {group}",
"{actor} removed group {group} from {file}" : "{actor} вилучив групи {group} з {file}",
"Share for file {file} with group {group} expired" : "Термін дії спільного доступу до файла {file} для групи {group} вичерпано",
"Shared as public link" : "Доступне за публічним посиланням",
@@ -66,7 +66,7 @@ OC.L10N.register(
"You shared {file} as public link" : "Ви поділилися {file} за допомогою публічного посилання",
"You removed public link for {file}" : "Ви вилучили публічне посилання для файла {file}",
"Public link expired for {file}" : "Термін дії посилання сплив для файла {file}",
- "{actor} shared {file} as public link" : "{actor} надано доступ до файлу {file} через публічне посилання",
+ "{actor} shared {file} as public link" : "{actor} надав(-ла) доступ до файлу {file} через публічне посилання",
"{actor} removed public link for {file}" : "{actor} вилучив публічне посилання для {file}",
"Public link of {actor} for {file} expired" : "Термін дії публічне посилання {actor} для {file} вичерпано",
"{user} accepted the remote share" : "{user} прийняв запит на віддалений спільний ресурс",
@@ -75,11 +75,11 @@ OC.L10N.register(
"{user} accepted the remote share of {file}" : "{user} прийняв запрошення на доступ до віддаленого спільного ресурсу {file}",
"{user} declined the remote share of {file}" : "{user} відхилив запрошення на доступ до віддаленого спільного ресурсу {file}",
"{user} unshared {file} from you" : "{user} закрив доступ для вас до {file}",
- "Shared with {user}" : "Надано доступ {user}",
+ "Shared with {user}" : "{user} надав(-ла) доступ",
"Removed share for {user}" : "Скасовано спільний доступ для {user}",
"You removed yourself" : "Ви вилучили себе з доступу",
"{actor} removed themselves" : "{actor} вийшов(-ла) з доступу",
- "{actor} shared with {user}" : "{actor} надано доступ {user}",
+ "{actor} shared with {user}" : "{actor} надав(-ла) доступ {user}",
"{actor} removed share for {user}" : "{actor} скасував спільний доступ для {user}",
"Shared by {actor}" : "Поділився {actor}",
"{actor} removed share" : "{actor} скасував спільний доступ",
@@ -89,7 +89,7 @@ OC.L10N.register(
"You removed {user} from {file}" : "Ви вилучили {user} з {file}",
"You removed yourself from {file}" : "Ви вийшли з доступу до {file}",
"{actor} removed themselves from {file}" : "{actor} вийшов(-ла) з доступу до {file}",
- "{actor} shared {file} with {user}" : "{actor} надано доступ {user} до файлу {file}",
+ "{actor} shared {file} with {user}" : "{actor} надав(-ла) доступ {user} до файлу {file}",
"{actor} removed {user} from {file}" : "{actor} вилучив {user} з {file}",
"{actor} shared {file} with you" : "{actor} поділив(ла)ся з вами доступом до спільного ресурсу {file}",
"{actor} removed you from the share named {file}" : "{actor} скасував вам доступ до спільного ресурсу {file}",
diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json
index 9fae670506d..f58ca122f50 100644
--- a/apps/files_sharing/l10n/uk.json
+++ b/apps/files_sharing/l10n/uk.json
@@ -47,12 +47,12 @@
"{email} downloaded {file}" : "{email} звантажено {file}",
"Shared with group {group}" : "Поділилися з групою {group}",
"Removed share for group {group}" : "Вилучено спільний доступ для групи {group}",
- "{actor} shared with group {group}" : "{actor} надано доступ групі {group}",
+ "{actor} shared with group {group}" : "{actor} надав(-ла) доступ групі {group}",
"{actor} removed share for group {group}" : "{actor} вилучив спільний доступ для групи {group}",
"Share for group {group} expired" : "Термін дії спільного доступу для групи {group} сплив",
"You shared {file} with group {group}" : "Ви поділилися {file} з групою {group}",
"You removed group {group} from {file}" : "Ви вилучили групу {group} з {file}",
- "{actor} shared {file} with group {group}" : "{actor} надано доступ до файлу {file} з групою {group}",
+ "{actor} shared {file} with group {group}" : "{actor} надав(-ла) доступ до файлу {file}, група {group}",
"{actor} removed group {group} from {file}" : "{actor} вилучив групи {group} з {file}",
"Share for file {file} with group {group} expired" : "Термін дії спільного доступу до файла {file} для групи {group} вичерпано",
"Shared as public link" : "Доступне за публічним посиланням",
@@ -64,7 +64,7 @@
"You shared {file} as public link" : "Ви поділилися {file} за допомогою публічного посилання",
"You removed public link for {file}" : "Ви вилучили публічне посилання для файла {file}",
"Public link expired for {file}" : "Термін дії посилання сплив для файла {file}",
- "{actor} shared {file} as public link" : "{actor} надано доступ до файлу {file} через публічне посилання",
+ "{actor} shared {file} as public link" : "{actor} надав(-ла) доступ до файлу {file} через публічне посилання",
"{actor} removed public link for {file}" : "{actor} вилучив публічне посилання для {file}",
"Public link of {actor} for {file} expired" : "Термін дії публічне посилання {actor} для {file} вичерпано",
"{user} accepted the remote share" : "{user} прийняв запит на віддалений спільний ресурс",
@@ -73,11 +73,11 @@
"{user} accepted the remote share of {file}" : "{user} прийняв запрошення на доступ до віддаленого спільного ресурсу {file}",
"{user} declined the remote share of {file}" : "{user} відхилив запрошення на доступ до віддаленого спільного ресурсу {file}",
"{user} unshared {file} from you" : "{user} закрив доступ для вас до {file}",
- "Shared with {user}" : "Надано доступ {user}",
+ "Shared with {user}" : "{user} надав(-ла) доступ",
"Removed share for {user}" : "Скасовано спільний доступ для {user}",
"You removed yourself" : "Ви вилучили себе з доступу",
"{actor} removed themselves" : "{actor} вийшов(-ла) з доступу",
- "{actor} shared with {user}" : "{actor} надано доступ {user}",
+ "{actor} shared with {user}" : "{actor} надав(-ла) доступ {user}",
"{actor} removed share for {user}" : "{actor} скасував спільний доступ для {user}",
"Shared by {actor}" : "Поділився {actor}",
"{actor} removed share" : "{actor} скасував спільний доступ",
@@ -87,7 +87,7 @@
"You removed {user} from {file}" : "Ви вилучили {user} з {file}",
"You removed yourself from {file}" : "Ви вийшли з доступу до {file}",
"{actor} removed themselves from {file}" : "{actor} вийшов(-ла) з доступу до {file}",
- "{actor} shared {file} with {user}" : "{actor} надано доступ {user} до файлу {file}",
+ "{actor} shared {file} with {user}" : "{actor} надав(-ла) доступ {user} до файлу {file}",
"{actor} removed {user} from {file}" : "{actor} вилучив {user} з {file}",
"{actor} shared {file} with you" : "{actor} поділив(ла)ся з вами доступом до спільного ресурсу {file}",
"{actor} removed you from the share named {file}" : "{actor} скасував вам доступ до спільного ресурсу {file}",
diff --git a/apps/files_sharing/lib/Activity/Providers/Base.php b/apps/files_sharing/lib/Activity/Providers/Base.php
index 4a2c6ac919e..e9e1d870f9a 100644
--- a/apps/files_sharing/lib/Activity/Providers/Base.php
+++ b/apps/files_sharing/lib/Activity/Providers/Base.php
@@ -157,9 +157,11 @@ abstract class Base implements IProvider {
/**
* @param string $uid
+ * @param string $overwriteDisplayName - overwrite display name, only if user is not local
+ *
* @return array
*/
- protected function getUser($uid) {
+ protected function getUser(string $uid, string $overwriteDisplayName = '') {
// First try local user
$displayName = $this->userManager->getDisplayName($uid);
if ($displayName !== null) {
@@ -176,7 +178,7 @@ abstract class Base implements IProvider {
return [
'type' => 'user',
'id' => $cloudId->getUser(),
- 'name' => $this->getDisplayNameFromAddressBook($cloudId->getDisplayId()),
+ 'name' => (($overwriteDisplayName !== '') ? $overwriteDisplayName : $this->getDisplayNameFromAddressBook($cloudId->getDisplayId())),
'server' => $cloudId->getRemote(),
];
}
@@ -185,7 +187,7 @@ abstract class Base implements IProvider {
return [
'type' => 'user',
'id' => $uid,
- 'name' => $uid,
+ 'name' => (($overwriteDisplayName !== '') ? $overwriteDisplayName : $uid),
];
}
diff --git a/apps/files_sharing/lib/Activity/Providers/RemoteShares.php b/apps/files_sharing/lib/Activity/Providers/RemoteShares.php
index f1cc90f5e65..e24645f8a26 100644
--- a/apps/files_sharing/lib/Activity/Providers/RemoteShares.php
+++ b/apps/files_sharing/lib/Activity/Providers/RemoteShares.php
@@ -115,13 +115,14 @@ class RemoteShares extends Base {
switch ($subject) {
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
case self::SUBJECT_REMOTE_SHARE_UNSHARED:
+ $displayName = (count($parameters) > 2) ? $parameters[2] : '';
return [
'file' => [
'type' => 'pending-federated-share',
'id' => $parameters[1],
'name' => $parameters[1],
],
- 'user' => $this->getUser($parameters[0]),
+ 'user' => $this->getUser($parameters[0], $displayName)
];
case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
case self::SUBJECT_REMOTE_SHARE_DECLINED:
diff --git a/apps/files_sharing/lib/Capabilities.php b/apps/files_sharing/lib/Capabilities.php
index 58104864631..8b1160aeb63 100644
--- a/apps/files_sharing/lib/Capabilities.php
+++ b/apps/files_sharing/lib/Capabilities.php
@@ -50,8 +50,6 @@ class Capabilities implements ICapability {
/**
* Return this classes capabilities
- *
- * @return array
*/
public function getCapabilities() {
$res = [];
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index e9f0c465f36..e2fb950dceb 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -44,12 +44,13 @@ declare(strict_types=1);
*/
namespace OCA\Files_Sharing\Controller;
+use Exception;
use OC\Files\FileInfo;
use OC\Files\Storage\Wrapper\Wrapper;
+use OCA\Files\Helper;
use OCA\Files_Sharing\Exceptions\SharingRightsException;
use OCA\Files_Sharing\External\Storage;
use OCA\Files_Sharing\SharedStorage;
-use OCA\Files\Helper;
use OCP\App\IAppManager;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSBadRequestException;
@@ -59,9 +60,9 @@ use OCP\AppFramework\OCS\OCSNotFoundException;
use OCP\AppFramework\OCSController;
use OCP\AppFramework\QueryException;
use OCP\Constants;
+use OCP\Files\Folder;
use OCP\Files\InvalidPathException;
use OCP\Files\IRootFolder;
-use OCP\Files\Folder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IConfig;
@@ -74,12 +75,14 @@ use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
-use OCP\Share;
+use OCP\Server;
use OCP\Share\Exceptions\GenericShareException;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
use OCP\Share\IShare;
use OCP\UserStatus\IManager as IUserStatusManager;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Log\LoggerInterface;
/**
* Class Share20OCS
@@ -274,7 +277,11 @@ class ShareAPIController extends OCSController {
$result['token'] = $share->getToken();
$result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]);
- } elseif ($share->getShareType() === IShare::TYPE_REMOTE || $share->getShareType() === IShare::TYPE_REMOTE_GROUP) {
+ } elseif ($share->getShareType() === IShare::TYPE_REMOTE) {
+ $result['share_with'] = $share->getSharedWith();
+ $result['share_with_displayname'] = $this->getCachedFederatedDisplayName($share->getSharedWith());
+ $result['token'] = $share->getToken();
+ } elseif ($share->getShareType() === IShare::TYPE_REMOTE_GROUP) {
$result['share_with'] = $share->getSharedWith();
$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'CLOUD');
$result['token'] = $share->getToken();
@@ -344,7 +351,7 @@ class ShareAPIController extends OCSController {
/**
* Check if one of the users address books knows the exact property, if
- * yes we return the full name.
+ * not we return the full name.
*
* @param string $query
* @param string $property
@@ -352,11 +359,20 @@ class ShareAPIController extends OCSController {
*/
private function getDisplayNameFromAddressBook(string $query, string $property): string {
// FIXME: If we inject the contacts manager it gets initialized before any address books are registered
- $result = \OC::$server->getContactsManager()->search($query, [$property], [
- 'limit' => 1,
- 'enumeration' => false,
- 'strict_search' => true,
- ]);
+ try {
+ $result = \OC::$server->getContactsManager()->search($query, [$property], [
+ 'limit' => 1,
+ 'enumeration' => false,
+ 'strict_search' => true,
+ ]);
+ } catch (Exception $e) {
+ Server::get(LoggerInterface::class)->error(
+ $e->getMessage(),
+ ['exception' => $e]
+ );
+ return $query;
+ }
+
foreach ($result as $r) {
foreach ($r[$property] as $value) {
if ($value === $query && $r['FN']) {
@@ -368,6 +384,102 @@ class ShareAPIController extends OCSController {
return $query;
}
+
+ /**
+ * @param array $shares
+ * @param array|null $updatedDisplayName
+ *
+ * @return array
+ */
+ private function fixMissingDisplayName(array $shares, ?array $updatedDisplayName = null): array {
+ $userIds = $updated = [];
+ foreach ($shares as $share) {
+ // share is federated and share have no display name yet
+ if ($share['share_type'] === IShare::TYPE_REMOTE
+ && ($share['share_with'] ?? '') !== ''
+ && ($share['share_with_displayname'] ?? '') === '') {
+ $userIds[] = $userId = $share['share_with'];
+
+ if ($updatedDisplayName !== null && array_key_exists($userId, $updatedDisplayName)) {
+ $share['share_with_displayname'] = $updatedDisplayName[$userId];
+ }
+ }
+
+ // prepping userIds with displayName to be updated
+ $updated[] = $share;
+ }
+
+ // if $updatedDisplayName is not null, it means we should have already fixed displayNames of the shares
+ if ($updatedDisplayName !== null) {
+ return $updated;
+ }
+
+ // get displayName for the generated list of userId with no displayName
+ $displayNames = $this->retrieveFederatedDisplayName($userIds);
+
+ // if no displayName are updated, we exit
+ if (empty($displayNames)) {
+ return $updated;
+ }
+
+ // let's fix missing display name and returns all shares
+ return $this->fixMissingDisplayName($shares, $displayNames);
+ }
+
+
+ /**
+ * get displayName of a list of userIds from the lookup-server; through the globalsiteselector app.
+ * returns an array with userIds as keys and displayName as values.
+ *
+ * @param array $userIds
+ * @param bool $cacheOnly - do not reach LUS, get data from cache.
+ *
+ * @return array
+ * @throws ContainerExceptionInterface
+ */
+ private function retrieveFederatedDisplayName(array $userIds, bool $cacheOnly = false): array {
+ // check if gss is enabled and available
+ if (count($userIds) === 0
+ || !$this->appManager->isInstalled('globalsiteselector')
+ || !class_exists('\OCA\GlobalSiteSelector\Service\SlaveService')) {
+ return [];
+ }
+
+ try {
+ $slaveService = Server::get(\OCA\GlobalSiteSelector\Service\SlaveService::class);
+ } catch (\Throwable $e) {
+ Server::get(LoggerInterface::class)->error(
+ $e->getMessage(),
+ ['exception' => $e]
+ );
+ return [];
+ }
+
+ return $slaveService->getUsersDisplayName($userIds, $cacheOnly);
+ }
+
+
+ /**
+ * retrieve displayName from cache if available (should be used on federated shares)
+ * if not available in cache/lus, try for get from address-book, else returns empty string.
+ *
+ * @param string $userId
+ * @param bool $cacheOnly if true will not reach the lus but will only get data from cache
+ *
+ * @return string
+ */
+ private function getCachedFederatedDisplayName(string $userId, bool $cacheOnly = true): string {
+ $details = $this->retrieveFederatedDisplayName([$userId], $cacheOnly);
+ if (array_key_exists($userId, $details)) {
+ return $details[$userId];
+ }
+
+ $displayName = $this->getDisplayNameFromAddressBook($userId, 'CLOUD');
+ return ($displayName === $userId) ? '' : $displayName;
+ }
+
+
+
/**
* Get a specific share by id
*
@@ -646,6 +758,8 @@ class ShareAPIController extends OCSController {
throw new OCSNotFoundException($this->l->t('Invalid date, date format must be YYYY-MM-DD'));
}
}
+
+ $share->setSharedWithDisplayName($this->getCachedFederatedDisplayName($shareWith, false));
} elseif ($shareType === IShare::TYPE_REMOTE_GROUP) {
if (!$this->shareManager->outgoingServer2ServerGroupSharesAllowed()) {
throw new OCSForbiddenException($this->l->t('Sharing %1$s failed because the back end does not allow shares from type %2$s', [$node->getPath(), $shareType]));
@@ -793,7 +907,6 @@ class ShareAPIController extends OCSController {
// filter out duplicate shares
$known = [];
-
$formatted = $miniFormatted = [];
$resharingRight = false;
$known = [];
@@ -957,6 +1070,9 @@ class ShareAPIController extends OCSController {
$formatted = $miniFormatted;
}
+ // fix eventual missing display name from federated shares
+ $formatted = $this->fixMissingDisplayName($formatted);
+
if ($includeTags) {
$formatted =
Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager());
diff --git a/apps/files_sharing/src/collaborationresources.js b/apps/files_sharing/src/collaborationresources.js
deleted file mode 100644
index 0175993a2f1..00000000000
--- a/apps/files_sharing/src/collaborationresources.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * 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
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import Vue from 'vue'
-import Vuex from 'vuex'
-import NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu.js'
-import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip.js'
-import ClickOutside from 'vue-click-outside'
-
-import View from './views/CollaborationView.vue'
-
-Vue.prototype.t = t
-Tooltip.options.defaultHtml = false
-
-// eslint-disable-next-line vue/match-component-file-name
-Vue.component('NcPopoverMenu', NcPopoverMenu)
-Vue.directive('ClickOutside', ClickOutside)
-Vue.directive('Tooltip', Tooltip)
-Vue.use(Vuex)
-
-export {
- Vue,
- View,
-}
diff --git a/apps/files_trashbin/composer/composer/ClassLoader.php b/apps/files_trashbin/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/files_trashbin/composer/composer/ClassLoader.php
+++ b/apps/files_trashbin/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/files_trashbin/composer/composer/installed.php b/apps/files_trashbin/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/files_trashbin/composer/composer/installed.php
+++ b/apps/files_trashbin/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/files_trashbin/lib/Capabilities.php b/apps/files_trashbin/lib/Capabilities.php
index 28acf0c8d27..c0788ff7308 100644
--- a/apps/files_trashbin/lib/Capabilities.php
+++ b/apps/files_trashbin/lib/Capabilities.php
@@ -33,8 +33,6 @@ class Capabilities implements ICapability {
/**
* Return this classes capabilities
- *
- * @return array
*/
public function getCapabilities() {
return [
diff --git a/apps/files_versions/composer/composer/ClassLoader.php b/apps/files_versions/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/files_versions/composer/composer/ClassLoader.php
+++ b/apps/files_versions/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/files_versions/composer/composer/installed.php b/apps/files_versions/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/files_versions/composer/composer/installed.php
+++ b/apps/files_versions/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/files_versions/lib/Capabilities.php b/apps/files_versions/lib/Capabilities.php
index afc6fa39da7..6439c18772b 100644
--- a/apps/files_versions/lib/Capabilities.php
+++ b/apps/files_versions/lib/Capabilities.php
@@ -42,8 +42,6 @@ class Capabilities implements ICapability {
/**
* Return this classes capabilities
- *
- * @return array
*/
public function getCapabilities() {
$groupFolderInstalled = $this->appManager->isInstalled('groupfolders');
diff --git a/apps/files_versions/lib/Sabre/Plugin.php b/apps/files_versions/lib/Sabre/Plugin.php
index 4fd17194ba6..5aa64c812c6 100644
--- a/apps/files_versions/lib/Sabre/Plugin.php
+++ b/apps/files_versions/lib/Sabre/Plugin.php
@@ -27,6 +27,8 @@ declare(strict_types=1);
namespace OCA\Files_Versions\Sabre;
use OC\AppFramework\Http\Request;
+use OCA\DAV\Connector\Sabre\FilesPlugin;
+use OCP\IPreview;
use OCP\IRequest;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\INode;
@@ -39,12 +41,12 @@ use Sabre\HTTP\ResponseInterface;
class Plugin extends ServerPlugin {
private Server $server;
- private IRequest $request;
public const VERSION_LABEL = '{http://nextcloud.org/ns}version-label';
public function __construct(
- IRequest $request
+ private IRequest $request,
+ private IPreview $previewManager,
) {
$this->request = $request;
}
@@ -91,6 +93,7 @@ class Plugin extends ServerPlugin {
public function propFind(PropFind $propFind, INode $node): void {
if ($node instanceof VersionFile) {
$propFind->handle(self::VERSION_LABEL, fn() => $node->getLabel());
+ $propFind->handle(FilesPlugin::HAS_PREVIEW_PROPERTYNAME, fn () => $this->previewManager->isMimeSupported($node->getContentType()));
}
}
diff --git a/apps/files_versions/lib/Sabre/VersionFile.php b/apps/files_versions/lib/Sabre/VersionFile.php
index 8fd97b0636f..a03ecd64b46 100644
--- a/apps/files_versions/lib/Sabre/VersionFile.php
+++ b/apps/files_versions/lib/Sabre/VersionFile.php
@@ -31,6 +31,7 @@ use OCA\Files_Versions\Versions\INameableVersion;
use OCA\Files_Versions\Versions\INameableVersionBackend;
use OCA\Files_Versions\Versions\IVersion;
use OCA\Files_Versions\Versions\IVersionManager;
+use OCP\Files\FileInfo;
use OCP\Files\NotFoundException;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue
index def5abbcf48..ec03a1c2b31 100644
--- a/apps/files_versions/src/components/Version.vue
+++ b/apps/files_versions/src/components/Version.vue
@@ -23,11 +23,15 @@
:force-display-actions="true"
data-files-versions-version>
<template #icon>
- <img v-if="!previewError"
+ <div v-if="!(loadPreview || previewLoaded)" class="version__image" />
+ <img v-else-if="isCurrent || version.hasPreview"
:src="previewURL"
alt=""
+ decoding="async"
+ fetchpriority="low"
+ loading="lazy"
class="version__image"
- @error="previewError = true">
+ @load="previewLoaded = true">
<div v-else
class="version__image">
<ImageOffOutline :size="20" />
@@ -182,13 +186,17 @@ export default {
type: Boolean,
default: false,
},
+ loadPreview: {
+ type: Boolean,
+ default: false,
+ },
},
data() {
return {
+ previewLoaded: false,
showVersionLabelForm: false,
formVersionLabelValue: this.version.label,
capabilities: loadState('core', 'capabilities', { files: { version_labeling: false, version_deletion: false } }),
- previewError: false,
}
},
computed: {
diff --git a/apps/files_versions/src/files_versions_tab.js b/apps/files_versions/src/files_versions_tab.js
index 225add57252..8b816746401 100644
--- a/apps/files_versions/src/files_versions_tab.js
+++ b/apps/files_versions/src/files_versions_tab.js
@@ -59,6 +59,9 @@ window.addEventListener('DOMContentLoaded', function() {
update(fileInfo) {
TabInstance.update(fileInfo)
},
+ setIsActive(isActive) {
+ TabInstance.setIsActive(isActive)
+ },
destroy() {
TabInstance.$destroy()
TabInstance = null
diff --git a/apps/files_versions/src/utils/davRequest.js b/apps/files_versions/src/utils/davRequest.js
index fb2126d98bf..fec64caa2d5 100644
--- a/apps/files_versions/src/utils/davRequest.js
+++ b/apps/files_versions/src/utils/davRequest.js
@@ -30,5 +30,6 @@ export default `<?xml version="1.0"?>
<d:getcontenttype />
<d:getlastmodified />
<nc:version-label />
+ <nc:has-preview />
</d:prop>
</d:propfind>`
diff --git a/apps/files_versions/src/utils/versions.js b/apps/files_versions/src/utils/versions.js
index 1a5dde10824..71593dd0ce8 100644
--- a/apps/files_versions/src/utils/versions.js
+++ b/apps/files_versions/src/utils/versions.js
@@ -36,6 +36,7 @@ import moment from '@nextcloud/moment'
* @property {string} size - Human readable size
* @property {string} type - 'file'
* @property {number} mtime - Version creation date as a timestamp
+ * @property {boolean} hasPreview - Whether the version has a preview
* @property {string} preview - Preview URL of the version
* @property {string} url - Download URL of the version
* @property {string|null} fileVersion - The version id, null for the current version
@@ -98,6 +99,7 @@ function formatVersion(version, fileInfo) {
size: version.size,
type: version.type,
mtime: moment(version.lastmod).unix() * 1000,
+ hasPreview: version.props['has-preview'] === 1,
preview: generateUrl('/apps/files_versions/preview?file={file}&version={fileVersion}', {
file: joinPaths(fileInfo.path, fileInfo.name),
fileVersion: version.basename,
diff --git a/apps/files_versions/src/views/VersionTab.vue b/apps/files_versions/src/views/VersionTab.vue
index 04b6ecf1add..6d3b07c2f88 100644
--- a/apps/files_versions/src/views/VersionTab.vue
+++ b/apps/files_versions/src/views/VersionTab.vue
@@ -19,6 +19,7 @@
<ul data-files-versions-versions-list>
<Version v-for="version in orderedVersions"
:key="version.mtime"
+ :load-preview="isActive"
:version="version"
:file-info="fileInfo"
:is-current="version.mtime === fileInfo.mtime"
@@ -42,6 +43,7 @@ export default {
data() {
return {
fileInfo: null,
+ isActive: false,
/** @type {import('../utils/versions.js').Version[]} */
versions: [],
loading: false,
@@ -90,6 +92,13 @@ export default {
},
/**
+ * @param {boolean} isActive whether the tab is active
+ */
+ async setIsActive(isActive) {
+ this.isActive = isActive
+ },
+
+ /**
* Get the existing versions infos
*/
async fetchVersions() {
diff --git a/apps/lookup_server_connector/composer/composer/ClassLoader.php b/apps/lookup_server_connector/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/lookup_server_connector/composer/composer/ClassLoader.php
+++ b/apps/lookup_server_connector/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/lookup_server_connector/composer/composer/installed.php b/apps/lookup_server_connector/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/lookup_server_connector/composer/composer/installed.php
+++ b/apps/lookup_server_connector/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/oauth2/composer/composer/ClassLoader.php b/apps/oauth2/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/oauth2/composer/composer/ClassLoader.php
+++ b/apps/oauth2/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/oauth2/composer/composer/LICENSE b/apps/oauth2/composer/composer/LICENSE
index 62ecfd8d004..f27399a042d 100644
--- a/apps/oauth2/composer/composer/LICENSE
+++ b/apps/oauth2/composer/composer/LICENSE
@@ -1,3 +1,4 @@
+
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -17,3 +18,4 @@ 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/apps/oauth2/composer/composer/installed.php b/apps/oauth2/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/oauth2/composer/composer/installed.php
+++ b/apps/oauth2/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/provisioning_api/composer/composer/ClassLoader.php b/apps/provisioning_api/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/provisioning_api/composer/composer/ClassLoader.php
+++ b/apps/provisioning_api/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/provisioning_api/composer/composer/installed.php b/apps/provisioning_api/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/provisioning_api/composer/composer/installed.php
+++ b/apps/provisioning_api/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/provisioning_api/l10n/sl.js b/apps/provisioning_api/l10n/sl.js
index bd3e5387a9c..96bf5c7e3b2 100644
--- a/apps/provisioning_api/l10n/sl.js
+++ b/apps/provisioning_api/l10n/sl.js
@@ -5,8 +5,8 @@ OC.L10N.register(
"Email confirmation" : "Potrditev elektronskega naslova",
"Confirm" : "Potrdi",
"Email confirmation successful" : "Potrditev elektronskega naslov je uspela.",
- "Provisioning API" : "Vmesnik API za zagotavljanje povezovanja",
+ "Provisioning API" : "Vmesnik API za povezovanje",
"This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Program omogoča nastavitev vmesnikov API, ki jih zunanji sistemi lahko uporabijo za upravljanje uporabnikov, skupin in programov.",
- "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Program omogoča uporabo različnih vmesnikov, ki jih zunanji sistemi lahko uporabijo za ustvarjanje, urejanje, upravljanje in preverjanje\n\t\tatributov uporabnikov, poizvedb, upravljanje skupin, količinskih omejitev in nadzor na skupno uporabljenim prostorom v okolju. Skrbniki skupin\n\t\tlahko prav tako izvajajo dejavnosti za upravljanje skupin znotraj okolja. Vmesnik API omogoča\n\t\tsrbnikom pregled nad dejavnimi programi, podrobnostmi in upravljanje tudi na deljavo.\n\t\tKo je program enkrat omogočen, je mogoče pošiljati zahteve prek osnovnega postopka overjanja.\n\t\tVeč podrobnosti je na voljo v dokumentaciji za uporabo vmesnika, vključno s\n\t\tprimeri skicev in odzivov strežnika."
+ "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Program omogoča uporabo različnih vmesnikov, ki jih lahko zunanji sistemi uporabijo za ustvarjanje, urejanje, upravljanje in preverjanje\n\t\tatributov uporabnikov, poizvedb, upravljanje skupin, količinskih omejitev in nadzor na skupno uporabljenim prostorom v okolju. Skrbniki skupin\n\t\tlahko prav tako izvajajo dejavnosti za upravljanje skupin znotraj okolja. Vmesnik API omogoča\n\t\tskrbnikom pregled nad dejavnimi programi, podrobnostmi in upravljanje tudi na daljavo.\n\t\tKo je program enkrat zagnan, je mogoče pošiljati zahteve za izvajanje osnovnega postopka overjanja.\n\t\tVeč podrobnosti je na voljo v dokumentaciji za uporabo vmesnika, vključno s\n\t\tprimeri sklicev in odzivov strežnika."
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/provisioning_api/l10n/sl.json b/apps/provisioning_api/l10n/sl.json
index 0bba3949099..44572066c09 100644
--- a/apps/provisioning_api/l10n/sl.json
+++ b/apps/provisioning_api/l10n/sl.json
@@ -3,8 +3,8 @@
"Email confirmation" : "Potrditev elektronskega naslova",
"Confirm" : "Potrdi",
"Email confirmation successful" : "Potrditev elektronskega naslov je uspela.",
- "Provisioning API" : "Vmesnik API za zagotavljanje povezovanja",
+ "Provisioning API" : "Vmesnik API za povezovanje",
"This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Program omogoča nastavitev vmesnikov API, ki jih zunanji sistemi lahko uporabijo za upravljanje uporabnikov, skupin in programov.",
- "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Program omogoča uporabo različnih vmesnikov, ki jih zunanji sistemi lahko uporabijo za ustvarjanje, urejanje, upravljanje in preverjanje\n\t\tatributov uporabnikov, poizvedb, upravljanje skupin, količinskih omejitev in nadzor na skupno uporabljenim prostorom v okolju. Skrbniki skupin\n\t\tlahko prav tako izvajajo dejavnosti za upravljanje skupin znotraj okolja. Vmesnik API omogoča\n\t\tsrbnikom pregled nad dejavnimi programi, podrobnostmi in upravljanje tudi na deljavo.\n\t\tKo je program enkrat omogočen, je mogoče pošiljati zahteve prek osnovnega postopka overjanja.\n\t\tVeč podrobnosti je na voljo v dokumentaciji za uporabo vmesnika, vključno s\n\t\tprimeri skicev in odzivov strežnika."
+ "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Program omogoča uporabo različnih vmesnikov, ki jih lahko zunanji sistemi uporabijo za ustvarjanje, urejanje, upravljanje in preverjanje\n\t\tatributov uporabnikov, poizvedb, upravljanje skupin, količinskih omejitev in nadzor na skupno uporabljenim prostorom v okolju. Skrbniki skupin\n\t\tlahko prav tako izvajajo dejavnosti za upravljanje skupin znotraj okolja. Vmesnik API omogoča\n\t\tskrbnikom pregled nad dejavnimi programi, podrobnostmi in upravljanje tudi na daljavo.\n\t\tKo je program enkrat zagnan, je mogoče pošiljati zahteve za izvajanje osnovnega postopka overjanja.\n\t\tVeč podrobnosti je na voljo v dokumentaciji za uporabo vmesnika, vključno s\n\t\tprimeri sklicev in odzivov strežnika."
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/provisioning_api/lib/Capabilities.php b/apps/provisioning_api/lib/Capabilities.php
index 835bbfe9b5c..614c20e66a8 100644
--- a/apps/provisioning_api/lib/Capabilities.php
+++ b/apps/provisioning_api/lib/Capabilities.php
@@ -37,8 +37,6 @@ class Capabilities implements ICapability {
/**
* Function an app uses to return the capabilities
- *
- * @return array Array containing the apps capabilities
*/
public function getCapabilities() {
$federatedScopeEnabled = $this->appManager->isEnabledForUser('federation');
diff --git a/apps/settings/composer/composer/ClassLoader.php b/apps/settings/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/settings/composer/composer/ClassLoader.php
+++ b/apps/settings/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/settings/composer/composer/installed.php b/apps/settings/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/settings/composer/composer/installed.php
+++ b/apps/settings/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/settings/css/settings.css b/apps/settings/css/settings.css
index a06bfd7714d..f0f798de98e 100644
--- a/apps/settings/css/settings.css
+++ b/apps/settings/css/settings.css
@@ -1 +1 @@
-input#openid,input#webdav{width:20em}.clear{clear:both}.nav-icon-personal-settings{background-image:var(--icon-personal-dark)}.nav-icon-security{background-image:var(--icon-toggle-filelist-dark)}.nav-icon-clientsbox{background-image:var(--icon-change-dark)}.nav-icon-federated-cloud{background-image:var(--icon-share-dark)}.nav-icon-second-factor-backup-codes,.nav-icon-ssl-root-certificate{background-image:var(--icon-password-dark)}#personal-settings-avatar-container{display:inline-grid;grid-template-columns:1fr;grid-template-rows:2fr 1fr 2fr;vertical-align:top}.profile-settings-container{display:inline-grid;grid-template-columns:1fr 1fr 1fr}.personal-show-container{width:100%}.personal-settings-setting-box .section{padding:10px 30px}.personal-settings-setting-box .section .headerbar-label{margin-bottom:0}.personal-settings-setting-box .section input[type=text],.personal-settings-setting-box .section input[type=email],.personal-settings-setting-box .section input[type=tel],.personal-settings-setting-box .section input[type=url]{width:100%}.personal-settings-setting-box-profile{grid-row:3/5}.personal-settings-setting-box-detail{grid-row:5}.personal-settings-setting-box-detail--without-profile{grid-row:3}select#timezone{width:100%}#personal-settings{display:grid;padding:20px;max-width:1700px;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));grid-column-gap:10px}#personal-settings .section{padding:10px 10px;border:0}#personal-settings .section h2{margin-bottom:12px}#personal-settings .section h3>label{font-weight:bold}#personal-settings .personal-info{margin-right:10%;margin-bottom:12px;margin-top:12px}#personal-settings .personal-info[class^=icon-],#personal-settings .personal-info[class*=" icon-"]{background-position:0px 2px;padding-left:30px;opacity:.7}.development-notice{text-align:center}.development-notice a:not(.link-button){text-decoration:underline}.development-notice a:not(.link-button):hover{background-color:var(--color-primary-element-hover)}.link-button{display:inline-block;margin:16px;padding:14px 20px;background-color:var(--color-primary-element);color:#fff;border-radius:var(--border-radius-pill);border:1px solid var(--color-primary-element);box-shadow:0 2px 9px var(--color-box-shadow)}.link-button:active,.link-button:hover,.link-button:focus{color:var(--color-primary-element);background-color:var(--color-primary-element-text);border-color:var(--color-primary-element) !important}.link-button.icon-file{padding-left:48px;background-position:24px}.personal-settings-container{display:inline-grid;grid-template-columns:1fr 1fr 1fr}.personal-settings-container:after{clear:both}.personal-settings-container>div h3{position:relative;display:inline-flex;flex-wrap:nowrap;justify-content:flex-start;width:100%;align-items:center;gap:8px}.personal-settings-container>div h3>label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.personal-settings-container>div>form span[class^=icon-checkmark],.personal-settings-container>div>form span[class^=icon-error]{position:relative;right:8px;top:-28px;pointer-events:none;float:right}.personal-settings-container .verify{position:relative;left:100%;top:0;height:0}.personal-settings-container .verify img{padding:12px 7px 6px}.personal-settings-container .verify-action{cursor:pointer}.personal-settings-container input:disabled{background-color:#fff;color:#000;border:none;opacity:100}.verification-dialog{display:none;right:-9px;top:40px;width:275px}.verification-dialog p{padding:10px}.verification-dialog .verificationCode{font-family:monospace;display:block;overflow-wrap:break-word}.federation-menu{position:relative;cursor:pointer;width:44px;height:44px;padding:10px;margin:0;background:none;border:none}.federation-menu:hover,.federation-menu:focus{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill)}.federation-menu:hover .icon-federation-menu,.federation-menu:focus .icon-federation-menu{opacity:.8}.federation-menu .icon-federation-menu{padding-left:16px;background-size:16px;background-position:left center;opacity:.3;cursor:inherit}.federation-menu .icon-federation-menu .icon-triangle-s{display:inline-block;vertical-align:middle;cursor:inherit}.federation-menu .federationScopeMenu{top:44px}.federation-menu .federationScopeMenu.popovermenu .menuitem{font-size:12.8px;line-height:1.6em}.federation-menu .federationScopeMenu.popovermenu .menuitem .menuitem-text-detail{opacity:.75}.federation-menu .federationScopeMenu.popovermenu .menuitem.active{box-shadow:inset 2px 0 var(--color-primary-element)}.federation-menu .federationScopeMenu.popovermenu .menuitem.active .menuitem-text{font-weight:bold}.federation-menu .federationScopeMenu.popovermenu .menuitem.disabled{opacity:.5;cursor:default}.federation-menu .federationScopeMenu.popovermenu .menuitem.disabled *{cursor:default}.clientsbox img{height:60px}#sslCertificate tr.expired{background-color:rgba(255,0,0,.5)}#sslCertificate td{padding:5px}#displaynameerror,#displaynamechanged{display:none}input#identity{width:20em}#showWizard{display:inline-block}.msg.success{color:#fff;background-color:#47a447;padding:3px}.msg.error{color:#fff;background-color:#d2322d;padding:3px}table.nostyle label{margin-right:2em}table.nostyle td{padding:.2em 0}#security-password #passwordform{display:flex;flex-wrap:wrap;flex-direction:column;gap:1rem}#security-password #passwordform .input-control{display:flex;flex-wrap:wrap;flex-direction:column}#security-password #passwordform .input-control label{margin-bottom:.5rem}#security-password #passwordform #pass1,#security-password #passwordform .personal-show-container{flex-shrink:1;width:300px;min-width:150px}#security-password #passwordform .personal-show-container #pass2{position:relative;top:.5rem}#security-password #passwordform .personal-show-container .personal-show-label{top:34px !important;margin-right:0;margin-top:0 !important;right:3px}#security-password #passwordform #pass2{width:100%}#security-password #passwordform .password-state{display:inline-block}#security-password #passwordform .strengthify-wrapper{position:absolute;left:0;width:100%;border-radius:0 0 2px 2px;margin-top:5px;overflow:hidden;height:3px}#two-factor-auth h3{margin-top:24px}#two-factor-auth li>div{margin-left:20px}#two-factor-auth .two-factor-provider-settings-icon{width:16px;height:16px;vertical-align:sub;filter:var(--background-invert-if-dark)}.isgroup .groupname{width:85%;display:block;overflow:hidden;text-overflow:ellipsis}.isgroup.active .groupname{width:65%}li.active .delete,li.active .rename{display:block}.app-navigation-entry-utils .delete,.app-navigation-entry-utils .rename{display:none}#usersearchform{position:absolute;top:2px;right:0}#usersearchform input{width:150px}#usersearchform label{font-weight:bold}table.grid{width:100%}table.grid th{height:2em;color:#999;border-bottom:1px solid var(--color-border);padding:0 .5em;padding-left:.8em;text-align:left;font-weight:normal}table.grid td{border-bottom:1px solid var(--color-border);padding:0 .5em;padding-left:.8em;text-align:left;font-weight:normal}td.name,th.name{padding-left:.8em;min-width:5em;max-width:12em;text-overflow:ellipsis;overflow:hidden}td.password,th.password{padding-left:.8em}td.password>img,th.password>img{visibility:hidden}td.displayName>img,th.displayName>img{visibility:hidden}td.password,td.mailAddress,th.password,th.mailAddress{min-width:5em;max-width:12em;cursor:pointer}td.password span,td.mailAddress span,th.password span,th.mailAddress span{width:90%;display:inline-block;text-overflow:ellipsis;overflow:hidden}td.mailAddress,th.mailAddress{cursor:pointer}td.password>span,th.password>span{margin-right:1.2em;color:#c7c7c7}span.usersLastLoginTooltip{white-space:nowrap}#app-content>svg.app-filter{float:left;height:0;width:0}#app-category-app-bundles{margin-bottom:20px}.appinfo{margin:1em 40px}#app-navigation img{margin-bottom:-3px;margin-right:6px;width:16px}#app-navigation li span.no-icon{padding-left:32px}#app-navigation ul li.active>span.utils .delete,#app-navigation ul li.active>span.utils .rename{display:block}#app-navigation .appwarning{background:#fcc}#app-navigation.appwarning:hover{background:#fbb}#app-navigation .app-external{color:var(--color-text-maxcontrast)}span.version{margin-left:1em;margin-right:1em;color:var(--color-text-maxcontrast)}.app-version{color:var(--color-text-maxcontrast)}.app-level span{color:var(--color-text-maxcontrast);background-color:rgba(0,0,0,0);border:1px solid var(--color-text-maxcontrast);border-radius:var(--border-radius);padding:3px 6px}.app-level a{padding:10px;margin:-6px;white-space:nowrap}.app-level .official{background-position:left center;background-position:5px center;padding-left:25px}.app-level .supported{border-color:var(--color-success);background-position:left center;background-position:5px center;padding-left:25px;color:var(--color-success)}.app-score{position:relative;top:4px;opacity:.5}.app-settings-content #searchresults{display:none}#apps-list.store .section{border:0}#apps-list.store .app-name{display:block;margin:5px 0}#apps-list.store .app-name,#apps-list.store .app-image *{cursor:pointer}#apps-list.store .app-summary{opacity:.7}#apps-list.store .app-image-icon .icon-settings-dark{width:100%;height:150px;background-size:45px;opacity:.5}#apps-list.store .app-score-image{height:14px}#apps-list.store .actions{margin-top:10px}#app-sidebar #app-details-view h2 .icon-settings-dark,#app-sidebar #app-details-view h2 svg{display:inline-block;width:16px;height:16px;margin-right:10px;opacity:.7}#app-sidebar #app-details-view .app-level{clear:right;width:100%}#app-sidebar #app-details-view .app-level .supported,#app-sidebar #app-details-view .app-level .official{vertical-align:top}#app-sidebar #app-details-view .app-level .app-score-image{float:right}#app-sidebar #app-details-view .app-author,#app-sidebar #app-details-view .app-licence{color:var(--color-text-maxcontrast)}#app-sidebar #app-details-view .app-dependencies{margin:10px 0}#app-sidebar #app-details-view .app-description p{margin:10px 0}#app-sidebar #app-details-view .close{position:absolute;top:0;right:0;padding:14px;opacity:.5;z-index:1;width:44px;height:44px}#app-sidebar #app-details-view .actions{display:flex;align-items:center}#app-sidebar #app-details-view .actions .app-groups{padding:5px}#app-sidebar #app-details-view .appslink{text-decoration:underline;margin-right:5px}#app-sidebar #app-details-view .app-level,#app-sidebar #app-details-view .actions,#app-sidebar #app-details-view .documentation,#app-sidebar #app-details-view .app-dependencies,#app-sidebar #app-details-view .app-description{margin:20px 0}@media only screen and (min-width: 1601px){.store .section{width:25%}.with-app-sidebar .store .section{width:33%}}@media only screen and (max-width: 1600px){.store .section{width:25%}.with-app-sidebar .store .section{width:33%}}@media only screen and (max-width: 1400px){.store .section{width:33%}.with-app-sidebar .store .section{width:50%}}@media only screen and (max-width: 900px){.store .section{width:50%}.with-app-sidebar .store .section{width:100%}}@media only screen and (max-width: 1024px){.store .section{width:50%}}@media only screen and (max-width: 480px){.store .section{width:100%}}@media only screen and (max-width: 900px){.apps-list.installed .app-version,.apps-list.installed .app-level{display:none !important}}@media only screen and (max-width: 500px){.apps-list.installed .app-groups{display:none !important}}.section{margin-bottom:0}.section:not(:last-child){border-bottom:1px solid var(--color-border)}.section h2{margin-bottom:22px}.section h2 .icon-info{padding:6px 20px;vertical-align:text-bottom;display:inline-block}.followupsection{display:block;padding:0 30px 30px 30px}.app-image{position:relative;height:150px;opacity:1;overflow:hidden}.app-name,.app-version,.app-score,.app-level{display:inline-block}.app-description-toggle-show,.app-description-toggle-hide{clear:both;padding:7px 0;cursor:pointer;opacity:.5}.app-description-container{clear:both;position:relative;top:7px}.app-description{clear:both}#app-category-1{margin-bottom:18px}#app-category-925{text-transform:capitalize}.app-dependencies{color:#ce3702}.missing-dependencies{list-style:initial;list-style-type:initial;list-style-position:inside}.apps-list{display:flex;flex-wrap:wrap;align-content:flex-start}.apps-list .section{cursor:pointer}.apps-list .app-list-move{transition:transform 1s}.apps-list #app-list-update-all{margin-left:10px}.apps-list .toolbar{height:60px;padding:8px;padding-left:60px;width:100%;background-color:var(--color-main-background);position:sticky;top:0;z-index:1;display:flex;align-items:center}.apps-list.installed{margin-bottom:100px}.apps-list.installed .apps-list-container{display:table;width:100%;height:auto;margin-top:60px}.apps-list.installed .section{display:table-row;padding:0;margin:0}.apps-list.installed .section>*{display:table-cell;height:initial;vertical-align:middle;float:none;border-bottom:1px solid var(--color-border);padding:6px;box-sizing:border-box}.apps-list.installed .section.selected{background-color:var(--color-background-dark)}.apps-list.installed .groups-enable{margin-top:0}.apps-list.installed .groups-enable label{margin-right:3px}.apps-list.installed .app-image{width:44px;height:auto;text-align:right}.apps-list.installed .app-image-icon svg,.apps-list.installed .app-image-icon .icon-settings-dark{margin-top:5px;width:20px;height:20px;opacity:.5;background-size:cover;display:inline-block}.apps-list.installed .actions{text-align:right}.apps-list.installed .actions .icon-loading-small{display:inline-block;top:4px;margin-right:10px}.apps-list:not(.installed) .app-image-icon svg{position:absolute;bottom:43px;width:64px;height:64px;opacity:.1}.apps-list.hidden{display:none}.apps-list .section{position:relative;flex:0 0 auto}.apps-list .section h2.app-name{display:block;margin:8px 0}.apps-list .section:hover{background-color:var(--color-background-dark)}.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 ol ol,.apps-list .app-description ol ul{padding-left:15px}.apps-list .app-description>ul,.apps-list .app-description>ol{margin-left:19px}.apps-list .app-description ul ol,.apps-list .app-description ul ul{padding-left:15px}.apps-list .apps-header{display:table-row;position:relative}.apps-list .apps-header div{display:table-cell;height:70px}.apps-list .apps-header h2{display:table-cell;position:absolute;padding-left:6px;padding-top:15px}.apps-list .apps-header h2 .enable{position:relative;top:-1px;margin-left:12px}.apps-list .apps-header h2+.section{margin-top:50px}#apps-list-search .section h2{margin-bottom:0}#log{white-space:normal;margin-bottom:14px}#lessLog{display:none}table.grid td.date{white-space:nowrap}#log-section p{margin-top:20px}#security-warning-state-ok span,#security-warning-state-warning span,#security-warning-state-failure span,#security-warning-state-loading span{vertical-align:middle}#security-warning-state-ok span.message,#security-warning-state-warning span.message,#security-warning-state-failure span.message,#security-warning-state-loading span.message{padding:12px}#security-warning-state-ok span.icon,#security-warning-state-warning span.icon,#security-warning-state-failure span.icon,#security-warning-state-loading span.icon{width:32px;height:32px;background-position:center center;display:inline-block;border-radius:50%}#security-warning-state-ok span.icon-checkmark-white,#security-warning-state-warning span.icon-checkmark-white,#security-warning-state-failure span.icon-checkmark-white,#security-warning-state-loading span.icon-checkmark-white{background-color:var(--color-success)}#security-warning-state-ok span.icon-error-white,#security-warning-state-warning span.icon-error-white,#security-warning-state-failure span.icon-error-white,#security-warning-state-loading span.icon-error-white{background-color:var(--color-warning)}#security-warning-state-ok span.icon-close-white,#security-warning-state-warning span.icon-close-white,#security-warning-state-failure span.icon-close-white,#security-warning-state-loading span.icon-close-white{background-color:var(--color-error)}#shareAPI.loading>div{display:none}#shareAPI p{padding-bottom:.8em}#shareAPI .indent{padding-left:28px}#shareAPI .double-indent{padding-left:56px}#shareAPI .nocheckbox{padding-left:20px}#shareApiDefaultPermissionsSection label{margin-right:20px}#fileSharingSettings h3{display:inline-block}#publicShareDisclaimerText{width:calc(100% - 23px);max-width:600px;height:150px;margin-left:20px;box-sizing:border-box}.icon-info{padding:11px 20px;vertical-align:text-bottom;opacity:.5}#two-factor-auth h2,#shareAPI h2,#mail_general_settings h2{display:inline-block}.mail_settings p label:first-child{display:inline-block;width:300px;text-align:right}.mail_settings p select:nth-child(2),.mail_settings p input:not([type=button]){width:143px}#mail_smtpport{width:60px}.cronlog{margin-left:10px}.status{display:inline-block;height:16px;width:16px;vertical-align:text-bottom}.status.success{border-radius:50%}#selectGroups select{box-sizing:border-box;display:inline-block;height:36px;padding:7px 10px}#log .log-message{word-break:break-all;min-width:180px}span.success{background-color:var(--color-success);border-radius:var(--border-radius)}span.error{background-color:var(--color-error)}span.indeterminate{background-color:var(--color-warning);border-radius:40% 0}doesnotexist:-o-prefocus,.strengthify-wrapper{left:185px;width:129px}.trusted-domain-warning{color:#fff;padding:5px;background:#ce3702;border-radius:5px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}#postsetupchecks ul{margin-left:44px;list-style:disc}#postsetupchecks ul li{margin:10px 0}#postsetupchecks ul ul{list-style:circle}#postsetupchecks .loading{height:50px;background-position:left center}#postsetupchecks .errors,#postsetupchecks .errors a{color:var(--color-error)}#postsetupchecks .warnings,#postsetupchecks .warnings a{color:var(--color-warning)}#postsetupchecks .hint{margin:20px 0}#security-warning a{text-decoration:underline}#security-warning .extra-top-margin{margin-top:12px}#admin-tips li{list-style:initial}#admin-tips li a{display:inline-block;padding:3px 0}#warning{color:red}.settings-hint{margin-top:-12px;margin-bottom:12px;opacity:.7}#body-settings #app-content.user-list-grid{display:grid;grid-column-gap:20px;grid-auto-rows:minmax(60px, max-content)}#body-settings #app-content.user-list-grid .row{display:flex;display:grid;min-height:60px;grid-row-start:span 1;grid-gap:3px;align-items:center;grid-template-columns:44px minmax(190px, 1fr) minmax(160px, 1fr) minmax(160px, 1fr) minmax(240px, 1fr) minmax(240px, 1fr) minmax(160px, 1fr) minmax(240px, 1fr) repeat(auto-fit, minmax(160px, 1fr));border-bottom:var(--color-border) 1px solid}#body-settings #app-content.user-list-grid .row.disabled{opacity:.5}#body-settings #app-content.user-list-grid .row .name,#body-settings #app-content.user-list-grid .row .password,#body-settings #app-content.user-list-grid .row .mailAddress,#body-settings #app-content.user-list-grid .row .languages,#body-settings #app-content.user-list-grid .row .storageLocation,#body-settings #app-content.user-list-grid .row .userBackend,#body-settings #app-content.user-list-grid .row .lastLogin{min-width:160px}#body-settings #app-content.user-list-grid .row .name doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .name .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .password doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .password .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .mailAddress doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .mailAddress .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .languages doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .languages .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .storageLocation doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .storageLocation .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .userBackend doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .userBackend .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .lastLogin doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .lastLogin .strengthify-wrapper{color:var(--color-text-dark);vertical-align:baseline;text-overflow:ellipsis}#body-settings #app-content.user-list-grid .row:not(.row--editable).name,#body-settings #app-content.user-list-grid .row:not(.row--editable).password,#body-settings #app-content.user-list-grid .row:not(.row--editable).displayName,#body-settings #app-content.user-list-grid .row:not(.row--editable).mailAddress,#body-settings #app-content.user-list-grid .row:not(.row--editable).userBackend,#body-settings #app-content.user-list-grid .row:not(.row--editable).languages{overflow:hidden}#body-settings #app-content.user-list-grid .row:not(.row--editable) .groups,#body-settings #app-content.user-list-grid .row:not(.row--editable) .subadmins,#body-settings #app-content.user-list-grid .row:not(.row--editable) .subAdminsGroups{overflow:auto;max-height:100%}#body-settings #app-content.user-list-grid .row .managers,#body-settings #app-content.user-list-grid .row .groups,#body-settings #app-content.user-list-grid .row .subadmins,#body-settings #app-content.user-list-grid .row .subAdminsGroups,#body-settings #app-content.user-list-grid .row .quota{min-width:160px}#body-settings #app-content.user-list-grid .row .managers .multiselect,#body-settings #app-content.user-list-grid .row .groups .multiselect,#body-settings #app-content.user-list-grid .row .subadmins .multiselect,#body-settings #app-content.user-list-grid .row .subAdminsGroups .multiselect,#body-settings #app-content.user-list-grid .row .quota .multiselect{width:100%;color:var(--color-text-dark);vertical-align:baseline}#body-settings #app-content.user-list-grid .row .managers progress,#body-settings #app-content.user-list-grid .row .groups progress,#body-settings #app-content.user-list-grid .row .subadmins progress,#body-settings #app-content.user-list-grid .row .subAdminsGroups progress,#body-settings #app-content.user-list-grid .row .quota progress{max-width:95%}#body-settings #app-content.user-list-grid .row .obfuscated{width:400px;opacity:.7}#body-settings #app-content.user-list-grid .row .userActions{display:flex;justify-content:flex-end;position:sticky;right:0px;min-width:88px;background-color:var(--color-main-background)}#body-settings #app-content.user-list-grid .row.row--editable .userActions{z-index:10}#body-settings #app-content.user-list-grid .row .subtitle{color:var(--color-text-maxcontrast);vertical-align:baseline}#body-settings #app-content.user-list-grid .row#grid-header{position:sticky;align-self:normal;background-color:var(--color-main-background);z-index:100;top:0}#body-settings #app-content.user-list-grid .row#grid-header.sticky{box-shadow:0 -2px 10px 1px var(--color-box-shadow)}#body-settings #app-content.user-list-grid .row#grid-header{color:var(--color-text-maxcontrast);border-bottom-width:thin}#body-settings #app-content.user-list-grid .row#grid-header #headerDisplayName,#body-settings #app-content.user-list-grid .row#grid-header #headerPassword,#body-settings #app-content.user-list-grid .row#grid-header #headerAddress,#body-settings #app-content.user-list-grid .row#grid-header #headerGroups,#body-settings #app-content.user-list-grid .row#grid-header #headerSubAdmins,#body-settings #app-content.user-list-grid .row#grid-header #theHeaderUserBackend,#body-settings #app-content.user-list-grid .row#grid-header #theHeaderLastLogin,#body-settings #app-content.user-list-grid .row#grid-header #headerQuota,#body-settings #app-content.user-list-grid .row#grid-header #theHeaderStorageLocation,#body-settings #app-content.user-list-grid .row#grid-header #headerLanguages{padding-left:7px;text-transform:none;color:var(--color-text-maxcontrast);vertical-align:baseline}#body-settings #app-content.user-list-grid .row:hover input:not([type=submit]):not(:focus):not(:active){border-color:var(--color-border) !important}#body-settings #app-content.user-list-grid .row:hover:not(#grid-header){box-shadow:5px 0 0 var(--color-primary-element) inset}#body-settings #app-content.user-list-grid .row>form{width:100%}#body-settings #app-content.user-list-grid .row>div,#body-settings #app-content.user-list-grid .row>.displayName>form,#body-settings #app-content.user-list-grid .row>form{grid-row:1;display:inline-flex;color:var(--color-text-lighter);flex-grow:1}#body-settings #app-content.user-list-grid .row>div>input:not(:focus):not(:active),#body-settings #app-content.user-list-grid .row>.displayName>form>input:not(:focus):not(:active),#body-settings #app-content.user-list-grid .row>form>input:not(:focus):not(:active){border-color:rgba(0,0,0,0);cursor:pointer}#body-settings #app-content.user-list-grid .row>div>input:focus+.icon-confirm,#body-settings #app-content.user-list-grid .row>div>input:active+.icon-confirm,#body-settings #app-content.user-list-grid .row>.displayName>form>input:focus+.icon-confirm,#body-settings #app-content.user-list-grid .row>.displayName>form>input:active+.icon-confirm,#body-settings #app-content.user-list-grid .row>form>input:focus+.icon-confirm,#body-settings #app-content.user-list-grid .row>form>input:active+.icon-confirm{display:block !important}#body-settings #app-content.user-list-grid .row>div:not(.userActions)>input:not([type=submit]),#body-settings #app-content.user-list-grid .row>.displayName>form:not(.userActions)>input:not([type=submit]),#body-settings #app-content.user-list-grid .row>form:not(.userActions)>input:not([type=submit]){width:100%;min-width:0}#body-settings #app-content.user-list-grid .row>div.name,#body-settings #app-content.user-list-grid .row>.displayName>form.name,#body-settings #app-content.user-list-grid .row>form.name{word-break:break-all}#body-settings #app-content.user-list-grid .row>div.displayName>input,#body-settings #app-content.user-list-grid .row>div.mailAddress>input,#body-settings #app-content.user-list-grid .row>.displayName>form.displayName>input,#body-settings #app-content.user-list-grid .row>.displayName>form.mailAddress>input,#body-settings #app-content.user-list-grid .row>form.displayName>input,#body-settings #app-content.user-list-grid .row>form.mailAddress>input{text-overflow:ellipsis;flex-grow:1}#body-settings #app-content.user-list-grid .row>div.name,#body-settings #app-content.user-list-grid .row>div.userBackend,#body-settings #app-content.user-list-grid .row>.displayName>form.name,#body-settings #app-content.user-list-grid .row>.displayName>form.userBackend,#body-settings #app-content.user-list-grid .row>form.name,#body-settings #app-content.user-list-grid .row>form.userBackend{line-height:1.3em;max-height:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}#body-settings #app-content.user-list-grid .row>div.name .subtitle,#body-settings #app-content.user-list-grid .row>.displayName>form.name .subtitle,#body-settings #app-content.user-list-grid .row>form.name .subtitle{color:var(--color-main-text)}#body-settings #app-content.user-list-grid .row>div.quota,#body-settings #app-content.user-list-grid .row>.displayName>form.quota,#body-settings #app-content.user-list-grid .row>form.quota{display:flex;justify-content:left;white-space:nowrap;position:relative}#body-settings #app-content.user-list-grid .row>div.quota progress,#body-settings #app-content.user-list-grid .row>.displayName>form.quota progress,#body-settings #app-content.user-list-grid .row>form.quota progress{width:150px;margin-top:35px;height:3px}#body-settings #app-content.user-list-grid .row>div .icon-confirm,#body-settings #app-content.user-list-grid .row>.displayName>form .icon-confirm,#body-settings #app-content.user-list-grid .row>form .icon-confirm{flex:0 0 auto;cursor:pointer}#body-settings #app-content.user-list-grid .row>div .icon-confirm:not(:active),#body-settings #app-content.user-list-grid .row>.displayName>form .icon-confirm:not(:active),#body-settings #app-content.user-list-grid .row>form .icon-confirm:not(:active){display:none}#body-settings #app-content.user-list-grid .row>div.avatar,#body-settings #app-content.user-list-grid .row>.displayName>form.avatar,#body-settings #app-content.user-list-grid .row>form.avatar{height:32px;width:32px;margin:6px}#body-settings #app-content.user-list-grid .row>div.avatar img,#body-settings #app-content.user-list-grid .row>.displayName>form.avatar img,#body-settings #app-content.user-list-grid .row>form.avatar img{display:block}#body-settings #app-content.user-list-grid .row>div.userActions,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions,#body-settings #app-content.user-list-grid .row>form.userActions{display:flex;justify-content:flex-end}#body-settings #app-content.user-list-grid .row>div.userActions #newsubmit,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions #newsubmit,#body-settings #app-content.user-list-grid .row>form.userActions #newsubmit{width:100%}#body-settings #app-content.user-list-grid .row>div.userActions .toggleUserActions,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .toggleUserActions,#body-settings #app-content.user-list-grid .row>form.userActions .toggleUserActions{position:relative;display:flex;align-items:center;background-color:var(--color-main-background)}#body-settings #app-content.user-list-grid .row>div.userActions .toggleUserActions .icon-more,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .toggleUserActions .icon-more,#body-settings #app-content.user-list-grid .row>form.userActions .toggleUserActions .icon-more{width:44px;height:44px;opacity:.5;cursor:pointer}#body-settings #app-content.user-list-grid .row>div.userActions .toggleUserActions .icon-more:focus,#body-settings #app-content.user-list-grid .row>div.userActions .toggleUserActions .icon-more:hover,#body-settings #app-content.user-list-grid .row>div.userActions .toggleUserActions .icon-more:active,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .toggleUserActions .icon-more:focus,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .toggleUserActions .icon-more:hover,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .toggleUserActions .icon-more:active,#body-settings #app-content.user-list-grid .row>form.userActions .toggleUserActions .icon-more:focus,#body-settings #app-content.user-list-grid .row>form.userActions .toggleUserActions .icon-more:hover,#body-settings #app-content.user-list-grid .row>form.userActions .toggleUserActions .icon-more:active{opacity:.7;background-color:var(--color-background-dark)}#body-settings #app-content.user-list-grid .row>div.userActions .feedback,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .feedback,#body-settings #app-content.user-list-grid .row>form.userActions .feedback{display:flex;align-items:center;white-space:nowrap;transition:opacity 200ms ease-in-out}#body-settings #app-content.user-list-grid .row>div.userActions .feedback .icon-checkmark,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions .feedback .icon-checkmark,#body-settings #app-content.user-list-grid .row>form.userActions .feedback .icon-checkmark{opacity:.5;margin-right:5px}#body-settings #app-content.user-list-grid .row>div .multiselect.multiselect-vue,#body-settings #app-content.user-list-grid .row>.displayName>form .multiselect.multiselect-vue,#body-settings #app-content.user-list-grid .row>form .multiselect.multiselect-vue{min-width:100%;width:100%}#body-settings #app-content.user-list-grid .infinite-loading-container{display:flex;align-items:center;justify-content:center;grid-row-start:span 4}#body-settings #app-content.user-list-grid .users-list-end{opacity:.5;user-select:none}.animated{animation:blink-animation 1s steps(5, start) 4}@keyframes blink-animation{to{opacity:.6}}@-webkit-keyframes blink-animation{to{opacity:1}}/*# sourceMappingURL=settings.css.map */
+input#openid,input#webdav{width:20em}.clear{clear:both}.nav-icon-personal-settings{background-image:var(--icon-personal-dark)}.nav-icon-security{background-image:var(--icon-toggle-filelist-dark)}.nav-icon-clientsbox{background-image:var(--icon-change-dark)}.nav-icon-federated-cloud{background-image:var(--icon-share-dark)}.nav-icon-second-factor-backup-codes,.nav-icon-ssl-root-certificate{background-image:var(--icon-password-dark)}#personal-settings-avatar-container{display:inline-grid;grid-template-columns:1fr;grid-template-rows:2fr 1fr 2fr;vertical-align:top}.profile-settings-container{display:inline-grid;grid-template-columns:1fr 1fr 1fr}.personal-show-container{width:100%}.personal-settings-setting-box .section{padding:10px 30px}.personal-settings-setting-box .section .headerbar-label{margin-bottom:0}.personal-settings-setting-box .section input[type=text],.personal-settings-setting-box .section input[type=email],.personal-settings-setting-box .section input[type=tel],.personal-settings-setting-box .section input[type=url]{width:100%}.personal-settings-setting-box-profile{grid-row:3/5}.personal-settings-setting-box-detail{grid-row:5}.personal-settings-setting-box-detail--without-profile{grid-row:3}select#timezone{width:100%}#personal-settings{display:grid;padding:20px;max-width:1700px;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));grid-column-gap:10px}#personal-settings .section{padding:10px 10px;border:0}#personal-settings .section h2{margin-bottom:12px}#personal-settings .section h3>label{font-weight:bold}#personal-settings .personal-info{margin-right:10%;margin-bottom:12px;margin-top:12px}#personal-settings .personal-info[class^=icon-],#personal-settings .personal-info[class*=" icon-"]{background-position:0px 2px;padding-left:30px;opacity:.7}.development-notice{text-align:center}.development-notice a:not(.link-button){text-decoration:underline}.development-notice a:not(.link-button):hover{background-color:var(--color-primary-element-hover)}.link-button{display:inline-block;margin:16px;padding:14px 20px;background-color:var(--color-primary-element);color:#fff;border-radius:var(--border-radius-pill);border:1px solid var(--color-primary-element);box-shadow:0 2px 9px var(--color-box-shadow)}.link-button:active,.link-button:hover,.link-button:focus{color:var(--color-primary-element);background-color:var(--color-primary-element-text);border-color:var(--color-primary-element) !important}.link-button.icon-file{padding-left:48px;background-position:24px}.personal-settings-container{display:inline-grid;grid-template-columns:1fr 1fr 1fr}.personal-settings-container:after{clear:both}.personal-settings-container>div h3{position:relative;display:inline-flex;flex-wrap:nowrap;justify-content:flex-start;width:100%;align-items:center;gap:8px}.personal-settings-container>div h3>label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.personal-settings-container>div>form span[class^=icon-checkmark],.personal-settings-container>div>form span[class^=icon-error]{position:relative;right:8px;top:-28px;pointer-events:none;float:right}.personal-settings-container .verify{position:relative;left:100%;top:0;height:0}.personal-settings-container .verify img{padding:12px 7px 6px}.personal-settings-container .verify-action{cursor:pointer}.personal-settings-container input:disabled{background-color:#fff;color:#000;border:none;opacity:100}.verification-dialog{display:none;right:-9px;top:40px;width:275px}.verification-dialog p{padding:10px}.verification-dialog .verificationCode{font-family:monospace;display:block;overflow-wrap:break-word}.federation-menu{position:relative;cursor:pointer;width:44px;height:44px;padding:10px;margin:0;background:none;border:none}.federation-menu:hover,.federation-menu:focus{background-color:var(--color-background-hover);border-radius:var(--border-radius-pill)}.federation-menu:hover .icon-federation-menu,.federation-menu:focus .icon-federation-menu{opacity:.8}.federation-menu .icon-federation-menu{padding-left:16px;background-size:16px;background-position:left center;opacity:.3;cursor:inherit}.federation-menu .icon-federation-menu .icon-triangle-s{display:inline-block;vertical-align:middle;cursor:inherit}.federation-menu .federationScopeMenu{top:44px}.federation-menu .federationScopeMenu.popovermenu .menuitem{font-size:12.8px;line-height:1.6em}.federation-menu .federationScopeMenu.popovermenu .menuitem .menuitem-text-detail{opacity:.75}.federation-menu .federationScopeMenu.popovermenu .menuitem.active{box-shadow:inset 2px 0 var(--color-primary-element)}.federation-menu .federationScopeMenu.popovermenu .menuitem.active .menuitem-text{font-weight:bold}.federation-menu .federationScopeMenu.popovermenu .menuitem.disabled{opacity:.5;cursor:default}.federation-menu .federationScopeMenu.popovermenu .menuitem.disabled *{cursor:default}.clientsbox img{height:60px}#sslCertificate tr.expired{background-color:rgba(255,0,0,.5)}#sslCertificate td{padding:5px}#displaynameerror,#displaynamechanged{display:none}input#identity{width:20em}#showWizard{display:inline-block}.msg.success{color:#fff;background-color:#47a447;padding:3px}.msg.error{color:#fff;background-color:#d2322d;padding:3px}table.nostyle label{margin-right:2em}table.nostyle td{padding:.2em 0}#security-password #passwordform{display:flex;flex-wrap:wrap;flex-direction:column;gap:1rem}#security-password #passwordform .input-control{display:flex;flex-wrap:wrap;flex-direction:column}#security-password #passwordform .input-control label{margin-bottom:.5rem}#security-password #passwordform #pass1,#security-password #passwordform .personal-show-container{flex-shrink:1;width:300px;min-width:150px}#security-password #passwordform .personal-show-container #pass2{position:relative;top:.5rem}#security-password #passwordform .personal-show-container .personal-show-label{top:34px !important;margin-right:0;margin-top:0 !important;right:3px}#security-password #passwordform #pass2{width:100%}#security-password #passwordform .password-state{display:inline-block}#security-password #passwordform .strengthify-wrapper{position:absolute;left:0;width:100%;border-radius:0 0 2px 2px;margin-top:5px;overflow:hidden;height:3px}#two-factor-auth h3{margin-top:24px}#two-factor-auth li>div{margin-left:20px}#two-factor-auth .two-factor-provider-settings-icon{width:16px;height:16px;vertical-align:sub;filter:var(--background-invert-if-dark)}.isgroup .groupname{width:85%;display:block;overflow:hidden;text-overflow:ellipsis}.isgroup.active .groupname{width:65%}li.active .delete,li.active .rename{display:block}.app-navigation-entry-utils .delete,.app-navigation-entry-utils .rename{display:none}#usersearchform{position:absolute;top:2px;right:0}#usersearchform input{width:150px}#usersearchform label{font-weight:bold}table.grid{width:100%}table.grid th{height:2em;color:#999;border-bottom:1px solid var(--color-border);padding:0 .5em;padding-left:.8em;text-align:left;font-weight:normal}table.grid td{border-bottom:1px solid var(--color-border);padding:0 .5em;padding-left:.8em;text-align:left;font-weight:normal}td.name,th.name{padding-left:.8em;min-width:5em;max-width:12em;text-overflow:ellipsis;overflow:hidden}td.password,th.password{padding-left:.8em}td.password>img,th.password>img{visibility:hidden}td.displayName>img,th.displayName>img{visibility:hidden}td.password,td.mailAddress,th.password,th.mailAddress{min-width:5em;max-width:12em;cursor:pointer}td.password span,td.mailAddress span,th.password span,th.mailAddress span{width:90%;display:inline-block;text-overflow:ellipsis;overflow:hidden}td.mailAddress,th.mailAddress{cursor:pointer}td.password>span,th.password>span{margin-right:1.2em;color:#c7c7c7}span.usersLastLoginTooltip{white-space:nowrap}#app-content>svg.app-filter{float:left;height:0;width:0}#app-category-app-bundles{margin-bottom:20px}.appinfo{margin:1em 40px}#app-navigation img{margin-bottom:-3px;margin-right:6px;width:16px}#app-navigation li span.no-icon{padding-left:32px}#app-navigation ul li.active>span.utils .delete,#app-navigation ul li.active>span.utils .rename{display:block}#app-navigation .appwarning{background:#fcc}#app-navigation.appwarning:hover{background:#fbb}#app-navigation .app-external{color:var(--color-text-maxcontrast)}span.version{margin-left:1em;margin-right:1em;color:var(--color-text-maxcontrast)}.app-version{color:var(--color-text-maxcontrast)}.app-level span{color:var(--color-text-maxcontrast);background-color:rgba(0,0,0,0);border:1px solid var(--color-text-maxcontrast);border-radius:var(--border-radius);padding:3px 6px}.app-level a{padding:10px;margin:-6px;white-space:nowrap}.app-level .official{background-position:left center;background-position:5px center;padding-left:25px}.app-level .supported{border-color:var(--color-success);background-position:left center;background-position:5px center;padding-left:25px;color:var(--color-success)}.app-score{position:relative;top:4px;opacity:.5}.app-settings-content #searchresults{display:none}#apps-list.store .section{border:0}#apps-list.store .app-name{display:block;margin:5px 0}#apps-list.store .app-name,#apps-list.store .app-image *{cursor:pointer}#apps-list.store .app-summary{opacity:.7}#apps-list.store .app-image-icon .icon-settings-dark{width:100%;height:150px;background-size:45px;opacity:.5}#apps-list.store .app-score-image{height:14px}#apps-list.store .actions{margin-top:10px}#app-sidebar #app-details-view h2 .icon-settings-dark,#app-sidebar #app-details-view h2 svg{display:inline-block;width:16px;height:16px;margin-right:10px;opacity:.7}#app-sidebar #app-details-view .app-level{clear:right;width:100%}#app-sidebar #app-details-view .app-level .supported,#app-sidebar #app-details-view .app-level .official{vertical-align:top}#app-sidebar #app-details-view .app-level .app-score-image{float:right}#app-sidebar #app-details-view .app-author,#app-sidebar #app-details-view .app-licence{color:var(--color-text-maxcontrast)}#app-sidebar #app-details-view .app-dependencies{margin:10px 0}#app-sidebar #app-details-view .app-description p{margin:10px 0}#app-sidebar #app-details-view .close{position:absolute;top:0;right:0;padding:14px;opacity:.5;z-index:1;width:44px;height:44px}#app-sidebar #app-details-view .actions{display:flex;align-items:center}#app-sidebar #app-details-view .actions .app-groups{padding:5px}#app-sidebar #app-details-view .appslink{text-decoration:underline;margin-right:5px}#app-sidebar #app-details-view .app-level,#app-sidebar #app-details-view .actions,#app-sidebar #app-details-view .documentation,#app-sidebar #app-details-view .app-dependencies,#app-sidebar #app-details-view .app-description{margin:20px 0}@media only screen and (min-width: 1601px){.store .section{width:25%}.with-app-sidebar .store .section{width:33%}}@media only screen and (max-width: 1600px){.store .section{width:25%}.with-app-sidebar .store .section{width:33%}}@media only screen and (max-width: 1400px){.store .section{width:33%}.with-app-sidebar .store .section{width:50%}}@media only screen and (max-width: 900px){.store .section{width:50%}.with-app-sidebar .store .section{width:100%}}@media only screen and (max-width: 1024px){.store .section{width:50%}}@media only screen and (max-width: 480px){.store .section{width:100%}}@media only screen and (max-width: 900px){.apps-list.installed .app-version,.apps-list.installed .app-level{display:none !important}}@media only screen and (max-width: 500px){.apps-list.installed .app-groups{display:none !important}}.section{margin-bottom:0}.section:not(:last-child){border-bottom:1px solid var(--color-border)}.section h2{margin-bottom:22px}.section h2 .icon-info{padding:6px 20px;vertical-align:text-bottom;display:inline-block}.followupsection{display:block;padding:0 30px 30px 30px}.app-image{position:relative;height:150px;opacity:1;overflow:hidden}.app-name,.app-version,.app-score,.app-level{display:inline-block}.app-description-toggle-show,.app-description-toggle-hide{clear:both;padding:7px 0;cursor:pointer;opacity:.5}.app-description-container{clear:both;position:relative;top:7px}.app-description{clear:both}#app-category-1{margin-bottom:18px}#app-category-925{text-transform:capitalize}.app-dependencies{color:#ce3702}.missing-dependencies{list-style:initial;list-style-type:initial;list-style-position:inside}.apps-list{display:flex;flex-wrap:wrap;align-content:flex-start}.apps-list .section{cursor:pointer}.apps-list .app-list-move{transition:transform 1s}.apps-list #app-list-update-all{margin-left:10px}.apps-list .toolbar{height:60px;padding:8px;padding-left:60px;width:100%;background-color:var(--color-main-background);position:sticky;top:0;z-index:1;display:flex;align-items:center}.apps-list.installed{margin-bottom:100px}.apps-list.installed .apps-list-container{display:table;width:100%;height:auto;margin-top:60px}.apps-list.installed .section{display:table-row;padding:0;margin:0}.apps-list.installed .section>*{display:table-cell;height:initial;vertical-align:middle;float:none;border-bottom:1px solid var(--color-border);padding:6px;box-sizing:border-box}.apps-list.installed .section.selected{background-color:var(--color-background-dark)}.apps-list.installed .groups-enable{margin-top:0}.apps-list.installed .groups-enable label{margin-right:3px}.apps-list.installed .app-image{width:44px;height:auto;text-align:right}.apps-list.installed .app-image-icon svg,.apps-list.installed .app-image-icon .icon-settings-dark{margin-top:5px;width:20px;height:20px;opacity:.5;background-size:cover;display:inline-block}.apps-list.installed .actions{text-align:right}.apps-list.installed .actions .icon-loading-small{display:inline-block;top:4px;margin-right:10px}.apps-list:not(.installed) .app-image-icon svg{position:absolute;bottom:43px;width:64px;height:64px;opacity:.1}.apps-list.hidden{display:none}.apps-list .section{position:relative;flex:0 0 auto}.apps-list .section h2.app-name{display:block;margin:8px 0}.apps-list .section:hover{background-color:var(--color-background-dark)}.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 ol ol,.apps-list .app-description ol ul{padding-left:15px}.apps-list .app-description>ul,.apps-list .app-description>ol{margin-left:19px}.apps-list .app-description ul ol,.apps-list .app-description ul ul{padding-left:15px}.apps-list .apps-header{display:table-row;position:relative}.apps-list .apps-header div{display:table-cell;height:70px}.apps-list .apps-header h2{display:table-cell;position:absolute;padding-left:6px;padding-top:15px}.apps-list .apps-header h2 .enable{position:relative;top:-1px;margin-left:12px}.apps-list .apps-header h2+.section{margin-top:50px}#apps-list-search .section h2{margin-bottom:0}#log{white-space:normal;margin-bottom:14px}#lessLog{display:none}table.grid td.date{white-space:nowrap}#log-section p{margin-top:20px}#security-warning-state-ok span,#security-warning-state-warning span,#security-warning-state-failure span,#security-warning-state-loading span{vertical-align:middle}#security-warning-state-ok span.message,#security-warning-state-warning span.message,#security-warning-state-failure span.message,#security-warning-state-loading span.message{padding:12px}#security-warning-state-ok span.icon,#security-warning-state-warning span.icon,#security-warning-state-failure span.icon,#security-warning-state-loading span.icon{width:32px;height:32px;background-position:center center;display:inline-block;border-radius:50%}#security-warning-state-ok span.icon-checkmark-white,#security-warning-state-warning span.icon-checkmark-white,#security-warning-state-failure span.icon-checkmark-white,#security-warning-state-loading span.icon-checkmark-white{background-color:var(--color-success)}#security-warning-state-ok span.icon-error-white,#security-warning-state-warning span.icon-error-white,#security-warning-state-failure span.icon-error-white,#security-warning-state-loading span.icon-error-white{background-color:var(--color-warning)}#security-warning-state-ok span.icon-close-white,#security-warning-state-warning span.icon-close-white,#security-warning-state-failure span.icon-close-white,#security-warning-state-loading span.icon-close-white{background-color:var(--color-error)}#shareAPI.loading>div{display:none}#shareAPI p{padding-bottom:.8em}#shareAPI .indent{padding-left:28px}#shareAPI .double-indent{padding-left:56px}#shareAPI .nocheckbox{padding-left:20px}#shareApiDefaultPermissionsSection label{margin-right:20px}#fileSharingSettings h3{display:inline-block}#publicShareDisclaimerText{width:calc(100% - 23px);max-width:600px;height:150px;margin-left:20px;box-sizing:border-box}.icon-info{padding:11px 20px;vertical-align:text-bottom;opacity:.5}#two-factor-auth h2,#shareAPI h2,#mail_general_settings h2{display:inline-block}.mail_settings p label:first-child{display:inline-block;width:300px;text-align:right}.mail_settings p select:nth-child(2),.mail_settings p input:not([type=button]){width:143px}#mail_smtpport{width:60px}.cronlog{margin-left:10px}.status{display:inline-block;height:16px;width:16px;vertical-align:text-bottom}.status.success{border-radius:50%}#selectGroups select{box-sizing:border-box;display:inline-block;height:36px;padding:7px 10px}#log .log-message{word-break:break-all;min-width:180px}span.success{background-color:var(--color-success);border-radius:var(--border-radius)}span.error{background-color:var(--color-error)}span.indeterminate{background-color:var(--color-warning);border-radius:40% 0}doesnotexist:-o-prefocus,.strengthify-wrapper{left:185px;width:129px}.trusted-domain-warning{color:#fff;padding:5px;background:#ce3702;border-radius:5px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}#postsetupchecks ul{margin-left:44px;list-style:disc}#postsetupchecks ul li{margin:10px 0}#postsetupchecks ul ul{list-style:circle}#postsetupchecks .loading{height:50px;background-position:left center}#postsetupchecks .errors,#postsetupchecks .errors a{color:var(--color-error)}#postsetupchecks .warnings,#postsetupchecks .warnings a{color:var(--color-warning)}#postsetupchecks .hint{margin:20px 0}#security-warning a{text-decoration:underline}#security-warning .extra-top-margin{margin-top:12px}#admin-tips li{list-style:initial}#admin-tips li a{display:inline-block;padding:3px 0}#warning{color:red}.settings-hint{margin-top:-12px;margin-bottom:12px;opacity:.7}#body-settings #app-content.user-list-grid{display:grid;grid-column-gap:20px;grid-auto-rows:minmax(60px, max-content)}#body-settings #app-content.user-list-grid .row{display:flex;display:grid;min-height:60px;grid-row-start:span 1;grid-gap:3px;align-items:center;grid-template-columns:44px minmax(190px, 1fr) minmax(160px, 1fr) minmax(160px, 1fr) minmax(240px, 1fr) minmax(240px, 1fr) minmax(160px, 1fr) minmax(240px, 1fr) repeat(auto-fit, minmax(160px, 1fr));border-bottom:var(--color-border) 1px solid}#body-settings #app-content.user-list-grid .row.disabled{opacity:.5}#body-settings #app-content.user-list-grid .row .name,#body-settings #app-content.user-list-grid .row .password,#body-settings #app-content.user-list-grid .row .mailAddress,#body-settings #app-content.user-list-grid .row .languages,#body-settings #app-content.user-list-grid .row .storageLocation,#body-settings #app-content.user-list-grid .row .userBackend,#body-settings #app-content.user-list-grid .row .lastLogin{min-width:160px}#body-settings #app-content.user-list-grid .row .name doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .name .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .password doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .password .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .mailAddress doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .mailAddress .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .languages doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .languages .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .storageLocation doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .storageLocation .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .userBackend doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .userBackend .strengthify-wrapper,#body-settings #app-content.user-list-grid .row .lastLogin doesnotexist:-o-prefocus,#body-settings #app-content.user-list-grid .row .lastLogin .strengthify-wrapper{color:var(--color-text-dark);vertical-align:baseline;text-overflow:ellipsis}#body-settings #app-content.user-list-grid .row:not(.row--editable).name,#body-settings #app-content.user-list-grid .row:not(.row--editable).password,#body-settings #app-content.user-list-grid .row:not(.row--editable).displayName,#body-settings #app-content.user-list-grid .row:not(.row--editable).mailAddress,#body-settings #app-content.user-list-grid .row:not(.row--editable).userBackend,#body-settings #app-content.user-list-grid .row:not(.row--editable).languages{overflow:hidden}#body-settings #app-content.user-list-grid .row:not(.row--editable) .groups,#body-settings #app-content.user-list-grid .row:not(.row--editable) .subadmins,#body-settings #app-content.user-list-grid .row:not(.row--editable) .subAdminsGroups{overflow:auto;max-height:100%}#body-settings #app-content.user-list-grid .row .managers,#body-settings #app-content.user-list-grid .row .groups,#body-settings #app-content.user-list-grid .row .subadmins,#body-settings #app-content.user-list-grid .row .subAdminsGroups,#body-settings #app-content.user-list-grid .row .quota{min-width:160px}#body-settings #app-content.user-list-grid .row .managers .select,#body-settings #app-content.user-list-grid .row .groups .select,#body-settings #app-content.user-list-grid .row .subadmins .select,#body-settings #app-content.user-list-grid .row .subAdminsGroups .select,#body-settings #app-content.user-list-grid .row .quota .select{width:100%;color:var(--color-text-dark);vertical-align:baseline}#body-settings #app-content.user-list-grid .row .managers progress,#body-settings #app-content.user-list-grid .row .groups progress,#body-settings #app-content.user-list-grid .row .subadmins progress,#body-settings #app-content.user-list-grid .row .subAdminsGroups progress,#body-settings #app-content.user-list-grid .row .quota progress{max-width:95%}#body-settings #app-content.user-list-grid .row .obfuscated{width:400px;opacity:.7}#body-settings #app-content.user-list-grid .row .userActions{display:flex;justify-content:flex-end;position:sticky;right:0px;min-width:88px;background-color:var(--color-main-background)}#body-settings #app-content.user-list-grid .row.row--editable .userActions{z-index:10}#body-settings #app-content.user-list-grid .row .subtitle{color:var(--color-text-maxcontrast);vertical-align:baseline}#body-settings #app-content.user-list-grid .row#grid-header{position:sticky;align-self:normal;background-color:var(--color-main-background);z-index:100;top:0}#body-settings #app-content.user-list-grid .row#grid-header.sticky{box-shadow:0 -2px 10px 1px var(--color-box-shadow)}#body-settings #app-content.user-list-grid .row#grid-header{color:var(--color-text-maxcontrast);border-bottom-width:thin}#body-settings #app-content.user-list-grid .row#grid-header #headerDisplayName,#body-settings #app-content.user-list-grid .row#grid-header #headerPassword,#body-settings #app-content.user-list-grid .row#grid-header #headerAddress,#body-settings #app-content.user-list-grid .row#grid-header #headerGroups,#body-settings #app-content.user-list-grid .row#grid-header #headerSubAdmins,#body-settings #app-content.user-list-grid .row#grid-header #theHeaderUserBackend,#body-settings #app-content.user-list-grid .row#grid-header #theHeaderLastLogin,#body-settings #app-content.user-list-grid .row#grid-header #headerQuota,#body-settings #app-content.user-list-grid .row#grid-header #theHeaderStorageLocation,#body-settings #app-content.user-list-grid .row#grid-header #headerLanguages{padding-left:7px;text-transform:none;color:var(--color-text-maxcontrast);vertical-align:baseline}#body-settings #app-content.user-list-grid .row:hover:not(#grid-header){box-shadow:5px 0 0 var(--color-primary-element) inset}#body-settings #app-content.user-list-grid .row>form{width:100%}#body-settings #app-content.user-list-grid .row>div,#body-settings #app-content.user-list-grid .row>.displayName>form,#body-settings #app-content.user-list-grid .row>form{grid-row:1;display:inline-flex;color:var(--color-text-lighter);flex-grow:1}#body-settings #app-content.user-list-grid .row>div>input:not(:focus):not(:active),#body-settings #app-content.user-list-grid .row>.displayName>form>input:not(:focus):not(:active),#body-settings #app-content.user-list-grid .row>form>input:not(:focus):not(:active){border-color:rgba(0,0,0,0);cursor:pointer}#body-settings #app-content.user-list-grid .row>div>input:focus+.icon-confirm,#body-settings #app-content.user-list-grid .row>div>input:active+.icon-confirm,#body-settings #app-content.user-list-grid .row>.displayName>form>input:focus+.icon-confirm,#body-settings #app-content.user-list-grid .row>.displayName>form>input:active+.icon-confirm,#body-settings #app-content.user-list-grid .row>form>input:focus+.icon-confirm,#body-settings #app-content.user-list-grid .row>form>input:active+.icon-confirm{display:block !important}#body-settings #app-content.user-list-grid .row>div:not(.userActions)>input:not([type=submit]),#body-settings #app-content.user-list-grid .row>.displayName>form:not(.userActions)>input:not([type=submit]),#body-settings #app-content.user-list-grid .row>form:not(.userActions)>input:not([type=submit]){width:100%;min-width:0}#body-settings #app-content.user-list-grid .row>div.name,#body-settings #app-content.user-list-grid .row>.displayName>form.name,#body-settings #app-content.user-list-grid .row>form.name{word-break:break-all}#body-settings #app-content.user-list-grid .row>div.displayName>input,#body-settings #app-content.user-list-grid .row>div.mailAddress>input,#body-settings #app-content.user-list-grid .row>.displayName>form.displayName>input,#body-settings #app-content.user-list-grid .row>.displayName>form.mailAddress>input,#body-settings #app-content.user-list-grid .row>form.displayName>input,#body-settings #app-content.user-list-grid .row>form.mailAddress>input{text-overflow:ellipsis;flex-grow:1}#body-settings #app-content.user-list-grid .row>div.name,#body-settings #app-content.user-list-grid .row>div.userBackend,#body-settings #app-content.user-list-grid .row>.displayName>form.name,#body-settings #app-content.user-list-grid .row>.displayName>form.userBackend,#body-settings #app-content.user-list-grid .row>form.name,#body-settings #app-content.user-list-grid .row>form.userBackend{line-height:1.3em;max-height:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}#body-settings #app-content.user-list-grid .row>div.name .subtitle,#body-settings #app-content.user-list-grid .row>.displayName>form.name .subtitle,#body-settings #app-content.user-list-grid .row>form.name .subtitle{color:var(--color-main-text)}#body-settings #app-content.user-list-grid .row>div.quota,#body-settings #app-content.user-list-grid .row>.displayName>form.quota,#body-settings #app-content.user-list-grid .row>form.quota{display:flex;justify-content:left;white-space:nowrap;position:relative}#body-settings #app-content.user-list-grid .row>div.quota progress,#body-settings #app-content.user-list-grid .row>.displayName>form.quota progress,#body-settings #app-content.user-list-grid .row>form.quota progress{width:150px;margin-top:35px;height:3px}#body-settings #app-content.user-list-grid .row>div .icon-confirm,#body-settings #app-content.user-list-grid .row>.displayName>form .icon-confirm,#body-settings #app-content.user-list-grid .row>form .icon-confirm{flex:0 0 auto;cursor:pointer}#body-settings #app-content.user-list-grid .row>div .icon-confirm:not(:active),#body-settings #app-content.user-list-grid .row>.displayName>form .icon-confirm:not(:active),#body-settings #app-content.user-list-grid .row>form .icon-confirm:not(:active){display:none}#body-settings #app-content.user-list-grid .row>div.avatar,#body-settings #app-content.user-list-grid .row>.displayName>form.avatar,#body-settings #app-content.user-list-grid .row>form.avatar{height:32px;width:32px;margin:6px}#body-settings #app-content.user-list-grid .row>div.avatar img,#body-settings #app-content.user-list-grid .row>.displayName>form.avatar img,#body-settings #app-content.user-list-grid .row>form.avatar img{display:block}#body-settings #app-content.user-list-grid .row>div.userActions,#body-settings #app-content.user-list-grid .row>.displayName>form.userActions,#body-settings #app-content.user-list-grid .row>form.userActions{display:flex;align-items:center;justify-content:flex-end;height:100%;width:fit-content;padding-inline:12px;background-color:var(--color-main-background)}#body-settings #app-content.user-list-grid .infinite-loading-container{display:flex;align-items:center;justify-content:center;grid-row-start:span 4}#body-settings #app-content.user-list-grid .users-list-end{opacity:.5;user-select:none}.animated{animation:blink-animation 1s steps(5, start) 4}@keyframes blink-animation{to{opacity:.6}}@-webkit-keyframes blink-animation{to{opacity:1}}/*# sourceMappingURL=settings.css.map */
diff --git a/apps/settings/css/settings.css.map b/apps/settings/css/settings.css.map
index eb8f9b488fe..04c837346be 100644
--- a/apps/settings/css/settings.css.map
+++ b/apps/settings/css/settings.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["settings.scss","../../../core/css/functions.scss"],"names":[],"mappings":"AAOC,0BACC,WAKF,OACC,WAID,4BC+CC,2CD3CD,mBC2CC,kDDvCD,qBCuCC,yCDnCD,0BCmCC,wCD/BD,oEC+BC,2CD3BD,oCACC,oBACA,0BACA,+BACA,mBAGD,4BACC,oBACA,kCAGD,yBACC,WAIA,wCACC,kBACA,yDACC,gBAIA,mOACC,WAKH,uCACC,aAGD,sCACC,WAED,uDACC,WAKD,gBACC,WAIF,mBACC,aACA,aACA,iBACA,4DACA,qBAEA,4BACC,kBACA,SAEA,+BACC,mBAIA,qCACC,iBAKH,kCACC,iBACA,mBACA,gBAGD,mGACC,4BACA,kBACA,WAMF,oBACC,kBACA,wCACC,0BACA,8CACC,oDAKH,aACC,qBACA,YACA,kBACA,8CACA,WACA,wCACA,8CACA,6CAEA,0DAGC,mCACA,mDACA,qDAGD,uBACC,kBACA,yBAIF,6BACC,oBACA,kCAEA,mCACC,WAIA,oCACC,kBACA,oBACA,iBACA,2BACA,WACA,mBACA,QAEA,0CACC,mBACA,uBACA,gBAKD,gIACC,kBACA,UACA,UACA,oBACA,YAKH,qCACC,kBACA,UACA,MACA,SAEA,yCACC,qBAIF,4CACC,eAGD,4CACC,sBACA,WACA,YACA,YAMF,qBACC,aACA,WACA,SACA,YAEA,uBACC,aAGD,uCACC,sBACA,cACA,yBAIF,iBACC,kBACA,eACA,WACA,YACA,aACA,SACA,gBACA,YAEA,8CAEC,+CACA,wCAEA,0FACC,WAIF,uCACC,kBACA,qBACA,gCACA,WACA,eAEA,wDACC,qBACA,sBACA,eAIF,sCACC,SAGC,4DAEC,iBACA,kBAEA,kFACC,YAGD,mEACC,oDAEA,kFACC,iBAIF,qEACC,WAEA,eAEA,uEACC,eAQN,gBACC,YAIA,2BACC,kCAGD,mBACC,YAIF,sCAEC,aAGD,eACC,WAGD,YACC,qBAIA,aACC,WACA,yBACA,YAGD,WACC,WACA,yBACA,YAMD,oBACC,iBAGD,iBACC,eAKD,iCACC,aACA,eACA,sBACA,SACA,gDACC,aACA,eACA,sBACA,sDACC,oBAIF,kGACC,cACA,YACA,gBAKA,iEACC,kBACA,UAED,+EACC,oBACA,eACA,wBACA,UAIF,wCACC,WAGD,iDACC,qBAGD,sDACC,kBACA,OACA,WACA,0BACA,eACA,gBACA,WAQF,oBACC,gBAGD,wBACC,iBAGD,oDACC,WACA,YACA,mBACA,wCAOD,oBACC,UACA,cACA,gBACA,uBAGD,2BACC,UAKD,oCAEC,cAKD,wEAEC,aAIF,gBACC,kBACA,QACA,QAEA,sBACC,YAGD,sBACC,iBAKF,WACC,WAEA,cACC,WACA,WACA,4CACA,eACA,kBACA,gBACA,mBAGD,cACC,4CACA,eACA,kBACA,gBACA,mBAKD,gBACC,kBACA,cACA,eACA,uBACA,gBAGD,wBACC,kBAEA,gCACC,kBAIF,sCACC,kBAGD,sDAEC,cACA,eACA,eAEA,0EACC,UACA,qBACA,uBACA,gBAIF,8BACC,eAGD,kCACC,mBACA,cAIF,2BACC,mBAID,4BACC,WACA,SACA,QAGD,0BACC,mBAGD,SACC,gBAKA,oBACC,mBACA,iBACA,WAGD,gCACC,kBAIA,gGACC,cAIF,4BACC,gBAGD,iCACC,gBAGD,8BACC,oCAIF,aACC,gBACA,iBACA,oCAGD,aACC,oCAIA,gBACC,oCACA,+BACA,+CACA,mCACA,gBAGD,aACC,aACA,YACA,mBAGD,qBACC,gCACA,+BACA,kBAGD,sBACC,kCACA,gCACA,+BACA,kBACA,2BAIF,WACC,kBACA,QACA,WAIA,qCACC,aAMD,0BACC,SAGD,2BACC,cACA,aAGD,yDACC,eAGD,8BACC,WAGD,qDACC,WACA,aACA,qBACA,WAGD,kCACC,YAGD,0BACC,gBAMA,4FAEC,qBACA,WACA,YACA,kBACA,WAIF,0CACC,YACA,WAEA,yGAEC,mBAGD,2DACC,YAIF,uFACC,oCAGD,iDACC,cAGD,kDACC,cAGD,sCACC,kBACA,MACA,QACA,aACA,WACA,UACA,WACA,YAGD,wCACC,aACA,mBAEA,oDACC,YAIF,yCACC,0BACA,iBAGD,iOAKC,cAIF,2CACC,gBACC,UAED,kCACC,WAIF,2CACC,gBACC,UAED,kCACC,WAIF,2CACC,gBACC,UAED,kCACC,WAIF,0CACC,gBACC,UAED,kCACC,YAIF,2CACC,gBACC,WAIF,0CACC,gBACC,YAKF,0CAEE,kEACC,yBAKH,0CACC,iCACC,yBAIF,SACC,gBAEA,0BACC,4CAID,YACC,mBAEA,uBACC,iBACA,2BACA,qBAKH,iBACC,cACA,yBAGD,WACC,kBACA,aACA,UACA,gBAGD,6CACC,qBAGD,0DACC,WACA,cACA,eACA,WAGD,2BACC,WACA,kBACA,QAGD,iBACC,WAGD,gBACC,mBAKD,kBACC,0BAGD,kBACC,cAGD,sBACC,mBACA,wBACA,2BAGD,WAyGC,aACA,eACA,yBAvGA,oBACC,eAGD,0BACC,wBAGD,gCACC,iBAGD,oBACC,OAfgB,KAgBhB,QAjBiB,IAmBjB,aAlBgB,KAmBhB,WACA,8CACA,gBACA,MACA,UACA,aACA,mBAGD,qBAQC,oBAPA,0CACC,cACA,WACA,YACA,WAjCe,KAsChB,8BACC,kBACA,UACA,SAEA,gCACC,mBACA,eACA,sBACA,WACA,4CACA,YACA,sBAGD,uCACC,8CAKF,oCACC,aAEA,0CACC,iBAIF,gCACC,WACA,YACA,iBAGD,kGAEC,eACA,WACA,YACA,WACA,sBACA,qBAGD,8BACC,iBAEA,kDACC,qBACA,QACA,kBAKH,+CACC,kBACA,YAEA,WACA,YACA,WAOD,kBACC,aAGD,oBACC,kBACA,cAEA,gCACC,cACA,aAGD,0BACC,8CAKD,8BACC,cAGD,+BACC,gBAGD,+BACC,mBAEA,oEACC,kBAKD,8DACC,iBAKD,oEACC,kBAMH,wBACC,kBACA,kBAEA,4BACC,mBACA,YAGD,2BACC,mBACA,kBACA,iBACA,iBAEA,mCACC,kBACA,SACA,iBAGD,oCACC,gBAQF,8BACC,gBAMH,KACC,mBACA,mBAGD,SACC,aAGD,mBACC,mBAGD,eACC,gBAOA,+IACC,sBAEA,+KACC,aAGD,mKACC,WACA,YACA,kCACA,qBACA,kBAGD,mOACC,sCAGD,mNACC,sCAGD,mNACC,oCAMF,sBACC,aAGD,YACC,oBAGD,kBACC,kBAGD,yBACC,kBAGD,sBACC,kBAIF,yCACC,kBAGD,wBACC,qBAGD,2BACC,wBAEA,gBACA,aACA,iBACA,sBAKD,WACC,kBACA,2BACA,WAGD,2DAGC,qBAIA,mCACC,qBACA,YACA,iBAGD,+EAEC,YAIF,eACC,WAGD,SACC,iBAGD,QACC,qBACA,YACA,WACA,2BAEA,gBACC,kBAIF,qBACC,sBACA,qBACA,YACA,iBAGD,kBACC,qBACA,gBAIA,aACC,sCACA,mCAGD,WACC,oCAGD,mBACC,sCACA,oBAMF,8CACC,WACA,YAGD,wBACC,WACA,YACA,mBACA,kBACA,+DAIA,oBACC,iBACA,gBAEA,uBACC,cAGD,uBACC,kBAIF,0BACC,YACA,gCAGD,oDACC,yBAGD,wDACC,2BAGD,uBACC,cAKD,oBACC,0BAGD,oCACC,gBAIF,eACC,mBAEA,iBACC,qBACA,cAIF,SACC,UAGD,eACC,iBACA,mBACA,WASA,2CACC,aACA,qBACA,yCAEA,gDAGC,aACA,aACA,WAbgB,KAchB,sBACA,aACA,mBAGA,sBACE,+KASF,4CAEA,yDACC,WAID,iaAOC,UA1CkB,MA4ClB,ooCACC,6BACA,wBACA,uBAKD,odAMC,gBAMD,gPAGC,cACA,gBAIF,qSAKC,UA7EkB,MA+ElB,sWACC,WACA,6BACA,wBAGD,kVACC,cAIF,4DACC,YACA,WAGD,6DACC,aACA,yBACA,gBACA,UACA,eACA,8CAGD,2EACC,WAGD,0DACC,oCACA,wBAID,4DACC,gBACA,kBACA,8CACA,YACA,MAEA,mEACC,mDAIF,4DACC,oCACA,yBAEA,2wBAWC,iBACA,oBACA,oCACA,wBAKD,wGACC,4CAGD,wEACC,sDAIF,qDACC,WAGD,2KAGC,WACA,oBACA,gCACA,YAEA,wQACC,2BACA,eAIA,qfACC,yBAKF,4SACC,WACA,YAGD,0LACC,qBAKA,kcACC,uBACA,YAIF,yYAGC,kBACA,gBACA,gBAIA,uBACA,oBACA,qBACA,4BAGD,wNACC,6BAGD,6LACC,aACA,qBACA,mBACA,kBAEA,wNACC,YACA,gBACA,WAIF,qNACC,cACA,eAEA,4PACC,aAIF,gMACC,YACA,WACA,WAEA,4MACC,cAIF,+MACC,aACA,yBAEA,gPACC,WAGD,wQACC,kBACA,aACA,mBACA,8CAEA,ySACC,WACA,YACA,WACA,eAEA,o7BAGC,WACA,8CAKH,6OACC,aACA,mBACA,mBACA,qCAEA,6RACC,WACA,iBAMH,kQACC,eACA,WAKH,uEACC,aACA,mBACA,uBACA,sBAGD,2DACC,WACA,iBAKH,UACI,+CAGJ,2BACE,GACE,YAGJ,mCACE,GACE","file":"settings.css"} \ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["settings.scss","../../../core/css/functions.scss"],"names":[],"mappings":"AAOC,0BACC,WAKF,OACC,WAID,4BC+CC,2CD3CD,mBC2CC,kDDvCD,qBCuCC,yCDnCD,0BCmCC,wCD/BD,oEC+BC,2CD3BD,oCACC,oBACA,0BACA,+BACA,mBAGD,4BACC,oBACA,kCAGD,yBACC,WAIA,wCACC,kBACA,yDACC,gBAIA,mOACC,WAKH,uCACC,aAGD,sCACC,WAED,uDACC,WAKD,gBACC,WAIF,mBACC,aACA,aACA,iBACA,4DACA,qBAEA,4BACC,kBACA,SAEA,+BACC,mBAIA,qCACC,iBAKH,kCACC,iBACA,mBACA,gBAGD,mGACC,4BACA,kBACA,WAMF,oBACC,kBACA,wCACC,0BACA,8CACC,oDAKH,aACC,qBACA,YACA,kBACA,8CACA,WACA,wCACA,8CACA,6CAEA,0DAGC,mCACA,mDACA,qDAGD,uBACC,kBACA,yBAIF,6BACC,oBACA,kCAEA,mCACC,WAIA,oCACC,kBACA,oBACA,iBACA,2BACA,WACA,mBACA,QAEA,0CACC,mBACA,uBACA,gBAKD,gIACC,kBACA,UACA,UACA,oBACA,YAKH,qCACC,kBACA,UACA,MACA,SAEA,yCACC,qBAIF,4CACC,eAGD,4CACC,sBACA,WACA,YACA,YAMF,qBACC,aACA,WACA,SACA,YAEA,uBACC,aAGD,uCACC,sBACA,cACA,yBAIF,iBACC,kBACA,eACA,WACA,YACA,aACA,SACA,gBACA,YAEA,8CAEC,+CACA,wCAEA,0FACC,WAIF,uCACC,kBACA,qBACA,gCACA,WACA,eAEA,wDACC,qBACA,sBACA,eAIF,sCACC,SAGC,4DAEC,iBACA,kBAEA,kFACC,YAGD,mEACC,oDAEA,kFACC,iBAIF,qEACC,WAEA,eAEA,uEACC,eAQN,gBACC,YAIA,2BACC,kCAGD,mBACC,YAIF,sCAEC,aAGD,eACC,WAGD,YACC,qBAIA,aACC,WACA,yBACA,YAGD,WACC,WACA,yBACA,YAMD,oBACC,iBAGD,iBACC,eAKD,iCACC,aACA,eACA,sBACA,SACA,gDACC,aACA,eACA,sBACA,sDACC,oBAIF,kGACC,cACA,YACA,gBAKA,iEACC,kBACA,UAED,+EACC,oBACA,eACA,wBACA,UAIF,wCACC,WAGD,iDACC,qBAGD,sDACC,kBACA,OACA,WACA,0BACA,eACA,gBACA,WAQF,oBACC,gBAGD,wBACC,iBAGD,oDACC,WACA,YACA,mBACA,wCAOD,oBACC,UACA,cACA,gBACA,uBAGD,2BACC,UAKD,oCAEC,cAKD,wEAEC,aAIF,gBACC,kBACA,QACA,QAEA,sBACC,YAGD,sBACC,iBAKF,WACC,WAEA,cACC,WACA,WACA,4CACA,eACA,kBACA,gBACA,mBAGD,cACC,4CACA,eACA,kBACA,gBACA,mBAKD,gBACC,kBACA,cACA,eACA,uBACA,gBAGD,wBACC,kBAEA,gCACC,kBAIF,sCACC,kBAGD,sDAEC,cACA,eACA,eAEA,0EACC,UACA,qBACA,uBACA,gBAIF,8BACC,eAGD,kCACC,mBACA,cAIF,2BACC,mBAID,4BACC,WACA,SACA,QAGD,0BACC,mBAGD,SACC,gBAKA,oBACC,mBACA,iBACA,WAGD,gCACC,kBAIA,gGACC,cAIF,4BACC,gBAGD,iCACC,gBAGD,8BACC,oCAIF,aACC,gBACA,iBACA,oCAGD,aACC,oCAIA,gBACC,oCACA,+BACA,+CACA,mCACA,gBAGD,aACC,aACA,YACA,mBAGD,qBACC,gCACA,+BACA,kBAGD,sBACC,kCACA,gCACA,+BACA,kBACA,2BAIF,WACC,kBACA,QACA,WAIA,qCACC,aAMD,0BACC,SAGD,2BACC,cACA,aAGD,yDACC,eAGD,8BACC,WAGD,qDACC,WACA,aACA,qBACA,WAGD,kCACC,YAGD,0BACC,gBAMA,4FAEC,qBACA,WACA,YACA,kBACA,WAIF,0CACC,YACA,WAEA,yGAEC,mBAGD,2DACC,YAIF,uFACC,oCAGD,iDACC,cAGD,kDACC,cAGD,sCACC,kBACA,MACA,QACA,aACA,WACA,UACA,WACA,YAGD,wCACC,aACA,mBAEA,oDACC,YAIF,yCACC,0BACA,iBAGD,iOAKC,cAIF,2CACC,gBACC,UAED,kCACC,WAIF,2CACC,gBACC,UAED,kCACC,WAIF,2CACC,gBACC,UAED,kCACC,WAIF,0CACC,gBACC,UAED,kCACC,YAIF,2CACC,gBACC,WAIF,0CACC,gBACC,YAKF,0CAEE,kEACC,yBAKH,0CACC,iCACC,yBAIF,SACC,gBAEA,0BACC,4CAID,YACC,mBAEA,uBACC,iBACA,2BACA,qBAKH,iBACC,cACA,yBAGD,WACC,kBACA,aACA,UACA,gBAGD,6CACC,qBAGD,0DACC,WACA,cACA,eACA,WAGD,2BACC,WACA,kBACA,QAGD,iBACC,WAGD,gBACC,mBAKD,kBACC,0BAGD,kBACC,cAGD,sBACC,mBACA,wBACA,2BAGD,WAyGC,aACA,eACA,yBAvGA,oBACC,eAGD,0BACC,wBAGD,gCACC,iBAGD,oBACC,OAfgB,KAgBhB,QAjBiB,IAmBjB,aAlBgB,KAmBhB,WACA,8CACA,gBACA,MACA,UACA,aACA,mBAGD,qBAQC,oBAPA,0CACC,cACA,WACA,YACA,WAjCe,KAsChB,8BACC,kBACA,UACA,SAEA,gCACC,mBACA,eACA,sBACA,WACA,4CACA,YACA,sBAGD,uCACC,8CAKF,oCACC,aAEA,0CACC,iBAIF,gCACC,WACA,YACA,iBAGD,kGAEC,eACA,WACA,YACA,WACA,sBACA,qBAGD,8BACC,iBAEA,kDACC,qBACA,QACA,kBAKH,+CACC,kBACA,YAEA,WACA,YACA,WAOD,kBACC,aAGD,oBACC,kBACA,cAEA,gCACC,cACA,aAGD,0BACC,8CAKD,8BACC,cAGD,+BACC,gBAGD,+BACC,mBAEA,oEACC,kBAKD,8DACC,iBAKD,oEACC,kBAMH,wBACC,kBACA,kBAEA,4BACC,mBACA,YAGD,2BACC,mBACA,kBACA,iBACA,iBAEA,mCACC,kBACA,SACA,iBAGD,oCACC,gBAQF,8BACC,gBAMH,KACC,mBACA,mBAGD,SACC,aAGD,mBACC,mBAGD,eACC,gBAOA,+IACC,sBAEA,+KACC,aAGD,mKACC,WACA,YACA,kCACA,qBACA,kBAGD,mOACC,sCAGD,mNACC,sCAGD,mNACC,oCAMF,sBACC,aAGD,YACC,oBAGD,kBACC,kBAGD,yBACC,kBAGD,sBACC,kBAIF,yCACC,kBAGD,wBACC,qBAGD,2BACC,wBAEA,gBACA,aACA,iBACA,sBAKD,WACC,kBACA,2BACA,WAGD,2DAGC,qBAIA,mCACC,qBACA,YACA,iBAGD,+EAEC,YAIF,eACC,WAGD,SACC,iBAGD,QACC,qBACA,YACA,WACA,2BAEA,gBACC,kBAIF,qBACC,sBACA,qBACA,YACA,iBAGD,kBACC,qBACA,gBAIA,aACC,sCACA,mCAGD,WACC,oCAGD,mBACC,sCACA,oBAMF,8CACC,WACA,YAGD,wBACC,WACA,YACA,mBACA,kBACA,+DAIA,oBACC,iBACA,gBAEA,uBACC,cAGD,uBACC,kBAIF,0BACC,YACA,gCAGD,oDACC,yBAGD,wDACC,2BAGD,uBACC,cAKD,oBACC,0BAGD,oCACC,gBAIF,eACC,mBAEA,iBACC,qBACA,cAIF,SACC,UAGD,eACC,iBACA,mBACA,WASA,2CACC,aACA,qBACA,yCAEA,gDAGC,aACA,aACA,WAbgB,KAchB,sBACA,aACA,mBAGA,sBACE,+KASF,4CAEA,yDACC,WAID,iaAOC,UA1CkB,MA4ClB,ooCACC,6BACA,wBACA,uBAKD,odAMC,gBAMD,gPAGC,cACA,gBAIF,qSAKC,UA7EkB,MA+ElB,6UACC,WACA,6BACA,wBAGD,kVACC,cAIF,4DACC,YACA,WAGD,6DACC,aACA,yBACA,gBACA,UACA,eACA,8CAGD,2EACC,WAGD,0DACC,oCACA,wBAID,4DACC,gBACA,kBACA,8CACA,YACA,MAEA,mEACC,mDAIF,4DACC,oCACA,yBAEA,2wBAWC,iBACA,oBACA,oCACA,wBAKD,wEACC,sDAIF,qDACC,WAGD,2KAGC,WACA,oBACA,gCACA,YAEA,wQACC,2BACA,eAIA,qfACC,yBAKF,4SACC,WACA,YAGD,0LACC,qBAKA,kcACC,uBACA,YAIF,yYAGC,kBACA,gBACA,gBAIA,uBACA,oBACA,qBACA,4BAGD,wNACC,6BAGD,6LACC,aACA,qBACA,mBACA,kBAEA,wNACC,YACA,gBACA,WAIF,qNACC,cACA,eAEA,4PACC,aAIF,gMACC,YACA,WACA,WAEA,4MACC,cAIF,+MACC,aACA,mBACA,yBAGA,YACA,kBACA,oBACA,8CAKH,uEACC,aACA,mBACA,uBACA,sBAGD,2DACC,WACA,iBAKH,UACI,+CAGJ,2BACE,GACE,YAGJ,mCACE,GACE","file":"settings.css"} \ No newline at end of file
diff --git a/apps/settings/css/settings.scss b/apps/settings/css/settings.scss
index c44242513dd..e80c20d39fc 100644
--- a/apps/settings/css/settings.scss
+++ b/apps/settings/css/settings.scss
@@ -1386,7 +1386,7 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
// Scroll if too much groups
&:not(.row--editable) {
.groups,
- .subadmins,
+ .subadmins,
.subAdminsGroups {
overflow: auto;
max-height: 100%;
@@ -1395,12 +1395,12 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
.managers,
.groups,
- .subadmins,
+ .subadmins,
.subAdminsGroups,
.quota {
min-width: $grid-col-min-width;
- .multiselect {
+ .select {
width: 100%;
color: var(--color-text-dark);
vertical-align: baseline;
@@ -1470,10 +1470,6 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
}
&:hover {
- input:not([type='submit']):not(:focus):not(:active) {
- border-color: var(--color-border) !important;
- }
-
&:not(#grid-header) {
box-shadow: 5px 0 0 var(--color-primary-element) inset;
}
@@ -1573,50 +1569,14 @@ doesnotexist:-o-prefocus, .strengthify-wrapper {
&.userActions {
display: flex;
+ align-items: center;
justify-content: flex-end;
- #newsubmit {
- width: 100%;
- }
-
- .toggleUserActions {
- position: relative;
- display: flex;
- align-items: center;
- background-color: var(--color-main-background);
-
- .icon-more {
- width: 44px;
- height: 44px;
- opacity: .5;
- cursor: pointer;
-
- &:focus,
- &:hover,
- &:active {
- opacity: .7;
- background-color: var(--color-background-dark)
- }
- }
- }
-
- .feedback {
- display: flex;
- align-items: center;
- white-space: nowrap;
- transition: opacity 200ms ease-in-out;
-
- .icon-checkmark {
- opacity: .5;
- margin-right: 5px;
- }
- }
- }
-
- /* Fill the grid cell */
- .multiselect.multiselect-vue {
- min-width: 100%;
- width: 100%;
+ // Make sure to cover whole row
+ height: 100%;
+ width: fit-content;
+ padding-inline: 12px;
+ background-color: var(--color-main-background);
}
}
}
diff --git a/apps/settings/l10n/af.js b/apps/settings/l10n/af.js
index 0129f0f75e2..6ea24eb9471 100644
--- a/apps/settings/l10n/af.js
+++ b/apps/settings/l10n/af.js
@@ -111,6 +111,7 @@ OC.L10N.register(
"Check out our blog" : "Besoek ons woernaal",
"Subscribe to our newsletter" : "Teken in op ons nuusbrief",
"png or jpg, max. 20 MB" : "png of jpg, maks. 20 MB",
+ "SSL/TLS" : "SSL/TLS",
"STARTTLS" : "STARTTLS"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/settings/l10n/af.json b/apps/settings/l10n/af.json
index a0e0a6b9b4b..61ac5d6f52f 100644
--- a/apps/settings/l10n/af.json
+++ b/apps/settings/l10n/af.json
@@ -109,6 +109,7 @@
"Check out our blog" : "Besoek ons woernaal",
"Subscribe to our newsletter" : "Teken in op ons nuusbrief",
"png or jpg, max. 20 MB" : "png of jpg, maks. 20 MB",
+ "SSL/TLS" : "SSL/TLS",
"STARTTLS" : "STARTTLS"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/ar.js b/apps/settings/l10n/ar.js
index e9fcb4aa3c8..a6d265e843d 100644
--- a/apps/settings/l10n/ar.js
+++ b/apps/settings/l10n/ar.js
@@ -18,6 +18,7 @@ OC.L10N.register(
"Strong password" : "كلمة السر قوية",
"Groups" : "مجموعات",
"Group list is empty" : "قائمة المجموعة فارغة",
+ "Unable to retrieve the group list" : "تعذر استرداد قائمة المجموعة",
"{actor} changed your password" : "{actor} قام بتغيير كلمتك السرية",
"You changed your password" : "لقد قمت بتعديل كلمة مرورك",
"Your password was reset by an administrator" : "قام أحد المدراء بإعادة تعيين كلمة مرورك",
@@ -25,32 +26,54 @@ OC.L10N.register(
"You changed your email address" : "لقد قمت بتعديل عنوان بريدك الإلكتروني",
"Your email address was changed by an administrator" : "قام أحد المدراء بتغيير عنوان بريدك الإلكتروني",
"Security" : "الأمان",
+ "You successfully logged in using two-factor authentication (%1$s)" : "لقد قمت بتسجيل الدخول بنجاح باستخدام المصادقة ثنائية العوامل (%1$s)",
+ "A login attempt using two-factor authentication failed (%1$s)" : "فشلت محاولة تسجيل الدخول باستخدام المصادقة ثنائية العوامل (%1$s)",
+ "Your <strong>password</strong> or <strong>email</strong> was modified" : "تمّ تعديل</strong> كلمة المرور</strong> أو <strong>البريد الإلكتروني الخاص بك",
"Apps" : "التطبيقات",
"Wrong password" : "كلمة مرور خاطئة",
"Saved" : "حفظ",
"No user supplied" : "لم يتم توفير مستخدم ",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
+ "Please provide an admin recovery password; otherwise, all user data will be lost." : "يرجى تقديم كلمة مرور استرداد المسؤول؛ وإلا ستفقد كافة بيانات المستخدم.",
"Wrong admin recovery password. Please check the password and try again." : "خطا في كلمة مرور الاستعادة الخاصة بالمسؤول, يرجى التاكد من كلمة المرور والمحاولة مرة اخرى.",
"Federated Cloud Sharing" : "المشاركة السحابية الموحّدة",
+ "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "برنامج كرل \"cURL\" يستخدم نسخة%1$sقديمة (%2$s).يرجي تحديث نظام التشغيل الخاص بك أو أن الخصائص مثل%3$s لن تعمل بشكل موثوق.",
"Administrator documentation" : "دليل المدير",
"User documentation" : "دليل المستخدم",
"Invalid SMTP password." : "كلمة مرور SMTP خاطئة.",
"Email setting test" : "تجريب إعدادات البريد الإلكتروني",
"Well done, %s!" : "حسنًا فعلت، %s !",
+ "If you received this email, the email configuration seems to be correct." : "إذا تلقيت هذا البريد الإلكتروني ، فيبدو أن تهيئة البريد الإلكتروني صحيحة.",
+ "Email could not be sent. Check your mail server log" : "تعذر إرسال البريد الإلكتروني. تحقق من سجل خادم البريد الخاص بك",
"A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "حدث خطأ أثناء إرسال البريد الإلكتروني. برجى مراجعة الاعدادات. (خطأ: %s)",
"Users" : "المستخدمين:",
"Invalid user" : "مستخدم غير صالح",
"Invalid mail address" : "عنوان البريد الإلكتروني خاطئ",
"Settings saved" : "تم حفظ الإعدادات",
"Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل",
+ "Unable to change email address" : "تعذر تغيير عنوان بريدك الإلكتروني",
+ "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "من أجل التحقق من حساب تويتر \"Twitter \"الخاص بك، قم بنشر التغريدة التالية على تويتر (يرجى التأكد من نشرها دون وجود أي فواصل بين الأسطر):",
+ "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "من أجل التحقق من موقع الويب الخاص بك، قم بتخزين المحتوى التالي في جذر الويب/ الدليل الرئيسي الخاص بك على \" well-known/CloudIdVerificationCode.txt\" (يرجى التأكد من أن النص الكامل موجود في سطر واحد):",
+ "%1$s changed your password on %2$s." : "%1$s قام بتغيير كلمة المرور الخاصة بك في%2$s.",
+ "Your password on %s was changed." : "تم تغيير كلمة المرور الخاصة بك علي %s",
+ "Your password on %s was reset by an administrator." : "تم إعادة تعيين كلمة المرور الخاصة بك علي %s من قبل المسئول.",
+ "Password for %1$s changed on %2$s" : "تم تغيير كلمة المرور لـ %1$s في %2$s",
"Password changed for %s" : "تم تعديل كلمة سر %s",
+ "If you did not request this, please contact an administrator." : "إذا لم تكن قد قمت بطلب هذا، يرجى الاتصال بالمسؤول.",
+ "Your email address on %s was changed." : "تم تغيير عنوان البريد الإلكتروني الخاص بك علي %s.",
+ "Your email address on %s was changed by an administrator." : "تم تغيير عنوان البريد الإلكتروني الخاص بك علي %sمن قبل المسئول.",
+ "Email address for %1$s changed on %2$s" : "تم تغيير بريدك الإلكتروني لـ %1$s في %2$s",
+ "Email address changed for %s" : "تم تغيير عنوان البريد الإلكتروني لـ%s",
+ "The new email address is %s" : "عنوان البريد الإلكتروني الجديد هو %s",
"Your %s account was created" : "تم إنشاء حسابك %s",
"Welcome aboard" : "مرحبًا بكم على متن ناكست كلاود",
"Welcome aboard %s" : "مرحبًا بكم على متن ناكست كلاود يا %s",
+ "Welcome to your %s account, you can add, protect, and share your data." : "مرحبًا بك في حساب %s الخاص بك، يمكنك إضافة وحماية ومشاركة البيانات الخاصة بك.",
"Your username is: %s" : "إسم المستخدم الخاص بك هو : %s",
"Set your password" : "قم بإدخال كلمتك السرية",
"Go to %s" : "الإنتقال إلى %s",
"Install Client" : "تنصيب العميل",
+ "Logged in user must be a subadmin" : "يجب أن يكون المستخدم الذي قام بتسجيل الدخول مسئولا فرعيًا",
"Settings" : "الإعدادات",
"Personal" : "شخصي",
"Administration" : "الإدارة",
@@ -107,22 +130,29 @@ OC.L10N.register(
"Safari" : "سفاري",
"Google Chrome for Android" : "غوغل كروم لنظام الأندرويد",
"iPhone" : "الآيفون",
+ "Sync client - {os}" : "عميل المزامنة - {نظام التشغيل os}",
"This session" : "هذه الجلسة",
"Device" : "الجهاز",
"Last activity" : "آخر نشاط",
+ "Devices & sessions" : "الأجهزة والجلسات",
+ "Web, desktop and mobile clients currently logged in to your account." : "قام حاليًا عملاء الويب وسطح المكتب والجوال بتسجيل الدخول إلى حسابك.",
"Error while creating device token" : "خطأ اثناء إنشاء Token للجهاز.",
"Error while deleting the token" : "خطأ في حذف Token",
"App name" : "إسم التطبيق",
"Create new app password" : "إنشاء كلمة سرية جديدة للتطبيق",
"Use the credentials below to configure your app or device." : "استخدم معلومات تسجيل الدخول التالية لضبط تطبيقك أو جهازك.",
+ "For security reasons this password will only be shown once." : " تظهر كلمة المرور هذه لمرة واحدة فقط وذلك لأسباب أمنية.",
"Username" : "إسم المستخدم",
"Password" : "كلمة المرور",
"Done" : "تم",
"Copied!" : "تم نسخه !",
"Copy" : "نسخ",
+ "Last job ran {relativeTime}." : "آخر مهمة JOB جرت في {relativeTime}.",
+ "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "لتشغيل هذا تحتاج إلى ملحق لغة برمجة الصفحة الرئيسية الشخصية لواجهة برمجة التطبيقات بوزيكس \"PHP POSIX\". راجع {linkstart} وثائق لغة برمجة الصفحة الرئيسية الشخصية \"PHP \" {لينكدإن} لمزيد من التفاصيل.",
"Profile" : "الملف الشخصي",
"Enable" : "تفعيل",
"Server-side encryption" : "التشفير مِن جانب الخادم",
+ "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "يتيح التشفير من جانب الخادم إمكانية تشفير الملفات التي يتم رفعها على هذا الخادم. ولكن هذا الأمر مقترن بقيود مثل عقوبة الأداء ، لذا قم بتمكين الخاصية فقط إذا لزم الأمر.",
"Enable server-side encryption" : "تشغيل التشفير مِن جانب الخادوم",
"Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "في حال تفعيل التشفير، عملية رفع الملف المشفر سيتم تفعيلها في الخادم. يمكن تعطيل التشفير في وقت لاحق فقط اذا كانت حزمة التشفير المفعلة تدعم التعطيل، وجميع الشروط الاخرى (على سبيل المثال اعداد رمز الاستعادة) مشمول ضمن الحزمة.",
"Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "التشفير لوحدها لا تضمن حماية النظام بشكل كامل. يرجى اتباع التعليمات لمزيد من المعلومات والحصول على معلومات عن عمل تطبيق التشفير، واستخداماته العديد.",
@@ -132,6 +162,8 @@ OC.L10N.register(
"No encryption module loaded, please enable an encryption module in the app menu." : "لم يتم تحميل حزمة التشفير، يرجى تفعيل حزمة التشفير من قائمة التطبيق.",
"Select default encryption module:" : "اختر حزمة التشفير الافتراضية:",
"Remove group" : "حذف الفريق",
+ "You are about to remove the group {group}. The users will NOT be deleted." : "أنت على وشك نقل المجموعة {المجموعة}. لن يتم حذف المستخدمين.",
+ "Please confirm the group removal " : "يرجى تأكيد نقل المجموعة",
"Current password" : "كلمات السر الحالية",
"New password" : "كلمات سر جديدة",
"Change password" : "عدل كلمة السر",
@@ -143,6 +175,7 @@ OC.L10N.register(
"No email address set" : "لم يتم تعيين بريد الكتروني",
"Language" : "اللغة",
"Help translate" : "ساعد في الترجمة",
+ "Locale" : "محلي",
"Your city" : "مدينتك",
"Your phone number" : "رقم هاتفك",
"Add" : "إضافة",
@@ -150,10 +183,13 @@ OC.L10N.register(
"Email" : "البريد الإلكترونى",
"Group admin for" : "فريق المُدراء لـ",
"Quota" : "حصه",
+ "User backend" : "الواجهة الخلفية للمستخدم",
"Storage location" : "مسار التخزين",
"Last login" : "آخِر تسجيل للدخول",
"Default quota" : "الحصة الافتراضية",
"Default language" : "اللغة الافتراضية",
+ "Common languages" : "اللغات الشائعة",
+ "Password change is disabled because the master key is disabled" : "تم تعطيل تغيير كلمة المرور لأن المفتاح الرئيسي معطل",
"New user" : "مستخدم جديد",
"Either password or email is required" : "مطلوب كلمة المرور أو البريد الإلكتروني",
"Password (required)" : "كلمة المرور (مطلوبة)",
@@ -168,13 +204,24 @@ OC.L10N.register(
"Add new user" : "إضافة مستخدِم جديد",
"Username will be autogenerated" : "يتم توليد وإنشاء اسم المستخدم تلقائيا",
"Username (required)" : "اسم المستخدم (مطلوب)",
+ "You do not have permissions to see the details of this user" : "ليس لديك أذونات لمشاهدة بيانات هذا المستخدم",
"Delete user" : "احذف المستخدم",
+ "Disable user" : "تعطيل المستخدم",
+ "Enable user" : "تمكين المستخدم",
+ "Resend welcome email" : "إعادة إرسال رسالة بريد الإلكتروني ترحيبية",
+ "Wiped {userid}'s devices" : "تم محو أجهزة {معرفالمستخدم}",
+ "Update of user manager was failed" : "فشل تحديث مدير المستخدم",
"Account deletion" : "حذف حساب",
+ "Display name was successfully changed" : "تم تغيير عرض الاسم بنجاح",
+ "Password was successfully changed" : "تم تغيير كلمة السر بنجاح",
+ "Email was successfully changed" : "تم تغيير البريد الإلكتروني بنجاح",
"Welcome mail sent!" : "تم إرسال بريد الترحيب!",
- "Edit User" : "تعديل المستخدم",
+ "Edit" : "تعديل",
+ "{size} used" : "{حجم} مستخدم",
"Name your device" : "اسم جهازك",
"Your browser does not support WebAuthn." : "متصفحك لا يدعم WebAuthn.",
"Your apps" : "تطبيقاتك",
+ "{license}-licensed" : "{الترخيص} - مرخص",
"Changelog" : "سجل التغييرات",
"Add group" : "إضافة فريق",
"Active users" : "المستخدمون النشطون",
@@ -182,6 +229,7 @@ OC.L10N.register(
"Disabled users" : "المستخدمون المُعطَّلون",
"Default quota:" : "الحصة الافتراضية:",
"Show languages" : "اعرض اللغات",
+ "Show last login" : "عرض آخر تسجيل دخول",
"Show user backend" : "عرض مستخدم لوحة التحكم الرئيسية",
"Not saved" : "لم يتم حفظه",
"Sending…" : "جارٍ الإرسال …",
@@ -190,6 +238,8 @@ OC.L10N.register(
"Profile picture" : "صورة الملف الشخصي",
"About" : "عن",
"Full name" : "الإسم الكامل",
+ "Headline" : "عنوان ",
+ "Organisation" : "مؤسسة",
"Phone number" : "رقم الهاتف",
"Role" : "الدور",
"Twitter" : "تويتر",
@@ -200,13 +250,17 @@ OC.L10N.register(
"App bundles" : "حُزَم التطبيقات",
"Featured apps" : "تطبيقات مُميّزة",
"Hide" : "إخفاء",
+ "Download and enable" : "تنزيل وتمكين",
"Never" : "أبدا",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "تم تمكين التطبيق ولكنه يحتاج إلى التحديث. ستتم إعادة توجيهك إلى صفحة التحديث خلال 5 ثوانٍ.",
"There were too many requests from your network. Retry later or contact your administrator if this is an error." : "يوجد طلبات أقصى من الحد المسموح به في الشبكة. أعد المحاولة أو اتصل بمسؤول النظام.",
"Documentation" : "الدليل",
"Forum" : "منتدى",
"Login" : "تسجيل الدخول",
+ "None/STARTTLS" : "لا يوجد/ بروتوكول أمر ستارت تي ال اس STARTTLS",
"SSL" : "طبقة المنافذ الآمنة",
"Open documentation" : "فتح الدليل",
+ "It is important to set up this server to be able to send emails, like for password reset and notifications." : "من المهم تنصيب هذا الخادم لتتمكن من إرسال رسائل البريد الإلكتروني، والمثل بالنسبة لإعادة تعيين كلمة المرور والإشعارات.",
"Send mode" : "وضعية الإرسال",
"Encryption" : "التشفير",
"From address" : "عنوان الإرسال",
@@ -219,8 +273,15 @@ OC.L10N.register(
"SMTP Password" : "كلمة مرور الـ SMTP",
"Save" : "حفظ",
"Send email" : "إرسال بريد إلكتروني",
+ "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "من المهم لأمان النموذج وأدائه أن يتم تكوين كل شيء بشكل صحيح. لمساعدتك في ذلك، نقوم ببعض الفحوصات التلقائية. يرجى الاطلاع على الوثائق ذات الصلة لمزيد من المعلومات.",
"All checks passed." : "تم اجتياز جميع الاختبارات.",
+ "There are some errors regarding your setup." : "هناك بعض الأخطاء بخصوص الإعداد الخاص بك.",
+ "There are some warnings regarding your setup." : "هناك بعض التحذيرات بخصوص الإعداد الخاص بك.",
+ "Checking for system and security issues." : "التحقق من مشاكل النظام والأمان.",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%2$s\">log</a>." : "يرجى إعادة التحقق مرة أخرى من<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\"> أدلة تثبيت ↗</a>، والتحقق من وجود أية أخطاء أو تحذيرات في <a href=\"%2$s\">السجل</a>.",
+ "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "تحقق من أمان نكست كلود الخاص بك من خلال <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">فحص الأمان لدينا ↗</a>.",
"Version" : "إصدار",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "يمكنك بصفتك مسئولا ضبط وضع المشاركة. يرجى الاطلاع على التوثيق لمزيد من المعلومات.",
"Allow apps to use the Share API" : "السماح للتطبيقات بالمشاركة عن طريق الAPI",
"Enforce expiration date" : "فرض تاريخ نهاية صلاحية",
"Allow public uploads" : "السماح بالرفع للعامة ",
@@ -232,12 +293,17 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "سماح المستخدمين للمشاركة ضمن مجموعتهم فقط.",
"Exclude groups from sharing" : "استبعاد المجموعات من المشاركة",
"These groups will still be able to receive shares, but not to initiate them." : "هذه المجموعات لا زالت تستقبل المشاركات، لكن غير مطلعين عليها.",
+ "This text will be shown on the public link upload page when the file list is hidden." : "يظهر هذا النص في صفحة تحميل الرابط العام عندما تكون قائمة الملفات مخفية.",
+ "Default share permissions" : "أذونات المشاركة الافتراضية",
+ "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "تم تطويره بواسطة {communityopen} نكست كلود كوميونتي {linkclose}، كود مصدر {جت هب اوبن} {linkclose} مرخص بموجب {Licenseopen} رخصة برمجيات جنو أفيرو العمومية {linkclose}",
"Like our Facebook page" : "قم بالإعجاب بصفحتنا على الفايسبوك",
"Follow us on Twitter" : "تابعونا على تويتر",
"Follow us on Mastodon" : "تابعونا على ماستدون",
"Check out our blog" : "إلقي نظرة على مدوّنتنا",
+ "Subscribe to our newsletter" : "الاشتراك في نشرتنا الإخبارية",
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "إصدار المجتمع هذا من Nextcloud غير مدعوم والإشعارات الفورية غير متاحة.",
"png or jpg, max. 20 MB" : "صيغة png أو jpg و حجم أقصاه 20 م.ب",
+ "Edit User" : "تعديل المستخدم",
"Add a new user" : "إضافة مستخدِم جديد",
"Show Languages" : "اعرض اللغات",
"Plain" : "سادة",
diff --git a/apps/settings/l10n/ar.json b/apps/settings/l10n/ar.json
index ba0c6cfd399..b719a71931b 100644
--- a/apps/settings/l10n/ar.json
+++ b/apps/settings/l10n/ar.json
@@ -16,6 +16,7 @@
"Strong password" : "كلمة السر قوية",
"Groups" : "مجموعات",
"Group list is empty" : "قائمة المجموعة فارغة",
+ "Unable to retrieve the group list" : "تعذر استرداد قائمة المجموعة",
"{actor} changed your password" : "{actor} قام بتغيير كلمتك السرية",
"You changed your password" : "لقد قمت بتعديل كلمة مرورك",
"Your password was reset by an administrator" : "قام أحد المدراء بإعادة تعيين كلمة مرورك",
@@ -23,32 +24,54 @@
"You changed your email address" : "لقد قمت بتعديل عنوان بريدك الإلكتروني",
"Your email address was changed by an administrator" : "قام أحد المدراء بتغيير عنوان بريدك الإلكتروني",
"Security" : "الأمان",
+ "You successfully logged in using two-factor authentication (%1$s)" : "لقد قمت بتسجيل الدخول بنجاح باستخدام المصادقة ثنائية العوامل (%1$s)",
+ "A login attempt using two-factor authentication failed (%1$s)" : "فشلت محاولة تسجيل الدخول باستخدام المصادقة ثنائية العوامل (%1$s)",
+ "Your <strong>password</strong> or <strong>email</strong> was modified" : "تمّ تعديل</strong> كلمة المرور</strong> أو <strong>البريد الإلكتروني الخاص بك",
"Apps" : "التطبيقات",
"Wrong password" : "كلمة مرور خاطئة",
"Saved" : "حفظ",
"No user supplied" : "لم يتم توفير مستخدم ",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
+ "Please provide an admin recovery password; otherwise, all user data will be lost." : "يرجى تقديم كلمة مرور استرداد المسؤول؛ وإلا ستفقد كافة بيانات المستخدم.",
"Wrong admin recovery password. Please check the password and try again." : "خطا في كلمة مرور الاستعادة الخاصة بالمسؤول, يرجى التاكد من كلمة المرور والمحاولة مرة اخرى.",
"Federated Cloud Sharing" : "المشاركة السحابية الموحّدة",
+ "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "برنامج كرل \"cURL\" يستخدم نسخة%1$sقديمة (%2$s).يرجي تحديث نظام التشغيل الخاص بك أو أن الخصائص مثل%3$s لن تعمل بشكل موثوق.",
"Administrator documentation" : "دليل المدير",
"User documentation" : "دليل المستخدم",
"Invalid SMTP password." : "كلمة مرور SMTP خاطئة.",
"Email setting test" : "تجريب إعدادات البريد الإلكتروني",
"Well done, %s!" : "حسنًا فعلت، %s !",
+ "If you received this email, the email configuration seems to be correct." : "إذا تلقيت هذا البريد الإلكتروني ، فيبدو أن تهيئة البريد الإلكتروني صحيحة.",
+ "Email could not be sent. Check your mail server log" : "تعذر إرسال البريد الإلكتروني. تحقق من سجل خادم البريد الخاص بك",
"A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "حدث خطأ أثناء إرسال البريد الإلكتروني. برجى مراجعة الاعدادات. (خطأ: %s)",
"Users" : "المستخدمين:",
"Invalid user" : "مستخدم غير صالح",
"Invalid mail address" : "عنوان البريد الإلكتروني خاطئ",
"Settings saved" : "تم حفظ الإعدادات",
"Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل",
+ "Unable to change email address" : "تعذر تغيير عنوان بريدك الإلكتروني",
+ "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "من أجل التحقق من حساب تويتر \"Twitter \"الخاص بك، قم بنشر التغريدة التالية على تويتر (يرجى التأكد من نشرها دون وجود أي فواصل بين الأسطر):",
+ "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "من أجل التحقق من موقع الويب الخاص بك، قم بتخزين المحتوى التالي في جذر الويب/ الدليل الرئيسي الخاص بك على \" well-known/CloudIdVerificationCode.txt\" (يرجى التأكد من أن النص الكامل موجود في سطر واحد):",
+ "%1$s changed your password on %2$s." : "%1$s قام بتغيير كلمة المرور الخاصة بك في%2$s.",
+ "Your password on %s was changed." : "تم تغيير كلمة المرور الخاصة بك علي %s",
+ "Your password on %s was reset by an administrator." : "تم إعادة تعيين كلمة المرور الخاصة بك علي %s من قبل المسئول.",
+ "Password for %1$s changed on %2$s" : "تم تغيير كلمة المرور لـ %1$s في %2$s",
"Password changed for %s" : "تم تعديل كلمة سر %s",
+ "If you did not request this, please contact an administrator." : "إذا لم تكن قد قمت بطلب هذا، يرجى الاتصال بالمسؤول.",
+ "Your email address on %s was changed." : "تم تغيير عنوان البريد الإلكتروني الخاص بك علي %s.",
+ "Your email address on %s was changed by an administrator." : "تم تغيير عنوان البريد الإلكتروني الخاص بك علي %sمن قبل المسئول.",
+ "Email address for %1$s changed on %2$s" : "تم تغيير بريدك الإلكتروني لـ %1$s في %2$s",
+ "Email address changed for %s" : "تم تغيير عنوان البريد الإلكتروني لـ%s",
+ "The new email address is %s" : "عنوان البريد الإلكتروني الجديد هو %s",
"Your %s account was created" : "تم إنشاء حسابك %s",
"Welcome aboard" : "مرحبًا بكم على متن ناكست كلاود",
"Welcome aboard %s" : "مرحبًا بكم على متن ناكست كلاود يا %s",
+ "Welcome to your %s account, you can add, protect, and share your data." : "مرحبًا بك في حساب %s الخاص بك، يمكنك إضافة وحماية ومشاركة البيانات الخاصة بك.",
"Your username is: %s" : "إسم المستخدم الخاص بك هو : %s",
"Set your password" : "قم بإدخال كلمتك السرية",
"Go to %s" : "الإنتقال إلى %s",
"Install Client" : "تنصيب العميل",
+ "Logged in user must be a subadmin" : "يجب أن يكون المستخدم الذي قام بتسجيل الدخول مسئولا فرعيًا",
"Settings" : "الإعدادات",
"Personal" : "شخصي",
"Administration" : "الإدارة",
@@ -105,22 +128,29 @@
"Safari" : "سفاري",
"Google Chrome for Android" : "غوغل كروم لنظام الأندرويد",
"iPhone" : "الآيفون",
+ "Sync client - {os}" : "عميل المزامنة - {نظام التشغيل os}",
"This session" : "هذه الجلسة",
"Device" : "الجهاز",
"Last activity" : "آخر نشاط",
+ "Devices & sessions" : "الأجهزة والجلسات",
+ "Web, desktop and mobile clients currently logged in to your account." : "قام حاليًا عملاء الويب وسطح المكتب والجوال بتسجيل الدخول إلى حسابك.",
"Error while creating device token" : "خطأ اثناء إنشاء Token للجهاز.",
"Error while deleting the token" : "خطأ في حذف Token",
"App name" : "إسم التطبيق",
"Create new app password" : "إنشاء كلمة سرية جديدة للتطبيق",
"Use the credentials below to configure your app or device." : "استخدم معلومات تسجيل الدخول التالية لضبط تطبيقك أو جهازك.",
+ "For security reasons this password will only be shown once." : " تظهر كلمة المرور هذه لمرة واحدة فقط وذلك لأسباب أمنية.",
"Username" : "إسم المستخدم",
"Password" : "كلمة المرور",
"Done" : "تم",
"Copied!" : "تم نسخه !",
"Copy" : "نسخ",
+ "Last job ran {relativeTime}." : "آخر مهمة JOB جرت في {relativeTime}.",
+ "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "لتشغيل هذا تحتاج إلى ملحق لغة برمجة الصفحة الرئيسية الشخصية لواجهة برمجة التطبيقات بوزيكس \"PHP POSIX\". راجع {linkstart} وثائق لغة برمجة الصفحة الرئيسية الشخصية \"PHP \" {لينكدإن} لمزيد من التفاصيل.",
"Profile" : "الملف الشخصي",
"Enable" : "تفعيل",
"Server-side encryption" : "التشفير مِن جانب الخادم",
+ "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "يتيح التشفير من جانب الخادم إمكانية تشفير الملفات التي يتم رفعها على هذا الخادم. ولكن هذا الأمر مقترن بقيود مثل عقوبة الأداء ، لذا قم بتمكين الخاصية فقط إذا لزم الأمر.",
"Enable server-side encryption" : "تشغيل التشفير مِن جانب الخادوم",
"Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "في حال تفعيل التشفير، عملية رفع الملف المشفر سيتم تفعيلها في الخادم. يمكن تعطيل التشفير في وقت لاحق فقط اذا كانت حزمة التشفير المفعلة تدعم التعطيل، وجميع الشروط الاخرى (على سبيل المثال اعداد رمز الاستعادة) مشمول ضمن الحزمة.",
"Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "التشفير لوحدها لا تضمن حماية النظام بشكل كامل. يرجى اتباع التعليمات لمزيد من المعلومات والحصول على معلومات عن عمل تطبيق التشفير، واستخداماته العديد.",
@@ -130,6 +160,8 @@
"No encryption module loaded, please enable an encryption module in the app menu." : "لم يتم تحميل حزمة التشفير، يرجى تفعيل حزمة التشفير من قائمة التطبيق.",
"Select default encryption module:" : "اختر حزمة التشفير الافتراضية:",
"Remove group" : "حذف الفريق",
+ "You are about to remove the group {group}. The users will NOT be deleted." : "أنت على وشك نقل المجموعة {المجموعة}. لن يتم حذف المستخدمين.",
+ "Please confirm the group removal " : "يرجى تأكيد نقل المجموعة",
"Current password" : "كلمات السر الحالية",
"New password" : "كلمات سر جديدة",
"Change password" : "عدل كلمة السر",
@@ -141,6 +173,7 @@
"No email address set" : "لم يتم تعيين بريد الكتروني",
"Language" : "اللغة",
"Help translate" : "ساعد في الترجمة",
+ "Locale" : "محلي",
"Your city" : "مدينتك",
"Your phone number" : "رقم هاتفك",
"Add" : "إضافة",
@@ -148,10 +181,13 @@
"Email" : "البريد الإلكترونى",
"Group admin for" : "فريق المُدراء لـ",
"Quota" : "حصه",
+ "User backend" : "الواجهة الخلفية للمستخدم",
"Storage location" : "مسار التخزين",
"Last login" : "آخِر تسجيل للدخول",
"Default quota" : "الحصة الافتراضية",
"Default language" : "اللغة الافتراضية",
+ "Common languages" : "اللغات الشائعة",
+ "Password change is disabled because the master key is disabled" : "تم تعطيل تغيير كلمة المرور لأن المفتاح الرئيسي معطل",
"New user" : "مستخدم جديد",
"Either password or email is required" : "مطلوب كلمة المرور أو البريد الإلكتروني",
"Password (required)" : "كلمة المرور (مطلوبة)",
@@ -166,13 +202,24 @@
"Add new user" : "إضافة مستخدِم جديد",
"Username will be autogenerated" : "يتم توليد وإنشاء اسم المستخدم تلقائيا",
"Username (required)" : "اسم المستخدم (مطلوب)",
+ "You do not have permissions to see the details of this user" : "ليس لديك أذونات لمشاهدة بيانات هذا المستخدم",
"Delete user" : "احذف المستخدم",
+ "Disable user" : "تعطيل المستخدم",
+ "Enable user" : "تمكين المستخدم",
+ "Resend welcome email" : "إعادة إرسال رسالة بريد الإلكتروني ترحيبية",
+ "Wiped {userid}'s devices" : "تم محو أجهزة {معرفالمستخدم}",
+ "Update of user manager was failed" : "فشل تحديث مدير المستخدم",
"Account deletion" : "حذف حساب",
+ "Display name was successfully changed" : "تم تغيير عرض الاسم بنجاح",
+ "Password was successfully changed" : "تم تغيير كلمة السر بنجاح",
+ "Email was successfully changed" : "تم تغيير البريد الإلكتروني بنجاح",
"Welcome mail sent!" : "تم إرسال بريد الترحيب!",
- "Edit User" : "تعديل المستخدم",
+ "Edit" : "تعديل",
+ "{size} used" : "{حجم} مستخدم",
"Name your device" : "اسم جهازك",
"Your browser does not support WebAuthn." : "متصفحك لا يدعم WebAuthn.",
"Your apps" : "تطبيقاتك",
+ "{license}-licensed" : "{الترخيص} - مرخص",
"Changelog" : "سجل التغييرات",
"Add group" : "إضافة فريق",
"Active users" : "المستخدمون النشطون",
@@ -180,6 +227,7 @@
"Disabled users" : "المستخدمون المُعطَّلون",
"Default quota:" : "الحصة الافتراضية:",
"Show languages" : "اعرض اللغات",
+ "Show last login" : "عرض آخر تسجيل دخول",
"Show user backend" : "عرض مستخدم لوحة التحكم الرئيسية",
"Not saved" : "لم يتم حفظه",
"Sending…" : "جارٍ الإرسال …",
@@ -188,6 +236,8 @@
"Profile picture" : "صورة الملف الشخصي",
"About" : "عن",
"Full name" : "الإسم الكامل",
+ "Headline" : "عنوان ",
+ "Organisation" : "مؤسسة",
"Phone number" : "رقم الهاتف",
"Role" : "الدور",
"Twitter" : "تويتر",
@@ -198,13 +248,17 @@
"App bundles" : "حُزَم التطبيقات",
"Featured apps" : "تطبيقات مُميّزة",
"Hide" : "إخفاء",
+ "Download and enable" : "تنزيل وتمكين",
"Never" : "أبدا",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "تم تمكين التطبيق ولكنه يحتاج إلى التحديث. ستتم إعادة توجيهك إلى صفحة التحديث خلال 5 ثوانٍ.",
"There were too many requests from your network. Retry later or contact your administrator if this is an error." : "يوجد طلبات أقصى من الحد المسموح به في الشبكة. أعد المحاولة أو اتصل بمسؤول النظام.",
"Documentation" : "الدليل",
"Forum" : "منتدى",
"Login" : "تسجيل الدخول",
+ "None/STARTTLS" : "لا يوجد/ بروتوكول أمر ستارت تي ال اس STARTTLS",
"SSL" : "طبقة المنافذ الآمنة",
"Open documentation" : "فتح الدليل",
+ "It is important to set up this server to be able to send emails, like for password reset and notifications." : "من المهم تنصيب هذا الخادم لتتمكن من إرسال رسائل البريد الإلكتروني، والمثل بالنسبة لإعادة تعيين كلمة المرور والإشعارات.",
"Send mode" : "وضعية الإرسال",
"Encryption" : "التشفير",
"From address" : "عنوان الإرسال",
@@ -217,8 +271,15 @@
"SMTP Password" : "كلمة مرور الـ SMTP",
"Save" : "حفظ",
"Send email" : "إرسال بريد إلكتروني",
+ "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "من المهم لأمان النموذج وأدائه أن يتم تكوين كل شيء بشكل صحيح. لمساعدتك في ذلك، نقوم ببعض الفحوصات التلقائية. يرجى الاطلاع على الوثائق ذات الصلة لمزيد من المعلومات.",
"All checks passed." : "تم اجتياز جميع الاختبارات.",
+ "There are some errors regarding your setup." : "هناك بعض الأخطاء بخصوص الإعداد الخاص بك.",
+ "There are some warnings regarding your setup." : "هناك بعض التحذيرات بخصوص الإعداد الخاص بك.",
+ "Checking for system and security issues." : "التحقق من مشاكل النظام والأمان.",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%2$s\">log</a>." : "يرجى إعادة التحقق مرة أخرى من<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\"> أدلة تثبيت ↗</a>، والتحقق من وجود أية أخطاء أو تحذيرات في <a href=\"%2$s\">السجل</a>.",
+ "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "تحقق من أمان نكست كلود الخاص بك من خلال <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">فحص الأمان لدينا ↗</a>.",
"Version" : "إصدار",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "يمكنك بصفتك مسئولا ضبط وضع المشاركة. يرجى الاطلاع على التوثيق لمزيد من المعلومات.",
"Allow apps to use the Share API" : "السماح للتطبيقات بالمشاركة عن طريق الAPI",
"Enforce expiration date" : "فرض تاريخ نهاية صلاحية",
"Allow public uploads" : "السماح بالرفع للعامة ",
@@ -230,12 +291,17 @@
"Restrict users to only share with users in their groups" : "سماح المستخدمين للمشاركة ضمن مجموعتهم فقط.",
"Exclude groups from sharing" : "استبعاد المجموعات من المشاركة",
"These groups will still be able to receive shares, but not to initiate them." : "هذه المجموعات لا زالت تستقبل المشاركات، لكن غير مطلعين عليها.",
+ "This text will be shown on the public link upload page when the file list is hidden." : "يظهر هذا النص في صفحة تحميل الرابط العام عندما تكون قائمة الملفات مخفية.",
+ "Default share permissions" : "أذونات المشاركة الافتراضية",
+ "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "تم تطويره بواسطة {communityopen} نكست كلود كوميونتي {linkclose}، كود مصدر {جت هب اوبن} {linkclose} مرخص بموجب {Licenseopen} رخصة برمجيات جنو أفيرو العمومية {linkclose}",
"Like our Facebook page" : "قم بالإعجاب بصفحتنا على الفايسبوك",
"Follow us on Twitter" : "تابعونا على تويتر",
"Follow us on Mastodon" : "تابعونا على ماستدون",
"Check out our blog" : "إلقي نظرة على مدوّنتنا",
+ "Subscribe to our newsletter" : "الاشتراك في نشرتنا الإخبارية",
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "إصدار المجتمع هذا من Nextcloud غير مدعوم والإشعارات الفورية غير متاحة.",
"png or jpg, max. 20 MB" : "صيغة png أو jpg و حجم أقصاه 20 م.ب",
+ "Edit User" : "تعديل المستخدم",
"Add a new user" : "إضافة مستخدِم جديد",
"Show Languages" : "اعرض اللغات",
"Plain" : "سادة",
diff --git a/apps/settings/l10n/az.js b/apps/settings/l10n/az.js
index 0cb8e889e28..3709a5c0e18 100644
--- a/apps/settings/l10n/az.js
+++ b/apps/settings/l10n/az.js
@@ -145,6 +145,7 @@ OC.L10N.register(
"Add" : "Əlavə etmək",
"Email" : "Email",
"Quota" : "Norma",
+ "Edit" : "Dəyişiklik et",
"Admins" : "İnzibatçılar",
"Show user backend" : "Daxili istifadəçini göstər",
"Send email to new user" : "Yeni istifadəçiyə məktub yolla",
diff --git a/apps/settings/l10n/az.json b/apps/settings/l10n/az.json
index ae6cb69a33b..053920d508d 100644
--- a/apps/settings/l10n/az.json
+++ b/apps/settings/l10n/az.json
@@ -143,6 +143,7 @@
"Add" : "Əlavə etmək",
"Email" : "Email",
"Quota" : "Norma",
+ "Edit" : "Dəyişiklik et",
"Admins" : "İnzibatçılar",
"Show user backend" : "Daxili istifadəçini göstər",
"Send email to new user" : "Yeni istifadəçiyə məktub yolla",
diff --git a/apps/settings/l10n/bg.js b/apps/settings/l10n/bg.js
index 7bc73e18051..0ef00ba4e3d 100644
--- a/apps/settings/l10n/bg.js
+++ b/apps/settings/l10n/bg.js
@@ -353,7 +353,6 @@ OC.L10N.register(
"Add user to group" : "Добавяне на потребител към група",
"Set user as admin for" : "Задаване на потребителя като администратор за",
"Select user quota" : "Изберете потребителска квота",
- "Toggle user actions menu" : "Превключване на менюто за действия на потребител",
"Delete user" : "Изтриване",
"Wipe all devices" : "Изтрии всички устройства",
"Disable user" : "Деактивирай",
@@ -366,7 +365,8 @@ OC.L10N.register(
"Account deletion" : "Изтриване на профил",
"Delete {userid}'s account" : "Изтриване на профил на {userid}",
"Welcome mail sent!" : "Изпратена е поща за добре дошли!",
- "Edit User" : "Редактиране на потребител",
+ "Toggle user actions menu" : "Превключване на менюто за действия на потребител",
+ "Edit" : "Редактиране",
"{size} used" : "{size} използвани",
"Passwordless authentication requires a secure connection." : "Удостоверяване без парола изисква сигурна връзка.",
"Add WebAuthn device" : "Добавяне на WebAuthn устройство",
@@ -501,6 +501,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Избор на профилна снимка от файлове",
"png or jpg, max. 20 MB" : "png или jpg, макс. 20 MB",
"Your location" : "Вашето местоположение",
+ "Edit User" : "Редактиране на потребител",
"Will be autogenerated" : "Ще се генерира автоматично",
"Add a new user" : "Добавяне на новия потребител",
"Show Languages" : "Показвай ползвания език",
diff --git a/apps/settings/l10n/bg.json b/apps/settings/l10n/bg.json
index 9cd8ec6a3c0..a00a3494827 100644
--- a/apps/settings/l10n/bg.json
+++ b/apps/settings/l10n/bg.json
@@ -351,7 +351,6 @@
"Add user to group" : "Добавяне на потребител към група",
"Set user as admin for" : "Задаване на потребителя като администратор за",
"Select user quota" : "Изберете потребителска квота",
- "Toggle user actions menu" : "Превключване на менюто за действия на потребител",
"Delete user" : "Изтриване",
"Wipe all devices" : "Изтрии всички устройства",
"Disable user" : "Деактивирай",
@@ -364,7 +363,8 @@
"Account deletion" : "Изтриване на профил",
"Delete {userid}'s account" : "Изтриване на профил на {userid}",
"Welcome mail sent!" : "Изпратена е поща за добре дошли!",
- "Edit User" : "Редактиране на потребител",
+ "Toggle user actions menu" : "Превключване на менюто за действия на потребител",
+ "Edit" : "Редактиране",
"{size} used" : "{size} използвани",
"Passwordless authentication requires a secure connection." : "Удостоверяване без парола изисква сигурна връзка.",
"Add WebAuthn device" : "Добавяне на WebAuthn устройство",
@@ -499,6 +499,7 @@
"Choose profile picture from files" : "Избор на профилна снимка от файлове",
"png or jpg, max. 20 MB" : "png или jpg, макс. 20 MB",
"Your location" : "Вашето местоположение",
+ "Edit User" : "Редактиране на потребител",
"Will be autogenerated" : "Ще се генерира автоматично",
"Add a new user" : "Добавяне на новия потребител",
"Show Languages" : "Показвай ползвания език",
diff --git a/apps/settings/l10n/br.js b/apps/settings/l10n/br.js
index 57f174cfb97..530bd80d0a4 100644
--- a/apps/settings/l10n/br.js
+++ b/apps/settings/l10n/br.js
@@ -234,7 +234,6 @@ OC.L10N.register(
"Add new email address" : "Ouzhpennañ ur chom-lec'h postel nevez",
"Set user as admin for" : "Lakaat an implijer da merour evit",
"Select user quota" : "Choaz quota an implijer",
- "Toggle user actions menu" : "Diskwell/koachañ ar roll ober",
"Delete user" : "Lemel implijer",
"Wipe all devices" : "Lemel pep ardivink",
"Disable user" : "Disaotreañ an implijour",
@@ -247,7 +246,8 @@ OC.L10N.register(
"Account deletion" : "Lemel ar c'hont",
"Delete {userid}'s account" : "Lemel kont {userid}",
"Welcome mail sent!" : "Postel degemer kaset !",
- "Edit User" : "Embann implijer",
+ "Toggle user actions menu" : "Diskwell/koachañ ar roll ober",
+ "Edit" : "Cheñch",
"{size} used" : "{size} implijet",
"Passwordless authentication requires a secure connection." : "Ret eo kaout ur c'henstagadur sur evit un dilesa di-ger-tremen.",
"Add WebAuthn device" : "Ouzhpenn ardivink WebAuthn",
@@ -347,6 +347,7 @@ OC.L10N.register(
"Use a second factor besides your password to increase security for your account." : "Implijour un eil-elfenn d'ho ger-tremen a gwella urentez o c'hont.",
"You created app password \"{token}\"" : "Ar ger-tremen meziant \"{token}\" o peus krouet",
"png or jpg, max. 20 MB" : "png pe jpg, 20 MB d'ar muiañ",
+ "Edit User" : "Embann implijer",
"Will be autogenerated" : "A vo krouet en un doare otomatek",
"Add a new user" : "Ouzhpennan un im^lijer",
"Show Languages" : "Diskouez Yezhoù",
diff --git a/apps/settings/l10n/br.json b/apps/settings/l10n/br.json
index 94ea677ac6a..e55c632dbc9 100644
--- a/apps/settings/l10n/br.json
+++ b/apps/settings/l10n/br.json
@@ -232,7 +232,6 @@
"Add new email address" : "Ouzhpennañ ur chom-lec'h postel nevez",
"Set user as admin for" : "Lakaat an implijer da merour evit",
"Select user quota" : "Choaz quota an implijer",
- "Toggle user actions menu" : "Diskwell/koachañ ar roll ober",
"Delete user" : "Lemel implijer",
"Wipe all devices" : "Lemel pep ardivink",
"Disable user" : "Disaotreañ an implijour",
@@ -245,7 +244,8 @@
"Account deletion" : "Lemel ar c'hont",
"Delete {userid}'s account" : "Lemel kont {userid}",
"Welcome mail sent!" : "Postel degemer kaset !",
- "Edit User" : "Embann implijer",
+ "Toggle user actions menu" : "Diskwell/koachañ ar roll ober",
+ "Edit" : "Cheñch",
"{size} used" : "{size} implijet",
"Passwordless authentication requires a secure connection." : "Ret eo kaout ur c'henstagadur sur evit un dilesa di-ger-tremen.",
"Add WebAuthn device" : "Ouzhpenn ardivink WebAuthn",
@@ -345,6 +345,7 @@
"Use a second factor besides your password to increase security for your account." : "Implijour un eil-elfenn d'ho ger-tremen a gwella urentez o c'hont.",
"You created app password \"{token}\"" : "Ar ger-tremen meziant \"{token}\" o peus krouet",
"png or jpg, max. 20 MB" : "png pe jpg, 20 MB d'ar muiañ",
+ "Edit User" : "Embann implijer",
"Will be autogenerated" : "A vo krouet en un doare otomatek",
"Add a new user" : "Ouzhpennan un im^lijer",
"Show Languages" : "Diskouez Yezhoù",
diff --git a/apps/settings/l10n/ca.js b/apps/settings/l10n/ca.js
index b8b9a15fd2d..4e26bb9f0e7 100644
--- a/apps/settings/l10n/ca.js
+++ b/apps/settings/l10n/ca.js
@@ -353,7 +353,6 @@ OC.L10N.register(
"Add user to group" : "Afegeix l'usuari al grup",
"Set user as admin for" : "Posa l'usuari com a administrador per",
"Select user quota" : "Selecciona la quota d'usuari",
- "Toggle user actions menu" : "Commuta el menú d'accions d'usuari",
"Delete user" : "Suprimeix l'usuari",
"Wipe all devices" : "Esborra tots els dispositius",
"Disable user" : "Inhabilita l'usuari",
@@ -366,7 +365,8 @@ OC.L10N.register(
"Account deletion" : "Supressió del compte",
"Delete {userid}'s account" : "Suprimir el compte de {userid}",
"Welcome mail sent!" : "S'ha enviat el correu electrònic de benvinguda!",
- "Edit User" : "Edita Usuari",
+ "Toggle user actions menu" : "Commuta el menú d'accions d'usuari",
+ "Edit" : "Edita",
"{size} used" : "{size} en ús",
"Passwordless authentication requires a secure connection." : "L'autenticació sense contrasenya necessita una connexió segura.",
"Add WebAuthn device" : "Afegeix un dispositiu WebAuthn",
@@ -501,6 +501,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Trieu una imatge de perfil als fitxers",
"png or jpg, max. 20 MB" : "png o jpg, màx. 20 MB",
"Your location" : "La vostra localització",
+ "Edit User" : "Edita Usuari",
"Will be autogenerated" : "Serà auto-generat",
"Add a new user" : "Afegeix un nou usuari",
"Show Languages" : "Mostra els idiomes",
diff --git a/apps/settings/l10n/ca.json b/apps/settings/l10n/ca.json
index 8f76cd9a5b2..e616fd72682 100644
--- a/apps/settings/l10n/ca.json
+++ b/apps/settings/l10n/ca.json
@@ -351,7 +351,6 @@
"Add user to group" : "Afegeix l'usuari al grup",
"Set user as admin for" : "Posa l'usuari com a administrador per",
"Select user quota" : "Selecciona la quota d'usuari",
- "Toggle user actions menu" : "Commuta el menú d'accions d'usuari",
"Delete user" : "Suprimeix l'usuari",
"Wipe all devices" : "Esborra tots els dispositius",
"Disable user" : "Inhabilita l'usuari",
@@ -364,7 +363,8 @@
"Account deletion" : "Supressió del compte",
"Delete {userid}'s account" : "Suprimir el compte de {userid}",
"Welcome mail sent!" : "S'ha enviat el correu electrònic de benvinguda!",
- "Edit User" : "Edita Usuari",
+ "Toggle user actions menu" : "Commuta el menú d'accions d'usuari",
+ "Edit" : "Edita",
"{size} used" : "{size} en ús",
"Passwordless authentication requires a secure connection." : "L'autenticació sense contrasenya necessita una connexió segura.",
"Add WebAuthn device" : "Afegeix un dispositiu WebAuthn",
@@ -499,6 +499,7 @@
"Choose profile picture from files" : "Trieu una imatge de perfil als fitxers",
"png or jpg, max. 20 MB" : "png o jpg, màx. 20 MB",
"Your location" : "La vostra localització",
+ "Edit User" : "Edita Usuari",
"Will be autogenerated" : "Serà auto-generat",
"Add a new user" : "Afegeix un nou usuari",
"Show Languages" : "Mostra els idiomes",
diff --git a/apps/settings/l10n/cs.js b/apps/settings/l10n/cs.js
index a90b7ec5373..67d04d156bc 100644
--- a/apps/settings/l10n/cs.js
+++ b/apps/settings/l10n/cs.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Vybrat kvótu uživatele",
"Set the language" : "Nastavit jazyk",
"Select manager" : "Vybrat nástroj pro správu",
- "Toggle user actions menu" : "Vyp/zap. nabídku akcí uživatele",
"Delete user" : "Smazat uživatele",
"Wipe all devices" : "Vymazat obsah ze všech zařízení",
"Disable user" : "Znepřístupnit uživatelský účet",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "V případě ztráty zařízení, nebo např. odchodu z firmy, toto může vzdáleně vymazat Nextcloud data ze všech zařízení asociovaných s uživatelem {userid}. Funguje jen pokud se zařízení připojí k Internetu.",
"Remote wipe of devices" : "Vymazat obsah zařízení na dálku",
"Wipe {userid}'s devices" : "Vymazat obsah ze zařízení uživatele {userid}",
+ "Wiped {userid}'s devices" : "Data ze zařízení uživatele {userid} vymazána",
+ "Update of user manager was failed" : "Aktualizace správy uživatelů se nezdařila",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Úplně vymazat účet {userid}, včetně veškerých osobní souborů, dat aplikací, atd.",
"Account deletion" : "Smazání účtu",
"Delete {userid}'s account" : "Smazat účet {userid}",
+ "Display name was successfully changed" : "Zobrazené jméno bylo úspěšně změněno",
+ "Password was successfully changed" : "Heslo bylo úspěšně změněno",
+ "Email was successfully changed" : "E-mail byl úspěšně změněn",
"Welcome mail sent!" : "Uvítací e-mail odeslán!",
- "Edit User" : "Upravit uživatele",
+ "Toggle user actions menu" : "Vyp/zap. nabídku akcí uživatele",
+ "Edit" : "Upravit",
"{size} used" : "{size} použito",
"Passwordless authentication requires a secure connection." : "Ověřování se bez hesla vyžaduje zabezpečené připojení.",
"Add WebAuthn device" : "Přidat WebAuthn zařízení",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Zvolit profilový obrázek ze souborů",
"png or jpg, max. 20 MB" : "png nebo jpg, nejvýše 20 MB",
"Your location" : "Kde se nacházíte",
+ "Edit User" : "Upravit uživatele",
"Will be autogenerated" : "Bude automaticky vytvořeno",
"Add a new user" : "Přidat nového uživatele",
"Show Languages" : "Zobrazit jazyky",
diff --git a/apps/settings/l10n/cs.json b/apps/settings/l10n/cs.json
index 0ff8d62d360..02845678628 100644
--- a/apps/settings/l10n/cs.json
+++ b/apps/settings/l10n/cs.json
@@ -370,7 +370,6 @@
"Select user quota" : "Vybrat kvótu uživatele",
"Set the language" : "Nastavit jazyk",
"Select manager" : "Vybrat nástroj pro správu",
- "Toggle user actions menu" : "Vyp/zap. nabídku akcí uživatele",
"Delete user" : "Smazat uživatele",
"Wipe all devices" : "Vymazat obsah ze všech zařízení",
"Disable user" : "Znepřístupnit uživatelský účet",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "V případě ztráty zařízení, nebo např. odchodu z firmy, toto může vzdáleně vymazat Nextcloud data ze všech zařízení asociovaných s uživatelem {userid}. Funguje jen pokud se zařízení připojí k Internetu.",
"Remote wipe of devices" : "Vymazat obsah zařízení na dálku",
"Wipe {userid}'s devices" : "Vymazat obsah ze zařízení uživatele {userid}",
+ "Wiped {userid}'s devices" : "Data ze zařízení uživatele {userid} vymazána",
+ "Update of user manager was failed" : "Aktualizace správy uživatelů se nezdařila",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Úplně vymazat účet {userid}, včetně veškerých osobní souborů, dat aplikací, atd.",
"Account deletion" : "Smazání účtu",
"Delete {userid}'s account" : "Smazat účet {userid}",
+ "Display name was successfully changed" : "Zobrazené jméno bylo úspěšně změněno",
+ "Password was successfully changed" : "Heslo bylo úspěšně změněno",
+ "Email was successfully changed" : "E-mail byl úspěšně změněn",
"Welcome mail sent!" : "Uvítací e-mail odeslán!",
- "Edit User" : "Upravit uživatele",
+ "Toggle user actions menu" : "Vyp/zap. nabídku akcí uživatele",
+ "Edit" : "Upravit",
"{size} used" : "{size} použito",
"Passwordless authentication requires a secure connection." : "Ověřování se bez hesla vyžaduje zabezpečené připojení.",
"Add WebAuthn device" : "Přidat WebAuthn zařízení",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Zvolit profilový obrázek ze souborů",
"png or jpg, max. 20 MB" : "png nebo jpg, nejvýše 20 MB",
"Your location" : "Kde se nacházíte",
+ "Edit User" : "Upravit uživatele",
"Will be autogenerated" : "Bude automaticky vytvořeno",
"Add a new user" : "Přidat nového uživatele",
"Show Languages" : "Zobrazit jazyky",
diff --git a/apps/settings/l10n/da.js b/apps/settings/l10n/da.js
index fde9d76490b..35e54eff0c9 100644
--- a/apps/settings/l10n/da.js
+++ b/apps/settings/l10n/da.js
@@ -301,7 +301,6 @@ OC.L10N.register(
"Add user to group" : "Føj bruger til gruppe",
"Set user as admin for" : "Gør bruger til administrator for",
"Select user quota" : "Vælg brugerkvote",
- "Toggle user actions menu" : "Skift brugerhandlingsmenu",
"Delete user" : "Slet bruger",
"Wipe all devices" : "Slet alle enheder",
"Disable user" : "Deaktiver bruger",
@@ -314,7 +313,8 @@ OC.L10N.register(
"Account deletion" : "Sletning af konto",
"Delete {userid}'s account" : "Slet {userid}s konto",
"Welcome mail sent!" : "Velkomstemail sendt!",
- "Edit User" : "Rediger bruger",
+ "Toggle user actions menu" : "Skift brugerhandlingsmenu",
+ "Edit" : "Redigér",
"{size} used" : "{size} brugt",
"Passwordless authentication requires a secure connection." : "Adgangskodefri godkendelse kræver en sikker forbindelse.",
"Add WebAuthn device" : "Tilføj WebAuthn-enhed",
@@ -440,6 +440,7 @@ OC.L10N.register(
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Hvis du bruger tredjepartsapplikationer til at oprette forbindelse til Nextcloud, skal du sørge for at oprette og konfigurere en app-adgangskode for hver, før du aktiverer anden faktor-godkendelse.",
"You created app password \"{token}\"" : "Du har oprettet app-adgangskoden \"{token}\"",
"png or jpg, max. 20 MB" : "png eller jpg, max. 20 MB",
+ "Edit User" : "Rediger bruger",
"Will be autogenerated" : "Vil blive autogenereret",
"Add a new user" : "Tilføj en bruger",
"Show Languages" : "Vis sprog",
diff --git a/apps/settings/l10n/da.json b/apps/settings/l10n/da.json
index 376dcf50d02..e645b7be206 100644
--- a/apps/settings/l10n/da.json
+++ b/apps/settings/l10n/da.json
@@ -299,7 +299,6 @@
"Add user to group" : "Føj bruger til gruppe",
"Set user as admin for" : "Gør bruger til administrator for",
"Select user quota" : "Vælg brugerkvote",
- "Toggle user actions menu" : "Skift brugerhandlingsmenu",
"Delete user" : "Slet bruger",
"Wipe all devices" : "Slet alle enheder",
"Disable user" : "Deaktiver bruger",
@@ -312,7 +311,8 @@
"Account deletion" : "Sletning af konto",
"Delete {userid}'s account" : "Slet {userid}s konto",
"Welcome mail sent!" : "Velkomstemail sendt!",
- "Edit User" : "Rediger bruger",
+ "Toggle user actions menu" : "Skift brugerhandlingsmenu",
+ "Edit" : "Redigér",
"{size} used" : "{size} brugt",
"Passwordless authentication requires a secure connection." : "Adgangskodefri godkendelse kræver en sikker forbindelse.",
"Add WebAuthn device" : "Tilføj WebAuthn-enhed",
@@ -438,6 +438,7 @@
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Hvis du bruger tredjepartsapplikationer til at oprette forbindelse til Nextcloud, skal du sørge for at oprette og konfigurere en app-adgangskode for hver, før du aktiverer anden faktor-godkendelse.",
"You created app password \"{token}\"" : "Du har oprettet app-adgangskoden \"{token}\"",
"png or jpg, max. 20 MB" : "png eller jpg, max. 20 MB",
+ "Edit User" : "Rediger bruger",
"Will be autogenerated" : "Vil blive autogenereret",
"Add a new user" : "Tilføj en bruger",
"Show Languages" : "Vis sprog",
diff --git a/apps/settings/l10n/de.js b/apps/settings/l10n/de.js
index 7ea7d8072cf..66fc616969b 100644
--- a/apps/settings/l10n/de.js
+++ b/apps/settings/l10n/de.js
@@ -353,7 +353,6 @@ OC.L10N.register(
"Add user to group" : "Benutzer der Gruppe hinzufügen",
"Set user as admin for" : "Benutzer als Administrator setzen für",
"Select user quota" : "Kontingent auswählen",
- "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
"Delete user" : "Benutzer löschen",
"Wipe all devices" : "Alle Geräte löschen",
"Disable user" : "Benutzer deaktivieren",
@@ -362,11 +361,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Im Falle des Verlusts des Gerätes oder der Verlassens der Organisation können mit dieser Funktion sämtliche Nextcloud-Daten von allen Geräten die mit {userid} verbunden sind gelöscht werden. Funktioniert nur wenn das Gerät mit dem Internet verbunden ist.",
"Remote wipe of devices" : "Fernlöschung von Geräten",
"Wipe {userid}'s devices" : "Lösche {userid}s Geräte",
+ "Wiped {userid}'s devices" : "{userid}'s Geräte bereinigt",
+ "Update of user manager was failed" : "Die Aktualisierung des Benutzermanagers ist fehlgeschlagen",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Vollständig {userid}s Konto löschen inklusive aller persönlichen Dateien, App-Daten, usw.",
"Account deletion" : "Löschung des Kontos",
"Delete {userid}'s account" : "Konto von {userid} löschen",
+ "Display name was successfully changed" : "Der Anzeigename wurde erfolgreich geändert\n ",
+ "Password was successfully changed" : "Das Passwort wurde erfolgreich geändert",
+ "Email was successfully changed" : "E-Mail wurde erfolgreich geändert",
"Welcome mail sent!" : "Willkommens-E-Mail gesendet!",
- "Edit User" : "Benutzer bearbeiten",
+ "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
+ "Edit" : "Bearbeiten",
"{size} used" : "{size} verwendet",
"Passwordless authentication requires a secure connection." : "Die Anmeldung ohne Passwort erfordert eine sichere Verbindung.",
"Add WebAuthn device" : "WebAuthn-Gerät hinzufügen",
@@ -501,6 +506,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Profilbild aus Dateien auswählen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Your location" : "Dein Ort",
+ "Edit User" : "Benutzer bearbeiten",
"Will be autogenerated" : "Wird automatisch erzeugt",
"Add a new user" : "Neuen Benutzer hinzufügen",
"Show Languages" : "Sprachen anzeigen",
diff --git a/apps/settings/l10n/de.json b/apps/settings/l10n/de.json
index e32e4fc2fd7..2f0e7915b3f 100644
--- a/apps/settings/l10n/de.json
+++ b/apps/settings/l10n/de.json
@@ -351,7 +351,6 @@
"Add user to group" : "Benutzer der Gruppe hinzufügen",
"Set user as admin for" : "Benutzer als Administrator setzen für",
"Select user quota" : "Kontingent auswählen",
- "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
"Delete user" : "Benutzer löschen",
"Wipe all devices" : "Alle Geräte löschen",
"Disable user" : "Benutzer deaktivieren",
@@ -360,11 +359,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Im Falle des Verlusts des Gerätes oder der Verlassens der Organisation können mit dieser Funktion sämtliche Nextcloud-Daten von allen Geräten die mit {userid} verbunden sind gelöscht werden. Funktioniert nur wenn das Gerät mit dem Internet verbunden ist.",
"Remote wipe of devices" : "Fernlöschung von Geräten",
"Wipe {userid}'s devices" : "Lösche {userid}s Geräte",
+ "Wiped {userid}'s devices" : "{userid}'s Geräte bereinigt",
+ "Update of user manager was failed" : "Die Aktualisierung des Benutzermanagers ist fehlgeschlagen",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Vollständig {userid}s Konto löschen inklusive aller persönlichen Dateien, App-Daten, usw.",
"Account deletion" : "Löschung des Kontos",
"Delete {userid}'s account" : "Konto von {userid} löschen",
+ "Display name was successfully changed" : "Der Anzeigename wurde erfolgreich geändert\n ",
+ "Password was successfully changed" : "Das Passwort wurde erfolgreich geändert",
+ "Email was successfully changed" : "E-Mail wurde erfolgreich geändert",
"Welcome mail sent!" : "Willkommens-E-Mail gesendet!",
- "Edit User" : "Benutzer bearbeiten",
+ "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
+ "Edit" : "Bearbeiten",
"{size} used" : "{size} verwendet",
"Passwordless authentication requires a secure connection." : "Die Anmeldung ohne Passwort erfordert eine sichere Verbindung.",
"Add WebAuthn device" : "WebAuthn-Gerät hinzufügen",
@@ -499,6 +504,7 @@
"Choose profile picture from files" : "Profilbild aus Dateien auswählen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Your location" : "Dein Ort",
+ "Edit User" : "Benutzer bearbeiten",
"Will be autogenerated" : "Wird automatisch erzeugt",
"Add a new user" : "Neuen Benutzer hinzufügen",
"Show Languages" : "Sprachen anzeigen",
diff --git a/apps/settings/l10n/de_DE.js b/apps/settings/l10n/de_DE.js
index 71f9a9cd4d3..92993ca385d 100644
--- a/apps/settings/l10n/de_DE.js
+++ b/apps/settings/l10n/de_DE.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Benutzerkontingent auswählen",
"Set the language" : "Sprache einstellen",
"Select manager" : "Manager auswählen",
- "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
"Delete user" : "Benutzer löschen",
"Wipe all devices" : "Alle Geräte löschen",
"Disable user" : "Benutzer deaktivieren",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Im Falle des Verlusts des Gerätes oder des Verlassens der Organisation können mit dieser Funktion sämtliche Nextcloud-Daten von allen Geräten, die mit {userid} verbunden sind, gelöscht werden. Funktioniert nur, wenn das Gerät mit dem Internet verbunden ist.",
"Remote wipe of devices" : "Fernlöschung von Geräten",
"Wipe {userid}'s devices" : "Lösche {userid}s Geräte",
+ "Wiped {userid}'s devices" : "{userid}'s Geräte bereinigt",
+ "Update of user manager was failed" : "Die Aktualisierung des Benutzermanagers ist fehlgeschlagen",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Lösche {userid}s Konto vollständig inklusive aller persönlichen Dateien, App-Daten, usw.",
"Account deletion" : "Löschung des Kontos",
"Delete {userid}'s account" : "Konto von {userid} löschen",
+ "Display name was successfully changed" : "Der Anzeigename wurde erfolgreich geändert\n ",
+ "Password was successfully changed" : "Das Passwort wurde erfolgreich geändert",
+ "Email was successfully changed" : "E-Mail wurde erfolgreich geändert",
"Welcome mail sent!" : "Willkommens-E-Mail gesendet!",
- "Edit User" : "Benutzer bearbeiten",
+ "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
+ "Edit" : "Bearbeiten",
"{size} used" : "{size} verwendet",
"Passwordless authentication requires a secure connection." : "Die Anmeldung ohne Passwort erfordert eine sichere Verbindung.",
"Add WebAuthn device" : "WebAuthn-Gerät hinzufügen",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Profilbild aus Dateien auswählen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Your location" : "Ihr Ort",
+ "Edit User" : "Benutzer bearbeiten",
"Will be autogenerated" : "Wird automatisch erzeugt",
"Add a new user" : "Neuen Benutzer hinzufügen",
"Show Languages" : "Sprachen anzeigen",
diff --git a/apps/settings/l10n/de_DE.json b/apps/settings/l10n/de_DE.json
index b82bccd477b..dc56c4c276d 100644
--- a/apps/settings/l10n/de_DE.json
+++ b/apps/settings/l10n/de_DE.json
@@ -370,7 +370,6 @@
"Select user quota" : "Benutzerkontingent auswählen",
"Set the language" : "Sprache einstellen",
"Select manager" : "Manager auswählen",
- "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
"Delete user" : "Benutzer löschen",
"Wipe all devices" : "Alle Geräte löschen",
"Disable user" : "Benutzer deaktivieren",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Im Falle des Verlusts des Gerätes oder des Verlassens der Organisation können mit dieser Funktion sämtliche Nextcloud-Daten von allen Geräten, die mit {userid} verbunden sind, gelöscht werden. Funktioniert nur, wenn das Gerät mit dem Internet verbunden ist.",
"Remote wipe of devices" : "Fernlöschung von Geräten",
"Wipe {userid}'s devices" : "Lösche {userid}s Geräte",
+ "Wiped {userid}'s devices" : "{userid}'s Geräte bereinigt",
+ "Update of user manager was failed" : "Die Aktualisierung des Benutzermanagers ist fehlgeschlagen",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Lösche {userid}s Konto vollständig inklusive aller persönlichen Dateien, App-Daten, usw.",
"Account deletion" : "Löschung des Kontos",
"Delete {userid}'s account" : "Konto von {userid} löschen",
+ "Display name was successfully changed" : "Der Anzeigename wurde erfolgreich geändert\n ",
+ "Password was successfully changed" : "Das Passwort wurde erfolgreich geändert",
+ "Email was successfully changed" : "E-Mail wurde erfolgreich geändert",
"Welcome mail sent!" : "Willkommens-E-Mail gesendet!",
- "Edit User" : "Benutzer bearbeiten",
+ "Toggle user actions menu" : "Menü für Benutzeraktionen umschalten",
+ "Edit" : "Bearbeiten",
"{size} used" : "{size} verwendet",
"Passwordless authentication requires a secure connection." : "Die Anmeldung ohne Passwort erfordert eine sichere Verbindung.",
"Add WebAuthn device" : "WebAuthn-Gerät hinzufügen",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Profilbild aus Dateien auswählen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Your location" : "Ihr Ort",
+ "Edit User" : "Benutzer bearbeiten",
"Will be autogenerated" : "Wird automatisch erzeugt",
"Add a new user" : "Neuen Benutzer hinzufügen",
"Show Languages" : "Sprachen anzeigen",
diff --git a/apps/settings/l10n/el.js b/apps/settings/l10n/el.js
index d73bd983a89..e2b64e9ed6e 100644
--- a/apps/settings/l10n/el.js
+++ b/apps/settings/l10n/el.js
@@ -317,7 +317,6 @@ OC.L10N.register(
"Add user to group" : "Προσθήκη χρήστη στην ομάδα",
"Set user as admin for" : "Ορισμός χρήστη ως διαχειριστή για",
"Select user quota" : "Επιλογή χωρητικότητας λογαριασμού χρήστη",
- "Toggle user actions menu" : "Εναλλαγή μενού ρυθμίσεων χρήστη",
"Delete user" : "Διαγραφή χρήστη",
"Wipe all devices" : "Εκκαθάριση όλων των συσκευών",
"Disable user" : "Απενεργοποίηση χρήστη",
@@ -330,7 +329,8 @@ OC.L10N.register(
"Account deletion" : "Διαγραφή λογαριασμού",
"Delete {userid}'s account" : "Διαγραφή λογαριασμού του {userid}",
"Welcome mail sent!" : "Απεστάλη το μήνυμα καλωσορίσματος!",
- "Edit User" : "Επεξεργασία Χρήστη",
+ "Toggle user actions menu" : "Εναλλαγή μενού ρυθμίσεων χρήστη",
+ "Edit" : "Επεξεργασία",
"{size} used" : "{size} που χρησιμοποιείται",
"Passwordless authentication requires a secure connection." : "Η σύνδεση χωρίς κωδικό πρόσβασης απαιτεί ασφαλή σύνδεση.",
"Add WebAuthn device" : "Προσθήκη συσκευής WebAuthn ",
@@ -460,6 +460,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Επιλογή εικόνας προφίλ από το αρχείο",
"png or jpg, max. 20 MB" : "png ή jpg, μεγ. 20 MB",
"Your location" : "Η τοποθεσία σας",
+ "Edit User" : "Επεξεργασία Χρήστη",
"Will be autogenerated" : "Θα δημιουργηθεί αυτόματα",
"Add a new user" : "Προσθήκη νέου χρήστη",
"Show Languages" : "Εμφάνιση γλωσσών",
diff --git a/apps/settings/l10n/el.json b/apps/settings/l10n/el.json
index 09a157e2070..7af8bc2edc7 100644
--- a/apps/settings/l10n/el.json
+++ b/apps/settings/l10n/el.json
@@ -315,7 +315,6 @@
"Add user to group" : "Προσθήκη χρήστη στην ομάδα",
"Set user as admin for" : "Ορισμός χρήστη ως διαχειριστή για",
"Select user quota" : "Επιλογή χωρητικότητας λογαριασμού χρήστη",
- "Toggle user actions menu" : "Εναλλαγή μενού ρυθμίσεων χρήστη",
"Delete user" : "Διαγραφή χρήστη",
"Wipe all devices" : "Εκκαθάριση όλων των συσκευών",
"Disable user" : "Απενεργοποίηση χρήστη",
@@ -328,7 +327,8 @@
"Account deletion" : "Διαγραφή λογαριασμού",
"Delete {userid}'s account" : "Διαγραφή λογαριασμού του {userid}",
"Welcome mail sent!" : "Απεστάλη το μήνυμα καλωσορίσματος!",
- "Edit User" : "Επεξεργασία Χρήστη",
+ "Toggle user actions menu" : "Εναλλαγή μενού ρυθμίσεων χρήστη",
+ "Edit" : "Επεξεργασία",
"{size} used" : "{size} που χρησιμοποιείται",
"Passwordless authentication requires a secure connection." : "Η σύνδεση χωρίς κωδικό πρόσβασης απαιτεί ασφαλή σύνδεση.",
"Add WebAuthn device" : "Προσθήκη συσκευής WebAuthn ",
@@ -458,6 +458,7 @@
"Choose profile picture from files" : "Επιλογή εικόνας προφίλ από το αρχείο",
"png or jpg, max. 20 MB" : "png ή jpg, μεγ. 20 MB",
"Your location" : "Η τοποθεσία σας",
+ "Edit User" : "Επεξεργασία Χρήστη",
"Will be autogenerated" : "Θα δημιουργηθεί αυτόματα",
"Add a new user" : "Προσθήκη νέου χρήστη",
"Show Languages" : "Εμφάνιση γλωσσών",
diff --git a/apps/settings/l10n/en_GB.js b/apps/settings/l10n/en_GB.js
index cb2100e4beb..8674f34d99a 100644
--- a/apps/settings/l10n/en_GB.js
+++ b/apps/settings/l10n/en_GB.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Select user quota",
"Set the language" : "Set the language",
"Select manager" : "Select manager",
- "Toggle user actions menu" : "Toggle user actions menu",
"Delete user" : "Delete user",
"Wipe all devices" : "Wipe all devices",
"Disable user" : "Disable user",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.",
"Remote wipe of devices" : "Remote wipe of devices",
"Wipe {userid}'s devices" : "Wipe {userid}'s devices",
+ "Wiped {userid}'s devices" : "Wiped {userid}'s devices",
+ "Update of user manager was failed" : "Update of user manager was failed",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Fully delete {userid}'s account including all their personal files, app data, etc.",
"Account deletion" : "Account deletion",
"Delete {userid}'s account" : "Delete {userid}'s account",
+ "Display name was successfully changed" : "Display name was successfully changed",
+ "Password was successfully changed" : "Password was successfully changed",
+ "Email was successfully changed" : "Email was successfully changed",
"Welcome mail sent!" : "Welcome mail sent!",
- "Edit User" : "Edit User",
+ "Toggle user actions menu" : "Toggle user actions menu",
+ "Edit" : "Edit",
"{size} used" : "{size} used",
"Passwordless authentication requires a secure connection." : "Passwordless authentication requires a secure connection.",
"Add WebAuthn device" : "Add WebAuthn device",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Choose profile picture from files",
"png or jpg, max. 20 MB" : "png or jpg, max. 20 MB",
"Your location" : "Your location",
+ "Edit User" : "Edit User",
"Will be autogenerated" : "Will be autogenerated",
"Add a new user" : "Add a new user",
"Show Languages" : "Show Languages",
diff --git a/apps/settings/l10n/en_GB.json b/apps/settings/l10n/en_GB.json
index 2aced551aa7..8f42030078a 100644
--- a/apps/settings/l10n/en_GB.json
+++ b/apps/settings/l10n/en_GB.json
@@ -370,7 +370,6 @@
"Select user quota" : "Select user quota",
"Set the language" : "Set the language",
"Select manager" : "Select manager",
- "Toggle user actions menu" : "Toggle user actions menu",
"Delete user" : "Delete user",
"Wipe all devices" : "Wipe all devices",
"Disable user" : "Disable user",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet.",
"Remote wipe of devices" : "Remote wipe of devices",
"Wipe {userid}'s devices" : "Wipe {userid}'s devices",
+ "Wiped {userid}'s devices" : "Wiped {userid}'s devices",
+ "Update of user manager was failed" : "Update of user manager was failed",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Fully delete {userid}'s account including all their personal files, app data, etc.",
"Account deletion" : "Account deletion",
"Delete {userid}'s account" : "Delete {userid}'s account",
+ "Display name was successfully changed" : "Display name was successfully changed",
+ "Password was successfully changed" : "Password was successfully changed",
+ "Email was successfully changed" : "Email was successfully changed",
"Welcome mail sent!" : "Welcome mail sent!",
- "Edit User" : "Edit User",
+ "Toggle user actions menu" : "Toggle user actions menu",
+ "Edit" : "Edit",
"{size} used" : "{size} used",
"Passwordless authentication requires a secure connection." : "Passwordless authentication requires a secure connection.",
"Add WebAuthn device" : "Add WebAuthn device",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Choose profile picture from files",
"png or jpg, max. 20 MB" : "png or jpg, max. 20 MB",
"Your location" : "Your location",
+ "Edit User" : "Edit User",
"Will be autogenerated" : "Will be autogenerated",
"Add a new user" : "Add a new user",
"Show Languages" : "Show Languages",
diff --git a/apps/settings/l10n/eo.js b/apps/settings/l10n/eo.js
index 27fe2b70bf6..2ba7dc52503 100644
--- a/apps/settings/l10n/eo.js
+++ b/apps/settings/l10n/eo.js
@@ -235,6 +235,7 @@ OC.L10N.register(
"Account deletion" : "Forigo de konto",
"Delete {userid}'s account" : "Forigi konton de {userid}",
"Welcome mail sent!" : "Bonvena retpoŝtmesaĝo sendita!",
+ "Edit" : "Modifi",
"{size} used" : "{size} uzataj",
"Your apps" : "Viaj aplikaĵoj",
"{license}-licensed" : "Permesilo: {license}",
diff --git a/apps/settings/l10n/eo.json b/apps/settings/l10n/eo.json
index 37febeed9fb..287298524ee 100644
--- a/apps/settings/l10n/eo.json
+++ b/apps/settings/l10n/eo.json
@@ -233,6 +233,7 @@
"Account deletion" : "Forigo de konto",
"Delete {userid}'s account" : "Forigi konton de {userid}",
"Welcome mail sent!" : "Bonvena retpoŝtmesaĝo sendita!",
+ "Edit" : "Modifi",
"{size} used" : "{size} uzataj",
"Your apps" : "Viaj aplikaĵoj",
"{license}-licensed" : "Permesilo: {license}",
diff --git a/apps/settings/l10n/es.js b/apps/settings/l10n/es.js
index 0abc76900f4..f074bf1de23 100644
--- a/apps/settings/l10n/es.js
+++ b/apps/settings/l10n/es.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Seleccionar cuota de usuario",
"Set the language" : "Establecer el idioma",
"Select manager" : "Seleccione administrador",
- "Toggle user actions menu" : "Alternar el menú de acciones del usuario",
"Delete user" : "Eliminar usuario",
"Wipe all devices" : "Borrar todos los dispositivos",
"Disable user" : "Inhabilitar usuario",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "En caso de pérdida del dispositivo o dejar la organización, esto puede eliminar remotamente los datos de Nextcloud de todos los dispositivos asociados con {userid}. Nota: sólo funciona si los dispositivos están conectados a Internet.",
"Remote wipe of devices" : "Eliminación remota de dispositivos",
"Wipe {userid}'s devices" : "Eliminar dispositivos de {userid}",
+ "Wiped {userid}'s devices" : "Dispositivos de {userid} borrados",
+ "Update of user manager was failed" : "La actualización del administrador de usuarios ha fallado",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Eliminar completamente la cuenta de {userid}, incluyendo todos sus archivos personales, datos de las apps, etc.",
"Account deletion" : "Eliminación de la cuenta",
"Delete {userid}'s account" : "Eliminar cuentas de {userid}",
+ "Display name was successfully changed" : "El nombre para mostrar se ha cambiado correctamente",
+ "Password was successfully changed" : "La contraseña se ha cambiado correctamente",
+ "Email was successfully changed" : "El email se ha cambiado correctamente",
"Welcome mail sent!" : "¡Correo de bienvenida enviado!",
- "Edit User" : "Editar usuario",
+ "Toggle user actions menu" : "Alternar el menú de acciones del usuario",
+ "Edit" : "Editar",
"{size} used" : "{size} usados",
"Passwordless authentication requires a secure connection." : "La autenticación sin contraseña requiere una conexión segura.",
"Add WebAuthn device" : "Añadir dispositivo WebAuthn",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Seleccionar imagen del perfil desde los archivos",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
"Your location" : "Su ubicación",
+ "Edit User" : "Editar usuario",
"Will be autogenerated" : "Se generará de forma automática",
"Add a new user" : "Añadir nuevo usuario",
"Show Languages" : "Mostrar idiomas",
diff --git a/apps/settings/l10n/es.json b/apps/settings/l10n/es.json
index 607efbe6a17..c7cb6d0a62a 100644
--- a/apps/settings/l10n/es.json
+++ b/apps/settings/l10n/es.json
@@ -370,7 +370,6 @@
"Select user quota" : "Seleccionar cuota de usuario",
"Set the language" : "Establecer el idioma",
"Select manager" : "Seleccione administrador",
- "Toggle user actions menu" : "Alternar el menú de acciones del usuario",
"Delete user" : "Eliminar usuario",
"Wipe all devices" : "Borrar todos los dispositivos",
"Disable user" : "Inhabilitar usuario",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "En caso de pérdida del dispositivo o dejar la organización, esto puede eliminar remotamente los datos de Nextcloud de todos los dispositivos asociados con {userid}. Nota: sólo funciona si los dispositivos están conectados a Internet.",
"Remote wipe of devices" : "Eliminación remota de dispositivos",
"Wipe {userid}'s devices" : "Eliminar dispositivos de {userid}",
+ "Wiped {userid}'s devices" : "Dispositivos de {userid} borrados",
+ "Update of user manager was failed" : "La actualización del administrador de usuarios ha fallado",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Eliminar completamente la cuenta de {userid}, incluyendo todos sus archivos personales, datos de las apps, etc.",
"Account deletion" : "Eliminación de la cuenta",
"Delete {userid}'s account" : "Eliminar cuentas de {userid}",
+ "Display name was successfully changed" : "El nombre para mostrar se ha cambiado correctamente",
+ "Password was successfully changed" : "La contraseña se ha cambiado correctamente",
+ "Email was successfully changed" : "El email se ha cambiado correctamente",
"Welcome mail sent!" : "¡Correo de bienvenida enviado!",
- "Edit User" : "Editar usuario",
+ "Toggle user actions menu" : "Alternar el menú de acciones del usuario",
+ "Edit" : "Editar",
"{size} used" : "{size} usados",
"Passwordless authentication requires a secure connection." : "La autenticación sin contraseña requiere una conexión segura.",
"Add WebAuthn device" : "Añadir dispositivo WebAuthn",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Seleccionar imagen del perfil desde los archivos",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
"Your location" : "Su ubicación",
+ "Edit User" : "Editar usuario",
"Will be autogenerated" : "Se generará de forma automática",
"Add a new user" : "Añadir nuevo usuario",
"Show Languages" : "Mostrar idiomas",
diff --git a/apps/settings/l10n/es_419.js b/apps/settings/l10n/es_419.js
index 78779af1b8a..a87456f847e 100644
--- a/apps/settings/l10n/es_419.js
+++ b/apps/settings/l10n/es_419.js
@@ -166,6 +166,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_419.json b/apps/settings/l10n/es_419.json
index 858824d2bb5..d24e6c2e5ef 100644
--- a/apps/settings/l10n/es_419.json
+++ b/apps/settings/l10n/es_419.json
@@ -164,6 +164,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_AR.js b/apps/settings/l10n/es_AR.js
index 9559f76e648..0ace0326ff5 100644
--- a/apps/settings/l10n/es_AR.js
+++ b/apps/settings/l10n/es_AR.js
@@ -158,6 +158,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Sus aplicaciones",
"Changelog" : "Bitácora de cambios",
diff --git a/apps/settings/l10n/es_AR.json b/apps/settings/l10n/es_AR.json
index 16bfb8ff9af..32be52f651a 100644
--- a/apps/settings/l10n/es_AR.json
+++ b/apps/settings/l10n/es_AR.json
@@ -156,6 +156,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Sus aplicaciones",
"Changelog" : "Bitácora de cambios",
diff --git a/apps/settings/l10n/es_CL.js b/apps/settings/l10n/es_CL.js
index 3de277eea5c..8f1028ab8fe 100644
--- a/apps/settings/l10n/es_CL.js
+++ b/apps/settings/l10n/es_CL.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_CL.json b/apps/settings/l10n/es_CL.json
index 0f5a25757e5..18be94db538 100644
--- a/apps/settings/l10n/es_CL.json
+++ b/apps/settings/l10n/es_CL.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_CO.js b/apps/settings/l10n/es_CO.js
index ffc7cf3a38a..1af68056204 100644
--- a/apps/settings/l10n/es_CO.js
+++ b/apps/settings/l10n/es_CO.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_CO.json b/apps/settings/l10n/es_CO.json
index ea1da4faa2b..a6df4e6ea68 100644
--- a/apps/settings/l10n/es_CO.json
+++ b/apps/settings/l10n/es_CO.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_CR.js b/apps/settings/l10n/es_CR.js
index ffc7cf3a38a..1af68056204 100644
--- a/apps/settings/l10n/es_CR.js
+++ b/apps/settings/l10n/es_CR.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_CR.json b/apps/settings/l10n/es_CR.json
index ea1da4faa2b..a6df4e6ea68 100644
--- a/apps/settings/l10n/es_CR.json
+++ b/apps/settings/l10n/es_CR.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_DO.js b/apps/settings/l10n/es_DO.js
index ffc7cf3a38a..1af68056204 100644
--- a/apps/settings/l10n/es_DO.js
+++ b/apps/settings/l10n/es_DO.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_DO.json b/apps/settings/l10n/es_DO.json
index ea1da4faa2b..a6df4e6ea68 100644
--- a/apps/settings/l10n/es_DO.json
+++ b/apps/settings/l10n/es_DO.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_EC.js b/apps/settings/l10n/es_EC.js
index ffc7cf3a38a..1af68056204 100644
--- a/apps/settings/l10n/es_EC.js
+++ b/apps/settings/l10n/es_EC.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_EC.json b/apps/settings/l10n/es_EC.json
index ea1da4faa2b..a6df4e6ea68 100644
--- a/apps/settings/l10n/es_EC.json
+++ b/apps/settings/l10n/es_EC.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_GT.js b/apps/settings/l10n/es_GT.js
index ffc7cf3a38a..1af68056204 100644
--- a/apps/settings/l10n/es_GT.js
+++ b/apps/settings/l10n/es_GT.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_GT.json b/apps/settings/l10n/es_GT.json
index ea1da4faa2b..a6df4e6ea68 100644
--- a/apps/settings/l10n/es_GT.json
+++ b/apps/settings/l10n/es_GT.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_HN.js b/apps/settings/l10n/es_HN.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_HN.js
+++ b/apps/settings/l10n/es_HN.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_HN.json b/apps/settings/l10n/es_HN.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_HN.json
+++ b/apps/settings/l10n/es_HN.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_MX.js b/apps/settings/l10n/es_MX.js
index 1007d5c5436..72e0fc85a64 100644
--- a/apps/settings/l10n/es_MX.js
+++ b/apps/settings/l10n/es_MX.js
@@ -187,6 +187,7 @@ OC.L10N.register(
"Delete user" : "Borrar usuario",
"Disable user" : "Deshabilitar usuario",
"Enable user" : "Habilitar usuario",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_MX.json b/apps/settings/l10n/es_MX.json
index 11dd67ee316..ec44c209a34 100644
--- a/apps/settings/l10n/es_MX.json
+++ b/apps/settings/l10n/es_MX.json
@@ -185,6 +185,7 @@
"Delete user" : "Borrar usuario",
"Disable user" : "Deshabilitar usuario",
"Enable user" : "Habilitar usuario",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_NI.js b/apps/settings/l10n/es_NI.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_NI.js
+++ b/apps/settings/l10n/es_NI.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_NI.json b/apps/settings/l10n/es_NI.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_NI.json
+++ b/apps/settings/l10n/es_NI.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PA.js b/apps/settings/l10n/es_PA.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_PA.js
+++ b/apps/settings/l10n/es_PA.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PA.json b/apps/settings/l10n/es_PA.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_PA.json
+++ b/apps/settings/l10n/es_PA.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PE.js b/apps/settings/l10n/es_PE.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_PE.js
+++ b/apps/settings/l10n/es_PE.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PE.json b/apps/settings/l10n/es_PE.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_PE.json
+++ b/apps/settings/l10n/es_PE.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PR.js b/apps/settings/l10n/es_PR.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_PR.js
+++ b/apps/settings/l10n/es_PR.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PR.json b/apps/settings/l10n/es_PR.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_PR.json
+++ b/apps/settings/l10n/es_PR.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PY.js b/apps/settings/l10n/es_PY.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_PY.js
+++ b/apps/settings/l10n/es_PY.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_PY.json b/apps/settings/l10n/es_PY.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_PY.json
+++ b/apps/settings/l10n/es_PY.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_SV.js b/apps/settings/l10n/es_SV.js
index ffc7cf3a38a..1af68056204 100644
--- a/apps/settings/l10n/es_SV.js
+++ b/apps/settings/l10n/es_SV.js
@@ -165,6 +165,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_SV.json b/apps/settings/l10n/es_SV.json
index ea1da4faa2b..a6df4e6ea68 100644
--- a/apps/settings/l10n/es_SV.json
+++ b/apps/settings/l10n/es_SV.json
@@ -163,6 +163,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_UY.js b/apps/settings/l10n/es_UY.js
index 46248e5d852..03876b1e8b9 100644
--- a/apps/settings/l10n/es_UY.js
+++ b/apps/settings/l10n/es_UY.js
@@ -160,6 +160,7 @@ OC.L10N.register(
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/es_UY.json b/apps/settings/l10n/es_UY.json
index 8cdb5b12313..17c2335aac1 100644
--- a/apps/settings/l10n/es_UY.json
+++ b/apps/settings/l10n/es_UY.json
@@ -158,6 +158,7 @@
"Storage location" : "Úbicación del almacenamiento",
"Last login" : "Último inicio de sesión",
"Default quota" : "Cuota predeterminada",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Unnamed device" : "Dispositivo sin nombre",
"Your apps" : "Tus aplicaciones",
diff --git a/apps/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js
index 7f6b508efd7..cdf3c8aec49 100644
--- a/apps/settings/l10n/et_EE.js
+++ b/apps/settings/l10n/et_EE.js
@@ -174,6 +174,7 @@ OC.L10N.register(
"Enable user" : "Luba kasutaja",
"Resend welcome email" : "Saada tervitusmeil uuesti",
"Welcome mail sent!" : "Tervitusmeil saadetud!",
+ "Edit" : "Redigeeri",
"{size} used" : "{size} kasutatud",
"Unnamed device" : "Nimetu seade",
"Your apps" : "Sinu rakendused",
diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json
index 1b921dd13cd..2690933f17a 100644
--- a/apps/settings/l10n/et_EE.json
+++ b/apps/settings/l10n/et_EE.json
@@ -172,6 +172,7 @@
"Enable user" : "Luba kasutaja",
"Resend welcome email" : "Saada tervitusmeil uuesti",
"Welcome mail sent!" : "Tervitusmeil saadetud!",
+ "Edit" : "Redigeeri",
"{size} used" : "{size} kasutatud",
"Unnamed device" : "Nimetu seade",
"Your apps" : "Sinu rakendused",
diff --git a/apps/settings/l10n/eu.js b/apps/settings/l10n/eu.js
index 7dbbfff37c2..4ec2378a143 100644
--- a/apps/settings/l10n/eu.js
+++ b/apps/settings/l10n/eu.js
@@ -353,7 +353,6 @@ OC.L10N.register(
"Add user to group" : "Gehitu erabiltzailea taldera",
"Set user as admin for" : "Ezarri erabiltzailea admin gisa",
"Select user quota" : "Aukeratu erabiltzaile-kuota ",
- "Toggle user actions menu" : "Txandakatu erabiltzailearen ekintza menua",
"Delete user" : "Ezabatu erabiltzailea",
"Wipe all devices" : "Garbitu gailu guztiak",
"Disable user" : "Desgaitu erabiltzailea",
@@ -366,7 +365,8 @@ OC.L10N.register(
"Account deletion" : "Kontu ezabaketa",
"Delete {userid}'s account" : "Ezabatu {userid} erabiltzailearen kontua",
"Welcome mail sent!" : "Ongi etorri mezua bidalita!",
- "Edit User" : "Erabiltzailea editatu",
+ "Toggle user actions menu" : "Txandakatu erabiltzailearen ekintza menua",
+ "Edit" : "Aldatu",
"{size} used" : "{size} erabilita",
"Passwordless authentication requires a secure connection." : "Pasahitzik gabeko autentifikazioak konexio segurua behar du.",
"Add WebAuthn device" : "Gehitu WebAuthn gailua",
@@ -501,6 +501,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Aukeratu profil-irudia fitxategietatik",
"png or jpg, max. 20 MB" : "png edo jpg, gehienez 20MB",
"Your location" : "Zure kokapena",
+ "Edit User" : "Erabiltzailea editatu",
"Will be autogenerated" : "Automatikoki sortuko da",
"Add a new user" : "Gehitu erabiltze berria",
"Show Languages" : "Erakutsi Hizkuntzak",
diff --git a/apps/settings/l10n/eu.json b/apps/settings/l10n/eu.json
index 2b542312eaf..9301d7140c4 100644
--- a/apps/settings/l10n/eu.json
+++ b/apps/settings/l10n/eu.json
@@ -351,7 +351,6 @@
"Add user to group" : "Gehitu erabiltzailea taldera",
"Set user as admin for" : "Ezarri erabiltzailea admin gisa",
"Select user quota" : "Aukeratu erabiltzaile-kuota ",
- "Toggle user actions menu" : "Txandakatu erabiltzailearen ekintza menua",
"Delete user" : "Ezabatu erabiltzailea",
"Wipe all devices" : "Garbitu gailu guztiak",
"Disable user" : "Desgaitu erabiltzailea",
@@ -364,7 +363,8 @@
"Account deletion" : "Kontu ezabaketa",
"Delete {userid}'s account" : "Ezabatu {userid} erabiltzailearen kontua",
"Welcome mail sent!" : "Ongi etorri mezua bidalita!",
- "Edit User" : "Erabiltzailea editatu",
+ "Toggle user actions menu" : "Txandakatu erabiltzailearen ekintza menua",
+ "Edit" : "Aldatu",
"{size} used" : "{size} erabilita",
"Passwordless authentication requires a secure connection." : "Pasahitzik gabeko autentifikazioak konexio segurua behar du.",
"Add WebAuthn device" : "Gehitu WebAuthn gailua",
@@ -499,6 +499,7 @@
"Choose profile picture from files" : "Aukeratu profil-irudia fitxategietatik",
"png or jpg, max. 20 MB" : "png edo jpg, gehienez 20MB",
"Your location" : "Zure kokapena",
+ "Edit User" : "Erabiltzailea editatu",
"Will be autogenerated" : "Automatikoki sortuko da",
"Add a new user" : "Gehitu erabiltze berria",
"Show Languages" : "Erakutsi Hizkuntzak",
diff --git a/apps/settings/l10n/fa.js b/apps/settings/l10n/fa.js
index 75602ab1d71..a9e45cab08a 100644
--- a/apps/settings/l10n/fa.js
+++ b/apps/settings/l10n/fa.js
@@ -275,7 +275,7 @@ OC.L10N.register(
"Account deletion" : "حذف حساب کاربری",
"Delete {userid}'s account" : "حساب {userid} را حذف کنید",
"Welcome mail sent!" : "نامه خوش آمديد ارسال شد",
- "Edit User" : "ویرایش کاربر",
+ "Edit" : "ویرایش",
"{size} used" : "{size} مورد استفاده",
"Your apps" : "برنامه های شما",
"{license}-licensed" : "دارای مجوز- {license}",
@@ -368,6 +368,7 @@ OC.L10N.register(
"An administrator created app password \"{token}\"" : "مدیری گذرواژهٔ کارهٔ «{token}» را ایجاد کرد",
"Choose profile picture from files" : "گزینش نگارهٔ نمایه از پرونده‌ها",
"png or jpg, max. 20 MB" : "png یا jpg. بیشینه ۲۰ م‌ب",
+ "Edit User" : "ویرایش کاربر",
"Will be autogenerated" : "به صورت خودکار تولید می شود",
"Add a new user" : "افزودن کاربر جدید",
"Show Languages" : "نمایش زبانها",
diff --git a/apps/settings/l10n/fa.json b/apps/settings/l10n/fa.json
index 62d97549bf8..ad6046cb01e 100644
--- a/apps/settings/l10n/fa.json
+++ b/apps/settings/l10n/fa.json
@@ -273,7 +273,7 @@
"Account deletion" : "حذف حساب کاربری",
"Delete {userid}'s account" : "حساب {userid} را حذف کنید",
"Welcome mail sent!" : "نامه خوش آمديد ارسال شد",
- "Edit User" : "ویرایش کاربر",
+ "Edit" : "ویرایش",
"{size} used" : "{size} مورد استفاده",
"Your apps" : "برنامه های شما",
"{license}-licensed" : "دارای مجوز- {license}",
@@ -366,6 +366,7 @@
"An administrator created app password \"{token}\"" : "مدیری گذرواژهٔ کارهٔ «{token}» را ایجاد کرد",
"Choose profile picture from files" : "گزینش نگارهٔ نمایه از پرونده‌ها",
"png or jpg, max. 20 MB" : "png یا jpg. بیشینه ۲۰ م‌ب",
+ "Edit User" : "ویرایش کاربر",
"Will be autogenerated" : "به صورت خودکار تولید می شود",
"Add a new user" : "افزودن کاربر جدید",
"Show Languages" : "نمایش زبانها",
diff --git a/apps/settings/l10n/fi.js b/apps/settings/l10n/fi.js
index 4cbbd41dc1f..f34afe689a2 100644
--- a/apps/settings/l10n/fi.js
+++ b/apps/settings/l10n/fi.js
@@ -300,6 +300,16 @@ OC.L10N.register(
"Common languages" : "Yleiset kielet",
"Other languages" : "Muut kielet",
"New user" : "Uusi käyttäjä",
+ "Either password or email is required" : "Joko salasana tai sähköpostiosoite vaaditaan",
+ "Password (required)" : "Salasana (pakollinen)",
+ "Email (required)" : "Sähköposti (pakollinen)",
+ "Groups (required)" : "Ryhmät (pakollinen)",
+ "Set user groups" : "Aseta käyttäjäryhmät",
+ "Set user quota" : "Aseta käyttäjäkiintiö",
+ "Set default language" : "Aseta oletuskieli",
+ "Add new user" : "Lisää uusi käyttäjä",
+ "Username will be autogenerated" : "Käyttäjänimi luodaan automaattisesti",
+ "Username (required)" : "Käyttäjänimi (pakollinen)",
"You do not have permissions to see the details of this user" : "Käyttöoikeutesi eivät riitä tämän käyttäjän tietojen näkemiseen",
"Edit display name" : "Muokkaa näyttönimeä",
"Add new password" : "Lisää uusi salasana",
@@ -308,7 +318,6 @@ OC.L10N.register(
"Set user as admin for" : "Aseta käyttäjä järjestelmänvalvojaksi kohteelle",
"Select user quota" : "Valitse käyttäjäkiintiö",
"Set the language" : "Aseta kieli",
- "Toggle user actions menu" : "Näytä tai piilota käyttäjätoimintojen valikko",
"Delete user" : "Poista käyttäjä",
"Wipe all devices" : "Tyhjennä kaikki laitteet",
"Disable user" : "Poista käyttäjä käytöstä",
@@ -321,7 +330,8 @@ OC.L10N.register(
"Account deletion" : "Tilin poistaminen",
"Delete {userid}'s account" : "Poista käyttäjän {userid} tili",
"Welcome mail sent!" : "Tervetuloviesti lähetetty!",
- "Edit User" : "Muokkaa käyttäjää",
+ "Toggle user actions menu" : "Näytä tai piilota käyttäjätoimintojen valikko",
+ "Edit" : "Muokkaa",
"{size} used" : "{size} käytetty",
"Passwordless authentication requires a secure connection." : "Tunnistautuminen ilman salasanaa vaatii salatun yhteyden.",
"Add WebAuthn device" : "Lisää WebAuthn-laite",
@@ -347,6 +357,7 @@ OC.L10N.register(
"Disabled users" : "Käytöstä poistetut käyttäjät",
"Default quota:" : "Oletuskiintiö:",
"Select default quota" : "Valitse oletuskiintiö",
+ "Show languages" : "Näytä kielet",
"Show last login" : "Näytä viimeisin sisäänkirjautuminen",
"Show user backend" : "Näytä käyttäjätaustaosa",
"Show storage path" : "Näytä tallennustilan polku",
@@ -446,6 +457,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Valitse profiilikuva tiedostoista",
"png or jpg, max. 20 MB" : "png tai jpg, korkeintaan 20 Mt",
"Your location" : "Sijaintisi",
+ "Edit User" : "Muokkaa käyttäjää",
"Will be autogenerated" : "Luodaan automaattisesti",
"Add a new user" : "Lisää uusi käyttäjä",
"Show Languages" : "Näytä kielet",
diff --git a/apps/settings/l10n/fi.json b/apps/settings/l10n/fi.json
index 02d3a37c232..52b2d7c04d4 100644
--- a/apps/settings/l10n/fi.json
+++ b/apps/settings/l10n/fi.json
@@ -298,6 +298,16 @@
"Common languages" : "Yleiset kielet",
"Other languages" : "Muut kielet",
"New user" : "Uusi käyttäjä",
+ "Either password or email is required" : "Joko salasana tai sähköpostiosoite vaaditaan",
+ "Password (required)" : "Salasana (pakollinen)",
+ "Email (required)" : "Sähköposti (pakollinen)",
+ "Groups (required)" : "Ryhmät (pakollinen)",
+ "Set user groups" : "Aseta käyttäjäryhmät",
+ "Set user quota" : "Aseta käyttäjäkiintiö",
+ "Set default language" : "Aseta oletuskieli",
+ "Add new user" : "Lisää uusi käyttäjä",
+ "Username will be autogenerated" : "Käyttäjänimi luodaan automaattisesti",
+ "Username (required)" : "Käyttäjänimi (pakollinen)",
"You do not have permissions to see the details of this user" : "Käyttöoikeutesi eivät riitä tämän käyttäjän tietojen näkemiseen",
"Edit display name" : "Muokkaa näyttönimeä",
"Add new password" : "Lisää uusi salasana",
@@ -306,7 +316,6 @@
"Set user as admin for" : "Aseta käyttäjä järjestelmänvalvojaksi kohteelle",
"Select user quota" : "Valitse käyttäjäkiintiö",
"Set the language" : "Aseta kieli",
- "Toggle user actions menu" : "Näytä tai piilota käyttäjätoimintojen valikko",
"Delete user" : "Poista käyttäjä",
"Wipe all devices" : "Tyhjennä kaikki laitteet",
"Disable user" : "Poista käyttäjä käytöstä",
@@ -319,7 +328,8 @@
"Account deletion" : "Tilin poistaminen",
"Delete {userid}'s account" : "Poista käyttäjän {userid} tili",
"Welcome mail sent!" : "Tervetuloviesti lähetetty!",
- "Edit User" : "Muokkaa käyttäjää",
+ "Toggle user actions menu" : "Näytä tai piilota käyttäjätoimintojen valikko",
+ "Edit" : "Muokkaa",
"{size} used" : "{size} käytetty",
"Passwordless authentication requires a secure connection." : "Tunnistautuminen ilman salasanaa vaatii salatun yhteyden.",
"Add WebAuthn device" : "Lisää WebAuthn-laite",
@@ -345,6 +355,7 @@
"Disabled users" : "Käytöstä poistetut käyttäjät",
"Default quota:" : "Oletuskiintiö:",
"Select default quota" : "Valitse oletuskiintiö",
+ "Show languages" : "Näytä kielet",
"Show last login" : "Näytä viimeisin sisäänkirjautuminen",
"Show user backend" : "Näytä käyttäjätaustaosa",
"Show storage path" : "Näytä tallennustilan polku",
@@ -444,6 +455,7 @@
"Choose profile picture from files" : "Valitse profiilikuva tiedostoista",
"png or jpg, max. 20 MB" : "png tai jpg, korkeintaan 20 Mt",
"Your location" : "Sijaintisi",
+ "Edit User" : "Muokkaa käyttäjää",
"Will be autogenerated" : "Luodaan automaattisesti",
"Add a new user" : "Lisää uusi käyttäjä",
"Show Languages" : "Näytä kielet",
diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js
index 85fd2592f01..fa11572477c 100644
--- a/apps/settings/l10n/fr.js
+++ b/apps/settings/l10n/fr.js
@@ -175,7 +175,7 @@ OC.L10N.register(
"Visit website" : "Visiter le site web",
"Report a bug" : "Signaler un bogue",
"Admin documentation" : "Documentation administrateur",
- "Developer documentation" : "Documentation pour développeurs",
+ "Developer documentation" : "Documentation développeurs",
"This app is supported via your current Nextcloud subscription." : "Cette application bénéficie d'un support grâce à votre abonnement Nextcloud.",
"Supported" : "Pris en charge",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Les applications mises en avant sont développées par la communauté. Elles proposent des fonctionnalités centrales et sont prêtes pour la production.",
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Sélectionner le quota de l'utilisateur ",
"Set the language" : "Définir la langue",
"Select manager" : "Sélectionnez un gestionnaire",
- "Toggle user actions menu" : "Afficher / Masquer le menu des actions de l'utilisateur",
"Delete user" : "Supprimer l'utilisateur",
"Wipe all devices" : "Effacer tous les appareils",
"Disable user" : "Désactiver l'utilisateur",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "En cas de perte d'appareil ou si vous quittez un groupe ou une organisation, cela pourra supprimer les données de tous les appareils associés à {userid}. Ne fonctionne que si les appareils associés sont connectés à internet.",
"Remote wipe of devices" : "Effacer les appareils à distance",
"Wipe {userid}'s devices" : "Effacer les appareils de {userid}",
+ "Wiped {userid}'s devices" : "L'appareil de {userid}'s a été effacé",
+ "Update of user manager was failed" : "La mise à jour du gestionnaire des utilisateurs a échoué",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Supprime totalement le compte de {userid} et toutes ses données associées (fichiers personnels, données des applications, etc.)",
"Account deletion" : "Suppression de compte",
"Delete {userid}'s account" : "Supprimer le compte {userid}",
+ "Display name was successfully changed" : "Le nom d'affichage a été modifié avec succès",
+ "Password was successfully changed" : "Le mot de passe a été modifié avec succès",
+ "Email was successfully changed" : "L'e-mail a été modifié avec succès",
"Welcome mail sent!" : "E-mail de bienvenue envoyé !",
- "Edit User" : "Modifier l'utilisateur",
+ "Toggle user actions menu" : "Afficher / Masquer le menu des actions de l'utilisateur",
+ "Edit" : "Editer",
"{size} used" : "{size} utilisés",
"Passwordless authentication requires a secure connection." : "L'authentification sans mot de passe requiert une connexion sécurisée.",
"Add WebAuthn device" : "Ajouter un périphérique WebAuthn",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Choisir une image parmi les fichiers",
"png or jpg, max. 20 MB" : "png ou jpg, max. 20 Mo",
"Your location" : "Votre localisation",
+ "Edit User" : "Modifier l'utilisateur",
"Will be autogenerated" : "Sera généré automatiquement",
"Add a new user" : "Ajouter un nouvel utilisateur",
"Show Languages" : "Afficher la langue",
diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json
index defad1506e8..db4c323c032 100644
--- a/apps/settings/l10n/fr.json
+++ b/apps/settings/l10n/fr.json
@@ -173,7 +173,7 @@
"Visit website" : "Visiter le site web",
"Report a bug" : "Signaler un bogue",
"Admin documentation" : "Documentation administrateur",
- "Developer documentation" : "Documentation pour développeurs",
+ "Developer documentation" : "Documentation développeurs",
"This app is supported via your current Nextcloud subscription." : "Cette application bénéficie d'un support grâce à votre abonnement Nextcloud.",
"Supported" : "Pris en charge",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Les applications mises en avant sont développées par la communauté. Elles proposent des fonctionnalités centrales et sont prêtes pour la production.",
@@ -370,7 +370,6 @@
"Select user quota" : "Sélectionner le quota de l'utilisateur ",
"Set the language" : "Définir la langue",
"Select manager" : "Sélectionnez un gestionnaire",
- "Toggle user actions menu" : "Afficher / Masquer le menu des actions de l'utilisateur",
"Delete user" : "Supprimer l'utilisateur",
"Wipe all devices" : "Effacer tous les appareils",
"Disable user" : "Désactiver l'utilisateur",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "En cas de perte d'appareil ou si vous quittez un groupe ou une organisation, cela pourra supprimer les données de tous les appareils associés à {userid}. Ne fonctionne que si les appareils associés sont connectés à internet.",
"Remote wipe of devices" : "Effacer les appareils à distance",
"Wipe {userid}'s devices" : "Effacer les appareils de {userid}",
+ "Wiped {userid}'s devices" : "L'appareil de {userid}'s a été effacé",
+ "Update of user manager was failed" : "La mise à jour du gestionnaire des utilisateurs a échoué",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Supprime totalement le compte de {userid} et toutes ses données associées (fichiers personnels, données des applications, etc.)",
"Account deletion" : "Suppression de compte",
"Delete {userid}'s account" : "Supprimer le compte {userid}",
+ "Display name was successfully changed" : "Le nom d'affichage a été modifié avec succès",
+ "Password was successfully changed" : "Le mot de passe a été modifié avec succès",
+ "Email was successfully changed" : "L'e-mail a été modifié avec succès",
"Welcome mail sent!" : "E-mail de bienvenue envoyé !",
- "Edit User" : "Modifier l'utilisateur",
+ "Toggle user actions menu" : "Afficher / Masquer le menu des actions de l'utilisateur",
+ "Edit" : "Editer",
"{size} used" : "{size} utilisés",
"Passwordless authentication requires a secure connection." : "L'authentification sans mot de passe requiert une connexion sécurisée.",
"Add WebAuthn device" : "Ajouter un périphérique WebAuthn",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Choisir une image parmi les fichiers",
"png or jpg, max. 20 MB" : "png ou jpg, max. 20 Mo",
"Your location" : "Votre localisation",
+ "Edit User" : "Modifier l'utilisateur",
"Will be autogenerated" : "Sera généré automatiquement",
"Add a new user" : "Ajouter un nouvel utilisateur",
"Show Languages" : "Afficher la langue",
diff --git a/apps/settings/l10n/gl.js b/apps/settings/l10n/gl.js
index 24902e6d28c..10c52ea6cb8 100644
--- a/apps/settings/l10n/gl.js
+++ b/apps/settings/l10n/gl.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Seleccionar a cota de usuario",
"Set the language" : "Estabelecer o idioma",
"Select manager" : "Seleccionar o xestor",
- "Toggle user actions menu" : "Alternar o menú de accións do usuario",
"Delete user" : "Eliminar usuario",
"Wipe all devices" : "Limpar todos os dispositivos",
"Disable user" : "Desactivar usuario",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "No caso de perder o dispositivo ou saír da organización, pode limpar os datos de Nextcloud de xeito remoto de todos os dispositivos asociados a {userid}. Só funciona se os dispositivos están conectados Á Internet.",
"Remote wipe of devices" : "Limpeza remota de dispositivos",
"Wipe {userid}'s devices" : "Limpar os dispositivos de {userid}",
+ "Wiped {userid}'s devices" : "Limpáronse os dispositivos de {userid}",
+ "Update of user manager was failed" : "Produciuse un fallo na actualización do xestor de usuarios",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Eliminar completamente a conta de {userid} incluíndo todos os seus ficheiros persoais, datos de aplicacións, etc.",
"Account deletion" : "Eliminación de conta",
"Delete {userid}'s account" : "Eliminar a conta de {userid}",
+ "Display name was successfully changed" : "O nome para amosar foi cambiado satisfactoriamente",
+ "Password was successfully changed" : "O contrasinal foi cambiado satisfactoriamente",
+ "Email was successfully changed" : "O correo foi cambiado satisfactoriamente",
"Welcome mail sent!" : "Enviado o correo de benvida!",
- "Edit User" : "Editar usuario",
+ "Toggle user actions menu" : "Alternar o menú de accións do usuario",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Passwordless authentication requires a secure connection." : "A autenticación sen contrasinal require dunha conexión segura.",
"Add WebAuthn device" : "Engadir un dispositivo WebAuthn",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Escolla a imaxe de perfil en ficheiros",
"png or jpg, max. 20 MB" : "png ou jpg, max. 20 MB",
"Your location" : "A súa localización",
+ "Edit User" : "Editar usuario",
"Will be autogenerated" : "Vai ser xerado automaticamente",
"Add a new user" : "Engadir un novo usuario",
"Show Languages" : "Amosar os idiomas",
diff --git a/apps/settings/l10n/gl.json b/apps/settings/l10n/gl.json
index db95ca8c452..7f77c04182a 100644
--- a/apps/settings/l10n/gl.json
+++ b/apps/settings/l10n/gl.json
@@ -370,7 +370,6 @@
"Select user quota" : "Seleccionar a cota de usuario",
"Set the language" : "Estabelecer o idioma",
"Select manager" : "Seleccionar o xestor",
- "Toggle user actions menu" : "Alternar o menú de accións do usuario",
"Delete user" : "Eliminar usuario",
"Wipe all devices" : "Limpar todos os dispositivos",
"Disable user" : "Desactivar usuario",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "No caso de perder o dispositivo ou saír da organización, pode limpar os datos de Nextcloud de xeito remoto de todos os dispositivos asociados a {userid}. Só funciona se os dispositivos están conectados Á Internet.",
"Remote wipe of devices" : "Limpeza remota de dispositivos",
"Wipe {userid}'s devices" : "Limpar os dispositivos de {userid}",
+ "Wiped {userid}'s devices" : "Limpáronse os dispositivos de {userid}",
+ "Update of user manager was failed" : "Produciuse un fallo na actualización do xestor de usuarios",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Eliminar completamente a conta de {userid} incluíndo todos os seus ficheiros persoais, datos de aplicacións, etc.",
"Account deletion" : "Eliminación de conta",
"Delete {userid}'s account" : "Eliminar a conta de {userid}",
+ "Display name was successfully changed" : "O nome para amosar foi cambiado satisfactoriamente",
+ "Password was successfully changed" : "O contrasinal foi cambiado satisfactoriamente",
+ "Email was successfully changed" : "O correo foi cambiado satisfactoriamente",
"Welcome mail sent!" : "Enviado o correo de benvida!",
- "Edit User" : "Editar usuario",
+ "Toggle user actions menu" : "Alternar o menú de accións do usuario",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Passwordless authentication requires a secure connection." : "A autenticación sen contrasinal require dunha conexión segura.",
"Add WebAuthn device" : "Engadir un dispositivo WebAuthn",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Escolla a imaxe de perfil en ficheiros",
"png or jpg, max. 20 MB" : "png ou jpg, max. 20 MB",
"Your location" : "A súa localización",
+ "Edit User" : "Editar usuario",
"Will be autogenerated" : "Vai ser xerado automaticamente",
"Add a new user" : "Engadir un novo usuario",
"Show Languages" : "Amosar os idiomas",
diff --git a/apps/settings/l10n/he.js b/apps/settings/l10n/he.js
index c13de2ae855..62c7acc1932 100644
--- a/apps/settings/l10n/he.js
+++ b/apps/settings/l10n/he.js
@@ -240,7 +240,6 @@ OC.L10N.register(
"Add new email address" : "הוספת כתובת דוא״ל חדשה",
"Set user as admin for" : "הגדרת משתמש כהנהלה של",
"Select user quota" : "בחירת מכסת משתמש",
- "Toggle user actions menu" : "החלפת מצב תפריט פעולות משתמש",
"Delete user" : "מחיקת משתמש",
"Wipe all devices" : "השמדת נתוני כל המכשירים",
"Disable user" : "השבתת משתמש",
@@ -253,7 +252,8 @@ OC.L10N.register(
"Account deletion" : "מחיקת חשבון",
"Delete {userid}'s account" : "מחיקת החשבון של {userid}",
"Welcome mail sent!" : "נשלחה הודעת קבלת פנים בדוא״ל!",
- "Edit User" : "עריכת משתמש",
+ "Toggle user actions menu" : "החלפת מצב תפריט פעולות משתמש",
+ "Edit" : "עריכה",
"{size} used" : "{size} בשימוש",
"Passwordless authentication requires a secure connection." : "אימות ללא ססמה דורש חיבור מוצפן.",
"Add WebAuthn device" : "הוספת התקן WebAuthn",
@@ -360,6 +360,7 @@ OC.L10N.register(
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "אם משמשים אותך יישומי צד־שלישי להתחברות אל Nextcloud, נא לוודא יצירת והגדרת ססמה ליישומון לכל אחד מהם בטרם הפעלת אימות דו־שלבי.",
"You created app password \"{token}\"" : "יצרת ססמה „{token}” ליישומון",
"png or jpg, max. 20 MB" : "png או jpg, מקסימום 20 מגה-בייט",
+ "Edit User" : "עריכת משתמש",
"Will be autogenerated" : "ייווצר אוטומטית",
"Add a new user" : "הוספת משתמש חדש",
"Show Languages" : "הצגת שפות",
diff --git a/apps/settings/l10n/he.json b/apps/settings/l10n/he.json
index 486f5032c89..a79c708f6ca 100644
--- a/apps/settings/l10n/he.json
+++ b/apps/settings/l10n/he.json
@@ -238,7 +238,6 @@
"Add new email address" : "הוספת כתובת דוא״ל חדשה",
"Set user as admin for" : "הגדרת משתמש כהנהלה של",
"Select user quota" : "בחירת מכסת משתמש",
- "Toggle user actions menu" : "החלפת מצב תפריט פעולות משתמש",
"Delete user" : "מחיקת משתמש",
"Wipe all devices" : "השמדת נתוני כל המכשירים",
"Disable user" : "השבתת משתמש",
@@ -251,7 +250,8 @@
"Account deletion" : "מחיקת חשבון",
"Delete {userid}'s account" : "מחיקת החשבון של {userid}",
"Welcome mail sent!" : "נשלחה הודעת קבלת פנים בדוא״ל!",
- "Edit User" : "עריכת משתמש",
+ "Toggle user actions menu" : "החלפת מצב תפריט פעולות משתמש",
+ "Edit" : "עריכה",
"{size} used" : "{size} בשימוש",
"Passwordless authentication requires a secure connection." : "אימות ללא ססמה דורש חיבור מוצפן.",
"Add WebAuthn device" : "הוספת התקן WebAuthn",
@@ -358,6 +358,7 @@
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "אם משמשים אותך יישומי צד־שלישי להתחברות אל Nextcloud, נא לוודא יצירת והגדרת ססמה ליישומון לכל אחד מהם בטרם הפעלת אימות דו־שלבי.",
"You created app password \"{token}\"" : "יצרת ססמה „{token}” ליישומון",
"png or jpg, max. 20 MB" : "png או jpg, מקסימום 20 מגה-בייט",
+ "Edit User" : "עריכת משתמש",
"Will be autogenerated" : "ייווצר אוטומטית",
"Add a new user" : "הוספת משתמש חדש",
"Show Languages" : "הצגת שפות",
diff --git a/apps/settings/l10n/hr.js b/apps/settings/l10n/hr.js
index 4ee98d23449..ea44bf0c498 100644
--- a/apps/settings/l10n/hr.js
+++ b/apps/settings/l10n/hr.js
@@ -280,7 +280,6 @@ OC.L10N.register(
"Add user to group" : "Dodaj korisnika u grupu",
"Set user as admin for" : "Postavi korisnika kao administratora za",
"Select user quota" : "Odaberi kvotu korisnika",
- "Toggle user actions menu" : "Uklj./isklj. izbornik s radnjama korisnika",
"Delete user" : "Izbriši korisnika",
"Wipe all devices" : "Izbriši podatke sa svih uređaja",
"Disable user" : "Onemogući korisnika",
@@ -293,7 +292,8 @@ OC.L10N.register(
"Account deletion" : "Brisanje računa",
"Delete {userid}'s account" : "Izbriši račun koji pripada {userid}",
"Welcome mail sent!" : "Poslana poruka dobrodošlice!",
- "Edit User" : "Uredi korisnika",
+ "Toggle user actions menu" : "Uklj./isklj. izbornik s radnjama korisnika",
+ "Edit" : "Uredi",
"{size} used" : "Iskorišteno {size}",
"Passwordless authentication requires a secure connection." : "Autentifikacija bez zaporke zahtijeva sigurnu vezu.",
"Add WebAuthn device" : "Dodaj WebAuthn uređaj",
@@ -419,6 +419,7 @@ OC.L10N.register(
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Ako se za povezivanje s Nextcloudom koristite aplikacijama treće strane, stvorite i konfigurirajte lozinku za svaku aplikaciju prije omogućavanja drugog faktora za provođenje autentifikacije.",
"You created app password \"{token}\"" : "Stvorili ste zaporku aplikacije „{token}”",
"png or jpg, max. 20 MB" : "png ili jpg, maks. 20 MB",
+ "Edit User" : "Uredi korisnika",
"Will be autogenerated" : "Automatski će se generirati",
"Add a new user" : "Dodaj novog korisnika",
"Show Languages" : "Prikaži jezike",
diff --git a/apps/settings/l10n/hr.json b/apps/settings/l10n/hr.json
index 00368407b99..b0b6638f7db 100644
--- a/apps/settings/l10n/hr.json
+++ b/apps/settings/l10n/hr.json
@@ -278,7 +278,6 @@
"Add user to group" : "Dodaj korisnika u grupu",
"Set user as admin for" : "Postavi korisnika kao administratora za",
"Select user quota" : "Odaberi kvotu korisnika",
- "Toggle user actions menu" : "Uklj./isklj. izbornik s radnjama korisnika",
"Delete user" : "Izbriši korisnika",
"Wipe all devices" : "Izbriši podatke sa svih uređaja",
"Disable user" : "Onemogući korisnika",
@@ -291,7 +290,8 @@
"Account deletion" : "Brisanje računa",
"Delete {userid}'s account" : "Izbriši račun koji pripada {userid}",
"Welcome mail sent!" : "Poslana poruka dobrodošlice!",
- "Edit User" : "Uredi korisnika",
+ "Toggle user actions menu" : "Uklj./isklj. izbornik s radnjama korisnika",
+ "Edit" : "Uredi",
"{size} used" : "Iskorišteno {size}",
"Passwordless authentication requires a secure connection." : "Autentifikacija bez zaporke zahtijeva sigurnu vezu.",
"Add WebAuthn device" : "Dodaj WebAuthn uređaj",
@@ -417,6 +417,7 @@
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Ako se za povezivanje s Nextcloudom koristite aplikacijama treće strane, stvorite i konfigurirajte lozinku za svaku aplikaciju prije omogućavanja drugog faktora za provođenje autentifikacije.",
"You created app password \"{token}\"" : "Stvorili ste zaporku aplikacije „{token}”",
"png or jpg, max. 20 MB" : "png ili jpg, maks. 20 MB",
+ "Edit User" : "Uredi korisnika",
"Will be autogenerated" : "Automatski će se generirati",
"Add a new user" : "Dodaj novog korisnika",
"Show Languages" : "Prikaži jezike",
diff --git a/apps/settings/l10n/hu.js b/apps/settings/l10n/hu.js
index e8b1deae8da..02119deda15 100644
--- a/apps/settings/l10n/hu.js
+++ b/apps/settings/l10n/hu.js
@@ -358,7 +358,6 @@ OC.L10N.register(
"Select user quota" : "Válasszon felhasználói kvótát",
"Set the language" : "Nyelv beállítása",
"Select manager" : "Kezelő kiválasztása",
- "Toggle user actions menu" : "Felhasználói műveletek menü be/ki",
"Delete user" : "Felhasználó törlése",
"Wipe all devices" : "Összes eszköz törlése",
"Disable user" : "Felhasználó tiltása",
@@ -371,7 +370,8 @@ OC.L10N.register(
"Account deletion" : "Fiók törlése",
"Delete {userid}'s account" : "{userid} fiókjának törlése",
"Welcome mail sent!" : "Üdvözlő üzenet elküldve!",
- "Edit User" : "Felhasználó szerkesztése",
+ "Toggle user actions menu" : "Felhasználói műveletek menü be/ki",
+ "Edit" : "Szerkesztés",
"{size} used" : "{size} felhasználva",
"Passwordless authentication requires a secure connection." : "A jelszó nélküli hitelesítés biztonságos kapcsolatot igényel.",
"Add WebAuthn device" : "WebAuth eszköz hozzáadása",
@@ -508,6 +508,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Válasszon profilképet a fájlok közül",
"png or jpg, max. 20 MB" : "png vagy jpg, legfeljebb 20 MB",
"Your location" : "A saját helye",
+ "Edit User" : "Felhasználó szerkesztése",
"Will be autogenerated" : "Automatikusan lesz elkészítve",
"Add a new user" : "Új felhasználó felvétele",
"Show Languages" : "Nyelvek megjelenítése",
diff --git a/apps/settings/l10n/hu.json b/apps/settings/l10n/hu.json
index d35a5be012e..76534390d3a 100644
--- a/apps/settings/l10n/hu.json
+++ b/apps/settings/l10n/hu.json
@@ -356,7 +356,6 @@
"Select user quota" : "Válasszon felhasználói kvótát",
"Set the language" : "Nyelv beállítása",
"Select manager" : "Kezelő kiválasztása",
- "Toggle user actions menu" : "Felhasználói műveletek menü be/ki",
"Delete user" : "Felhasználó törlése",
"Wipe all devices" : "Összes eszköz törlése",
"Disable user" : "Felhasználó tiltása",
@@ -369,7 +368,8 @@
"Account deletion" : "Fiók törlése",
"Delete {userid}'s account" : "{userid} fiókjának törlése",
"Welcome mail sent!" : "Üdvözlő üzenet elküldve!",
- "Edit User" : "Felhasználó szerkesztése",
+ "Toggle user actions menu" : "Felhasználói műveletek menü be/ki",
+ "Edit" : "Szerkesztés",
"{size} used" : "{size} felhasználva",
"Passwordless authentication requires a secure connection." : "A jelszó nélküli hitelesítés biztonságos kapcsolatot igényel.",
"Add WebAuthn device" : "WebAuth eszköz hozzáadása",
@@ -506,6 +506,7 @@
"Choose profile picture from files" : "Válasszon profilképet a fájlok közül",
"png or jpg, max. 20 MB" : "png vagy jpg, legfeljebb 20 MB",
"Your location" : "A saját helye",
+ "Edit User" : "Felhasználó szerkesztése",
"Will be autogenerated" : "Automatikusan lesz elkészítve",
"Add a new user" : "Új felhasználó felvétele",
"Show Languages" : "Nyelvek megjelenítése",
diff --git a/apps/settings/l10n/ia.js b/apps/settings/l10n/ia.js
index 67334279e14..0d7a2dc5abc 100644
--- a/apps/settings/l10n/ia.js
+++ b/apps/settings/l10n/ia.js
@@ -87,6 +87,7 @@ OC.L10N.register(
"Email" : "E-posta",
"Quota" : "Quota",
"Default quota" : "Quota predefinite",
+ "Edit" : "Modificar",
"Add group" : "Adder gruppo",
"Active users" : "Usatores active",
"Admins" : "Administratores",
diff --git a/apps/settings/l10n/ia.json b/apps/settings/l10n/ia.json
index 9fb3990808d..41395c66c38 100644
--- a/apps/settings/l10n/ia.json
+++ b/apps/settings/l10n/ia.json
@@ -85,6 +85,7 @@
"Email" : "E-posta",
"Quota" : "Quota",
"Default quota" : "Quota predefinite",
+ "Edit" : "Modificar",
"Add group" : "Adder gruppo",
"Active users" : "Usatores active",
"Admins" : "Administratores",
diff --git a/apps/settings/l10n/id.js b/apps/settings/l10n/id.js
index 0db7f37c565..1655548b284 100644
--- a/apps/settings/l10n/id.js
+++ b/apps/settings/l10n/id.js
@@ -261,6 +261,7 @@ OC.L10N.register(
"Enable user" : "Aktifkan pengguna",
"Resend welcome email" : "Kirim ulang surel selamat datang",
"Welcome mail sent!" : "Surat selamat datang terkirim!",
+ "Edit" : "Sunting",
"{size} used" : "{size} digunakan",
"Passwordless authentication requires a secure connection." : "Otentikasi tanpa kata sandi membutuhkan koneksi aman.",
"Passwordless Authentication" : "Otentikasi Tanpa Kata Sandi",
diff --git a/apps/settings/l10n/id.json b/apps/settings/l10n/id.json
index bba083dcb66..330d5063a08 100644
--- a/apps/settings/l10n/id.json
+++ b/apps/settings/l10n/id.json
@@ -259,6 +259,7 @@
"Enable user" : "Aktifkan pengguna",
"Resend welcome email" : "Kirim ulang surel selamat datang",
"Welcome mail sent!" : "Surat selamat datang terkirim!",
+ "Edit" : "Sunting",
"{size} used" : "{size} digunakan",
"Passwordless authentication requires a secure connection." : "Otentikasi tanpa kata sandi membutuhkan koneksi aman.",
"Passwordless Authentication" : "Otentikasi Tanpa Kata Sandi",
diff --git a/apps/settings/l10n/is.js b/apps/settings/l10n/is.js
index cdb95c88343..4930cc79c6e 100644
--- a/apps/settings/l10n/is.js
+++ b/apps/settings/l10n/is.js
@@ -235,6 +235,7 @@ OC.L10N.register(
"Account deletion" : "Eyðing á aðgangi",
"Delete {userid}'s account" : "Eyða notandaaðgangi {userid}",
"Welcome mail sent!" : "Kveðjupóstur sendur!",
+ "Edit" : "Breyta",
"{size} used" : "{size} notað",
"Passwordless authentication requires a secure connection." : "Lykilorðalaus auðkenning krefst öruggrar tengingar.",
"Add WebAuthn device" : "Bæta við WebAuthn-tæki",
diff --git a/apps/settings/l10n/is.json b/apps/settings/l10n/is.json
index 0cff43aec0f..7bbfc28590b 100644
--- a/apps/settings/l10n/is.json
+++ b/apps/settings/l10n/is.json
@@ -233,6 +233,7 @@
"Account deletion" : "Eyðing á aðgangi",
"Delete {userid}'s account" : "Eyða notandaaðgangi {userid}",
"Welcome mail sent!" : "Kveðjupóstur sendur!",
+ "Edit" : "Breyta",
"{size} used" : "{size} notað",
"Passwordless authentication requires a secure connection." : "Lykilorðalaus auðkenning krefst öruggrar tengingar.",
"Add WebAuthn device" : "Bæta við WebAuthn-tæki",
diff --git a/apps/settings/l10n/it.js b/apps/settings/l10n/it.js
index f68c6d3eaf8..861e930ba8c 100644
--- a/apps/settings/l10n/it.js
+++ b/apps/settings/l10n/it.js
@@ -313,7 +313,6 @@ OC.L10N.register(
"Add user to group" : "Aggiungi utente al gruppo",
"Set user as admin for" : "Imposta utente come amministratore per",
"Select user quota" : "Seleziona quota utente",
- "Toggle user actions menu" : "Commuta il menu delle azioni utente",
"Delete user" : "Elimina utente",
"Wipe all devices" : "Cancella tutti i dispositivi",
"Disable user" : "Disabilita utente",
@@ -326,7 +325,8 @@ OC.L10N.register(
"Account deletion" : "Eliminazione account",
"Delete {userid}'s account" : "Elimina l'account di {userid}",
"Welcome mail sent!" : "Email di benvenuto inviata!",
- "Edit User" : "Modifica utente",
+ "Toggle user actions menu" : "Commuta il menu delle azioni utente",
+ "Edit" : "Modifica",
"{size} used" : "{size} utilizzati",
"Passwordless authentication requires a secure connection." : "L'autenticazione senza password richiede una connessione sicura.",
"Add WebAuthn device" : "Aggiungi dispositivo WebAuthn",
@@ -456,6 +456,7 @@ OC.L10N.register(
"You created app password \"{token}\"" : "Hai creato la password di applicazione \"{token}\"",
"An administrator created app password \"{token}\"" : "Un amministratore ha creato per l'app la password \"{token}\" ",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
+ "Edit User" : "Modifica utente",
"Will be autogenerated" : "Sarà generata automaticamente",
"Add a new user" : "Aggiungi un nuovo utente",
"Show Languages" : "Mostra lingue",
diff --git a/apps/settings/l10n/it.json b/apps/settings/l10n/it.json
index dc53c144763..ac1ad0f9f99 100644
--- a/apps/settings/l10n/it.json
+++ b/apps/settings/l10n/it.json
@@ -311,7 +311,6 @@
"Add user to group" : "Aggiungi utente al gruppo",
"Set user as admin for" : "Imposta utente come amministratore per",
"Select user quota" : "Seleziona quota utente",
- "Toggle user actions menu" : "Commuta il menu delle azioni utente",
"Delete user" : "Elimina utente",
"Wipe all devices" : "Cancella tutti i dispositivi",
"Disable user" : "Disabilita utente",
@@ -324,7 +323,8 @@
"Account deletion" : "Eliminazione account",
"Delete {userid}'s account" : "Elimina l'account di {userid}",
"Welcome mail sent!" : "Email di benvenuto inviata!",
- "Edit User" : "Modifica utente",
+ "Toggle user actions menu" : "Commuta il menu delle azioni utente",
+ "Edit" : "Modifica",
"{size} used" : "{size} utilizzati",
"Passwordless authentication requires a secure connection." : "L'autenticazione senza password richiede una connessione sicura.",
"Add WebAuthn device" : "Aggiungi dispositivo WebAuthn",
@@ -454,6 +454,7 @@
"You created app password \"{token}\"" : "Hai creato la password di applicazione \"{token}\"",
"An administrator created app password \"{token}\"" : "Un amministratore ha creato per l'app la password \"{token}\" ",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
+ "Edit User" : "Modifica utente",
"Will be autogenerated" : "Sarà generata automaticamente",
"Add a new user" : "Aggiungi un nuovo utente",
"Show Languages" : "Mostra lingue",
diff --git a/apps/settings/l10n/ja.js b/apps/settings/l10n/ja.js
index 5d65b3ec70a..ed569d04a0b 100644
--- a/apps/settings/l10n/ja.js
+++ b/apps/settings/l10n/ja.js
@@ -346,7 +346,6 @@ OC.L10N.register(
"Add user to group" : "ユーザーをグループに追加",
"Set user as admin for" : "ユーザーを管理者に設定します",
"Select user quota" : "ユーザークオータを選択",
- "Toggle user actions menu" : "ユーザーアクションメニューを切り替える",
"Delete user" : "ユーザーを削除",
"Wipe all devices" : "すべての端末をワイプ",
"Disable user" : "ユーザーを無効",
@@ -359,7 +358,8 @@ OC.L10N.register(
"Account deletion" : "アカウント削除",
"Delete {userid}'s account" : "{userid} のアカウントを削除する",
"Welcome mail sent!" : "ウェルカムメールを送信しました!",
- "Edit User" : "ユーザーを編集する",
+ "Toggle user actions menu" : "ユーザーアクションメニューを切り替える",
+ "Edit" : "編集",
"{size} used" : "{size} を使用中",
"Passwordless authentication requires a secure connection." : "パスワードレス認証では、安全な接続が必要です。",
"Add WebAuthn device" : "WebAuthn デバイスの追加",
@@ -494,6 +494,7 @@ OC.L10N.register(
"Choose profile picture from files" : "ファイルからプロフィール画像を選択",
"png or jpg, max. 20 MB" : "pngまたはjpg。最大20MB",
"Your location" : "位置情報",
+ "Edit User" : "ユーザーを編集する",
"Will be autogenerated" : "自動生成されます",
"Add a new user" : "新しいユーザーを追加",
"Show Languages" : "言語を表示",
diff --git a/apps/settings/l10n/ja.json b/apps/settings/l10n/ja.json
index f8c81e87395..b8060e76085 100644
--- a/apps/settings/l10n/ja.json
+++ b/apps/settings/l10n/ja.json
@@ -344,7 +344,6 @@
"Add user to group" : "ユーザーをグループに追加",
"Set user as admin for" : "ユーザーを管理者に設定します",
"Select user quota" : "ユーザークオータを選択",
- "Toggle user actions menu" : "ユーザーアクションメニューを切り替える",
"Delete user" : "ユーザーを削除",
"Wipe all devices" : "すべての端末をワイプ",
"Disable user" : "ユーザーを無効",
@@ -357,7 +356,8 @@
"Account deletion" : "アカウント削除",
"Delete {userid}'s account" : "{userid} のアカウントを削除する",
"Welcome mail sent!" : "ウェルカムメールを送信しました!",
- "Edit User" : "ユーザーを編集する",
+ "Toggle user actions menu" : "ユーザーアクションメニューを切り替える",
+ "Edit" : "編集",
"{size} used" : "{size} を使用中",
"Passwordless authentication requires a secure connection." : "パスワードレス認証では、安全な接続が必要です。",
"Add WebAuthn device" : "WebAuthn デバイスの追加",
@@ -492,6 +492,7 @@
"Choose profile picture from files" : "ファイルからプロフィール画像を選択",
"png or jpg, max. 20 MB" : "pngまたはjpg。最大20MB",
"Your location" : "位置情報",
+ "Edit User" : "ユーザーを編集する",
"Will be autogenerated" : "自動生成されます",
"Add a new user" : "新しいユーザーを追加",
"Show Languages" : "言語を表示",
diff --git a/apps/settings/l10n/ka_GE.js b/apps/settings/l10n/ka_GE.js
index e7f8219b2a3..5f15b6a33ef 100644
--- a/apps/settings/l10n/ka_GE.js
+++ b/apps/settings/l10n/ka_GE.js
@@ -164,6 +164,7 @@ OC.L10N.register(
"Storage location" : "საცავის ადგილმდებარეობა",
"Last login" : "ბოლო ავტორიზაცია",
"Default quota" : "საწყისი კვოტა",
+ "Edit" : "შეცვლა",
"{size} used" : "მოხმარებულია {size}",
"Unnamed device" : "უსახელო მოწყობილობა",
"Your apps" : "თქვენი აპლიკაციები",
diff --git a/apps/settings/l10n/ka_GE.json b/apps/settings/l10n/ka_GE.json
index 0fe2f3890e4..34922fc90b9 100644
--- a/apps/settings/l10n/ka_GE.json
+++ b/apps/settings/l10n/ka_GE.json
@@ -162,6 +162,7 @@
"Storage location" : "საცავის ადგილმდებარეობა",
"Last login" : "ბოლო ავტორიზაცია",
"Default quota" : "საწყისი კვოტა",
+ "Edit" : "შეცვლა",
"{size} used" : "მოხმარებულია {size}",
"Unnamed device" : "უსახელო მოწყობილობა",
"Your apps" : "თქვენი აპლიკაციები",
diff --git a/apps/settings/l10n/ko.js b/apps/settings/l10n/ko.js
index 072f372cc92..b89e6d59626 100644
--- a/apps/settings/l10n/ko.js
+++ b/apps/settings/l10n/ko.js
@@ -332,7 +332,7 @@ OC.L10N.register(
"Account deletion" : "계정 삭제",
"Delete {userid}'s account" : "{userid}의 계정 삭제",
"Welcome mail sent!" : "환영 메일을 보냈습니다!",
- "Edit User" : "사용자 편집",
+ "Edit" : "편집",
"{size} used" : "{size} 사용됨",
"Passwordless authentication requires a secure connection." : "무암호 인증을 위해 보안 연결이 필요합니다.",
"Add WebAuthn device" : "WebAuthn 기기 추가",
@@ -454,6 +454,7 @@ OC.L10N.register(
"An administrator created app password \"{token}\"" : "관리자가 앱 패스워드 \"{token}\"을(를) 생성함",
"png or jpg, max. 20 MB" : "PNG, JPG, 최대 20MB",
"Your location" : "내 위치",
+ "Edit User" : "사용자 편집",
"Will be autogenerated" : "자동으로 생성될 것임",
"Add a new user" : "새 사용자 추가",
"Show Languages" : "언어 보이기",
diff --git a/apps/settings/l10n/ko.json b/apps/settings/l10n/ko.json
index 31fd51b359a..9513a901c36 100644
--- a/apps/settings/l10n/ko.json
+++ b/apps/settings/l10n/ko.json
@@ -330,7 +330,7 @@
"Account deletion" : "계정 삭제",
"Delete {userid}'s account" : "{userid}의 계정 삭제",
"Welcome mail sent!" : "환영 메일을 보냈습니다!",
- "Edit User" : "사용자 편집",
+ "Edit" : "편집",
"{size} used" : "{size} 사용됨",
"Passwordless authentication requires a secure connection." : "무암호 인증을 위해 보안 연결이 필요합니다.",
"Add WebAuthn device" : "WebAuthn 기기 추가",
@@ -452,6 +452,7 @@
"An administrator created app password \"{token}\"" : "관리자가 앱 패스워드 \"{token}\"을(를) 생성함",
"png or jpg, max. 20 MB" : "PNG, JPG, 최대 20MB",
"Your location" : "내 위치",
+ "Edit User" : "사용자 편집",
"Will be autogenerated" : "자동으로 생성될 것임",
"Add a new user" : "새 사용자 추가",
"Show Languages" : "언어 보이기",
diff --git a/apps/settings/l10n/lt_LT.js b/apps/settings/l10n/lt_LT.js
index 49afeee36f0..ef95ae809b7 100644
--- a/apps/settings/l10n/lt_LT.js
+++ b/apps/settings/l10n/lt_LT.js
@@ -311,7 +311,6 @@ OC.L10N.register(
"Add user to group" : "Pridėti naudotoją į grupę",
"Set user as admin for" : "Nustatyti vartotoją kaip administratorių ",
"Select user quota" : "Pasirinkite leidžiamą duomenų kiekį naudotojui",
- "Toggle user actions menu" : "Perjungti vartotojo veiksmų meniu ",
"Delete user" : "Ištrinti naudotoją",
"Wipe all devices" : "Ištrinti duomenis visuose įrenginiuose",
"Disable user" : "Išjungti naudotoją",
@@ -324,7 +323,8 @@ OC.L10N.register(
"Account deletion" : "Paskyros ištrynimas",
"Delete {userid}'s account" : "Ištrinti naudtojo {userid} paskyrą",
"Welcome mail sent!" : "Pasveikinimo laiškas išsiųstas!",
- "Edit User" : "Taisyti naudotoją",
+ "Toggle user actions menu" : "Perjungti vartotojo veiksmų meniu ",
+ "Edit" : "Taisyti",
"{size} used" : "{size} naudojama",
"Passwordless authentication requires a secure connection." : "Tapatybės nustatymas be slaptažodžio reikalauja saugaus ryšio.",
"Add WebAuthn device" : "Pridėti WebAuthn įrenginį",
@@ -442,6 +442,7 @@ OC.L10N.register(
"You created app password \"{token}\"" : "Jūs sukūrėte programėlės slaptažodį \"{token}\"",
"An administrator created app password \"{token}\"" : "Administratorius sukūrė programėlės slaptažodį „{token}“",
"png or jpg, max. 20 MB" : "png arba jpg, daugiausiai 20 MB",
+ "Edit User" : "Taisyti naudotoją",
"Will be autogenerated" : "Bus automatiškai sugeneruotas ",
"Add a new user" : "Pridėti naują naudotoją",
"Show Languages" : "Rodyti kalbas",
diff --git a/apps/settings/l10n/lt_LT.json b/apps/settings/l10n/lt_LT.json
index 21684460e96..30c15cca778 100644
--- a/apps/settings/l10n/lt_LT.json
+++ b/apps/settings/l10n/lt_LT.json
@@ -309,7 +309,6 @@
"Add user to group" : "Pridėti naudotoją į grupę",
"Set user as admin for" : "Nustatyti vartotoją kaip administratorių ",
"Select user quota" : "Pasirinkite leidžiamą duomenų kiekį naudotojui",
- "Toggle user actions menu" : "Perjungti vartotojo veiksmų meniu ",
"Delete user" : "Ištrinti naudotoją",
"Wipe all devices" : "Ištrinti duomenis visuose įrenginiuose",
"Disable user" : "Išjungti naudotoją",
@@ -322,7 +321,8 @@
"Account deletion" : "Paskyros ištrynimas",
"Delete {userid}'s account" : "Ištrinti naudtojo {userid} paskyrą",
"Welcome mail sent!" : "Pasveikinimo laiškas išsiųstas!",
- "Edit User" : "Taisyti naudotoją",
+ "Toggle user actions menu" : "Perjungti vartotojo veiksmų meniu ",
+ "Edit" : "Taisyti",
"{size} used" : "{size} naudojama",
"Passwordless authentication requires a secure connection." : "Tapatybės nustatymas be slaptažodžio reikalauja saugaus ryšio.",
"Add WebAuthn device" : "Pridėti WebAuthn įrenginį",
@@ -440,6 +440,7 @@
"You created app password \"{token}\"" : "Jūs sukūrėte programėlės slaptažodį \"{token}\"",
"An administrator created app password \"{token}\"" : "Administratorius sukūrė programėlės slaptažodį „{token}“",
"png or jpg, max. 20 MB" : "png arba jpg, daugiausiai 20 MB",
+ "Edit User" : "Taisyti naudotoją",
"Will be autogenerated" : "Bus automatiškai sugeneruotas ",
"Add a new user" : "Pridėti naują naudotoją",
"Show Languages" : "Rodyti kalbas",
diff --git a/apps/settings/l10n/lv.js b/apps/settings/l10n/lv.js
index f50ab24ed0d..5e82f5e31cb 100644
--- a/apps/settings/l10n/lv.js
+++ b/apps/settings/l10n/lv.js
@@ -114,6 +114,7 @@ OC.L10N.register(
"Storage location" : "Krātuves atrašanās vieta",
"Last login" : "Pēdējā pieteikšanās",
"Default quota" : "Apjoms pēc noklusējuma",
+ "Edit" : "Rediģēt",
"Changelog" : "Izmaiņu žurnāls",
"Add group" : "Pievienot grupu",
"Active users" : "Aktīvie lietotāji",
diff --git a/apps/settings/l10n/lv.json b/apps/settings/l10n/lv.json
index d89811f2558..033b015ac82 100644
--- a/apps/settings/l10n/lv.json
+++ b/apps/settings/l10n/lv.json
@@ -112,6 +112,7 @@
"Storage location" : "Krātuves atrašanās vieta",
"Last login" : "Pēdējā pieteikšanās",
"Default quota" : "Apjoms pēc noklusējuma",
+ "Edit" : "Rediģēt",
"Changelog" : "Izmaiņu žurnāls",
"Add group" : "Pievienot grupu",
"Active users" : "Aktīvie lietotāji",
diff --git a/apps/settings/l10n/mk.js b/apps/settings/l10n/mk.js
index c511c01ddeb..02f4533192f 100644
--- a/apps/settings/l10n/mk.js
+++ b/apps/settings/l10n/mk.js
@@ -345,7 +345,6 @@ OC.L10N.register(
"Set user as admin for" : "Назначи го корисникот како администратор за",
"Select user quota" : "Избери квота за корисник",
"Set the language" : "Постави јазик",
- "Toggle user actions menu" : "Вклучи го менито за активности",
"Delete user" : "Избриши корисник",
"Wipe all devices" : "Избриши ги сите уреди",
"Disable user" : "Оневозможи корисник",
@@ -358,7 +357,8 @@ OC.L10N.register(
"Account deletion" : "Бришење на сметката",
"Delete {userid}'s account" : "Избриши го корисникот {userid}",
"Welcome mail sent!" : "Испратена е-пошта порака за добредојде!",
- "Edit User" : "Уреди корисник",
+ "Toggle user actions menu" : "Вклучи го менито за активности",
+ "Edit" : "Уреди",
"{size} used" : "искористено {size}",
"Passwordless authentication requires a secure connection." : "За најавување без лозинка потребно е да се користи безбедна врска.",
"Add WebAuthn device" : "Додади WebAuthn уред",
@@ -491,6 +491,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Избери фотографија на профилот од датотеките",
"png or jpg, max. 20 MB" : "png или jpg, максимум 20 MB",
"Your location" : "Ваша локација",
+ "Edit User" : "Уреди корисник",
"Will be autogenerated" : "Ќе бидат автоматски генерирани",
"Add a new user" : "Додади нов корисник",
"Show Languages" : "Прикажи јазици",
diff --git a/apps/settings/l10n/mk.json b/apps/settings/l10n/mk.json
index bd33f718c6a..0fc12458085 100644
--- a/apps/settings/l10n/mk.json
+++ b/apps/settings/l10n/mk.json
@@ -343,7 +343,6 @@
"Set user as admin for" : "Назначи го корисникот како администратор за",
"Select user quota" : "Избери квота за корисник",
"Set the language" : "Постави јазик",
- "Toggle user actions menu" : "Вклучи го менито за активности",
"Delete user" : "Избриши корисник",
"Wipe all devices" : "Избриши ги сите уреди",
"Disable user" : "Оневозможи корисник",
@@ -356,7 +355,8 @@
"Account deletion" : "Бришење на сметката",
"Delete {userid}'s account" : "Избриши го корисникот {userid}",
"Welcome mail sent!" : "Испратена е-пошта порака за добредојде!",
- "Edit User" : "Уреди корисник",
+ "Toggle user actions menu" : "Вклучи го менито за активности",
+ "Edit" : "Уреди",
"{size} used" : "искористено {size}",
"Passwordless authentication requires a secure connection." : "За најавување без лозинка потребно е да се користи безбедна врска.",
"Add WebAuthn device" : "Додади WebAuthn уред",
@@ -489,6 +489,7 @@
"Choose profile picture from files" : "Избери фотографија на профилот од датотеките",
"png or jpg, max. 20 MB" : "png или jpg, максимум 20 MB",
"Your location" : "Ваша локација",
+ "Edit User" : "Уреди корисник",
"Will be autogenerated" : "Ќе бидат автоматски генерирани",
"Add a new user" : "Додади нов корисник",
"Show Languages" : "Прикажи јазици",
diff --git a/apps/settings/l10n/nb.js b/apps/settings/l10n/nb.js
index c85f6687a89..8eb8d5fbefc 100644
--- a/apps/settings/l10n/nb.js
+++ b/apps/settings/l10n/nb.js
@@ -329,7 +329,7 @@ OC.L10N.register(
"Account deletion" : "Sletting av konto",
"Delete {userid}'s account" : "Slett {userid} sin konto",
"Welcome mail sent!" : "Velkomst-epost sendt!",
- "Edit User" : "Rediger bruker",
+ "Edit" : "Rediger",
"{size} used" : "{size} brukt",
"Name your device" : "Gi navn til enhet",
"Adding your device …" : "Legger til enheten...",
@@ -442,6 +442,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Velg profilbilde blant filer",
"png or jpg, max. 20 MB" : "png eller jpg, maks. 20 MB",
"Your location" : "Lokasjonen din",
+ "Edit User" : "Rediger bruker",
"Will be autogenerated" : "Blir generert automatisk",
"Add a new user" : "Legg til en ny bruker",
"Show Languages" : "Vis språk",
diff --git a/apps/settings/l10n/nb.json b/apps/settings/l10n/nb.json
index 56b9c8070d2..f1e706e858c 100644
--- a/apps/settings/l10n/nb.json
+++ b/apps/settings/l10n/nb.json
@@ -327,7 +327,7 @@
"Account deletion" : "Sletting av konto",
"Delete {userid}'s account" : "Slett {userid} sin konto",
"Welcome mail sent!" : "Velkomst-epost sendt!",
- "Edit User" : "Rediger bruker",
+ "Edit" : "Rediger",
"{size} used" : "{size} brukt",
"Name your device" : "Gi navn til enhet",
"Adding your device …" : "Legger til enheten...",
@@ -440,6 +440,7 @@
"Choose profile picture from files" : "Velg profilbilde blant filer",
"png or jpg, max. 20 MB" : "png eller jpg, maks. 20 MB",
"Your location" : "Lokasjonen din",
+ "Edit User" : "Rediger bruker",
"Will be autogenerated" : "Blir generert automatisk",
"Add a new user" : "Legg til en ny bruker",
"Show Languages" : "Vis språk",
diff --git a/apps/settings/l10n/nl.js b/apps/settings/l10n/nl.js
index 3b227a6c2ab..a260205e2ee 100644
--- a/apps/settings/l10n/nl.js
+++ b/apps/settings/l10n/nl.js
@@ -304,7 +304,6 @@ OC.L10N.register(
"Add user to group" : "Toevoegen gebruiker aan groep",
"Set user as admin for" : "Maak gebruiker beheerder voor",
"Select user quota" : "Selecteer gebruikersquotum",
- "Toggle user actions menu" : "Omschakelen gebruikersactiemenu",
"Delete user" : "Verwijder gebruiker",
"Wipe all devices" : "Wis alle toestellen",
"Disable user" : "Gebruiker uitschakelen",
@@ -317,7 +316,8 @@ OC.L10N.register(
"Account deletion" : "Accountverwijdering",
"Delete {userid}'s account" : "Verwijderen {userid}'s account",
"Welcome mail sent!" : "Welkomst-e-mail verstuurd!",
- "Edit User" : "Bewerk gebruiker",
+ "Toggle user actions menu" : "Omschakelen gebruikersactiemenu",
+ "Edit" : "Bewerken",
"{size} used" : "{size} gebruikt",
"Passwordless authentication requires a secure connection." : "Inloggen zonder wachtwoord vereist een beveiligde verbinding.",
"Add WebAuthn device" : "WebAuthn-apparaat toevoegen",
@@ -447,6 +447,7 @@ OC.L10N.register(
"You created app password \"{token}\"" : "Je creëerde appwachtwoord \"{token}\"",
"png or jpg, max. 20 MB" : "png of jpg, max. 20 MB",
"Your location" : "Je locatie",
+ "Edit User" : "Bewerk gebruiker",
"Will be autogenerated" : "Wordt automatisch gegenereerd",
"Add a new user" : "Nieuwe gebruiker toevoegen",
"Show Languages" : "Toon talen",
diff --git a/apps/settings/l10n/nl.json b/apps/settings/l10n/nl.json
index 4c2c71b0705..d860fea756e 100644
--- a/apps/settings/l10n/nl.json
+++ b/apps/settings/l10n/nl.json
@@ -302,7 +302,6 @@
"Add user to group" : "Toevoegen gebruiker aan groep",
"Set user as admin for" : "Maak gebruiker beheerder voor",
"Select user quota" : "Selecteer gebruikersquotum",
- "Toggle user actions menu" : "Omschakelen gebruikersactiemenu",
"Delete user" : "Verwijder gebruiker",
"Wipe all devices" : "Wis alle toestellen",
"Disable user" : "Gebruiker uitschakelen",
@@ -315,7 +314,8 @@
"Account deletion" : "Accountverwijdering",
"Delete {userid}'s account" : "Verwijderen {userid}'s account",
"Welcome mail sent!" : "Welkomst-e-mail verstuurd!",
- "Edit User" : "Bewerk gebruiker",
+ "Toggle user actions menu" : "Omschakelen gebruikersactiemenu",
+ "Edit" : "Bewerken",
"{size} used" : "{size} gebruikt",
"Passwordless authentication requires a secure connection." : "Inloggen zonder wachtwoord vereist een beveiligde verbinding.",
"Add WebAuthn device" : "WebAuthn-apparaat toevoegen",
@@ -445,6 +445,7 @@
"You created app password \"{token}\"" : "Je creëerde appwachtwoord \"{token}\"",
"png or jpg, max. 20 MB" : "png of jpg, max. 20 MB",
"Your location" : "Je locatie",
+ "Edit User" : "Bewerk gebruiker",
"Will be autogenerated" : "Wordt automatisch gegenereerd",
"Add a new user" : "Nieuwe gebruiker toevoegen",
"Show Languages" : "Toon talen",
diff --git a/apps/settings/l10n/nn_NO.js b/apps/settings/l10n/nn_NO.js
index 1f5800e8302..28519d768e0 100644
--- a/apps/settings/l10n/nn_NO.js
+++ b/apps/settings/l10n/nn_NO.js
@@ -82,6 +82,7 @@ OC.L10N.register(
"Email" : "E-post",
"Quota" : "Kvote",
"Last login" : "Siste innlogging",
+ "Edit" : "Rediger",
"Add group" : "Legg til gruppe",
"Active users" : "Aktive brukarare",
"Email sent" : "E-post sendt",
diff --git a/apps/settings/l10n/nn_NO.json b/apps/settings/l10n/nn_NO.json
index 255818626ef..3737e43d101 100644
--- a/apps/settings/l10n/nn_NO.json
+++ b/apps/settings/l10n/nn_NO.json
@@ -80,6 +80,7 @@
"Email" : "E-post",
"Quota" : "Kvote",
"Last login" : "Siste innlogging",
+ "Edit" : "Rediger",
"Add group" : "Legg til gruppe",
"Active users" : "Aktive brukarare",
"Email sent" : "E-post sendt",
diff --git a/apps/settings/l10n/oc.js b/apps/settings/l10n/oc.js
index d50eed2afde..3b9ad2ba4b3 100644
--- a/apps/settings/l10n/oc.js
+++ b/apps/settings/l10n/oc.js
@@ -175,7 +175,7 @@ OC.L10N.register(
"Account deletion" : "Supression de compte",
"Delete {userid}'s account" : "Suprimir lo compte de {userid}",
"Welcome mail sent!" : "Email de benvenguda enviat !",
- "Edit User" : "Modificar l’utilizaire",
+ "Edit" : "Modificar",
"{size} used" : "{size} utilizat",
"Name your device" : "Nommatz vòstre periferic",
"Adding your device …" : "Apondon del periferic…",
@@ -241,6 +241,7 @@ OC.L10N.register(
"Subscribe to our newsletter" : "S’abonar a l’infoletra",
"You created app password \"{token}\"" : "Avètz creat lo senhal d’aplicacion « {token} »",
"png or jpg, max. 20 MB" : "png or jpg, max. 20 Mo",
+ "Edit User" : "Modificar l’utilizaire",
"Add a new user" : "Apondre un utilizaire novè",
"Show Languages" : "Veire las lengas",
"SSL/TLS" : "SSL/TLS",
diff --git a/apps/settings/l10n/oc.json b/apps/settings/l10n/oc.json
index 03d6923bbf7..61e7043a6e6 100644
--- a/apps/settings/l10n/oc.json
+++ b/apps/settings/l10n/oc.json
@@ -173,7 +173,7 @@
"Account deletion" : "Supression de compte",
"Delete {userid}'s account" : "Suprimir lo compte de {userid}",
"Welcome mail sent!" : "Email de benvenguda enviat !",
- "Edit User" : "Modificar l’utilizaire",
+ "Edit" : "Modificar",
"{size} used" : "{size} utilizat",
"Name your device" : "Nommatz vòstre periferic",
"Adding your device …" : "Apondon del periferic…",
@@ -239,6 +239,7 @@
"Subscribe to our newsletter" : "S’abonar a l’infoletra",
"You created app password \"{token}\"" : "Avètz creat lo senhal d’aplicacion « {token} »",
"png or jpg, max. 20 MB" : "png or jpg, max. 20 Mo",
+ "Edit User" : "Modificar l’utilizaire",
"Add a new user" : "Apondre un utilizaire novè",
"Show Languages" : "Veire las lengas",
"SSL/TLS" : "SSL/TLS",
diff --git a/apps/settings/l10n/pl.js b/apps/settings/l10n/pl.js
index 67029c46a95..5b90d9a8949 100644
--- a/apps/settings/l10n/pl.js
+++ b/apps/settings/l10n/pl.js
@@ -353,7 +353,6 @@ OC.L10N.register(
"Add user to group" : "Dodaj użytkownika do grupy",
"Set user as admin for" : "Ustaw administratora dla",
"Select user quota" : "Wybierz limit dla użytkownika",
- "Toggle user actions menu" : "Przełącz menu czynności użytkownika",
"Delete user" : "Usuń użytkownika",
"Wipe all devices" : "Wyczyść wszystkie urządzenia",
"Disable user" : "Zablokuj użytkownika",
@@ -366,7 +365,8 @@ OC.L10N.register(
"Account deletion" : "Usunięcie konta",
"Delete {userid}'s account" : "Usuń konto {userid}",
"Welcome mail sent!" : "Wysłano wiadomość powitalną!",
- "Edit User" : "Edytuj użytkownika",
+ "Toggle user actions menu" : "Przełącz menu czynności użytkownika",
+ "Edit" : "Edycja",
"{size} used" : "Wykorzystane: {size}",
"Passwordless authentication requires a secure connection." : "Uwierzytelnianie bez hasła wymaga bezpiecznego połączenia.",
"Add WebAuthn device" : "Dodaj urządzenie WebAuthn",
@@ -501,6 +501,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Wybierz zdjęcie profilowe z Plików",
"png or jpg, max. 20 MB" : "png lub jpg, maks. 20 MB",
"Your location" : "Twoja lokalizacja",
+ "Edit User" : "Edytuj użytkownika",
"Will be autogenerated" : "Zostanie automatycznie wygenerowany",
"Add a new user" : "Dodaj użytkownika",
"Show Languages" : "Pokaż języki",
diff --git a/apps/settings/l10n/pl.json b/apps/settings/l10n/pl.json
index 2ebba8fdebc..a827c5bfb97 100644
--- a/apps/settings/l10n/pl.json
+++ b/apps/settings/l10n/pl.json
@@ -351,7 +351,6 @@
"Add user to group" : "Dodaj użytkownika do grupy",
"Set user as admin for" : "Ustaw administratora dla",
"Select user quota" : "Wybierz limit dla użytkownika",
- "Toggle user actions menu" : "Przełącz menu czynności użytkownika",
"Delete user" : "Usuń użytkownika",
"Wipe all devices" : "Wyczyść wszystkie urządzenia",
"Disable user" : "Zablokuj użytkownika",
@@ -364,7 +363,8 @@
"Account deletion" : "Usunięcie konta",
"Delete {userid}'s account" : "Usuń konto {userid}",
"Welcome mail sent!" : "Wysłano wiadomość powitalną!",
- "Edit User" : "Edytuj użytkownika",
+ "Toggle user actions menu" : "Przełącz menu czynności użytkownika",
+ "Edit" : "Edycja",
"{size} used" : "Wykorzystane: {size}",
"Passwordless authentication requires a secure connection." : "Uwierzytelnianie bez hasła wymaga bezpiecznego połączenia.",
"Add WebAuthn device" : "Dodaj urządzenie WebAuthn",
@@ -499,6 +499,7 @@
"Choose profile picture from files" : "Wybierz zdjęcie profilowe z Plików",
"png or jpg, max. 20 MB" : "png lub jpg, maks. 20 MB",
"Your location" : "Twoja lokalizacja",
+ "Edit User" : "Edytuj użytkownika",
"Will be autogenerated" : "Zostanie automatycznie wygenerowany",
"Add a new user" : "Dodaj użytkownika",
"Show Languages" : "Pokaż języki",
diff --git a/apps/settings/l10n/pt_BR.js b/apps/settings/l10n/pt_BR.js
index 430f68d14a4..9c64cc6275d 100644
--- a/apps/settings/l10n/pt_BR.js
+++ b/apps/settings/l10n/pt_BR.js
@@ -316,6 +316,7 @@ OC.L10N.register(
"Week starts on {firstDayOfWeek}" : "A semana começa em {firstDayOfWeek}",
"Unable to update locale" : "Não foi possível atualizar a localidade",
"No locale set" : "Nenhuma localidade definida",
+ "Your city" : "Sua cidade",
"Your organisation" : "Sua organização",
"Your phone number" : "Seu número de telefone",
"Edit your Profile visibility" : "Edite a visibilidade do seu perfil",
@@ -371,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Selecionar a cota de usuário",
"Set the language" : "Definir o idioma",
"Select manager" : "Selecione o gerente",
- "Toggle user actions menu" : "Alternar o menu de ações do usuário",
"Delete user" : "Excluir usuário",
"Wipe all devices" : "Limpar todos os dispositivos",
"Disable user" : "Desativar usuário",
@@ -384,7 +384,8 @@ OC.L10N.register(
"Account deletion" : "Exclusão de conta",
"Delete {userid}'s account" : "Excluir a conta de {userid}",
"Welcome mail sent!" : "E-mail de boas-vindas enviado!",
- "Edit User" : "Editar Usuário",
+ "Toggle user actions menu" : "Alternar o menu de ações do usuário",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Passwordless authentication requires a secure connection." : "Autenticação sem senha necessita uma conexão segura.",
"Add WebAuthn device" : "Adicionar dispositivo WebAuthn",
@@ -523,6 +524,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Escolha a foto do perfil dos arquivos",
"png or jpg, max. 20 MB" : "png ou jpg, max. 20 MB",
"Your location" : "Sua localização",
+ "Edit User" : "Editar Usuário",
"Will be autogenerated" : "Será autogerado",
"Add a new user" : "Adicione um novo usuário",
"Show Languages" : "Exibir idiomas",
diff --git a/apps/settings/l10n/pt_BR.json b/apps/settings/l10n/pt_BR.json
index 8bedefa8dc4..b2b77c3aa79 100644
--- a/apps/settings/l10n/pt_BR.json
+++ b/apps/settings/l10n/pt_BR.json
@@ -314,6 +314,7 @@
"Week starts on {firstDayOfWeek}" : "A semana começa em {firstDayOfWeek}",
"Unable to update locale" : "Não foi possível atualizar a localidade",
"No locale set" : "Nenhuma localidade definida",
+ "Your city" : "Sua cidade",
"Your organisation" : "Sua organização",
"Your phone number" : "Seu número de telefone",
"Edit your Profile visibility" : "Edite a visibilidade do seu perfil",
@@ -369,7 +370,6 @@
"Select user quota" : "Selecionar a cota de usuário",
"Set the language" : "Definir o idioma",
"Select manager" : "Selecione o gerente",
- "Toggle user actions menu" : "Alternar o menu de ações do usuário",
"Delete user" : "Excluir usuário",
"Wipe all devices" : "Limpar todos os dispositivos",
"Disable user" : "Desativar usuário",
@@ -382,7 +382,8 @@
"Account deletion" : "Exclusão de conta",
"Delete {userid}'s account" : "Excluir a conta de {userid}",
"Welcome mail sent!" : "E-mail de boas-vindas enviado!",
- "Edit User" : "Editar Usuário",
+ "Toggle user actions menu" : "Alternar o menu de ações do usuário",
+ "Edit" : "Editar",
"{size} used" : "{size} usado",
"Passwordless authentication requires a secure connection." : "Autenticação sem senha necessita uma conexão segura.",
"Add WebAuthn device" : "Adicionar dispositivo WebAuthn",
@@ -521,6 +522,7 @@
"Choose profile picture from files" : "Escolha a foto do perfil dos arquivos",
"png or jpg, max. 20 MB" : "png ou jpg, max. 20 MB",
"Your location" : "Sua localização",
+ "Edit User" : "Editar Usuário",
"Will be autogenerated" : "Será autogerado",
"Add a new user" : "Adicione um novo usuário",
"Show Languages" : "Exibir idiomas",
diff --git a/apps/settings/l10n/pt_PT.js b/apps/settings/l10n/pt_PT.js
index 10baf2d933b..d60ffaab46a 100644
--- a/apps/settings/l10n/pt_PT.js
+++ b/apps/settings/l10n/pt_PT.js
@@ -211,6 +211,7 @@ OC.L10N.register(
"Storage location" : "Localização do armazenamento",
"Last login" : "Último início de sessão",
"Default quota" : "Quota padrão",
+ "Edit" : "Editar",
"{size} used" : "{size} utilizado",
"Your apps" : "As suas apps",
"Changelog" : "Registo de alterações",
diff --git a/apps/settings/l10n/pt_PT.json b/apps/settings/l10n/pt_PT.json
index 126611825a3..f087ac63068 100644
--- a/apps/settings/l10n/pt_PT.json
+++ b/apps/settings/l10n/pt_PT.json
@@ -209,6 +209,7 @@
"Storage location" : "Localização do armazenamento",
"Last login" : "Último início de sessão",
"Default quota" : "Quota padrão",
+ "Edit" : "Editar",
"{size} used" : "{size} utilizado",
"Your apps" : "As suas apps",
"Changelog" : "Registo de alterações",
diff --git a/apps/settings/l10n/ro.js b/apps/settings/l10n/ro.js
index 6e677e14fe7..bcb3ab6394e 100644
--- a/apps/settings/l10n/ro.js
+++ b/apps/settings/l10n/ro.js
@@ -201,6 +201,7 @@ OC.L10N.register(
"Quota" : "Cotă",
"Default language" : "Limba implicită",
"You do not have permissions to see the details of this user" : "Nu aveți permisiuni pentru a vedea detaliile acestui utilizator",
+ "Edit" : "Editează",
"{size} used" : "{size} folosită",
"Add WebAuthn device" : "Adăugați dispozitivul WebAuthn",
"Name your device" : "Numiți dispozitivul dvs.",
diff --git a/apps/settings/l10n/ro.json b/apps/settings/l10n/ro.json
index 17faed93f55..92b4295ac5c 100644
--- a/apps/settings/l10n/ro.json
+++ b/apps/settings/l10n/ro.json
@@ -199,6 +199,7 @@
"Quota" : "Cotă",
"Default language" : "Limba implicită",
"You do not have permissions to see the details of this user" : "Nu aveți permisiuni pentru a vedea detaliile acestui utilizator",
+ "Edit" : "Editează",
"{size} used" : "{size} folosită",
"Add WebAuthn device" : "Adăugați dispozitivul WebAuthn",
"Name your device" : "Numiți dispozitivul dvs.",
diff --git a/apps/settings/l10n/ru.js b/apps/settings/l10n/ru.js
index e1e4362de78..401136c45e2 100644
--- a/apps/settings/l10n/ru.js
+++ b/apps/settings/l10n/ru.js
@@ -316,6 +316,7 @@ OC.L10N.register(
"Week starts on {firstDayOfWeek}" : "Первый день недели: {firstDayOfWeek}",
"Unable to update locale" : "Не удалось обновить локаль",
"No locale set" : "Локаль не задана",
+ "Your city" : "Ваш город",
"Your organisation" : "Ваша организация",
"Your phone number" : "Ваш номер телефона",
"Edit your Profile visibility" : "Изменить видимость профиля",
@@ -349,6 +350,19 @@ OC.L10N.register(
"Other languages" : "Другие языки",
"Password change is disabled because the master key is disabled" : "Смена пароля невозможна при отключённом мастер-ключе",
"New user" : "Новый пользователь",
+ "Either password or email is required" : "Также обязательны к заполнению пароль или эл.почта",
+ "Password (required)" : "Пароль (обязательно)",
+ "Email (required)" : "Эл. почта (обязательно)",
+ "Groups (required)" : "Группы (обязательно)",
+ "Set user groups" : "Задать группы пользователя",
+ "Administered groups" : "Администрируемые группы",
+ "Set user as admin for …" : "Назначить пользователя администратором для ...",
+ "Set user quota" : "Установить квоту пользователя",
+ "Set default language" : "Выбрать язык по умолчанию",
+ "Set user manager" : "Выбрать менеджер пользователей",
+ "Add new user" : "Добавить нового пользователя",
+ "Username will be autogenerated" : "Имя пользователя будет сгенерировано автоматически",
+ "Username (required)" : "Имя пользователя (обязательно)",
"You do not have permissions to see the details of this user" : "У вас нет прав на просмотр данных об этом пользователе",
"Edit display name" : "Редактировать отображаемое имя",
"Add new password" : "Добавить пароль",
@@ -358,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Квота пользователя",
"Set the language" : "Выбрать язык",
"Select manager" : "Менеджер выделений",
- "Toggle user actions menu" : "Переключить пользовательское меню действий",
"Delete user" : "Удалить пользователя",
"Wipe all devices" : "Удалить данные со всех устройств",
"Disable user" : "Отключить пользователя",
@@ -367,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Это действие позволяет удалить все данные Nextcloud с устройств {userid}, например, в случае утери или при завершении работы сотрудника в компании. Удаление будет выполнено только если устройства подключены к интернету.",
"Remote wipe of devices" : "Удаление данных с устройств",
"Wipe {userid}'s devices" : "Удалить данные с устройств пользователя {userid}",
+ "Wiped {userid}'s devices" : "Удалить данные с устройств пользователя {userid}",
+ "Update of user manager was failed" : "Не удалось обновить менеджер пользователей",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Полностью удалить все данные пользователя {userid}, в том числе учётную запись, личные файлы и данные приложений.",
"Account deletion" : "Удаление учётной записи",
"Delete {userid}'s account" : "Удалить учётную запись пользователя {userid}",
+ "Display name was successfully changed" : "Отображаемое имя было успешно изменено",
+ "Password was successfully changed" : "Пароль был успешно изменен",
+ "Email was successfully changed" : "Эл. почта была успешно изменена",
"Welcome mail sent!" : "Приглашение отправлено!",
- "Edit User" : "Редактировать уч. запись",
+ "Toggle user actions menu" : "Переключить пользовательское меню действий",
+ "Edit" : "Редактирование",
"{size} used" : "использовано {size}",
"Passwordless authentication requires a secure connection." : "Аутентификация без пароля требует безопасного соединения.",
"Add WebAuthn device" : "Добавить устройство WebAuthn",
@@ -397,6 +416,7 @@ OC.L10N.register(
"Disabled users" : "Отключённые пользователи",
"Default quota:" : "Квота по умолчанию: ",
"Select default quota" : "Квота по умолчанию",
+ "Show languages" : "Показывать языки",
"Show last login" : "Время последнего входа в систему",
"Show user backend" : "Механизм учёта",
"Show storage path" : "Путь хранилища",
@@ -440,6 +460,7 @@ OC.L10N.register(
"Documentation" : "Документация",
"Forum" : "Форум",
"Login" : "Логин",
+ "None/STARTTLS" : "Без шифрования/STARTTLS",
"SSL" : "SSL",
"Open documentation" : "Открыть документацию",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Важно предоставить этому серверу возможность отправлять электронные письма, например, для сброса пароля и уведомлений.",
@@ -508,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Выбрать изображение профиля из загруженных файлов",
"png or jpg, max. 20 MB" : "png или jpg, макс. 20 МБ",
"Your location" : "Местоположение",
+ "Edit User" : "Редактировать уч. запись",
"Will be autogenerated" : "Будет сгенерирован автоматически",
"Add a new user" : "Создать пользователя",
"Show Languages" : "Показывать язык",
diff --git a/apps/settings/l10n/ru.json b/apps/settings/l10n/ru.json
index 6af6bcd821c..0250baf3e9e 100644
--- a/apps/settings/l10n/ru.json
+++ b/apps/settings/l10n/ru.json
@@ -314,6 +314,7 @@
"Week starts on {firstDayOfWeek}" : "Первый день недели: {firstDayOfWeek}",
"Unable to update locale" : "Не удалось обновить локаль",
"No locale set" : "Локаль не задана",
+ "Your city" : "Ваш город",
"Your organisation" : "Ваша организация",
"Your phone number" : "Ваш номер телефона",
"Edit your Profile visibility" : "Изменить видимость профиля",
@@ -347,6 +348,19 @@
"Other languages" : "Другие языки",
"Password change is disabled because the master key is disabled" : "Смена пароля невозможна при отключённом мастер-ключе",
"New user" : "Новый пользователь",
+ "Either password or email is required" : "Также обязательны к заполнению пароль или эл.почта",
+ "Password (required)" : "Пароль (обязательно)",
+ "Email (required)" : "Эл. почта (обязательно)",
+ "Groups (required)" : "Группы (обязательно)",
+ "Set user groups" : "Задать группы пользователя",
+ "Administered groups" : "Администрируемые группы",
+ "Set user as admin for …" : "Назначить пользователя администратором для ...",
+ "Set user quota" : "Установить квоту пользователя",
+ "Set default language" : "Выбрать язык по умолчанию",
+ "Set user manager" : "Выбрать менеджер пользователей",
+ "Add new user" : "Добавить нового пользователя",
+ "Username will be autogenerated" : "Имя пользователя будет сгенерировано автоматически",
+ "Username (required)" : "Имя пользователя (обязательно)",
"You do not have permissions to see the details of this user" : "У вас нет прав на просмотр данных об этом пользователе",
"Edit display name" : "Редактировать отображаемое имя",
"Add new password" : "Добавить пароль",
@@ -356,7 +370,6 @@
"Select user quota" : "Квота пользователя",
"Set the language" : "Выбрать язык",
"Select manager" : "Менеджер выделений",
- "Toggle user actions menu" : "Переключить пользовательское меню действий",
"Delete user" : "Удалить пользователя",
"Wipe all devices" : "Удалить данные со всех устройств",
"Disable user" : "Отключить пользователя",
@@ -365,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Это действие позволяет удалить все данные Nextcloud с устройств {userid}, например, в случае утери или при завершении работы сотрудника в компании. Удаление будет выполнено только если устройства подключены к интернету.",
"Remote wipe of devices" : "Удаление данных с устройств",
"Wipe {userid}'s devices" : "Удалить данные с устройств пользователя {userid}",
+ "Wiped {userid}'s devices" : "Удалить данные с устройств пользователя {userid}",
+ "Update of user manager was failed" : "Не удалось обновить менеджер пользователей",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Полностью удалить все данные пользователя {userid}, в том числе учётную запись, личные файлы и данные приложений.",
"Account deletion" : "Удаление учётной записи",
"Delete {userid}'s account" : "Удалить учётную запись пользователя {userid}",
+ "Display name was successfully changed" : "Отображаемое имя было успешно изменено",
+ "Password was successfully changed" : "Пароль был успешно изменен",
+ "Email was successfully changed" : "Эл. почта была успешно изменена",
"Welcome mail sent!" : "Приглашение отправлено!",
- "Edit User" : "Редактировать уч. запись",
+ "Toggle user actions menu" : "Переключить пользовательское меню действий",
+ "Edit" : "Редактирование",
"{size} used" : "использовано {size}",
"Passwordless authentication requires a secure connection." : "Аутентификация без пароля требует безопасного соединения.",
"Add WebAuthn device" : "Добавить устройство WebAuthn",
@@ -395,6 +414,7 @@
"Disabled users" : "Отключённые пользователи",
"Default quota:" : "Квота по умолчанию: ",
"Select default quota" : "Квота по умолчанию",
+ "Show languages" : "Показывать языки",
"Show last login" : "Время последнего входа в систему",
"Show user backend" : "Механизм учёта",
"Show storage path" : "Путь хранилища",
@@ -438,6 +458,7 @@
"Documentation" : "Документация",
"Forum" : "Форум",
"Login" : "Логин",
+ "None/STARTTLS" : "Без шифрования/STARTTLS",
"SSL" : "SSL",
"Open documentation" : "Открыть документацию",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Важно предоставить этому серверу возможность отправлять электронные письма, например, для сброса пароля и уведомлений.",
@@ -506,6 +527,7 @@
"Choose profile picture from files" : "Выбрать изображение профиля из загруженных файлов",
"png or jpg, max. 20 MB" : "png или jpg, макс. 20 МБ",
"Your location" : "Местоположение",
+ "Edit User" : "Редактировать уч. запись",
"Will be autogenerated" : "Будет сгенерирован автоматически",
"Add a new user" : "Создать пользователя",
"Show Languages" : "Показывать язык",
diff --git a/apps/settings/l10n/sc.js b/apps/settings/l10n/sc.js
index 881de4a588c..f2367e36769 100644
--- a/apps/settings/l10n/sc.js
+++ b/apps/settings/l10n/sc.js
@@ -255,7 +255,6 @@ OC.L10N.register(
"Add user to group" : "Agiunghe un'utente a unu grupu",
"Set user as admin for" : "Include a un'utente in s'amministratzione pro",
"Select user quota" : "Seletziona cuota utente",
- "Toggle user actions menu" : "Càmbia su menu de is atziones de s'utente",
"Delete user" : "Cantzella utente",
"Wipe all devices" : "Cantzella totu is dispositivos",
"Disable user" : "Disativa utente",
@@ -268,7 +267,8 @@ OC.L10N.register(
"Account deletion" : "Cantzelladura de su contu",
"Delete {userid}'s account" : "Cantzella su contu de {userid}",
"Welcome mail sent!" : "Messàgiu de benebènnida imbiadu!",
- "Edit User" : "Modìfica utente",
+ "Toggle user actions menu" : "Càmbia su menu de is atziones de s'utente",
+ "Edit" : "Modìfica",
"{size} used" : "{size} impreadu",
"Passwordless authentication requires a secure connection." : "S'autenticatzione chene crae rechedet una connessione segura.",
"Add WebAuthn device" : "Agiunghe dispositivu WebAuthn",
@@ -384,6 +384,7 @@ OC.L10N.register(
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Si impreas aplicatziones de sa de tres partes pro ti connètere a Nextcloud, assegura•ti de creare e cunfigurare una crae pro cada aplicatzione antis de ativare su segundu fatore de autenticatzione.",
"You created app password \"{token}\"" : "As creadu sa crae de s'aplicatzione \"{token}\"",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
+ "Edit User" : "Modìfica utente",
"Will be autogenerated" : "At a èssere auto-generadu",
"Add a new user" : "Agiunghe un'utèntzia noa",
"Show Languages" : "Mustra limbas",
diff --git a/apps/settings/l10n/sc.json b/apps/settings/l10n/sc.json
index d86a36d1e8b..9ca9c605d8b 100644
--- a/apps/settings/l10n/sc.json
+++ b/apps/settings/l10n/sc.json
@@ -253,7 +253,6 @@
"Add user to group" : "Agiunghe un'utente a unu grupu",
"Set user as admin for" : "Include a un'utente in s'amministratzione pro",
"Select user quota" : "Seletziona cuota utente",
- "Toggle user actions menu" : "Càmbia su menu de is atziones de s'utente",
"Delete user" : "Cantzella utente",
"Wipe all devices" : "Cantzella totu is dispositivos",
"Disable user" : "Disativa utente",
@@ -266,7 +265,8 @@
"Account deletion" : "Cantzelladura de su contu",
"Delete {userid}'s account" : "Cantzella su contu de {userid}",
"Welcome mail sent!" : "Messàgiu de benebènnida imbiadu!",
- "Edit User" : "Modìfica utente",
+ "Toggle user actions menu" : "Càmbia su menu de is atziones de s'utente",
+ "Edit" : "Modìfica",
"{size} used" : "{size} impreadu",
"Passwordless authentication requires a secure connection." : "S'autenticatzione chene crae rechedet una connessione segura.",
"Add WebAuthn device" : "Agiunghe dispositivu WebAuthn",
@@ -382,6 +382,7 @@
"If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Si impreas aplicatziones de sa de tres partes pro ti connètere a Nextcloud, assegura•ti de creare e cunfigurare una crae pro cada aplicatzione antis de ativare su segundu fatore de autenticatzione.",
"You created app password \"{token}\"" : "As creadu sa crae de s'aplicatzione \"{token}\"",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
+ "Edit User" : "Modìfica utente",
"Will be autogenerated" : "At a èssere auto-generadu",
"Add a new user" : "Agiunghe un'utèntzia noa",
"Show Languages" : "Mustra limbas",
diff --git a/apps/settings/l10n/sk.js b/apps/settings/l10n/sk.js
index 29720f5b557..277d96b6d30 100644
--- a/apps/settings/l10n/sk.js
+++ b/apps/settings/l10n/sk.js
@@ -346,7 +346,6 @@ OC.L10N.register(
"Add user to group" : "Pridať užívateľa do skupiny",
"Set user as admin for" : "Nastaviť používateľa ako správcu pre",
"Select user quota" : "Zvoliť kvótu používateľa",
- "Toggle user actions menu" : "Prepnúť ponuku akcií používateľa",
"Delete user" : "Zmazať používateľa",
"Wipe all devices" : "Vymazať zo všetkých zariadení",
"Disable user" : "Zablokovať používateľa",
@@ -359,7 +358,8 @@ OC.L10N.register(
"Account deletion" : "Zmazanie účtu",
"Delete {userid}'s account" : "Vymazať účet {userid}",
"Welcome mail sent!" : "Privítací email odoslaný",
- "Edit User" : "Upraviť používateľa",
+ "Toggle user actions menu" : "Prepnúť ponuku akcií používateľa",
+ "Edit" : "Upraviť",
"{size} used" : "{size} použité",
"Passwordless authentication requires a secure connection." : "Overenie bez hesla vyžaduje zabezpečné pripojenie.",
"Add WebAuthn device" : "Pridať zariadenie WebAuthn",
@@ -493,6 +493,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Vybrať profilový obrázok zo súborov",
"png or jpg, max. 20 MB" : "png alebo jpg, max. 20 MB",
"Your location" : "Vaša poloha",
+ "Edit User" : "Upraviť používateľa",
"Will be autogenerated" : "Bude automaticky vytvorené",
"Add a new user" : "Pridať nového používateľa",
"Show Languages" : "Zobraziť jazyky",
diff --git a/apps/settings/l10n/sk.json b/apps/settings/l10n/sk.json
index 15766bd5b7a..9cad870c28a 100644
--- a/apps/settings/l10n/sk.json
+++ b/apps/settings/l10n/sk.json
@@ -344,7 +344,6 @@
"Add user to group" : "Pridať užívateľa do skupiny",
"Set user as admin for" : "Nastaviť používateľa ako správcu pre",
"Select user quota" : "Zvoliť kvótu používateľa",
- "Toggle user actions menu" : "Prepnúť ponuku akcií používateľa",
"Delete user" : "Zmazať používateľa",
"Wipe all devices" : "Vymazať zo všetkých zariadení",
"Disable user" : "Zablokovať používateľa",
@@ -357,7 +356,8 @@
"Account deletion" : "Zmazanie účtu",
"Delete {userid}'s account" : "Vymazať účet {userid}",
"Welcome mail sent!" : "Privítací email odoslaný",
- "Edit User" : "Upraviť používateľa",
+ "Toggle user actions menu" : "Prepnúť ponuku akcií používateľa",
+ "Edit" : "Upraviť",
"{size} used" : "{size} použité",
"Passwordless authentication requires a secure connection." : "Overenie bez hesla vyžaduje zabezpečné pripojenie.",
"Add WebAuthn device" : "Pridať zariadenie WebAuthn",
@@ -491,6 +491,7 @@
"Choose profile picture from files" : "Vybrať profilový obrázok zo súborov",
"png or jpg, max. 20 MB" : "png alebo jpg, max. 20 MB",
"Your location" : "Vaša poloha",
+ "Edit User" : "Upraviť používateľa",
"Will be autogenerated" : "Bude automaticky vytvorené",
"Add a new user" : "Pridať nového používateľa",
"Show Languages" : "Zobraziť jazyky",
diff --git a/apps/settings/l10n/sl.js b/apps/settings/l10n/sl.js
index b4b6000a473..76e8e5e56b6 100644
--- a/apps/settings/l10n/sl.js
+++ b/apps/settings/l10n/sl.js
@@ -359,7 +359,6 @@ OC.L10N.register(
"Select user quota" : "Količinska omejitev prostora",
"Set the language" : "Nastavi jezik",
"Select manager" : "Izbor upravljalnika",
- "Toggle user actions menu" : "Preklopi meni uporabniških dejanj",
"Delete user" : "Izbriši uporabnika",
"Wipe all devices" : "Varnostno izbriši vse naprave",
"Disable user" : "Onemogoči uporabnika",
@@ -372,7 +371,8 @@ OC.L10N.register(
"Account deletion" : "Brisanje računa",
"Delete {userid}'s account" : "Izbriši račun {userid}",
"Welcome mail sent!" : "Potrditveno sporočilo je poslano!",
- "Edit User" : "Uredi podatke uporabnika",
+ "Toggle user actions menu" : "Preklopi meni uporabniških dejanj",
+ "Edit" : "Uredi",
"{size} used" : "V uporabi {size}·",
"Passwordless authentication requires a secure connection." : "Brezgeselna overitev zahteva varno povezavo.",
"Add WebAuthn device" : "Dodaj napravo WebAuthn",
@@ -474,6 +474,7 @@ OC.L10N.register(
"Always ask for a password" : "Vedno zahtevaj geslo",
"Enforce password protection" : "Vsili zaščito z geslom",
"Set default expiration date" : "Nastavi privzeti datum poteka",
+ "Exclude groups from creating link shares:" : "Onemogoči navedenim skupinam ustvarjanje povezav do mest uporabe:",
"Allow resharing" : "Dovoli nadaljnje omogočanje souporabe",
"Allow sharing with groups" : "Dovoli souporabo s skupinami",
"Restrict users to only share with users in their groups" : "Uporabnikom dovoli omogočanje souporabe le znotraj njihove skupine",
@@ -499,6 +500,7 @@ OC.L10N.register(
"An administrator created app password \"{token}\"" : "Skrbnik je ustvaril geslo programa »{token}«.",
"Choose profile picture from files" : "Izbor slike profila med datotekami",
"png or jpg, max. 20 MB" : "png ali jpg, največ. 20 MB",
+ "Edit User" : "Uredi podatke uporabnika",
"Will be autogenerated" : "Samodejno ustvarjeno",
"Add a new user" : "Dodaj uporabnika",
"Show Languages" : "Pokaži jezike",
diff --git a/apps/settings/l10n/sl.json b/apps/settings/l10n/sl.json
index bd8f6c7739b..114cfd85dd7 100644
--- a/apps/settings/l10n/sl.json
+++ b/apps/settings/l10n/sl.json
@@ -357,7 +357,6 @@
"Select user quota" : "Količinska omejitev prostora",
"Set the language" : "Nastavi jezik",
"Select manager" : "Izbor upravljalnika",
- "Toggle user actions menu" : "Preklopi meni uporabniških dejanj",
"Delete user" : "Izbriši uporabnika",
"Wipe all devices" : "Varnostno izbriši vse naprave",
"Disable user" : "Onemogoči uporabnika",
@@ -370,7 +369,8 @@
"Account deletion" : "Brisanje računa",
"Delete {userid}'s account" : "Izbriši račun {userid}",
"Welcome mail sent!" : "Potrditveno sporočilo je poslano!",
- "Edit User" : "Uredi podatke uporabnika",
+ "Toggle user actions menu" : "Preklopi meni uporabniških dejanj",
+ "Edit" : "Uredi",
"{size} used" : "V uporabi {size}·",
"Passwordless authentication requires a secure connection." : "Brezgeselna overitev zahteva varno povezavo.",
"Add WebAuthn device" : "Dodaj napravo WebAuthn",
@@ -472,6 +472,7 @@
"Always ask for a password" : "Vedno zahtevaj geslo",
"Enforce password protection" : "Vsili zaščito z geslom",
"Set default expiration date" : "Nastavi privzeti datum poteka",
+ "Exclude groups from creating link shares:" : "Onemogoči navedenim skupinam ustvarjanje povezav do mest uporabe:",
"Allow resharing" : "Dovoli nadaljnje omogočanje souporabe",
"Allow sharing with groups" : "Dovoli souporabo s skupinami",
"Restrict users to only share with users in their groups" : "Uporabnikom dovoli omogočanje souporabe le znotraj njihove skupine",
@@ -497,6 +498,7 @@
"An administrator created app password \"{token}\"" : "Skrbnik je ustvaril geslo programa »{token}«.",
"Choose profile picture from files" : "Izbor slike profila med datotekami",
"png or jpg, max. 20 MB" : "png ali jpg, največ. 20 MB",
+ "Edit User" : "Uredi podatke uporabnika",
"Will be autogenerated" : "Samodejno ustvarjeno",
"Add a new user" : "Dodaj uporabnika",
"Show Languages" : "Pokaži jezike",
diff --git a/apps/settings/l10n/sq.js b/apps/settings/l10n/sq.js
index 0a6d746536c..f9b948a3d3b 100644
--- a/apps/settings/l10n/sq.js
+++ b/apps/settings/l10n/sq.js
@@ -161,6 +161,7 @@ OC.L10N.register(
"Last login" : "Hyrja e fundit",
"Default quota" : "Kuota Parazgjedhje",
"New user" : "Përdorues i ri",
+ "Edit" : "Përpuno",
"{size} used" : "{madhësia} e përdorur",
"Name your device" : "Emërtoni pajisjen tuaj",
"Adding your device …" : "Shtoni pajisjen tuaj ...",
diff --git a/apps/settings/l10n/sq.json b/apps/settings/l10n/sq.json
index d69b116e16f..e44147c9622 100644
--- a/apps/settings/l10n/sq.json
+++ b/apps/settings/l10n/sq.json
@@ -159,6 +159,7 @@
"Last login" : "Hyrja e fundit",
"Default quota" : "Kuota Parazgjedhje",
"New user" : "Përdorues i ri",
+ "Edit" : "Përpuno",
"{size} used" : "{madhësia} e përdorur",
"Name your device" : "Emërtoni pajisjen tuaj",
"Adding your device …" : "Shtoni pajisjen tuaj ...",
diff --git a/apps/settings/l10n/sr.js b/apps/settings/l10n/sr.js
index 3eb8679d2b5..0bd9e6b556d 100644
--- a/apps/settings/l10n/sr.js
+++ b/apps/settings/l10n/sr.js
@@ -316,6 +316,7 @@ OC.L10N.register(
"Week starts on {firstDayOfWeek}" : "Недеља почиње у {firstDayOfWeek}",
"Unable to update locale" : "Локалитет није могао да се ажурира",
"No locale set" : "Није постављен локалитет",
+ "Your city" : "Ваш град",
"Your organisation" : "Ваша организација",
"Your phone number" : "Ваш број телефона",
"Edit your Profile visibility" : "Уредите видљивост вашег профила",
@@ -349,6 +350,19 @@ OC.L10N.register(
"Other languages" : "Остали језици",
"Password change is disabled because the master key is disabled" : "Промена лозинке је искључена пошто је главни кључ искључен",
"New user" : "Нови корисник",
+ "Either password or email is required" : "Неопходна је или лозинка или и-мејл",
+ "Password (required)" : "Лозинка (обавезно)",
+ "Email (required)" : "И-мејл (обавезно)",
+ "Groups (required)" : "Групе (обавезно)",
+ "Set user groups" : "Постављање група корисника",
+ "Administered groups" : "Администриране групе",
+ "Set user as admin for …" : "Постави корисника као администратора за...",
+ "Set user quota" : "Постави квоту корисника",
+ "Set default language" : "Постави подразумевани језик",
+ "Set user manager" : "Постави менаџера корисника",
+ "Add new user" : "Додај новог корисника",
+ "Username will be autogenerated" : "Корисничко име ће бити генерисано аутоматски",
+ "Username (required)" : "Корисничко име (обавезно)",
"You do not have permissions to see the details of this user" : "Немате дозволе да видите детаље о овом кориснику",
"Edit display name" : "Уреди име за приказ",
"Add new password" : "Додај нову лозинку",
@@ -358,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Одаберите корисничку квоту",
"Set the language" : "Постави језик",
"Select manager" : "Избор менаџера",
- "Toggle user actions menu" : "Укључи/искључи мени корисничких радњи",
"Delete user" : "Обриши корисника",
"Wipe all devices" : "Обриши све уређаје",
"Disable user" : "Искључи корисника",
@@ -367,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "У случају изгубљеног уређаја или напуштања организације, овим се могу удаљено обрисати Некстклауд подаци са свих уређаја повезаних са налогом {userid}. Ради само ако је уређај повезан на интернет.",
"Remote wipe of devices" : "Удаљено брисање уређаја",
"Wipe {userid}'s devices" : "Обриши уређај од корисника {userid}",
+ "Wiped {userid}'s devices" : "Обрисани уређаји корисника {userid}",
+ "Update of user manager was failed" : "Није успело ажурирање менаџера корисника",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Комплетно брисање уређаја са налога корисника {userid} укључујући све личне фајлове, апликативне податке, итд.",
"Account deletion" : "Брисање налога",
"Delete {userid}'s account" : "Обриши налог корисника {userid}",
+ "Display name was successfully changed" : "Име за приказ је успешно промењено",
+ "Password was successfully changed" : "Лозинка је усшешно промењена",
+ "Email was successfully changed" : "И-мејл је успешно промењен",
"Welcome mail sent!" : "Е-пошта добродошлице послата!",
- "Edit User" : "Измени корисника",
+ "Toggle user actions menu" : "Укључи/искључи мени корисничких радњи",
+ "Edit" : "Измени",
"{size} used" : "{size} искоришћено",
"Passwordless authentication requires a secure connection." : "Пријављивање без лозинке захтева безбедну конекцију.",
"Add WebAuthn device" : "Додајте WebAuthn уређај",
@@ -397,6 +416,7 @@ OC.L10N.register(
"Disabled users" : "Искључени корисници",
"Default quota:" : "Подразумевана квота:",
"Select default quota" : "Одаберите подразумевану квоту",
+ "Show languages" : "Приказ језика",
"Show last login" : "Прикажи последњу пријаву",
"Show user backend" : "Прикажи позадину за кориснике",
"Show storage path" : "Прикажи путању до складишта",
@@ -509,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Изабери слику профила међу фајловима",
"png or jpg, max. 20 MB" : "„png“ или „jpg“, макс. 20 МБ",
"Your location" : "Ваша локација",
+ "Edit User" : "Измени корисника",
"Will be autogenerated" : "Биће генерисано аутоматски",
"Add a new user" : "Додај новог корисника",
"Show Languages" : "Прикажи језике",
diff --git a/apps/settings/l10n/sr.json b/apps/settings/l10n/sr.json
index 0c2c23d65db..f40b2673b34 100644
--- a/apps/settings/l10n/sr.json
+++ b/apps/settings/l10n/sr.json
@@ -314,6 +314,7 @@
"Week starts on {firstDayOfWeek}" : "Недеља почиње у {firstDayOfWeek}",
"Unable to update locale" : "Локалитет није могао да се ажурира",
"No locale set" : "Није постављен локалитет",
+ "Your city" : "Ваш град",
"Your organisation" : "Ваша организација",
"Your phone number" : "Ваш број телефона",
"Edit your Profile visibility" : "Уредите видљивост вашег профила",
@@ -347,6 +348,19 @@
"Other languages" : "Остали језици",
"Password change is disabled because the master key is disabled" : "Промена лозинке је искључена пошто је главни кључ искључен",
"New user" : "Нови корисник",
+ "Either password or email is required" : "Неопходна је или лозинка или и-мејл",
+ "Password (required)" : "Лозинка (обавезно)",
+ "Email (required)" : "И-мејл (обавезно)",
+ "Groups (required)" : "Групе (обавезно)",
+ "Set user groups" : "Постављање група корисника",
+ "Administered groups" : "Администриране групе",
+ "Set user as admin for …" : "Постави корисника као администратора за...",
+ "Set user quota" : "Постави квоту корисника",
+ "Set default language" : "Постави подразумевани језик",
+ "Set user manager" : "Постави менаџера корисника",
+ "Add new user" : "Додај новог корисника",
+ "Username will be autogenerated" : "Корисничко име ће бити генерисано аутоматски",
+ "Username (required)" : "Корисничко име (обавезно)",
"You do not have permissions to see the details of this user" : "Немате дозволе да видите детаље о овом кориснику",
"Edit display name" : "Уреди име за приказ",
"Add new password" : "Додај нову лозинку",
@@ -356,7 +370,6 @@
"Select user quota" : "Одаберите корисничку квоту",
"Set the language" : "Постави језик",
"Select manager" : "Избор менаџера",
- "Toggle user actions menu" : "Укључи/искључи мени корисничких радњи",
"Delete user" : "Обриши корисника",
"Wipe all devices" : "Обриши све уређаје",
"Disable user" : "Искључи корисника",
@@ -365,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "У случају изгубљеног уређаја или напуштања организације, овим се могу удаљено обрисати Некстклауд подаци са свих уређаја повезаних са налогом {userid}. Ради само ако је уређај повезан на интернет.",
"Remote wipe of devices" : "Удаљено брисање уређаја",
"Wipe {userid}'s devices" : "Обриши уређај од корисника {userid}",
+ "Wiped {userid}'s devices" : "Обрисани уређаји корисника {userid}",
+ "Update of user manager was failed" : "Није успело ажурирање менаџера корисника",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Комплетно брисање уређаја са налога корисника {userid} укључујући све личне фајлове, апликативне податке, итд.",
"Account deletion" : "Брисање налога",
"Delete {userid}'s account" : "Обриши налог корисника {userid}",
+ "Display name was successfully changed" : "Име за приказ је успешно промењено",
+ "Password was successfully changed" : "Лозинка је усшешно промењена",
+ "Email was successfully changed" : "И-мејл је успешно промењен",
"Welcome mail sent!" : "Е-пошта добродошлице послата!",
- "Edit User" : "Измени корисника",
+ "Toggle user actions menu" : "Укључи/искључи мени корисничких радњи",
+ "Edit" : "Измени",
"{size} used" : "{size} искоришћено",
"Passwordless authentication requires a secure connection." : "Пријављивање без лозинке захтева безбедну конекцију.",
"Add WebAuthn device" : "Додајте WebAuthn уређај",
@@ -395,6 +414,7 @@
"Disabled users" : "Искључени корисници",
"Default quota:" : "Подразумевана квота:",
"Select default quota" : "Одаберите подразумевану квоту",
+ "Show languages" : "Приказ језика",
"Show last login" : "Прикажи последњу пријаву",
"Show user backend" : "Прикажи позадину за кориснике",
"Show storage path" : "Прикажи путању до складишта",
@@ -507,6 +527,7 @@
"Choose profile picture from files" : "Изабери слику профила међу фајловима",
"png or jpg, max. 20 MB" : "„png“ или „jpg“, макс. 20 МБ",
"Your location" : "Ваша локација",
+ "Edit User" : "Измени корисника",
"Will be autogenerated" : "Биће генерисано аутоматски",
"Add a new user" : "Додај новог корисника",
"Show Languages" : "Прикажи језике",
diff --git a/apps/settings/l10n/sv.js b/apps/settings/l10n/sv.js
index 7123dbf37f1..3b1d69d2e57 100644
--- a/apps/settings/l10n/sv.js
+++ b/apps/settings/l10n/sv.js
@@ -316,6 +316,7 @@ OC.L10N.register(
"Week starts on {firstDayOfWeek}" : "Veckan börjar med {firstDayOfWeek}",
"Unable to update locale" : "Det gick inte att uppdatera språk",
"No locale set" : "Inget språk angivet",
+ "Your city" : "Din stad",
"Your organisation" : "Din organisation",
"Your phone number" : "Ditt telefonnummer",
"Edit your Profile visibility" : "Ändra synligheten för din profil",
@@ -369,7 +370,6 @@ OC.L10N.register(
"Select user quota" : "Välj användarens quota",
"Set the language" : "Ställ in språk",
"Select manager" : "Välj chef",
- "Toggle user actions menu" : "Växla menyn med användaråtgärder",
"Delete user" : "Ta bort användare",
"Wipe all devices" : "Rensa alla enheter",
"Disable user" : "Stäng av användare",
@@ -378,11 +378,16 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Om användaren förlorar sin enhet eller lämnar organisationen, kan all Nextcloud-data fjärrensas från alla enheter associerade med {userid}. Fungerar bara om enheterna är anslutna till internet.",
"Remote wipe of devices" : "Fjärrensning av enheter",
"Wipe {userid}'s devices" : "Rensa enheter för {userid}",
+ "Wiped {userid}'s devices" : "Rensade enheter för {userid}",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Fullständig radering av konto för {userid} inklusive alla personliga filer, appdata etc.",
"Account deletion" : "Radering av konto",
"Delete {userid}'s account" : "Ta bort konto för {userid}",
+ "Display name was successfully changed" : "Visningsnamnet har ändrats",
+ "Password was successfully changed" : "Lösenordet har ändrats",
+ "Email was successfully changed" : "E-postadressen har ändrats",
"Welcome mail sent!" : "Välkomstmeddelande skickat via e-post!",
- "Edit User" : "Redigera användare",
+ "Toggle user actions menu" : "Växla menyn med användaråtgärder",
+ "Edit" : "Redigera",
"{size} used" : "{size} använt",
"Passwordless authentication requires a secure connection." : "Lösenordsfri autentisering kräver en säker anslutning.",
"Add WebAuthn device" : "Lägg till WebAuthn-enhet",
@@ -452,6 +457,7 @@ OC.L10N.register(
"Documentation" : "Dokumentation",
"Forum" : "Forum",
"Login" : "Logga in",
+ "None/STARTTLS" : "Ingen/STARTTLS",
"SSL" : "SSL",
"Open documentation" : "Öppna dokumentation",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Det är viktigt att konfigurera den här servern för att kunna skicka e-post, till exempel för återställning av lösenord och aviseringar.",
@@ -518,6 +524,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Välj profilbild från filer",
"png or jpg, max. 20 MB" : "png eller jpg, max 20 MB",
"Your location" : "Din plats",
+ "Edit User" : "Redigera användare",
"Will be autogenerated" : "Kommer att autogenereras",
"Add a new user" : "Lägg till ny användare",
"Show Languages" : "Visa språk",
diff --git a/apps/settings/l10n/sv.json b/apps/settings/l10n/sv.json
index 9f314c3ba9b..a329da74400 100644
--- a/apps/settings/l10n/sv.json
+++ b/apps/settings/l10n/sv.json
@@ -314,6 +314,7 @@
"Week starts on {firstDayOfWeek}" : "Veckan börjar med {firstDayOfWeek}",
"Unable to update locale" : "Det gick inte att uppdatera språk",
"No locale set" : "Inget språk angivet",
+ "Your city" : "Din stad",
"Your organisation" : "Din organisation",
"Your phone number" : "Ditt telefonnummer",
"Edit your Profile visibility" : "Ändra synligheten för din profil",
@@ -367,7 +368,6 @@
"Select user quota" : "Välj användarens quota",
"Set the language" : "Ställ in språk",
"Select manager" : "Välj chef",
- "Toggle user actions menu" : "Växla menyn med användaråtgärder",
"Delete user" : "Ta bort användare",
"Wipe all devices" : "Rensa alla enheter",
"Disable user" : "Stäng av användare",
@@ -376,11 +376,16 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Om användaren förlorar sin enhet eller lämnar organisationen, kan all Nextcloud-data fjärrensas från alla enheter associerade med {userid}. Fungerar bara om enheterna är anslutna till internet.",
"Remote wipe of devices" : "Fjärrensning av enheter",
"Wipe {userid}'s devices" : "Rensa enheter för {userid}",
+ "Wiped {userid}'s devices" : "Rensade enheter för {userid}",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "Fullständig radering av konto för {userid} inklusive alla personliga filer, appdata etc.",
"Account deletion" : "Radering av konto",
"Delete {userid}'s account" : "Ta bort konto för {userid}",
+ "Display name was successfully changed" : "Visningsnamnet har ändrats",
+ "Password was successfully changed" : "Lösenordet har ändrats",
+ "Email was successfully changed" : "E-postadressen har ändrats",
"Welcome mail sent!" : "Välkomstmeddelande skickat via e-post!",
- "Edit User" : "Redigera användare",
+ "Toggle user actions menu" : "Växla menyn med användaråtgärder",
+ "Edit" : "Redigera",
"{size} used" : "{size} använt",
"Passwordless authentication requires a secure connection." : "Lösenordsfri autentisering kräver en säker anslutning.",
"Add WebAuthn device" : "Lägg till WebAuthn-enhet",
@@ -450,6 +455,7 @@
"Documentation" : "Dokumentation",
"Forum" : "Forum",
"Login" : "Logga in",
+ "None/STARTTLS" : "Ingen/STARTTLS",
"SSL" : "SSL",
"Open documentation" : "Öppna dokumentation",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Det är viktigt att konfigurera den här servern för att kunna skicka e-post, till exempel för återställning av lösenord och aviseringar.",
@@ -516,6 +522,7 @@
"Choose profile picture from files" : "Välj profilbild från filer",
"png or jpg, max. 20 MB" : "png eller jpg, max 20 MB",
"Your location" : "Din plats",
+ "Edit User" : "Redigera användare",
"Will be autogenerated" : "Kommer att autogenereras",
"Add a new user" : "Lägg till ny användare",
"Show Languages" : "Visa språk",
diff --git a/apps/settings/l10n/th.js b/apps/settings/l10n/th.js
index 4007185a546..f1b763de96b 100644
--- a/apps/settings/l10n/th.js
+++ b/apps/settings/l10n/th.js
@@ -196,7 +196,6 @@ OC.L10N.register(
"Add user to group" : "เพิ่มผู้ใช้เข้ากลุ่ม",
"Set user as admin for" : "ตั้งผู้ใช้เป็นผู้ดูแลระบบสำหรับ",
"Select user quota" : "เลือกโควต้าผู้ใช้",
- "Toggle user actions menu" : "เปิด-ปิด เมนูการกระทำผู้ใช้",
"Delete user" : "ลบผู้ใช้",
"Wipe all devices" : "ล้างอุปกรณ์ทั้งหมด",
"Disable user" : "ปิดใช้งานผู้ใช้",
@@ -209,7 +208,7 @@ OC.L10N.register(
"Account deletion" : "การลบบัญชี",
"Delete {userid}'s account" : "ลบบัญชีของ {userid}",
"Welcome mail sent!" : "ส่งอีเมลยินดีต้อนรับแล้ว!",
- "Edit User" : "แก้ไขผู้ใช้",
+ "Toggle user actions menu" : "เปิด-ปิด เมนูการกระทำผู้ใช้",
"{size} used" : "ใช้ไป {size}",
"Passwordless authentication requires a secure connection." : "การรับรองความถูกต้องแบบไร้รหัสผ่านต้องใช้การเชื่อมต่อที่ปลอดภัย",
"Add WebAuthn device" : "เพิ่มอุปกรณ์ WebAuthn",
@@ -311,6 +310,7 @@ OC.L10N.register(
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "รุ่นที่ออกโดยชุมชนของ Nextcloud นี้ไม่ได้รับการสนับสนุน และไม่สามารถใช้งานการแจ้งเตือนทันทีได้",
"You created app password \"{token}\"" : "คุณสร้างรหัสผ่านแอป \"{token}\" แล้ว",
"png or jpg, max. 20 MB" : "png หรือ jpg สูงสุดไม่เกิน 20 MB",
+ "Edit User" : "แก้ไขผู้ใช้",
"Will be autogenerated" : "จะถูกสร้างขึ้นโดยอัตโนมัติ",
"Add a new user" : "เพิ่มผู้ใช้ใหม่",
"Show Languages" : "แสดงภาษา",
diff --git a/apps/settings/l10n/th.json b/apps/settings/l10n/th.json
index e2bc1883ef9..beac742185d 100644
--- a/apps/settings/l10n/th.json
+++ b/apps/settings/l10n/th.json
@@ -194,7 +194,6 @@
"Add user to group" : "เพิ่มผู้ใช้เข้ากลุ่ม",
"Set user as admin for" : "ตั้งผู้ใช้เป็นผู้ดูแลระบบสำหรับ",
"Select user quota" : "เลือกโควต้าผู้ใช้",
- "Toggle user actions menu" : "เปิด-ปิด เมนูการกระทำผู้ใช้",
"Delete user" : "ลบผู้ใช้",
"Wipe all devices" : "ล้างอุปกรณ์ทั้งหมด",
"Disable user" : "ปิดใช้งานผู้ใช้",
@@ -207,7 +206,7 @@
"Account deletion" : "การลบบัญชี",
"Delete {userid}'s account" : "ลบบัญชีของ {userid}",
"Welcome mail sent!" : "ส่งอีเมลยินดีต้อนรับแล้ว!",
- "Edit User" : "แก้ไขผู้ใช้",
+ "Toggle user actions menu" : "เปิด-ปิด เมนูการกระทำผู้ใช้",
"{size} used" : "ใช้ไป {size}",
"Passwordless authentication requires a secure connection." : "การรับรองความถูกต้องแบบไร้รหัสผ่านต้องใช้การเชื่อมต่อที่ปลอดภัย",
"Add WebAuthn device" : "เพิ่มอุปกรณ์ WebAuthn",
@@ -309,6 +308,7 @@
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "รุ่นที่ออกโดยชุมชนของ Nextcloud นี้ไม่ได้รับการสนับสนุน และไม่สามารถใช้งานการแจ้งเตือนทันทีได้",
"You created app password \"{token}\"" : "คุณสร้างรหัสผ่านแอป \"{token}\" แล้ว",
"png or jpg, max. 20 MB" : "png หรือ jpg สูงสุดไม่เกิน 20 MB",
+ "Edit User" : "แก้ไขผู้ใช้",
"Will be autogenerated" : "จะถูกสร้างขึ้นโดยอัตโนมัติ",
"Add a new user" : "เพิ่มผู้ใช้ใหม่",
"Show Languages" : "แสดงภาษา",
diff --git a/apps/settings/l10n/tr.js b/apps/settings/l10n/tr.js
index 23c178e2ba4..c127b0295ec 100644
--- a/apps/settings/l10n/tr.js
+++ b/apps/settings/l10n/tr.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "Kullanıcı kotasını seçin",
"Set the language" : "Dili ayarla",
"Select manager" : "Yönetici seçin",
- "Toggle user actions menu" : "Kullanıcı işlemleri menüsünü değiştir",
"Delete user" : "Kullanıcıyı sil",
"Wipe all devices" : "Tüm aygıtları sil",
"Disable user" : "Kullanıcıyı devre dışı bırak",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Aygıt kaybedildiğinde ya da kuruluş ile çalışma sona erdirildiğinde, bu özellik {userid} ile ilişkili tüm aygıtlardaki Nextcloud verilerini silebilir. Bu özellik yalnızca aygıtların İnternet bağlantısı olduğunda kullanılabilir.",
"Remote wipe of devices" : "Uzaktan aygıt temizleme",
"Wipe {userid}'s devices" : "{userid} aygıtlarını temizle",
+ "Wiped {userid}'s devices" : "{userid} kullanıcısının aygıtları silindi",
+ "Update of user manager was failed" : "Kullanıcı yöneticisi güncellenemedi",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "{userid} için kişisel dosyalar ve uygulama verileri gibi tüm hesap bilgilerini tamamen siler",
"Account deletion" : "Hesap silme",
"Delete {userid}'s account" : "{userid} hesabını sil",
+ "Display name was successfully changed" : "Görüntülenecek ad değiştirildi",
+ "Password was successfully changed" : "Parola değiştirildi",
+ "Email was successfully changed" : "E-posta adresi değiştirildi",
"Welcome mail sent!" : "Karşılama e-postası gönderildi!",
- "Edit User" : "Kullanıcıyı düzenle",
+ "Toggle user actions menu" : "Kullanıcı işlemleri menüsünü değiştir",
+ "Edit" : "Düzenle",
"{size} used" : "{size} kullanılmış",
"Passwordless authentication requires a secure connection." : "Parolasız kimlik doğrulama özelliği güvenli bir bağlantı üzerinden kullanılabilir.",
"Add WebAuthn device" : "WebAuthn aygıtı ekle",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Profil görselini dosyalardan seçin",
"png or jpg, max. 20 MB" : "png ya da jpg, en fazla 20 MB",
"Your location" : "Konumunuz",
+ "Edit User" : "Kullanıcıyı düzenle",
"Will be autogenerated" : "Otomatik olarak oluşturulacak",
"Add a new user" : "Kullanıcı ekle",
"Show Languages" : "Dilleri görüntüle",
diff --git a/apps/settings/l10n/tr.json b/apps/settings/l10n/tr.json
index 4383be814a6..a5fea7df286 100644
--- a/apps/settings/l10n/tr.json
+++ b/apps/settings/l10n/tr.json
@@ -370,7 +370,6 @@
"Select user quota" : "Kullanıcı kotasını seçin",
"Set the language" : "Dili ayarla",
"Select manager" : "Yönetici seçin",
- "Toggle user actions menu" : "Kullanıcı işlemleri menüsünü değiştir",
"Delete user" : "Kullanıcıyı sil",
"Wipe all devices" : "Tüm aygıtları sil",
"Disable user" : "Kullanıcıyı devre dışı bırak",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Aygıt kaybedildiğinde ya da kuruluş ile çalışma sona erdirildiğinde, bu özellik {userid} ile ilişkili tüm aygıtlardaki Nextcloud verilerini silebilir. Bu özellik yalnızca aygıtların İnternet bağlantısı olduğunda kullanılabilir.",
"Remote wipe of devices" : "Uzaktan aygıt temizleme",
"Wipe {userid}'s devices" : "{userid} aygıtlarını temizle",
+ "Wiped {userid}'s devices" : "{userid} kullanıcısının aygıtları silindi",
+ "Update of user manager was failed" : "Kullanıcı yöneticisi güncellenemedi",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "{userid} için kişisel dosyalar ve uygulama verileri gibi tüm hesap bilgilerini tamamen siler",
"Account deletion" : "Hesap silme",
"Delete {userid}'s account" : "{userid} hesabını sil",
+ "Display name was successfully changed" : "Görüntülenecek ad değiştirildi",
+ "Password was successfully changed" : "Parola değiştirildi",
+ "Email was successfully changed" : "E-posta adresi değiştirildi",
"Welcome mail sent!" : "Karşılama e-postası gönderildi!",
- "Edit User" : "Kullanıcıyı düzenle",
+ "Toggle user actions menu" : "Kullanıcı işlemleri menüsünü değiştir",
+ "Edit" : "Düzenle",
"{size} used" : "{size} kullanılmış",
"Passwordless authentication requires a secure connection." : "Parolasız kimlik doğrulama özelliği güvenli bir bağlantı üzerinden kullanılabilir.",
"Add WebAuthn device" : "WebAuthn aygıtı ekle",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "Profil görselini dosyalardan seçin",
"png or jpg, max. 20 MB" : "png ya da jpg, en fazla 20 MB",
"Your location" : "Konumunuz",
+ "Edit User" : "Kullanıcıyı düzenle",
"Will be autogenerated" : "Otomatik olarak oluşturulacak",
"Add a new user" : "Kullanıcı ekle",
"Show Languages" : "Dilleri görüntüle",
diff --git a/apps/settings/l10n/uk.js b/apps/settings/l10n/uk.js
index 46af52a31d9..21f84ec30eb 100644
--- a/apps/settings/l10n/uk.js
+++ b/apps/settings/l10n/uk.js
@@ -353,7 +353,6 @@ OC.L10N.register(
"Add user to group" : "Додати користувача до групи",
"Set user as admin for" : "Встановити користувача як адміністратора для",
"Select user quota" : "Виберіть квоту користувача",
- "Toggle user actions menu" : "Перемкнути меню дій користувача",
"Delete user" : "Вилучити користувача",
"Wipe all devices" : "Стерти на всіх пристроях",
"Disable user" : "Вимкнути користувача",
@@ -366,7 +365,8 @@ OC.L10N.register(
"Account deletion" : "Вилучення облікового запису",
"Delete {userid}'s account" : "Вилучити обліковий запис {userid}",
"Welcome mail sent!" : "Запрошення надіслано!",
- "Edit User" : "Редагувати користувача",
+ "Toggle user actions menu" : "Перемкнути меню дій користувача",
+ "Edit" : "Редагувати",
"{size} used" : "{size} використано",
"Passwordless authentication requires a secure connection." : "Авторизація без пароля вимагає безпечного з'єднання.",
"Add WebAuthn device" : "Додайте пристрій WebAuthn",
@@ -501,6 +501,7 @@ OC.L10N.register(
"Choose profile picture from files" : "Виберіть зображення профілю з файлів",
"png or jpg, max. 20 MB" : "png або jpg, макс. 20 МБ",
"Your location" : "Ваше місце розташування",
+ "Edit User" : "Редагувати користувача",
"Will be autogenerated" : "Буде створено автоматично",
"Add a new user" : "Додати нового користувача",
"Show Languages" : "Показати мови",
diff --git a/apps/settings/l10n/uk.json b/apps/settings/l10n/uk.json
index 4250c78d0f4..4f03e176305 100644
--- a/apps/settings/l10n/uk.json
+++ b/apps/settings/l10n/uk.json
@@ -351,7 +351,6 @@
"Add user to group" : "Додати користувача до групи",
"Set user as admin for" : "Встановити користувача як адміністратора для",
"Select user quota" : "Виберіть квоту користувача",
- "Toggle user actions menu" : "Перемкнути меню дій користувача",
"Delete user" : "Вилучити користувача",
"Wipe all devices" : "Стерти на всіх пристроях",
"Disable user" : "Вимкнути користувача",
@@ -364,7 +363,8 @@
"Account deletion" : "Вилучення облікового запису",
"Delete {userid}'s account" : "Вилучити обліковий запис {userid}",
"Welcome mail sent!" : "Запрошення надіслано!",
- "Edit User" : "Редагувати користувача",
+ "Toggle user actions menu" : "Перемкнути меню дій користувача",
+ "Edit" : "Редагувати",
"{size} used" : "{size} використано",
"Passwordless authentication requires a secure connection." : "Авторизація без пароля вимагає безпечного з'єднання.",
"Add WebAuthn device" : "Додайте пристрій WebAuthn",
@@ -499,6 +499,7 @@
"Choose profile picture from files" : "Виберіть зображення профілю з файлів",
"png or jpg, max. 20 MB" : "png або jpg, макс. 20 МБ",
"Your location" : "Ваше місце розташування",
+ "Edit User" : "Редагувати користувача",
"Will be autogenerated" : "Буде створено автоматично",
"Add a new user" : "Додати нового користувача",
"Show Languages" : "Показати мови",
diff --git a/apps/settings/l10n/vi.js b/apps/settings/l10n/vi.js
index dd464bbedc4..de37fbba842 100644
--- a/apps/settings/l10n/vi.js
+++ b/apps/settings/l10n/vi.js
@@ -206,6 +206,7 @@ OC.L10N.register(
"Enable user" : "Kích hoạt người dùng",
"Resend welcome email" : "Gửi lại email chào mừng",
"Welcome mail sent!" : "Thư chào mừng đã được gửi!",
+ "Edit" : "Chỉnh sửa",
"{size} used" : "{size} đã sử dụng",
"Your apps" : "Ứng dụng của bạn",
"Changelog" : "Sổ cập nhập thay đổi",
diff --git a/apps/settings/l10n/vi.json b/apps/settings/l10n/vi.json
index 9a648d2f3c0..6e00d9a1cc4 100644
--- a/apps/settings/l10n/vi.json
+++ b/apps/settings/l10n/vi.json
@@ -204,6 +204,7 @@
"Enable user" : "Kích hoạt người dùng",
"Resend welcome email" : "Gửi lại email chào mừng",
"Welcome mail sent!" : "Thư chào mừng đã được gửi!",
+ "Edit" : "Chỉnh sửa",
"{size} used" : "{size} đã sử dụng",
"Your apps" : "Ứng dụng của bạn",
"Changelog" : "Sổ cập nhập thay đổi",
diff --git a/apps/settings/l10n/zh_CN.js b/apps/settings/l10n/zh_CN.js
index 61d7b3609ce..13cf70ba5b8 100644
--- a/apps/settings/l10n/zh_CN.js
+++ b/apps/settings/l10n/zh_CN.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "选择用户容量限额",
"Set the language" : "设置语言",
"Select manager" : "选择管理者",
- "Toggle user actions menu" : "切换用户行动菜单",
"Delete user" : "删除用户",
"Wipe all devices" : "擦除所有设备",
"Disable user" : "禁用用户",
@@ -385,7 +384,8 @@ OC.L10N.register(
"Account deletion" : "帐号删除",
"Delete {userid}'s account" : "删除 {userid} 的账号",
"Welcome mail sent!" : "欢迎邮件已经发送!",
- "Edit User" : "编辑用户",
+ "Toggle user actions menu" : "切换用户行动菜单",
+ "Edit" : "编辑",
"{size} used" : "已使用 {size}",
"Passwordless authentication requires a secure connection." : "无密码身份验证需要安全的连接。",
"Add WebAuthn device" : "添加 WebAuthn 设备",
@@ -524,6 +524,7 @@ OC.L10N.register(
"Choose profile picture from files" : "从文件中选择个人资料图片",
"png or jpg, max. 20 MB" : "png 或 jpg 格式,最大 20MB",
"Your location" : "您的位置",
+ "Edit User" : "编辑用户",
"Will be autogenerated" : "将自动生成",
"Add a new user" : "添加新用户",
"Show Languages" : "显示语言",
diff --git a/apps/settings/l10n/zh_CN.json b/apps/settings/l10n/zh_CN.json
index f15aa1ad43a..5bd8bcfd825 100644
--- a/apps/settings/l10n/zh_CN.json
+++ b/apps/settings/l10n/zh_CN.json
@@ -370,7 +370,6 @@
"Select user quota" : "选择用户容量限额",
"Set the language" : "设置语言",
"Select manager" : "选择管理者",
- "Toggle user actions menu" : "切换用户行动菜单",
"Delete user" : "删除用户",
"Wipe all devices" : "擦除所有设备",
"Disable user" : "禁用用户",
@@ -383,7 +382,8 @@
"Account deletion" : "帐号删除",
"Delete {userid}'s account" : "删除 {userid} 的账号",
"Welcome mail sent!" : "欢迎邮件已经发送!",
- "Edit User" : "编辑用户",
+ "Toggle user actions menu" : "切换用户行动菜单",
+ "Edit" : "编辑",
"{size} used" : "已使用 {size}",
"Passwordless authentication requires a secure connection." : "无密码身份验证需要安全的连接。",
"Add WebAuthn device" : "添加 WebAuthn 设备",
@@ -522,6 +522,7 @@
"Choose profile picture from files" : "从文件中选择个人资料图片",
"png or jpg, max. 20 MB" : "png 或 jpg 格式,最大 20MB",
"Your location" : "您的位置",
+ "Edit User" : "编辑用户",
"Will be autogenerated" : "将自动生成",
"Add a new user" : "添加新用户",
"Show Languages" : "显示语言",
diff --git a/apps/settings/l10n/zh_HK.js b/apps/settings/l10n/zh_HK.js
index 07bd52929ca..398a41336ca 100644
--- a/apps/settings/l10n/zh_HK.js
+++ b/apps/settings/l10n/zh_HK.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "選擇用戶配額",
"Set the language" : "設置語言",
"Select manager" : "選擇管理者",
- "Toggle user actions menu" : "切換用戶操作選單",
"Delete user" : "刪除用戶",
"Wipe all devices" : "抹除所有裝置",
"Disable user" : "停用用戶",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "如果遺失裝置或退出組織,這可以從與 {userid} 相關的所有裝置遠端抹除 Nextcloud 資料。僅當裝置連線到網際網路時才有效。",
"Remote wipe of devices" : "遠端抹除裝置",
"Wipe {userid}'s devices" : "抹除 {userid} 的裝置",
+ "Wiped {userid}'s devices" : "抹除了 {userid} 的裝置",
+ "Update of user manager was failed" : "用戶管理員更新失敗",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "完全刪除 {userid} 的賬戶,包含他們所有的個人檔案、應用程式資料等等。",
"Account deletion" : "賬戶刪除",
"Delete {userid}'s account" : "刪除 {userid} 的賬戶",
+ "Display name was successfully changed" : "成功更新顯示名稱",
+ "Password was successfully changed" : "成功更新密碼",
+ "Email was successfully changed" : "成功更新電郵地址",
"Welcome mail sent!" : "已傳送歡迎郵件!",
- "Edit User" : "編輯用戶",
+ "Toggle user actions menu" : "切換用戶操作選單",
+ "Edit" : "編輯",
"{size} used" : "已使用 {size}",
"Passwordless authentication requires a secure connection." : "無密碼身分驗證需要安全連線。",
"Add WebAuthn device" : "新增 WebAuthn 裝置",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "從檔案選擇個人資料圖片",
"png or jpg, max. 20 MB" : "png 或 jpg,最大 20 MB",
"Your location" : "您的位置",
+ "Edit User" : "編輯用戶",
"Will be autogenerated" : "將自動生成",
"Add a new user" : "新增用戶",
"Show Languages" : "顯示語言",
diff --git a/apps/settings/l10n/zh_HK.json b/apps/settings/l10n/zh_HK.json
index f5ad6723ab8..42212803490 100644
--- a/apps/settings/l10n/zh_HK.json
+++ b/apps/settings/l10n/zh_HK.json
@@ -370,7 +370,6 @@
"Select user quota" : "選擇用戶配額",
"Set the language" : "設置語言",
"Select manager" : "選擇管理者",
- "Toggle user actions menu" : "切換用戶操作選單",
"Delete user" : "刪除用戶",
"Wipe all devices" : "抹除所有裝置",
"Disable user" : "停用用戶",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "如果遺失裝置或退出組織,這可以從與 {userid} 相關的所有裝置遠端抹除 Nextcloud 資料。僅當裝置連線到網際網路時才有效。",
"Remote wipe of devices" : "遠端抹除裝置",
"Wipe {userid}'s devices" : "抹除 {userid} 的裝置",
+ "Wiped {userid}'s devices" : "抹除了 {userid} 的裝置",
+ "Update of user manager was failed" : "用戶管理員更新失敗",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "完全刪除 {userid} 的賬戶,包含他們所有的個人檔案、應用程式資料等等。",
"Account deletion" : "賬戶刪除",
"Delete {userid}'s account" : "刪除 {userid} 的賬戶",
+ "Display name was successfully changed" : "成功更新顯示名稱",
+ "Password was successfully changed" : "成功更新密碼",
+ "Email was successfully changed" : "成功更新電郵地址",
"Welcome mail sent!" : "已傳送歡迎郵件!",
- "Edit User" : "編輯用戶",
+ "Toggle user actions menu" : "切換用戶操作選單",
+ "Edit" : "編輯",
"{size} used" : "已使用 {size}",
"Passwordless authentication requires a secure connection." : "無密碼身分驗證需要安全連線。",
"Add WebAuthn device" : "新增 WebAuthn 裝置",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "從檔案選擇個人資料圖片",
"png or jpg, max. 20 MB" : "png 或 jpg,最大 20 MB",
"Your location" : "您的位置",
+ "Edit User" : "編輯用戶",
"Will be autogenerated" : "將自動生成",
"Add a new user" : "新增用戶",
"Show Languages" : "顯示語言",
diff --git a/apps/settings/l10n/zh_TW.js b/apps/settings/l10n/zh_TW.js
index 7357eabb56d..d7fd194dcab 100644
--- a/apps/settings/l10n/zh_TW.js
+++ b/apps/settings/l10n/zh_TW.js
@@ -372,7 +372,6 @@ OC.L10N.register(
"Select user quota" : "選取使用者配額",
"Set the language" : "設定語言",
"Select manager" : "選取管理者",
- "Toggle user actions menu" : "切換使用者動作選單",
"Delete user" : "刪除使用者",
"Wipe all devices" : "抹除所有裝置",
"Disable user" : "停用使用者",
@@ -381,11 +380,17 @@ OC.L10N.register(
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "如果遺失裝置或退出組織,這可以從與 {userid} 相關的所有裝置遠端抹除 Nextcloud 資料。僅當裝置連線到網際網路時才有效。",
"Remote wipe of devices" : "遠端抹除裝置",
"Wipe {userid}'s devices" : "抹除 {userid} 的裝置",
+ "Wiped {userid}'s devices" : "抹除了 {userid} 的裝置",
+ "Update of user manager was failed" : "使用者管理員更新失敗",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "完全刪除 {userid} 的帳號,包含他們所有的個人檔案、應用程式資料等等。",
"Account deletion" : "帳號刪除",
"Delete {userid}'s account" : "刪除 {userid} 的帳號",
+ "Display name was successfully changed" : "成功變更顯示名稱",
+ "Password was successfully changed" : "成功變更密碼",
+ "Email was successfully changed" : "成功更新電子郵件",
"Welcome mail sent!" : "已傳送歡迎郵件!",
- "Edit User" : "編輯使用者",
+ "Toggle user actions menu" : "切換使用者動作選單",
+ "Edit" : "編輯",
"{size} used" : "已使用 {size}",
"Passwordless authentication requires a secure connection." : "無密碼身份驗證需要安全連線。",
"Add WebAuthn device" : "新增 WebAuthn 裝置",
@@ -524,6 +529,7 @@ OC.L10N.register(
"Choose profile picture from files" : "從檔案中選擇個人檔案圖片",
"png or jpg, max. 20 MB" : "png 或 jpg,最大 20 MB",
"Your location" : "您的位置",
+ "Edit User" : "編輯使用者",
"Will be autogenerated" : "將自動生成",
"Add a new user" : "新增使用者",
"Show Languages" : "顯示語言",
diff --git a/apps/settings/l10n/zh_TW.json b/apps/settings/l10n/zh_TW.json
index 0535c61c910..4434acd81de 100644
--- a/apps/settings/l10n/zh_TW.json
+++ b/apps/settings/l10n/zh_TW.json
@@ -370,7 +370,6 @@
"Select user quota" : "選取使用者配額",
"Set the language" : "設定語言",
"Select manager" : "選取管理者",
- "Toggle user actions menu" : "切換使用者動作選單",
"Delete user" : "刪除使用者",
"Wipe all devices" : "抹除所有裝置",
"Disable user" : "停用使用者",
@@ -379,11 +378,17 @@
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "如果遺失裝置或退出組織,這可以從與 {userid} 相關的所有裝置遠端抹除 Nextcloud 資料。僅當裝置連線到網際網路時才有效。",
"Remote wipe of devices" : "遠端抹除裝置",
"Wipe {userid}'s devices" : "抹除 {userid} 的裝置",
+ "Wiped {userid}'s devices" : "抹除了 {userid} 的裝置",
+ "Update of user manager was failed" : "使用者管理員更新失敗",
"Fully delete {userid}'s account including all their personal files, app data, etc." : "完全刪除 {userid} 的帳號,包含他們所有的個人檔案、應用程式資料等等。",
"Account deletion" : "帳號刪除",
"Delete {userid}'s account" : "刪除 {userid} 的帳號",
+ "Display name was successfully changed" : "成功變更顯示名稱",
+ "Password was successfully changed" : "成功變更密碼",
+ "Email was successfully changed" : "成功更新電子郵件",
"Welcome mail sent!" : "已傳送歡迎郵件!",
- "Edit User" : "編輯使用者",
+ "Toggle user actions menu" : "切換使用者動作選單",
+ "Edit" : "編輯",
"{size} used" : "已使用 {size}",
"Passwordless authentication requires a secure connection." : "無密碼身份驗證需要安全連線。",
"Add WebAuthn device" : "新增 WebAuthn 裝置",
@@ -522,6 +527,7 @@
"Choose profile picture from files" : "從檔案中選擇個人檔案圖片",
"png or jpg, max. 20 MB" : "png 或 jpg,最大 20 MB",
"Your location" : "您的位置",
+ "Edit User" : "編輯使用者",
"Will be autogenerated" : "將自動生成",
"Add a new user" : "新增使用者",
"Show Languages" : "顯示語言",
diff --git a/apps/settings/src/components/GroupListItem.vue b/apps/settings/src/components/GroupListItem.vue
index b7c01ec284f..ee892730b1a 100644
--- a/apps/settings/src/components/GroupListItem.vue
+++ b/apps/settings/src/components/GroupListItem.vue
@@ -30,7 +30,8 @@
:menu-open="openGroupMenu"
@update:menuOpen="handleGroupMenuOpen">
<template #counter>
- <NcCounterBubble v-if="count">
+ <NcCounterBubble v-if="count"
+ :type="active ? 'highlighted' : undefined">
{{ count }}
</NcCounterBubble>
</template>
@@ -67,18 +68,34 @@ export default {
NcAppNavigationItem,
},
props: {
+ /**
+ * If this group is currently selected
+ */
+ active: {
+ type: Boolean,
+ required: true,
+ },
+ /**
+ * Number of members within this group
+ */
+ count: {
+ type: Number,
+ required: true,
+ },
+ /**
+ * Identifier of this group
+ */
id: {
type: String,
required: true,
},
+ /**
+ * Title of this group
+ */
title: {
type: String,
required: true,
},
- count: {
- type: Number,
- required: false,
- },
},
data() {
return {
diff --git a/apps/settings/src/components/Users/UserRow.vue b/apps/settings/src/components/Users/UserRow.vue
index 60dfbd03934..6d5850068de 100644
--- a/apps/settings/src/components/Users/UserRow.vue
+++ b/apps/settings/src/components/Users/UserRow.vue
@@ -44,7 +44,6 @@
<!-- User full data -->
<UserRowSimple v-else-if="!editing"
:editing.sync="editing"
- :feedback-message="feedbackMessage"
:groups="groups"
:languages="languages"
:loading="loading"
@@ -73,23 +72,20 @@
</div>
<!-- dirty hack to ellipsis on two lines -->
<div v-if="user.backendCapabilities.setDisplayName" class="displayName">
- <form :class="{'icon-loading-small': loading.displayName}"
- class="displayName"
- @submit.prevent="updateDisplayName">
- <label class="hidden-visually" :for="'displayName'+user.id+rand">{{ t('settings', 'Edit display name') }}</label>
- <input :id="'displayName'+user.id+rand"
- ref="displayName"
- :disabled="loading.displayName||loading.all"
- :value="user.displayname"
- autocapitalize="off"
- autocomplete="off"
- autocorrect="off"
- spellcheck="false"
- type="text">
- <input class="icon-confirm"
- type="submit"
- value="">
- </form>
+ <label class="hidden-visually" :for="'displayName'+user.id+rand">{{ t('settings', 'Edit display name') }}</label>
+ <NcTextField :id="'displayName'+user.id+rand"
+ :show-trailing-button="true"
+ class="user-row-text-field"
+ :class="{'icon-loading-small': loading.displayName}"
+ :disabled="loading.displayName||loading.all"
+ trailing-button-icon="arrowRight"
+ :value.sync="editedDisplayName"
+ autocapitalize="off"
+ autocomplete="off"
+ autocorrect="off"
+ spellcheck="false"
+ type="text"
+ @trailing-button-click="updateDisplayName" />
</div>
<div v-else class="name">
{{ user.id }}
@@ -99,194 +95,167 @@
</div>
</div>
</div>
- <form v-if="settings.canChangePassword && user.backendCapabilities.setPassword"
- :class="{'icon-loading-small': loading.password}"
- class="password"
- @submit.prevent="updatePassword">
+ <div v-if="settings.canChangePassword && user.backendCapabilities.setPassword" class="password">
<label class="hidden-visually" :for="'password'+user.id+rand">{{ t('settings', 'Add new password') }}</label>
- <input :id="'password'+user.id+rand"
- ref="password"
+ <NcTextField :id="'password'+user.id+rand"
+ :show-trailing-button="true"
+ class="user-row-text-field"
+ :class="{'icon-loading-small': loading.password}"
:disabled="loading.password || loading.all"
:minlength="minPasswordLength"
maxlength="469"
:placeholder="t('settings', 'Add new password')"
+ trailing-button-icon="arrowRight"
+ :value.sync="editedPassword"
autocapitalize="off"
autocomplete="new-password"
autocorrect="off"
required
spellcheck="false"
type="password"
- value="">
- <input class="icon-confirm" type="submit" value="">
- </form>
+ @trailing-button-click="updatePassword" />
+ </div>
+
<div v-else />
- <form :class="{'icon-loading-small': loading.mailAddress}"
- class="mailAddress"
- @submit.prevent="updateEmail">
+
+ <div class="mailAddress">
<label class="hidden-visually" :for="'mailAddress'+user.id+rand">{{ t('settings', 'Add new email address') }}</label>
- <input :id="'mailAddress'+user.id+rand"
- ref="mailAddress"
+ <NcTextField :id="'mailAddress'+user.id+rand"
+ :show-trailing-button="true"
+ class="user-row-text-field"
+ :class="{'icon-loading-small': loading.mailAddress}"
:disabled="loading.mailAddress||loading.all"
:placeholder="t('settings', 'Add new email address')"
- :value="user.email"
+ trailing-button-icon="arrowRight"
+ :value.sync="editedMail"
autocapitalize="off"
autocomplete="new-password"
autocorrect="off"
spellcheck="false"
- type="email">
- <input class="icon-confirm" type="submit" value="">
- </form>
+ type="email"
+ @trailing-button-click="updateEmail" />
+ </div>
<div :class="{'icon-loading-small': loading.groups}" class="groups">
<label class="hidden-visually" :for="'groups'+user.id+rand">{{ t('settings', 'Add user to group') }}</label>
- <NcMultiselect :id="'groups'+user.id+rand"
+ <NcSelect :input-id="'groups'+user.id+rand"
:close-on-select="false"
:disabled="loading.groups||loading.all"
- :limit="2"
:multiple="true"
:options="availableGroups"
:placeholder="t('settings', 'Add user to group')"
- :tag-width="60"
:taggable="settings.isAdmin"
:value="userGroups"
- class="multiselect-vue"
+ class="select-vue"
label="name"
- tag-placeholder="create"
- track-by="id"
- @remove="removeUserGroup"
- @select="addUserGroup"
- @tag="createGroup">
- <span slot="noResult">{{ t('settings', 'No results') }}</span>
- </NcMultiselect>
+ :no-wrap="true"
+ :selectable="() => userGroups.length < 2"
+ :create-option="(value) => ({ name: value, isCreating: true })"
+ @option:created="createGroup"
+ @option:selected="options => addUserGroup(options.at(-1))"
+ @option:deselected="removeUserGroup" />
</div>
<div v-if="subAdminsGroups.length>0 && settings.isAdmin"
:class="{'icon-loading-small': loading.subadmins}"
class="subadmins">
<label class="hidden-visually" :for="'subadmins'+user.id+rand">{{ t('settings', 'Set user as admin for') }}</label>
- <NcMultiselect :id="'subadmins'+user.id+rand"
+ <NcSelect :id="'subadmins'+user.id+rand"
:close-on-select="false"
:disabled="loading.subadmins||loading.all"
- :limit="2"
+ label="name"
:multiple="true"
+ :no-wrap="true"
+ :selectable="() => userSubAdminsGroups.length < 2"
:options="subAdminsGroups"
:placeholder="t('settings', 'Set user as admin for')"
- :tag-width="60"
:value="userSubAdminsGroups"
- class="multiselect-vue"
- label="name"
- track-by="id"
- @remove="removeUserSubAdmin"
- @select="addUserSubAdmin">
- <span slot="noResult">{{ t('settings', 'No results') }}</span>
- </NcMultiselect>
+ class="select-vue"
+ @option:deselected="removeUserSubAdmin"
+ @option:selected="options => addUserSubAdmin(options.at(-1))" />
</div>
<div :title="usedSpace"
:class="{'icon-loading-small': loading.quota}"
class="quota">
<label class="hidden-visually" :for="'quota'+user.id+rand">{{ t('settings', 'Select user quota') }}</label>
- <NcMultiselect :id="'quota'+user.id+rand"
- :allow-empty="false"
+ <NcSelect v-model="userQuota"
+ :close-on-select="true"
+ :create-option="validateQuota"
:disabled="loading.quota||loading.all"
+ :input-id="'quota'+user.id+rand"
+ class="select-vue"
:options="quotaOptions"
:placeholder="t('settings', 'Select user quota')"
:taggable="true"
- :value="userQuota"
- class="multiselect-vue"
- label="label"
- tag-placeholder="create"
- track-by="id"
- @input="setUserQuota"
- @tag="validateQuota" />
+ @option:selected="setUserQuota" />
</div>
<div v-if="showConfig.showLanguages"
:class="{'icon-loading-small': loading.languages}"
class="languages">
<label class="hidden-visually" :for="'language'+user.id+rand">{{ t('settings', 'Set the language') }}</label>
- <NcMultiselect :id="'language'+user.id+rand"
+ <NcSelect :id="'language'+user.id+rand"
:allow-empty="false"
:disabled="loading.languages||loading.all"
- :options="languages"
+ :options="availableLanguages"
:placeholder="t('settings', 'No language set')"
:value="userLanguage"
- class="multiselect-vue"
- group-label="label"
- group-values="languages"
label="name"
- track-by="code"
+ class="select-vue"
@input="setUserLanguage" />
</div>
+
+ <div v-if="showConfig.showStoragePath || showConfig.showUserBackend"
+ class="storageLocation" />
+ <div v-if="showConfig.showLastLogin" />
+
<div :class="{'icon-loading-small': loading.manager}" class="managers">
- <NcMultiselect ref="manager"
- v-model="currentManager"
+ <label class="hidden-visually" :for="'manager'+user.id+rand">{{ t('settings', 'Set the language') }}</label>
+ <NcSelect v-model="currentManager"
+ :input-id="'manager'+user.id+rand"
:close-on-select="true"
- :user-select="true"
+ label="displayname"
:options="possibleManagers"
:placeholder="t('settings', 'Select manager')"
- class="multiselect-vue"
- label="displayname"
- track-by="id"
- @search-change="searchUserManager"
- @remove="updateUserManager"
- @select="updateUserManager">
- <span slot="noResult">{{ t('settings', 'No results') }}</span>
- </NcMultiselect>
+ class="select-vue"
+ @search="searchUserManager"
+ @option:selected="updateUserManager"
+ @input="updateUserManager" />
</div>
- <!-- don't show this on edit mode -->
- <div v-if="showConfig.showStoragePath || showConfig.showUserBackend"
- class="storageLocation" />
- <div v-if="showConfig.showLastLogin" />
-
<div class="userActions">
- <div v-if="!loading.all"
- class="toggleUserActions">
- <NcActions>
- <NcActionButton icon="icon-checkmark"
- :title="t('settings', 'Done')"
- :aria-label="t('settings', 'Done')"
- @click="editing = false" />
- </NcActions>
- <div v-click-outside="hideMenu" class="userPopoverMenuWrapper">
- <button class="icon-more"
- :aria-expanded="openedMenu"
- :aria-label="t('settings', 'Toggle user actions menu')"
- @click.prevent="toggleMenu" />
- <div :class="{ 'open': openedMenu }" class="popovermenu">
- <NcPopoverMenu :menu="userActions" />
- </div>
- </div>
- </div>
- <div :style="{opacity: feedbackMessage !== '' ? 1 : 0}"
- class="feedback">
- <div class="icon-checkmark" />
- {{ feedbackMessage }}
- </div>
+ <UserRowActions v-if="!loading.all"
+ :actions="userActions"
+ :edit="true"
+ @update:edit="toggleEdit" />
</div>
</div>
</template>
<script>
+import { showSuccess, showError } from '@nextcloud/dialogs'
+
+import NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'
+import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js'
import ClickOutside from 'vue-click-outside'
-import NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu.js'
-import NcMultiselect from '@nextcloud/vue/dist/Components/NcMultiselect.js'
-import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
-import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
+import UserRowActions from './UserRowActions.vue'
import UserRowSimple from './UserRowSimple.vue'
import UserRowMixin from '../../mixins/UserRowMixin.js'
export default {
name: 'UserRow',
+
components: {
+ NcSelect,
+ NcTextField,
+ UserRowActions,
UserRowSimple,
- NcPopoverMenu,
- NcActions,
- NcActionButton,
- NcMultiselect,
},
+
directives: {
ClickOutside,
},
+
mixins: [UserRowMixin],
+
props: {
users: {
type: Array,
@@ -331,9 +300,12 @@ export default {
},
data() {
return {
+ // default quota is set to unlimited
+ unlimitedQuota: { id: 'none', label: t('settings', 'Unlimited') },
+ // temporary value used for multiselect change
+ selectedQuota: false,
rand: parseInt(Math.random() * 1000),
openedMenu: false,
- feedbackMessage: '',
possibleManagers: [],
currentManager: '',
editing: false,
@@ -351,10 +323,13 @@ export default {
wipe: false,
manager: false,
},
+ editedDisplayName: this.user.displayname,
+ editedPassword: '',
+ editedMail: this.user.email ?? '',
}
},
- computed: {
+ computed: {
/* USER POPOVERMENU ACTIONS */
userActions() {
const actions = [
@@ -383,9 +358,32 @@ export default {
}
return actions.concat(this.externalActions)
},
+
+ // mapping saved values to objects
+ userQuota: {
+ get() {
+ if (this.selectedQuota !== false) {
+ return this.selectedQuota
+ }
+ if (this.settings.defaultQuota !== this.unlimitedQuota.id && OC.Util.computerFileSize(this.settings.defaultQuota) >= 0) {
+ // if value is valid, let's map the quotaOptions or return custom quota
+ return { id: this.settings.defaultQuota, label: this.settings.defaultQuota }
+ }
+ return this.unlimitedQuota // unlimited
+ },
+ set(quota) {
+ this.selectedQuota = quota
+ },
+ },
+
+ availableLanguages() {
+ return this.languages[0].languages.concat(this.languages[1].languages)
+ },
},
+
async beforeMount() {
await this.searchUserManager()
+
if (this.user.manager) {
await this.initManager(this.user.manager)
}
@@ -416,13 +414,14 @@ export default {
this.loading.wipe = true
this.loading.all = true
this.$store.dispatch('wipeUserDevices', userid)
- .then(() => {
+ .then(() => showSuccess(t('settings', 'Wiped {userid}\'s devices', { userid })), { timeout: 2000 })
+ .finally(() => {
this.loading.wipe = false
this.loading.all = false
})
}
},
- true
+ true,
)
},
@@ -444,14 +443,22 @@ export default {
},
updateUserManager(manager) {
+ if (manager === null) {
+ this.currentManager = ''
+ }
this.loading.manager = true
- this.$store.dispatch('setUserData', {
- userid: this.user.id,
- key: 'manager',
- value: this.currentManager ? this.currentManager.id : '',
- }).then(() => {
+ try {
+ this.$store.dispatch('setUserData', {
+ userid: this.user.id,
+ key: 'manager',
+ value: this.currentManager ? this.currentManager.id : '',
+ })
+ } catch (error) {
+ showError(t('setting', 'Update of user manager was failed'))
+ console.error(error)
+ } finally {
this.loading.manager = false
- })
+ }
},
deleteUser() {
@@ -476,7 +483,7 @@ export default {
})
}
},
- true
+ true,
)
},
@@ -501,15 +508,16 @@ export default {
* @param {string} displayName The display name
*/
updateDisplayName() {
- const displayName = this.$refs.displayName.value
this.loading.displayName = true
this.$store.dispatch('setUserData', {
userid: this.user.id,
key: 'displayname',
- value: displayName,
+ value: this.editedDisplayName,
}).then(() => {
this.loading.displayName = false
- this.$refs.displayName.value = displayName
+ if (this.editedDisplayName === this.user.displayname) {
+ showSuccess(t('setting', 'Display name was successfully changed'))
+ }
})
},
@@ -519,16 +527,21 @@ export default {
* @param {string} password The email address
*/
updatePassword() {
- const password = this.$refs.password.value
this.loading.password = true
- this.$store.dispatch('setUserData', {
- userid: this.user.id,
- key: 'password',
- value: password,
- }).then(() => {
+ if (this.editedPassword.length === 0) {
+ showError(t('setting', "Password can't be empty"))
this.loading.password = false
- this.$refs.password.value = '' // empty & show placeholder
- })
+ } else {
+ this.$store.dispatch('setUserData', {
+ userid: this.user.id,
+ key: 'password',
+ value: this.editedPassword,
+ }).then(() => {
+ this.loading.password = false
+ this.editedPassword = ''
+ showSuccess(t('setting', 'Password was successfully changed'))
+ })
+ }
},
/**
@@ -537,16 +550,23 @@ export default {
* @param {string} mailAddress The email address
*/
updateEmail() {
- const mailAddress = this.$refs.mailAddress.value
this.loading.mailAddress = true
- this.$store.dispatch('setUserData', {
- userid: this.user.id,
- key: 'email',
- value: mailAddress,
- }).then(() => {
+ if (this.editedMail === '') {
+ showError(t('setting', "Email can't be empty"))
this.loading.mailAddress = false
- this.$refs.mailAddress.value = mailAddress
- })
+ this.editedMail = this.user.email
+ } else {
+ this.$store.dispatch('setUserData', {
+ userid: this.user.id,
+ key: 'email',
+ value: this.editedMail,
+ }).then(() => {
+ this.loading.mailAddress = false
+ if (this.editedMail === this.user.email) {
+ showSuccess(t('setting', 'Email was successfully changed'))
+ }
+ })
+ }
},
/**
@@ -554,7 +574,7 @@ export default {
*
* @param {string} gid Group id
*/
- async createGroup(gid) {
+ async createGroup({ name: gid }) {
this.loading = { groups: true, subadmins: true }
try {
await this.$store.dispatch('addGroup', gid)
@@ -574,12 +594,17 @@ export default {
* @param {object} group Group object
*/
async addUserGroup(group) {
- if (group.canAdd === false) {
- return false
+ if (group.isCreating) {
+ // This is NcSelect's internal value for a new inputted group name
+ // Ignore
+ return
}
this.loading.groups = true
const userid = this.user.id
const gid = group.id
+ if (group.canAdd === false) {
+ return false
+ }
try {
await this.$store.dispatch('addUserGroup', { userid, gid })
} catch (error) {
@@ -598,11 +623,9 @@ export default {
if (group.canRemove === false) {
return false
}
-
this.loading.groups = true
const userid = this.user.id
const gid = group.id
-
try {
await this.$store.dispatch('removeUserGroup', {
userid,
@@ -627,7 +650,6 @@ export default {
this.loading.subadmins = true
const userid = this.user.id
const gid = group.id
-
try {
await this.$store.dispatch('addUserSubAdmin', {
userid,
@@ -668,6 +690,10 @@ export default {
* @return {string}
*/
async setUserQuota(quota = 'none') {
+ // Make sure correct label is set for unlimited quota
+ if (quota === 'none') {
+ quota = this.unlimitedQuota
+ }
this.loading.quota = true
// ensure we only send the preset id
quota = quota.id ? quota.id : quota
@@ -689,18 +715,22 @@ export default {
/**
* Validate quota string to make sure it's a valid human file size
*
- * @param {string} quota Quota in readable format '5 GB'
- * @return {Promise|boolean}
+ * @param {string | object} quota Quota in readable format '5 GB' or Object {id: '5 GB', label: '5GB'}
+ * @return {object} The validated quota object or unlimited quota if input is invalid
*/
validateQuota(quota) {
+ if (typeof quota === 'object') {
+ quota = quota?.id || quota.label
+ }
// only used for new presets sent through @Tag
const validQuota = OC.Util.computerFileSize(quota)
- if (validQuota !== null && validQuota >= 0) {
+ if (validQuota === null) {
+ return this.unlimitedQuota
+ } else {
// unify format output
- return this.setUserQuota(OC.Util.humanFileSize(OC.Util.computerFileSize(quota)))
+ quota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))
+ return { id: quota, label: quota }
}
- // if no valid do not change
- return false
},
/**
@@ -718,10 +748,9 @@ export default {
key: 'language',
value: lang.code,
})
+ this.loading.languages = false
} catch (error) {
console.error(error)
- } finally {
- this.loading.languages = false
}
return lang
},
@@ -732,18 +761,20 @@ export default {
sendWelcomeMail() {
this.loading.all = true
this.$store.dispatch('sendWelcomeMail', this.user.id)
- .then(success => {
- if (success) {
- // Show feedback to indicate the success
- this.feedbackMessage = t('setting', 'Welcome mail sent!')
- setTimeout(() => {
- this.feedbackMessage = ''
- }, 2000)
- }
+ .then(() => showSuccess(t('setting', 'Welcome mail sent!'), { timeout: 2000 }))
+ .finally(() => {
this.loading.all = false
})
},
+ toggleEdit() {
+ this.editing = false
+ if (this.editedDisplayName !== this.user.displayname) {
+ this.editedDisplayName = this.user.displayname
+ } else if (this.editedMail !== this.user.email) {
+ this.editedMail = this.user.email
+ }
+ },
},
}
</script>
@@ -752,7 +783,24 @@ export default {
.row--menu-opened {
z-index: 1 !important;
}
- .row::v-deep .multiselect__single {
- z-index: auto !important;
- }
+
+ .row :deep() {
+ .v-select.select {
+ // reset min width to 100% instead of X px
+ min-width: 100%;
+ }
+
+ .mailAddress,
+ .password,
+ .displayName {
+ .input-field,
+ .input-field__input {
+ height: 48px!important;
+ }
+ .button-vue--icon-only {
+ height: 44px!important;
+ }
+ }
+ }
+
</style>
diff --git a/apps/settings/src/components/Users/UserRowActions.vue b/apps/settings/src/components/Users/UserRowActions.vue
new file mode 100644
index 00000000000..ad89528fda7
--- /dev/null
+++ b/apps/settings/src/components/Users/UserRowActions.vue
@@ -0,0 +1,78 @@
+<template>
+ <NcActions :aria-label="t('settings', 'Toggle user actions menu')"
+ :inline="1">
+ <NcActionButton @click="toggleEdit">
+ {{ edit ? t('settings', 'Done') : t('settings', 'Edit') }}
+ <template #icon>
+ <NcIconSvgWrapper :svg="editSvg" aria-hidden="true" />
+ </template>
+ </NcActionButton>
+ <NcActionButton v-for="(action, index) in actions"
+ :key="index"
+ :aria-label="action.text"
+ :icon="action.icon"
+ @click="action.action">
+ {{ action.text }}
+ </NcActionButton>
+ </NcActions>
+</template>
+
+<script lang="ts">
+import { PropType, defineComponent } from 'vue'
+
+import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
+import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
+import NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'
+import SvgCheck from '@mdi/svg/svg/check.svg?raw'
+import SvgPencil from '@mdi/svg/svg/pencil.svg?raw'
+
+interface UserAction {
+ action: (event: MouseEvent) => void,
+ icon: string,
+ text: string
+}
+
+export default defineComponent({
+ components: {
+ NcActionButton,
+ NcActions,
+ NcIconSvgWrapper,
+ },
+
+ props: {
+ /**
+ * Array of user actions
+ */
+ actions: {
+ type: Array as PropType<readonly UserAction[]>,
+ required: true,
+ },
+
+ /**
+ * The state whether the row is currently edited
+ */
+ edit: {
+ type: Boolean,
+ required: true,
+ },
+ },
+
+ computed: {
+ /**
+ * Current MDI logo to show for edit toggle
+ */
+ editSvg() {
+ return this.edit ? SvgCheck : SvgPencil
+ },
+ },
+
+ methods: {
+ /**
+ * Toggle edit mode by emitting the update event
+ */
+ toggleEdit() {
+ this.$emit('update:edit', !this.edit)
+ },
+ },
+})
+</script>
diff --git a/apps/settings/src/components/Users/UserRowSimple.vue b/apps/settings/src/components/Users/UserRowSimple.vue
index 20a3e96d54f..3d7f79b4195 100644
--- a/apps/settings/src/components/Users/UserRowSimple.vue
+++ b/apps/settings/src/components/Users/UserRowSimple.vue
@@ -59,45 +59,26 @@
{{ user.manager }}
</div>
<div class="userActions">
- <div v-if="canEdit && !loading.all" class="toggleUserActions">
- <NcActions>
- <NcActionButton icon="icon-rename"
- :title="t('settings', 'Edit User')"
- :aria-label="t('settings', 'Edit User')"
- @click="toggleEdit" />
- </NcActions>
- <div class="userPopoverMenuWrapper">
- <button v-click-outside="hideMenu"
- class="icon-more"
- :aria-expanded="openedMenu"
- :aria-label="t('settings', 'Toggle user actions menu')"
- @click.prevent="toggleMenu" />
- <div class="popovermenu" :class="{ 'open': openedMenu }">
- <NcPopoverMenu :menu="userActions" />
- </div>
- </div>
- </div>
- <div class="feedback" :style="{opacity: feedbackMessage !== '' ? 1 : 0}">
- <div class="icon-checkmark" />
- {{ feedbackMessage }}
- </div>
+ <UserRowActions v-if="canEdit && !loading.all"
+ :actions="userActions"
+ :edit="false"
+ @update:edit="toggleEdit" />
</div>
</div>
</template>
<script>
-import NcPopoverMenu from '@nextcloud/vue/dist/Components/NcPopoverMenu.js'
-import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
-import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
-import ClickOutside from 'vue-click-outside'
import { getCurrentUser } from '@nextcloud/auth'
+
+import ClickOutside from 'vue-click-outside'
+
+import UserRowActions from './UserRowActions.vue'
import UserRowMixin from '../../mixins/UserRowMixin.js'
+
export default {
name: 'UserRowSimple',
components: {
- NcPopoverMenu,
- NcActionButton,
- NcActions,
+ UserRowActions,
},
directives: {
ClickOutside,
@@ -124,10 +105,6 @@ export default {
type: Boolean,
required: true,
},
- feedbackMessage: {
- type: String,
- required: true,
- },
subAdminsGroups: {
type: Array,
required: true,
diff --git a/apps/settings/src/views/Apps.vue b/apps/settings/src/views/Apps.vue
index f9f1023f928..3cfa3b62bae 100644
--- a/apps/settings/src/views/Apps.vue
+++ b/apps/settings/src/views/Apps.vue
@@ -46,9 +46,9 @@
:to="{ name: 'apps-category', params: { category: 'updates' } }"
icon="icon-download"
:title="$options.APPS_SECTION_ENUM.updates">
- <NcAppNavigationCounter slot="counter">
- {{ updateCount }}
- </NcAppNavigationCounter>
+ <template #counter>
+ <NcCounterBubble>{{ updateCount }}</NcCounterBubble>
+ </template>
</NcAppNavigationItem>
<NcAppNavigationItem id="app-category-your-bundles"
:to="{ name: 'apps-category', params: { category: 'app-bundles' } }"
@@ -141,11 +141,11 @@ import VueLocalStorage from 'vue-localstorage'
import NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'
import NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'
-import NcAppNavigationCounter from '@nextcloud/vue/dist/Components/NcAppNavigationCounter.js'
import NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'
import NcAppNavigationSpacer from '@nextcloud/vue/dist/Components/NcAppNavigationSpacer.js'
import NcAppSidebar from '@nextcloud/vue/dist/Components/NcAppSidebar.js'
import NcAppSidebarTab from '@nextcloud/vue/dist/Components/NcAppSidebarTab.js'
+import NcCounterBubble from '@nextcloud/vue/dist/Components/NcCounterBubble.js'
import NcContent from '@nextcloud/vue/dist/Components/NcContent.js'
import AppList from '../components/AppList.vue'
@@ -166,9 +166,9 @@ export default {
AppDetails,
AppList,
NcAppNavigation,
- NcAppNavigationCounter,
NcAppNavigationItem,
NcAppNavigationSpacer,
+ NcCounterBubble,
AppScore,
NcAppSidebar,
NcAppSidebarTab,
diff --git a/apps/settings/src/views/Users.vue b/apps/settings/src/views/Users.vue
index de9648c5d0f..6f8318a872a 100644
--- a/apps/settings/src/views/Users.vue
+++ b/apps/settings/src/views/Users.vue
@@ -47,9 +47,11 @@
:title="t('settings', 'Active users')"
:to="{ name: 'users' }"
icon="icon-contacts-dark">
- <NcAppNavigationCounter v-if="userCount > 0" slot="counter">
- {{ userCount }}
- </NcAppNavigationCounter>
+ <template #counter>
+ <NcCounterBubble :type="!selectedGroupDecoded ? 'highlighted' : undefined">
+ {{ userCount }}
+ </NcCounterBubble>
+ </template>
</NcAppNavigationItem>
<NcAppNavigationItem v-if="settings.isAdmin"
id="admin"
@@ -57,9 +59,11 @@
:title="t('settings', 'Admins')"
:to="{ name: 'group', params: { selectedGroup: 'admin' } }"
icon="icon-user-admin">
- <NcAppNavigationCounter v-if="adminGroupMenu.count" slot="counter">
- {{ adminGroupMenu.count }}
- </NcAppNavigationCounter>
+ <template v-if="adminGroupMenu.count > 0" #counter>
+ <NcCounterBubble :type="selectedGroupDecoded === 'admin' ? 'highlighted' : undefined">
+ {{ adminGroupMenu.count }}
+ </NcCounterBubble>
+ </template>
</NcAppNavigationItem>
<!-- Hide the disabled if none, if we don't have the data (-1) show it -->
@@ -69,15 +73,18 @@
:title="t('settings', 'Disabled users')"
:to="{ name: 'group', params: { selectedGroup: 'disabled' } }"
icon="icon-disabled-users">
- <NcAppNavigationCounter v-if="disabledGroupMenu.usercount > 0" slot="counter">
- {{ disabledGroupMenu.usercount }}
- </NcAppNavigationCounter>
+ <template v-if="disabledGroupMenu.usercount > 0" #counter>
+ <NcCounterBubble :type="selectedGroupDecoded === 'disabled' ? 'highlighted' : undefined">
+ {{ disabledGroupMenu.usercount }}
+ </NcCounterBubble>
+ </template>
</NcAppNavigationItem>
<NcAppNavigationCaption v-if="groupList.length > 0" :title="t('settings', 'Groups')" />
<GroupListItem v-for="group in groupList"
:id="group.id"
:key="group.id"
+ :active="selectedGroupDecoded === group.id"
:title="group.title"
:count="group.count" />
</template>
@@ -137,12 +144,12 @@ import VueLocalStorage from 'vue-localstorage'
import NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'
import NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'
import NcAppNavigationCaption from '@nextcloud/vue/dist/Components/NcAppNavigationCaption.js'
-import NcAppNavigationCounter from '@nextcloud/vue/dist/Components/NcAppNavigationCounter.js'
import NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'
import NcAppNavigationNew from '@nextcloud/vue/dist/Components/NcAppNavigationNew.js'
import NcAppNavigationNewItem from '@nextcloud/vue/dist/Components/NcAppNavigationNewItem.js'
import NcAppNavigationSettings from '@nextcloud/vue/dist/Components/NcAppNavigationSettings.js'
import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
+import NcCounterBubble from '@nextcloud/vue/dist/Components/NcCounterBubble.js'
import NcContent from '@nextcloud/vue/dist/Components/NcContent.js'
import NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'
@@ -163,12 +170,12 @@ export default {
NcAppContent,
NcAppNavigation,
NcAppNavigationCaption,
- NcAppNavigationCounter,
NcAppNavigationItem,
NcAppNavigationNew,
NcAppNavigationNewItem,
NcAppNavigationSettings,
NcCheckboxRadioSwitch,
+ NcCounterBubble,
NcContent,
NcSelect,
Plus,
diff --git a/apps/sharebymail/composer/composer/ClassLoader.php b/apps/sharebymail/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/sharebymail/composer/composer/ClassLoader.php
+++ b/apps/sharebymail/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/sharebymail/composer/composer/installed.php b/apps/sharebymail/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/sharebymail/composer/composer/installed.php
+++ b/apps/sharebymail/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/sharebymail/l10n/ar.js b/apps/sharebymail/l10n/ar.js
new file mode 100644
index 00000000000..1b32d0af96a
--- /dev/null
+++ b/apps/sharebymail/l10n/ar.js
@@ -0,0 +1,57 @@
+OC.L10N.register(
+ "sharebymail",
+ {
+ "Shared with {email}" : "تمّت مشاركته مع {email}",
+ "Shared with {email} by {actor}" : "تمّت مشاركته مع {email} من قِبَل {actor}",
+ "Unshared from {email}" : "تمّ إلغاء المُشاركة مع {email}",
+ "Unshared from {email} by {actor}" : "تمّ إلغاء المشاركة مع {email} من قِبَل {actor}",
+ "Password for mail share sent to {email}" : "كلمة مرور المشاركة تمّ إرسالها إلى {email}",
+ "Password for mail share sent to you" : "كلمة مرور المشاركة تمّ إرسالها إليك",
+ "You shared {file} with {email} by mail" : "أنت شاركت {file} مع {email} بالإيميل",
+ "{actor} shared {file} with {email} by mail" : "{actor} شارك {file} مع {email} بالإيميل",
+ "You unshared {file} from {email} by mail" : "أنت ألغيت المشاركة {file} مع {email} بالإيميل",
+ "{actor} unshared {file} from {email} by mail" : "{actor} ألغى المشاركة {file} مع {email} بالإيميل",
+ "Password to access {file} was sent to {email}" : "كلمة مرور لمشاركة {file} تم إرسالها إلى {email}",
+ "Password to access {file} was sent to you" : "كلمة مرور لمشاركة {file} تمّ إرسالها إليك",
+ "Share by mail" : "مشاركة بالإيميل",
+ "Sharing %1$s failed, because this item is already shared with user %2$s" : "عملية مشاركة %1$s لم تتم، بسبب أن هذا العنصر سبقت مشاركته سلفاً مع المستخدم %2$s",
+ "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "لا يمكننا أن نرسل لك كلمة المرور التي تم إنشاؤها تلقائيًا. يرجى تعيين عنوان بريد إلكتروني صالح في إعداداتك الشخصية، ثم حاول مرة أخرى.",
+ "Failed to send share by email. Got an invalid email address" : "تعذّر إرسال المشاركة عبر البريد الإلكتروني. حصلت على عنوان بريد إلكتروني غير صالح.",
+ "Failed to send share by email" : "تعذّر إرسال مشاركة بالإيميل",
+ "%1$s shared »%2$s« with you" : "%1$s شارك »%2$s« معك",
+ "%1$s shared »%2$s« with you." : "%1$s شَارَكَ »%2$s« معك.",
+ "Click the button below to open it." : "أنقر على الزر أدناه لفتحه.",
+ "Open »%s«" : "فتح »%s«",
+ "%1$s via %2$s" : "%1$s عبر %2$s",
+ "%1$s shared »%2$s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%1$s شارك »%2$s« معك.\nيفترض أن يصلك أو يكون وصلك بريد الكتروني يحوي رابطاً للوصول إليه.\n",
+ "%1$s shared »%2$s« with you. You should have already received a separate mail with a link to access it." : "%1$s شارك »%2$s« معك. \nيفترض أن يصلك أو يكون وصلك بريد الكتروني يحوي رابطاً للوصول إليه.",
+ "Password to access »%1$s« shared to you by %2$s" : "كلمة مرور للوصول إلى »%1$s« تمّت مُشاركتها معك من قِبَل %2$s",
+ "Password to access »%s«" : "كلمة مرور للوصول إلى »%s«",
+ "It is protected with the following password:" : "إنها محميّة بكلمة المرور التالية:",
+ "This password will expire at %s" : "كلمة المرور هذه ستنتهي صلاحيتها في %s",
+ "%1$s shared »%2$s« with you and wants to add:" : "%1$s شارك »%2$s« معك و يرغب في إضافة:",
+ "%1$s shared »%2$s« with you and wants to add" : "%1$s شارك »%2$s« معك و يرغب في إضافة",
+ "»%s« added a note to a file shared with you" : "»%s« أضافة ملاحظة لملفٍ سلفت مشاركته معك",
+ "You just shared »%1$s« with %2$s. The share was already sent to the recipient. Due to the security policies defined by the administrator of %3$s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "أنت شاركت للتّوِّ »%1$s« مع %2$s. تمّ إرسال المشاركة إلى وجهتها. بسبب السياسة الأمنية الموضوعة من قبل مشرف %3$s كل مشاركة يجب أن تكون محمية بكلمة مرور و التي يجب إلّا يتم إرسالها مباشرة إلى المستخدم المقصود. لذا بجب أن تقوم بتحويلها إليه يدويّاً.",
+ "Password to access »%1$s« shared by you with %2$s" : "كلمة مرور للوصول إلى »%1$s« تمّت مشاركتها مع %2$s",
+ "This is the password:" : "هذه هي كلمة المرور:",
+ "You can choose a different password at any time in the share dialog." : "يمكنك اختيار كلمة مرور مختلفة في أي وقت في نافذة حوار المشاركة share dialog.",
+ "Could not find share" : "تعذّر العثور على المُشاركة",
+ "Share provider which allows you to share files by mail" : "مُزوّد المشاركة share provider الذي مكّنك من المشاركة عبر البريد",
+ "Allows users to share a personalized link to a file or folder by putting in an email address." : "يسمح للمستخدمين بمشاركة ارتباط مخصص لملف أو مجلد عن طريق إدخال عنوان بريد إلكتروني.",
+ "Send password by mail" : "إرسال كلمة مرور بالإيميل",
+ "Reply to initiator" : "ردّ على المُنشيء initiator",
+ "Unable to update share by mail config" : "تعذّر تحديث تهيئة المشاركة بالإيميل",
+ "Shared with %1$s" : "مشاركة مع %1$s",
+ "Shared with %1$s by %2$s" : "مشاركة مع %1$sمن قِبَل %2$s",
+ "Unshared from %1$s" : "إلغاء المشاركة مع %1$s",
+ "Unshared from %1$s by %2$s" : "إلغاء المشاركة مع %1$s من قِبَل%2$s",
+ "Password for mail share sent to %1$s" : "كلمة مرور للمشاركة بالإيميل أُرسلت إلى %1$s",
+ "You shared %1$s with %2$s by mail" : "أنت شاركت %1$s مع %2$s بالإيميل",
+ "%3$s shared %1$s with %2$s by mail" : "%3$s شارك %1$s مع %2$s بالإيميل",
+ "You unshared %1$s from %2$s by mail" : "أنت ألغيت المشاركة %1$s مع %2$s بالإيميل",
+ "%3$s unshared %1$s from %2$s by mail" : "%3$s ألغى المشاركة %1$s مع %2$s بالإيميل",
+ "Password to access %1$s was sent to %2s" : "كلمة مرور للوصول إلى %1$s أُرسلت إلى %2s",
+ "Password to access %1$s was sent to you" : "كلمة مرور للوصول إلى %1$s أُرسلت إليك"
+},
+"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/sharebymail/l10n/ar.json b/apps/sharebymail/l10n/ar.json
new file mode 100644
index 00000000000..45bacc09188
--- /dev/null
+++ b/apps/sharebymail/l10n/ar.json
@@ -0,0 +1,55 @@
+{ "translations": {
+ "Shared with {email}" : "تمّت مشاركته مع {email}",
+ "Shared with {email} by {actor}" : "تمّت مشاركته مع {email} من قِبَل {actor}",
+ "Unshared from {email}" : "تمّ إلغاء المُشاركة مع {email}",
+ "Unshared from {email} by {actor}" : "تمّ إلغاء المشاركة مع {email} من قِبَل {actor}",
+ "Password for mail share sent to {email}" : "كلمة مرور المشاركة تمّ إرسالها إلى {email}",
+ "Password for mail share sent to you" : "كلمة مرور المشاركة تمّ إرسالها إليك",
+ "You shared {file} with {email} by mail" : "أنت شاركت {file} مع {email} بالإيميل",
+ "{actor} shared {file} with {email} by mail" : "{actor} شارك {file} مع {email} بالإيميل",
+ "You unshared {file} from {email} by mail" : "أنت ألغيت المشاركة {file} مع {email} بالإيميل",
+ "{actor} unshared {file} from {email} by mail" : "{actor} ألغى المشاركة {file} مع {email} بالإيميل",
+ "Password to access {file} was sent to {email}" : "كلمة مرور لمشاركة {file} تم إرسالها إلى {email}",
+ "Password to access {file} was sent to you" : "كلمة مرور لمشاركة {file} تمّ إرسالها إليك",
+ "Share by mail" : "مشاركة بالإيميل",
+ "Sharing %1$s failed, because this item is already shared with user %2$s" : "عملية مشاركة %1$s لم تتم، بسبب أن هذا العنصر سبقت مشاركته سلفاً مع المستخدم %2$s",
+ "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "لا يمكننا أن نرسل لك كلمة المرور التي تم إنشاؤها تلقائيًا. يرجى تعيين عنوان بريد إلكتروني صالح في إعداداتك الشخصية، ثم حاول مرة أخرى.",
+ "Failed to send share by email. Got an invalid email address" : "تعذّر إرسال المشاركة عبر البريد الإلكتروني. حصلت على عنوان بريد إلكتروني غير صالح.",
+ "Failed to send share by email" : "تعذّر إرسال مشاركة بالإيميل",
+ "%1$s shared »%2$s« with you" : "%1$s شارك »%2$s« معك",
+ "%1$s shared »%2$s« with you." : "%1$s شَارَكَ »%2$s« معك.",
+ "Click the button below to open it." : "أنقر على الزر أدناه لفتحه.",
+ "Open »%s«" : "فتح »%s«",
+ "%1$s via %2$s" : "%1$s عبر %2$s",
+ "%1$s shared »%2$s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%1$s شارك »%2$s« معك.\nيفترض أن يصلك أو يكون وصلك بريد الكتروني يحوي رابطاً للوصول إليه.\n",
+ "%1$s shared »%2$s« with you. You should have already received a separate mail with a link to access it." : "%1$s شارك »%2$s« معك. \nيفترض أن يصلك أو يكون وصلك بريد الكتروني يحوي رابطاً للوصول إليه.",
+ "Password to access »%1$s« shared to you by %2$s" : "كلمة مرور للوصول إلى »%1$s« تمّت مُشاركتها معك من قِبَل %2$s",
+ "Password to access »%s«" : "كلمة مرور للوصول إلى »%s«",
+ "It is protected with the following password:" : "إنها محميّة بكلمة المرور التالية:",
+ "This password will expire at %s" : "كلمة المرور هذه ستنتهي صلاحيتها في %s",
+ "%1$s shared »%2$s« with you and wants to add:" : "%1$s شارك »%2$s« معك و يرغب في إضافة:",
+ "%1$s shared »%2$s« with you and wants to add" : "%1$s شارك »%2$s« معك و يرغب في إضافة",
+ "»%s« added a note to a file shared with you" : "»%s« أضافة ملاحظة لملفٍ سلفت مشاركته معك",
+ "You just shared »%1$s« with %2$s. The share was already sent to the recipient. Due to the security policies defined by the administrator of %3$s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "أنت شاركت للتّوِّ »%1$s« مع %2$s. تمّ إرسال المشاركة إلى وجهتها. بسبب السياسة الأمنية الموضوعة من قبل مشرف %3$s كل مشاركة يجب أن تكون محمية بكلمة مرور و التي يجب إلّا يتم إرسالها مباشرة إلى المستخدم المقصود. لذا بجب أن تقوم بتحويلها إليه يدويّاً.",
+ "Password to access »%1$s« shared by you with %2$s" : "كلمة مرور للوصول إلى »%1$s« تمّت مشاركتها مع %2$s",
+ "This is the password:" : "هذه هي كلمة المرور:",
+ "You can choose a different password at any time in the share dialog." : "يمكنك اختيار كلمة مرور مختلفة في أي وقت في نافذة حوار المشاركة share dialog.",
+ "Could not find share" : "تعذّر العثور على المُشاركة",
+ "Share provider which allows you to share files by mail" : "مُزوّد المشاركة share provider الذي مكّنك من المشاركة عبر البريد",
+ "Allows users to share a personalized link to a file or folder by putting in an email address." : "يسمح للمستخدمين بمشاركة ارتباط مخصص لملف أو مجلد عن طريق إدخال عنوان بريد إلكتروني.",
+ "Send password by mail" : "إرسال كلمة مرور بالإيميل",
+ "Reply to initiator" : "ردّ على المُنشيء initiator",
+ "Unable to update share by mail config" : "تعذّر تحديث تهيئة المشاركة بالإيميل",
+ "Shared with %1$s" : "مشاركة مع %1$s",
+ "Shared with %1$s by %2$s" : "مشاركة مع %1$sمن قِبَل %2$s",
+ "Unshared from %1$s" : "إلغاء المشاركة مع %1$s",
+ "Unshared from %1$s by %2$s" : "إلغاء المشاركة مع %1$s من قِبَل%2$s",
+ "Password for mail share sent to %1$s" : "كلمة مرور للمشاركة بالإيميل أُرسلت إلى %1$s",
+ "You shared %1$s with %2$s by mail" : "أنت شاركت %1$s مع %2$s بالإيميل",
+ "%3$s shared %1$s with %2$s by mail" : "%3$s شارك %1$s مع %2$s بالإيميل",
+ "You unshared %1$s from %2$s by mail" : "أنت ألغيت المشاركة %1$s مع %2$s بالإيميل",
+ "%3$s unshared %1$s from %2$s by mail" : "%3$s ألغى المشاركة %1$s مع %2$s بالإيميل",
+ "Password to access %1$s was sent to %2s" : "كلمة مرور للوصول إلى %1$s أُرسلت إلى %2s",
+ "Password to access %1$s was sent to you" : "كلمة مرور للوصول إلى %1$s أُرسلت إليك"
+},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+} \ No newline at end of file
diff --git a/apps/sharebymail/l10n/uk.js b/apps/sharebymail/l10n/uk.js
index 23ca108946a..fc46809a132 100644
--- a/apps/sharebymail/l10n/uk.js
+++ b/apps/sharebymail/l10n/uk.js
@@ -1,14 +1,14 @@
OC.L10N.register(
"sharebymail",
{
- "Shared with {email}" : "Надано доступ для {email} ",
+ "Shared with {email}" : "Надано доступ через {email} ",
"Shared with {email} by {actor}" : "Опубліковано {actor} з {email}",
"Unshared from {email}" : "Скасовано доступ з {email}",
"Unshared from {email} by {actor}" : "{actor} скасував доступ до {email}",
"Password for mail share sent to {email}" : "Пароль для обміну поштою надіслано на адресу {email}",
"Password for mail share sent to you" : "Вам надіслано пароль для обміну поштою",
"You shared {file} with {email} by mail" : "Ви поділилися поштою {file} з {email}",
- "{actor} shared {file} with {email} by mail" : "{actor} надано доступ до файлу {file} на ел.пошту {email}",
+ "{actor} shared {file} with {email} by mail" : "{actor} надав(-ла) доступ до файлу {file} через ел.пошту {email}",
"You unshared {file} from {email} by mail" : "Ви скасували доступ до {file} з {email} поштою",
"{actor} unshared {file} from {email} by mail" : "{actor} скасував доступ до {file} з {email} поштою",
"Password to access {file} was sent to {email}" : "Пароль для доступу до {file} надіслано на адресу {email}",
@@ -29,8 +29,8 @@ OC.L10N.register(
"Password to access »%s«" : "Пароль для доступу \"%s\"",
"It is protected with the following password:" : "Він захищений таким паролем:",
"This password will expire at %s" : "Цей пароль закінчиться о %s",
- "%1$s shared »%2$s« with you and wants to add:" : "%1$s надано доступ до \"%2$s\" та хоче додати:",
- "%1$s shared »%2$s« with you and wants to add" : "%1$s надано доступ до \"%2$s\" та хоче додати",
+ "%1$s shared »%2$s« with you and wants to add:" : "%1$s надав(-ла) доступ до \"%2$s\" та хоче додати:",
+ "%1$s shared »%2$s« with you and wants to add" : "%1$s надав(-ла) доступ до \"%2$s\" та хоче додати",
"»%s« added a note to a file shared with you" : "\"%s\" додано примітку до файлу у спільному доступі",
"You just shared »%1$s« with %2$s. The share was already sent to the recipient. Due to the security policies defined by the administrator of %3$s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Ви щойно надали доступ %2$s до \"%1$s\" . Через політику безпеки, яку визначено адміністратором, кожен спільний ресурс %3$s має бути захищено паролем, а пароль не можна напряму надсилати одержувачу. Будь ласка, надішліть пароль отримувачу вручну.",
"Password to access »%1$s« shared by you with %2$s" : "Пароль для доступу до \"%1$s\", яким ви поділилися з %2$s",
@@ -43,12 +43,12 @@ OC.L10N.register(
"Reply to initiator" : "Відповідь ініціатору",
"Unable to update share by mail config" : "Не вдається оновити конфігурацію спільного доступу за допомогою пошти",
"Shared with %1$s" : "Спільний доступ з %1$s",
- "Shared with %1$s by %2$s" : "%2$sнадано доступ %1$s",
+ "Shared with %1$s by %2$s" : "%2$sнадав(-ла) доступ %1$s",
"Unshared from %1$s" : "Скасовано спільний доступ із %1$s",
"Unshared from %1$s by %2$s" : "Скасовано спільний доступ від користувача%1$s %2$s",
"Password for mail share sent to %1$s" : "Пароль для обміну поштою, надісланий на %1$s",
"You shared %1$s with %2$s by mail" : "Ви поділилися поштою %1$s з %2$s",
- "%3$s shared %1$s with %2$s by mail" : "%3$s надано доступ %2$sдо %1$s через ел.пошту",
+ "%3$s shared %1$s with %2$s by mail" : "%3$s надав(-ла) доступ %2$sдо %1$s через ел.пошту",
"You unshared %1$s from %2$s by mail" : "Ви скасували доступ %1$s до %2$s поштою",
"%3$s unshared %1$s from %2$s by mail" : "%3$s вилучив зі спільного доступу %1$s з %2$s поштою",
"Password to access %1$s was sent to %2s" : "Пароль для доступу %1$s надіслано %2s",
diff --git a/apps/sharebymail/l10n/uk.json b/apps/sharebymail/l10n/uk.json
index 79036e47522..b69284d3e4c 100644
--- a/apps/sharebymail/l10n/uk.json
+++ b/apps/sharebymail/l10n/uk.json
@@ -1,12 +1,12 @@
{ "translations": {
- "Shared with {email}" : "Надано доступ для {email} ",
+ "Shared with {email}" : "Надано доступ через {email} ",
"Shared with {email} by {actor}" : "Опубліковано {actor} з {email}",
"Unshared from {email}" : "Скасовано доступ з {email}",
"Unshared from {email} by {actor}" : "{actor} скасував доступ до {email}",
"Password for mail share sent to {email}" : "Пароль для обміну поштою надіслано на адресу {email}",
"Password for mail share sent to you" : "Вам надіслано пароль для обміну поштою",
"You shared {file} with {email} by mail" : "Ви поділилися поштою {file} з {email}",
- "{actor} shared {file} with {email} by mail" : "{actor} надано доступ до файлу {file} на ел.пошту {email}",
+ "{actor} shared {file} with {email} by mail" : "{actor} надав(-ла) доступ до файлу {file} через ел.пошту {email}",
"You unshared {file} from {email} by mail" : "Ви скасували доступ до {file} з {email} поштою",
"{actor} unshared {file} from {email} by mail" : "{actor} скасував доступ до {file} з {email} поштою",
"Password to access {file} was sent to {email}" : "Пароль для доступу до {file} надіслано на адресу {email}",
@@ -27,8 +27,8 @@
"Password to access »%s«" : "Пароль для доступу \"%s\"",
"It is protected with the following password:" : "Він захищений таким паролем:",
"This password will expire at %s" : "Цей пароль закінчиться о %s",
- "%1$s shared »%2$s« with you and wants to add:" : "%1$s надано доступ до \"%2$s\" та хоче додати:",
- "%1$s shared »%2$s« with you and wants to add" : "%1$s надано доступ до \"%2$s\" та хоче додати",
+ "%1$s shared »%2$s« with you and wants to add:" : "%1$s надав(-ла) доступ до \"%2$s\" та хоче додати:",
+ "%1$s shared »%2$s« with you and wants to add" : "%1$s надав(-ла) доступ до \"%2$s\" та хоче додати",
"»%s« added a note to a file shared with you" : "\"%s\" додано примітку до файлу у спільному доступі",
"You just shared »%1$s« with %2$s. The share was already sent to the recipient. Due to the security policies defined by the administrator of %3$s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Ви щойно надали доступ %2$s до \"%1$s\" . Через політику безпеки, яку визначено адміністратором, кожен спільний ресурс %3$s має бути захищено паролем, а пароль не можна напряму надсилати одержувачу. Будь ласка, надішліть пароль отримувачу вручну.",
"Password to access »%1$s« shared by you with %2$s" : "Пароль для доступу до \"%1$s\", яким ви поділилися з %2$s",
@@ -41,12 +41,12 @@
"Reply to initiator" : "Відповідь ініціатору",
"Unable to update share by mail config" : "Не вдається оновити конфігурацію спільного доступу за допомогою пошти",
"Shared with %1$s" : "Спільний доступ з %1$s",
- "Shared with %1$s by %2$s" : "%2$sнадано доступ %1$s",
+ "Shared with %1$s by %2$s" : "%2$sнадав(-ла) доступ %1$s",
"Unshared from %1$s" : "Скасовано спільний доступ із %1$s",
"Unshared from %1$s by %2$s" : "Скасовано спільний доступ від користувача%1$s %2$s",
"Password for mail share sent to %1$s" : "Пароль для обміну поштою, надісланий на %1$s",
"You shared %1$s with %2$s by mail" : "Ви поділилися поштою %1$s з %2$s",
- "%3$s shared %1$s with %2$s by mail" : "%3$s надано доступ %2$sдо %1$s через ел.пошту",
+ "%3$s shared %1$s with %2$s by mail" : "%3$s надав(-ла) доступ %2$sдо %1$s через ел.пошту",
"You unshared %1$s from %2$s by mail" : "Ви скасували доступ %1$s до %2$s поштою",
"%3$s unshared %1$s from %2$s by mail" : "%3$s вилучив зі спільного доступу %1$s з %2$s поштою",
"Password to access %1$s was sent to %2s" : "Пароль для доступу %1$s надіслано %2s",
diff --git a/apps/systemtags/composer/composer/ClassLoader.php b/apps/systemtags/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/systemtags/composer/composer/ClassLoader.php
+++ b/apps/systemtags/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/systemtags/composer/composer/installed.php b/apps/systemtags/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/systemtags/composer/composer/installed.php
+++ b/apps/systemtags/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/testing/composer/composer/ClassLoader.php b/apps/testing/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/testing/composer/composer/ClassLoader.php
+++ b/apps/testing/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/testing/composer/composer/installed.php b/apps/testing/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/testing/composer/composer/installed.php
+++ b/apps/testing/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/theming/composer/composer/ClassLoader.php b/apps/theming/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/theming/composer/composer/ClassLoader.php
+++ b/apps/theming/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/theming/composer/composer/installed.php b/apps/theming/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/theming/composer/composer/installed.php
+++ b/apps/theming/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/theming/lib/Capabilities.php b/apps/theming/lib/Capabilities.php
index 10828619e60..5c063715f43 100644
--- a/apps/theming/lib/Capabilities.php
+++ b/apps/theming/lib/Capabilities.php
@@ -64,8 +64,6 @@ class Capabilities implements IPublicCapability {
/**
* Return this classes capabilities
- *
- * @return array
*/
public function getCapabilities() {
$backgroundLogo = $this->config->getAppValue('theming', 'backgroundMime', '');
diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php
index 454e0505543..7de87389f18 100644
--- a/apps/theming/lib/ThemingDefaults.php
+++ b/apps/theming/lib/ThemingDefaults.php
@@ -71,6 +71,7 @@ class ThemingDefaults extends \OC_Defaults {
private string $productName;
private string $url;
private string $color;
+ private string $docBaseUrl;
private string $iTunesAppId;
private string $iOSClientUrl;
@@ -120,6 +121,7 @@ class ThemingDefaults extends \OC_Defaults {
$this->iOSClientUrl = parent::getiOSClientUrl();
$this->AndroidClientUrl = parent::getAndroidClientUrl();
$this->FDroidClientUrl = parent::getFDroidClientUrl();
+ $this->docBaseUrl = parent::getDocBaseUrl();
}
public function getName() {
@@ -163,6 +165,10 @@ class ThemingDefaults extends \OC_Defaults {
return (string)$this->config->getAppValue('theming', 'privacyUrl', '');
}
+ public function getDocBaseUrl() {
+ return (string)$this->config->getAppValue('theming', 'docBaseUrl', $this->docBaseUrl);
+ }
+
public function getShortFooter() {
$slogan = $this->getSlogan();
$baseUrl = $this->getBaseUrl();
diff --git a/apps/twofactor_backupcodes/composer/composer/ClassLoader.php b/apps/twofactor_backupcodes/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/twofactor_backupcodes/composer/composer/ClassLoader.php
+++ b/apps/twofactor_backupcodes/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/twofactor_backupcodes/composer/composer/installed.php b/apps/twofactor_backupcodes/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/twofactor_backupcodes/composer/composer/installed.php
+++ b/apps/twofactor_backupcodes/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/updatenotification/composer/composer/ClassLoader.php b/apps/updatenotification/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/updatenotification/composer/composer/ClassLoader.php
+++ b/apps/updatenotification/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/updatenotification/composer/composer/installed.php b/apps/updatenotification/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/updatenotification/composer/composer/installed.php
+++ b/apps/updatenotification/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/updatenotification/l10n/sl.js b/apps/updatenotification/l10n/sl.js
index 98888c02d2a..b14b9d8e11b 100644
--- a/apps/updatenotification/l10n/sl.js
+++ b/apps/updatenotification/l10n/sl.js
@@ -8,6 +8,7 @@ OC.L10N.register(
"The update server could not be reached since %d days to check for new updates." : "Vzpostavitev povezave s strežnikom za posodobitve ni mogoče že %d dni.",
"Please check the Nextcloud and server log files for errors." : "Preverite strežniške in sistemske dnevnike za napake.",
"Update to %1$s is available." : "Na voljo je posodobitev na %1$s.",
+ "Update to {serverAndVersion} is available." : "Na voljo je posodobitev za {serverAndVersion}.",
"Update for {app} to version %s is available." : "Na voljo je posodobitev programa {app} na različico %s.",
"Update notification" : "Obvestilo o posodobitvi",
"Displays update notifications for Nextcloud and provides the SSO for the updater." : "Pokaže obvestila o posodobitvah okolja Nextcloud in omogoča prijavo SSO za posodabljalnik.",
@@ -16,6 +17,7 @@ OC.L10N.register(
"Apps missing compatible version" : "Programi brez podprte različice",
"View in store" : "Pokaži v trgovini",
"Apps with compatible version" : "Programi s podprto različico",
+ "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Upoštevajte, da spletna posodobitev ni priporočljiva, če okolje uporablja več kot 100 uporabnikov! V takih primerih je ustreznejši posodabljalnik zagnan iz ukazne vrstice.",
"Open updater" : "Odpri posodabljalnik",
"Download now" : "Prejmi takoj",
"Please use the command line updater to update." : "Za posodabljanje uporabite možnosti prek ukazne vrstice.",
@@ -27,6 +29,7 @@ OC.L10N.register(
"Update channel:" : "Posodobi kanal:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Nadgradnja na višjo različico je vedno mogoča, ne pa tudi povrnitev na predhodno, bolj stabilno.",
"Notify members of the following groups about available updates:" : "Člani navedenih skupin, ki so obveščeni o posodobitvah:",
+ "No groups" : "Ni skupin",
"Only notifications for app updates are available." : "Na voljo so le obvestila za posodobitve programov.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Izbran kanal za posodobitve onemogoča obvestila s strežnika.",
"The selected update channel does not support updates of the server." : "Izbran kanal za posodobitve ne omogoča posodobitev stražnika.",
@@ -35,6 +38,8 @@ OC.L10N.register(
"Checked on {lastCheckedDate}" : "Nazadnje preverjeno {lastCheckedDate}",
"Checking apps for compatible versions" : "Preverjanje skladnih posodobitev različic programov",
"Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Prepričajte se, da v datoteki config.php možnost <samp>appstoreenabled</samp> ni nastavljena na vrednost napak – false.",
+ "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Povezava s trgovino programov ni na voljo, ali pa ni nobene posodobitve. Posodobitve je mogoče iskati ročno, preveriti pa je treba tudi povezljivost programa s strežnikom posodobitev.",
+ "<strong>All</strong> apps have a compatible version for this Nextcloud version available." : "<strong>Vsi</strong> programi imajo izdano skladno različico za trenutno nameščen oblak Nextcloud.",
"View changelog" : "Ogled Dnevnika sprememb",
"Enterprise" : "Poslovno",
"For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package." : "Za poslovno uporabo. Na voljo so najnovejši popravki programov in manjše posodobitve, ne pa tudi takojšnja nadgradnja sistema na naslednjo večjo različico. Ta posodobitev je na voljo šele po daljšem in podrobnejšem preizkušanju sistema. Ta kanal je na voljo le naročnikom, ki uporabljajo paket Nextcloud Enterprise.",
@@ -42,7 +47,7 @@ OC.L10N.register(
"The most recent stable version. It is suited for regular use and will always update to the latest major version." : "Najnovejša stabilna različica je primerna za običajno rabo in bo vedno posodobljena na zadnjo najvišjo različico.",
"Beta" : "Preizkusno",
"A pre-release version only for testing new features, not for production environments." : "Preizkusna različica je namenjena preizkušanju novih zmožnosti in ni primerna za produkcijska okolja.",
- "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["1%n1 nameščen program nima skladne različice z nameščeno različico oblaka Nextcloud.","1%n1 nameščena programa nimata skladne različice z nameščeno različico oblaka Nextcloud.","1%n1 nameščeni programi nimajo skladne različice z nameščeno različico oblaka Nextcloud.","<strong>%n</strong> nameščenih programov nima skladne različice z nameščeno različico oblaka Nextcloud."],
+ "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> nameščen program nima skladne različice s trenutno različico oblaka Nextcloud.","<strong>%n</strong> nameščena programa nimata skladne različice s trenutno različico oblaka Nextcloud.","<strong>%n</strong> nameščeni programi nimajo skladne različice s trenutno različico oblaka Nextcloud.","<strong>%n</strong> nameščenih programov nima skladne različice s trenutno različico oblaka Nextcloud."],
"Update for %1$s to version %2$s is available." : "Na voljo je posodobitev %1$s na različico %2$s."
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/updatenotification/l10n/sl.json b/apps/updatenotification/l10n/sl.json
index fd931576a19..ee744c7b724 100644
--- a/apps/updatenotification/l10n/sl.json
+++ b/apps/updatenotification/l10n/sl.json
@@ -6,6 +6,7 @@
"The update server could not be reached since %d days to check for new updates." : "Vzpostavitev povezave s strežnikom za posodobitve ni mogoče že %d dni.",
"Please check the Nextcloud and server log files for errors." : "Preverite strežniške in sistemske dnevnike za napake.",
"Update to %1$s is available." : "Na voljo je posodobitev na %1$s.",
+ "Update to {serverAndVersion} is available." : "Na voljo je posodobitev za {serverAndVersion}.",
"Update for {app} to version %s is available." : "Na voljo je posodobitev programa {app} na različico %s.",
"Update notification" : "Obvestilo o posodobitvi",
"Displays update notifications for Nextcloud and provides the SSO for the updater." : "Pokaže obvestila o posodobitvah okolja Nextcloud in omogoča prijavo SSO za posodabljalnik.",
@@ -14,6 +15,7 @@
"Apps missing compatible version" : "Programi brez podprte različice",
"View in store" : "Pokaži v trgovini",
"Apps with compatible version" : "Programi s podprto različico",
+ "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Upoštevajte, da spletna posodobitev ni priporočljiva, če okolje uporablja več kot 100 uporabnikov! V takih primerih je ustreznejši posodabljalnik zagnan iz ukazne vrstice.",
"Open updater" : "Odpri posodabljalnik",
"Download now" : "Prejmi takoj",
"Please use the command line updater to update." : "Za posodabljanje uporabite možnosti prek ukazne vrstice.",
@@ -25,6 +27,7 @@
"Update channel:" : "Posodobi kanal:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Nadgradnja na višjo različico je vedno mogoča, ne pa tudi povrnitev na predhodno, bolj stabilno.",
"Notify members of the following groups about available updates:" : "Člani navedenih skupin, ki so obveščeni o posodobitvah:",
+ "No groups" : "Ni skupin",
"Only notifications for app updates are available." : "Na voljo so le obvestila za posodobitve programov.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Izbran kanal za posodobitve onemogoča obvestila s strežnika.",
"The selected update channel does not support updates of the server." : "Izbran kanal za posodobitve ne omogoča posodobitev stražnika.",
@@ -33,6 +36,8 @@
"Checked on {lastCheckedDate}" : "Nazadnje preverjeno {lastCheckedDate}",
"Checking apps for compatible versions" : "Preverjanje skladnih posodobitev različic programov",
"Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Prepričajte se, da v datoteki config.php možnost <samp>appstoreenabled</samp> ni nastavljena na vrednost napak – false.",
+ "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Povezava s trgovino programov ni na voljo, ali pa ni nobene posodobitve. Posodobitve je mogoče iskati ročno, preveriti pa je treba tudi povezljivost programa s strežnikom posodobitev.",
+ "<strong>All</strong> apps have a compatible version for this Nextcloud version available." : "<strong>Vsi</strong> programi imajo izdano skladno različico za trenutno nameščen oblak Nextcloud.",
"View changelog" : "Ogled Dnevnika sprememb",
"Enterprise" : "Poslovno",
"For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package." : "Za poslovno uporabo. Na voljo so najnovejši popravki programov in manjše posodobitve, ne pa tudi takojšnja nadgradnja sistema na naslednjo večjo različico. Ta posodobitev je na voljo šele po daljšem in podrobnejšem preizkušanju sistema. Ta kanal je na voljo le naročnikom, ki uporabljajo paket Nextcloud Enterprise.",
@@ -40,7 +45,7 @@
"The most recent stable version. It is suited for regular use and will always update to the latest major version." : "Najnovejša stabilna različica je primerna za običajno rabo in bo vedno posodobljena na zadnjo najvišjo različico.",
"Beta" : "Preizkusno",
"A pre-release version only for testing new features, not for production environments." : "Preizkusna različica je namenjena preizkušanju novih zmožnosti in ni primerna za produkcijska okolja.",
- "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["1%n1 nameščen program nima skladne različice z nameščeno različico oblaka Nextcloud.","1%n1 nameščena programa nimata skladne različice z nameščeno različico oblaka Nextcloud.","1%n1 nameščeni programi nimajo skladne različice z nameščeno različico oblaka Nextcloud.","<strong>%n</strong> nameščenih programov nima skladne različice z nameščeno različico oblaka Nextcloud."],
+ "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> nameščen program nima skladne različice s trenutno različico oblaka Nextcloud.","<strong>%n</strong> nameščena programa nimata skladne različice s trenutno različico oblaka Nextcloud.","<strong>%n</strong> nameščeni programi nimajo skladne različice s trenutno različico oblaka Nextcloud.","<strong>%n</strong> nameščenih programov nima skladne različice s trenutno različico oblaka Nextcloud."],
"Update for %1$s to version %2$s is available." : "Na voljo je posodobitev %1$s na različico %2$s."
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/user_ldap/composer/composer/ClassLoader.php b/apps/user_ldap/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/user_ldap/composer/composer/ClassLoader.php
+++ b/apps/user_ldap/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/user_ldap/composer/composer/installed.php b/apps/user_ldap/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/user_ldap/composer/composer/installed.php
+++ b/apps/user_ldap/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/user_ldap/js/wizard/wizardTabAdvanced.js b/apps/user_ldap/js/wizard/wizardTabAdvanced.js
index a438b847401..3b251897968 100644
--- a/apps/user_ldap/js/wizard/wizardTabAdvanced.js
+++ b/apps/user_ldap/js/wizard/wizardTabAdvanced.js
@@ -67,6 +67,10 @@ OCA = OCA || {};
$element: $('#ldap_attributes_for_user_search'),
setMethod: 'setSearchAttributesUsers'
},
+ ldap_mark_remnants_as_disabled: {
+ $element: $('#ldap_mark_remnants_as_disabled'),
+ setMethod: 'setMarkRemnantsAsDisabled'
+ },
ldap_group_display_name: {
$element: $('#ldap_group_display_name'),
setMethod: 'setGroupDisplayName'
@@ -276,6 +280,15 @@ OCA = OCA || {};
},
/**
+ * enables or disables marking remnants as disabled
+ *
+ * @param {string} markRemnantsAsDisabled contains an int
+ */
+ setMarkRemnantsAsDisabled: function(markRemnantsAsDisabled) {
+ this.setElementValue(this.managedItems.ldap_mark_remnants_as_disabled.$element, markRemnantsAsDisabled);
+ },
+
+ /**
* sets the display name attribute for groups
*
* @param {string} attribute
diff --git a/apps/user_ldap/l10n/ar.js b/apps/user_ldap/l10n/ar.js
index 7c85725466a..0e622792465 100644
--- a/apps/user_ldap/l10n/ar.js
+++ b/apps/user_ldap/l10n/ar.js
@@ -1,114 +1,190 @@
OC.L10N.register(
"user_ldap",
{
- "Failed to clear the mappings." : "فشل مسح الارتباطات (mappings)",
- "Failed to delete the server configuration" : "تعذر حذف ملف إعدادات الخادم",
- "No action specified" : "لم يتم تحديد الإجراء",
- "No configuration specified" : "لم يتم تحديد الإعدادات.",
- "No data specified" : "لم يتم تحديد البيانات.",
- " Could not set configuration %s" : "تعذر تنفيذ الإعداد %s",
+ "Failed to clear the mappings." : "فشل مسح الارتباطات mappings",
+ "Failed to delete the server configuration" : "تعذّر حذف ملف إعدادات الخادوم",
+ "Invalid configuration: Anonymous binding is not allowed." : "تكوين غير صالح: الربط المجهول Anonymous binding غير مسموح به.",
+ "Valid configuration, connection established!" : "تكوين صالح، تمّ تأسيس الاتصال!",
+ "Valid configuration, but binding failed. Please check the server settings and credentials." : "تكوين صالح، لكن فشل الربط binding. يرجى التحقّق من إعدادات الخادوم و حيثيّات الدخول credentials.",
+ "Invalid configuration. Please have a look at the logs for further details." : "تكوين غير صحيح. يرجى الرجوع إلي سجلات الحركات logs لمزيد من التفاصيل.",
+ "No action specified" : "لم يتم تحديد أيّ إجراءٍ",
+ "No configuration specified" : "لم يتم تحديد أيّ إعداداتٍ",
+ "No data specified" : "لم يتم تحديد أيّ بياناتٍ",
+ "Invalid data specified" : "البيانات المُحدّدة غير صالحة",
+ " Could not set configuration %s" : "تعذّر تعيين الإعداد %s",
"Action does not exist" : "الإجراء غير موجود",
- "Very weak password" : "كلمة السر ضعيفة جدا",
- "Weak password" : "الكلمة السرية ضعيفة",
- "So-so password" : "كلمة سر غير فعالة",
- "Good password" : "الكلمة السرية جيدة",
- "Strong password" : "الكلمة السرية قوية",
- "The Base DN appears to be wrong" : "يبدو أن الاسم المميز الأساسي Base DN خاطئًا",
- "Testing configuration…" : "اختبار التهيئة...",
+ "Renewing …" : "جارٍ التجديد…",
+ "Very weak password" : "كلمة مرور ضعيفة جدا",
+ "Weak password" : "كلمة مرور ضعيفة",
+ "So-so password" : "كلمة مرور مقبولة نوعاً ما",
+ "Good password" : "كلمة مرور جيدة",
+ "Strong password" : "كلمة مرور قوية",
+ "The Base DN appears to be wrong" : "يبدو أن الاسم المميز الأساسي Base DN خاطئٌ",
+ "Testing configuration…" : "إختبار التهيئة...",
"Configuration incorrect" : "الإعدادات غير صحيحة",
"Configuration incomplete" : "الإعدادات غير مكتملة",
"Configuration OK" : "الإعدادات صحيحة",
- "Select groups" : "إختر مجموعة",
- "Select object classes" : "اختر أصناف المكونات",
- "Please specify the port, it could not be auto-detected." : "رجاء تحديد المنفذ، حيث لا يمكن اكتشافه تلقائيا.",
- "Base DN could not be auto-detected, please revise credentials, host and port." : "تعذر اكتشاف الاسم المميز الأساسي تلقائيًا، يرجى مراجعة بيانات الاعتماد والمضيف والمنفذ.",
- "Could not detect Base DN, please enter it manually." : "تعذر اكتشاف الاسم المميز الأساسي، يرجى إدخاله يدويًا.",
- "{nthServer}. Server" : "الخادم {nthServer}.",
- "No object found in the given Base DN. Please revise." : "لم يتم العثور على كائن في الاسم المميز الأساسي المحدد. يرجي التعديل.",
- "More than 1,000 directory entries available." : "أكثر من 1,000 دليل مدخلات الدليل متاحة.",
- "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.",
- "Do you really want to delete the current Server Configuration?" : "هل ترغب فعلاً في حذف إعدادات الخادم الحالي؟",
+ "Select groups" : "إختر المجموعات",
+ "Select object classes" : "إختر أصناف الكائنات object classes",
+ "Please check the credentials, they seem to be wrong." : "يرجى التحقق من حيثيّات الدخول credentials، يبدو أنها خاطئة.",
+ "Please specify the port, it could not be auto-detected." : "يُرجى تحديد المنفذ port، حيث لا يمكن اكتشافه تلقائيا.",
+ "Base DN could not be auto-detected, please revise credentials, host and port." : "تعذر اكتشاف الاسم المميز الأساسي Base DN تلقائيًا، يرجى مراجعة حيثيّات الدخول credentials، والمُضيف host، والمنفذ port.",
+ "Could not detect Base DN, please enter it manually." : "تعذّر اكتشاف الاسم المميز الأساسي Base DN، يُرجى إدخاله يدويًا.",
+ "{nthServer}. Server" : "{nthServer}. الخادوم",
+ "No object found in the given Base DN. Please revise." : "لم يتم العثور على أي كائن object في الاسم المميز الأساسي Base DN المحدد. يُرجي المُراجعة.",
+ "More than 1,000 directory entries available." : "يُوجد أكثر من 1,000 مُدخل في الدليل directory entries.",
+ "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "حدث خطأ. يرجي التحقق من الاسم المميز الأساسي Base DN، وكذلك إعدادات الاتصال، و حيثيّات الدخول credentials.",
+ "Do you really want to delete the current Server Configuration?" : "هل ترغب فعلاً في حذف إعدادات الخادوم الحالي؟",
"Confirm Deletion" : "تأكيد الحذف",
- "Mappings cleared successfully!" : "تم مسح التعيينات بنجاح!",
- "Error while clearing the mappings." : "خطأ أثناء مسح التعيينات.",
- "Anonymous bind is not allowed. Please provide a User DN and Password." : "الربط المجهول غير مسموح به. يرجى تقديم الاسم المميز للمستخدم وكلمة مرور.",
- "LDAP Operations error. Anonymous bind might not be allowed." : "خطأ في عمليات بروتوكول الوصول إلي الدليل البسيط. قد لا يكون مسموح بالربط المجهول.",
+ "Mappings cleared successfully!" : "تم مسح التعيينات mappings بنجاح!",
+ "Error while clearing the mappings." : "خطأ أثناء مسح التعيينات mappings.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "الربط المجهول Anonymous bind غير مسموح به. يرجى إدخال الاسم المميز للمستخدم User DN، وكلمة المرور.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "خطأ في عمليات LDAP. قد لا يكون مسموحاُ بالربط المجهول Anonymous bind.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "فشل الحفظ. يرجى التأكد من أن قاعدة البيانات قيد التشغيل. أعد التحميل قبل المتابعة.",
+ "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?" : "تفعيل الوضع سوف ينتج عنه تمكين استعلامات بروتوكول الوصول إلي الدليل البسيط التلقائية. وقد يستغرق الأمر بعض الوقت بناء على حجم بروتوكول الوصول إلي الدليل البسيط الخاص بك. هل ما زلت تريد تفعيل الوضع؟",
+ "Mode switch" : "تشغيل النمط",
"Select attributes" : "اختر الخصائص",
+ "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "لم يتم العثور على المستخدم. يرجى التحقق من تحديدات تسجيل الدخول واسم المستخدم الخاصين بك. عامل التصفية الفعال (للنسخ واللصق للتحقق من صحة سطر الأوامر):<br/>",
"User found and settings verified." : "تم العثور على المستخدم وتم التحقق من الإعدادات.",
- "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "عامل تصفية البحث غير صالح، ربما بسبب مشكلات في بناء الجملة مثل عدم تساو عدد الأقواس المفتوحة والمغلقة. يرجي المراجعة.",
- "Please provide a login name to test against" : "يرجى تقديم اسم تسجيل الدخول للاختبار وفقا له",
- "Could not find the desired feature" : "تعذر العثور على السمة المطلوبة",
+ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "ضع في اعتبارك تضييق نطاق البحث، لأنه يشمل العديد من المستخدمين، ولن يتمكن سوى أول واحد منهم من تسجيل الدخول.",
+ "An unspecified error occurred. Please check log and settings." : "حدث خطأ غير محدد. يرجى التحقق من السجل والإعدادات.",
+ "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "فلتر البحث غير صالح؛ ربما بسبب مشكلات في بناء الجملة مثل عدم تساوي عدد الأقواس المفتوحة والمغلقة. يرجي المراجعة.",
+ "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "حدث خطأ في الاتصال بـ LDAP / AD. يرجى التحقق من المضيف host، والمنفذ port، و حيثيّات الدخول credentials.",
+ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "العنصر النائب placeholder ـ \"%u مُعرّف\". سيتم استبداله باسم دخول عند الاستعلام من LDAP/AD.",
+ "Please provide a login name to test against" : "يرجى تقديم اسم تسجيل الدخول لاختباره",
+ "The group box was disabled, because the LDAP/AD server does not support memberOf." : "تم تعطيل مربع المجموعة؛ لأن خادوم LDAP / AD لا يدعم خاصّيّة memberOf.",
+ "Password change rejected. Hint: " : "تمّ رفض تغيير كلمة المرور. إرشادُ:",
+ "Please login with the new password" : "الرجاء تسجيل الدخول باستخدام كلمة المرور الجديدة",
+ "LDAP User backend" : "خلفية المستخدمين User backend من LDAP ",
+ "Your password will expire tomorrow." : "كلمة مرورك تنتهي صلاحيتها غداً.",
+ "Your password will expire today." : "كلمة مرورك تنتهي صلاحيتها اليوم.",
+ "LDAP/AD integration" : "مُكاملة LDAP/AD ",
+ "> 1000 groups found" : "> 1000 مجموعة موجودة",
+ "> 1000 users found" : "> 1000 مستخدِم موجود",
+ "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "تعذر اكتشاف سمة الاسم المعروض للمستخدم user display name attribute. يرجى تحديده بنفسك في الإعدادات المتقدمة لخادوم.",
+ "Could not find the desired feature" : "تعذر العثور على الخاصّيّة المرغوبة",
"Invalid Host" : "مضيف غير صالح",
+ "LDAP user and group backend" : "خلفية المستخدمين و المجموعات من LDAP",
+ "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "يتيح هذا التطبيق للمشرفين توصيل نكست كلاود بدليل المستخدمين المستند إلى LDAP.",
+ "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "يتيح هذا التطبيق للمشرفين توصيل نكست كلاود بدليل المستخدمين المستنِد إلى LDAP للمصادقة و توفير المستخدمين users، والمجموعات groups، و سمات المستخدمين user attributes. \nيمكن للمشرفين تكوين هذا التطبيق للاتصال بدليل LDAP واحد أو أكثر عبر واجهة LDAP. \nيمكن سحب سماتٍ مثل حصة المستخدم التخزينية، و البريد الإلكتروني، و التجسيدات الرمزية avatar، وعضوية المجموعات و غيرها إلى نكست كلاود باستخدام الاستعلامات والمرشحات المناسبة. \nيقوم المستخدم بتسجيل الدخول إلى نكست كلاود باستخدام حيثيات دخوله من LDAP أو AD، ويتم منحه حق الوصول بناءً على طلب المصادقة الذي تتم معالجته بواسطة خادوم LDAP أو AD. \nلا يقوم نكست كلاود بتخزين كلمات مرور LDAP أو AD، بل يستخدم حيثيّات المستخدم هذه للمصادقة ثم يستخدم مُعرّف الجلسة session كمُعرّف للمستخدم. \n\nيتوفر المزيد من المعلومات في وثائق مستخدم LDAP و Group Backend.",
"Test Configuration" : "اختبر التكوين",
- "Help" : "المساعدة",
+ "Help" : "مساعدة",
"Groups meeting these criteria are available in %s:" : "المجموعات التي تلبي هذه المعايير متوفرة في %s:",
"Only these object classes:" : "فئات هذه الكائنات فقط:",
"Only from these groups:" : "فقط من هذه المجموعات:",
"Search groups" : "مجموعات البحث",
+ "Available groups" : "المجموعات المتاحة",
"Selected groups" : "المجموعات المختارة",
- "Edit LDAP Query" : "تحرير استعلام بروتوكول الوصول إلي الدليل البسيط ",
- "LDAP Filter:" : "عامل تصفية بروتوكول الوصول إلي الدليل البسيط:",
+ "Edit LDAP Query" : "تحرير استعلام لبروتوكول LDAP",
+ "LDAP Filter:" : "فلتر بروتوكولLDAP:",
+ "The filter specifies which LDAP groups shall have access to the %s instance." : "يحدد الفلتر أي مجموعات من LDAP سوف يكون لها حق الوصول إلى التطبيق %s.",
+ "Verify settings and count the groups" : "تحقق من الإعدادات و عدد المجموعات",
"When logging in, %s will find the user based on the following attributes:" : "عند تسجيل الدخول، %sسوف تجد المستخدم بناءً على السمات التالية:",
- "Other Attributes:" : "الخصائص الأخري:",
+ "LDAP/AD Username:" : "اسم مستخدم LDAP/AD ـ : ",
+ "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "يسمح بتسجيل الدخول مقابل اسم مستخدم LDAP / AD ، والذي يكون إما \"uid\" أو \"sAMAccountName\" وسيتم اكتشافه.",
+ "LDAP/AD Email Address:" : "عنوان البريد الالكتروني LDAP/AD ـ :",
+ "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "يسمح بتسجيل الدخول مقابل سمة البريد الإلكتروني. \"mail\" و \"mailPrimaryAddress\" مسموح بهما.",
+ "Other Attributes:" : "خصائص أخري:",
+ "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "حدد الفلتر الذي سيتم تطبيقه، عند محاولة تسجيل الدخول. يحل \"%%uid\" محل اسم المستخدم في إجراء تسجيل الدخول. مثال: \"uid=%%uid\"",
"Test Loginname" : "اختبار اسم تسجيل الدخول",
- "Verify settings" : "تحديد الإعدادات",
- "%s. Server:" : "%s. خادم:",
+ "Attempts to receive a DN for the given loginname and the current login filter" : "محاولات لتلقّي الاسم الممير DN لاسم تسجيل الدخول المحدد و فلتر تسجيل الدخول الحالي",
+ "Verify settings" : "التحقُّق من الإعدادات",
+ "%s. Server:" : "%s. خادوم:",
+ "Add a new configuration" : "إضافة تهيئة جديدة",
"Copy current configuration into new directory binding" : "نسخ التهيئة الحالية إلى دليل جديد مرتبط",
"Delete the current configuration" : "حذف التهيئة الحالية",
"Host" : "المضيف",
+ "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "يمكنك التغاضي عن البروتوكول، ما لم يكن SSL لازماً. إذا كان الأمر كذلك، فابدأ بـ ldaps",
"Port" : "المنفذ",
- "User DN" : "الاسم المميز للمستخدم",
- "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "الاسم المميز للعميل المستخدم الذي يجب ربطه به، على سبيل المثال uid = العميل، dc = مثال، dc = com. للوصول مجهول الهوية، اترك خانتي الاسم المميز وكلمة المرور فارغتين.",
+ "Detect Port" : "إكتشِف المنفذ",
+ "User DN" : "الاسم المميز للمستخدم DN",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "الاسم المميز للعميل المستخدم DN الذي يجب الربط معه. على سبيل المثال، uid=agent,dc=example,dc=com. للوصول مجهول الهوية anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.",
"Password" : "كلمة المرور",
- "For anonymous access, leave DN and Password empty." : "للوصول المجهول، اترك حقل الاسم المميز وكلمة المرور فارغين.",
- "You can specify Base DN for users and groups in the Advanced tab" : "يمكنك تحديد اسم مميز أساسي Base DN للمستخدمين والمجموعات من علامة تبويب الإعدادات المتقدمة",
- "Test Base DN" : "اختبر الاسم المميز الأساسي Base DN",
- "Manually enter LDAP filters (recommended for large directories)" : "إدخال عوامل تصفية بروتوكول الوصول إلي الدليل البسيط يدويًا (موصى به للأدلة الكبيرة)",
- "The filter specifies which LDAP users shall have access to the %s instance." : "يحدد عامل التصفية مستخدمي بروتوكول الوصول إلي الدليل البسيط الذين يمكنهم الوصول إلى %sالنموذج.",
- "Saving" : "جاري الحفظ ...",
+ "For anonymous access, leave DN and Password empty." : "للوصول المجهول anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.",
+ "Save Credentials" : "حفظ حيثيّات الدخول credentials",
+ "One Base DN per line" : "اسم مميز واحد أساسي Base DN لكل سطر",
+ "You can specify Base DN for users and groups in the Advanced tab" : "يمكنك تحديد الاسم المميز الأساسي Base DN للمستخدمين والمجموعات من علامة تبويب الإعدادات المتقدمة",
+ "Detect Base DN" : "اكتشاف الاسم المميز الأساسي Base DN",
+ "Test Base DN" : "إختبر الاسم المميز الأساسي Base DN",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "يُلغي طلبات LDAP التلقائية. يُفضّل استعماله في حالة الخوادم التي تخدم أعداداً كبيرة، ولكنه يتطلب بعض المعرفة فيما يخص بروتوكول LDAP.",
+ "Manually enter LDAP filters (recommended for large directories)" : "الإدخال اليدوي لفلاتر بروتوكول LDAP (يُنصح به في حالة الأدلة الكبيرة)",
+ "Listing and searching for users is constrained by these criteria:" : "العرض والبحث عن المستخدمين مُقيّدٌ بهذه الشروط:",
+ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "أكثر فئات الكائنات شيوعًا بالنسبة بالنسبة للمستخدمين هي: organizationalPerson, person, user, and inetOrgPerson. إذا لم تكن متأكدًا من فئة الكائن التي تريد تحديدها، فيرجى استشارة مشرف خادوم الـ LDAP.",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "يُحدِّد الفلتر أيّ مستخدمي LDAP يمكنه الوصول إلى الخادوم %s.",
+ "Verify settings and count users" : "التحقق من الإعدادات وعدد المستخدمين",
+ "Saving" : "الحفظ جارٍ ...",
"Back" : "رجوع",
- "Continue" : "المتابعة",
- "An internal error occurred." : "طرأ هناك خطأ.",
- "Please try again or contact your administrator." : "حاول مجددا أو تواصل مع مسؤول النظام.",
- "Current password" : "الكلمة السرية الحالية",
- "New password" : "الكلمة السرية الجديدة",
- "Wrong password." : "الكلمة السرية خاطئة.",
+ "Continue" : "مُتابعة",
+ "Please renew your password." : "الرجاء تجديد كلمة مرورك.",
+ "An internal error occurred." : "حدث خطأ داخلي.",
+ "Please try again or contact your administrator." : "حاول مجددا أو تواصل مع مشرف النظام.",
+ "Current password" : "كلمة المرور الحالية",
+ "New password" : "كلمة المرور الجديدة",
+ "Renew password" : "تجديد كلمة المرور",
+ "Wrong password." : "كلمة مرور خاطئة.",
"Cancel" : "إلغاء",
- "Server" : "خادم",
+ "Server" : "خادوم",
"Users" : "المستخدمين",
- "Login Attributes" : "تحديدات تسجيل الدخول",
+ "Login Attributes" : "سمات تسجيل الدخول",
"Groups" : "مجموعات",
"Expert" : "خبير",
- "Advanced" : "تعديلات متقدمه",
- "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>تحذير:</b> الوحدة النمطية لخادم الارتباط التشعبي لبروتوكول الوصول إلي الدليل البسيط غير مثبتة ، والخلفية لن تعمل الواجهة. يرجى طلب تثبيتها من قبل مسؤول النظام.",
+ "Advanced" : "متقدمة",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>تحذير:</b> وِحدة PHP LDAP غير مُنصبّة؛ لذا فإن الخلفية لن تعمل. يرجى طلب تنصيبها من مُشرف النظام.",
"Connection Settings" : "إعدادات الربط",
- "Configuration Active" : "الإعداد النشط",
- "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "توفير مضيف احتياطي اختياري. يجب أن يكون نسخة طبق الأصل من خادم بروتوكول الوصول إلي الدليل البسيط/ الدليل النشط الرئيسي.",
- "Backup (Replica) Port" : "منفذ النسخ الاحتياطي (النسخ المتماثل)",
- "Disable Main Server" : "تعطيل الخادم الرئيسي",
- "Only connect to the replica server." : "الاتصال بخادم النسخ المتماثل فقط.",
- "Turn off SSL certificate validation." : "إيقاف تشغيل التحقق من صحة شهادة طبقة المنافذ الآمنة.",
- "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "لا يوصي به، استخدمه للاختبار فقط! إذا كان الاتصال يعمل فقط مع هذا الخيار، فقم باستيراد شهادة طبقة المنافذالآمنة لخادم بروتوكول الوصول إلي الدليل البسيط في خادم%s الخاص بك.",
- "Directory Settings" : "اعدادات الدليل",
- "User Display Name Field" : "حقل اسم العرض للمستخدم",
- "The LDAP attribute to use to generate the user's display name." : "تستخدم خاصية بروتوكول الوصول إلي الدليل البسيط لإنشاء اسم عرض المستخدم.",
- "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "اختياري. نظرا لإضافة بروتوكول الوصول إلي الدليل البسيط إلى اسم العرض بين قوسين. ينتج عنه فيعلى سبيل المثال » جون دو(john.doe@example.org)«.",
+ "Configuration Active" : "الإعداد نشط",
+ "When unchecked, this configuration will be skipped." : "عندما لا يتم تحديده، سوف يتم تخطي هذه التهيئة.",
+ "Backup (Replica) Host" : "مضيف النسخ الاحتياطي (طِبقَ الأصل)",
+ "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "توفير مضيف احتياطي اختياري. يجب أن يكون نسخة طبق الأصل من خادوم LDAP/AC.",
+ "Backup (Replica) Port" : "منفذ النسخ الاحتياطي (طِبقَ الأصل)",
+ "Disable Main Server" : "تعطيل الخادوم الرئيسي",
+ "Only connect to the replica server." : "متصل فقط بالخادوم الاحتياطي.",
+ "Turn off SSL certificate validation." : "إيقاف تشغيل التحقق من صحة شهادة SSL.",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "لا يوصي به، استخدمه للاختبار فقط! إذا كان الاتصال يعمل فقط مع هذا الخيار، فقم باستيراد شهادة SSL لخادوم LDAP في خادومك%s.",
+ "Cache Time-To-Live" : "مدة صلاحية ذاكرة التخزين المؤقت cache",
+ "in seconds. A change empties the cache." : "خلال ثوان. يؤدي التغيير إلى إفراغ ذاكرة التخزين المؤقت cache.",
+ "Directory Settings" : "إعدادات الدليل",
+ "User Display Name Field" : "حقل عرض اسم المستخدم",
+ "The LDAP attribute to use to generate the user's display name." : "تستخدم سمة بروتوكول LDAP لتوليد اسم عرض المستخدم.",
+ "2nd User Display Name Field" : "الحقل 2 لعرض اسم المستخدم ",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "اختياري. سمة LDAP سوف تُضاف إلى اسم العرض بين قوسين. و النتيجة ستكون كما في المثال: »John Doe (john.doe@example.org)«.",
+ "Base User Tree" : "شجرة المستخدم الأساسي Base User Tree",
+ "One User Base DN per line" : "اسم مميز أساسي User Base DN لمستخدم واحد لكل سطر",
"User Search Attributes" : "خصائص بحث المستخدم",
- "Optional; one attribute per line" : "اختياري؛ تحديد واحد لكل سطر",
+ "Optional; one attribute per line" : "اختياري؛ سمة واحدة لكل سطر",
+ "Group Display Name Field" : "حقل عرض اسم المجموعة",
"The LDAP attribute to use to generate the groups's display name." : "تستخدم خاصية بروتوكول الوصول إلي الدليل البسيط لإنشاء اسم عرض المجموعات.",
+ "Base Group Tree" : "شجرة المجموعة الأساسية",
+ "One Group Base DN per line" : "اسم مميز أساسي لمجموعة واحدة لكل سطر",
"Group Search Attributes" : "تحديدات بحث المجموعات",
+ "Group-Member association" : "مصادقة أعضاء المجموعة",
+ "Dynamic Group Member URL" : "محدد موقع الموارد المُوحّد الديناميكي لعضو المجموعة ",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "تحتوي خاصية بروتوكول الوصول إلي الدليل البسيط LDAP الموجودة في كائنات المجموعة على عنوان محدد موقع الموارد المُوحّد لبحث بروتوكول الوصول إلي الدليل البسيط والذي يحدد الكائنات التي تنتمي إلى المجموعة. (يؤدي الإعداد الفارغ إلى تعطيل وظيفة عضوية المجموعة الديناميكية.)",
+ "Nested Groups" : "المجموعات المتداخلة",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "عند التشغيل، يتم دعم المجموعات التي تحتوي على مجموعات. (تعمل فقط إذا كان تحديد عضو المجموعة يحتوي على الأسماء المميزة).",
+ "Paging chunksize" : "حجم حزم التصفح",
+ "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "يتم استخدام حجم الحزمة/الأجزاء لعمليات بحث بروتوكول الوصول إلي الدليل البسيط المقسمة إلى صفحات والتي قد تعطي نتائج ضخمة مثل تعداد المستخدم أو المجموعة. (الضبط علي 0 يؤدي إلى تعطيل عمليات بحث بروتوكول الوصول إلي الدليل البسيط المقسمة إلى صفحات في تلك الحالات.)",
+ "Enable LDAP password changes per user" : "تمكين تغيير كلمة المرور لكل مستخدم علي خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" ",
+ "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." : "يتيح خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" للمستخدمين تغيير كلمة المرور الخاصة بهم والسماح للمسؤولين المتميزين ومسؤولي المجموعة بتغيير كلمة مرور مستخدمي خادوم بروتوكول الوصول إلي الدليل البسيط. وتعمل هذه الخاصية يعمل عندما يتم تهيئة وضبط سياسات التحكم في الوصول على خادوم بروتوكول الوصول إلي الدليل البسيط وفقًا لذلك. وحيث أن كلمات المرور يتم إرسالها فى صورة نص عادي إلى خادوم بروتوكول الوصول إلي الدليل البسيط، فيجب استخدام تشفير النقل وضبط تجزئة كلمة المرور على خادوم بروتوكول الوصول إلي الدليل البسيط.",
+ "(New password is sent as plain text to LDAP)" : "(يتم إرسال كلمة المرور الجديدة كنص عادي إلى خادوم بروتوكول الوصول إلي الدليل البسيط )",
+ "Default password policy DN" : "سياسة الاسم المميز لكلمة المرورالافتراضية",
+ "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "سياسة الاسم المميز لكلمة المرورالافتراضية التي سيتم استخدامها لمعالجة انتهاء صلاحية كلمة المرور. تعمل فقط عندما يتم تمكين تغيير كلمة مرور خادوم بروتوكول الوصول إلي الدليل البسيط لكل مستخدم ويكون مدعومًا فقط بواسطة أوبن إل دي أيه بي \"OpenLDAP\". اتركه فارغًا لتعطيل معالجة انتهاء صلاحية كلمة المرور.",
"Special Attributes" : "التحديدات الخاصة",
"Quota Field" : "حقل الحصة",
+ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "اتركه فارغًا للحصة الافتراضية للمستخدم. خلاف ذلك، حدد سمة خادوم بروتوكول الوصول إلي الدليل البسيط/ الدليل النشط \"LDAP/AD\".",
"Quota Default" : "افتراضي الحصة",
+ "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "تجاوز الحصة الافتراضية لمستخدمي خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" الذين ليس لديهم حصة محددة في حقل الحصة النسبية.",
"Email Field" : "خانة البريد الإلكتروني",
+ "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "قم بتعيين البريد الإلكتروني للمستخدم من سمة خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" الخاصة به. اتركه فارغًا للوضع الافتراضي.",
"User Home Folder Naming Rule" : "قاعدة تسمية المجلد الرئيسي للمستخدم",
"Internal Username" : "اسم المستخدم الداخلي",
"Internal Username Attribute:" : "خاصية اسم المستخدم الداخلي:",
"Override UUID detection" : "تجاوز اكتشاف المعرف الفريد العالمي",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "بشكل افتراضي، يتم اكتشاف خاصية المعرف الفريد العالمي تلقائيًا. ويتم استخدام خاصية المعرف الفريد العالمي لتحديد مستخدمي ومجموعات بروتوكول الوصول إلي الدليل البسيط علي نحو موثوق. أيضًا، سيتم إنشاء اسم المستخدم الداخلي بناءً على المعرف الفريد العالمي إذا لم يتم تحديده أعلاه. يمكنك تجاوز الإعداد وتجاوز الخاصية حسب اختيارك. يجب عليك التأكد من إمكانية الوصول إلي الخاصية التي قمت باختيارها من قبل كل من المستخدمين والمجموعات وأنها فريدة. اتركه فارغًا للوضع الافتراضي. تصبح التغييرات نافذة فقط على مستخدمي ومجموعات بروتوكول الوصول إلي الدليل البسيط المعينين حديثًا (المضافين).",
+ "UUID Attribute for Users:" : "خاصية المعرف الفريد العالمي للمستخدمين:",
"UUID Attribute for Groups:" : "خاصية المعرف الفريد العالمي للمجموعات:",
+ "Username-LDAP User Mapping" : "اسم المستخدم- تعيين مستخدم بروتوكول الوصول إلي الدليل البسيط",
+ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "تُستخدم أسماء المستخدمين لتخزين وتخصيص البيانات التعريف الوصفية. من أجل تحديد المستخدمين والتعرف عليهم بدقة، سيكون لكل مستخدم خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" اسم مستخدم داخلي. يتطلب هذا تعيينًا من اسم المستخدم إلى مستخدم خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\". يتم تعيين اسم المستخدم الذي تم إنشاؤه إلى المعرف الفريد العالمي\"UUID\" لمستخدم LDAP. بالإضافة إلى ذلك، يتم تخزين الاسم المميز مؤقتًا أيضًا لتقليل تفاعل LDAP، ولكنه لا يستخدم لتحديد الهوية. وعند تغير الاسم المميز يتم العثور على التغييرات. ويتم استخدام اسم المستخدم الداخلي في كل مكان. مسح التعيينات سيكون له آثار متبقية في كل مكان. مسح التعيينات ليس حساسًا للتكوين، فهو يؤثر على جميع تكوينات LDAP! لا تقم مطلقًا بمسح التعيينات في بيئة الإنتاج، فقط في مرحلة الاختبار أو المرحلة التجريبية.",
+ "Clear Username-LDAP User Mapping" : "مسح اسم المستخدم- تعيين مستخدم بروتوكول الوصول إلي الدليل البسيط",
"Clear Groupname-LDAP Group Mapping" : "مسح اسم المجموعة - تعيين مجموعة بروتوكول الوصول إلي الدليل البسيط "
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/user_ldap/l10n/ar.json b/apps/user_ldap/l10n/ar.json
index 56dd90b97e8..757d08de7df 100644
--- a/apps/user_ldap/l10n/ar.json
+++ b/apps/user_ldap/l10n/ar.json
@@ -1,112 +1,188 @@
{ "translations": {
- "Failed to clear the mappings." : "فشل مسح الارتباطات (mappings)",
- "Failed to delete the server configuration" : "تعذر حذف ملف إعدادات الخادم",
- "No action specified" : "لم يتم تحديد الإجراء",
- "No configuration specified" : "لم يتم تحديد الإعدادات.",
- "No data specified" : "لم يتم تحديد البيانات.",
- " Could not set configuration %s" : "تعذر تنفيذ الإعداد %s",
+ "Failed to clear the mappings." : "فشل مسح الارتباطات mappings",
+ "Failed to delete the server configuration" : "تعذّر حذف ملف إعدادات الخادوم",
+ "Invalid configuration: Anonymous binding is not allowed." : "تكوين غير صالح: الربط المجهول Anonymous binding غير مسموح به.",
+ "Valid configuration, connection established!" : "تكوين صالح، تمّ تأسيس الاتصال!",
+ "Valid configuration, but binding failed. Please check the server settings and credentials." : "تكوين صالح، لكن فشل الربط binding. يرجى التحقّق من إعدادات الخادوم و حيثيّات الدخول credentials.",
+ "Invalid configuration. Please have a look at the logs for further details." : "تكوين غير صحيح. يرجى الرجوع إلي سجلات الحركات logs لمزيد من التفاصيل.",
+ "No action specified" : "لم يتم تحديد أيّ إجراءٍ",
+ "No configuration specified" : "لم يتم تحديد أيّ إعداداتٍ",
+ "No data specified" : "لم يتم تحديد أيّ بياناتٍ",
+ "Invalid data specified" : "البيانات المُحدّدة غير صالحة",
+ " Could not set configuration %s" : "تعذّر تعيين الإعداد %s",
"Action does not exist" : "الإجراء غير موجود",
- "Very weak password" : "كلمة السر ضعيفة جدا",
- "Weak password" : "الكلمة السرية ضعيفة",
- "So-so password" : "كلمة سر غير فعالة",
- "Good password" : "الكلمة السرية جيدة",
- "Strong password" : "الكلمة السرية قوية",
- "The Base DN appears to be wrong" : "يبدو أن الاسم المميز الأساسي Base DN خاطئًا",
- "Testing configuration…" : "اختبار التهيئة...",
+ "Renewing …" : "جارٍ التجديد…",
+ "Very weak password" : "كلمة مرور ضعيفة جدا",
+ "Weak password" : "كلمة مرور ضعيفة",
+ "So-so password" : "كلمة مرور مقبولة نوعاً ما",
+ "Good password" : "كلمة مرور جيدة",
+ "Strong password" : "كلمة مرور قوية",
+ "The Base DN appears to be wrong" : "يبدو أن الاسم المميز الأساسي Base DN خاطئٌ",
+ "Testing configuration…" : "إختبار التهيئة...",
"Configuration incorrect" : "الإعدادات غير صحيحة",
"Configuration incomplete" : "الإعدادات غير مكتملة",
"Configuration OK" : "الإعدادات صحيحة",
- "Select groups" : "إختر مجموعة",
- "Select object classes" : "اختر أصناف المكونات",
- "Please specify the port, it could not be auto-detected." : "رجاء تحديد المنفذ، حيث لا يمكن اكتشافه تلقائيا.",
- "Base DN could not be auto-detected, please revise credentials, host and port." : "تعذر اكتشاف الاسم المميز الأساسي تلقائيًا، يرجى مراجعة بيانات الاعتماد والمضيف والمنفذ.",
- "Could not detect Base DN, please enter it manually." : "تعذر اكتشاف الاسم المميز الأساسي، يرجى إدخاله يدويًا.",
- "{nthServer}. Server" : "الخادم {nthServer}.",
- "No object found in the given Base DN. Please revise." : "لم يتم العثور على كائن في الاسم المميز الأساسي المحدد. يرجي التعديل.",
- "More than 1,000 directory entries available." : "أكثر من 1,000 دليل مدخلات الدليل متاحة.",
- "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.",
- "Do you really want to delete the current Server Configuration?" : "هل ترغب فعلاً في حذف إعدادات الخادم الحالي؟",
+ "Select groups" : "إختر المجموعات",
+ "Select object classes" : "إختر أصناف الكائنات object classes",
+ "Please check the credentials, they seem to be wrong." : "يرجى التحقق من حيثيّات الدخول credentials، يبدو أنها خاطئة.",
+ "Please specify the port, it could not be auto-detected." : "يُرجى تحديد المنفذ port، حيث لا يمكن اكتشافه تلقائيا.",
+ "Base DN could not be auto-detected, please revise credentials, host and port." : "تعذر اكتشاف الاسم المميز الأساسي Base DN تلقائيًا، يرجى مراجعة حيثيّات الدخول credentials، والمُضيف host، والمنفذ port.",
+ "Could not detect Base DN, please enter it manually." : "تعذّر اكتشاف الاسم المميز الأساسي Base DN، يُرجى إدخاله يدويًا.",
+ "{nthServer}. Server" : "{nthServer}. الخادوم",
+ "No object found in the given Base DN. Please revise." : "لم يتم العثور على أي كائن object في الاسم المميز الأساسي Base DN المحدد. يُرجي المُراجعة.",
+ "More than 1,000 directory entries available." : "يُوجد أكثر من 1,000 مُدخل في الدليل directory entries.",
+ "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "حدث خطأ. يرجي التحقق من الاسم المميز الأساسي Base DN، وكذلك إعدادات الاتصال، و حيثيّات الدخول credentials.",
+ "Do you really want to delete the current Server Configuration?" : "هل ترغب فعلاً في حذف إعدادات الخادوم الحالي؟",
"Confirm Deletion" : "تأكيد الحذف",
- "Mappings cleared successfully!" : "تم مسح التعيينات بنجاح!",
- "Error while clearing the mappings." : "خطأ أثناء مسح التعيينات.",
- "Anonymous bind is not allowed. Please provide a User DN and Password." : "الربط المجهول غير مسموح به. يرجى تقديم الاسم المميز للمستخدم وكلمة مرور.",
- "LDAP Operations error. Anonymous bind might not be allowed." : "خطأ في عمليات بروتوكول الوصول إلي الدليل البسيط. قد لا يكون مسموح بالربط المجهول.",
+ "Mappings cleared successfully!" : "تم مسح التعيينات mappings بنجاح!",
+ "Error while clearing the mappings." : "خطأ أثناء مسح التعيينات mappings.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "الربط المجهول Anonymous bind غير مسموح به. يرجى إدخال الاسم المميز للمستخدم User DN، وكلمة المرور.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "خطأ في عمليات LDAP. قد لا يكون مسموحاُ بالربط المجهول Anonymous bind.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "فشل الحفظ. يرجى التأكد من أن قاعدة البيانات قيد التشغيل. أعد التحميل قبل المتابعة.",
+ "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?" : "تفعيل الوضع سوف ينتج عنه تمكين استعلامات بروتوكول الوصول إلي الدليل البسيط التلقائية. وقد يستغرق الأمر بعض الوقت بناء على حجم بروتوكول الوصول إلي الدليل البسيط الخاص بك. هل ما زلت تريد تفعيل الوضع؟",
+ "Mode switch" : "تشغيل النمط",
"Select attributes" : "اختر الخصائص",
+ "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "لم يتم العثور على المستخدم. يرجى التحقق من تحديدات تسجيل الدخول واسم المستخدم الخاصين بك. عامل التصفية الفعال (للنسخ واللصق للتحقق من صحة سطر الأوامر):<br/>",
"User found and settings verified." : "تم العثور على المستخدم وتم التحقق من الإعدادات.",
- "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "عامل تصفية البحث غير صالح، ربما بسبب مشكلات في بناء الجملة مثل عدم تساو عدد الأقواس المفتوحة والمغلقة. يرجي المراجعة.",
- "Please provide a login name to test against" : "يرجى تقديم اسم تسجيل الدخول للاختبار وفقا له",
- "Could not find the desired feature" : "تعذر العثور على السمة المطلوبة",
+ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "ضع في اعتبارك تضييق نطاق البحث، لأنه يشمل العديد من المستخدمين، ولن يتمكن سوى أول واحد منهم من تسجيل الدخول.",
+ "An unspecified error occurred. Please check log and settings." : "حدث خطأ غير محدد. يرجى التحقق من السجل والإعدادات.",
+ "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "فلتر البحث غير صالح؛ ربما بسبب مشكلات في بناء الجملة مثل عدم تساوي عدد الأقواس المفتوحة والمغلقة. يرجي المراجعة.",
+ "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "حدث خطأ في الاتصال بـ LDAP / AD. يرجى التحقق من المضيف host، والمنفذ port، و حيثيّات الدخول credentials.",
+ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "العنصر النائب placeholder ـ \"%u مُعرّف\". سيتم استبداله باسم دخول عند الاستعلام من LDAP/AD.",
+ "Please provide a login name to test against" : "يرجى تقديم اسم تسجيل الدخول لاختباره",
+ "The group box was disabled, because the LDAP/AD server does not support memberOf." : "تم تعطيل مربع المجموعة؛ لأن خادوم LDAP / AD لا يدعم خاصّيّة memberOf.",
+ "Password change rejected. Hint: " : "تمّ رفض تغيير كلمة المرور. إرشادُ:",
+ "Please login with the new password" : "الرجاء تسجيل الدخول باستخدام كلمة المرور الجديدة",
+ "LDAP User backend" : "خلفية المستخدمين User backend من LDAP ",
+ "Your password will expire tomorrow." : "كلمة مرورك تنتهي صلاحيتها غداً.",
+ "Your password will expire today." : "كلمة مرورك تنتهي صلاحيتها اليوم.",
+ "LDAP/AD integration" : "مُكاملة LDAP/AD ",
+ "> 1000 groups found" : "> 1000 مجموعة موجودة",
+ "> 1000 users found" : "> 1000 مستخدِم موجود",
+ "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "تعذر اكتشاف سمة الاسم المعروض للمستخدم user display name attribute. يرجى تحديده بنفسك في الإعدادات المتقدمة لخادوم.",
+ "Could not find the desired feature" : "تعذر العثور على الخاصّيّة المرغوبة",
"Invalid Host" : "مضيف غير صالح",
+ "LDAP user and group backend" : "خلفية المستخدمين و المجموعات من LDAP",
+ "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "يتيح هذا التطبيق للمشرفين توصيل نكست كلاود بدليل المستخدمين المستند إلى LDAP.",
+ "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "يتيح هذا التطبيق للمشرفين توصيل نكست كلاود بدليل المستخدمين المستنِد إلى LDAP للمصادقة و توفير المستخدمين users، والمجموعات groups، و سمات المستخدمين user attributes. \nيمكن للمشرفين تكوين هذا التطبيق للاتصال بدليل LDAP واحد أو أكثر عبر واجهة LDAP. \nيمكن سحب سماتٍ مثل حصة المستخدم التخزينية، و البريد الإلكتروني، و التجسيدات الرمزية avatar، وعضوية المجموعات و غيرها إلى نكست كلاود باستخدام الاستعلامات والمرشحات المناسبة. \nيقوم المستخدم بتسجيل الدخول إلى نكست كلاود باستخدام حيثيات دخوله من LDAP أو AD، ويتم منحه حق الوصول بناءً على طلب المصادقة الذي تتم معالجته بواسطة خادوم LDAP أو AD. \nلا يقوم نكست كلاود بتخزين كلمات مرور LDAP أو AD، بل يستخدم حيثيّات المستخدم هذه للمصادقة ثم يستخدم مُعرّف الجلسة session كمُعرّف للمستخدم. \n\nيتوفر المزيد من المعلومات في وثائق مستخدم LDAP و Group Backend.",
"Test Configuration" : "اختبر التكوين",
- "Help" : "المساعدة",
+ "Help" : "مساعدة",
"Groups meeting these criteria are available in %s:" : "المجموعات التي تلبي هذه المعايير متوفرة في %s:",
"Only these object classes:" : "فئات هذه الكائنات فقط:",
"Only from these groups:" : "فقط من هذه المجموعات:",
"Search groups" : "مجموعات البحث",
+ "Available groups" : "المجموعات المتاحة",
"Selected groups" : "المجموعات المختارة",
- "Edit LDAP Query" : "تحرير استعلام بروتوكول الوصول إلي الدليل البسيط ",
- "LDAP Filter:" : "عامل تصفية بروتوكول الوصول إلي الدليل البسيط:",
+ "Edit LDAP Query" : "تحرير استعلام لبروتوكول LDAP",
+ "LDAP Filter:" : "فلتر بروتوكولLDAP:",
+ "The filter specifies which LDAP groups shall have access to the %s instance." : "يحدد الفلتر أي مجموعات من LDAP سوف يكون لها حق الوصول إلى التطبيق %s.",
+ "Verify settings and count the groups" : "تحقق من الإعدادات و عدد المجموعات",
"When logging in, %s will find the user based on the following attributes:" : "عند تسجيل الدخول، %sسوف تجد المستخدم بناءً على السمات التالية:",
- "Other Attributes:" : "الخصائص الأخري:",
+ "LDAP/AD Username:" : "اسم مستخدم LDAP/AD ـ : ",
+ "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "يسمح بتسجيل الدخول مقابل اسم مستخدم LDAP / AD ، والذي يكون إما \"uid\" أو \"sAMAccountName\" وسيتم اكتشافه.",
+ "LDAP/AD Email Address:" : "عنوان البريد الالكتروني LDAP/AD ـ :",
+ "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "يسمح بتسجيل الدخول مقابل سمة البريد الإلكتروني. \"mail\" و \"mailPrimaryAddress\" مسموح بهما.",
+ "Other Attributes:" : "خصائص أخري:",
+ "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "حدد الفلتر الذي سيتم تطبيقه، عند محاولة تسجيل الدخول. يحل \"%%uid\" محل اسم المستخدم في إجراء تسجيل الدخول. مثال: \"uid=%%uid\"",
"Test Loginname" : "اختبار اسم تسجيل الدخول",
- "Verify settings" : "تحديد الإعدادات",
- "%s. Server:" : "%s. خادم:",
+ "Attempts to receive a DN for the given loginname and the current login filter" : "محاولات لتلقّي الاسم الممير DN لاسم تسجيل الدخول المحدد و فلتر تسجيل الدخول الحالي",
+ "Verify settings" : "التحقُّق من الإعدادات",
+ "%s. Server:" : "%s. خادوم:",
+ "Add a new configuration" : "إضافة تهيئة جديدة",
"Copy current configuration into new directory binding" : "نسخ التهيئة الحالية إلى دليل جديد مرتبط",
"Delete the current configuration" : "حذف التهيئة الحالية",
"Host" : "المضيف",
+ "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "يمكنك التغاضي عن البروتوكول، ما لم يكن SSL لازماً. إذا كان الأمر كذلك، فابدأ بـ ldaps",
"Port" : "المنفذ",
- "User DN" : "الاسم المميز للمستخدم",
- "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "الاسم المميز للعميل المستخدم الذي يجب ربطه به، على سبيل المثال uid = العميل، dc = مثال، dc = com. للوصول مجهول الهوية، اترك خانتي الاسم المميز وكلمة المرور فارغتين.",
+ "Detect Port" : "إكتشِف المنفذ",
+ "User DN" : "الاسم المميز للمستخدم DN",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "الاسم المميز للعميل المستخدم DN الذي يجب الربط معه. على سبيل المثال، uid=agent,dc=example,dc=com. للوصول مجهول الهوية anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.",
"Password" : "كلمة المرور",
- "For anonymous access, leave DN and Password empty." : "للوصول المجهول، اترك حقل الاسم المميز وكلمة المرور فارغين.",
- "You can specify Base DN for users and groups in the Advanced tab" : "يمكنك تحديد اسم مميز أساسي Base DN للمستخدمين والمجموعات من علامة تبويب الإعدادات المتقدمة",
- "Test Base DN" : "اختبر الاسم المميز الأساسي Base DN",
- "Manually enter LDAP filters (recommended for large directories)" : "إدخال عوامل تصفية بروتوكول الوصول إلي الدليل البسيط يدويًا (موصى به للأدلة الكبيرة)",
- "The filter specifies which LDAP users shall have access to the %s instance." : "يحدد عامل التصفية مستخدمي بروتوكول الوصول إلي الدليل البسيط الذين يمكنهم الوصول إلى %sالنموذج.",
- "Saving" : "جاري الحفظ ...",
+ "For anonymous access, leave DN and Password empty." : "للوصول المجهول anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.",
+ "Save Credentials" : "حفظ حيثيّات الدخول credentials",
+ "One Base DN per line" : "اسم مميز واحد أساسي Base DN لكل سطر",
+ "You can specify Base DN for users and groups in the Advanced tab" : "يمكنك تحديد الاسم المميز الأساسي Base DN للمستخدمين والمجموعات من علامة تبويب الإعدادات المتقدمة",
+ "Detect Base DN" : "اكتشاف الاسم المميز الأساسي Base DN",
+ "Test Base DN" : "إختبر الاسم المميز الأساسي Base DN",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "يُلغي طلبات LDAP التلقائية. يُفضّل استعماله في حالة الخوادم التي تخدم أعداداً كبيرة، ولكنه يتطلب بعض المعرفة فيما يخص بروتوكول LDAP.",
+ "Manually enter LDAP filters (recommended for large directories)" : "الإدخال اليدوي لفلاتر بروتوكول LDAP (يُنصح به في حالة الأدلة الكبيرة)",
+ "Listing and searching for users is constrained by these criteria:" : "العرض والبحث عن المستخدمين مُقيّدٌ بهذه الشروط:",
+ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "أكثر فئات الكائنات شيوعًا بالنسبة بالنسبة للمستخدمين هي: organizationalPerson, person, user, and inetOrgPerson. إذا لم تكن متأكدًا من فئة الكائن التي تريد تحديدها، فيرجى استشارة مشرف خادوم الـ LDAP.",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "يُحدِّد الفلتر أيّ مستخدمي LDAP يمكنه الوصول إلى الخادوم %s.",
+ "Verify settings and count users" : "التحقق من الإعدادات وعدد المستخدمين",
+ "Saving" : "الحفظ جارٍ ...",
"Back" : "رجوع",
- "Continue" : "المتابعة",
- "An internal error occurred." : "طرأ هناك خطأ.",
- "Please try again or contact your administrator." : "حاول مجددا أو تواصل مع مسؤول النظام.",
- "Current password" : "الكلمة السرية الحالية",
- "New password" : "الكلمة السرية الجديدة",
- "Wrong password." : "الكلمة السرية خاطئة.",
+ "Continue" : "مُتابعة",
+ "Please renew your password." : "الرجاء تجديد كلمة مرورك.",
+ "An internal error occurred." : "حدث خطأ داخلي.",
+ "Please try again or contact your administrator." : "حاول مجددا أو تواصل مع مشرف النظام.",
+ "Current password" : "كلمة المرور الحالية",
+ "New password" : "كلمة المرور الجديدة",
+ "Renew password" : "تجديد كلمة المرور",
+ "Wrong password." : "كلمة مرور خاطئة.",
"Cancel" : "إلغاء",
- "Server" : "خادم",
+ "Server" : "خادوم",
"Users" : "المستخدمين",
- "Login Attributes" : "تحديدات تسجيل الدخول",
+ "Login Attributes" : "سمات تسجيل الدخول",
"Groups" : "مجموعات",
"Expert" : "خبير",
- "Advanced" : "تعديلات متقدمه",
- "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>تحذير:</b> الوحدة النمطية لخادم الارتباط التشعبي لبروتوكول الوصول إلي الدليل البسيط غير مثبتة ، والخلفية لن تعمل الواجهة. يرجى طلب تثبيتها من قبل مسؤول النظام.",
+ "Advanced" : "متقدمة",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>تحذير:</b> وِحدة PHP LDAP غير مُنصبّة؛ لذا فإن الخلفية لن تعمل. يرجى طلب تنصيبها من مُشرف النظام.",
"Connection Settings" : "إعدادات الربط",
- "Configuration Active" : "الإعداد النشط",
- "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "توفير مضيف احتياطي اختياري. يجب أن يكون نسخة طبق الأصل من خادم بروتوكول الوصول إلي الدليل البسيط/ الدليل النشط الرئيسي.",
- "Backup (Replica) Port" : "منفذ النسخ الاحتياطي (النسخ المتماثل)",
- "Disable Main Server" : "تعطيل الخادم الرئيسي",
- "Only connect to the replica server." : "الاتصال بخادم النسخ المتماثل فقط.",
- "Turn off SSL certificate validation." : "إيقاف تشغيل التحقق من صحة شهادة طبقة المنافذ الآمنة.",
- "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "لا يوصي به، استخدمه للاختبار فقط! إذا كان الاتصال يعمل فقط مع هذا الخيار، فقم باستيراد شهادة طبقة المنافذالآمنة لخادم بروتوكول الوصول إلي الدليل البسيط في خادم%s الخاص بك.",
- "Directory Settings" : "اعدادات الدليل",
- "User Display Name Field" : "حقل اسم العرض للمستخدم",
- "The LDAP attribute to use to generate the user's display name." : "تستخدم خاصية بروتوكول الوصول إلي الدليل البسيط لإنشاء اسم عرض المستخدم.",
- "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "اختياري. نظرا لإضافة بروتوكول الوصول إلي الدليل البسيط إلى اسم العرض بين قوسين. ينتج عنه فيعلى سبيل المثال » جون دو(john.doe@example.org)«.",
+ "Configuration Active" : "الإعداد نشط",
+ "When unchecked, this configuration will be skipped." : "عندما لا يتم تحديده، سوف يتم تخطي هذه التهيئة.",
+ "Backup (Replica) Host" : "مضيف النسخ الاحتياطي (طِبقَ الأصل)",
+ "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "توفير مضيف احتياطي اختياري. يجب أن يكون نسخة طبق الأصل من خادوم LDAP/AC.",
+ "Backup (Replica) Port" : "منفذ النسخ الاحتياطي (طِبقَ الأصل)",
+ "Disable Main Server" : "تعطيل الخادوم الرئيسي",
+ "Only connect to the replica server." : "متصل فقط بالخادوم الاحتياطي.",
+ "Turn off SSL certificate validation." : "إيقاف تشغيل التحقق من صحة شهادة SSL.",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "لا يوصي به، استخدمه للاختبار فقط! إذا كان الاتصال يعمل فقط مع هذا الخيار، فقم باستيراد شهادة SSL لخادوم LDAP في خادومك%s.",
+ "Cache Time-To-Live" : "مدة صلاحية ذاكرة التخزين المؤقت cache",
+ "in seconds. A change empties the cache." : "خلال ثوان. يؤدي التغيير إلى إفراغ ذاكرة التخزين المؤقت cache.",
+ "Directory Settings" : "إعدادات الدليل",
+ "User Display Name Field" : "حقل عرض اسم المستخدم",
+ "The LDAP attribute to use to generate the user's display name." : "تستخدم سمة بروتوكول LDAP لتوليد اسم عرض المستخدم.",
+ "2nd User Display Name Field" : "الحقل 2 لعرض اسم المستخدم ",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "اختياري. سمة LDAP سوف تُضاف إلى اسم العرض بين قوسين. و النتيجة ستكون كما في المثال: »John Doe (john.doe@example.org)«.",
+ "Base User Tree" : "شجرة المستخدم الأساسي Base User Tree",
+ "One User Base DN per line" : "اسم مميز أساسي User Base DN لمستخدم واحد لكل سطر",
"User Search Attributes" : "خصائص بحث المستخدم",
- "Optional; one attribute per line" : "اختياري؛ تحديد واحد لكل سطر",
+ "Optional; one attribute per line" : "اختياري؛ سمة واحدة لكل سطر",
+ "Group Display Name Field" : "حقل عرض اسم المجموعة",
"The LDAP attribute to use to generate the groups's display name." : "تستخدم خاصية بروتوكول الوصول إلي الدليل البسيط لإنشاء اسم عرض المجموعات.",
+ "Base Group Tree" : "شجرة المجموعة الأساسية",
+ "One Group Base DN per line" : "اسم مميز أساسي لمجموعة واحدة لكل سطر",
"Group Search Attributes" : "تحديدات بحث المجموعات",
+ "Group-Member association" : "مصادقة أعضاء المجموعة",
+ "Dynamic Group Member URL" : "محدد موقع الموارد المُوحّد الديناميكي لعضو المجموعة ",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "تحتوي خاصية بروتوكول الوصول إلي الدليل البسيط LDAP الموجودة في كائنات المجموعة على عنوان محدد موقع الموارد المُوحّد لبحث بروتوكول الوصول إلي الدليل البسيط والذي يحدد الكائنات التي تنتمي إلى المجموعة. (يؤدي الإعداد الفارغ إلى تعطيل وظيفة عضوية المجموعة الديناميكية.)",
+ "Nested Groups" : "المجموعات المتداخلة",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "عند التشغيل، يتم دعم المجموعات التي تحتوي على مجموعات. (تعمل فقط إذا كان تحديد عضو المجموعة يحتوي على الأسماء المميزة).",
+ "Paging chunksize" : "حجم حزم التصفح",
+ "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "يتم استخدام حجم الحزمة/الأجزاء لعمليات بحث بروتوكول الوصول إلي الدليل البسيط المقسمة إلى صفحات والتي قد تعطي نتائج ضخمة مثل تعداد المستخدم أو المجموعة. (الضبط علي 0 يؤدي إلى تعطيل عمليات بحث بروتوكول الوصول إلي الدليل البسيط المقسمة إلى صفحات في تلك الحالات.)",
+ "Enable LDAP password changes per user" : "تمكين تغيير كلمة المرور لكل مستخدم علي خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" ",
+ "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." : "يتيح خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" للمستخدمين تغيير كلمة المرور الخاصة بهم والسماح للمسؤولين المتميزين ومسؤولي المجموعة بتغيير كلمة مرور مستخدمي خادوم بروتوكول الوصول إلي الدليل البسيط. وتعمل هذه الخاصية يعمل عندما يتم تهيئة وضبط سياسات التحكم في الوصول على خادوم بروتوكول الوصول إلي الدليل البسيط وفقًا لذلك. وحيث أن كلمات المرور يتم إرسالها فى صورة نص عادي إلى خادوم بروتوكول الوصول إلي الدليل البسيط، فيجب استخدام تشفير النقل وضبط تجزئة كلمة المرور على خادوم بروتوكول الوصول إلي الدليل البسيط.",
+ "(New password is sent as plain text to LDAP)" : "(يتم إرسال كلمة المرور الجديدة كنص عادي إلى خادوم بروتوكول الوصول إلي الدليل البسيط )",
+ "Default password policy DN" : "سياسة الاسم المميز لكلمة المرورالافتراضية",
+ "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "سياسة الاسم المميز لكلمة المرورالافتراضية التي سيتم استخدامها لمعالجة انتهاء صلاحية كلمة المرور. تعمل فقط عندما يتم تمكين تغيير كلمة مرور خادوم بروتوكول الوصول إلي الدليل البسيط لكل مستخدم ويكون مدعومًا فقط بواسطة أوبن إل دي أيه بي \"OpenLDAP\". اتركه فارغًا لتعطيل معالجة انتهاء صلاحية كلمة المرور.",
"Special Attributes" : "التحديدات الخاصة",
"Quota Field" : "حقل الحصة",
+ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "اتركه فارغًا للحصة الافتراضية للمستخدم. خلاف ذلك، حدد سمة خادوم بروتوكول الوصول إلي الدليل البسيط/ الدليل النشط \"LDAP/AD\".",
"Quota Default" : "افتراضي الحصة",
+ "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "تجاوز الحصة الافتراضية لمستخدمي خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" الذين ليس لديهم حصة محددة في حقل الحصة النسبية.",
"Email Field" : "خانة البريد الإلكتروني",
+ "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "قم بتعيين البريد الإلكتروني للمستخدم من سمة خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" الخاصة به. اتركه فارغًا للوضع الافتراضي.",
"User Home Folder Naming Rule" : "قاعدة تسمية المجلد الرئيسي للمستخدم",
"Internal Username" : "اسم المستخدم الداخلي",
"Internal Username Attribute:" : "خاصية اسم المستخدم الداخلي:",
"Override UUID detection" : "تجاوز اكتشاف المعرف الفريد العالمي",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "بشكل افتراضي، يتم اكتشاف خاصية المعرف الفريد العالمي تلقائيًا. ويتم استخدام خاصية المعرف الفريد العالمي لتحديد مستخدمي ومجموعات بروتوكول الوصول إلي الدليل البسيط علي نحو موثوق. أيضًا، سيتم إنشاء اسم المستخدم الداخلي بناءً على المعرف الفريد العالمي إذا لم يتم تحديده أعلاه. يمكنك تجاوز الإعداد وتجاوز الخاصية حسب اختيارك. يجب عليك التأكد من إمكانية الوصول إلي الخاصية التي قمت باختيارها من قبل كل من المستخدمين والمجموعات وأنها فريدة. اتركه فارغًا للوضع الافتراضي. تصبح التغييرات نافذة فقط على مستخدمي ومجموعات بروتوكول الوصول إلي الدليل البسيط المعينين حديثًا (المضافين).",
+ "UUID Attribute for Users:" : "خاصية المعرف الفريد العالمي للمستخدمين:",
"UUID Attribute for Groups:" : "خاصية المعرف الفريد العالمي للمجموعات:",
+ "Username-LDAP User Mapping" : "اسم المستخدم- تعيين مستخدم بروتوكول الوصول إلي الدليل البسيط",
+ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "تُستخدم أسماء المستخدمين لتخزين وتخصيص البيانات التعريف الوصفية. من أجل تحديد المستخدمين والتعرف عليهم بدقة، سيكون لكل مستخدم خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\" اسم مستخدم داخلي. يتطلب هذا تعيينًا من اسم المستخدم إلى مستخدم خادوم بروتوكول الوصول إلي الدليل البسيط \"LDAP\". يتم تعيين اسم المستخدم الذي تم إنشاؤه إلى المعرف الفريد العالمي\"UUID\" لمستخدم LDAP. بالإضافة إلى ذلك، يتم تخزين الاسم المميز مؤقتًا أيضًا لتقليل تفاعل LDAP، ولكنه لا يستخدم لتحديد الهوية. وعند تغير الاسم المميز يتم العثور على التغييرات. ويتم استخدام اسم المستخدم الداخلي في كل مكان. مسح التعيينات سيكون له آثار متبقية في كل مكان. مسح التعيينات ليس حساسًا للتكوين، فهو يؤثر على جميع تكوينات LDAP! لا تقم مطلقًا بمسح التعيينات في بيئة الإنتاج، فقط في مرحلة الاختبار أو المرحلة التجريبية.",
+ "Clear Username-LDAP User Mapping" : "مسح اسم المستخدم- تعيين مستخدم بروتوكول الوصول إلي الدليل البسيط",
"Clear Groupname-LDAP Group Mapping" : "مسح اسم المجموعة - تعيين مجموعة بروتوكول الوصول إلي الدليل البسيط "
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
} \ No newline at end of file
diff --git a/apps/user_ldap/l10n/cs.js b/apps/user_ldap/l10n/cs.js
index 779e3a42e13..59cb5060ab0 100644
--- a/apps/user_ldap/l10n/cs.js
+++ b/apps/user_ldap/l10n/cs.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "Jedna uživatelská základní DN na řádku",
"User Search Attributes" : "Atributy vyhledávání uživatelů",
"Optional; one attribute per line" : "Volitelné, každý atribut na zvlášť řádek",
+ "Disable users missing from LDAP" : "Znepřístupnit uživatelské účty, které se nenachází v LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Pokud zapnuto, uživatelské účty naimportovaní z LDAP, kteří pak budou chybět, budou znepřístupněny.",
"Group Display Name Field" : "Kolonka zobrazovaného názvu skupiny",
"The LDAP attribute to use to generate the groups's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména skupiny.",
"Base Group Tree" : "Základ stromu skupin",
diff --git a/apps/user_ldap/l10n/cs.json b/apps/user_ldap/l10n/cs.json
index a848b0fdeea..74a28baf237 100644
--- a/apps/user_ldap/l10n/cs.json
+++ b/apps/user_ldap/l10n/cs.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "Jedna uživatelská základní DN na řádku",
"User Search Attributes" : "Atributy vyhledávání uživatelů",
"Optional; one attribute per line" : "Volitelné, každý atribut na zvlášť řádek",
+ "Disable users missing from LDAP" : "Znepřístupnit uživatelské účty, které se nenachází v LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Pokud zapnuto, uživatelské účty naimportovaní z LDAP, kteří pak budou chybět, budou znepřístupněny.",
"Group Display Name Field" : "Kolonka zobrazovaného názvu skupiny",
"The LDAP attribute to use to generate the groups's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména skupiny.",
"Base Group Tree" : "Základ stromu skupin",
diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js
index 9e6d329fb75..5c513f9f10e 100644
--- a/apps/user_ldap/l10n/de_DE.js
+++ b/apps/user_ldap/l10n/de_DE.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile",
"User Search Attributes" : "Benutzersucheigenschaften",
"Optional; one attribute per line" : "Optional; ein Attribut pro Zeile",
+ "Disable users missing from LDAP" : "Benutzer  deaktivieren, die in LDAP fehlen",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Beim Einschalten werden aus LDAP importierte und dann fehlende Benutzer deaktiviert",
"Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe",
"The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens der Gruppen.",
"Base Group Tree" : "Basis-Gruppenbaum",
diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json
index 351f1a0ddd7..95be9d5d7bc 100644
--- a/apps/user_ldap/l10n/de_DE.json
+++ b/apps/user_ldap/l10n/de_DE.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile",
"User Search Attributes" : "Benutzersucheigenschaften",
"Optional; one attribute per line" : "Optional; ein Attribut pro Zeile",
+ "Disable users missing from LDAP" : "Benutzer  deaktivieren, die in LDAP fehlen",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Beim Einschalten werden aus LDAP importierte und dann fehlende Benutzer deaktiviert",
"Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe",
"The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens der Gruppen.",
"Base Group Tree" : "Basis-Gruppenbaum",
diff --git a/apps/user_ldap/l10n/en_GB.js b/apps/user_ldap/l10n/en_GB.js
index c0a638cf50b..95af6d42a27 100644
--- a/apps/user_ldap/l10n/en_GB.js
+++ b/apps/user_ldap/l10n/en_GB.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "One User Base DN per line",
"User Search Attributes" : "User Search Attributes",
"Optional; one attribute per line" : "Optional; one attribute per line",
+ "Disable users missing from LDAP" : "Disable users missing from LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled",
"Group Display Name Field" : "Group Display Name Field",
"The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the group's display name.",
"Base Group Tree" : "Base Group Tree",
diff --git a/apps/user_ldap/l10n/en_GB.json b/apps/user_ldap/l10n/en_GB.json
index c974665c560..29aa75db02d 100644
--- a/apps/user_ldap/l10n/en_GB.json
+++ b/apps/user_ldap/l10n/en_GB.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "One User Base DN per line",
"User Search Attributes" : "User Search Attributes",
"Optional; one attribute per line" : "Optional; one attribute per line",
+ "Disable users missing from LDAP" : "Disable users missing from LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled",
"Group Display Name Field" : "Group Display Name Field",
"The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the group's display name.",
"Base Group Tree" : "Base Group Tree",
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index 32ca55b2bab..5116c854416 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "Un DN base de usuario por liña",
"User Search Attributes" : "Atributos de busca do usuario",
"Optional; one attribute per line" : "Opcional; un atributo por liña",
+ "Disable users missing from LDAP" : "Desactivar usuarios que faltan en LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Cando estea activado, desactivaranse os usuarios importados de LDAP e que logo faltan",
"Group Display Name Field" : "Campo de nome de grupo para amosar",
"The LDAP attribute to use to generate the groups's display name." : "O atributo LDAP úsase para xerar os nomes dos grupos que amosar.",
"Base Group Tree" : "Base da árbore de grupo",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index 8cf049d2112..5f0d7ec7e1f 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "Un DN base de usuario por liña",
"User Search Attributes" : "Atributos de busca do usuario",
"Optional; one attribute per line" : "Opcional; un atributo por liña",
+ "Disable users missing from LDAP" : "Desactivar usuarios que faltan en LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Cando estea activado, desactivaranse os usuarios importados de LDAP e que logo faltan",
"Group Display Name Field" : "Campo de nome de grupo para amosar",
"The LDAP attribute to use to generate the groups's display name." : "O atributo LDAP úsase para xerar os nomes dos grupos que amosar.",
"Base Group Tree" : "Base da árbore de grupo",
diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js
index 56747ba155c..c675878b3be 100644
--- a/apps/user_ldap/l10n/ru.js
+++ b/apps/user_ldap/l10n/ru.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "По одной базовому DN пользователей в строке.",
"User Search Attributes" : "Атрибуты поиска пользователей",
"Optional; one attribute per line" : "Опционально; один атрибут в строке",
+ "Disable users missing from LDAP" : "Отключить пользователей, отсутствующих в LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "При включении пользователи, которые были импортированы из LDAP, а затем отсутствуют в последующих синхронизациях, будут отключены",
"Group Display Name Field" : "Поле отображаемого имени группы",
"The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, который используется для генерации отображаемого имени группы.",
"Base Group Tree" : "База дерева групп",
diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json
index f97a17a182a..bdd69e53d8d 100644
--- a/apps/user_ldap/l10n/ru.json
+++ b/apps/user_ldap/l10n/ru.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "По одной базовому DN пользователей в строке.",
"User Search Attributes" : "Атрибуты поиска пользователей",
"Optional; one attribute per line" : "Опционально; один атрибут в строке",
+ "Disable users missing from LDAP" : "Отключить пользователей, отсутствующих в LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "При включении пользователи, которые были импортированы из LDAP, а затем отсутствуют в последующих синхронизациях, будут отключены",
"Group Display Name Field" : "Поле отображаемого имени группы",
"The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, который используется для генерации отображаемого имени группы.",
"Base Group Tree" : "База дерева групп",
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index 0dd3fe3c7da..704b28a0dc9 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "Један Корисников јединствени назив DN по линији",
"User Search Attributes" : "Параметри претраге корисника",
"Optional; one attribute per line" : "Опционо; један параметар по линији",
+ "Disable users missing from LDAP" : "Искључи кориниске којих нема у LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Када је укључено, корисници који се увезу из LDAP па онда недостају ће се искључити",
"Group Display Name Field" : "Име приказа групе",
"The LDAP attribute to use to generate the groups's display name." : "LDAP параметар за формирање имена за приказ група.",
"Base Group Tree" : "Стабло основне групе",
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index 4a743428361..d41b0005aa3 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "Један Корисников јединствени назив DN по линији",
"User Search Attributes" : "Параметри претраге корисника",
"Optional; one attribute per line" : "Опционо; један параметар по линији",
+ "Disable users missing from LDAP" : "Искључи кориниске којих нема у LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Када је укључено, корисници који се увезу из LDAP па онда недостају ће се искључити",
"Group Display Name Field" : "Име приказа групе",
"The LDAP attribute to use to generate the groups's display name." : "LDAP параметар за формирање имена за приказ група.",
"Base Group Tree" : "Стабло основне групе",
diff --git a/apps/user_ldap/l10n/sv.js b/apps/user_ldap/l10n/sv.js
index a735c6d53dc..f7b5a5cb38d 100644
--- a/apps/user_ldap/l10n/sv.js
+++ b/apps/user_ldap/l10n/sv.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "En användarstart-DN per rad",
"User Search Attributes" : "Användarsökningsattribut",
"Optional; one attribute per line" : "Valfritt; ett attribut per rad",
+ "Disable users missing from LDAP" : "Inaktivera användare som saknas via LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "När aktiverad kommer användare som importerats från LDAP som sedan saknas att inaktiveras",
"Group Display Name Field" : "Attribut för gruppnamn",
"The LDAP attribute to use to generate the groups's display name." : "LDAP-attributet som ska användas för att generera gruppens visningsnamn.",
"Base Group Tree" : "Bas för grupper i katalogtjänst",
diff --git a/apps/user_ldap/l10n/sv.json b/apps/user_ldap/l10n/sv.json
index 3b629de3d5e..b81cf360a2b 100644
--- a/apps/user_ldap/l10n/sv.json
+++ b/apps/user_ldap/l10n/sv.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "En användarstart-DN per rad",
"User Search Attributes" : "Användarsökningsattribut",
"Optional; one attribute per line" : "Valfritt; ett attribut per rad",
+ "Disable users missing from LDAP" : "Inaktivera användare som saknas via LDAP",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "När aktiverad kommer användare som importerats från LDAP som sedan saknas att inaktiveras",
"Group Display Name Field" : "Attribut för gruppnamn",
"The LDAP attribute to use to generate the groups's display name." : "LDAP-attributet som ska användas för att generera gruppens visningsnamn.",
"Base Group Tree" : "Bas för grupper i katalogtjänst",
diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js
index cdf8ff0a098..68d504c4dee 100644
--- a/apps/user_ldap/l10n/tr.js
+++ b/apps/user_ldap/l10n/tr.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "Her Satıra Bir Kullanıcı Base DN",
"User Search Attributes" : "Kullanıcı arama öznitelikleri",
"Optional; one attribute per line" : "İsteğe bağlı; her satıra bir öznitelik",
+ "Disable users missing from LDAP" : "LDAP üzerinde bulunmayan kullanıcılar devre dışı bırakılsın",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Bu seçenek etkinleştirildiğinde, LDAP üzerinden içe aktarılmış ancak daha sonra kaybolmuş kullanıcılar devre dışı bırakılır",
"Group Display Name Field" : "Görüntülenecek Grup Adı Alanı",
"The LDAP attribute to use to generate the groups's display name." : "Görüntülenecek grup adını oluşturmak için kullanılacak LDAP özniteliği.",
"Base Group Tree" : "Temel Grup Ağacı",
diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json
index 4c07f79e6db..99eeb463f7a 100644
--- a/apps/user_ldap/l10n/tr.json
+++ b/apps/user_ldap/l10n/tr.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "Her Satıra Bir Kullanıcı Base DN",
"User Search Attributes" : "Kullanıcı arama öznitelikleri",
"Optional; one attribute per line" : "İsteğe bağlı; her satıra bir öznitelik",
+ "Disable users missing from LDAP" : "LDAP üzerinde bulunmayan kullanıcılar devre dışı bırakılsın",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "Bu seçenek etkinleştirildiğinde, LDAP üzerinden içe aktarılmış ancak daha sonra kaybolmuş kullanıcılar devre dışı bırakılır",
"Group Display Name Field" : "Görüntülenecek Grup Adı Alanı",
"The LDAP attribute to use to generate the groups's display name." : "Görüntülenecek grup adını oluşturmak için kullanılacak LDAP özniteliği.",
"Base Group Tree" : "Temel Grup Ağacı",
diff --git a/apps/user_ldap/l10n/zh_HK.js b/apps/user_ldap/l10n/zh_HK.js
index f8e39d59e32..9c06929c251 100644
--- a/apps/user_ldap/l10n/zh_HK.js
+++ b/apps/user_ldap/l10n/zh_HK.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "一行一個用戶 Base DN",
"User Search Attributes" : "用戶搜尋屬性",
"Optional; one attribute per line" : "非必要,一行一項屬性",
+ "Disable users missing from LDAP" : "停用 LDAP 中找不到的的用戶",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後找不到的的用戶將被停用",
"Group Display Name Field" : "群組顯示名稱欄位",
"The LDAP attribute to use to generate the groups's display name." : "LDAP設定值,用於產生用戶群組的顯示名稱",
"Base Group Tree" : "基本群組樹",
diff --git a/apps/user_ldap/l10n/zh_HK.json b/apps/user_ldap/l10n/zh_HK.json
index 31b7e606335..1a24b8c0f11 100644
--- a/apps/user_ldap/l10n/zh_HK.json
+++ b/apps/user_ldap/l10n/zh_HK.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "一行一個用戶 Base DN",
"User Search Attributes" : "用戶搜尋屬性",
"Optional; one attribute per line" : "非必要,一行一項屬性",
+ "Disable users missing from LDAP" : "停用 LDAP 中找不到的的用戶",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後找不到的的用戶將被停用",
"Group Display Name Field" : "群組顯示名稱欄位",
"The LDAP attribute to use to generate the groups's display name." : "LDAP設定值,用於產生用戶群組的顯示名稱",
"Base Group Tree" : "基本群組樹",
diff --git a/apps/user_ldap/l10n/zh_TW.js b/apps/user_ldap/l10n/zh_TW.js
index bf4569b9e61..eab5f928228 100644
--- a/apps/user_ldap/l10n/zh_TW.js
+++ b/apps/user_ldap/l10n/zh_TW.js
@@ -155,6 +155,8 @@ OC.L10N.register(
"One User Base DN per line" : "一行一個使用者 Base DN",
"User Search Attributes" : "User Search Attributes",
"Optional; one attribute per line" : "非必要,一行一項屬性",
+ "Disable users missing from LDAP" : "停用 LDAP 中缺少的使用者",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後遺失的使用者將被停用",
"Group Display Name Field" : "群組顯示名稱欄位",
"The LDAP attribute to use to generate the groups's display name." : "用於生成群組顯示名稱的 LDAP 屬性。",
"Base Group Tree" : "Base Group Tree",
diff --git a/apps/user_ldap/l10n/zh_TW.json b/apps/user_ldap/l10n/zh_TW.json
index 5312e5718b7..4155fe4d91d 100644
--- a/apps/user_ldap/l10n/zh_TW.json
+++ b/apps/user_ldap/l10n/zh_TW.json
@@ -153,6 +153,8 @@
"One User Base DN per line" : "一行一個使用者 Base DN",
"User Search Attributes" : "User Search Attributes",
"Optional; one attribute per line" : "非必要,一行一項屬性",
+ "Disable users missing from LDAP" : "停用 LDAP 中缺少的使用者",
+ "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後遺失的使用者將被停用",
"Group Display Name Field" : "群組顯示名稱欄位",
"The LDAP attribute to use to generate the groups's display name." : "用於生成群組顯示名稱的 LDAP 屬性。",
"Base Group Tree" : "Base Group Tree",
diff --git a/apps/user_ldap/lib/Configuration.php b/apps/user_ldap/lib/Configuration.php
index 5a0fcc79ab8..36258f5ad27 100644
--- a/apps/user_ldap/lib/Configuration.php
+++ b/apps/user_ldap/lib/Configuration.php
@@ -115,6 +115,7 @@ class Configuration {
'ldapExpertUsernameAttr' => null,
'ldapExpertUUIDUserAttr' => null,
'ldapExpertUUIDGroupAttr' => null,
+ 'markRemnantsAsDisabled' => false,
'lastJpegPhotoLookup' => null,
'ldapNestedGroups' => false,
'ldapPagingSize' => null,
@@ -468,6 +469,7 @@ class Configuration {
'ldap_expert_uuid_group_attr' => '',
'has_memberof_filter_support' => 0,
'use_memberof_to_detect_membership' => 1,
+ 'ldap_mark_remnants_as_disabled' => 0,
'last_jpegPhoto_lookup' => 0,
'ldap_nested_groups' => 0,
'ldap_paging_size' => 500,
@@ -543,6 +545,7 @@ class Configuration {
'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr',
'has_memberof_filter_support' => 'hasMemberOfFilterSupport',
'use_memberof_to_detect_membership' => 'useMemberOfToDetectMembership',
+ 'ldap_mark_remnants_as_disabled' => 'markRemnantsAsDisabled',
'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup',
'ldap_nested_groups' => 'ldapNestedGroups',
'ldap_paging_size' => 'ldapPagingSize',
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 861fb1e246b..b47e51fdf70 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -63,6 +63,7 @@ use Psr\Log\LoggerInterface;
* @property string ldapEmailAttribute
* @property string ldapExtStorageHomeAttribute
* @property string homeFolderNamingRule
+ * @property bool|string markRemnantsAsDisabled
* @property bool|string ldapNestedGroups
* @property string[] ldapBaseGroups
* @property string ldapGroupFilter
diff --git a/apps/user_ldap/lib/User/DeletedUsersIndex.php b/apps/user_ldap/lib/User/DeletedUsersIndex.php
index 1e057987eef..d679ca86d93 100644
--- a/apps/user_ldap/lib/User/DeletedUsersIndex.php
+++ b/apps/user_ldap/lib/User/DeletedUsersIndex.php
@@ -24,6 +24,7 @@
namespace OCA\User_LDAP\User;
use OCA\User_LDAP\Mapping\UserMapping;
+use OCP\IConfig;
use OCP\Share\IManager;
/**
@@ -31,24 +32,16 @@ use OCP\Share\IManager;
* @package OCA\User_LDAP
*/
class DeletedUsersIndex {
- /**
- * @var \OCP\IConfig $config
- */
- protected $config;
-
- /**
- * @var \OCA\User_LDAP\Mapping\UserMapping $mapping
- */
- protected $mapping;
+ protected IConfig $config;
+ protected UserMapping $mapping;
+ protected ?array $deletedUsers = null;
+ private IManager $shareManager;
- /**
- * @var array $deletedUsers
- */
- protected $deletedUsers;
- /** @var IManager */
- private $shareManager;
-
- public function __construct(\OCP\IConfig $config, UserMapping $mapping, IManager $shareManager) {
+ public function __construct(
+ IConfig $config,
+ UserMapping $mapping,
+ IManager $shareManager
+ ) {
$this->config = $config;
$this->mapping = $mapping;
$this->shareManager = $shareManager;
@@ -56,11 +49,10 @@ class DeletedUsersIndex {
/**
* reads LDAP users marked as deleted from the database
- * @return \OCA\User_LDAP\User\OfflineUser[]
+ * @return OfflineUser[]
*/
- private function fetchDeletedUsers() {
- $deletedUsers = $this->config->getUsersForUserValue(
- 'user_ldap', 'isDeleted', '1');
+ private function fetchDeletedUsers(): array {
+ $deletedUsers = $this->config->getUsersForUserValue('user_ldap', 'isDeleted', '1');
$userObjects = [];
foreach ($deletedUsers as $user) {
@@ -73,9 +65,9 @@ class DeletedUsersIndex {
/**
* returns all LDAP users that are marked as deleted
- * @return \OCA\User_LDAP\User\OfflineUser[]
+ * @return OfflineUser[]
*/
- public function getUsers() {
+ public function getUsers(): array {
if (is_array($this->deletedUsers)) {
return $this->deletedUsers;
}
@@ -84,9 +76,8 @@ class DeletedUsersIndex {
/**
* whether at least one user was detected as deleted
- * @return bool
*/
- public function hasUsers() {
+ public function hasUsers(): bool {
if (!is_array($this->deletedUsers)) {
$this->fetchDeletedUsers();
}
@@ -96,12 +87,10 @@ class DeletedUsersIndex {
/**
* marks a user as deleted
*
- * @param string $ocName
* @throws \OCP\PreConditionNotMetException
*/
- public function markUser($ocName) {
- $curValue = $this->config->getUserValue($ocName, 'user_ldap', 'isDeleted', '0');
- if ($curValue === '1') {
+ public function markUser(string $ocName): void {
+ if ($this->isUserMarked($ocName)) {
// the user is already marked, do not write to DB again
return;
}
@@ -109,4 +98,8 @@ class DeletedUsersIndex {
$this->config->setUserValue($ocName, 'user_ldap', 'foundDeleted', (string)time());
$this->deletedUsers = null;
}
+
+ public function isUserMarked(string $ocName): bool {
+ return ($this->config->getUserValue($ocName, 'user_ldap', 'isDeleted', '0') === '1');
+ }
}
diff --git a/apps/user_ldap/lib/User_LDAP.php b/apps/user_ldap/lib/User_LDAP.php
index 772b2f46095..f9ae6bbee66 100644
--- a/apps/user_ldap/lib/User_LDAP.php
+++ b/apps/user_ldap/lib/User_LDAP.php
@@ -42,6 +42,7 @@ use OC\ServerNotAvailableException;
use OC\User\Backend;
use OC\User\NoUserException;
use OCA\User_LDAP\Exceptions\NotOnLDAP;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User\OfflineUser;
use OCA\User_LDAP\User\User;
use OCP\IConfig;
@@ -50,34 +51,32 @@ use OCP\IUserSession;
use OCP\Notification\IManager as INotificationManager;
use OCP\User\Backend\ICountMappedUsersBackend;
use OCP\User\Backend\ICountUsersBackend;
+use OCP\User\Backend\IProvideEnabledStateBackend;
use OCP\UserInterface;
use Psr\Log\LoggerInterface;
-class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, IUserLDAP, ICountUsersBackend, ICountMappedUsersBackend {
- /** @var \OCP\IConfig */
- protected $ocConfig;
-
- /** @var INotificationManager */
- protected $notificationManager;
-
- /** @var UserPluginManager */
- protected $userPluginManager;
-
- /** @var LoggerInterface */
- protected $logger;
-
- /**
- * @param Access $access
- * @param \OCP\IConfig $ocConfig
- * @param \OCP\Notification\IManager $notificationManager
- * @param IUserSession $userSession
- */
- public function __construct(Access $access, IConfig $ocConfig, INotificationManager $notificationManager, IUserSession $userSession, UserPluginManager $userPluginManager) {
+class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, IUserLDAP, ICountUsersBackend, ICountMappedUsersBackend, IProvideEnabledStateBackend {
+ protected IConfig $ocConfig;
+ protected INotificationManager $notificationManager;
+ protected UserPluginManager $userPluginManager;
+ protected LoggerInterface $logger;
+ protected DeletedUsersIndex $deletedUsersIndex;
+
+ public function __construct(
+ Access $access,
+ IConfig $ocConfig,
+ INotificationManager $notificationManager,
+ IUserSession $userSession,
+ UserPluginManager $userPluginManager,
+ LoggerInterface $logger,
+ DeletedUsersIndex $deletedUsersIndex,
+ ) {
parent::__construct($access);
$this->ocConfig = $ocConfig;
$this->notificationManager = $notificationManager;
$this->userPluginManager = $userPluginManager;
- $this->logger = \OC::$server->get(LoggerInterface::class);
+ $this->logger = $logger;
+ $this->deletedUsersIndex = $deletedUsersIndex;
}
/**
@@ -392,13 +391,13 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I
}
}
- $marked = (int)$this->ocConfig->getUserValue($uid, 'user_ldap', 'isDeleted', 0);
- if ($marked === 0) {
+ $marked = $this->deletedUsersIndex->isUserMarked($uid);
+ if (!$marked) {
try {
$user = $this->access->userManager->get($uid);
if (($user instanceof User) && !$this->userExistsOnLDAP($uid, true)) {
$user->markUser();
- $marked = 1;
+ $marked = true;
}
} catch (\Exception $e) {
$this->logger->debug(
@@ -406,7 +405,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I
['app' => 'user_ldap', 'exception' => $e]
);
}
- if ($marked === 0) {
+ if (!$marked) {
$this->logger->notice(
'User '.$uid . ' is not marked as deleted, not cleaning up.',
['app' => 'user_ldap']
@@ -669,4 +668,21 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I
}
return false;
}
+
+ public function isUserEnabled(string $uid, callable $queryDatabaseValue): bool {
+ if ($this->deletedUsersIndex->isUserMarked($uid) && ((int)$this->access->connection->markRemnantsAsDisabled === 1)) {
+ return false;
+ } else {
+ return $queryDatabaseValue();
+ }
+ }
+
+ public function setUserEnabled(string $uid, bool $enabled, callable $queryDatabaseValue, callable $setDatabaseValue): bool {
+ $setDatabaseValue($enabled);
+ return $enabled;
+ }
+
+ public function getDisabledUserList(int $offset = 0, ?int $limit = null): array {
+ throw new \Exception('This is implemented directly in User_Proxy');
+ }
}
diff --git a/apps/user_ldap/lib/User_Proxy.php b/apps/user_ldap/lib/User_Proxy.php
index b07c632eeeb..0449c89bd24 100644
--- a/apps/user_ldap/lib/User_Proxy.php
+++ b/apps/user_ldap/lib/User_Proxy.php
@@ -31,20 +31,23 @@
*/
namespace OCA\User_LDAP;
+use OCA\User_LDAP\User\DeletedUsersIndex;
+use OCA\User_LDAP\User\OfflineUser;
use OCA\User_LDAP\User\User;
use OCP\IConfig;
use OCP\IUserBackend;
use OCP\IUserSession;
use OCP\Notification\IManager as INotificationManager;
+use OCP\UserInterface;
use OCP\User\Backend\ICountMappedUsersBackend;
use OCP\User\Backend\ICountUsersBackend;
-use OCP\UserInterface;
+use OCP\User\Backend\IProvideEnabledStateBackend;
+use Psr\Log\LoggerInterface;
-class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP, ICountUsersBackend, ICountMappedUsersBackend {
- /** @var array<string,User_LDAP> */
- private $backends = [];
- /** @var ?User_LDAP */
- private $refBackend = null;
+class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP, ICountUsersBackend, ICountMappedUsersBackend, IProvideEnabledStateBackend {
+ /** @var User_LDAP[] */
+ private array $backends = [];
+ private ?User_LDAP $refBackend = null;
private bool $isSetUp = false;
private Helper $helper;
@@ -52,6 +55,8 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP
private INotificationManager $notificationManager;
private IUserSession $userSession;
private UserPluginManager $userPluginManager;
+ private LoggerInterface $logger;
+ private DeletedUsersIndex $deletedUsersIndex;
public function __construct(
Helper $helper,
@@ -60,7 +65,9 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP
IConfig $ocConfig,
INotificationManager $notificationManager,
IUserSession $userSession,
- UserPluginManager $userPluginManager
+ UserPluginManager $userPluginManager,
+ LoggerInterface $logger,
+ DeletedUsersIndex $deletedUsersIndex,
) {
parent::__construct($ldap, $accessFactory);
$this->helper = $helper;
@@ -68,6 +75,8 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP
$this->notificationManager = $notificationManager;
$this->userSession = $userSession;
$this->userPluginManager = $userPluginManager;
+ $this->logger = $logger;
+ $this->deletedUsersIndex = $deletedUsersIndex;
}
protected function setup(): void {
@@ -77,8 +86,15 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP
$serverConfigPrefixes = $this->helper->getServerConfigurationPrefixes(true);
foreach ($serverConfigPrefixes as $configPrefix) {
- $this->backends[$configPrefix] =
- new User_LDAP($this->getAccess($configPrefix), $this->ocConfig, $this->notificationManager, $this->userSession, $this->userPluginManager);
+ $this->backends[$configPrefix] = new User_LDAP(
+ $this->getAccess($configPrefix),
+ $this->ocConfig,
+ $this->notificationManager,
+ $this->userSession,
+ $this->userPluginManager,
+ $this->logger,
+ $this->deletedUsersIndex,
+ );
if (is_null($this->refBackend)) {
$this->refBackend = &$this->backends[$configPrefix];
@@ -438,4 +454,23 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP
public function createUser($username, $password) {
return $this->handleRequest($username, 'createUser', [$username, $password]);
}
+
+ public function isUserEnabled(string $uid, callable $queryDatabaseValue): bool {
+ return $this->handleRequest($uid, 'isUserEnabled', [$uid, $queryDatabaseValue]);
+ }
+
+ public function setUserEnabled(string $uid, bool $enabled, callable $queryDatabaseValue, callable $setDatabaseValue): bool {
+ return $this->handleRequest($uid, 'setUserEnabled', [$uid, $enabled, $queryDatabaseValue, $setDatabaseValue]);
+ }
+
+ public function getDisabledUserList(int $offset = 0, ?int $limit = null): array {
+ return array_map(
+ fn (OfflineUser $user) => $user->getOCName(),
+ array_slice(
+ $this->deletedUsersIndex->getUsers(),
+ $offset,
+ $limit
+ )
+ );
+ }
}
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 916ff84b82a..ae4091288b5 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -1,6 +1,6 @@
<?php
-style('user_ldap', 'vendor/ui-multiselect/jquery.multiselect');
+style('user_ldap', 'vendor/ui-multiselect/jquery.multiselect');
script('user_ldap', [
'vendor/ui-multiselect/src/jquery.multiselect',
@@ -69,7 +69,7 @@ style('user_ldap', 'settings');
if (!function_exists('ldap_connect')) {
print_unescaped('<p class="ldapwarning">'.$l->t('<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.').'</p>');
}
- ?>
+?>
<?php require_once __DIR__ . '/part.wizard-server.php'; ?>
<?php require_once __DIR__ . '/part.wizard-userfilter.php'; ?>
<?php require_once __DIR__ . '/part.wizard-loginfilter.php'; ?>
@@ -91,20 +91,21 @@ style('user_ldap', 'settings');
<p><label for="ldap_user_display_name_2"><?php p($l->t('2nd User Display Name Field'));?></label><input type="text" id="ldap_user_display_name_2" name="ldap_user_display_name_2" data-default="<?php p($_['ldap_user_display_name_2_default']); ?>" aria-describedby="ldap_user_display_name_2_instructions" title="<?php p($l->t('Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.'));?>" /><p class="hidden-visually" id="ldap_user_display_name_2_instructions"><?php p($l->t('Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.'));?></p></p>
<p><label for="ldap_base_users"><?php p($l->t('Base User Tree'));?></label><textarea id="ldap_base_users" name="ldap_base_users" placeholder="<?php p($l->t('One User Base DN per line'));?>" data-default="<?php p($_['ldap_base_users_default']); ?>" aria-describedby="ldap_base_users_instructions" title="<?php p($l->t('Base User Tree'));?>"></textarea><p class="hidden-visually" id="ldap_base_users_instructions"><?php p($l->t('Base User Tree'));?></p></p>
<p><label for="ldap_attributes_for_user_search"><?php p($l->t('User Search Attributes'));?></label><textarea id="ldap_attributes_for_user_search" name="ldap_attributes_for_user_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_user_search_default']); ?>" aria-describedby="ldap_attributes_for_user_search_instructions" title="<?php p($l->t('User Search Attributes'));?>"></textarea><p class="hidden-visually" id="ldap_attributes_for_user_search_instructions"><?php p($l->t('User Search Attributes'));?></p></p>
+ <p><label for="ldap_mark_remnants_as_disabled"><?php p($l->t('Disable users missing from LDAP'));?></label><input type="checkbox" id="ldap_mark_remnants_as_disabled" name="ldap_mark_remnants_as_disabled" value="1" data-default="<?php p($_['ldap_mark_remnants_as_disabled_default']); ?>" aria-describedby="ldap_mark_remnants_as_disabled_instructions" title="<?php p($l->t('When switched on, users imported from LDAP which are then missing will be disabled'));?>" /><p class="hidden-visually" id="ldap_mark_remnants_as_disabled_instructions"><?php p($l->t('When switched on, users imported from LDAP which are then missing will be disabled'));?></p></p>
<p><label for="ldap_group_display_name"><?php p($l->t('Group Display Name Field'));?></label><input type="text" id="ldap_group_display_name" name="ldap_group_display_name" data-default="<?php p($_['ldap_group_display_name_default']); ?>" aria-describedby="ldap_group_display_name_instructions" title="<?php p($l->t('The LDAP attribute to use to generate the groups\'s display name.'));?>" /><p class="hidden-visually" id="ldap_group_display_name_instructions"><?php p($l->t('The LDAP attribute to use to generate the groups\'s display name.'));?></p></p>
<p><label for="ldap_base_groups"><?php p($l->t('Base Group Tree'));?></label><textarea id="ldap_base_groups" name="ldap_base_groups" placeholder="<?php p($l->t('One Group Base DN per line'));?>" data-default="<?php p($_['ldap_base_groups_default']); ?>" aria-describedby="ldap_base_groups_instructions" title="<?php p($l->t('Base Group Tree'));?>"></textarea><p class="hidden-visually" id="ldap_base_groups_instructions"><?php p($l->t('Base Group Tree'));?></p></p>
<p><label for="ldap_attributes_for_group_search"><?php p($l->t('Group Search Attributes'));?></label><textarea id="ldap_attributes_for_group_search" name="ldap_attributes_for_group_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_group_search_default']); ?>" aria-describedby="ldap_attributes_for_group_search_instructions" title="<?php p($l->t('Group Search Attributes'));?>"></textarea><p class="hidden-visually" id="ldap_attributes_for_group_search_instructions"><?php p($l->t('Group Search Attributes'));?></p></p>
<p><label for="ldap_group_member_assoc_attribute"><?php p($l->t('Group-Member association'));?></label><select id="ldap_group_member_assoc_attribute" name="ldap_group_member_assoc_attribute" data-default="<?php p($_['ldap_group_member_assoc_attribute_default']); ?>" ><option value="uniqueMember"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'uniqueMember')) {
- p(' selected');
- } ?>>uniqueMember</option><option value="memberUid"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'memberUid')) {
- p(' selected');
- } ?>>memberUid</option><option value="member"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'member')) {
- p(' selected');
- } ?>>member (AD)</option><option value="gidNumber"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'gidNumber')) {
- p(' selected');
- } ?>>gidNumber</option><option value="zimbraMailForwardingAddress"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'zimbraMailForwardingAddress')) {
- p(' selected');
- } ?>>zimbraMailForwardingAddress</option></select></p>
+ p(' selected');
+ } ?>>uniqueMember</option><option value="memberUid"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'memberUid')) {
+ p(' selected');
+ } ?>>memberUid</option><option value="member"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'member')) {
+ p(' selected');
+ } ?>>member (AD)</option><option value="gidNumber"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'gidNumber')) {
+ p(' selected');
+ } ?>>gidNumber</option><option value="zimbraMailForwardingAddress"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'zimbraMailForwardingAddress')) {
+ p(' selected');
+ } ?>>zimbraMailForwardingAddress</option></select></p>
<p><label for="ldap_dynamic_group_member_url"><?php p($l->t('Dynamic Group Member URL'));?></label><input type="text" id="ldap_dynamic_group_member_url" name="ldap_dynamic_group_member_url" aria-describedby="ldap_dynamic_group_member_url_instructions" title="<?php p($l->t('The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)'));?>" data-default="<?php p($_['ldap_dynamic_group_member_url_default']); ?>" /><p class="hidden-visually" id="ldap_dynamic_group_member_url_instructions"><?php p($l->t('The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)'));?></p></p>
<p><label for="ldap_nested_groups"><?php p($l->t('Nested Groups'));?></label><input type="checkbox" id="ldap_nested_groups" name="ldap_nested_groups" value="1" data-default="<?php p($_['ldap_nested_groups_default']); ?>" aria-describedby="ldap_nested_groups_instructions" title="<?php p($l->t('When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)'));?>" /><p class="hidden-visually" id="ldap_nested_groups_instructions"><?php p($l->t('When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)'));?></p></p>
<p><label for="ldap_paging_size"><?php p($l->t('Paging chunksize'));?></label><input type="number" id="ldap_paging_size" name="ldap_paging_size" aria-describedby="ldap_paging_size_instructions" title="<?php p($l->t('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.)'));?>" data-default="<?php p($_['ldap_paging_size_default']); ?>" /><p class="hidden-visually" id="ldap_paging_size_instructions"><?php p($l->t('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.)'));?></p></p>
diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php
index eb70c774e25..a742c0b8076 100644
--- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php
+++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php
@@ -28,8 +28,10 @@ use OCA\User_LDAP\GroupPluginManager;
use OCA\User_LDAP\Mapping\GroupMapping;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User_LDAP;
use OCA\User_LDAP\UserPluginManager;
+use Psr\Log\LoggerInterface;
require_once __DIR__ . '/../Bootstrap.php';
@@ -51,7 +53,7 @@ class IntegrationTestAttributeDetection extends AbstractIntegrationTest {
$groupMapper->clear();
$this->access->setGroupMapper($groupMapper);
- $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class));
+ $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->get(UserPluginManager::class), \OC::$server->get(LoggerInterface::class), \OC::$server->get(DeletedUsersIndex::class));
$userManager = \OC::$server->getUserManager();
$userManager->clearBackends();
$userManager->registerBackend($userBackend);
diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php
index 36c8ab4c0d3..7b8f9fda754 100644
--- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php
+++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php
@@ -26,8 +26,10 @@ namespace OCA\User_LDAP\Tests\Integration\Lib;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User_LDAP;
use OCA\User_LDAP\UserPluginManager;
+use Psr\Log\LoggerInterface;
require_once __DIR__ . '/../Bootstrap.php';
@@ -49,7 +51,7 @@ class IntegrationTestFetchUsersByLoginName extends AbstractIntegrationTest {
$this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
$this->mapping->clear();
$this->access->setUserMapper($this->mapping);
- $this->backend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class));
+ $this->backend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->get(UserPluginManager::class), \OC::$server->get(LoggerInterface::class), \OC::$server->get(DeletedUsersIndex::class));
}
/**
diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php
index b941fa6fc66..6b272d3ad3c 100644
--- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php
+++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php
@@ -27,8 +27,10 @@ namespace OCA\User_LDAP\Tests\Integration\Lib;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User_LDAP;
use OCA\User_LDAP\UserPluginManager;
+use Psr\Log\LoggerInterface;
require_once __DIR__ . '/../Bootstrap.php';
@@ -50,7 +52,7 @@ class IntegrationTestPaging extends AbstractIntegrationTest {
require(__DIR__ . '/../setup-scripts/createExplicitUsers.php');
parent::init();
- $this->backend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class));
+ $this->backend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->get(UserPluginManager::class), \OC::$server->get(LoggerInterface::class), \OC::$server->get(DeletedUsersIndex::class));
}
public function initConnection() {
diff --git a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php
index ec1cebbe087..c5b7f73bbcc 100644
--- a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php
+++ b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php
@@ -30,6 +30,7 @@ namespace OCA\User_LDAP\Tests\Integration\Lib\User;
use OCA\User_LDAP\FilesystemHelper;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User\Manager;
use OCA\User_LDAP\User\User;
use OCA\User_LDAP\User_LDAP;
@@ -53,7 +54,7 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest {
$this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
$this->mapping->clear();
$this->access->setUserMapper($this->mapping);
- $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class));
+ $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->get(UserPluginManager::class), \OC::$server->get(LoggerInterface::class), \OC::$server->get(DeletedUsersIndex::class));
\OC_User::useBackend($userBackend);
}
diff --git a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php
index 5da672d8a55..623d08d565d 100644
--- a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php
+++ b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php
@@ -26,8 +26,10 @@ namespace OCA\User_LDAP\Tests\Integration\Lib\User;
use OCA\User_LDAP\Jobs\CleanUp;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User_LDAP;
use OCA\User_LDAP\UserPluginManager;
+use Psr\Log\LoggerInterface;
require_once __DIR__ . '/../../Bootstrap.php';
@@ -46,7 +48,7 @@ class IntegrationTestUserCleanUp extends AbstractIntegrationTest {
$this->mapping->clear();
$this->access->setUserMapper($this->mapping);
- $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class));
+ $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->get(UserPluginManager::class), \OC::$server->get(LoggerInterface::class), \OC::$server->get(DeletedUsersIndex::class));
\OC_User::useBackend($userBackend);
}
diff --git a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php
index 993ceec5abb..666211fc898 100644
--- a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php
+++ b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php
@@ -26,8 +26,10 @@ namespace OCA\User_LDAP\Tests\Integration\Lib\User;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User_LDAP;
use OCA\User_LDAP\UserPluginManager;
+use Psr\Log\LoggerInterface;
require_once __DIR__ . '/../../Bootstrap.php';
@@ -45,7 +47,7 @@ class IntegrationTestUserDisplayName extends AbstractIntegrationTest {
$this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
$this->mapping->clear();
$this->access->setUserMapper($this->mapping);
- $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class));
+ $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->get(UserPluginManager::class), \OC::$server->get(LoggerInterface::class), \OC::$server->get(DeletedUsersIndex::class));
\OC_User::useBackend($userBackend);
}
diff --git a/apps/user_ldap/tests/User_LDAPTest.php b/apps/user_ldap/tests/User_LDAPTest.php
index e837471bab0..b561840b4a5 100644
--- a/apps/user_ldap/tests/User_LDAPTest.php
+++ b/apps/user_ldap/tests/User_LDAPTest.php
@@ -37,6 +37,7 @@ use OCA\User_LDAP\Access;
use OCA\User_LDAP\Connection;
use OCA\User_LDAP\Mapping\AbstractMapping;
use OCA\User_LDAP\Mapping\UserMapping;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User\Manager;
use OCA\User_LDAP\User\OfflineUser;
use OCA\User_LDAP\User\User;
@@ -48,6 +49,8 @@ use OCP\IConfig;
use OCP\IUser;
use OCP\Notification\IManager as INotificationManager;
use Test\TestCase;
+use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
/**
* Class Test_User_Ldap_Direct
@@ -59,22 +62,26 @@ use Test\TestCase;
class User_LDAPTest extends TestCase {
/** @var User_LDAP */
protected $backend;
- /** @var Access|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var Access|MockObject */
protected $access;
- /** @var OfflineUser|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var OfflineUser|MockObject */
protected $offlineUser;
- /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var IConfig|MockObject */
protected $config;
- /** @var INotificationManager|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var INotificationManager|MockObject */
protected $notificationManager;
- /** @var Session|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var Session|MockObject */
protected $session;
- /** @var UserPluginManager|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var UserPluginManager|MockObject */
protected $pluginManager;
- /** @var Connection|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var Connection|MockObject */
protected $connection;
- /** @var Manager|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var Manager|MockObject */
protected $userManager;
+ /** @var LoggerInterface|MockObject */
+ protected $logger;
+ /** @var DeletedUsersIndex|MockObject */
+ protected $deletedUsersIndex;
protected function setUp(): void {
parent::setUp();
@@ -95,12 +102,18 @@ class User_LDAPTest extends TestCase {
$this->session = $this->createMock(Session::class);
$this->pluginManager = $this->createMock(UserPluginManager::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
+
+ $this->deletedUsersIndex = $this->createMock(DeletedUsersIndex::class);
+
$this->backend = new User_LDAP(
$this->access,
$this->config,
$this->notificationManager,
$this->session,
- $this->pluginManager
+ $this->pluginManager,
+ $this->logger,
+ $this->deletedUsersIndex,
);
}
@@ -109,21 +122,21 @@ class User_LDAPTest extends TestCase {
->method('username2dn')
->willReturnCallback(function ($uid) {
switch ($uid) {
- case 'gunslinger':
- return 'dnOfRoland,dc=test';
- break;
- case 'formerUser':
- return 'dnOfFormerUser,dc=test';
- break;
- case 'newyorker':
- return 'dnOfNewYorker,dc=test';
- break;
- case 'ladyofshadows':
- return 'dnOfLadyOfShadows,dc=test';
- break;
- default:
- return false;
- }
+ case 'gunslinger':
+ return 'dnOfRoland,dc=test';
+ break;
+ case 'formerUser':
+ return 'dnOfFormerUser,dc=test';
+ break;
+ case 'newyorker':
+ return 'dnOfNewYorker,dc=test';
+ break;
+ case 'ladyofshadows':
+ return 'dnOfLadyOfShadows,dc=test';
+ break;
+ default:
+ return false;
+ }
});
$this->access->method('fetchUsersByLoginName')
@@ -199,7 +212,7 @@ class User_LDAPTest extends TestCase {
->method('get')
->willReturn($user);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
@@ -209,7 +222,7 @@ class User_LDAPTest extends TestCase {
public function testCheckPasswordWrongPassword() {
$this->prepareAccessForCheckPassword();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $backend->checkPassword('roland', 'wrong');
@@ -218,7 +231,7 @@ class User_LDAPTest extends TestCase {
public function testCheckPasswordWrongUser() {
$this->prepareAccessForCheckPassword();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $backend->checkPassword('mallory', 'evil');
@@ -233,7 +246,7 @@ class User_LDAPTest extends TestCase {
->method('get')
->willReturn(null);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $backend->checkPassword('roland', 'dt19');
@@ -251,7 +264,7 @@ class User_LDAPTest extends TestCase {
->method('get')
->willReturn($user);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$user = \OC::$server->getUserManager()->checkPassword('roland', 'dt19');
@@ -264,7 +277,7 @@ class User_LDAPTest extends TestCase {
public function testCheckPasswordPublicAPIWrongPassword() {
$this->prepareAccessForCheckPassword();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$user = \OC::$server->getUserManager()->checkPassword('roland', 'wrong');
@@ -277,7 +290,7 @@ class User_LDAPTest extends TestCase {
public function testCheckPasswordPublicAPIWrongUser() {
$this->prepareAccessForCheckPassword();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$user = \OC::$server->getUserManager()->checkPassword('mallory', 'evil');
@@ -289,7 +302,7 @@ class User_LDAPTest extends TestCase {
}
public function testDeleteUserCancel() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->deleteUser('notme');
$this->assertFalse($result);
}
@@ -309,10 +322,10 @@ class User_LDAPTest extends TestCase {
->method('getConnectionResource')
->willReturn('this is an ldap link');
- $this->config->expects($this->any())
- ->method('getUserValue')
- ->with($uid, 'user_ldap', 'isDeleted')
- ->willReturn('1');
+ $this->deletedUsersIndex->expects($this->once())
+ ->method('isUserMarked')
+ ->with($uid)
+ ->willReturn(true);
$offlineUser = $this->createMock(OfflineUser::class);
$offlineUser->expects($this->once())
@@ -322,7 +335,7 @@ class User_LDAPTest extends TestCase {
->method('get')
->willReturn($offlineUser);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->deleteUser($uid);
$this->assertTrue($result);
@@ -339,10 +352,10 @@ class User_LDAPTest extends TestCase {
->with('uid')
->willReturn(true);
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->with('uid', 'user_ldap', 'isDeleted', 0)
- ->willReturn(1);
+ $this->deletedUsersIndex->expects($this->once())
+ ->method('isUserMarked')
+ ->with('uid')
+ ->willReturn(true);
$mapper = $this->createMock(UserMapping::class);
$mapper->expects($this->once())
@@ -388,7 +401,7 @@ class User_LDAPTest extends TestCase {
} else {
$result = [];
foreach ($users as $user) {
- if (stripos($user, $search) !== false) {
+ if (stripos($user, $search) !== false) {
$result[] = $user;
}
}
@@ -411,7 +424,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersNoParam() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->getUsers();
$this->assertEquals(3, count($result));
@@ -419,7 +432,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersLimitOffset() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->getUsers('', 1, 2);
$this->assertEquals(1, count($result));
@@ -427,7 +440,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersLimitOffset2() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->getUsers('', 2, 1);
$this->assertEquals(2, count($result));
@@ -435,7 +448,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersSearchWithResult() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->getUsers('yo');
$this->assertEquals(2, count($result));
@@ -443,7 +456,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersSearchEmptyResult() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->getUsers('nix');
$this->assertEquals(0, count($result));
@@ -459,7 +472,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersViaAPINoParam() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $this->getUsers();
@@ -468,7 +481,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersViaAPILimitOffset() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $this->getUsers('', 1, 2);
@@ -477,7 +490,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersViaAPILimitOffset2() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $this->getUsers('', 2, 1);
@@ -486,7 +499,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersViaAPISearchWithResult() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $this->getUsers('yo');
@@ -495,7 +508,7 @@ class User_LDAPTest extends TestCase {
public function testGetUsersViaAPISearchEmptyResult() {
$this->prepareAccessForGetUsers();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$result = $this->getUsers('nix');
@@ -503,7 +516,7 @@ class User_LDAPTest extends TestCase {
}
public function testUserExists() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$user = $this->createMock(User::class);
@@ -522,7 +535,7 @@ class User_LDAPTest extends TestCase {
}
public function testUserExistsForDeleted() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$mapper = $this->createMock(UserMapping::class);
@@ -546,7 +559,7 @@ class User_LDAPTest extends TestCase {
}
public function testUserExistsForNeverExisting() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$this->access->expects($this->any())
@@ -565,7 +578,7 @@ class User_LDAPTest extends TestCase {
}
public function testUserExistsPublicAPI() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
\OC_User::useBackend($backend);
@@ -595,7 +608,7 @@ class User_LDAPTest extends TestCase {
}
public function testDeleteUserExisting() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
//we do not support deleting existing users at all
$result = $backend->deleteUser('gunslinger');
@@ -603,7 +616,7 @@ class User_LDAPTest extends TestCase {
}
public function testGetHomeAbsolutePath() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$this->connection->expects($this->any())
@@ -652,7 +665,7 @@ class User_LDAPTest extends TestCase {
}
public function testGetHomeRelative() {
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$dataDir = \OC::$server->getConfig()->getSystemValue(
@@ -706,7 +719,7 @@ class User_LDAPTest extends TestCase {
public function testGetHomeNoPath() {
$this->expectException(\Exception::class);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$this->connection->expects($this->any())
@@ -754,7 +767,7 @@ class User_LDAPTest extends TestCase {
public function testGetHomeDeletedUser() {
$uid = 'newyorker';
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$this->connection->expects($this->any())
@@ -810,7 +823,7 @@ class User_LDAPTest extends TestCase {
});
/** @noinspection PhpUnhandledExceptionInspection */
- $this->assertEquals($this->backend->getHome('uid'),'result');
+ $this->assertEquals($this->backend->getHome('uid'), 'result');
}
private function prepareAccessForGetDisplayName() {
@@ -829,16 +842,16 @@ class User_LDAPTest extends TestCase {
->method('readAttribute')
->willReturnCallback(function ($dn, $attr) {
switch ($dn) {
- case 'dnOfRoland,dc=test':
- if ($attr === 'displayname') {
- return ['Roland Deschain'];
- }
- return [];
- break;
-
- default:
- return false;
- }
+ case 'dnOfRoland,dc=test':
+ if ($attr === 'displayname') {
+ return ['Roland Deschain'];
+ }
+ return [];
+ break;
+
+ default:
+ return false;
+ }
});
$this->access->method('fetchUsersByLoginName')
->willReturn([]);
@@ -846,7 +859,7 @@ class User_LDAPTest extends TestCase {
public function testGetDisplayName() {
$this->prepareAccessForGetDisplayName();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$this->connection->expects($this->any())
@@ -927,7 +940,7 @@ class User_LDAPTest extends TestCase {
}
});
$this->prepareAccessForGetDisplayName();
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->prepareMockForUserExists();
$this->connection->expects($this->any())
@@ -998,7 +1011,7 @@ class User_LDAPTest extends TestCase {
->with('uid')
->willReturn('result');
- $this->assertEquals($this->backend->getDisplayName('uid'),'result');
+ $this->assertEquals($this->backend->getDisplayName('uid'), 'result');
}
//no test for getDisplayNames, because it just invokes getUsers and
@@ -1009,7 +1022,7 @@ class User_LDAPTest extends TestCase {
->method('countUsers')
->willReturn(5);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->countUsers();
$this->assertEquals(5, $result);
@@ -1020,7 +1033,7 @@ class User_LDAPTest extends TestCase {
->method('countUsers')
->willReturn(false);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$result = $backend->countUsers();
$this->assertFalse($result);
@@ -1035,7 +1048,7 @@ class User_LDAPTest extends TestCase {
->method('countUsers')
->willReturn(42);
- $this->assertEquals($this->backend->countUsers(),42);
+ $this->assertEquals($this->backend->countUsers(), 42);
}
public function testLoginName2UserNameSuccess() {
@@ -1064,7 +1077,7 @@ class User_LDAPTest extends TestCase {
->method('writeToCache')
->with($this->equalTo('loginName2UserName-'.$loginName), $this->equalTo($username));
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$user = $this->createMock(User::class);
$user->expects($this->any())
->method('getUsername')
@@ -1109,7 +1122,7 @@ class User_LDAPTest extends TestCase {
->method('getAttributes')
->willReturn(['dn', 'uid', 'mail', 'displayname']);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$name = $backend->loginName2UserName($loginName);
$this->assertSame(false, $name);
@@ -1146,7 +1159,7 @@ class User_LDAPTest extends TestCase {
->method('getAttributes')
->willReturn(['dn', 'uid', 'mail', 'displayname']);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$name = $backend->loginName2UserName($loginName);
$this->assertSame(false, $name);
@@ -1223,7 +1236,7 @@ class User_LDAPTest extends TestCase {
$this->userManager->expects($this->atLeastOnce())
->method('get')
->willReturn($this->createMock(User::class));
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$this->assertTrue(\OC_User::setPassword('roland', 'dt'));
@@ -1236,7 +1249,7 @@ class User_LDAPTest extends TestCase {
->method('get')
->willReturn($this->createMock(User::class));
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
$this->userManager->expects($this->any())
->method('get')
->willReturn($this->createMock(User::class));
@@ -1252,7 +1265,7 @@ class User_LDAPTest extends TestCase {
->willReturn($this->createMock(User::class));
$this->prepareAccessForSetPassword(false);
- $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager);
+ $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager, $this->logger, $this->deletedUsersIndex);
\OC_User::useBackend($backend);
$this->assertFalse(\OC_User::setPassword('roland', 'dt12234$'));
@@ -1295,11 +1308,11 @@ class User_LDAPTest extends TestCase {
->willReturn(true);
$this->pluginManager->expects($this->once())
->method('setPassword')
- ->with('uid','password')
+ ->with('uid', 'password')
->willReturn('result');
/** @noinspection PhpUnhandledExceptionInspection */
- $this->assertEquals($this->backend->setPassword('uid', 'password'),'result');
+ $this->assertEquals($this->backend->setPassword('uid', 'password'), 'result');
}
public function avatarDataProvider() {
@@ -1340,7 +1353,7 @@ class User_LDAPTest extends TestCase {
->with('uid')
->willReturn('result');
- $this->assertEquals($this->backend->canChangeAvatar('uid'),'result');
+ $this->assertEquals($this->backend->canChangeAvatar('uid'), 'result');
}
public function testSetDisplayNameWithPlugin() {
@@ -1413,7 +1426,7 @@ class User_LDAPTest extends TestCase {
->method('getUserMapper')
->willReturn($this->createMock(UserMapping::class));
- $this->assertEquals($this->backend->createUser($uid, $pwd),true);
+ $this->assertEquals($this->backend->createUser($uid, $pwd), true);
}
public function testCreateUserFailing() {
diff --git a/apps/user_ldap/tests/User_ProxyTest.php b/apps/user_ldap/tests/User_ProxyTest.php
index edeefeb4b0e..a557eb4bc6f 100644
--- a/apps/user_ldap/tests/User_ProxyTest.php
+++ b/apps/user_ldap/tests/User_ProxyTest.php
@@ -31,12 +31,14 @@ namespace OCA\User_LDAP\Tests;
use OCA\User_LDAP\AccessFactory;
use OCA\User_LDAP\Helper;
use OCA\User_LDAP\ILDAPWrapper;
+use OCA\User_LDAP\User\DeletedUsersIndex;
use OCA\User_LDAP\User_Proxy;
use OCA\User_LDAP\UserPluginManager;
use OCP\IConfig;
use OCP\IUserSession;
use OCP\Notification\IManager as INotificationManager;
use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
use Test\TestCase;
class User_ProxyTest extends TestCase {
@@ -56,6 +58,10 @@ class User_ProxyTest extends TestCase {
private $proxy;
/** @var UserPluginManager|MockObject */
private $userPluginManager;
+ /** @var LoggerInterface|MockObject */
+ protected $logger;
+ /** @var DeletedUsersIndex|MockObject */
+ protected $deletedUsersIndex;
protected function setUp(): void {
parent::setUp();
@@ -67,6 +73,8 @@ class User_ProxyTest extends TestCase {
$this->notificationManager = $this->createMock(INotificationManager::class);
$this->userSession = $this->createMock(IUserSession::class);
$this->userPluginManager = $this->createMock(UserPluginManager::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
+ $this->deletedUsersIndex = $this->createMock(DeletedUsersIndex::class);
$this->proxy = $this->getMockBuilder(User_Proxy::class)
->setConstructorArgs([
$this->helper,
@@ -75,7 +83,9 @@ class User_ProxyTest extends TestCase {
$this->config,
$this->notificationManager,
$this->userSession,
- $this->userPluginManager
+ $this->userPluginManager,
+ $this->logger,
+ $this->deletedUsersIndex,
])
->setMethods(['handleRequest'])
->getMock();
diff --git a/apps/user_status/composer/composer/ClassLoader.php b/apps/user_status/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/user_status/composer/composer/ClassLoader.php
+++ b/apps/user_status/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/user_status/composer/composer/installed.php b/apps/user_status/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/user_status/composer/composer/installed.php
+++ b/apps/user_status/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/user_status/l10n/et_EE.js b/apps/user_status/l10n/et_EE.js
index 14d9129cb2e..967ed4e9842 100644
--- a/apps/user_status/l10n/et_EE.js
+++ b/apps/user_status/l10n/et_EE.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"What is your status?" : "Mis on su staatus?",
"Predefined statuses" : "Eeldefineeritud staatused",
"Status message" : "Staatuse teade",
+ "Clear status message" : "Tühjenda staatuseteade",
"Away" : "Eemal",
"Do not disturb" : "Mitte segada",
"Don't clear" : "Ära tühjenda",
diff --git a/apps/user_status/l10n/et_EE.json b/apps/user_status/l10n/et_EE.json
index 35c3e23a740..8d48bd54124 100644
--- a/apps/user_status/l10n/et_EE.json
+++ b/apps/user_status/l10n/et_EE.json
@@ -11,6 +11,7 @@
"What is your status?" : "Mis on su staatus?",
"Predefined statuses" : "Eeldefineeritud staatused",
"Status message" : "Staatuse teade",
+ "Clear status message" : "Tühjenda staatuseteade",
"Away" : "Eemal",
"Do not disturb" : "Mitte segada",
"Don't clear" : "Ära tühjenda",
diff --git a/apps/user_status/lib/Capabilities.php b/apps/user_status/lib/Capabilities.php
index 5b3e105d31a..67e73f2733c 100644
--- a/apps/user_status/lib/Capabilities.php
+++ b/apps/user_status/lib/Capabilities.php
@@ -40,9 +40,6 @@ class Capabilities implements ICapability {
$this->emojiHelper = $emojiHelper;
}
- /**
- * @inheritDoc
- */
public function getCapabilities() {
return [
'user_status' => [
diff --git a/apps/user_status/src/components/CustomMessageInput.vue b/apps/user_status/src/components/CustomMessageInput.vue
index 5e313c97428..5013c97f784 100644
--- a/apps/user_status/src/components/CustomMessageInput.vue
+++ b/apps/user_status/src/components/CustomMessageInput.vue
@@ -38,9 +38,7 @@
:placeholder="$t('user_status', 'What is your status?')"
type="text"
:value="message"
- @change="onChange"
- @keyup="onKeyup"
- @paste="onKeyup">
+ @input="onChange">
</div>
</div>
</template>
@@ -100,12 +98,8 @@ export default {
*
* @param {Event} event The Change Event
*/
- onKeyup(event) {
- this.$emit('change', event.target.value)
- },
-
onChange(event) {
- this.$emit('submit', event.target.value)
+ this.$emit('change', event.target.value)
},
setIcon(icon) {
diff --git a/apps/user_status/src/components/SetStatusModal.vue b/apps/user_status/src/components/SetStatusModal.vue
index 4eba6c70352..d40c3b68170 100644
--- a/apps/user_status/src/components/SetStatusModal.vue
+++ b/apps/user_status/src/components/SetStatusModal.vue
@@ -38,45 +38,46 @@
@select="changeStatus" />
</div>
- <!-- Status message -->
- <div class="set-status-modal__header">
- <h2>{{ $t('user_status', 'Status message') }}</h2>
- </div>
- <div class="set-status-modal__custom-input">
- <CustomMessageInput ref="customMessageInput"
- :icon="icon"
- :message="editedMessage"
- @change="setMessage"
- @submit="saveStatus"
- @select-icon="setIcon" />
- </div>
- <div v-if="hasBackupStatus"
- class="set-status-modal__automation-hint">
- {{ $t('user_status', 'Your status was set automatically') }}
- </div>
- <PreviousStatus v-if="hasBackupStatus"
- :icon="backupIcon"
- :message="backupMessage"
- @select="revertBackupFromServer" />
- <PredefinedStatusesList :is-custom-status="isCustomStatus" @select-status="selectPredefinedMessage" />
- <ClearAtSelect :clear-at="clearAt"
- @select-clear-at="setClearAt" />
- <div class="status-buttons">
- <NcButton :wide="true"
- type="tertiary"
- :text="$t('user_status', 'Clear status message')"
- :disabled="isSavingStatus"
- @click="clearStatus">
- {{ $t('user_status', 'Clear status message') }}
- </NcButton>
- <NcButton :wide="true"
- type="primary"
- :text="$t('user_status', 'Set status message')"
- :disabled="isSavingStatus"
- @click="saveStatus">
- {{ $t('user_status', 'Set status message') }}
- </NcButton>
- </div>
+ <!-- Status message form -->
+ <form @submit.prevent="saveStatus" @reset="clearStatus">
+ <div class="set-status-modal__header">
+ <h2>{{ $t('user_status', 'Status message') }}</h2>
+ </div>
+ <div class="set-status-modal__custom-input">
+ <CustomMessageInput ref="customMessageInput"
+ :icon="icon"
+ :message="editedMessage"
+ @change="setMessage"
+ @select-icon="setIcon" />
+ </div>
+ <div v-if="hasBackupStatus"
+ class="set-status-modal__automation-hint">
+ {{ $t('user_status', 'Your status was set automatically') }}
+ </div>
+ <PreviousStatus v-if="hasBackupStatus"
+ :icon="backupIcon"
+ :message="backupMessage"
+ @select="revertBackupFromServer" />
+ <PredefinedStatusesList :is-custom-status="isCustomStatus" @select-status="selectPredefinedMessage" />
+ <ClearAtSelect :clear-at="clearAt"
+ @select-clear-at="setClearAt" />
+ <div class="status-buttons">
+ <NcButton :wide="true"
+ type="tertiary"
+ native-type="reset"
+ :aria-label="$t('user_status', 'Clear status message')"
+ :disabled="isSavingStatus">
+ {{ $t('user_status', 'Clear status message') }}
+ </NcButton>
+ <NcButton :wide="true"
+ type="primary"
+ native-type="submit"
+ :aria-label="$t('user_status', 'Set status message')"
+ :disabled="isSavingStatus">
+ {{ $t('user_status', 'Set status message') }}
+ </NcButton>
+ </div>
+ </form>
</div>
</NcModal>
</template>
@@ -245,12 +246,7 @@ export default {
try {
this.isSavingStatus = true
- if (this.messageId !== undefined && this.messageId !== null) {
- await this.$store.dispatch('setPredefinedMessage', {
- messageId: this.messageId,
- clearAt: this.clearAt,
- })
- } else {
+ if (this.isCustomStatus) {
await this.$store.dispatch('setCustomMessage', {
message: this.editedMessage,
icon: this.icon,
diff --git a/apps/user_status/src/store/predefinedStatuses.js b/apps/user_status/src/store/predefinedStatuses.js
index 0c540e5ddee..1bfb02ec569 100644
--- a/apps/user_status/src/store/predefinedStatuses.js
+++ b/apps/user_status/src/store/predefinedStatuses.js
@@ -35,7 +35,7 @@ const mutations = {
* @param {object} status The status to add
*/
addPredefinedStatus(state, status) {
- state.predefinedStatuses.push(status)
+ state.predefinedStatuses = [...state.predefinedStatuses, status]
},
}
diff --git a/apps/weather_status/composer/composer/ClassLoader.php b/apps/weather_status/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/weather_status/composer/composer/ClassLoader.php
+++ b/apps/weather_status/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/weather_status/composer/composer/installed.php b/apps/weather_status/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/weather_status/composer/composer/installed.php
+++ b/apps/weather_status/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/weather_status/l10n/ar.js b/apps/weather_status/l10n/ar.js
new file mode 100644
index 00000000000..6b17e06b637
--- /dev/null
+++ b/apps/weather_status/l10n/ar.js
@@ -0,0 +1,50 @@
+OC.L10N.register(
+ "weather_status",
+ {
+ "Unknown address" : "عنوان غير معروف",
+ "No result." : "لا يوجد نتيجة",
+ "Malformed JSON data." : "بيانات JSON غير مكونة بشكل صحيح",
+ "Error" : "خطأ",
+ "Weather status" : "حالة الطقس",
+ "Weather status in your dashboard" : "حالة الطقس على لوحتك",
+ "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "تمّ دمج حالة الطقس في تطبيق لوحة القيادة dashboard. يمكن تحديد الموقع الجغرافي للمستخدم تلقائيًا أو تحديده يدويًا. يتم بعد ذلك عرض توقعات الطفس في الـ 6 ساعات القادمة. يمكن أيضًا دمج حالة الطقس هذه في أماكن أخرى مثل تطبيق التقويم.",
+ "Detect location" : "تحديد الموقع الجغرافي",
+ "Set custom address" : "تعيين عنوان مُخصّص",
+ "Favorites" : "المُفضّلة",
+ "{temperature} {unit} clear sky later today" : "{temperature} {unit} سماءٌ صَحْوٌ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} clear sky" : "{temperature} {unit} سماءٌ صَحْوُ",
+ "{temperature} {unit} cloudy later today" : "{temperature} {unit} طقسٌ مُغيّمٌ في وقت لاحقٍ من اليوم",
+ "{temperature} {unit} cloudy" : "{temperature} {unit} غائم",
+ "{temperature} {unit} fair weather later today" : "{temperature} {unit} طقسٌ مُعتَدِلٌ في وقت لاحق من اليوم",
+ "{temperature} {unit} fair weather" : "{temperature} {unit} طقسٌ مُعتَدِلٌ",
+ "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} غائمٌ جزئيّاً في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} partly cloudy" : "{temperature} {unit} غائمٌ جزئيّاً ",
+ "{temperature} {unit} foggy later today" : "{temperature} {unit} ضبابيٌّ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} foggy" : "{temperature} {unit} ضبابيٌّ",
+ "{temperature} {unit} light rainfall later today" : "{temperature} {unit} هُطولُ أمطارٍ خفيفةٍ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} light rainfall" : "{temperature} {unit} هُطولُ أمطارٍ خفيفةٍ ",
+ "{temperature} {unit} rainfall later today" : "{temperature} {unit} مُمطِرٌ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} rainfall" : "{temperature} {unit} مُمطِرٌ ",
+ "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} heavy rainfall" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ ",
+ "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} هُطولُ زخّاتٍ من المطر في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} rainfall showers" : "{temperature} {unit} هُطولُ زخّاتٍ من المطر ",
+ "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} هُطولُ زخّاتٍ خفيفةٍ من المطر في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} light rainfall showers" : "{temperature} {unit} هُطولُ زخّاتٍ خفيفةٍ من المطر ",
+ "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ ",
+ "More weather for {adr}" : "المزيد عن الطقس في {adr}",
+ "Loading weather" : "تحميل الطقس",
+ "Remove from favorites" : "إزالة من المُفضّلة",
+ "Add as favorite" : "إضافة إلى المُفضّلة",
+ "You are not logged in." : "أنت لست داخلاً بعدُ",
+ "There was an error getting the weather status information." : "حدث خطأ أثناء محاولة الحصول على معلومات عن حالة الطقس",
+ "No weather information found" : "لا توجد أيّ معلومات عن الطقس",
+ "Location not found" : "الموقع الجغرافي غير موجود",
+ "There was an error setting the location address." : "حدث خطأ أثناء تعيين عنوان الموقع الجغرافي.",
+ "There was an error setting the location." : "حدث خطأ أثناء تعيين الموقع الجغرافي.",
+ "There was an error saving the mode." : "حدث خطأ أثناء حفظ الوضعية mode.",
+ "There was an error using personal address." : "حدث خطأ أثناء استعمال العنوان الشخصي.",
+ "Set location for weather" : "عيّن المكان لمعرفة الطقس"
+},
+"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/weather_status/l10n/ar.json b/apps/weather_status/l10n/ar.json
new file mode 100644
index 00000000000..f3565b04240
--- /dev/null
+++ b/apps/weather_status/l10n/ar.json
@@ -0,0 +1,48 @@
+{ "translations": {
+ "Unknown address" : "عنوان غير معروف",
+ "No result." : "لا يوجد نتيجة",
+ "Malformed JSON data." : "بيانات JSON غير مكونة بشكل صحيح",
+ "Error" : "خطأ",
+ "Weather status" : "حالة الطقس",
+ "Weather status in your dashboard" : "حالة الطقس على لوحتك",
+ "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "تمّ دمج حالة الطقس في تطبيق لوحة القيادة dashboard. يمكن تحديد الموقع الجغرافي للمستخدم تلقائيًا أو تحديده يدويًا. يتم بعد ذلك عرض توقعات الطفس في الـ 6 ساعات القادمة. يمكن أيضًا دمج حالة الطقس هذه في أماكن أخرى مثل تطبيق التقويم.",
+ "Detect location" : "تحديد الموقع الجغرافي",
+ "Set custom address" : "تعيين عنوان مُخصّص",
+ "Favorites" : "المُفضّلة",
+ "{temperature} {unit} clear sky later today" : "{temperature} {unit} سماءٌ صَحْوٌ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} clear sky" : "{temperature} {unit} سماءٌ صَحْوُ",
+ "{temperature} {unit} cloudy later today" : "{temperature} {unit} طقسٌ مُغيّمٌ في وقت لاحقٍ من اليوم",
+ "{temperature} {unit} cloudy" : "{temperature} {unit} غائم",
+ "{temperature} {unit} fair weather later today" : "{temperature} {unit} طقسٌ مُعتَدِلٌ في وقت لاحق من اليوم",
+ "{temperature} {unit} fair weather" : "{temperature} {unit} طقسٌ مُعتَدِلٌ",
+ "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} غائمٌ جزئيّاً في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} partly cloudy" : "{temperature} {unit} غائمٌ جزئيّاً ",
+ "{temperature} {unit} foggy later today" : "{temperature} {unit} ضبابيٌّ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} foggy" : "{temperature} {unit} ضبابيٌّ",
+ "{temperature} {unit} light rainfall later today" : "{temperature} {unit} هُطولُ أمطارٍ خفيفةٍ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} light rainfall" : "{temperature} {unit} هُطولُ أمطارٍ خفيفةٍ ",
+ "{temperature} {unit} rainfall later today" : "{temperature} {unit} مُمطِرٌ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} rainfall" : "{temperature} {unit} مُمطِرٌ ",
+ "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} heavy rainfall" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ ",
+ "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} هُطولُ زخّاتٍ من المطر في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} rainfall showers" : "{temperature} {unit} هُطولُ زخّاتٍ من المطر ",
+ "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} هُطولُ زخّاتٍ خفيفةٍ من المطر في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} light rainfall showers" : "{temperature} {unit} هُطولُ زخّاتٍ خفيفةٍ من المطر ",
+ "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ في وقتٍ لاحقٍ من اليوم",
+ "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit} هُطولُ أمطارٍ غزيرةٍ ",
+ "More weather for {adr}" : "المزيد عن الطقس في {adr}",
+ "Loading weather" : "تحميل الطقس",
+ "Remove from favorites" : "إزالة من المُفضّلة",
+ "Add as favorite" : "إضافة إلى المُفضّلة",
+ "You are not logged in." : "أنت لست داخلاً بعدُ",
+ "There was an error getting the weather status information." : "حدث خطأ أثناء محاولة الحصول على معلومات عن حالة الطقس",
+ "No weather information found" : "لا توجد أيّ معلومات عن الطقس",
+ "Location not found" : "الموقع الجغرافي غير موجود",
+ "There was an error setting the location address." : "حدث خطأ أثناء تعيين عنوان الموقع الجغرافي.",
+ "There was an error setting the location." : "حدث خطأ أثناء تعيين الموقع الجغرافي.",
+ "There was an error saving the mode." : "حدث خطأ أثناء حفظ الوضعية mode.",
+ "There was an error using personal address." : "حدث خطأ أثناء استعمال العنوان الشخصي.",
+ "Set location for weather" : "عيّن المكان لمعرفة الطقس"
+},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+} \ No newline at end of file
diff --git a/apps/weather_status/lib/Capabilities.php b/apps/weather_status/lib/Capabilities.php
index c9de0039a39..60cbb4602fd 100644
--- a/apps/weather_status/lib/Capabilities.php
+++ b/apps/weather_status/lib/Capabilities.php
@@ -43,9 +43,6 @@ class Capabilities implements ICapability {
public function __construct() {
}
- /**
- * @inheritDoc
- */
public function getCapabilities() {
return [
Application::APP_ID => [
diff --git a/apps/workflowengine/composer/composer/ClassLoader.php b/apps/workflowengine/composer/composer/ClassLoader.php
index a72151c77c8..7824d8f7eaf 100644
--- a/apps/workflowengine/composer/composer/ClassLoader.php
+++ b/apps/workflowengine/composer/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
diff --git a/apps/workflowengine/composer/composer/installed.php b/apps/workflowengine/composer/composer/installed.php
index 1426826287d..1a66c7f2416 100644
--- a/apps/workflowengine/composer/composer/installed.php
+++ b/apps/workflowengine/composer/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
+ 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
diff --git a/apps/workflowengine/l10n/ar.js b/apps/workflowengine/l10n/ar.js
new file mode 100644
index 00000000000..a597f6d4297
--- /dev/null
+++ b/apps/workflowengine/l10n/ar.js
@@ -0,0 +1,86 @@
+OC.L10N.register(
+ "workflowengine",
+ {
+ "The given operator is invalid" : "المُعامل المُعطى غير مقبول",
+ "The given regular expression is invalid" : "التعبير النظامي RE المُعطى غير مقبول",
+ "The given file size is invalid" : "حجم الملف المُعطى غير مقبول",
+ "The given tag id is invalid" : "اللصيقة tag المُعطاة غير مقبولة",
+ "The given IP range is invalid" : "نطاق العنوان IP المُعطى غير مقبول.",
+ "The given IP range is not valid for IPv4" : "نطاق العنوان IP المُعطى غير مقبول بالنسبة لـ IPv4.",
+ "The given IP range is not valid for IPv6" : "نطاق العنوان IP المُعطى غير مقبول بالنسبة لـ IPv6.",
+ "The given time span is invalid" : "الفترة الزمنية المُعطاة غير مقبولة",
+ "The given start time is invalid" : "وقت البداية المُعطى غير مقبول.",
+ "The given end time is invalid" : "وقت النهاية المُعطى غير مقبول.",
+ "The given group does not exist" : "المجموعة المُعطاة غير موجودة.",
+ "File" : "ملف",
+ "File created" : "ملف مُنشأ",
+ "File updated" : "ملف مُحدّث",
+ "File renamed" : "ملف مُعاد تسميته",
+ "File deleted" : "ملف محذوف",
+ "File accessed" : "ملف تم الوصول إليه",
+ "File copied" : "ملف منسوخ",
+ "Tag assigned" : "لصيقة مُسندة",
+ "Someone" : "شخصٌ ما",
+ "%s created %s" : "%s مُنشأ %s",
+ "%s modified %s" : "%s مُعدّل %s",
+ "%s deleted %s" : "%s مُلغىً %s",
+ "%s accessed %s" : "%s تم الوصول إليه %s",
+ "%s renamed %s" : "%s مُعاد تسميته %s",
+ "%s copied %s" : "%s منسوخ %s",
+ "%s assigned %s to %s" : "%s مُسند %s إلى %s",
+ "Operation #%s does not exist" : "العملية #%s غير موجودة",
+ "Entity %s does not exist" : "الكيان %s غير موجود",
+ "Entity %s is invalid" : "الكيان %s غير مقبول",
+ "No events are chosen." : "لم يتم اختيار أي أحدث.",
+ "Entity %s has no event %s" : "الكيان %s ليس له أحداث %s",
+ "Operation %s does not exist" : "العملية %s غير موجودة",
+ "Operation %s is invalid" : "العملية%sغير موجودة",
+ "The provided operation data is too long" : "تشغيل البيانات المطلوب كبير جدا",
+ "Check %s does not exist" : "تحقق من%s غير موجود",
+ "Check %s is invalid" : "تحقق من%sغير صالح",
+ "Check #%s does not exist" : "تحقق من#%s غير موجود",
+ "Check %s is invalid or does not exist" : "التحقق من %s فهو غير صالح أو غير موجود",
+ "Flow" : "تدفُّق Flow",
+ "Folder" : "مجلد",
+ "Images" : "صور",
+ "Files WebDAV" : "ملفات امتدادات ويب داف \"WebDAV\"",
+ "Android client" : "عميل أندرويد",
+ "iOS client" : "عميل نظام التشغيل آي أو إس \"iOS\"",
+ "Desktop client" : "تطبيق سطح المكتب",
+ "Thunderbird & Outlook addons" : "إضافات ثندربيرد و أوت لوك",
+ "and" : "و",
+ "Cancel" : "إلغاء",
+ "Delete" : "حذف ",
+ "Active" : "فعال",
+ "Save" : "حفظ",
+ "Browse the App Store" : "إستعرض متجر التطبيقات",
+ "matches" : "متوافق",
+ "does not match" : "غير متوافق",
+ "is" : "يكون",
+ "is not" : "ليس",
+ "File name" : "اسم ملف",
+ "File MIME type" : "الملف من النوع MIME\"امتدادات بريد الإنترنت متعددة الأغراض \"",
+ "File size (upload)" : "حجم الملف (الرفع)",
+ "less" : "أقل",
+ "less or equals" : "أقل من أو يساوي",
+ "greater or equals" : "أكبر أو يساوي",
+ "greater" : "أكبر من",
+ "Request remote address" : "طلب العنوان البعيد",
+ "matches IPv4" : "متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv4\"",
+ "does not match IPv4" : "غير متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv4\"",
+ "matches IPv6" : "متوافق مع بروتوكول الانترنت الاصدار السادس \"IPv6\"",
+ "does not match IPv6" : "غير متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv6\"",
+ "File system tag" : "وسم ملف النظام",
+ "is tagged with" : "موسومة بـ",
+ "is not tagged with" : "غير موسومة بـ",
+ "Request URL" : "طلب عنوان محدد موقع الموارد المُوحّد \"URL\"",
+ "Request time" : "وقت الطلب",
+ "between" : "بين",
+ "not between" : "ليس بين",
+ "Request user agent" : "طلب وكيل المستخدم",
+ "User group membership" : "عضوية مجموعة المستخدمين",
+ "is member of" : "عضو فى",
+ "is not member of" : "ليس عضو فى",
+ "Predefined URLs" : "عناوين محدد موقع الموارد المُوحّد \"URLs\" المحددة مسبقا"
+},
+"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/workflowengine/l10n/ar.json b/apps/workflowengine/l10n/ar.json
new file mode 100644
index 00000000000..df1fe4afd37
--- /dev/null
+++ b/apps/workflowengine/l10n/ar.json
@@ -0,0 +1,84 @@
+{ "translations": {
+ "The given operator is invalid" : "المُعامل المُعطى غير مقبول",
+ "The given regular expression is invalid" : "التعبير النظامي RE المُعطى غير مقبول",
+ "The given file size is invalid" : "حجم الملف المُعطى غير مقبول",
+ "The given tag id is invalid" : "اللصيقة tag المُعطاة غير مقبولة",
+ "The given IP range is invalid" : "نطاق العنوان IP المُعطى غير مقبول.",
+ "The given IP range is not valid for IPv4" : "نطاق العنوان IP المُعطى غير مقبول بالنسبة لـ IPv4.",
+ "The given IP range is not valid for IPv6" : "نطاق العنوان IP المُعطى غير مقبول بالنسبة لـ IPv6.",
+ "The given time span is invalid" : "الفترة الزمنية المُعطاة غير مقبولة",
+ "The given start time is invalid" : "وقت البداية المُعطى غير مقبول.",
+ "The given end time is invalid" : "وقت النهاية المُعطى غير مقبول.",
+ "The given group does not exist" : "المجموعة المُعطاة غير موجودة.",
+ "File" : "ملف",
+ "File created" : "ملف مُنشأ",
+ "File updated" : "ملف مُحدّث",
+ "File renamed" : "ملف مُعاد تسميته",
+ "File deleted" : "ملف محذوف",
+ "File accessed" : "ملف تم الوصول إليه",
+ "File copied" : "ملف منسوخ",
+ "Tag assigned" : "لصيقة مُسندة",
+ "Someone" : "شخصٌ ما",
+ "%s created %s" : "%s مُنشأ %s",
+ "%s modified %s" : "%s مُعدّل %s",
+ "%s deleted %s" : "%s مُلغىً %s",
+ "%s accessed %s" : "%s تم الوصول إليه %s",
+ "%s renamed %s" : "%s مُعاد تسميته %s",
+ "%s copied %s" : "%s منسوخ %s",
+ "%s assigned %s to %s" : "%s مُسند %s إلى %s",
+ "Operation #%s does not exist" : "العملية #%s غير موجودة",
+ "Entity %s does not exist" : "الكيان %s غير موجود",
+ "Entity %s is invalid" : "الكيان %s غير مقبول",
+ "No events are chosen." : "لم يتم اختيار أي أحدث.",
+ "Entity %s has no event %s" : "الكيان %s ليس له أحداث %s",
+ "Operation %s does not exist" : "العملية %s غير موجودة",
+ "Operation %s is invalid" : "العملية%sغير موجودة",
+ "The provided operation data is too long" : "تشغيل البيانات المطلوب كبير جدا",
+ "Check %s does not exist" : "تحقق من%s غير موجود",
+ "Check %s is invalid" : "تحقق من%sغير صالح",
+ "Check #%s does not exist" : "تحقق من#%s غير موجود",
+ "Check %s is invalid or does not exist" : "التحقق من %s فهو غير صالح أو غير موجود",
+ "Flow" : "تدفُّق Flow",
+ "Folder" : "مجلد",
+ "Images" : "صور",
+ "Files WebDAV" : "ملفات امتدادات ويب داف \"WebDAV\"",
+ "Android client" : "عميل أندرويد",
+ "iOS client" : "عميل نظام التشغيل آي أو إس \"iOS\"",
+ "Desktop client" : "تطبيق سطح المكتب",
+ "Thunderbird & Outlook addons" : "إضافات ثندربيرد و أوت لوك",
+ "and" : "و",
+ "Cancel" : "إلغاء",
+ "Delete" : "حذف ",
+ "Active" : "فعال",
+ "Save" : "حفظ",
+ "Browse the App Store" : "إستعرض متجر التطبيقات",
+ "matches" : "متوافق",
+ "does not match" : "غير متوافق",
+ "is" : "يكون",
+ "is not" : "ليس",
+ "File name" : "اسم ملف",
+ "File MIME type" : "الملف من النوع MIME\"امتدادات بريد الإنترنت متعددة الأغراض \"",
+ "File size (upload)" : "حجم الملف (الرفع)",
+ "less" : "أقل",
+ "less or equals" : "أقل من أو يساوي",
+ "greater or equals" : "أكبر أو يساوي",
+ "greater" : "أكبر من",
+ "Request remote address" : "طلب العنوان البعيد",
+ "matches IPv4" : "متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv4\"",
+ "does not match IPv4" : "غير متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv4\"",
+ "matches IPv6" : "متوافق مع بروتوكول الانترنت الاصدار السادس \"IPv6\"",
+ "does not match IPv6" : "غير متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv6\"",
+ "File system tag" : "وسم ملف النظام",
+ "is tagged with" : "موسومة بـ",
+ "is not tagged with" : "غير موسومة بـ",
+ "Request URL" : "طلب عنوان محدد موقع الموارد المُوحّد \"URL\"",
+ "Request time" : "وقت الطلب",
+ "between" : "بين",
+ "not between" : "ليس بين",
+ "Request user agent" : "طلب وكيل المستخدم",
+ "User group membership" : "عضوية مجموعة المستخدمين",
+ "is member of" : "عضو فى",
+ "is not member of" : "ليس عضو فى",
+ "Predefined URLs" : "عناوين محدد موقع الموارد المُوحّد \"URLs\" المحددة مسبقا"
+},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+} \ No newline at end of file
diff --git a/apps/workflowengine/l10n/gl.js b/apps/workflowengine/l10n/gl.js
index 5ab427c3e62..6e7c011d4a9 100644
--- a/apps/workflowengine/l10n/gl.js
+++ b/apps/workflowengine/l10n/gl.js
@@ -28,7 +28,7 @@ OC.L10N.register(
"%s renamed %s" : "%s renomeado %s",
"%s copied %s" : "%s copiado %s",
"%s assigned %s to %s" : "%s asignado %s a %s",
- "Operation #%s does not exist" : "Non existe a operación num. %s ",
+ "Operation #%s does not exist" : "Non existe a operación nº %s ",
"Entity %s does not exist" : "Non existe a entidade %s",
"Entity %s is invalid" : "A entidade %s é incorrecta",
"No events are chosen." : "Non foi escollido ningún evento.",
@@ -42,7 +42,7 @@ OC.L10N.register(
"Check %s is invalid" : "A proba %s é incorrecta",
"Check %s is not allowed with this entity" : "A proba %s non está permitida con esta entidade",
"The provided check value is too long" : "O valor de comprobación fornecido é demasiado longo",
- "Check #%s does not exist" : "Non existe a proba num. %s ",
+ "Check #%s does not exist" : "Non existe a proba nº %s ",
"Check %s is invalid or does not exist" : "A proba %s é incorrecta ou non existe",
"Flow" : "Fluxo",
"Nextcloud workflow engine" : "Motor de fluxo de traballo de Nextcloud",
@@ -93,7 +93,7 @@ OC.L10N.register(
"less or equals" : "menor ou igual",
"greater or equals" : "maior ou igual",
"greater" : "maior",
- "Request remote address" : "Solicitar o enderezo remoto",
+ "Request remote address" : "Enderezo da solicitude remota",
"matches IPv4" : "coincidencias IPv4",
"does not match IPv4" : "sen coincidencias IPv4",
"matches IPv6" : "coincidencias IPv6",
@@ -101,11 +101,11 @@ OC.L10N.register(
"File system tag" : "Etiqueta do sistema de ficheiros",
"is tagged with" : "está etiquetado con",
"is not tagged with" : "non está etiquetado con",
- "Request URL" : "Solicitar URL",
- "Request time" : "Tempo da solicitude",
+ "Request URL" : "URL da solicitude",
+ "Request time" : "Momento da solicitude",
"between" : "entre",
"not between" : "non entre",
- "Request user agent" : "Solicitar axente de usuario",
+ "Request user agent" : "Cliente usado para a solicitude",
"User group membership" : "Pertenza a un grupo de usuarios",
"is member of" : "é membro de",
"is not member of" : "non é membro de",
diff --git a/apps/workflowengine/l10n/gl.json b/apps/workflowengine/l10n/gl.json
index cc3ee15655c..1d2ef1ffce2 100644
--- a/apps/workflowengine/l10n/gl.json
+++ b/apps/workflowengine/l10n/gl.json
@@ -26,7 +26,7 @@
"%s renamed %s" : "%s renomeado %s",
"%s copied %s" : "%s copiado %s",
"%s assigned %s to %s" : "%s asignado %s a %s",
- "Operation #%s does not exist" : "Non existe a operación num. %s ",
+ "Operation #%s does not exist" : "Non existe a operación nº %s ",
"Entity %s does not exist" : "Non existe a entidade %s",
"Entity %s is invalid" : "A entidade %s é incorrecta",
"No events are chosen." : "Non foi escollido ningún evento.",
@@ -40,7 +40,7 @@
"Check %s is invalid" : "A proba %s é incorrecta",
"Check %s is not allowed with this entity" : "A proba %s non está permitida con esta entidade",
"The provided check value is too long" : "O valor de comprobación fornecido é demasiado longo",
- "Check #%s does not exist" : "Non existe a proba num. %s ",
+ "Check #%s does not exist" : "Non existe a proba nº %s ",
"Check %s is invalid or does not exist" : "A proba %s é incorrecta ou non existe",
"Flow" : "Fluxo",
"Nextcloud workflow engine" : "Motor de fluxo de traballo de Nextcloud",
@@ -91,7 +91,7 @@
"less or equals" : "menor ou igual",
"greater or equals" : "maior ou igual",
"greater" : "maior",
- "Request remote address" : "Solicitar o enderezo remoto",
+ "Request remote address" : "Enderezo da solicitude remota",
"matches IPv4" : "coincidencias IPv4",
"does not match IPv4" : "sen coincidencias IPv4",
"matches IPv6" : "coincidencias IPv6",
@@ -99,11 +99,11 @@
"File system tag" : "Etiqueta do sistema de ficheiros",
"is tagged with" : "está etiquetado con",
"is not tagged with" : "non está etiquetado con",
- "Request URL" : "Solicitar URL",
- "Request time" : "Tempo da solicitude",
+ "Request URL" : "URL da solicitude",
+ "Request time" : "Momento da solicitude",
"between" : "entre",
"not between" : "non entre",
- "Request user agent" : "Solicitar axente de usuario",
+ "Request user agent" : "Cliente usado para a solicitude",
"User group membership" : "Pertenza a un grupo de usuarios",
"is member of" : "é membro de",
"is not member of" : "non é membro de",