aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/admin_audit/l10n/be.js7
-rw-r--r--apps/admin_audit/l10n/be.json5
-rw-r--r--apps/comments/l10n/es_CO.js35
-rw-r--r--apps/comments/l10n/es_CO.json33
-rw-r--r--apps/dashboard/l10n/es.js4
-rw-r--r--apps/dashboard/l10n/es.json4
-rw-r--r--apps/dashboard/l10n/fr.js2
-rw-r--r--apps/dashboard/l10n/fr.json2
-rw-r--r--apps/dashboard/l10n/uk.js1
-rw-r--r--apps/dashboard/l10n/uk.json1
-rw-r--r--apps/dav/appinfo/info.xml2
-rw-r--r--apps/dav/composer/composer/autoload_classmap.php3
-rw-r--r--apps/dav/composer/composer/autoload_static.php3
-rw-r--r--apps/dav/l10n/es.js34
-rw-r--r--apps/dav/l10n/es.json34
-rw-r--r--apps/dav/l10n/pl.js25
-rw-r--r--apps/dav/l10n/pl.json25
-rw-r--r--apps/dav/l10n/uk.js49
-rw-r--r--apps/dav/l10n/uk.json49
-rw-r--r--apps/dav/lib/CalDAV/CalendarImpl.php30
-rw-r--r--apps/dav/lib/CalDAV/EmbeddedCalDavServer.php118
-rw-r--r--apps/dav/lib/CalDAV/UpcomingEventsService.php8
-rw-r--r--apps/dav/lib/Command/GetAbsenceCommand.php62
-rw-r--r--apps/dav/lib/Command/SetAbsenceCommand.php95
-rw-r--r--apps/dav/lib/Connector/Sabre/FilesReportPlugin.php2
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php3
-rw-r--r--apps/dav/lib/Connector/Sabre/ServerFactory.php2
-rw-r--r--apps/dav/src/components/AbsenceForm.vue2
-rw-r--r--apps/dav/src/components/ExampleContentDownloadButton.vue4
-rw-r--r--apps/dav/src/components/ExampleEventSettings.vue2
-rw-r--r--apps/dav/src/settings-example-content.js2
-rw-r--r--apps/dav/src/views/ExampleContentSettingsSection.vue2
-rw-r--r--apps/encryption/lib/Session.php2
-rw-r--r--apps/federatedfilesharing/l10n/et_EE.js18
-rw-r--r--apps/federatedfilesharing/l10n/et_EE.json18
-rw-r--r--apps/federatedfilesharing/l10n/uk.js20
-rw-r--r--apps/federatedfilesharing/l10n/uk.json20
-rw-r--r--apps/federatedfilesharing/lib/FederatedShareProvider.php8
-rw-r--r--apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php5
-rw-r--r--apps/federatedfilesharing/tests/AddressHandlerTest.php4
-rw-r--r--apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php4
-rw-r--r--apps/federatedfilesharing/tests/FederatedShareProviderTest.php4
-rw-r--r--apps/federation/l10n/es.js4
-rw-r--r--apps/federation/l10n/es.json4
-rw-r--r--apps/federation/l10n/uk.js2
-rw-r--r--apps/federation/l10n/uk.json2
-rw-r--r--apps/files/l10n/ar.js6
-rw-r--r--apps/files/l10n/ar.json6
-rw-r--r--apps/files/l10n/ast.js4
-rw-r--r--apps/files/l10n/ast.json4
-rw-r--r--apps/files/l10n/be.js245
-rw-r--r--apps/files/l10n/be.json243
-rw-r--r--apps/files/l10n/bg.js4
-rw-r--r--apps/files/l10n/bg.json4
-rw-r--r--apps/files/l10n/ca.js6
-rw-r--r--apps/files/l10n/ca.json6
-rw-r--r--apps/files/l10n/cs.js13
-rw-r--r--apps/files/l10n/cs.json13
-rw-r--r--apps/files/l10n/da.js6
-rw-r--r--apps/files/l10n/da.json6
-rw-r--r--apps/files/l10n/de.js12
-rw-r--r--apps/files/l10n/de.json12
-rw-r--r--apps/files/l10n/de_DE.js12
-rw-r--r--apps/files/l10n/de_DE.json12
-rw-r--r--apps/files/l10n/el.js4
-rw-r--r--apps/files/l10n/el.json4
-rw-r--r--apps/files/l10n/en_GB.js12
-rw-r--r--apps/files/l10n/en_GB.json12
-rw-r--r--apps/files/l10n/es.js6
-rw-r--r--apps/files/l10n/es.json6
-rw-r--r--apps/files/l10n/es_EC.js4
-rw-r--r--apps/files/l10n/es_EC.json4
-rw-r--r--apps/files/l10n/es_MX.js6
-rw-r--r--apps/files/l10n/es_MX.json6
-rw-r--r--apps/files/l10n/et_EE.js12
-rw-r--r--apps/files/l10n/et_EE.json12
-rw-r--r--apps/files/l10n/eu.js6
-rw-r--r--apps/files/l10n/eu.json6
-rw-r--r--apps/files/l10n/fa.js6
-rw-r--r--apps/files/l10n/fa.json6
-rw-r--r--apps/files/l10n/fi.js6
-rw-r--r--apps/files/l10n/fi.json6
-rw-r--r--apps/files/l10n/fr.js8
-rw-r--r--apps/files/l10n/fr.json8
-rw-r--r--apps/files/l10n/ga.js14
-rw-r--r--apps/files/l10n/ga.json14
-rw-r--r--apps/files/l10n/gl.js6
-rw-r--r--apps/files/l10n/gl.json6
-rw-r--r--apps/files/l10n/hu.js6
-rw-r--r--apps/files/l10n/hu.json6
-rw-r--r--apps/files/l10n/is.js6
-rw-r--r--apps/files/l10n/is.json6
-rw-r--r--apps/files/l10n/it.js15
-rw-r--r--apps/files/l10n/it.json15
-rw-r--r--apps/files/l10n/ja.js12
-rw-r--r--apps/files/l10n/ja.json12
-rw-r--r--apps/files/l10n/ka.js4
-rw-r--r--apps/files/l10n/ka.json4
-rw-r--r--apps/files/l10n/ko.js6
-rw-r--r--apps/files/l10n/ko.json6
-rw-r--r--apps/files/l10n/lt_LT.js4
-rw-r--r--apps/files/l10n/lt_LT.json4
-rw-r--r--apps/files/l10n/mk.js6
-rw-r--r--apps/files/l10n/mk.json6
-rw-r--r--apps/files/l10n/nb.js6
-rw-r--r--apps/files/l10n/nb.json6
-rw-r--r--apps/files/l10n/nl.js6
-rw-r--r--apps/files/l10n/nl.json6
-rw-r--r--apps/files/l10n/pl.js10
-rw-r--r--apps/files/l10n/pl.json10
-rw-r--r--apps/files/l10n/pt_BR.js12
-rw-r--r--apps/files/l10n/pt_BR.json12
-rw-r--r--apps/files/l10n/ro.js4
-rw-r--r--apps/files/l10n/ro.json4
-rw-r--r--apps/files/l10n/ru.js14
-rw-r--r--apps/files/l10n/ru.json14
-rw-r--r--apps/files/l10n/sc.js4
-rw-r--r--apps/files/l10n/sc.json4
-rw-r--r--apps/files/l10n/sk.js6
-rw-r--r--apps/files/l10n/sk.json6
-rw-r--r--apps/files/l10n/sl.js6
-rw-r--r--apps/files/l10n/sl.json6
-rw-r--r--apps/files/l10n/sr.js6
-rw-r--r--apps/files/l10n/sr.json6
-rw-r--r--apps/files/l10n/sv.js12
-rw-r--r--apps/files/l10n/sv.json12
-rw-r--r--apps/files/l10n/sw.js14
-rw-r--r--apps/files/l10n/sw.json14
-rw-r--r--apps/files/l10n/th.js2
-rw-r--r--apps/files/l10n/th.json2
-rw-r--r--apps/files/l10n/tr.js10
-rw-r--r--apps/files/l10n/tr.json10
-rw-r--r--apps/files/l10n/ug.js6
-rw-r--r--apps/files/l10n/ug.json6
-rw-r--r--apps/files/l10n/uk.js12
-rw-r--r--apps/files/l10n/uk.json12
-rw-r--r--apps/files/l10n/vi.js6
-rw-r--r--apps/files/l10n/vi.json6
-rw-r--r--apps/files/l10n/zh_CN.js6
-rw-r--r--apps/files/l10n/zh_CN.json6
-rw-r--r--apps/files/l10n/zh_HK.js12
-rw-r--r--apps/files/l10n/zh_HK.json12
-rw-r--r--apps/files/l10n/zh_TW.js12
-rw-r--r--apps/files/l10n/zh_TW.json12
-rw-r--r--apps/files/lib/Controller/ViewController.php14
-rw-r--r--apps/files/lib/Service/UserConfig.php6
-rw-r--r--apps/files/src/actions/deleteAction.ts2
-rw-r--r--apps/files/src/actions/moveOrCopyAction.ts4
-rw-r--r--apps/files/src/actions/renameAction.ts2
-rw-r--r--apps/files/src/actions/viewInFolderAction.ts9
-rw-r--r--apps/files/src/components/FileEntry/FileEntryName.vue11
-rw-r--r--apps/files/src/components/FileEntry/FileEntryPreview.vue2
-rw-r--r--apps/files/src/components/FileListFilter/FileListFilterModified.vue6
-rw-r--r--apps/files/src/components/FileListFilter/FileListFilterType.vue6
-rw-r--r--apps/files/src/components/FilesListVirtual.vue6
-rw-r--r--apps/files/src/components/NavigationQuota.vue2
-rw-r--r--apps/files/src/composables/useNavigation.spec.ts7
-rw-r--r--apps/files/src/newMenu/newFolder.ts7
-rw-r--r--apps/files/src/plugins/search/folderSearch.ts5
-rw-r--r--apps/files/src/store/userconfig.ts1
-rw-r--r--apps/files/src/types.ts1
-rw-r--r--apps/files/src/views/FilesList.vue4
-rw-r--r--apps/files/src/views/Navigation.vue2
-rw-r--r--apps/files/src/views/Settings.vue30
-rw-r--r--apps/files/src/views/favorites.spec.ts27
-rw-r--r--apps/files/src/views/favorites.ts14
-rw-r--r--apps/files/src/views/files.ts2
-rw-r--r--apps/files/src/views/folderTree.ts4
-rw-r--r--apps/files/src/views/personal-files.ts2
-rw-r--r--apps/files/tests/Controller/ViewControllerTest.php24
-rw-r--r--apps/files_external/3rdparty/.gitignore17
-rw-r--r--apps/files_external/3rdparty/autoload.php25
-rw-r--r--apps/files_external/3rdparty/composer.json14
-rw-r--r--apps/files_external/3rdparty/composer.json.license3
-rw-r--r--apps/files_external/3rdparty/composer.lock111
-rw-r--r--apps/files_external/3rdparty/composer.lock.license3
-rw-r--r--apps/files_external/3rdparty/composer/ClassLoader.php579
-rw-r--r--apps/files_external/3rdparty/composer/InstalledVersions.php359
-rw-r--r--apps/files_external/3rdparty/composer/LICENSE19
-rw-r--r--apps/files_external/3rdparty/composer/autoload_classmap.php94
-rw-r--r--apps/files_external/3rdparty/composer/autoload_namespaces.php9
-rw-r--r--apps/files_external/3rdparty/composer/autoload_psr4.php11
-rw-r--r--apps/files_external/3rdparty/composer/autoload_real.php39
-rw-r--r--apps/files_external/3rdparty/composer/autoload_static.php125
-rw-r--r--apps/files_external/3rdparty/composer/installed.json104
-rw-r--r--apps/files_external/3rdparty/composer/installed.php41
-rw-r--r--apps/files_external/3rdparty/composer/platform_check.php26
-rw-r--r--apps/files_external/3rdparty/icewind/smb/.gitignore9
-rw-r--r--apps/files_external/3rdparty/icewind/smb/.php_cs.dist21
-rw-r--r--apps/files_external/3rdparty/icewind/smb/LICENSE.txt19
-rw-r--r--apps/files_external/3rdparty/icewind/smb/LICENSES/AGPL-3.0-or-later.txt235
-rw-r--r--apps/files_external/3rdparty/icewind/smb/LICENSES/CC0-1.0.txt121
-rw-r--r--apps/files_external/3rdparty/icewind/smb/LICENSES/MIT.txt9
-rw-r--r--apps/files_external/3rdparty/icewind/smb/README.md192
-rw-r--r--apps/files_external/3rdparty/icewind/smb/composer.json37
-rw-r--r--apps/files_external/3rdparty/icewind/smb/composer.json.license2
-rw-r--r--apps/files_external/3rdparty/icewind/smb/psalm.xml.license2
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/ACL.php69
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php61
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/AbstractShare.php37
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php33
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php42
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Change.php27
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/AccessDeniedException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/AlreadyExistsException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/AuthenticationException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionAbortedException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionRefusedException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionResetException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php51
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/FileInUseException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/ForbiddenException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/HostDownException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidArgumentException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidHostException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidPathException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidRequestException.php29
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidResourceException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTicket.php13
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTypeException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/NoLoginServerException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/NoRouteToHostException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/NotEmptyException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/NotFoundException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php15
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Exception/TimedOutException.php10
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/IAuth.php29
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php45
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php43
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/IOptions.php26
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/IServer.php31
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/IShare.php164
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/ISystem.php63
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/ITimeZoneProvider.php17
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/KerberosApacheAuth.php47
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php64
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/KerberosTicket.php85
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeFileInfo.php142
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeReadStream.php92
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeServer.php64
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeShare.php369
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeState.php433
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeStream.php158
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Native/NativeWriteStream.php95
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Options.php41
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php70
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/StringBuffer.php48
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/System.php75
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/TimeZoneProvider.php52
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/Connection.php115
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/ErrorCodes.php30
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/FileInfo.php88
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/NotifyHandler.php111
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/Parser.php276
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/RawConnection.php250
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php103
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Wrapped/Share.php553
-rw-r--r--apps/files_external/3rdparty/icewind/streams-dummy/composer.json7
-rw-r--r--apps/files_external/3rdparty/icewind/streams-dummy/composer.json.license2
-rw-r--r--apps/files_external/3rdparty/icewind/streams/.gitignore8
-rw-r--r--apps/files_external/3rdparty/icewind/streams/LICENSE.txt19
-rw-r--r--apps/files_external/3rdparty/icewind/streams/README.md56
-rw-r--r--apps/files_external/3rdparty/icewind/streams/composer.json29
-rw-r--r--apps/files_external/3rdparty/icewind/streams/composer.json.license2
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php131
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/CountWrapper.php88
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Directory.php34
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php56
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php46
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/File.php85
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/HashWrapper.php61
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php112
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php26
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Path.php107
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/PathWrapper.php22
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/ReadHashWrapper.php23
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php51
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php82
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Url.php63
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/UrlCallback.php134
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/Wrapper.php130
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/WrapperHandler.php99
-rw-r--r--apps/files_external/3rdparty/icewind/streams/src/WriteHashWrapper.php22
-rw-r--r--apps/files_external/l10n/mk.js5
-rw-r--r--apps/files_external/l10n/mk.json5
-rw-r--r--apps/files_external/l10n/uk.js14
-rw-r--r--apps/files_external/l10n/uk.json14
-rw-r--r--apps/files_external/lib/AppInfo/Application.php2
-rw-r--r--apps/files_external/lib/Command/Verify.php1
-rw-r--r--apps/files_external/lib/ConfigLexicon.php20
-rw-r--r--apps/files_external/lib/Controller/GlobalStoragesController.php4
-rw-r--r--apps/files_external/lib/Controller/StoragesController.php10
-rw-r--r--apps/files_external/lib/Controller/UserGlobalStoragesController.php9
-rw-r--r--apps/files_external/lib/Controller/UserStoragesController.php8
-rw-r--r--apps/files_external/lib/MountConfig.php4
-rw-r--r--apps/files_external/src/init.ts2
-rw-r--r--apps/files_reminders/l10n/uk.js8
-rw-r--r--apps/files_reminders/l10n/uk.json8
-rw-r--r--apps/files_sharing/l10n/de.js10
-rw-r--r--apps/files_sharing/l10n/de.json10
-rw-r--r--apps/files_sharing/l10n/de_DE.js16
-rw-r--r--apps/files_sharing/l10n/de_DE.json16
-rw-r--r--apps/files_sharing/l10n/fr.js8
-rw-r--r--apps/files_sharing/l10n/fr.json8
-rw-r--r--apps/files_sharing/l10n/it.js2
-rw-r--r--apps/files_sharing/l10n/it.json2
-rw-r--r--apps/files_sharing/l10n/mk.js2
-rw-r--r--apps/files_sharing/l10n/mk.json2
-rw-r--r--apps/files_sharing/l10n/ru.js1
-rw-r--r--apps/files_sharing/l10n/ru.json1
-rw-r--r--apps/files_sharing/l10n/uk.js1
-rw-r--r--apps/files_sharing/l10n/uk.json1
-rw-r--r--apps/files_sharing/lib/Config/ConfigLexicon.php20
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php29
-rw-r--r--apps/files_sharing/lib/Listener/LoadSidebarListener.php1
-rw-r--r--apps/files_sharing/lib/ResponseDefinitions.php1
-rw-r--r--apps/files_sharing/openapi.json75
-rw-r--r--apps/files_sharing/src/components/FileListFilterAccount.vue4
-rw-r--r--apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogIntro.vue2
-rw-r--r--apps/files_sharing/src/components/SharingEntry.vue4
-rw-r--r--apps/files_sharing/src/components/SharingEntryLink.vue16
-rw-r--r--apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue2
-rw-r--r--apps/files_sharing/src/components/SharingInput.vue40
-rw-r--r--apps/files_sharing/src/files_actions/sharingStatusAction.ts4
-rw-r--r--apps/files_sharing/src/files_newMenu/newFileRequest.ts2
-rw-r--r--apps/files_sharing/src/files_views/shares.ts6
-rw-r--r--apps/files_sharing/src/mixins/SharesMixin.js35
-rw-r--r--apps/files_sharing/src/models/Share.ts7
-rw-r--r--apps/files_sharing/src/services/ConfigService.ts8
-rw-r--r--apps/files_sharing/src/utils/GeneratePassword.ts21
-rw-r--r--apps/files_sharing/src/views/CollaborationView.vue36
-rw-r--r--apps/files_sharing/src/views/FilesViewFileDropEmptyContent.vue2
-rw-r--r--apps/files_sharing/src/views/SharingDetailsTab.vue19
-rw-r--r--apps/files_sharing/src/views/SharingLinkList.vue12
-rw-r--r--apps/files_sharing/src/views/SharingTab.vue24
-rw-r--r--apps/files_sharing/tests/ApiTest.php3
-rw-r--r--apps/files_sharing/tests/Controller/ShareAPIControllerTest.php151
-rw-r--r--apps/files_sharing/tests/External/CacheTest.php4
-rw-r--r--apps/files_sharing/tests/External/ManagerTest.php4
-rw-r--r--apps/files_trashbin/l10n/be.js28
-rw-r--r--apps/files_trashbin/l10n/be.json26
-rw-r--r--apps/files_trashbin/l10n/uk.js1
-rw-r--r--apps/files_trashbin/l10n/uk.json1
-rw-r--r--apps/files_trashbin/src/files_views/trashbinView.ts2
-rw-r--r--apps/files_versions/composer/composer/autoload_classmap.php1
-rw-r--r--apps/files_versions/composer/composer/autoload_static.php1
-rw-r--r--apps/files_versions/l10n/be.js17
-rw-r--r--apps/files_versions/l10n/be.json15
-rw-r--r--apps/files_versions/l10n/ru.js2
-rw-r--r--apps/files_versions/l10n/ru.json2
-rw-r--r--apps/files_versions/l10n/uk.js1
-rw-r--r--apps/files_versions/l10n/uk.json1
-rw-r--r--apps/files_versions/lib/Events/VersionCreatedEvent.php39
-rw-r--r--apps/files_versions/lib/Versions/INeedSyncVersionBackend.php7
-rw-r--r--apps/files_versions/lib/Versions/LegacyVersionsBackend.php7
-rw-r--r--apps/files_versions/lib/Versions/VersionManager.php13
-rw-r--r--apps/files_versions/src/components/Version.vue2
-rw-r--r--apps/lookup_server_connector/l10n/be.js7
-rw-r--r--apps/lookup_server_connector/l10n/be.json5
-rw-r--r--apps/oauth2/l10n/sw.js23
-rw-r--r--apps/oauth2/l10n/sw.json21
-rw-r--r--apps/oauth2/l10n/uk.js1
-rw-r--r--apps/oauth2/l10n/uk.json1
-rw-r--r--apps/oauth2/src/components/OAuthItem.vue2
-rw-r--r--apps/profile/l10n/be.js12
-rw-r--r--apps/profile/l10n/be.json10
-rw-r--r--apps/profile/src/views/Profile.vue4
-rw-r--r--apps/provisioning_api/l10n/cs.js1
-rw-r--r--apps/provisioning_api/l10n/cs.json1
-rw-r--r--apps/provisioning_api/l10n/de.js1
-rw-r--r--apps/provisioning_api/l10n/de.json1
-rw-r--r--apps/provisioning_api/l10n/de_DE.js1
-rw-r--r--apps/provisioning_api/l10n/de_DE.json1
-rw-r--r--apps/provisioning_api/l10n/en_GB.js1
-rw-r--r--apps/provisioning_api/l10n/en_GB.json1
-rw-r--r--apps/provisioning_api/l10n/et_EE.js41
-rw-r--r--apps/provisioning_api/l10n/et_EE.json39
-rw-r--r--apps/provisioning_api/l10n/ga.js1
-rw-r--r--apps/provisioning_api/l10n/ga.json1
-rw-r--r--apps/provisioning_api/l10n/pt_BR.js1
-rw-r--r--apps/provisioning_api/l10n/pt_BR.json1
-rw-r--r--apps/provisioning_api/l10n/uk.js6
-rw-r--r--apps/provisioning_api/l10n/uk.json6
-rw-r--r--apps/provisioning_api/l10n/zh_HK.js1
-rw-r--r--apps/provisioning_api/l10n/zh_HK.json1
-rw-r--r--apps/provisioning_api/l10n/zh_TW.js1
-rw-r--r--apps/provisioning_api/l10n/zh_TW.json1
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php8
-rw-r--r--apps/provisioning_api/tests/Controller/UsersControllerTest.php9
-rw-r--r--apps/settings/img/password.svg2
-rw-r--r--apps/settings/img/personal.pngbin2017 -> 569 bytes
-rw-r--r--apps/settings/img/personal.svg2
-rw-r--r--apps/settings/img/users-white.svg2
-rw-r--r--apps/settings/img/users.svg2
-rw-r--r--apps/settings/l10n/cs.js2
-rw-r--r--apps/settings/l10n/cs.json2
-rw-r--r--apps/settings/l10n/de.js2
-rw-r--r--apps/settings/l10n/de.json2
-rw-r--r--apps/settings/l10n/de_DE.js2
-rw-r--r--apps/settings/l10n/de_DE.json2
-rw-r--r--apps/settings/l10n/en_GB.js2
-rw-r--r--apps/settings/l10n/en_GB.json2
-rw-r--r--apps/settings/l10n/es.js8
-rw-r--r--apps/settings/l10n/es.json8
-rw-r--r--apps/settings/l10n/et_EE.js33
-rw-r--r--apps/settings/l10n/et_EE.json33
-rw-r--r--apps/settings/l10n/fr.js2
-rw-r--r--apps/settings/l10n/fr.json2
-rw-r--r--apps/settings/l10n/ga.js2
-rw-r--r--apps/settings/l10n/ga.json2
-rw-r--r--apps/settings/l10n/lv.js8
-rw-r--r--apps/settings/l10n/lv.json8
-rw-r--r--apps/settings/l10n/mk.js5
-rw-r--r--apps/settings/l10n/mk.json5
-rw-r--r--apps/settings/l10n/pl.js2
-rw-r--r--apps/settings/l10n/pl.json2
-rw-r--r--apps/settings/l10n/pt_BR.js2
-rw-r--r--apps/settings/l10n/pt_BR.json2
-rw-r--r--apps/settings/l10n/tr.js3
-rw-r--r--apps/settings/l10n/tr.json3
-rw-r--r--apps/settings/l10n/uk.js151
-rw-r--r--apps/settings/l10n/uk.json151
-rw-r--r--apps/settings/l10n/zh_HK.js2
-rw-r--r--apps/settings/l10n/zh_HK.json2
-rw-r--r--apps/settings/l10n/zh_TW.js2
-rw-r--r--apps/settings/l10n/zh_TW.json2
-rw-r--r--apps/settings/lib/Controller/AppSettingsController.php51
-rw-r--r--apps/settings/lib/SetupChecks/SupportedDatabase.php2
-rw-r--r--apps/settings/src/components/AppList/AppLevelBadge.vue4
-rw-r--r--apps/settings/src/components/AppNavigationGroupList.vue4
-rw-r--r--apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue4
-rw-r--r--apps/settings/src/components/AppStoreSidebar/AppDeployOptionsModal.vue6
-rw-r--r--apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue22
-rw-r--r--apps/settings/src/components/AuthToken.vue4
-rw-r--r--apps/settings/src/components/GroupListItem.vue6
-rw-r--r--apps/settings/src/components/PersonalInfo/AvatarSection.vue2
-rw-r--r--apps/settings/src/components/PersonalInfo/DetailsSection.vue2
-rw-r--r--apps/settings/src/components/PersonalInfo/EmailSection/Email.vue8
-rw-r--r--apps/settings/src/components/UserList.vue6
-rw-r--r--apps/settings/src/components/Users/UserRowActions.vue2
-rw-r--r--apps/settings/src/constants/AccountPropertyConstants.ts6
-rw-r--r--apps/settings/src/constants/AppstoreCategoryIcons.ts40
-rw-r--r--apps/settings/src/views/UserManagementNavigation.vue10
-rw-r--r--apps/sharebymail/lib/ShareByMailProvider.php5
-rw-r--r--apps/systemtags/l10n/uk.js16
-rw-r--r--apps/systemtags/l10n/uk.json16
-rw-r--r--apps/systemtags/src/components/SystemTagPicker.vue4
-rw-r--r--apps/systemtags/src/files_actions/bulkSystemTagsAction.ts2
-rw-r--r--apps/systemtags/src/files_views/systemtagsView.ts2
-rw-r--r--apps/theming/src/components/BackgroundSettings.vue2
-rw-r--r--apps/theming/src/components/UserPrimaryColor.vue2
-rw-r--r--apps/theming/src/components/admin/FileInputField.vue2
-rw-r--r--apps/theming/tests/Migration/Version2006Date20240905111627Test.php2
-rw-r--r--apps/twofactor_backupcodes/l10n/es.js10
-rw-r--r--apps/twofactor_backupcodes/l10n/es.json10
-rw-r--r--apps/twofactor_backupcodes/l10n/sw.js23
-rw-r--r--apps/twofactor_backupcodes/l10n/sw.json21
-rw-r--r--apps/updatenotification/src/components/UpdateNotification.vue2
-rw-r--r--apps/user_ldap/l10n/es.js4
-rw-r--r--apps/user_ldap/l10n/es.json4
-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/uk.js19
-rw-r--r--apps/user_ldap/l10n/uk.json19
-rw-r--r--apps/user_status/l10n/sw.js29
-rw-r--r--apps/user_status/l10n/sw.json29
-rw-r--r--apps/user_status/openapi.json8
-rw-r--r--apps/weather_status/l10n/de.js2
-rw-r--r--apps/weather_status/l10n/de.json2
-rw-r--r--apps/weather_status/l10n/sw.js63
-rw-r--r--apps/weather_status/l10n/sw.json61
-rw-r--r--apps/weather_status/l10n/uk.js14
-rw-r--r--apps/weather_status/l10n/uk.json14
-rw-r--r--apps/webhook_listeners/l10n/uk.js7
-rw-r--r--apps/webhook_listeners/l10n/uk.json5
-rw-r--r--apps/webhook_listeners/l10n/uz.js7
-rw-r--r--apps/webhook_listeners/l10n/uz.json5
-rw-r--r--apps/workflowengine/l10n/mk.js10
-rw-r--r--apps/workflowengine/l10n/mk.json10
-rw-r--r--apps/workflowengine/l10n/sw.js123
-rw-r--r--apps/workflowengine/l10n/sw.json121
486 files changed, 3819 insertions, 8932 deletions
diff --git a/apps/admin_audit/l10n/be.js b/apps/admin_audit/l10n/be.js
new file mode 100644
index 00000000000..bb52accdf5c
--- /dev/null
+++ b/apps/admin_audit/l10n/be.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "admin_audit",
+ {
+ "Auditing / Logging" : "Аўдыт / Журнал",
+ "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Прадастаўляе магчымасці вядзення журнала дзенняў для Nextcloud, такіх як доступ да файлаў або іншых канфідэнцыйных дзеянняў."
+},
+"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/admin_audit/l10n/be.json b/apps/admin_audit/l10n/be.json
new file mode 100644
index 00000000000..6b36dae579b
--- /dev/null
+++ b/apps/admin_audit/l10n/be.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "Auditing / Logging" : "Аўдыт / Журнал",
+ "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Прадастаўляе магчымасці вядзення журнала дзенняў для Nextcloud, такіх як доступ да файлаў або іншых канфідэнцыйных дзеянняў."
+},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
+} \ No newline at end of file
diff --git a/apps/comments/l10n/es_CO.js b/apps/comments/l10n/es_CO.js
new file mode 100644
index 00000000000..b8516c1449b
--- /dev/null
+++ b/apps/comments/l10n/es_CO.js
@@ -0,0 +1,35 @@
+OC.L10N.register(
+ "comments",
+ {
+ "Comments" : "Comentarios",
+ "You commented" : "Comentaste",
+ "{author} commented" : "{author} comentó",
+ "You commented on %1$s" : "Usted comentó en %1$s",
+ "You commented on {file}" : "Hiciste un comentario de {file}",
+ "%1$s commented on %2$s" : "%1$s comentó en %2$s",
+ "{author} commented on {file}" : "{author} comentó en {file}",
+ "<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
+ "Files" : "Archivo",
+ "You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Fue mencionado en \"{file}\", en un comentario realizado por un usuario que ha sido eliminado",
+ "{user} mentioned you in a comment on \"{file}\"" : "{user} le mencionó en un comentario en “{file}”",
+ "Files app plugin to add comments to files" : "Plugin de la aplicación de archivos para agregar comentarios a los archivos",
+ "Edit comment" : "Editar comentario",
+ "Delete comment" : "Borrar comentario",
+ "Cancel edit" : "Cancelar edición",
+ "New comment" : "Nuevo comentario",
+ "Write a comment …" : "Escribir un comentario …",
+ "Post comment" : "Publicar comentario",
+ "@ for mentions, : for emoji, / for smart picker" : "@ para menciones, : para emoticonos, / para selector inteligente",
+ "Could not reload comments" : "No se pudieron recargar los comentarios",
+ "Failed to mark comments as read" : "No se pudieron marcar los comentarios como leídos",
+ "Unable to load the comments list" : "No se puede cargar la lista de comentarios",
+ "No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
+ "No more messages" : "No hay más mensajes",
+ "Retry" : "Reintentar",
+ "Comment" : "Comentario",
+ "An error occurred while trying to edit the comment" : "Ocurrió un error al intentar editar el comentario",
+ "Comment deleted" : "Comentario borrado",
+ "An error occurred while trying to delete the comment" : "Ocurrió un error intentando borrar el comentario",
+ "An error occurred while trying to create the comment" : "Ocurrió un error al intentar crear el comentario"
+},
+"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/comments/l10n/es_CO.json b/apps/comments/l10n/es_CO.json
new file mode 100644
index 00000000000..c212111b999
--- /dev/null
+++ b/apps/comments/l10n/es_CO.json
@@ -0,0 +1,33 @@
+{ "translations": {
+ "Comments" : "Comentarios",
+ "You commented" : "Comentaste",
+ "{author} commented" : "{author} comentó",
+ "You commented on %1$s" : "Usted comentó en %1$s",
+ "You commented on {file}" : "Hiciste un comentario de {file}",
+ "%1$s commented on %2$s" : "%1$s comentó en %2$s",
+ "{author} commented on {file}" : "{author} comentó en {file}",
+ "<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
+ "Files" : "Archivo",
+ "You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Fue mencionado en \"{file}\", en un comentario realizado por un usuario que ha sido eliminado",
+ "{user} mentioned you in a comment on \"{file}\"" : "{user} le mencionó en un comentario en “{file}”",
+ "Files app plugin to add comments to files" : "Plugin de la aplicación de archivos para agregar comentarios a los archivos",
+ "Edit comment" : "Editar comentario",
+ "Delete comment" : "Borrar comentario",
+ "Cancel edit" : "Cancelar edición",
+ "New comment" : "Nuevo comentario",
+ "Write a comment …" : "Escribir un comentario …",
+ "Post comment" : "Publicar comentario",
+ "@ for mentions, : for emoji, / for smart picker" : "@ para menciones, : para emoticonos, / para selector inteligente",
+ "Could not reload comments" : "No se pudieron recargar los comentarios",
+ "Failed to mark comments as read" : "No se pudieron marcar los comentarios como leídos",
+ "Unable to load the comments list" : "No se puede cargar la lista de comentarios",
+ "No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
+ "No more messages" : "No hay más mensajes",
+ "Retry" : "Reintentar",
+ "Comment" : "Comentario",
+ "An error occurred while trying to edit the comment" : "Ocurrió un error al intentar editar el comentario",
+ "Comment deleted" : "Comentario borrado",
+ "An error occurred while trying to delete the comment" : "Ocurrió un error intentando borrar el comentario",
+ "An error occurred while trying to create the comment" : "Ocurrió un error al intentar crear el comentario"
+},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
+} \ No newline at end of file
diff --git a/apps/dashboard/l10n/es.js b/apps/dashboard/l10n/es.js
index e8c266813f6..06a26af9975 100644
--- a/apps/dashboard/l10n/es.js
+++ b/apps/dashboard/l10n/es.js
@@ -19,8 +19,8 @@ OC.L10N.register(
"Customize" : "Personalizar",
"Edit widgets" : "Editar widgets",
"Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps",
- "Weather service" : "Servicio metereológico",
- "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.",
+ "Weather service" : "Servicio meteorológico",
+ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para su privacidad, los datos meteorológicos son solicitados por su servidor Nextcloud en su nombre, de tal forma que el servicio no reciba información personal.",
"Weather data from Met.no" : "Datos meteorológicos de Met.no",
"geocoding with Nominatim" : "geocoding con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData"
diff --git a/apps/dashboard/l10n/es.json b/apps/dashboard/l10n/es.json
index 07776366228..3629d632d0e 100644
--- a/apps/dashboard/l10n/es.json
+++ b/apps/dashboard/l10n/es.json
@@ -17,8 +17,8 @@
"Customize" : "Personalizar",
"Edit widgets" : "Editar widgets",
"Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps",
- "Weather service" : "Servicio metereológico",
- "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.",
+ "Weather service" : "Servicio meteorológico",
+ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para su privacidad, los datos meteorológicos son solicitados por su servidor Nextcloud en su nombre, de tal forma que el servicio no reciba información personal.",
"Weather data from Met.no" : "Datos meteorológicos de Met.no",
"geocoding with Nominatim" : "geocoding con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData"
diff --git a/apps/dashboard/l10n/fr.js b/apps/dashboard/l10n/fr.js
index 1d4000fb4da..342a2d26df4 100644
--- a/apps/dashboard/l10n/fr.js
+++ b/apps/dashboard/l10n/fr.js
@@ -15,7 +15,7 @@ OC.L10N.register(
"Hello" : "Bonjour",
"Hello, {name}" : "Bonjour {name}",
"Happy birthday 🥳🤩🎂🎉" : "Joyeux anniversaire ! 🥳🤩🎂🎉",
- "Happy birthday, {name} 🥳🤩🎂🎉" : "Joyeux anniversaire, {name}! 🥳🤩🎂🎉",
+ "Happy birthday, {name} 🥳🤩🎂🎉" : "Joyeux anniversaire, {name} ! 🥳🤩🎂🎉",
"Customize" : "Personnaliser",
"Edit widgets" : "Modifier les widgets",
"Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin d’applications",
diff --git a/apps/dashboard/l10n/fr.json b/apps/dashboard/l10n/fr.json
index d8a3a6c2a3d..8dea9005139 100644
--- a/apps/dashboard/l10n/fr.json
+++ b/apps/dashboard/l10n/fr.json
@@ -13,7 +13,7 @@
"Hello" : "Bonjour",
"Hello, {name}" : "Bonjour {name}",
"Happy birthday 🥳🤩🎂🎉" : "Joyeux anniversaire ! 🥳🤩🎂🎉",
- "Happy birthday, {name} 🥳🤩🎂🎉" : "Joyeux anniversaire, {name}! 🥳🤩🎂🎉",
+ "Happy birthday, {name} 🥳🤩🎂🎉" : "Joyeux anniversaire, {name} ! 🥳🤩🎂🎉",
"Customize" : "Personnaliser",
"Edit widgets" : "Modifier les widgets",
"Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin d’applications",
diff --git a/apps/dashboard/l10n/uk.js b/apps/dashboard/l10n/uk.js
index c611c807349..3310f78cbc6 100644
--- a/apps/dashboard/l10n/uk.js
+++ b/apps/dashboard/l10n/uk.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Dashboard" : "Майстерня",
"Dashboard app" : "Застосунок з панеллю віджетів ",
+ "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! People can add the widgets they like and change the background to their liking." : "Почніть свій день з інформацією\n\nПанель управління Nextcloud — це ваша відправна точка на початку дня, яка надає огляд ваших майбутніх зустрічей, термінових електронних листів, повідомлень у чаті, вхідних квитків, останніх твітів та багато іншого! Користувачі можуть додавати вподобані віджети та змінювати фон на свій смак.",
"Weather" : "Погода",
"Status" : "Статус",
"Good morning" : "Доброго ранку",
diff --git a/apps/dashboard/l10n/uk.json b/apps/dashboard/l10n/uk.json
index d3f3c712dc3..8e69d9b812b 100644
--- a/apps/dashboard/l10n/uk.json
+++ b/apps/dashboard/l10n/uk.json
@@ -1,6 +1,7 @@
{ "translations": {
"Dashboard" : "Майстерня",
"Dashboard app" : "Застосунок з панеллю віджетів ",
+ "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! People can add the widgets they like and change the background to their liking." : "Почніть свій день з інформацією\n\nПанель управління Nextcloud — це ваша відправна точка на початку дня, яка надає огляд ваших майбутніх зустрічей, термінових електронних листів, повідомлень у чаті, вхідних квитків, останніх твітів та багато іншого! Користувачі можуть додавати вподобані віджети та змінювати фон на свій смак.",
"Weather" : "Погода",
"Status" : "Статус",
"Good morning" : "Доброго ранку",
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index a4ce51fd89c..9021ba98a0f 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -65,6 +65,7 @@
<command>OCA\DAV\Command\DeleteSubscription</command>
<command>OCA\DAV\Command\ExportCalendar</command>
<command>OCA\DAV\Command\FixCalendarSyncCommand</command>
+ <command>OCA\DAV\Command\GetAbsenceCommand</command>
<command>OCA\DAV\Command\ListAddressbooks</command>
<command>OCA\DAV\Command\ListCalendarShares</command>
<command>OCA\DAV\Command\ListCalendars</command>
@@ -73,6 +74,7 @@
<command>OCA\DAV\Command\RemoveInvalidShares</command>
<command>OCA\DAV\Command\RetentionCleanupCommand</command>
<command>OCA\DAV\Command\SendEventReminders</command>
+ <command>OCA\DAV\Command\SetAbsenceCommand</command>
<command>OCA\DAV\Command\SyncBirthdayCalendar</command>
<command>OCA\DAV\Command\SyncSystemAddressBook</command>
</commands>
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php
index 28dfeaed498..764f94ef665 100644
--- a/apps/dav/composer/composer/autoload_classmap.php
+++ b/apps/dav/composer/composer/autoload_classmap.php
@@ -60,6 +60,7 @@ return array(
'OCA\\DAV\\CalDAV\\CalendarProvider' => $baseDir . '/../lib/CalDAV/CalendarProvider.php',
'OCA\\DAV\\CalDAV\\CalendarRoot' => $baseDir . '/../lib/CalDAV/CalendarRoot.php',
'OCA\\DAV\\CalDAV\\DefaultCalendarValidator' => $baseDir . '/../lib/CalDAV/DefaultCalendarValidator.php',
+ 'OCA\\DAV\\CalDAV\\EmbeddedCalDavServer' => $baseDir . '/../lib/CalDAV/EmbeddedCalDavServer.php',
'OCA\\DAV\\CalDAV\\EventComparisonService' => $baseDir . '/../lib/CalDAV/EventComparisonService.php',
'OCA\\DAV\\CalDAV\\EventReader' => $baseDir . '/../lib/CalDAV/EventReader.php',
'OCA\\DAV\\CalDAV\\EventReaderRDate' => $baseDir . '/../lib/CalDAV/EventReaderRDate.php',
@@ -164,6 +165,7 @@ return array(
'OCA\\DAV\\Command\\DeleteSubscription' => $baseDir . '/../lib/Command/DeleteSubscription.php',
'OCA\\DAV\\Command\\ExportCalendar' => $baseDir . '/../lib/Command/ExportCalendar.php',
'OCA\\DAV\\Command\\FixCalendarSyncCommand' => $baseDir . '/../lib/Command/FixCalendarSyncCommand.php',
+ 'OCA\\DAV\\Command\\GetAbsenceCommand' => $baseDir . '/../lib/Command/GetAbsenceCommand.php',
'OCA\\DAV\\Command\\ListAddressbooks' => $baseDir . '/../lib/Command/ListAddressbooks.php',
'OCA\\DAV\\Command\\ListCalendarShares' => $baseDir . '/../lib/Command/ListCalendarShares.php',
'OCA\\DAV\\Command\\ListCalendars' => $baseDir . '/../lib/Command/ListCalendars.php',
@@ -172,6 +174,7 @@ return array(
'OCA\\DAV\\Command\\RemoveInvalidShares' => $baseDir . '/../lib/Command/RemoveInvalidShares.php',
'OCA\\DAV\\Command\\RetentionCleanupCommand' => $baseDir . '/../lib/Command/RetentionCleanupCommand.php',
'OCA\\DAV\\Command\\SendEventReminders' => $baseDir . '/../lib/Command/SendEventReminders.php',
+ 'OCA\\DAV\\Command\\SetAbsenceCommand' => $baseDir . '/../lib/Command/SetAbsenceCommand.php',
'OCA\\DAV\\Command\\SyncBirthdayCalendar' => $baseDir . '/../lib/Command/SyncBirthdayCalendar.php',
'OCA\\DAV\\Command\\SyncSystemAddressBook' => $baseDir . '/../lib/Command/SyncSystemAddressBook.php',
'OCA\\DAV\\Comments\\CommentNode' => $baseDir . '/../lib/Comments/CommentNode.php',
diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php
index 83661b73a30..f3d1eacfcd0 100644
--- a/apps/dav/composer/composer/autoload_static.php
+++ b/apps/dav/composer/composer/autoload_static.php
@@ -75,6 +75,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\CalDAV\\CalendarProvider' => __DIR__ . '/..' . '/../lib/CalDAV/CalendarProvider.php',
'OCA\\DAV\\CalDAV\\CalendarRoot' => __DIR__ . '/..' . '/../lib/CalDAV/CalendarRoot.php',
'OCA\\DAV\\CalDAV\\DefaultCalendarValidator' => __DIR__ . '/..' . '/../lib/CalDAV/DefaultCalendarValidator.php',
+ 'OCA\\DAV\\CalDAV\\EmbeddedCalDavServer' => __DIR__ . '/..' . '/../lib/CalDAV/EmbeddedCalDavServer.php',
'OCA\\DAV\\CalDAV\\EventComparisonService' => __DIR__ . '/..' . '/../lib/CalDAV/EventComparisonService.php',
'OCA\\DAV\\CalDAV\\EventReader' => __DIR__ . '/..' . '/../lib/CalDAV/EventReader.php',
'OCA\\DAV\\CalDAV\\EventReaderRDate' => __DIR__ . '/..' . '/../lib/CalDAV/EventReaderRDate.php',
@@ -179,6 +180,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Command\\DeleteSubscription' => __DIR__ . '/..' . '/../lib/Command/DeleteSubscription.php',
'OCA\\DAV\\Command\\ExportCalendar' => __DIR__ . '/..' . '/../lib/Command/ExportCalendar.php',
'OCA\\DAV\\Command\\FixCalendarSyncCommand' => __DIR__ . '/..' . '/../lib/Command/FixCalendarSyncCommand.php',
+ 'OCA\\DAV\\Command\\GetAbsenceCommand' => __DIR__ . '/..' . '/../lib/Command/GetAbsenceCommand.php',
'OCA\\DAV\\Command\\ListAddressbooks' => __DIR__ . '/..' . '/../lib/Command/ListAddressbooks.php',
'OCA\\DAV\\Command\\ListCalendarShares' => __DIR__ . '/..' . '/../lib/Command/ListCalendarShares.php',
'OCA\\DAV\\Command\\ListCalendars' => __DIR__ . '/..' . '/../lib/Command/ListCalendars.php',
@@ -187,6 +189,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Command\\RemoveInvalidShares' => __DIR__ . '/..' . '/../lib/Command/RemoveInvalidShares.php',
'OCA\\DAV\\Command\\RetentionCleanupCommand' => __DIR__ . '/..' . '/../lib/Command/RetentionCleanupCommand.php',
'OCA\\DAV\\Command\\SendEventReminders' => __DIR__ . '/..' . '/../lib/Command/SendEventReminders.php',
+ 'OCA\\DAV\\Command\\SetAbsenceCommand' => __DIR__ . '/..' . '/../lib/Command/SetAbsenceCommand.php',
'OCA\\DAV\\Command\\SyncBirthdayCalendar' => __DIR__ . '/..' . '/../lib/Command/SyncBirthdayCalendar.php',
'OCA\\DAV\\Command\\SyncSystemAddressBook' => __DIR__ . '/..' . '/../lib/Command/SyncSystemAddressBook.php',
'OCA\\DAV\\Comments\\CommentNode' => __DIR__ . '/..' . '/../lib/Comments/CommentNode.php',
diff --git a/apps/dav/l10n/es.js b/apps/dav/l10n/es.js
index 22365efe29b..3a90c947088 100644
--- a/apps/dav/l10n/es.js
+++ b/apps/dav/l10n/es.js
@@ -10,8 +10,8 @@ OC.L10N.register(
"You deleted calendar {calendar}" : "Usted eliminó el calendario {calendar}",
"{actor} updated calendar {calendar}" : "{actor} actualizó el calendario {calendar}",
"You updated calendar {calendar}" : "Usted actualizó el calendario {calendar}",
- "{actor} restored calendar {calendar}" : "{actor} ha restablecido el calendario {calendar}",
- "You restored calendar {calendar}" : "Has restablecido el calendario {calendar}",
+ "{actor} restored calendar {calendar}" : "{actor} ha restaurado el calendario {calendar}",
+ "You restored calendar {calendar}" : "Ud. ha restaurado el calendario {calendar}",
"You shared calendar {calendar} as public link" : "Has compartido el calendario {calendar} con un enlace público",
"You removed public link for calendar {calendar}" : "Has eliminado el enlace público al calendario {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} compartió el calendario {calendar} con usted",
@@ -33,9 +33,9 @@ OC.L10N.register(
"{actor} updated event {event} in calendar {calendar}" : "{actor} actualizó el evento {event} en el calendario {calendar}",
"You updated event {event} in calendar {calendar}" : "Usted actualizó el evento {event} en el calendario {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} ha movido el evento {event} del calendario {sourceCalendar} al calendario {targetCalendar}",
- "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Has movido el evento {event} del calendario {sourceCalendar} al calendario {targetCalendar}",
- "{actor} restored event {event} of calendar {calendar}" : "{actor} ha restablecido el evento {event} del calendario {calendar}",
- "You restored event {event} of calendar {calendar}" : "Has reestablecido el evento {event} del calendario {calendar}",
+ "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Ud. ha movido el evento {event} del calendario {sourceCalendar} al calendario {targetCalendar}",
+ "{actor} restored event {event} of calendar {calendar}" : "{actor} ha restaurado el evento {event} del calendario {calendar}",
+ "You restored event {event} of calendar {calendar}" : "Ud. ha restaurado el evento {event} del calendario {calendar}",
"Busy" : "Ocupado",
"{actor} created to-do {todo} in list {calendar}" : "{actor} ha creado la tarea {todo} en la lista {calendar}",
"You created to-do {todo} in list {calendar}" : "Has creado la tarea {todo} en la lista {calendar}",
@@ -189,10 +189,12 @@ OC.L10N.register(
"Second" : "Segundo",
"Third" : "Tercero",
"Fourth" : "Cuarto",
+ "Fifth" : "Quinto",
"Last" : "Última",
"Second Last" : "Penúltima",
"Third Last" : "Antepenúltima",
"Fourth Last" : "Cuarta última",
+ "Fifth Last" : "Quinto último",
"Contacts" : "Contactos",
"{actor} created address book {addressbook}" : "{actor} ha creado la libreta de direcciones {addressbook}",
"You created address book {addressbook}" : "Has creado la libreta de direcciones {addressbook}",
@@ -248,6 +250,11 @@ OC.L10N.register(
"Completed on %s" : "Completado el %s",
"Due on %s by %s" : "Finaliza el %s por %s",
"Due on %s" : "Finaliza el %s",
+ "Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "¡Bienvenido a Nextcloud Calendar!\n\nEste es un evento de ejemplo - ¡explore la flexibilidad de planear con Nextcloud Calendar editando cuantas veces quiera!\n\nCon Nextcloud Calendar, podrá:\n- Crear, editar, y administrar eventos fácilmente.\n- Crear múltiples calendarios y compartirlos con su equipo de trabajo, amigos, o su familia.\n- Verificar la disponibilidad y mostrar sus tiempos de ocupado a otros.\n- Se integra de manera transparente con otras apps y dispositivos via CalDAV.\n- Personalice su experiencia: Programe eventos recurrentes, ajuste las notificaciones, así como otros ajustes.",
+ "Example event - open me!" : "Evento de ejemplo - ¡ábralo!",
+ "System Address Book" : "Libreta de Direcciones del Sistema",
+ "The system address book contains contact information for all users in your instance." : "La libreta de direcciones del sistema contiene la información de contacto de todos los usuarios de su instancia.",
+ "Enable System Address Book" : "Habilitar la Libreta de Direcciones del Sistema",
"DAV system address book" : "Libreta de direcciónes DAV del sistema",
"No outstanding DAV system address book sync." : "No hay una sincronización pendiente en la libreta de direcciones DAV del sistema.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "La sincronización DAV de la libreta de direcciones del sistema no se ha ejecutado ya que su instancia tiene más de 1000 usuarios o por que ha ocurrido un error. Por favor, ejecútela manualmente llamando al comando: \"occ dav:sync-system-addressbook\".",
@@ -288,7 +295,22 @@ OC.L10N.register(
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar los ajustes",
+ "Contact reset successfully" : "El contacto fue restablecido exitosamente",
+ "Error while resetting contact" : "Error al restablecer el contacto",
+ "Contact imported successfully" : "El contacto se importó exitosamente",
+ "Error while importing contact" : "Error al importar el contacto",
+ "Import contact" : "Importar contacto",
"Reset to default" : "Reestablecer a predeterminado",
+ "Import contacts" : "Importar contactos",
+ "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importar un nuevo archivo .vcf eliminará el contacto predeterminado existente y lo reemplazará con el nuevo. ¿Desea continuar?",
+ "Failed to save example event creation setting" : "Fallo al guardar el ajuste de creación de evento de ejemplo",
+ "Failed to upload the example event" : "Fallo al cargar el evento de ejemplo",
+ "Custom example event was saved successfully" : "El evento de ejemplo personalizado se guardó exitosamente",
+ "Failed to delete the custom example event" : "Fallo al guardar el evento de ejemplo personalizado",
+ "Custom example event was deleted successfully" : "El evento de ejemplo personalizado se eliminó exitosamente",
+ "Import calendar event" : "Importar evento del calendario",
+ "Uploading a new event will overwrite the existing one." : "Cargar un evento nuevo sobrescribirá el existente. ",
+ "Upload event" : "Cargar evento",
"Availability" : "Disponibilidad",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Si configura sus horas laborales, otras personas verán cuando está fuera de la oficina cuando agenden una reunión.",
"Absence" : "Ausencia",
@@ -305,6 +327,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorio también a los usuarios con los que se comparte el calendario",
"Reminders are always sent to organizers and attendees." : "Los recordatorios siempre se envían a los organizadores y asistentes.",
"Enable notifications for events via push" : "Activar notificaciones push para eventos",
+ "Example content" : "Contenido de ejemplo",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "El contenido de ejemplo sirve para mostrar las características de Nextcloud. Se proporciona un contenido predeterminado con Nextcloud, y puede ser reemplazado por un contenido personalizado.",
"There was an error updating your attendance status." : "Ha habido un error al actualizar tu estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacta directamente con el organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
diff --git a/apps/dav/l10n/es.json b/apps/dav/l10n/es.json
index bed92b5fd76..2407b255578 100644
--- a/apps/dav/l10n/es.json
+++ b/apps/dav/l10n/es.json
@@ -8,8 +8,8 @@
"You deleted calendar {calendar}" : "Usted eliminó el calendario {calendar}",
"{actor} updated calendar {calendar}" : "{actor} actualizó el calendario {calendar}",
"You updated calendar {calendar}" : "Usted actualizó el calendario {calendar}",
- "{actor} restored calendar {calendar}" : "{actor} ha restablecido el calendario {calendar}",
- "You restored calendar {calendar}" : "Has restablecido el calendario {calendar}",
+ "{actor} restored calendar {calendar}" : "{actor} ha restaurado el calendario {calendar}",
+ "You restored calendar {calendar}" : "Ud. ha restaurado el calendario {calendar}",
"You shared calendar {calendar} as public link" : "Has compartido el calendario {calendar} con un enlace público",
"You removed public link for calendar {calendar}" : "Has eliminado el enlace público al calendario {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} compartió el calendario {calendar} con usted",
@@ -31,9 +31,9 @@
"{actor} updated event {event} in calendar {calendar}" : "{actor} actualizó el evento {event} en el calendario {calendar}",
"You updated event {event} in calendar {calendar}" : "Usted actualizó el evento {event} en el calendario {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} ha movido el evento {event} del calendario {sourceCalendar} al calendario {targetCalendar}",
- "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Has movido el evento {event} del calendario {sourceCalendar} al calendario {targetCalendar}",
- "{actor} restored event {event} of calendar {calendar}" : "{actor} ha restablecido el evento {event} del calendario {calendar}",
- "You restored event {event} of calendar {calendar}" : "Has reestablecido el evento {event} del calendario {calendar}",
+ "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Ud. ha movido el evento {event} del calendario {sourceCalendar} al calendario {targetCalendar}",
+ "{actor} restored event {event} of calendar {calendar}" : "{actor} ha restaurado el evento {event} del calendario {calendar}",
+ "You restored event {event} of calendar {calendar}" : "Ud. ha restaurado el evento {event} del calendario {calendar}",
"Busy" : "Ocupado",
"{actor} created to-do {todo} in list {calendar}" : "{actor} ha creado la tarea {todo} en la lista {calendar}",
"You created to-do {todo} in list {calendar}" : "Has creado la tarea {todo} en la lista {calendar}",
@@ -187,10 +187,12 @@
"Second" : "Segundo",
"Third" : "Tercero",
"Fourth" : "Cuarto",
+ "Fifth" : "Quinto",
"Last" : "Última",
"Second Last" : "Penúltima",
"Third Last" : "Antepenúltima",
"Fourth Last" : "Cuarta última",
+ "Fifth Last" : "Quinto último",
"Contacts" : "Contactos",
"{actor} created address book {addressbook}" : "{actor} ha creado la libreta de direcciones {addressbook}",
"You created address book {addressbook}" : "Has creado la libreta de direcciones {addressbook}",
@@ -246,6 +248,11 @@
"Completed on %s" : "Completado el %s",
"Due on %s by %s" : "Finaliza el %s por %s",
"Due on %s" : "Finaliza el %s",
+ "Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "¡Bienvenido a Nextcloud Calendar!\n\nEste es un evento de ejemplo - ¡explore la flexibilidad de planear con Nextcloud Calendar editando cuantas veces quiera!\n\nCon Nextcloud Calendar, podrá:\n- Crear, editar, y administrar eventos fácilmente.\n- Crear múltiples calendarios y compartirlos con su equipo de trabajo, amigos, o su familia.\n- Verificar la disponibilidad y mostrar sus tiempos de ocupado a otros.\n- Se integra de manera transparente con otras apps y dispositivos via CalDAV.\n- Personalice su experiencia: Programe eventos recurrentes, ajuste las notificaciones, así como otros ajustes.",
+ "Example event - open me!" : "Evento de ejemplo - ¡ábralo!",
+ "System Address Book" : "Libreta de Direcciones del Sistema",
+ "The system address book contains contact information for all users in your instance." : "La libreta de direcciones del sistema contiene la información de contacto de todos los usuarios de su instancia.",
+ "Enable System Address Book" : "Habilitar la Libreta de Direcciones del Sistema",
"DAV system address book" : "Libreta de direcciónes DAV del sistema",
"No outstanding DAV system address book sync." : "No hay una sincronización pendiente en la libreta de direcciones DAV del sistema.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "La sincronización DAV de la libreta de direcciones del sistema no se ha ejecutado ya que su instancia tiene más de 1000 usuarios o por que ha ocurrido un error. Por favor, ejecútela manualmente llamando al comando: \"occ dav:sync-system-addressbook\".",
@@ -286,7 +293,22 @@
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar los ajustes",
+ "Contact reset successfully" : "El contacto fue restablecido exitosamente",
+ "Error while resetting contact" : "Error al restablecer el contacto",
+ "Contact imported successfully" : "El contacto se importó exitosamente",
+ "Error while importing contact" : "Error al importar el contacto",
+ "Import contact" : "Importar contacto",
"Reset to default" : "Reestablecer a predeterminado",
+ "Import contacts" : "Importar contactos",
+ "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importar un nuevo archivo .vcf eliminará el contacto predeterminado existente y lo reemplazará con el nuevo. ¿Desea continuar?",
+ "Failed to save example event creation setting" : "Fallo al guardar el ajuste de creación de evento de ejemplo",
+ "Failed to upload the example event" : "Fallo al cargar el evento de ejemplo",
+ "Custom example event was saved successfully" : "El evento de ejemplo personalizado se guardó exitosamente",
+ "Failed to delete the custom example event" : "Fallo al guardar el evento de ejemplo personalizado",
+ "Custom example event was deleted successfully" : "El evento de ejemplo personalizado se eliminó exitosamente",
+ "Import calendar event" : "Importar evento del calendario",
+ "Uploading a new event will overwrite the existing one." : "Cargar un evento nuevo sobrescribirá el existente. ",
+ "Upload event" : "Cargar evento",
"Availability" : "Disponibilidad",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Si configura sus horas laborales, otras personas verán cuando está fuera de la oficina cuando agenden una reunión.",
"Absence" : "Ausencia",
@@ -303,6 +325,8 @@
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorio también a los usuarios con los que se comparte el calendario",
"Reminders are always sent to organizers and attendees." : "Los recordatorios siempre se envían a los organizadores y asistentes.",
"Enable notifications for events via push" : "Activar notificaciones push para eventos",
+ "Example content" : "Contenido de ejemplo",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "El contenido de ejemplo sirve para mostrar las características de Nextcloud. Se proporciona un contenido predeterminado con Nextcloud, y puede ser reemplazado por un contenido personalizado.",
"There was an error updating your attendance status." : "Ha habido un error al actualizar tu estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacta directamente con el organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
diff --git a/apps/dav/l10n/pl.js b/apps/dav/l10n/pl.js
index 3edcbb7447f..3c9929cc943 100644
--- a/apps/dav/l10n/pl.js
+++ b/apps/dav/l10n/pl.js
@@ -78,6 +78,11 @@ OC.L10N.register(
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Za jeden dzień, dnia %1$s, przez cały dzień","Za %n dni, dnia %1$s, przez cały dzień","Za %n dni, dnia %1$s, przez cały dzień","Za %n dni, dnia %1$s, przez cały dzień"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za tydzień, dnia %1$s, przez cały dzień","Za %n tygodnie, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["W ciągu miesiąca, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień"],
+ "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za rok dnia %1$s przez cały dzień","Za %n lata dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień"],
+ "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za dzień, dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s"],
+ "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za tydzień dnia %1$s między %2$s - %3$s","Za %n tygodnie dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s"],
+ "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za miesiąc dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s"],
+ "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Za rok dnia %1$s między %2$s - %3$s","Za %n lata dnia %1$s między %2$s - %3$s","Za %n lat dnia %1$s między %2$s - %3$s","Za %n lat dnia %1$s między %2$s - %3$s"],
"Could not generate when statement" : "Nie można wygenerować instrukcji when",
"Every Day for the entire day" : "Codziennie przez cały dzień",
"Every Day for the entire day until %1$s" : "Codziennie przez cały dzień do %1$s",
@@ -88,15 +93,21 @@ OC.L10N.register(
"Every %1$d Days between %2$s - %3$s until %4$s" : "Co %1$d dni, pomiędzy %2$s - %3$s aż do %4$s",
"Could not generate event recurrence statement" : "Nie można wygenerować zestawienia powtórzeń zdarzenia",
"Every Week on %1$s for the entire day" : "Każdego tygodnia w %1$s przez cały dzień",
+ "Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Każdego %1$d miesiąca dnia %2$s między %3$s - %4$s do %5$s",
+ "Every Year in %1$s on the %2$s for the entire day" : "Co rok w %1$s dnia %2$s przez cały dzień",
+ "Every Year in %1$s on the %2$s for the entire day until %3$s" : "Co rok w %1$s dnia %2$s przez cały dzień do %3$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s do %5$s",
+ "Every %1$d Years in %2$s on the %3$s for the entire day" : "Co %1$d lat dnia %2$s o %3$s przez cały dzień",
"In the past on %1$s" : "W przeszłości dnia %1$s",
- "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %2$s","Za %1$n minuty dnia %2$s","Za %1$n minut dnia %2$s","Za %1$n minut dnia %2$s"],
- "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %2$s","Za %1$n godziny dnia %2$s","Za %1$n godzin dnia %2$s","Za %1$n godzin dnia %2$s"],
- "_In a day on %1$s_::_In %n days on %1$s_" : ["Za dzień, dnia %2$s","Za %1$n dni dnia %2$s","Za %1$n dni dnia %2$s","Za %1$n dni dnia %2$s"],
- "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Za tydzień dnia %2$s","Za %1$n tygodnie dnia %2$s","Za %1$n tygodni dnia %2$s","Za %1$n tygodni dnia %2$s"],
- "_In a month on %1$s_::_In %n months on %1$s_" : ["Za miesiąc dnia %2$s","W ciągu %1$n miesięcy dnia %2$s","W ciągu %1$n miesięcy dnia %2$s","W ciągu %1$n miesięcy dnia %2$s"],
- "_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %2$s","Za %1$n lata dnia %2$s","Za %1$n lat dnia %2$s","Za %1$n lat dnia %2$s"],
+ "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s"],
+ "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %1$s","Za %n godziny dnia %1$s","Za %n godzin dnia %1$s","Za %n godzin dnia %1$s"],
+ "_In a day on %1$s_::_In %n days on %1$s_" : ["Za dzień, dnia %1$s","Za %n dni dnia %1$s","Za %n dni dnia %1$s","Za %n dni dnia %1$s"],
+ "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Za tydzień dnia %1$s","Za %n tygodnie dnia %1$s","Za %n tygodni dnia %1$s","Za %n tygodni dnia %1$s"],
+ "_In a month on %1$s_::_In %n months on %1$s_" : ["Za miesiąc dnia %1$s","W ciągu %n miesięcy dnia %1$s","W ciągu %n miesięcy dnia %1$s","W ciągu %n miesięcy dnia %1$s"],
+ "_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s"],
"In the past on %1$s then on %2$s" : "W przeszłości dnia %1$s, a następnie %2$s",
- "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %2$s, a następnie %3$s","Za %1$n minuty dnia %2$s, a następnie %3$s","Za %1$n minut dnia %2$s, a następnie %3$s","Za %1$n minut dnia %2$s, a następnie %3$s"],
+ "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %1$s, a następnie %2$s","Za %n minuty dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s"],
"Could not generate next recurrence statement" : "Nie można wygenerować następnej instrukcji powtarzania",
"Cancelled: %1$s" : "Anulowane: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" zostało anulowane",
diff --git a/apps/dav/l10n/pl.json b/apps/dav/l10n/pl.json
index 8a35719cf92..4b2ffc40dc0 100644
--- a/apps/dav/l10n/pl.json
+++ b/apps/dav/l10n/pl.json
@@ -76,6 +76,11 @@
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Za jeden dzień, dnia %1$s, przez cały dzień","Za %n dni, dnia %1$s, przez cały dzień","Za %n dni, dnia %1$s, przez cały dzień","Za %n dni, dnia %1$s, przez cały dzień"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za tydzień, dnia %1$s, przez cały dzień","Za %n tygodnie, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["W ciągu miesiąca, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień"],
+ "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za rok dnia %1$s przez cały dzień","Za %n lata dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień"],
+ "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za dzień, dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s"],
+ "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za tydzień dnia %1$s między %2$s - %3$s","Za %n tygodnie dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s"],
+ "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za miesiąc dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s"],
+ "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Za rok dnia %1$s między %2$s - %3$s","Za %n lata dnia %1$s między %2$s - %3$s","Za %n lat dnia %1$s między %2$s - %3$s","Za %n lat dnia %1$s między %2$s - %3$s"],
"Could not generate when statement" : "Nie można wygenerować instrukcji when",
"Every Day for the entire day" : "Codziennie przez cały dzień",
"Every Day for the entire day until %1$s" : "Codziennie przez cały dzień do %1$s",
@@ -86,15 +91,21 @@
"Every %1$d Days between %2$s - %3$s until %4$s" : "Co %1$d dni, pomiędzy %2$s - %3$s aż do %4$s",
"Could not generate event recurrence statement" : "Nie można wygenerować zestawienia powtórzeń zdarzenia",
"Every Week on %1$s for the entire day" : "Każdego tygodnia w %1$s przez cały dzień",
+ "Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Każdego %1$d miesiąca dnia %2$s między %3$s - %4$s do %5$s",
+ "Every Year in %1$s on the %2$s for the entire day" : "Co rok w %1$s dnia %2$s przez cały dzień",
+ "Every Year in %1$s on the %2$s for the entire day until %3$s" : "Co rok w %1$s dnia %2$s przez cały dzień do %3$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s do %5$s",
+ "Every %1$d Years in %2$s on the %3$s for the entire day" : "Co %1$d lat dnia %2$s o %3$s przez cały dzień",
"In the past on %1$s" : "W przeszłości dnia %1$s",
- "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %2$s","Za %1$n minuty dnia %2$s","Za %1$n minut dnia %2$s","Za %1$n minut dnia %2$s"],
- "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %2$s","Za %1$n godziny dnia %2$s","Za %1$n godzin dnia %2$s","Za %1$n godzin dnia %2$s"],
- "_In a day on %1$s_::_In %n days on %1$s_" : ["Za dzień, dnia %2$s","Za %1$n dni dnia %2$s","Za %1$n dni dnia %2$s","Za %1$n dni dnia %2$s"],
- "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Za tydzień dnia %2$s","Za %1$n tygodnie dnia %2$s","Za %1$n tygodni dnia %2$s","Za %1$n tygodni dnia %2$s"],
- "_In a month on %1$s_::_In %n months on %1$s_" : ["Za miesiąc dnia %2$s","W ciągu %1$n miesięcy dnia %2$s","W ciągu %1$n miesięcy dnia %2$s","W ciągu %1$n miesięcy dnia %2$s"],
- "_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %2$s","Za %1$n lata dnia %2$s","Za %1$n lat dnia %2$s","Za %1$n lat dnia %2$s"],
+ "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s"],
+ "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %1$s","Za %n godziny dnia %1$s","Za %n godzin dnia %1$s","Za %n godzin dnia %1$s"],
+ "_In a day on %1$s_::_In %n days on %1$s_" : ["Za dzień, dnia %1$s","Za %n dni dnia %1$s","Za %n dni dnia %1$s","Za %n dni dnia %1$s"],
+ "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Za tydzień dnia %1$s","Za %n tygodnie dnia %1$s","Za %n tygodni dnia %1$s","Za %n tygodni dnia %1$s"],
+ "_In a month on %1$s_::_In %n months on %1$s_" : ["Za miesiąc dnia %1$s","W ciągu %n miesięcy dnia %1$s","W ciągu %n miesięcy dnia %1$s","W ciągu %n miesięcy dnia %1$s"],
+ "_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s"],
"In the past on %1$s then on %2$s" : "W przeszłości dnia %1$s, a następnie %2$s",
- "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %2$s, a następnie %3$s","Za %1$n minuty dnia %2$s, a następnie %3$s","Za %1$n minut dnia %2$s, a następnie %3$s","Za %1$n minut dnia %2$s, a następnie %3$s"],
+ "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %1$s, a następnie %2$s","Za %n minuty dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s"],
"Could not generate next recurrence statement" : "Nie można wygenerować następnej instrukcji powtarzania",
"Cancelled: %1$s" : "Anulowane: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" zostało anulowane",
diff --git a/apps/dav/l10n/uk.js b/apps/dav/l10n/uk.js
index c8beb750ce2..3cc1b76d603 100644
--- a/apps/dav/l10n/uk.js
+++ b/apps/dav/l10n/uk.js
@@ -73,6 +73,19 @@ OC.L10N.register(
"Where: %s" : "Місце: %s",
"%1$s via %2$s" : "%1$s через %2$s",
"In the past on %1$s for the entire day" : "Раніше у %1$s протягом цілого дня",
+ "_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["За хвилину на %1$s протягом усього дня","За %n хвилини на %1$s протягом усього дня","За %n хвилин на %1$s протягом усього дня","За %n хвилин на %1$s протягом усього дня"],
+ "_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["За годину на %1$s протягом усього дня","За %n години на %1$s протягом усього дня","За %n годин на %1$s протягом усього дня","За %n годин на %1$s протягом усього дня"],
+ "_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["За день на %1$s протягом усього дня","За %n дня на %1$s протягом усього дня","За %n днів на %1$s протягом усього дня","За %n днів на %1$s протягом усього дня"],
+ "_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Через тиждень на %1$ за весь день","Через %n тижнів на %1$ на весь день","Через %n тижнів на %1$ на весь день","Через %n тижнів на %1$ на весь день"],
+ "_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Через місяць на %1$ за весь день","За %n місяців на %1$ за весь день","За %n місяців на %1$ за весь день","За %n місяців на %1$ за весь день"],
+ "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Через рік на %1$ за весь день","За %n років на %1$ за весь день","За %n років на %1$ за весь день","За %n років на %1$ за весь день"],
+ "In the past on %1$s between %2$s - %3$s" : "У минулому на %1$ між %2$ - %3$",
+ "_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["За хвилину на %1$s між %2$s - %3$s","За %n хвилин на %1$s між %2$s - %3$s","За %n хвилин на %1$s між %2$s - %3$s","За %n хвилин на %1$s між %2$s - %3$s"],
+ "_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["За годину з %1$s між %2$s - %3$s","За %n годин на %1$s між %2$s - %3$s","За %n годин на %1$s між %2$s - %3$s","За %n годин на %1$s між %2$s - %3$s"],
+ "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["За день на %1$s між %2$s - %3$s","За %n днів на %1$s між %2$s - %3$s","За %n днів на %1$s між %2$s - %3$s","За %n днів на %1$s між %2$s - %3$s"],
+ "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["За тиждень на %1$ між %2$ - %3$","За %n тижнів на %1$s між %2$s - %3$s","За %n тижнів на %1$s між %2$s - %3$s","За %n тижнів на %1$s між %2$s - %3$s"],
+ "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["За місяць на %1$ між %2$ - %3$","За %n місяців на %1$s між %2$s - %3$s","За %n місяців на %1$s між %2$s - %3$s","За %n місяців на %1$s між %2$s - %3$s"],
+ "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["За рік на %1$s між %2$s - %3$s","У %n років на %1$s між %2$s - %3$s","У %n років на %1$s між %2$s - %3$s","У %n років на %1$s між %2$s - %3$s"],
"Could not generate when statement" : "Не вдалося створити оператор \"коли\"",
"Every Day for the entire day" : "Щодня впродовж усього дня",
"Every Day for the entire day until %1$s" : "Щодня впродовж усього дня до %1$s",
@@ -110,7 +123,26 @@ OC.L10N.register(
"On specific dates for the entire day until %1$s" : "У визначені дати впродовж усього дня до %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "У визначені дати між %1$s - %2$s до %3$s",
"In the past on %1$s" : "Раніше у %1$s",
+ "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["За хвилину на %1$s","Через %n хвилин на %1$s","Через %n хвилин на %1$s","Через %n хвилин на %1$s"],
+ "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Через годину на %1$s","Через %n годин на %1$s","Через %n годин на %1$s","Через %n годин на %1$s"],
+ "_In a day on %1$s_::_In %n days on %1$s_" : ["За день на %1$s","Через %n днів на %1$s","Через %n днів на %1$s","Через %n днів на %1$s"],
+ "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Через тиждень на %1$s","Через %n тижнів на %1$s","Через %n тижнів на %1$s","Через %n тижнів на %1$s"],
+ "_In a month on %1$s_::_In %n months on %1$s_" : ["Через місяць на %1$s","За %n місяців на %1$s","За %n місяців на %1$s","За %n місяців на %1$s"],
+ "_In a year on %1$s_::_In %n years on %1$s_" : ["Через рік на %1$s","Через %n років на %1$s","Через %n років на %1$s","Через %n років на %1$s"],
"In the past on %1$s then on %2$s" : "Раніше у %1$s, потім у %2$s",
+ "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Через хвилину на %1$, потім на %2$","Через %n хвилин на %1$s, потім на %2$s","Через %n хвилин на %1$s, потім на %2$s","Через %n хвилин на %1$s, потім на %2$s"],
+ "_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Через годину на %1$s, потім на %2$s","Через %n годин на %1$s, потім на %2$s","Через %n годин на %1$s, потім на %2$s","Через %n годин на %1$s, потім на %2$s"],
+ "_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Через день на %1$, потім на %2$","Через %n днів на %1$s, потім на %2$s","Через %n днів на %1$s, потім на %2$s","Через %n днів на %1$s, потім на %2$s"],
+ "_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Через тиждень на %1$, потім на %2$","Через %n тижнів на %1$, потім на %2$","Через %n тижнів на %1$, потім на %2$","Через %n тижнів на %1$, потім на %2$"],
+ "_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Через місяць на %1$, потім на %2$","Через %n місяців на %1$, потім на %2$","Через %n місяців на %1$, потім на %2$","Через %n місяців на %1$, потім на %2$"],
+ "_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Через рік на %1$, потім на %2$","Через %n років на %1$, потім на %2$","Через %n років на %1$, потім на %2$","Через %n років на %1$, потім на %2$"],
+ "In the past on %1$s then on %2$s and %3$s" : "У минулому на %1$, потім на %2$ і %3$",
+ "_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["За хвилину на %1$, потім на %2$ і %3$","Через %n хвилин на %1$s, потім на %2$s і %3$s","Через %n хвилин на %1$s, потім на %2$s і %3$s","Через %n хвилин на %1$s, потім на %2$s і %3$s"],
+ "_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Через годину на %1$, потім на %2$ і %3$","Через %n годин на %1$, потім на %2$ і %3$","Через %n годин на %1$, потім на %2$ і %3$","Через %n годин на %1$, потім на %2$ і %3$"],
+ "_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Через день на %1$, потім на %2$ і %3$","Через %n днів на %1$, потім на %2$ і %3$","Через %n днів на %1$, потім на %2$ і %3$","Через %n днів на %1$, потім на %2$ і %3$"],
+ "_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Через тиждень на %1$, потім на %2$ і %3$","Через %n тижнів на %1$, потім на %2$ і %3$","Через %n тижнів на %1$, потім на %2$ і %3$","Через %n тижнів на %1$, потім на %2$ і %3$"],
+ "_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Через місяць на %1$, потім на %2$ і %3$","Через %n місяців на %1$, потім на %2$ і %3$","Через %n місяців на %1$, потім на %2$ і %3$","Через %n місяців на %1$, потім на %2$ і %3$"],
+ "_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Через рік на %1$, потім на %2$ і %3$","Через %n років на %1$, потім на %2$ і %3$","Через %n років на %1$, потім на %2$ і %3$","Через %n років на %1$, потім на %2$ і %3$"],
"Could not generate next recurrence statement" : "Не вдалося створити оператор наступного повторення",
"Cancelled: %1$s" : "Скасовано: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" скасовано",
@@ -218,6 +250,8 @@ OC.L10N.register(
"Completed on %s" : "Завершено %s",
"Due on %s by %s" : "До %s з боку %s",
"Due on %s" : "До %s",
+ "Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Ласкаво просимо до календаря Nextcloud!\n\nЦе зразок події — ознайомтеся з гнучкістю планування за допомогою календаря Nextcloud, вносячи будь-які зміни, які вам заманеться!\n\nЗа допомогою календаря Nextcloud ви можете:\n- Легко створювати, редагувати та керувати подіями.\n- Створювати кілька календарів і ділитися ними з колегами, друзями або родиною.\n- Перевіряти доступність і показувати іншим, коли ви зайняті.\n- Безперешкодно інтегруватися з додатками та пристроями через CalDAV.\n- Налаштовувати свій досвід: планувати повторювані події, налаштовувати сповіщення та інші параметри.",
+ "Example event - open me!" : "Приклад події - відкрий мене!",
"System Address Book" : "Системна адресна книга",
"The system address book contains contact information for all users in your instance." : "Системна адресна книга містить контактну інформацію для всіх користувачів вашого примірника хмари.",
"Enable System Address Book" : "Увімкнути системну адресну книгу",
@@ -261,9 +295,22 @@ OC.L10N.register(
"Cancel" : "Скасувати",
"Import" : "Імпорт",
"Error while saving settings" : "Помилка під час збереження налаштувань",
+ "Contact reset successfully" : "Контакт успішно скинуто",
+ "Error while resetting contact" : "Помилка під час скидання контакту",
+ "Contact imported successfully" : "Контакт імпортовано успішно",
+ "Error while importing contact" : "Помилка під час імпортування контакту",
"Import contact" : "Імпортувати контакт",
"Reset to default" : "Скинути до типового",
"Import contacts" : "Імпортувати контакти",
+ "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Імпорт нового файлу .vcf призведе до видалення наявного контакту за замовчуванням і заміни його новим. Чи хочете ви продовжити?",
+ "Failed to save example event creation setting" : "Не вдалося зберегти приклад налаштування створення події",
+ "Failed to upload the example event" : "Не вдалося завантажити приклад події",
+ "Custom example event was saved successfully" : "Приклад користувацької події було успішно збережено",
+ "Failed to delete the custom example event" : "Не вдалося видалити приклад користувацького події",
+ "Custom example event was deleted successfully" : "Приклад користувацької події було успішно видалено",
+ "Import calendar event" : "Імпортувати подію календаря",
+ "Uploading a new event will overwrite the existing one." : "Завантаження нового заходу призведе до заміни наявного.",
+ "Upload event" : "Завантажити подію",
"Availability" : "Доступність",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Будь ласка, налаштуйте ваші робочі години, щоб інші користувачі могли бачити, коли ви відсутні під час створення зустрічей.",
"Absence" : "Відсутність",
@@ -280,6 +327,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Також надсилайте нагадування користувачам вашого спільного календаря",
"Reminders are always sent to organizers and attendees." : "Нагадування завжди надсилаються організаторам і учасникам.",
"Enable notifications for events via push" : "Увімкнути push-сповіщення для подій",
+ "Example content" : "Приклад вмісту",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Приклад вмісту служить для демонстрації функцій Nextcloud. Стандартний вміст постачається разом із Nextcloud і може бути замінений на власний вміст.",
"There was an error updating your attendance status." : "Виникла помилка при оновленні вашого статусу учасника.",
"Please contact the organizer directly." : "Будь-ласка повідомте організатора.",
"Are you accepting the invitation?" : "Чи приймаєте ви запрошення?",
diff --git a/apps/dav/l10n/uk.json b/apps/dav/l10n/uk.json
index 8ac5f933cf6..ae2f2b370ec 100644
--- a/apps/dav/l10n/uk.json
+++ b/apps/dav/l10n/uk.json
@@ -71,6 +71,19 @@
"Where: %s" : "Місце: %s",
"%1$s via %2$s" : "%1$s через %2$s",
"In the past on %1$s for the entire day" : "Раніше у %1$s протягом цілого дня",
+ "_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["За хвилину на %1$s протягом усього дня","За %n хвилини на %1$s протягом усього дня","За %n хвилин на %1$s протягом усього дня","За %n хвилин на %1$s протягом усього дня"],
+ "_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["За годину на %1$s протягом усього дня","За %n години на %1$s протягом усього дня","За %n годин на %1$s протягом усього дня","За %n годин на %1$s протягом усього дня"],
+ "_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["За день на %1$s протягом усього дня","За %n дня на %1$s протягом усього дня","За %n днів на %1$s протягом усього дня","За %n днів на %1$s протягом усього дня"],
+ "_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Через тиждень на %1$ за весь день","Через %n тижнів на %1$ на весь день","Через %n тижнів на %1$ на весь день","Через %n тижнів на %1$ на весь день"],
+ "_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Через місяць на %1$ за весь день","За %n місяців на %1$ за весь день","За %n місяців на %1$ за весь день","За %n місяців на %1$ за весь день"],
+ "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Через рік на %1$ за весь день","За %n років на %1$ за весь день","За %n років на %1$ за весь день","За %n років на %1$ за весь день"],
+ "In the past on %1$s between %2$s - %3$s" : "У минулому на %1$ між %2$ - %3$",
+ "_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["За хвилину на %1$s між %2$s - %3$s","За %n хвилин на %1$s між %2$s - %3$s","За %n хвилин на %1$s між %2$s - %3$s","За %n хвилин на %1$s між %2$s - %3$s"],
+ "_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["За годину з %1$s між %2$s - %3$s","За %n годин на %1$s між %2$s - %3$s","За %n годин на %1$s між %2$s - %3$s","За %n годин на %1$s між %2$s - %3$s"],
+ "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["За день на %1$s між %2$s - %3$s","За %n днів на %1$s між %2$s - %3$s","За %n днів на %1$s між %2$s - %3$s","За %n днів на %1$s між %2$s - %3$s"],
+ "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["За тиждень на %1$ між %2$ - %3$","За %n тижнів на %1$s між %2$s - %3$s","За %n тижнів на %1$s між %2$s - %3$s","За %n тижнів на %1$s між %2$s - %3$s"],
+ "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["За місяць на %1$ між %2$ - %3$","За %n місяців на %1$s між %2$s - %3$s","За %n місяців на %1$s між %2$s - %3$s","За %n місяців на %1$s між %2$s - %3$s"],
+ "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["За рік на %1$s між %2$s - %3$s","У %n років на %1$s між %2$s - %3$s","У %n років на %1$s між %2$s - %3$s","У %n років на %1$s між %2$s - %3$s"],
"Could not generate when statement" : "Не вдалося створити оператор \"коли\"",
"Every Day for the entire day" : "Щодня впродовж усього дня",
"Every Day for the entire day until %1$s" : "Щодня впродовж усього дня до %1$s",
@@ -108,7 +121,26 @@
"On specific dates for the entire day until %1$s" : "У визначені дати впродовж усього дня до %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "У визначені дати між %1$s - %2$s до %3$s",
"In the past on %1$s" : "Раніше у %1$s",
+ "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["За хвилину на %1$s","Через %n хвилин на %1$s","Через %n хвилин на %1$s","Через %n хвилин на %1$s"],
+ "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Через годину на %1$s","Через %n годин на %1$s","Через %n годин на %1$s","Через %n годин на %1$s"],
+ "_In a day on %1$s_::_In %n days on %1$s_" : ["За день на %1$s","Через %n днів на %1$s","Через %n днів на %1$s","Через %n днів на %1$s"],
+ "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Через тиждень на %1$s","Через %n тижнів на %1$s","Через %n тижнів на %1$s","Через %n тижнів на %1$s"],
+ "_In a month on %1$s_::_In %n months on %1$s_" : ["Через місяць на %1$s","За %n місяців на %1$s","За %n місяців на %1$s","За %n місяців на %1$s"],
+ "_In a year on %1$s_::_In %n years on %1$s_" : ["Через рік на %1$s","Через %n років на %1$s","Через %n років на %1$s","Через %n років на %1$s"],
"In the past on %1$s then on %2$s" : "Раніше у %1$s, потім у %2$s",
+ "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Через хвилину на %1$, потім на %2$","Через %n хвилин на %1$s, потім на %2$s","Через %n хвилин на %1$s, потім на %2$s","Через %n хвилин на %1$s, потім на %2$s"],
+ "_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Через годину на %1$s, потім на %2$s","Через %n годин на %1$s, потім на %2$s","Через %n годин на %1$s, потім на %2$s","Через %n годин на %1$s, потім на %2$s"],
+ "_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Через день на %1$, потім на %2$","Через %n днів на %1$s, потім на %2$s","Через %n днів на %1$s, потім на %2$s","Через %n днів на %1$s, потім на %2$s"],
+ "_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Через тиждень на %1$, потім на %2$","Через %n тижнів на %1$, потім на %2$","Через %n тижнів на %1$, потім на %2$","Через %n тижнів на %1$, потім на %2$"],
+ "_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Через місяць на %1$, потім на %2$","Через %n місяців на %1$, потім на %2$","Через %n місяців на %1$, потім на %2$","Через %n місяців на %1$, потім на %2$"],
+ "_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Через рік на %1$, потім на %2$","Через %n років на %1$, потім на %2$","Через %n років на %1$, потім на %2$","Через %n років на %1$, потім на %2$"],
+ "In the past on %1$s then on %2$s and %3$s" : "У минулому на %1$, потім на %2$ і %3$",
+ "_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["За хвилину на %1$, потім на %2$ і %3$","Через %n хвилин на %1$s, потім на %2$s і %3$s","Через %n хвилин на %1$s, потім на %2$s і %3$s","Через %n хвилин на %1$s, потім на %2$s і %3$s"],
+ "_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Через годину на %1$, потім на %2$ і %3$","Через %n годин на %1$, потім на %2$ і %3$","Через %n годин на %1$, потім на %2$ і %3$","Через %n годин на %1$, потім на %2$ і %3$"],
+ "_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Через день на %1$, потім на %2$ і %3$","Через %n днів на %1$, потім на %2$ і %3$","Через %n днів на %1$, потім на %2$ і %3$","Через %n днів на %1$, потім на %2$ і %3$"],
+ "_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Через тиждень на %1$, потім на %2$ і %3$","Через %n тижнів на %1$, потім на %2$ і %3$","Через %n тижнів на %1$, потім на %2$ і %3$","Через %n тижнів на %1$, потім на %2$ і %3$"],
+ "_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Через місяць на %1$, потім на %2$ і %3$","Через %n місяців на %1$, потім на %2$ і %3$","Через %n місяців на %1$, потім на %2$ і %3$","Через %n місяців на %1$, потім на %2$ і %3$"],
+ "_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Через рік на %1$, потім на %2$ і %3$","Через %n років на %1$, потім на %2$ і %3$","Через %n років на %1$, потім на %2$ і %3$","Через %n років на %1$, потім на %2$ і %3$"],
"Could not generate next recurrence statement" : "Не вдалося створити оператор наступного повторення",
"Cancelled: %1$s" : "Скасовано: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" скасовано",
@@ -216,6 +248,8 @@
"Completed on %s" : "Завершено %s",
"Due on %s by %s" : "До %s з боку %s",
"Due on %s" : "До %s",
+ "Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Ласкаво просимо до календаря Nextcloud!\n\nЦе зразок події — ознайомтеся з гнучкістю планування за допомогою календаря Nextcloud, вносячи будь-які зміни, які вам заманеться!\n\nЗа допомогою календаря Nextcloud ви можете:\n- Легко створювати, редагувати та керувати подіями.\n- Створювати кілька календарів і ділитися ними з колегами, друзями або родиною.\n- Перевіряти доступність і показувати іншим, коли ви зайняті.\n- Безперешкодно інтегруватися з додатками та пристроями через CalDAV.\n- Налаштовувати свій досвід: планувати повторювані події, налаштовувати сповіщення та інші параметри.",
+ "Example event - open me!" : "Приклад події - відкрий мене!",
"System Address Book" : "Системна адресна книга",
"The system address book contains contact information for all users in your instance." : "Системна адресна книга містить контактну інформацію для всіх користувачів вашого примірника хмари.",
"Enable System Address Book" : "Увімкнути системну адресну книгу",
@@ -259,9 +293,22 @@
"Cancel" : "Скасувати",
"Import" : "Імпорт",
"Error while saving settings" : "Помилка під час збереження налаштувань",
+ "Contact reset successfully" : "Контакт успішно скинуто",
+ "Error while resetting contact" : "Помилка під час скидання контакту",
+ "Contact imported successfully" : "Контакт імпортовано успішно",
+ "Error while importing contact" : "Помилка під час імпортування контакту",
"Import contact" : "Імпортувати контакт",
"Reset to default" : "Скинути до типового",
"Import contacts" : "Імпортувати контакти",
+ "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Імпорт нового файлу .vcf призведе до видалення наявного контакту за замовчуванням і заміни його новим. Чи хочете ви продовжити?",
+ "Failed to save example event creation setting" : "Не вдалося зберегти приклад налаштування створення події",
+ "Failed to upload the example event" : "Не вдалося завантажити приклад події",
+ "Custom example event was saved successfully" : "Приклад користувацької події було успішно збережено",
+ "Failed to delete the custom example event" : "Не вдалося видалити приклад користувацького події",
+ "Custom example event was deleted successfully" : "Приклад користувацької події було успішно видалено",
+ "Import calendar event" : "Імпортувати подію календаря",
+ "Uploading a new event will overwrite the existing one." : "Завантаження нового заходу призведе до заміни наявного.",
+ "Upload event" : "Завантажити подію",
"Availability" : "Доступність",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Будь ласка, налаштуйте ваші робочі години, щоб інші користувачі могли бачити, коли ви відсутні під час створення зустрічей.",
"Absence" : "Відсутність",
@@ -278,6 +325,8 @@
"Send reminder notifications to calendar sharees as well" : "Також надсилайте нагадування користувачам вашого спільного календаря",
"Reminders are always sent to organizers and attendees." : "Нагадування завжди надсилаються організаторам і учасникам.",
"Enable notifications for events via push" : "Увімкнути push-сповіщення для подій",
+ "Example content" : "Приклад вмісту",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Приклад вмісту служить для демонстрації функцій Nextcloud. Стандартний вміст постачається разом із Nextcloud і може бути замінений на власний вміст.",
"There was an error updating your attendance status." : "Виникла помилка при оновленні вашого статусу учасника.",
"Please contact the organizer directly." : "Будь-ласка повідомте організатора.",
"Are you accepting the invitation?" : "Чи приймаєте ви запрошення?",
diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php
index b79bf7ea2d0..5f912da732e 100644
--- a/apps/dav/lib/CalDAV/CalendarImpl.php
+++ b/apps/dav/lib/CalDAV/CalendarImpl.php
@@ -156,19 +156,15 @@ class CalendarImpl implements ICreateFromString, IHandleImipMessage, ICalendarIs
}
/**
- * Create a new calendar event for this calendar
- * by way of an ICS string
- *
- * @param string $name the file name - needs to contain the .ics ending
- * @param string $calendarData a string containing a valid VEVENT ics
- *
* @throws CalendarException
*/
- public function createFromString(string $name, string $calendarData): void {
- $server = new InvitationResponseServer(false);
-
+ private function createFromStringInServer(
+ string $name,
+ string $calendarData,
+ \OCA\DAV\Connector\Sabre\Server $server,
+ ): void {
/** @var CustomPrincipalPlugin $plugin */
- $plugin = $server->getServer()->getPlugin('auth');
+ $plugin = $server->getPlugin('auth');
// we're working around the previous implementation
// that only allowed the public system principal to be used
// so set the custom principal here
@@ -184,14 +180,14 @@ class CalendarImpl implements ICreateFromString, IHandleImipMessage, ICalendarIs
// Force calendar change URI
/** @var Schedule\Plugin $schedulingPlugin */
- $schedulingPlugin = $server->getServer()->getPlugin('caldav-schedule');
+ $schedulingPlugin = $server->getPlugin('caldav-schedule');
$schedulingPlugin->setPathOfCalendarObjectChange($fullCalendarFilename);
$stream = fopen('php://memory', 'rb+');
fwrite($stream, $calendarData);
rewind($stream);
try {
- $server->getServer()->createFile($fullCalendarFilename, $stream);
+ $server->createFile($fullCalendarFilename, $stream);
} catch (Conflict $e) {
throw new CalendarException('Could not create new calendar event: ' . $e->getMessage(), 0, $e);
} finally {
@@ -199,6 +195,16 @@ class CalendarImpl implements ICreateFromString, IHandleImipMessage, ICalendarIs
}
}
+ public function createFromString(string $name, string $calendarData): void {
+ $server = new EmbeddedCalDavServer(false);
+ $this->createFromStringInServer($name, $calendarData, $server->getServer());
+ }
+
+ public function createFromStringMinimal(string $name, string $calendarData): void {
+ $server = new InvitationResponseServer(false);
+ $this->createFromStringInServer($name, $calendarData, $server->getServer());
+ }
+
/**
* @throws CalendarException
*/
diff --git a/apps/dav/lib/CalDAV/EmbeddedCalDavServer.php b/apps/dav/lib/CalDAV/EmbeddedCalDavServer.php
new file mode 100644
index 00000000000..21d8c06fa99
--- /dev/null
+++ b/apps/dav/lib/CalDAV/EmbeddedCalDavServer.php
@@ -0,0 +1,118 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\DAV\CalDAV;
+
+use OCA\DAV\AppInfo\PluginManager;
+use OCA\DAV\CalDAV\Auth\CustomPrincipalPlugin;
+use OCA\DAV\CalDAV\Auth\PublicPrincipalPlugin;
+use OCA\DAV\CalDAV\Publishing\PublishPlugin;
+use OCA\DAV\Connector\Sabre\AnonymousOptionsPlugin;
+use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin;
+use OCA\DAV\Connector\Sabre\CachingTree;
+use OCA\DAV\Connector\Sabre\DavAclPlugin;
+use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin;
+use OCA\DAV\Connector\Sabre\LockPlugin;
+use OCA\DAV\Connector\Sabre\MaintenancePlugin;
+use OCA\DAV\Events\SabrePluginAuthInitEvent;
+use OCA\DAV\RootCollection;
+use OCA\Theming\ThemingDefaults;
+use OCP\App\IAppManager;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IAppConfig;
+use OCP\IConfig;
+use OCP\IURLGenerator;
+use OCP\L10N\IFactory as IL10NFactory;
+use OCP\Server;
+use Psr\Log\LoggerInterface;
+
+class EmbeddedCalDavServer {
+ private readonly \OCA\DAV\Connector\Sabre\Server $server;
+
+ public function __construct(bool $public = true) {
+ $baseUri = \OC::$WEBROOT . '/remote.php/dav/';
+ $logger = Server::get(LoggerInterface::class);
+ $dispatcher = Server::get(IEventDispatcher::class);
+ $appConfig = Server::get(IAppConfig::class);
+ $l10nFactory = Server::get(IL10NFactory::class);
+ $l10n = $l10nFactory->get('dav');
+
+ $root = new RootCollection();
+ $this->server = new \OCA\DAV\Connector\Sabre\Server(new CachingTree($root));
+
+ // Add maintenance plugin
+ $this->server->addPlugin(new MaintenancePlugin(Server::get(IConfig::class), $l10n));
+
+ // Set URL explicitly due to reverse-proxy situations
+ $this->server->httpRequest->setUrl($baseUri);
+ $this->server->setBaseUri($baseUri);
+
+ $this->server->addPlugin(new BlockLegacyClientPlugin(
+ Server::get(IConfig::class),
+ Server::get(ThemingDefaults::class),
+ ));
+ $this->server->addPlugin(new AnonymousOptionsPlugin());
+
+ // allow custom principal uri option
+ if ($public) {
+ $this->server->addPlugin(new PublicPrincipalPlugin());
+ } else {
+ $this->server->addPlugin(new CustomPrincipalPlugin());
+ }
+
+ // allow setup of additional auth backends
+ $event = new SabrePluginAuthInitEvent($this->server);
+ $dispatcher->dispatchTyped($event);
+
+ $this->server->addPlugin(new ExceptionLoggerPlugin('webdav', $logger));
+ $this->server->addPlugin(new LockPlugin());
+ $this->server->addPlugin(new \Sabre\DAV\Sync\Plugin());
+
+ // acl
+ $acl = new DavAclPlugin();
+ $acl->principalCollectionSet = [
+ 'principals/users', 'principals/groups'
+ ];
+ $this->server->addPlugin($acl);
+
+ // calendar plugins
+ $this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin());
+ $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
+ $this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin(Server::get(IConfig::class), Server::get(LoggerInterface::class), Server::get(DefaultCalendarValidator::class)));
+ $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin());
+ $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin());
+ //$this->server->addPlugin(new \OCA\DAV\DAV\Sharing\Plugin($authBackend, \OC::$server->getRequest()));
+ $this->server->addPlugin(new PublishPlugin(
+ Server::get(IConfig::class),
+ Server::get(IURLGenerator::class)
+ ));
+ if ($appConfig->getValueString('dav', 'sendInvitations', 'yes') === 'yes') {
+ $this->server->addPlugin(Server::get(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class));
+ }
+
+ // wait with registering these until auth is handled and the filesystem is setup
+ $this->server->on('beforeMethod:*', function () use ($root): void {
+ // register plugins from apps
+ $pluginManager = new PluginManager(
+ \OC::$server,
+ Server::get(IAppManager::class)
+ );
+ foreach ($pluginManager->getAppPlugins() as $appPlugin) {
+ $this->server->addPlugin($appPlugin);
+ }
+ foreach ($pluginManager->getAppCollections() as $appCollection) {
+ $root->addChild($appCollection);
+ }
+ });
+ }
+
+ public function getServer(): \OCA\DAV\Connector\Sabre\Server {
+ return $this->server;
+ }
+}
diff --git a/apps/dav/lib/CalDAV/UpcomingEventsService.php b/apps/dav/lib/CalDAV/UpcomingEventsService.php
index 6614d937ff7..1a8aed5bd71 100644
--- a/apps/dav/lib/CalDAV/UpcomingEventsService.php
+++ b/apps/dav/lib/CalDAV/UpcomingEventsService.php
@@ -47,7 +47,7 @@ class UpcomingEventsService {
$this->userManager->get($userId),
);
- return array_map(function (array $event) use ($userId, $calendarAppEnabled) {
+ return array_filter(array_map(function (array $event) use ($userId, $calendarAppEnabled) {
$calendarAppUrl = null;
if ($calendarAppEnabled) {
@@ -67,6 +67,10 @@ class UpcomingEventsService {
$calendarAppUrl = $this->urlGenerator->linkToRouteAbsolute('calendar.view.indexdirect.edit', $arguments);
}
+ if (isset($event['objects'][0]['STATUS']) && $event['objects'][0]['STATUS'][0] === 'CANCELLED') {
+ return false;
+ }
+
return new UpcomingEvent(
$event['uri'],
($event['objects'][0]['RECURRENCE-ID'][0] ?? null)?->getTimeStamp(),
@@ -76,7 +80,7 @@ class UpcomingEventsService {
$event['objects'][0]['LOCATION'][0] ?? null,
$calendarAppUrl,
);
- }, $events);
+ }, $events));
}
}
diff --git a/apps/dav/lib/Command/GetAbsenceCommand.php b/apps/dav/lib/Command/GetAbsenceCommand.php
new file mode 100644
index 00000000000..50d8df4ab38
--- /dev/null
+++ b/apps/dav/lib/Command/GetAbsenceCommand.php
@@ -0,0 +1,62 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+namespace OCA\DAV\Command;
+
+use OCA\DAV\Service\AbsenceService;
+use OCP\IUserManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class GetAbsenceCommand extends Command {
+
+ public function __construct(
+ private IUserManager $userManager,
+ private AbsenceService $absenceService,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this->setName('dav:absence:get');
+ $this->addArgument(
+ 'user-id',
+ InputArgument::REQUIRED,
+ 'User ID of the affected account'
+ );
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $userId = $input->getArgument('user-id');
+
+ $user = $this->userManager->get($userId);
+ if ($user === null) {
+ $output->writeln('<error>User not found</error>');
+ return 1;
+ }
+
+ $absence = $this->absenceService->getAbsence($userId);
+ if ($absence === null) {
+ $output->writeln('<info>No absence set</info>');
+ return 0;
+ }
+
+ $output->writeln('<info>Start day:</info> ' . $absence->getFirstDay());
+ $output->writeln('<info>End day:</info> ' . $absence->getLastDay());
+ $output->writeln('<info>Short message:</info> ' . $absence->getStatus());
+ $output->writeln('<info>Message:</info> ' . $absence->getMessage());
+ $output->writeln('<info>Replacement user:</info> ' . ($absence->getReplacementUserId() ?? 'none'));
+ $output->writeln('<info>Replacement display name:</info> ' . ($absence->getReplacementUserDisplayName() ?? 'none'));
+
+ return 0;
+ }
+
+}
diff --git a/apps/dav/lib/Command/SetAbsenceCommand.php b/apps/dav/lib/Command/SetAbsenceCommand.php
new file mode 100644
index 00000000000..bf91a163f95
--- /dev/null
+++ b/apps/dav/lib/Command/SetAbsenceCommand.php
@@ -0,0 +1,95 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+namespace OCA\DAV\Command;
+
+use OCA\DAV\Service\AbsenceService;
+use OCP\IUserManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class SetAbsenceCommand extends Command {
+
+ public function __construct(
+ private IUserManager $userManager,
+ private AbsenceService $absenceService,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this->setName('dav:absence:set');
+ $this->addArgument(
+ 'user-id',
+ InputArgument::REQUIRED,
+ 'User ID of the affected account'
+ );
+ $this->addArgument(
+ 'first-day',
+ InputArgument::REQUIRED,
+ 'Inclusive start day formatted as YYYY-MM-DD'
+ );
+ $this->addArgument(
+ 'last-day',
+ InputArgument::REQUIRED,
+ 'Inclusive end day formatted as YYYY-MM-DD'
+ );
+ $this->addArgument(
+ 'short-message',
+ InputArgument::REQUIRED,
+ 'Short message'
+ );
+ $this->addArgument(
+ 'message',
+ InputArgument::REQUIRED,
+ 'Message'
+ );
+ $this->addArgument(
+ 'replacement-user-id',
+ InputArgument::OPTIONAL,
+ 'Replacement user id'
+ );
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $userId = $input->getArgument('user-id');
+
+ $user = $this->userManager->get($userId);
+ if ($user === null) {
+ $output->writeln('<error>User not found</error>');
+ return 1;
+ }
+
+ $replacementUserId = $input->getArgument('replacement-user-id');
+ if ($replacementUserId === null) {
+ $replacementUser = null;
+ } else {
+ $replacementUser = $this->userManager->get($replacementUserId);
+ if ($replacementUser === null) {
+ $output->writeln('<error>Replacement user not found</error>');
+ return 2;
+ }
+ }
+
+ $this->absenceService->createOrUpdateAbsence(
+ $user,
+ $input->getArgument('first-day'),
+ $input->getArgument('last-day'),
+ $input->getArgument('short-message'),
+ $input->getArgument('message'),
+ $replacementUser?->getUID(),
+ $replacementUser?->getDisplayName(),
+ );
+
+ return 0;
+ }
+
+}
diff --git a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
index 9e625ce3184..b59d1373af5 100644
--- a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
@@ -156,7 +156,7 @@ class FilesReportPlugin extends ServerPlugin {
// to user backends. I.e. the final result may return more results than requested.
$resultNodes = $this->processFilterRulesForFileNodes($filterRules, $limit ?? null, $offset ?? null);
} catch (TagNotFoundException $e) {
- throw new PreconditionFailed('Cannot filter by non-existing tag', 0, $e);
+ throw new PreconditionFailed('Cannot filter by non-existing tag');
}
$results = [];
diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php
index b61cabedf5f..d6ea9fd887d 100644
--- a/apps/dav/lib/Connector/Sabre/Principal.php
+++ b/apps/dav/lib/Connector/Sabre/Principal.php
@@ -186,6 +186,9 @@ class Principal implements BackendInterface {
if ($this->hasGroups || $needGroups) {
$userGroups = $this->groupManager->getUserGroups($user);
foreach ($userGroups as $userGroup) {
+ if ($userGroup->hideFromCollaboration()) {
+ continue;
+ }
$groups[] = 'principals/groups/' . urlencode($userGroup->getGID());
}
}
diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php
index 214412e1744..3749b506d16 100644
--- a/apps/dav/lib/Connector/Sabre/ServerFactory.php
+++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php
@@ -184,7 +184,7 @@ class ServerFactory {
!$this->config->getSystemValue('debug', false)
)
);
- $server->addPlugin(new QuotaPlugin($view, true));
+ $server->addPlugin(new QuotaPlugin($view));
$server->addPlugin(new ChecksumUpdatePlugin());
// Allow view-only plugin for webdav requests
diff --git a/apps/dav/src/components/AbsenceForm.vue b/apps/dav/src/components/AbsenceForm.vue
index 18c60ba4dd4..5350c04a565 100644
--- a/apps/dav/src/components/AbsenceForm.vue
+++ b/apps/dav/src/components/AbsenceForm.vue
@@ -219,7 +219,7 @@ export default {
lastDay: formatDateAsYMD(this.lastDay),
status: this.status,
message: this.message,
- replacementUserId: this.replacementUser?.user ?? null
+ replacementUserId: this.replacementUser?.user ?? null,
})
showSuccess(this.$t('dav', 'Absence saved'))
} catch (error) {
diff --git a/apps/dav/src/components/ExampleContentDownloadButton.vue b/apps/dav/src/components/ExampleContentDownloadButton.vue
index d3ee793eddc..6ee13e057bd 100644
--- a/apps/dav/src/components/ExampleContentDownloadButton.vue
+++ b/apps/dav/src/components/ExampleContentDownloadButton.vue
@@ -26,13 +26,13 @@ export default {
name: 'ExampleContentDownloadButton',
components: {
NcButton,
- IconDownload
+ IconDownload,
},
props: {
href: {
type: String,
required: true,
- }
+ },
},
}
</script>
diff --git a/apps/dav/src/components/ExampleEventSettings.vue b/apps/dav/src/components/ExampleEventSettings.vue
index c7a90b71a4a..5d2053def50 100644
--- a/apps/dav/src/components/ExampleEventSettings.vue
+++ b/apps/dav/src/components/ExampleEventSettings.vue
@@ -47,7 +47,7 @@
type="file"
accept=".ics,text/calendar"
class="import-event-modal__file-picker"
- @change="selectFile" />
+ @change="selectFile">
<div class="import-event-modal__buttons">
<NcButton :disabled="uploading || !selectedFile"
type="primary"
diff --git a/apps/dav/src/settings-example-content.js b/apps/dav/src/settings-example-content.js
index ca0291ace4f..fdeba642a67 100644
--- a/apps/dav/src/settings-example-content.js
+++ b/apps/dav/src/settings-example-content.js
@@ -10,7 +10,7 @@ Vue.mixin({
methods: {
t: translate,
$t: translate,
- }
+ },
})
const View = Vue.extend(ExampleContentSettingsSection);
diff --git a/apps/dav/src/views/ExampleContentSettingsSection.vue b/apps/dav/src/views/ExampleContentSettingsSection.vue
index 5e65a1ba3b4..3ee2d9e8648 100644
--- a/apps/dav/src/views/ExampleContentSettingsSection.vue
+++ b/apps/dav/src/views/ExampleContentSettingsSection.vue
@@ -33,6 +33,6 @@ export default {
hasCalendarApp() {
return loadState('dav', 'calendarEnabled')
},
- }
+ },
}
</script>
diff --git a/apps/encryption/lib/Session.php b/apps/encryption/lib/Session.php
index e2731d9611d..df1e5d664ad 100644
--- a/apps/encryption/lib/Session.php
+++ b/apps/encryption/lib/Session.php
@@ -66,7 +66,7 @@ class Session {
public function getPrivateKey() {
$key = $this->session->get('privateKey');
if (is_null($key)) {
- throw new PrivateKeyMissingException('please try to log-out and log-in again', 0);
+ throw new PrivateKeyMissingException('please try to log-out and log-in again');
}
return $key;
}
diff --git a/apps/federatedfilesharing/l10n/et_EE.js b/apps/federatedfilesharing/l10n/et_EE.js
index 62653174240..90b4749057a 100644
--- a/apps/federatedfilesharing/l10n/et_EE.js
+++ b/apps/federatedfilesharing/l10n/et_EE.js
@@ -33,7 +33,7 @@ OC.L10N.register(
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Lisaks võidakse sellesse serverisse saata verifitseerimise jaoks kasutajate e-posti aadresse.",
"Disable querying" : "Keela päringute tegemine",
"Enable querying" : "Luba päringute tegemine",
- "Unable to update federated files sharing config" : "Failide liitpilves jagamise konfiguratsiooni ei saa uuendada",
+ "Unable to update federated files sharing config" : "Failide liitpilves jagamise seadistusi ei saa uuendada",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Reguleeri, kuidas inimesed saavad serverite vahel jagada. See hõlmab ka selles serveris olevate inimeste vahelisi jagamisi, kui nad kasutavad liitjagamist.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Luba selles serveris olevatel inimestel saata kaustu teistele serveritele (see valik võimaldab ka WebDAV-i juurdepääsu avalikele jagamistele)",
"Allow people on this server to receive shares from other servers" : "Luba selles serveris olevatel inimestel saada teistelt serveritelt jagamisi",
@@ -44,16 +44,16 @@ OC.L10N.register(
"Allow people to publish their data to a global and public address book" : "Luba inimestel avaldada oma andmeid globaalses ja avalikus aadressiraamatus",
"Trusted federation" : "Usaldatud liitjagamine",
"Automatically accept shares from trusted federated accounts and groups by default" : "Aktsepteeri vaikimisi usaldusväärsete liitkontode ja rühmade jagamisi automaatselt",
- "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Jaga minuga läbi mu #Nextcloudi Liitjagamise Pilve ID, vaata {url}",
- "Share with me through my #Nextcloud Federated Cloud ID" : "Jaga minuga läbi minu #Nextcloudi liitpilve ID",
- "Share with me via Nextcloud" : "Jaga minuga läbi Nextcloudi",
- "Cloud ID copied to the clipboard" : "Pilve ID kopeeriti lõikelauale",
- "Copy to clipboard" : "Kopeeri lõikepuhvrisse",
- "Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri pilve ID manuaalselt.",
+ "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves, vaata {url}",
+ "Share with me through my #Nextcloud Federated Cloud ID" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves",
+ "Share with me via Nextcloud" : "Jaga minuga Nextcloudi vahendusel",
+ "Cloud ID copied to the clipboard" : "Kasutajatunnus liitpilves on kopeeritud lõikelauale",
+ "Copy to clipboard" : "Kopeeri lõikelauale",
+ "Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
"Copied!" : "Kopeeritud!",
"Federated Cloud" : "Liitpilv",
- "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad Nextcloudi serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta nende Liitjagamise Pilve ID jagamise dialoogi. See näeb välja nagu isiksus@cloud.example.com",
- "Your Federated Cloud ID" : "Su Liitjagamise Pilve ID",
+ "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad Nextcloudi serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta nende kasutajatunnus liitpilves jagamise vaates. See näeb välja nagu isiksus@pilv.toreserver.com",
+ "Your Federated Cloud ID" : "Sinu kasutajatunnus liitpilves",
"Share it so your friends can share files with you:" : "Jaga seda, et su sõbrad saaksid sinuga faile jagada:",
"Facebook" : "Facebook",
"X (formerly Twitter)" : "X (varasemalt Twitter)",
diff --git a/apps/federatedfilesharing/l10n/et_EE.json b/apps/federatedfilesharing/l10n/et_EE.json
index a253e5a4e05..1a5f218e018 100644
--- a/apps/federatedfilesharing/l10n/et_EE.json
+++ b/apps/federatedfilesharing/l10n/et_EE.json
@@ -31,7 +31,7 @@
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Lisaks võidakse sellesse serverisse saata verifitseerimise jaoks kasutajate e-posti aadresse.",
"Disable querying" : "Keela päringute tegemine",
"Enable querying" : "Luba päringute tegemine",
- "Unable to update federated files sharing config" : "Failide liitpilves jagamise konfiguratsiooni ei saa uuendada",
+ "Unable to update federated files sharing config" : "Failide liitpilves jagamise seadistusi ei saa uuendada",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Reguleeri, kuidas inimesed saavad serverite vahel jagada. See hõlmab ka selles serveris olevate inimeste vahelisi jagamisi, kui nad kasutavad liitjagamist.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Luba selles serveris olevatel inimestel saata kaustu teistele serveritele (see valik võimaldab ka WebDAV-i juurdepääsu avalikele jagamistele)",
"Allow people on this server to receive shares from other servers" : "Luba selles serveris olevatel inimestel saada teistelt serveritelt jagamisi",
@@ -42,16 +42,16 @@
"Allow people to publish their data to a global and public address book" : "Luba inimestel avaldada oma andmeid globaalses ja avalikus aadressiraamatus",
"Trusted federation" : "Usaldatud liitjagamine",
"Automatically accept shares from trusted federated accounts and groups by default" : "Aktsepteeri vaikimisi usaldusväärsete liitkontode ja rühmade jagamisi automaatselt",
- "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Jaga minuga läbi mu #Nextcloudi Liitjagamise Pilve ID, vaata {url}",
- "Share with me through my #Nextcloud Federated Cloud ID" : "Jaga minuga läbi minu #Nextcloudi liitpilve ID",
- "Share with me via Nextcloud" : "Jaga minuga läbi Nextcloudi",
- "Cloud ID copied to the clipboard" : "Pilve ID kopeeriti lõikelauale",
- "Copy to clipboard" : "Kopeeri lõikepuhvrisse",
- "Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri pilve ID manuaalselt.",
+ "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves, vaata {url}",
+ "Share with me through my #Nextcloud Federated Cloud ID" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves",
+ "Share with me via Nextcloud" : "Jaga minuga Nextcloudi vahendusel",
+ "Cloud ID copied to the clipboard" : "Kasutajatunnus liitpilves on kopeeritud lõikelauale",
+ "Copy to clipboard" : "Kopeeri lõikelauale",
+ "Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
"Copied!" : "Kopeeritud!",
"Federated Cloud" : "Liitpilv",
- "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad Nextcloudi serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta nende Liitjagamise Pilve ID jagamise dialoogi. See näeb välja nagu isiksus@cloud.example.com",
- "Your Federated Cloud ID" : "Su Liitjagamise Pilve ID",
+ "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad Nextcloudi serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta nende kasutajatunnus liitpilves jagamise vaates. See näeb välja nagu isiksus@pilv.toreserver.com",
+ "Your Federated Cloud ID" : "Sinu kasutajatunnus liitpilves",
"Share it so your friends can share files with you:" : "Jaga seda, et su sõbrad saaksid sinuga faile jagada:",
"Facebook" : "Facebook",
"X (formerly Twitter)" : "X (varasemalt Twitter)",
diff --git a/apps/federatedfilesharing/l10n/uk.js b/apps/federatedfilesharing/l10n/uk.js
index c3eaf2a63a4..8f5b708faaf 100644
--- a/apps/federatedfilesharing/l10n/uk.js
+++ b/apps/federatedfilesharing/l10n/uk.js
@@ -23,31 +23,49 @@ OC.L10N.register(
"Sharing" : "Спільний доступ",
"Federated file sharing" : "Інтегрований обмін файлами",
"Provide federated file sharing across servers" : "Забезпечте об’єднаний обмін файлами між серверами",
+ "Confirm data upload to lookup server" : "Підтвердіть завантаження даних на сервер пошуку",
+ "When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Якщо ця опція увімкнена, всі властивості облікового запису (наприклад, адреса електронної пошти) з видимістю, встановленою на «опубліковано», будуть автоматично синхронізовані та передані до зовнішньої системи і стануть доступними в публічній глобальній адресній книзі.",
+ "Disable upload" : "Вимкнути завантаження",
+ "Enable data upload" : "Увімкнути завантаження даних",
+ "Confirm querying lookup server" : "Підтвердити запит до сервера пошуку",
+ "When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book.",
+ "This is used to retrieve the federated cloud ID to make federated sharing easier." : "Це використовується для отримання ідентифікатора федеративної хмари, щоб спростити федеративне спільне використання.",
+ "Moreover, email addresses of users might be sent to that system in order to verify them." : "Крім того, адреси електронної пошти користувачів можуть бути надіслані до цієї системи з метою їх перевірки.",
+ "Disable querying" : "Вимкнути запити",
+ "Enable querying" : "Увімкнути запити",
"Unable to update federated files sharing config" : "Неможливо оновити конфігурацію спільного доступу до об’єднаних файлів",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Налаштуйте, як користувчі можуть надавати у спільний доступ ресурси користувачам інших серверів хмар. Це включає в себе надання у спільний доступ ресурсів користувачів як цього серверу, так і об'єднаних хмар.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Дозволити користувачам цієї хмари надавати ресурси у спільний доступ користувачам інших серверів хмар (цей параметр дозволить доступ через протокол WebDAV до публічних спільних ресурсів)",
"Allow people on this server to receive shares from other servers" : "Дозволити користувачам цієї хмари отримувати доступ до спільних ресурсів користувачів з інших серверів хмар",
"Allow people on this server to send shares to groups on other servers" : "Дозволити користувачам цієї хмари надавати у спільний доступ ресурси групам користувачів інших хмарних серверів",
"Allow people on this server to receive group shares from other servers" : "Дозволити користувачам цієї хмари отримувати доступ до спільних ресурсів груп користувачів інших хмарних серверів",
+ "The lookup server is only available for global scale." : "Сервер пошуку доступний тільки для глобального масштабу.",
"Search global and public address book for people" : "Шукати користувачів у глобальній та публічній адресних книгах",
"Allow people to publish their data to a global and public address book" : "Дозволити користувачам розміщувати власні дані у глобальній публічній адресній книзі",
+ "Trusted federation" : "Довірена федерація",
+ "Automatically accept shares from trusted federated accounts and groups by default" : "Автоматично приймати акції від надійних федеративних облікових записів та груп за замовчуванням",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Поділіться зі мною через мій #Nextcloud Federated Cloud ID, див. {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Поділіться зі мною через мій #Nextcloud Federated Cloud ID",
"Share with me via Nextcloud" : "Поділися зі мною через Nextcloud",
"Cloud ID copied to the clipboard" : "Cloud ID скопійовано в буфер обміну",
"Copy to clipboard" : "Копіювати до буферу обміну",
+ "Clipboard not available. Please copy the cloud ID manually." : "Буфер обміну недоступний. Будь ласка, скопіюйте ідентифікатор хмари вручну.",
"Copied!" : "Скопійовано!",
"Federated Cloud" : "Об'єднана хмара",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Ви можете поділитися з будь-ким, хто використовує сервер Nextcloud або інші сервери та служби, сумісні з Open Cloud Mesh (OCM). Просто введіть їхній Federated Cloud ID у діалоговому вікні спільного доступу. Це виглядає як person@cloud.example.com",
+ "Your Federated Cloud ID" : "Ваш ідентифікатор Federated Cloud",
"Share it so your friends can share files with you:" : "Поділіться ним, щоб ваші друзі могли ділитися з вами файлами:",
"Facebook" : "Facebook",
"X (formerly Twitter)" : "X (раніше відома як Twitter)",
+ "formerly Twitter" : "раніше відома як Twitter",
+ "Mastodon" : "Мастодонт",
"Add to your website" : "Додати на ваш вебсайт",
"HTML Code:" : "Код HTML:",
"Cancel" : "Скасувати",
"Add remote share" : "Додати віддалений каталог",
"Remote share" : "Віддалений каталог",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Додати віддалений каталог {name} з {owner}@{remote}?",
- "Remote share password" : "Пароль для віддаленого каталогу"
+ "Remote share password" : "Пароль для віддаленого каталогу",
+ "Incoming share could not be processed" : "Неможливо обробити вхідну частку"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/federatedfilesharing/l10n/uk.json b/apps/federatedfilesharing/l10n/uk.json
index ddbca33da82..8aa902eac07 100644
--- a/apps/federatedfilesharing/l10n/uk.json
+++ b/apps/federatedfilesharing/l10n/uk.json
@@ -21,31 +21,49 @@
"Sharing" : "Спільний доступ",
"Federated file sharing" : "Інтегрований обмін файлами",
"Provide federated file sharing across servers" : "Забезпечте об’єднаний обмін файлами між серверами",
+ "Confirm data upload to lookup server" : "Підтвердіть завантаження даних на сервер пошуку",
+ "When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Якщо ця опція увімкнена, всі властивості облікового запису (наприклад, адреса електронної пошти) з видимістю, встановленою на «опубліковано», будуть автоматично синхронізовані та передані до зовнішньої системи і стануть доступними в публічній глобальній адресній книзі.",
+ "Disable upload" : "Вимкнути завантаження",
+ "Enable data upload" : "Увімкнути завантаження даних",
+ "Confirm querying lookup server" : "Підтвердити запит до сервера пошуку",
+ "When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book.",
+ "This is used to retrieve the federated cloud ID to make federated sharing easier." : "Це використовується для отримання ідентифікатора федеративної хмари, щоб спростити федеративне спільне використання.",
+ "Moreover, email addresses of users might be sent to that system in order to verify them." : "Крім того, адреси електронної пошти користувачів можуть бути надіслані до цієї системи з метою їх перевірки.",
+ "Disable querying" : "Вимкнути запити",
+ "Enable querying" : "Увімкнути запити",
"Unable to update federated files sharing config" : "Неможливо оновити конфігурацію спільного доступу до об’єднаних файлів",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Налаштуйте, як користувчі можуть надавати у спільний доступ ресурси користувачам інших серверів хмар. Це включає в себе надання у спільний доступ ресурсів користувачів як цього серверу, так і об'єднаних хмар.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Дозволити користувачам цієї хмари надавати ресурси у спільний доступ користувачам інших серверів хмар (цей параметр дозволить доступ через протокол WebDAV до публічних спільних ресурсів)",
"Allow people on this server to receive shares from other servers" : "Дозволити користувачам цієї хмари отримувати доступ до спільних ресурсів користувачів з інших серверів хмар",
"Allow people on this server to send shares to groups on other servers" : "Дозволити користувачам цієї хмари надавати у спільний доступ ресурси групам користувачів інших хмарних серверів",
"Allow people on this server to receive group shares from other servers" : "Дозволити користувачам цієї хмари отримувати доступ до спільних ресурсів груп користувачів інших хмарних серверів",
+ "The lookup server is only available for global scale." : "Сервер пошуку доступний тільки для глобального масштабу.",
"Search global and public address book for people" : "Шукати користувачів у глобальній та публічній адресних книгах",
"Allow people to publish their data to a global and public address book" : "Дозволити користувачам розміщувати власні дані у глобальній публічній адресній книзі",
+ "Trusted federation" : "Довірена федерація",
+ "Automatically accept shares from trusted federated accounts and groups by default" : "Автоматично приймати акції від надійних федеративних облікових записів та груп за замовчуванням",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Поділіться зі мною через мій #Nextcloud Federated Cloud ID, див. {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Поділіться зі мною через мій #Nextcloud Federated Cloud ID",
"Share with me via Nextcloud" : "Поділися зі мною через Nextcloud",
"Cloud ID copied to the clipboard" : "Cloud ID скопійовано в буфер обміну",
"Copy to clipboard" : "Копіювати до буферу обміну",
+ "Clipboard not available. Please copy the cloud ID manually." : "Буфер обміну недоступний. Будь ласка, скопіюйте ідентифікатор хмари вручну.",
"Copied!" : "Скопійовано!",
"Federated Cloud" : "Об'єднана хмара",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Ви можете поділитися з будь-ким, хто використовує сервер Nextcloud або інші сервери та служби, сумісні з Open Cloud Mesh (OCM). Просто введіть їхній Federated Cloud ID у діалоговому вікні спільного доступу. Це виглядає як person@cloud.example.com",
+ "Your Federated Cloud ID" : "Ваш ідентифікатор Federated Cloud",
"Share it so your friends can share files with you:" : "Поділіться ним, щоб ваші друзі могли ділитися з вами файлами:",
"Facebook" : "Facebook",
"X (formerly Twitter)" : "X (раніше відома як Twitter)",
+ "formerly Twitter" : "раніше відома як Twitter",
+ "Mastodon" : "Мастодонт",
"Add to your website" : "Додати на ваш вебсайт",
"HTML Code:" : "Код HTML:",
"Cancel" : "Скасувати",
"Add remote share" : "Додати віддалений каталог",
"Remote share" : "Віддалений каталог",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Додати віддалений каталог {name} з {owner}@{remote}?",
- "Remote share password" : "Пароль для віддаленого каталогу"
+ "Remote share password" : "Пароль для віддаленого каталогу",
+ "Incoming share could not be processed" : "Неможливо обробити вхідну частку"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/lib/FederatedShareProvider.php b/apps/federatedfilesharing/lib/FederatedShareProvider.php
index e3731ac3ecf..8a2c12e0ac8 100644
--- a/apps/federatedfilesharing/lib/FederatedShareProvider.php
+++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php
@@ -431,13 +431,7 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
return $share;
}
- /**
- * Get all children of this share
- *
- * @param IShare $parent
- * @return IShare[]
- */
- public function getChildren(IShare $parent) {
+ public function getChildren(IShare $parent): array {
$children = [];
$qb = $this->dbConnection->getQueryBuilder();
diff --git a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php
index 1cdcdbdd6d4..1ce639532e8 100644
--- a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php
+++ b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php
@@ -309,7 +309,10 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider {
$this->verifyShare($share, $token);
$this->executeAcceptShare($share);
- if ($share->getShareOwner() !== $share->getSharedBy()) {
+
+ if ($share->getShareOwner() !== $share->getSharedBy()
+ && !$this->userManager->userExists($share->getSharedBy())) {
+ // only if share was initiated from another instance
[, $remote] = $this->addressHandler->splitUserRemote($share->getSharedBy());
$remoteId = $this->federatedShareProvider->getRemoteId($share);
$notification = $this->cloudFederationFactory->getCloudFederationNotification();
diff --git a/apps/federatedfilesharing/tests/AddressHandlerTest.php b/apps/federatedfilesharing/tests/AddressHandlerTest.php
index 9b67e3e1848..279bf485145 100644
--- a/apps/federatedfilesharing/tests/AddressHandlerTest.php
+++ b/apps/federatedfilesharing/tests/AddressHandlerTest.php
@@ -34,11 +34,11 @@ class AddressHandlerTest extends \Test\TestCase {
$this->contactsManager = $this->createMock(IManager::class);
$this->cloudIdManager = new CloudIdManager(
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class),
$this->contactsManager,
$this->urlGenerator,
$this->createMock(IUserManager::class),
- $this->createMock(ICacheFactory::class),
- $this->createMock(IEventDispatcher::class)
);
$this->addressHandler = new AddressHandler($this->urlGenerator, $this->il10n, $this->cloudIdManager);
diff --git a/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php b/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php
index cb890417d0b..e99b59e82b8 100644
--- a/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php
+++ b/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php
@@ -64,11 +64,11 @@ class MountPublicLinkControllerTest extends \Test\TestCase {
$this->clientService = $this->createMock(IClientService::class);
$this->contactsManager = $this->createMock(IContactsManager::class);
$this->cloudIdManager = new CloudIdManager(
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class),
$this->contactsManager,
$this->createMock(IURLGenerator::class),
$this->userManager,
- $this->createMock(ICacheFactory::class),
- $this->createMock(IEventDispatcher::class)
);
$this->controller = new MountPublicLinkController(
diff --git a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php
index 4d6add962fe..7e97510af22 100644
--- a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php
+++ b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php
@@ -74,11 +74,11 @@ class FederatedShareProviderTest extends \Test\TestCase {
$this->addressHandler = $this->createMock(AddressHandler::class);
$this->contactsManager = $this->createMock(IContactsManager::class);
$this->cloudIdManager = new CloudIdManager(
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class),
$this->contactsManager,
$this->createMock(IURLGenerator::class),
$this->userManager,
- $this->createMock(ICacheFactory::class),
- $this->createMock(IEventDispatcher::class)
);
$this->gsConfig = $this->createMock(\OCP\GlobalScale\IConfig::class);
diff --git a/apps/federation/l10n/es.js b/apps/federation/l10n/es.js
index 35faca370f3..83e1acb38f8 100644
--- a/apps/federation/l10n/es.js
+++ b/apps/federation/l10n/es.js
@@ -11,9 +11,9 @@ OC.L10N.register(
"Federation" : "Federación",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "La federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios.",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "La Federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios. Por ejemplo, esto se utilizará para auto-completar a los usuarios externos para el intercambio federado.",
- "External documentation for Federated Cloud Sharing" : "Documentación externa sobre Compartir con Nube Federada",
+ "External documentation for Federated Cloud Sharing" : "Documentación externa para Compartir con Nube Federada",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "La Federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios. Por ejemplo, esto se utilizará para auto-completar a los usuarios externos para el intercambio federado. No es necesario añadir un servidor como servidor de confianza para crear una recurso compartido federado.",
- "Each server must validate the other. This process may require a few cron cycles." : "Cada servidor debe validar al otro. Este proceso puede necesitar varios ciclos de cron.",
+ "Each server must validate the other. This process may require a few cron cycles." : "Cada servidor debe validar al otro. Este proceso puede necesitar algunos ciclos de cron.",
"+ Add trusted server" : "+ Añadir servidor de confianza",
"Trusted server" : "Servidor de confianza",
"Add" : "Añadir"
diff --git a/apps/federation/l10n/es.json b/apps/federation/l10n/es.json
index f5aea9ed58b..3c07677f806 100644
--- a/apps/federation/l10n/es.json
+++ b/apps/federation/l10n/es.json
@@ -9,9 +9,9 @@
"Federation" : "Federación",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "La federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios.",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "La Federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios. Por ejemplo, esto se utilizará para auto-completar a los usuarios externos para el intercambio federado.",
- "External documentation for Federated Cloud Sharing" : "Documentación externa sobre Compartir con Nube Federada",
+ "External documentation for Federated Cloud Sharing" : "Documentación externa para Compartir con Nube Federada",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "La Federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios. Por ejemplo, esto se utilizará para auto-completar a los usuarios externos para el intercambio federado. No es necesario añadir un servidor como servidor de confianza para crear una recurso compartido federado.",
- "Each server must validate the other. This process may require a few cron cycles." : "Cada servidor debe validar al otro. Este proceso puede necesitar varios ciclos de cron.",
+ "Each server must validate the other. This process may require a few cron cycles." : "Cada servidor debe validar al otro. Este proceso puede necesitar algunos ciclos de cron.",
"+ Add trusted server" : "+ Añadir servidor de confianza",
"Trusted server" : "Servidor de confianza",
"Add" : "Añadir"
diff --git a/apps/federation/l10n/uk.js b/apps/federation/l10n/uk.js
index 0804dc97a15..adcd2ee732b 100644
--- a/apps/federation/l10n/uk.js
+++ b/apps/federation/l10n/uk.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"federation",
{
"Added to the list of trusted servers" : "Сервер додано до списку довірених серверів",
+ "No server found with ID: %s" : "Не знайдено сервер з ідентифікатором: %s",
+ "Could not remove server" : "Не вдалося видалити сервер",
"Server is already in the list of trusted servers." : "Сервер вже знаходиться в переліку довірених серверів",
"No server to federate with found" : "Не знайдено жодного сервера для об'єднання",
"Could not add server" : "Не вдалося додати сервер",
diff --git a/apps/federation/l10n/uk.json b/apps/federation/l10n/uk.json
index 56b17097d4b..97e4915bdf7 100644
--- a/apps/federation/l10n/uk.json
+++ b/apps/federation/l10n/uk.json
@@ -1,5 +1,7 @@
{ "translations": {
"Added to the list of trusted servers" : "Сервер додано до списку довірених серверів",
+ "No server found with ID: %s" : "Не знайдено сервер з ідентифікатором: %s",
+ "Could not remove server" : "Не вдалося видалити сервер",
"Server is already in the list of trusted servers." : "Сервер вже знаходиться в переліку довірених серверів",
"No server to federate with found" : "Не знайдено жодного сервера для об'єднання",
"Could not add server" : "Не вдалося додати сервер",
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index 6d2710cef33..2dc128b293a 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -189,16 +189,14 @@ OC.L10N.register(
"Personal files" : "ملفات شخصية",
"Sort favorites first" : "فرز المفضلة أولا",
"Sort folders before files" : "فرز المجلدات قبل الملفات",
+ "Enable folder tree" : "تمكين شجرة المجلدات",
"Show hidden files" : "عرض الملفات المخفية",
"Show file type column" : "عرض عمود نوع الملف",
"Crop image previews" : "اقتصاص صورة العروض",
- "Enable folder tree" : "تمكين شجرة المجلدات",
"Additional settings" : "الإعدادات المتقدمة",
"WebDAV" : "WebDAV",
"WebDAV URL" : "عنوان URL لـ WebDAV",
"Copy to clipboard" : "نسخ الرابط",
- "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "إذا كنت قد فعّلت خاصية \"التحقق ثنائي العوامل من الهوية 2FA\"، يجب عليك تجديد كلمة مرور التطبيق بالضغط هنا.",
"Warnings" : "تحذيرات",
"Prevent warning dialogs from open or reenable them." : "منع نوافذ التحذير من الفتح أو إعادة تمكينها.",
"Show a warning dialog when changing a file extension." : "أظهِر نافذة التحذير عندما يتم تغيير امتداد الملف.",
@@ -445,6 +443,8 @@ OC.L10N.register(
"Submitting fields…" : "إرسال الحقول...",
"Filter filenames…" : "تصفية باسم الملف...",
"Enable the grid view" : "تمكين العرض الشبكي",
+ "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "إذا كنت قد فعّلت خاصية \"التحقق ثنائي العوامل من الهوية 2FA\"، يجب عليك تجديد كلمة مرور التطبيق بالضغط هنا.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلدات","{folderCount} مجلد","{folderCount} مجلد"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ملف","{fileCount} ملف","{fileCount} ملف","{fileCount} ملفات","{fileCount} ملف","{fileCount} ملف"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و{folderCount} مجلدات","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد"],
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index 98a56a6c276..5cc3eaf082f 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -187,16 +187,14 @@
"Personal files" : "ملفات شخصية",
"Sort favorites first" : "فرز المفضلة أولا",
"Sort folders before files" : "فرز المجلدات قبل الملفات",
+ "Enable folder tree" : "تمكين شجرة المجلدات",
"Show hidden files" : "عرض الملفات المخفية",
"Show file type column" : "عرض عمود نوع الملف",
"Crop image previews" : "اقتصاص صورة العروض",
- "Enable folder tree" : "تمكين شجرة المجلدات",
"Additional settings" : "الإعدادات المتقدمة",
"WebDAV" : "WebDAV",
"WebDAV URL" : "عنوان URL لـ WebDAV",
"Copy to clipboard" : "نسخ الرابط",
- "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "إذا كنت قد فعّلت خاصية \"التحقق ثنائي العوامل من الهوية 2FA\"، يجب عليك تجديد كلمة مرور التطبيق بالضغط هنا.",
"Warnings" : "تحذيرات",
"Prevent warning dialogs from open or reenable them." : "منع نوافذ التحذير من الفتح أو إعادة تمكينها.",
"Show a warning dialog when changing a file extension." : "أظهِر نافذة التحذير عندما يتم تغيير امتداد الملف.",
@@ -443,6 +441,8 @@
"Submitting fields…" : "إرسال الحقول...",
"Filter filenames…" : "تصفية باسم الملف...",
"Enable the grid view" : "تمكين العرض الشبكي",
+ "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "إذا كنت قد فعّلت خاصية \"التحقق ثنائي العوامل من الهوية 2FA\"، يجب عليك تجديد كلمة مرور التطبيق بالضغط هنا.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلدات","{folderCount} مجلد","{folderCount} مجلد"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ملف","{fileCount} ملف","{fileCount} ملف","{fileCount} ملفات","{fileCount} ملف","{fileCount} ملف"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و{folderCount} مجلدات","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد"],
diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js
index 1fb48af6eb2..9a49f827f9f 100644
--- a/apps/files/l10n/ast.js
+++ b/apps/files/l10n/ast.js
@@ -148,8 +148,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copiar nel cartafueyu",
- "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
"Keyboard shortcuts" : "Atayos del tecláu",
"Selection" : "Seleición",
"Navigation" : "Navegación",
@@ -331,6 +329,8 @@ OC.L10N.register(
"An error occurred while trying to update the tags" : "Prodúxose un error al tentar d'anovar les etiquetes",
"Upload (max. %s)" : "Xubir (%s como máximu)",
"Enable the grid view" : "Activar la vista de rexáu",
+ "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheru","{fileCount} ficheros"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheru y {folderCount} carpeta","1 ficheru y {folderCount} carpetes"],
diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json
index 92f4678e29e..948ea08e6bc 100644
--- a/apps/files/l10n/ast.json
+++ b/apps/files/l10n/ast.json
@@ -146,8 +146,6 @@
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copiar nel cartafueyu",
- "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
"Keyboard shortcuts" : "Atayos del tecláu",
"Selection" : "Seleición",
"Navigation" : "Navegación",
@@ -329,6 +327,8 @@
"An error occurred while trying to update the tags" : "Prodúxose un error al tentar d'anovar les etiquetes",
"Upload (max. %s)" : "Xubir (%s como máximu)",
"Enable the grid view" : "Activar la vista de rexáu",
+ "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheru","{fileCount} ficheros"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheru y {folderCount} carpeta","1 ficheru y {folderCount} carpetes"],
diff --git a/apps/files/l10n/be.js b/apps/files/l10n/be.js
new file mode 100644
index 00000000000..ecb1653e560
--- /dev/null
+++ b/apps/files/l10n/be.js
@@ -0,0 +1,245 @@
+OC.L10N.register(
+ "files",
+ {
+ "Added to favorites" : "Дададзены ў абранае",
+ "Removed from favorites" : "Выдалены з абранага",
+ "You added {file} to your favorites" : "Вы дадалі {file} у абранае",
+ "You removed {file} from your favorites" : "Вы выдалілі {file} з абранага",
+ "Favorites" : "Абранае",
+ "File changes" : "Змены ў файлах",
+ "Created by {user}" : "Створаны карыстальнікам {user}",
+ "Changed by {user}" : "Зменены карыстальнікам {user}",
+ "Deleted by {user}" : "Выдалены карыстальнікам {user}",
+ "Restored by {user}" : "Адноўлены карыстальнікам {user}",
+ "Renamed by {user}" : "Перайменаваны карыстальнікам {user}",
+ "Moved by {user}" : "Перамешчаны карыстальнікам {user}",
+ "\"remote account\"" : "\"аддалены ўліковы запіс\"",
+ "You created {file}" : "Вы стварылі {file}",
+ "You created an encrypted file in {file}" : "Вы стварылі зашыфраваны файл у {file}",
+ "{user} created {file}" : "{user} стварыў(-ла) {file}",
+ "{user} created an encrypted file in {file}" : "{user} стварыў(-ла) зашыфраваны файл у {file}",
+ "You changed {file}" : "Вы змянілі {file}",
+ "You changed an encrypted file in {file}" : "Вы змянілі зашыфраваны файл у {file}",
+ "{user} changed {file}" : "{user} змяніў(-ла) {file}",
+ "{user} changed an encrypted file in {file}" : "{user} змяніў(-ла) зашыфраваны файл у {file}",
+ "You deleted {file}" : "Вы выдалілі {file}",
+ "You deleted an encrypted file in {file}" : "Вы выдалілі зашыфраваны файл у {file}",
+ "{user} deleted {file}" : "{user} выдаліў(-ла) {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} выдаліў(-ла) зашыфраваны файл у {file}",
+ "You restored {file}" : "Вы аднавілі {file}",
+ "{user} restored {file}" : "{user} аднавіў(-ла) {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы перайменавалі {oldfile} (схаваны) у {newfile} (схаваны)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Вы перайменавалі {oldfile} (схаваны) у {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Вы перайменавалі {oldfile} у {newfile} (схаваны)",
+ "You renamed {oldfile} to {newfile}" : "Вы перайменавалі {oldfile} у {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} (схаваны) у {newfile} (схаваны)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} перайменаваў(-ла) {oldfile} (схаваны) ў {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} у {newfile} (схаваны)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} перайменаваў(-ла) {oldfile} у {newfile}",
+ "You moved {oldfile} to {newfile}" : "Вы перамясцілі {oldfile} у {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} перамясціў(-ла) {oldfile} у {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл быў дададзены або выдалены з <strong>абраных</strong>",
+ "Files" : "Файлы",
+ "Folder not found" : "Папка не знойдзена",
+ "The file cannot be found" : "Файл не знойдзены",
+ "The destination path does not exist: %1$s" : "Шлях прызначэння не існуе: %1$s",
+ "Favorite files" : "Абраныя файлы",
+ "No favorites" : "Няма абраных",
+ "More favorites" : "Больш абраных",
+ "Accept" : "Прыняць",
+ "Reject" : "Адхіліць",
+ "in %s" : "у %s",
+ "Files compatibility" : "Сумяшчальнасць файлаў",
+ "File Management" : "Кіраванне файламі",
+ "Home" : "Дадому",
+ "Reload current directory" : "Перазагрузіць бягучы каталог",
+ "Go to the \"{dir}\" directory" : "Перайсці да каталога \"{dir}\"",
+ "Drag and drop files here to upload" : "Перацягніце файлы сюды, каб запампаваць іх",
+ "Favorite" : "Абранае",
+ "Back" : "Назад",
+ "File is loading" : "Файл загружаецца",
+ "Folder is loading" : "Папка загружаецца",
+ "Filename" : "Назва файла",
+ "Folder name" : "Назва папкі",
+ "Rename file" : "Перайменаваць файл",
+ "Folder" : "Папка",
+ "Unknown file type" : "Невядомы тып файла",
+ "Pending" : "У чаканні",
+ "Unknown date" : "Невядомая дата",
+ "Clear filter" : "Ачысціць фільтр",
+ "Modified" : "Зменены",
+ "Type" : "Тып",
+ "Active filters" : "Актыўныя фільтры",
+ "Remove filter" : "Выдаліць фільтр",
+ "Name" : "Назва",
+ "File type" : "Тып файла",
+ "Size" : "Памер",
+ "Actions" : "Дзеянні",
+ "List of files and folders." : "Спіс файлаў і папак.",
+ "File not found" : "Файл не знойдзены",
+ "{usedQuotaByte} used" : "Выкарыстана {usedQuotaByte}",
+ "{used} of {quota} used" : "Выкарыстана {used} з {quota}",
+ "{relative}% used" : "Выкарыстана {relative}%",
+ "New folder" : "Новая папка",
+ "Create new folder" : "Стварыць новую папку",
+ "This name is already in use." : "Гэта назва ўжо выкарыстоўваецца.",
+ "Create" : "Стварыць",
+ "Fill template fields" : "Запоўніце палі шаблону",
+ "Unknown error" : "Невядомая памылка",
+ "Change" : "Змяніць",
+ "New owner" : "Новы ўладальнік",
+ "Share" : "Абагуліць",
+ "Upload was cancelled by user" : "Карыстальнік скасаваў запампоўванне",
+ "Go back" : "Назад",
+ "Your files" : "Вашы файлы",
+ "File cannot be accessed" : "Немагчыма атрымаць доступ да файла",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Файл не знойдзены, або ў вас няма правоў на яго прагляд. Папрасіце адпраўніка абагуліць яго.",
+ "No search results for “{query}”" : "Няма вынікаў пошуку па запыце \"{query}\"",
+ "Search for files" : "Пошук файлаў",
+ "Clipboard is not available" : "Буфер абмену недаступны",
+ "WebDAV URL copied to clipboard" : "URL-адрас WebDAV скапіяваны ў буфер абмену",
+ "All files" : "Усе файлы",
+ "Personal files" : "Асабістыя файлы",
+ "Show files extensions" : "Паказваць пашырэнні файлаў",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL-адрас WebDAV",
+ "Copy to clipboard" : "Капіяваць у буфер абмену",
+ "Warnings" : "Папярэджанні",
+ "Keyboard shortcuts" : "Спалучэнні клавіш",
+ "Rename a file" : "Перайменаваць файл",
+ "Delete a file" : "Выдаліць файл",
+ "Select all files" : "Выбраць усе файлы",
+ "Deselect all files" : "Скасаваць выбар усіх файлаў",
+ "Select a range of files" : "Выберыце дыяпазон файлаў",
+ "Navigation" : "Навігацыя",
+ "You" : "Вы",
+ "Error while loading the file data" : "Памылка пры загрузцы даных файла",
+ "Owner" : "Уладальнік",
+ "Remove from favorites" : "Выдаліць з абранага",
+ "Add to favorites" : "У абранае",
+ "Tags" : "Тэгі",
+ "Unable to create new file from template" : "Немагчыма стварыць новы файл з шаблона",
+ "Pick a template for {name}" : "Выберыце шаблон для {name}",
+ "Create a new file with the selected template" : "Стварыць файл на падставе выбранага шаблона",
+ "Creating file" : "Стварэнне файла",
+ "Save as {displayName}" : "Захаваць як {displayName}",
+ "Save as …" : "Захаваць як …",
+ "Converting files …" : "Канвертацыя файлаў …",
+ "Converting file …" : "Канвертацыя файла …",
+ "File successfully converted" : "Файл паспяхова сканвертаваны",
+ "Deletion cancelled" : "Выдаленне скасавана",
+ "Delete permanently" : "Выдаліць назаўжды",
+ "Delete file" : "Выдаліць файл",
+ "Delete files" : "Выдаліць файлы",
+ "Delete folder" : "Выдаліць папку",
+ "Delete folders" : "Выдаліць папкі",
+ "Delete" : "Выдаліць",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Вы збіраецеся назаўжды выдаліць {count} элемент","Вы збіраецеся назаўжды выдаліць {count} элементы","Вы збіраецеся назаўжды выдаліць {count} элементаў","Вы збіраецеся назаўжды выдаліць {count} элементаў"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Вы збіраецеся выдаліць {count} элемент","Вы збіраецеся выдаліць {count} элементы","Вы збіраецеся выдаліць {count} элементаў","Вы збіраецеся выдаліць {count} элементаў"],
+ "Confirm deletion" : "Пацвердзіць выдаленне",
+ "Cancel" : "Скасаваць",
+ "Download" : "Спампаваць",
+ "Moving \"{source}\" to \"{destination}\" …" : "Перамяшчэнне \"{source}\" у \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Капіяванне \"{source}\" у \"{destination}\" …",
+ "This file/folder is already in that directory" : "Гэты файл/папка ўжо знаходзіцца ў гэтым каталогу",
+ "(copy)" : "(копія)",
+ "(copy %n)" : "(копія %n)",
+ "Move cancelled" : "Перамяшчэнне скасавана",
+ "A file or folder with that name already exists in this folder" : "Файл або папка з такой назвай ужо існуе ў гэтай папцы",
+ "The files are locked" : "Файлы заблакіраваны",
+ "The file does not exist anymore" : "Файл больш не існуе",
+ "Choose destination" : "Выберыце прызначэнне",
+ "Copy to {target}" : "Капіяваць у {target}",
+ "Copy" : "Капіяваць",
+ "Move to {target}" : "Перамясціць у {target}",
+ "Move" : "Перамясціць",
+ "Move or copy" : "Перамясціць або капіяваць",
+ "Open folder {displayName}" : "Адкрыць папку {displayName}",
+ "Open locally" : "Адкрыць лакальна",
+ "Open file locally" : "Адкрыць файл лакальна",
+ "Rename" : "Перайменаваць",
+ "Today" : "Сёння",
+ "Last 7 days" : "Апошнія 7 дзён",
+ "Last 30 days" : "Апошнія 30 дзён",
+ "This year ({year})" : "Гэты год ({year})",
+ "Last year ({year})" : "Мінулы год ({year})",
+ "Documents" : "Дакументы",
+ "Spreadsheets" : "Табліцы",
+ "Presentations" : "Прэзентацыі",
+ "PDFs" : "PDF-файлы",
+ "Folders" : "Папкі",
+ "Audio" : "Аўдыя",
+ "Photos and images" : "Фота і відарысы",
+ "Videos" : "Відэа",
+ "New folder creation cancelled" : "Стварэнне новай папкі скасавана",
+ "Created new folder \"{name}\"" : "Створана новая папка \"{name}\"",
+ "Unable to initialize the templates directory" : "Немагчыма ініцыялізаваць каталог шаблонаў",
+ "Create templates folder" : "Стварыць папку шаблонаў",
+ "Templates" : "Шаблоны",
+ "New template folder" : "Новая папка шаблонаў",
+ "In folder" : "У папцы",
+ "One of the dropped files could not be processed" : "Адзін з перацягнутых файлаў не ўдалося апрацаваць",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш браўзер не падтрымлівае Filesystem API. Каталогі не будуць запампаваныя",
+ "No files to upload" : "Няма файлаў для запампоўвання",
+ "Unable to create the directory {directory}" : "Немагчыма стварыць папку {directory}",
+ "Some files could not be uploaded" : "Некаторыя файлы не ўдалося запампаваць",
+ "Files uploaded successfully" : "Файлы паспяхова запампаваныя",
+ "No files to process" : "Няма файлаў для апрацоўкі",
+ "Some files could not be copied" : "Некаторыя файлы не ўдалося скапіяваць",
+ "Some files could not be moved" : "Некаторыя файлы не ўдалося перамясціць",
+ "Files copied successfully" : "Файлы паспяхова скапіяваны",
+ "Files moved successfully" : "Файлы паспяхова перамешчаны",
+ "Conflicts resolution skipped" : "Рашэнне канфліктаў прапушчана",
+ "Upload cancelled" : "Запампоўванне скасавана",
+ "Could not rename \"{oldName}\"" : "Не атрымалася перайменаваць \"{oldName}\"",
+ "Unexpected error: {error}" : "Нечаканая памылка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файлы","%n файлаў","%n файлаў"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папкі","%n папак","%n папак"],
+ "_%n hidden_::_%n hidden_" : ["%n схаваны","%n схаваныя","%n схаваных","%n схаваных"],
+ "Filename must not be empty." : "Назва файла не можа быць пустой.",
+ "No favorites yet" : "Пакуль няма абраных",
+ "List of your files and folders." : "Спіс вашых файлаў і папак.",
+ "All folders" : "Усе папкі",
+ "List of your files and folders that are not shared." : "Спіс вашых неабагуленых файлаў і папак.",
+ "No personal files found" : "Асабістых файлаў не знойдзена",
+ "Files that are not shared will show up here." : "Тут будуць адлюстроўвацца неабагуленыя файлы.",
+ "Recent" : "Нядаўнія",
+ "List of recently modified files and folders." : "Спіс нядаўна змененых файлаў і папак.",
+ "No recently modified files" : "Няма нядаўна змененых файлаў",
+ "Files and folders you recently modified will show up here." : "Тут будуць адлюстроўвацца нядаўна змененыя вамі файлы і папкі.",
+ "Search" : "Пошук",
+ "File could not be found" : "Файл не знойдзены",
+ "Close" : "Закрыць",
+ "Could not create folder \"{dir}\"" : "Не ўдалося стварыць папку \"{dir}\"",
+ "This will stop your current uploads." : "Гэта спыніць вашы бягучыя запампоўкі.",
+ "Upload cancelled." : "Запампоўванне скасавана.",
+ "Processing files …" : "Апрацоўка файлаў …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Немагчыма запампаваць {filename}, бо гэта каталог або ён мае памер 0 байтаў",
+ "An unknown error has occurred" : "Узнікла невядомая памылка",
+ "File could not be uploaded" : "Не ўдалося запампаваць файл",
+ "Uploading …" : "Запампоўванне …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Запампоўванне … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} з {totalSize} ({bitrate})",
+ "Set reminder" : "Задаць напамін",
+ "Edit locally" : "Рэдагаваць лакальна",
+ "Open" : "Адкрыць",
+ "Unable to determine date" : "Немагчыма вызначыць дату",
+ "copy" : "копія",
+ "{newName} already exists" : "{newName} ужо існуе",
+ "{dirs} and {files}" : "{dirs} і {files}",
+ "_Uploading %n file_::_Uploading %n files_" : ["Запампоўванне %n файла","Запампоўванне %n файлаў","Запампоўванне %n файлаў","Запампоўванне %n файлаў"],
+ "New" : "Новы",
+ "{used}%" : "{used}%",
+ "{used} used" : "Выкарыстана {used}",
+ "Path" : "Шлях",
+ "Upload file" : "Запампаваць файл",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папкі","{folderCount} папак","{folderCount} папак"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файлы","{fileCount} файлаў","{fileCount} файлаў"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл і {folderCount} папка","1 файл і {folderCount} папкі","1 файл і {folderCount} папак","1 файл і {folderCount} папак"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл і 1 папка","{fileCount} файлы і 1 папка","{fileCount} файлаў і 1 папка","{fileCount} файлаў і 1 папка"],
+ "Personal Files" : "Асабістыя файлы",
+ "Text file" : "Тэкставы файл"
+},
+"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files/l10n/be.json b/apps/files/l10n/be.json
new file mode 100644
index 00000000000..0f08320db21
--- /dev/null
+++ b/apps/files/l10n/be.json
@@ -0,0 +1,243 @@
+{ "translations": {
+ "Added to favorites" : "Дададзены ў абранае",
+ "Removed from favorites" : "Выдалены з абранага",
+ "You added {file} to your favorites" : "Вы дадалі {file} у абранае",
+ "You removed {file} from your favorites" : "Вы выдалілі {file} з абранага",
+ "Favorites" : "Абранае",
+ "File changes" : "Змены ў файлах",
+ "Created by {user}" : "Створаны карыстальнікам {user}",
+ "Changed by {user}" : "Зменены карыстальнікам {user}",
+ "Deleted by {user}" : "Выдалены карыстальнікам {user}",
+ "Restored by {user}" : "Адноўлены карыстальнікам {user}",
+ "Renamed by {user}" : "Перайменаваны карыстальнікам {user}",
+ "Moved by {user}" : "Перамешчаны карыстальнікам {user}",
+ "\"remote account\"" : "\"аддалены ўліковы запіс\"",
+ "You created {file}" : "Вы стварылі {file}",
+ "You created an encrypted file in {file}" : "Вы стварылі зашыфраваны файл у {file}",
+ "{user} created {file}" : "{user} стварыў(-ла) {file}",
+ "{user} created an encrypted file in {file}" : "{user} стварыў(-ла) зашыфраваны файл у {file}",
+ "You changed {file}" : "Вы змянілі {file}",
+ "You changed an encrypted file in {file}" : "Вы змянілі зашыфраваны файл у {file}",
+ "{user} changed {file}" : "{user} змяніў(-ла) {file}",
+ "{user} changed an encrypted file in {file}" : "{user} змяніў(-ла) зашыфраваны файл у {file}",
+ "You deleted {file}" : "Вы выдалілі {file}",
+ "You deleted an encrypted file in {file}" : "Вы выдалілі зашыфраваны файл у {file}",
+ "{user} deleted {file}" : "{user} выдаліў(-ла) {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} выдаліў(-ла) зашыфраваны файл у {file}",
+ "You restored {file}" : "Вы аднавілі {file}",
+ "{user} restored {file}" : "{user} аднавіў(-ла) {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы перайменавалі {oldfile} (схаваны) у {newfile} (схаваны)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Вы перайменавалі {oldfile} (схаваны) у {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Вы перайменавалі {oldfile} у {newfile} (схаваны)",
+ "You renamed {oldfile} to {newfile}" : "Вы перайменавалі {oldfile} у {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} (схаваны) у {newfile} (схаваны)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} перайменаваў(-ла) {oldfile} (схаваны) ў {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} у {newfile} (схаваны)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} перайменаваў(-ла) {oldfile} у {newfile}",
+ "You moved {oldfile} to {newfile}" : "Вы перамясцілі {oldfile} у {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} перамясціў(-ла) {oldfile} у {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл быў дададзены або выдалены з <strong>абраных</strong>",
+ "Files" : "Файлы",
+ "Folder not found" : "Папка не знойдзена",
+ "The file cannot be found" : "Файл не знойдзены",
+ "The destination path does not exist: %1$s" : "Шлях прызначэння не існуе: %1$s",
+ "Favorite files" : "Абраныя файлы",
+ "No favorites" : "Няма абраных",
+ "More favorites" : "Больш абраных",
+ "Accept" : "Прыняць",
+ "Reject" : "Адхіліць",
+ "in %s" : "у %s",
+ "Files compatibility" : "Сумяшчальнасць файлаў",
+ "File Management" : "Кіраванне файламі",
+ "Home" : "Дадому",
+ "Reload current directory" : "Перазагрузіць бягучы каталог",
+ "Go to the \"{dir}\" directory" : "Перайсці да каталога \"{dir}\"",
+ "Drag and drop files here to upload" : "Перацягніце файлы сюды, каб запампаваць іх",
+ "Favorite" : "Абранае",
+ "Back" : "Назад",
+ "File is loading" : "Файл загружаецца",
+ "Folder is loading" : "Папка загружаецца",
+ "Filename" : "Назва файла",
+ "Folder name" : "Назва папкі",
+ "Rename file" : "Перайменаваць файл",
+ "Folder" : "Папка",
+ "Unknown file type" : "Невядомы тып файла",
+ "Pending" : "У чаканні",
+ "Unknown date" : "Невядомая дата",
+ "Clear filter" : "Ачысціць фільтр",
+ "Modified" : "Зменены",
+ "Type" : "Тып",
+ "Active filters" : "Актыўныя фільтры",
+ "Remove filter" : "Выдаліць фільтр",
+ "Name" : "Назва",
+ "File type" : "Тып файла",
+ "Size" : "Памер",
+ "Actions" : "Дзеянні",
+ "List of files and folders." : "Спіс файлаў і папак.",
+ "File not found" : "Файл не знойдзены",
+ "{usedQuotaByte} used" : "Выкарыстана {usedQuotaByte}",
+ "{used} of {quota} used" : "Выкарыстана {used} з {quota}",
+ "{relative}% used" : "Выкарыстана {relative}%",
+ "New folder" : "Новая папка",
+ "Create new folder" : "Стварыць новую папку",
+ "This name is already in use." : "Гэта назва ўжо выкарыстоўваецца.",
+ "Create" : "Стварыць",
+ "Fill template fields" : "Запоўніце палі шаблону",
+ "Unknown error" : "Невядомая памылка",
+ "Change" : "Змяніць",
+ "New owner" : "Новы ўладальнік",
+ "Share" : "Абагуліць",
+ "Upload was cancelled by user" : "Карыстальнік скасаваў запампоўванне",
+ "Go back" : "Назад",
+ "Your files" : "Вашы файлы",
+ "File cannot be accessed" : "Немагчыма атрымаць доступ да файла",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Файл не знойдзены, або ў вас няма правоў на яго прагляд. Папрасіце адпраўніка абагуліць яго.",
+ "No search results for “{query}”" : "Няма вынікаў пошуку па запыце \"{query}\"",
+ "Search for files" : "Пошук файлаў",
+ "Clipboard is not available" : "Буфер абмену недаступны",
+ "WebDAV URL copied to clipboard" : "URL-адрас WebDAV скапіяваны ў буфер абмену",
+ "All files" : "Усе файлы",
+ "Personal files" : "Асабістыя файлы",
+ "Show files extensions" : "Паказваць пашырэнні файлаў",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL-адрас WebDAV",
+ "Copy to clipboard" : "Капіяваць у буфер абмену",
+ "Warnings" : "Папярэджанні",
+ "Keyboard shortcuts" : "Спалучэнні клавіш",
+ "Rename a file" : "Перайменаваць файл",
+ "Delete a file" : "Выдаліць файл",
+ "Select all files" : "Выбраць усе файлы",
+ "Deselect all files" : "Скасаваць выбар усіх файлаў",
+ "Select a range of files" : "Выберыце дыяпазон файлаў",
+ "Navigation" : "Навігацыя",
+ "You" : "Вы",
+ "Error while loading the file data" : "Памылка пры загрузцы даных файла",
+ "Owner" : "Уладальнік",
+ "Remove from favorites" : "Выдаліць з абранага",
+ "Add to favorites" : "У абранае",
+ "Tags" : "Тэгі",
+ "Unable to create new file from template" : "Немагчыма стварыць новы файл з шаблона",
+ "Pick a template for {name}" : "Выберыце шаблон для {name}",
+ "Create a new file with the selected template" : "Стварыць файл на падставе выбранага шаблона",
+ "Creating file" : "Стварэнне файла",
+ "Save as {displayName}" : "Захаваць як {displayName}",
+ "Save as …" : "Захаваць як …",
+ "Converting files …" : "Канвертацыя файлаў …",
+ "Converting file …" : "Канвертацыя файла …",
+ "File successfully converted" : "Файл паспяхова сканвертаваны",
+ "Deletion cancelled" : "Выдаленне скасавана",
+ "Delete permanently" : "Выдаліць назаўжды",
+ "Delete file" : "Выдаліць файл",
+ "Delete files" : "Выдаліць файлы",
+ "Delete folder" : "Выдаліць папку",
+ "Delete folders" : "Выдаліць папкі",
+ "Delete" : "Выдаліць",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Вы збіраецеся назаўжды выдаліць {count} элемент","Вы збіраецеся назаўжды выдаліць {count} элементы","Вы збіраецеся назаўжды выдаліць {count} элементаў","Вы збіраецеся назаўжды выдаліць {count} элементаў"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Вы збіраецеся выдаліць {count} элемент","Вы збіраецеся выдаліць {count} элементы","Вы збіраецеся выдаліць {count} элементаў","Вы збіраецеся выдаліць {count} элементаў"],
+ "Confirm deletion" : "Пацвердзіць выдаленне",
+ "Cancel" : "Скасаваць",
+ "Download" : "Спампаваць",
+ "Moving \"{source}\" to \"{destination}\" …" : "Перамяшчэнне \"{source}\" у \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Капіяванне \"{source}\" у \"{destination}\" …",
+ "This file/folder is already in that directory" : "Гэты файл/папка ўжо знаходзіцца ў гэтым каталогу",
+ "(copy)" : "(копія)",
+ "(copy %n)" : "(копія %n)",
+ "Move cancelled" : "Перамяшчэнне скасавана",
+ "A file or folder with that name already exists in this folder" : "Файл або папка з такой назвай ужо існуе ў гэтай папцы",
+ "The files are locked" : "Файлы заблакіраваны",
+ "The file does not exist anymore" : "Файл больш не існуе",
+ "Choose destination" : "Выберыце прызначэнне",
+ "Copy to {target}" : "Капіяваць у {target}",
+ "Copy" : "Капіяваць",
+ "Move to {target}" : "Перамясціць у {target}",
+ "Move" : "Перамясціць",
+ "Move or copy" : "Перамясціць або капіяваць",
+ "Open folder {displayName}" : "Адкрыць папку {displayName}",
+ "Open locally" : "Адкрыць лакальна",
+ "Open file locally" : "Адкрыць файл лакальна",
+ "Rename" : "Перайменаваць",
+ "Today" : "Сёння",
+ "Last 7 days" : "Апошнія 7 дзён",
+ "Last 30 days" : "Апошнія 30 дзён",
+ "This year ({year})" : "Гэты год ({year})",
+ "Last year ({year})" : "Мінулы год ({year})",
+ "Documents" : "Дакументы",
+ "Spreadsheets" : "Табліцы",
+ "Presentations" : "Прэзентацыі",
+ "PDFs" : "PDF-файлы",
+ "Folders" : "Папкі",
+ "Audio" : "Аўдыя",
+ "Photos and images" : "Фота і відарысы",
+ "Videos" : "Відэа",
+ "New folder creation cancelled" : "Стварэнне новай папкі скасавана",
+ "Created new folder \"{name}\"" : "Створана новая папка \"{name}\"",
+ "Unable to initialize the templates directory" : "Немагчыма ініцыялізаваць каталог шаблонаў",
+ "Create templates folder" : "Стварыць папку шаблонаў",
+ "Templates" : "Шаблоны",
+ "New template folder" : "Новая папка шаблонаў",
+ "In folder" : "У папцы",
+ "One of the dropped files could not be processed" : "Адзін з перацягнутых файлаў не ўдалося апрацаваць",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш браўзер не падтрымлівае Filesystem API. Каталогі не будуць запампаваныя",
+ "No files to upload" : "Няма файлаў для запампоўвання",
+ "Unable to create the directory {directory}" : "Немагчыма стварыць папку {directory}",
+ "Some files could not be uploaded" : "Некаторыя файлы не ўдалося запампаваць",
+ "Files uploaded successfully" : "Файлы паспяхова запампаваныя",
+ "No files to process" : "Няма файлаў для апрацоўкі",
+ "Some files could not be copied" : "Некаторыя файлы не ўдалося скапіяваць",
+ "Some files could not be moved" : "Некаторыя файлы не ўдалося перамясціць",
+ "Files copied successfully" : "Файлы паспяхова скапіяваны",
+ "Files moved successfully" : "Файлы паспяхова перамешчаны",
+ "Conflicts resolution skipped" : "Рашэнне канфліктаў прапушчана",
+ "Upload cancelled" : "Запампоўванне скасавана",
+ "Could not rename \"{oldName}\"" : "Не атрымалася перайменаваць \"{oldName}\"",
+ "Unexpected error: {error}" : "Нечаканая памылка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файлы","%n файлаў","%n файлаў"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папкі","%n папак","%n папак"],
+ "_%n hidden_::_%n hidden_" : ["%n схаваны","%n схаваныя","%n схаваных","%n схаваных"],
+ "Filename must not be empty." : "Назва файла не можа быць пустой.",
+ "No favorites yet" : "Пакуль няма абраных",
+ "List of your files and folders." : "Спіс вашых файлаў і папак.",
+ "All folders" : "Усе папкі",
+ "List of your files and folders that are not shared." : "Спіс вашых неабагуленых файлаў і папак.",
+ "No personal files found" : "Асабістых файлаў не знойдзена",
+ "Files that are not shared will show up here." : "Тут будуць адлюстроўвацца неабагуленыя файлы.",
+ "Recent" : "Нядаўнія",
+ "List of recently modified files and folders." : "Спіс нядаўна змененых файлаў і папак.",
+ "No recently modified files" : "Няма нядаўна змененых файлаў",
+ "Files and folders you recently modified will show up here." : "Тут будуць адлюстроўвацца нядаўна змененыя вамі файлы і папкі.",
+ "Search" : "Пошук",
+ "File could not be found" : "Файл не знойдзены",
+ "Close" : "Закрыць",
+ "Could not create folder \"{dir}\"" : "Не ўдалося стварыць папку \"{dir}\"",
+ "This will stop your current uploads." : "Гэта спыніць вашы бягучыя запампоўкі.",
+ "Upload cancelled." : "Запампоўванне скасавана.",
+ "Processing files …" : "Апрацоўка файлаў …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Немагчыма запампаваць {filename}, бо гэта каталог або ён мае памер 0 байтаў",
+ "An unknown error has occurred" : "Узнікла невядомая памылка",
+ "File could not be uploaded" : "Не ўдалося запампаваць файл",
+ "Uploading …" : "Запампоўванне …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Запампоўванне … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} з {totalSize} ({bitrate})",
+ "Set reminder" : "Задаць напамін",
+ "Edit locally" : "Рэдагаваць лакальна",
+ "Open" : "Адкрыць",
+ "Unable to determine date" : "Немагчыма вызначыць дату",
+ "copy" : "копія",
+ "{newName} already exists" : "{newName} ужо існуе",
+ "{dirs} and {files}" : "{dirs} і {files}",
+ "_Uploading %n file_::_Uploading %n files_" : ["Запампоўванне %n файла","Запампоўванне %n файлаў","Запампоўванне %n файлаў","Запампоўванне %n файлаў"],
+ "New" : "Новы",
+ "{used}%" : "{used}%",
+ "{used} used" : "Выкарыстана {used}",
+ "Path" : "Шлях",
+ "Upload file" : "Запампаваць файл",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папкі","{folderCount} папак","{folderCount} папак"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файлы","{fileCount} файлаў","{fileCount} файлаў"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл і {folderCount} папка","1 файл і {folderCount} папкі","1 файл і {folderCount} папак","1 файл і {folderCount} папак"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл і 1 папка","{fileCount} файлы і 1 папка","{fileCount} файлаў і 1 папка","{fileCount} файлаў і 1 папка"],
+ "Personal Files" : "Асабістыя файлы",
+ "Text file" : "Тэкставы файл"
+},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
+} \ No newline at end of file
diff --git a/apps/files/l10n/bg.js b/apps/files/l10n/bg.js
index cc551b51909..73f349082a9 100644
--- a/apps/files/l10n/bg.js
+++ b/apps/files/l10n/bg.js
@@ -126,8 +126,6 @@ OC.L10N.register(
"Additional settings" : "Допълнителни настройки",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Копиране в клипборда",
- "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
"Keyboard shortcuts" : "Бързи клавиши",
"Selection" : "Избор",
"Navigation" : "Навигация",
@@ -266,6 +264,8 @@ OC.L10N.register(
"Upload file" : "Качи файл",
"An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
"Upload (max. %s)" : "Качи (макс. %s)",
+ "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
"Personal Files" : "Лични файлове",
"Text file" : "Текстов файл",
"New text file.txt" : "Текстов файл.txt"
diff --git a/apps/files/l10n/bg.json b/apps/files/l10n/bg.json
index 7df72584461..ff0191c8f13 100644
--- a/apps/files/l10n/bg.json
+++ b/apps/files/l10n/bg.json
@@ -124,8 +124,6 @@
"Additional settings" : "Допълнителни настройки",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Копиране в клипборда",
- "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
"Keyboard shortcuts" : "Бързи клавиши",
"Selection" : "Избор",
"Navigation" : "Навигация",
@@ -264,6 +262,8 @@
"Upload file" : "Качи файл",
"An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
"Upload (max. %s)" : "Качи (макс. %s)",
+ "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
"Personal Files" : "Лични файлове",
"Text file" : "Текстов файл",
"New text file.txt" : "Текстов файл.txt"
diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js
index 3e2df7e84fa..9c4bdf01e35 100644
--- a/apps/files/l10n/ca.js
+++ b/apps/files/l10n/ca.js
@@ -184,15 +184,13 @@ OC.L10N.register(
"Personal files" : "Fitxers personals",
"Sort favorites first" : "Ordena primer els preferits",
"Sort folders before files" : "Ordena les carpetes abans dels fitxers",
+ "Enable folder tree" : "Habilita l'arbre de carpetes",
"Show hidden files" : "Mostra els fitxers ocults",
"Crop image previews" : "Retalla les previsualitzacions de les imatges",
- "Enable folder tree" : "Habilita l'arbre de carpetes",
"Additional settings" : "Paràmetres addicionals",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copia-ho al porta-retalls",
- "Use this address to access your Files via WebDAV" : "Utilitzeu aquesta adreça per a accedir als vostres fitxers mitjançant WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si heu habilitat l'autenticació de doble factor, podeu crear i utilitzar una nova contrasenya d'aplicació fent clic aquí.",
"Warnings" : "Advertiments",
"Prevent warning dialogs from open or reenable them." : "Eviteu que s'obrin els diàlegs d'advertència o torneu-los a habilitar.",
"Show a warning dialog when changing a file extension." : "Mostra un diàleg d'avís quan es canvia una extensió de fitxer.",
@@ -439,6 +437,8 @@ OC.L10N.register(
"Submitting fields…" : "S'estan enviant camps…",
"Filter filenames…" : "Filtra els noms de fitxer…",
"Enable the grid view" : "Habilita la visualització de quadrícula",
+ "Use this address to access your Files via WebDAV" : "Utilitzeu aquesta adreça per a accedir als vostres fitxers mitjançant WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si heu habilitat l'autenticació de doble factor, podeu crear i utilitzar una nova contrasenya d'aplicació fent clic aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fitxer","{fileCount} fitxers"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fitxer i {folderCount} carpeta","1 fitxer i {folderCount} carpetes"],
diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json
index a9456a5d7e5..a82a75344ed 100644
--- a/apps/files/l10n/ca.json
+++ b/apps/files/l10n/ca.json
@@ -182,15 +182,13 @@
"Personal files" : "Fitxers personals",
"Sort favorites first" : "Ordena primer els preferits",
"Sort folders before files" : "Ordena les carpetes abans dels fitxers",
+ "Enable folder tree" : "Habilita l'arbre de carpetes",
"Show hidden files" : "Mostra els fitxers ocults",
"Crop image previews" : "Retalla les previsualitzacions de les imatges",
- "Enable folder tree" : "Habilita l'arbre de carpetes",
"Additional settings" : "Paràmetres addicionals",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copia-ho al porta-retalls",
- "Use this address to access your Files via WebDAV" : "Utilitzeu aquesta adreça per a accedir als vostres fitxers mitjançant WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si heu habilitat l'autenticació de doble factor, podeu crear i utilitzar una nova contrasenya d'aplicació fent clic aquí.",
"Warnings" : "Advertiments",
"Prevent warning dialogs from open or reenable them." : "Eviteu que s'obrin els diàlegs d'advertència o torneu-los a habilitar.",
"Show a warning dialog when changing a file extension." : "Mostra un diàleg d'avís quan es canvia una extensió de fitxer.",
@@ -437,6 +435,8 @@
"Submitting fields…" : "S'estan enviant camps…",
"Filter filenames…" : "Filtra els noms de fitxer…",
"Enable the grid view" : "Habilita la visualització de quadrícula",
+ "Use this address to access your Files via WebDAV" : "Utilitzeu aquesta adreça per a accedir als vostres fitxers mitjançant WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si heu habilitat l'autenticació de doble factor, podeu crear i utilitzar una nova contrasenya d'aplicació fent clic aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fitxer","{fileCount} fitxers"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fitxer i {folderCount} carpeta","1 fitxer i {folderCount} carpetes"],
diff --git a/apps/files/l10n/cs.js b/apps/files/l10n/cs.js
index 2f593d271c4..490a87ddca0 100644
--- a/apps/files/l10n/cs.js
+++ b/apps/files/l10n/cs.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Vytvořit novou složku",
"This name is already in use." : "Tento název už je využíván.",
"Create" : "Vytvořit",
+ "Files starting with a dot are hidden by default" : "Soubory, kterých názvy začínají tečkou, jsou ve výchozím stavu skryté",
"Fill template fields" : "Vyplňte kolonky šablony",
"Submitting fields …" : "Odesílání kolonek…",
"Submit" : "Odeslat",
@@ -200,19 +201,22 @@ OC.L10N.register(
"Personal files" : "Osobní soubory",
"Sort favorites first" : "Seřadit od oblíbených",
"Sort folders before files" : "Při řazení zobrazovat složky a pak až soubory",
+ "Enable folder tree" : "Zapnout strom složek",
+ "Visual settings" : "Vizuální nastavení",
"Show hidden files" : "Zobrazit skryté soubory",
"Show file type column" : "Zobrazovat sloupec Typ souboru",
"Crop image previews" : "Oříznout náhledy obrázků",
- "Enable folder tree" : "Zapnout strom složek",
+ "Show files extensions" : "Zobrazovat přípony souborů",
"Additional settings" : "Další nastavení",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Zkopírovat do schránky",
- "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Pokud jste zapnuli 2FA (dvoufaktorovou autentizaci), je třeba kliknutím sem vytvořit a použít nové heslo pro aplikaci.",
+ "Use this address to access your Files via WebDAV." : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "U vašeho účtu je zapnuté dvoufázové ověřování a proto pro připojení externího WebDAV klienta bude třeba použít heslo pro konkrétní aplikaci.",
"Warnings" : "Varování",
"Prevent warning dialogs from open or reenable them." : "Zabránit dialogům s varováními v otevírání nebo znovupovolení.",
"Show a warning dialog when changing a file extension." : "Při měnění přípony souboru zobrazit varovný dialog.",
+ "Show a warning dialog when deleting files." : "Před smazáním souborů zobrazit varovný dialog.",
"Keyboard shortcuts" : "Klávesové zkratky",
"Speed up your Files experience with these quick shortcuts." : "Zrychlete svůj dojem ze Souborů pomocí těchto rychlých zkratek.",
"Open the actions menu for a file" : "Otevřít nabídku akcí pro soubor",
@@ -330,6 +334,7 @@ OC.L10N.register(
"Templates" : "Šablony",
"New template folder" : "Nová složka šablon",
"In folder" : "Ve složce",
+ "Search in all files" : "Hledat ve všech souborech",
"Search in folder: {folder}" : "Hledat ve složce: {folder}",
"One of the dropped files could not be processed" : "Jeden z přetažených souborů se nepodařilo zpracovat",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Vámi využívaný prohlížeč nepodporuje aplikační program. rozhraní pro přístup k souborovému systému (Filesytem API). Složky nebudou nahrány",
@@ -458,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Odesílání kolonek…",
"Filter filenames…" : "Filtrovat názvy souborů…",
"Enable the grid view" : "Zapnout zobrazení v mřížce",
+ "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Pokud jste zapnuli 2FA (dvoufaktorovou autentizaci), je třeba kliknutím sem vytvořit a použít nové heslo pro aplikaci.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} složka","{folderCount} složky","{folderCount} složek","{folderCount} složky"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} soubor","{fileCount} soubory","{fileCount} souborů","{fileCount} soubory"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 soubor a {folderCount} složka","1 soubor a {folderCount} složky","1 soubor a {folderCount} složek","1 soubor a {folderCount} složky"],
diff --git a/apps/files/l10n/cs.json b/apps/files/l10n/cs.json
index b565488a6e2..1e487e751f7 100644
--- a/apps/files/l10n/cs.json
+++ b/apps/files/l10n/cs.json
@@ -140,6 +140,7 @@
"Create new folder" : "Vytvořit novou složku",
"This name is already in use." : "Tento název už je využíván.",
"Create" : "Vytvořit",
+ "Files starting with a dot are hidden by default" : "Soubory, kterých názvy začínají tečkou, jsou ve výchozím stavu skryté",
"Fill template fields" : "Vyplňte kolonky šablony",
"Submitting fields …" : "Odesílání kolonek…",
"Submit" : "Odeslat",
@@ -198,19 +199,22 @@
"Personal files" : "Osobní soubory",
"Sort favorites first" : "Seřadit od oblíbených",
"Sort folders before files" : "Při řazení zobrazovat složky a pak až soubory",
+ "Enable folder tree" : "Zapnout strom složek",
+ "Visual settings" : "Vizuální nastavení",
"Show hidden files" : "Zobrazit skryté soubory",
"Show file type column" : "Zobrazovat sloupec Typ souboru",
"Crop image previews" : "Oříznout náhledy obrázků",
- "Enable folder tree" : "Zapnout strom složek",
+ "Show files extensions" : "Zobrazovat přípony souborů",
"Additional settings" : "Další nastavení",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Zkopírovat do schránky",
- "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Pokud jste zapnuli 2FA (dvoufaktorovou autentizaci), je třeba kliknutím sem vytvořit a použít nové heslo pro aplikaci.",
+ "Use this address to access your Files via WebDAV." : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "U vašeho účtu je zapnuté dvoufázové ověřování a proto pro připojení externího WebDAV klienta bude třeba použít heslo pro konkrétní aplikaci.",
"Warnings" : "Varování",
"Prevent warning dialogs from open or reenable them." : "Zabránit dialogům s varováními v otevírání nebo znovupovolení.",
"Show a warning dialog when changing a file extension." : "Při měnění přípony souboru zobrazit varovný dialog.",
+ "Show a warning dialog when deleting files." : "Před smazáním souborů zobrazit varovný dialog.",
"Keyboard shortcuts" : "Klávesové zkratky",
"Speed up your Files experience with these quick shortcuts." : "Zrychlete svůj dojem ze Souborů pomocí těchto rychlých zkratek.",
"Open the actions menu for a file" : "Otevřít nabídku akcí pro soubor",
@@ -328,6 +332,7 @@
"Templates" : "Šablony",
"New template folder" : "Nová složka šablon",
"In folder" : "Ve složce",
+ "Search in all files" : "Hledat ve všech souborech",
"Search in folder: {folder}" : "Hledat ve složce: {folder}",
"One of the dropped files could not be processed" : "Jeden z přetažených souborů se nepodařilo zpracovat",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Vámi využívaný prohlížeč nepodporuje aplikační program. rozhraní pro přístup k souborovému systému (Filesytem API). Složky nebudou nahrány",
@@ -456,6 +461,8 @@
"Submitting fields…" : "Odesílání kolonek…",
"Filter filenames…" : "Filtrovat názvy souborů…",
"Enable the grid view" : "Zapnout zobrazení v mřížce",
+ "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Pokud jste zapnuli 2FA (dvoufaktorovou autentizaci), je třeba kliknutím sem vytvořit a použít nové heslo pro aplikaci.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} složka","{folderCount} složky","{folderCount} složek","{folderCount} složky"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} soubor","{fileCount} soubory","{fileCount} souborů","{fileCount} soubory"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 soubor a {folderCount} složka","1 soubor a {folderCount} složky","1 soubor a {folderCount} složek","1 soubor a {folderCount} složky"],
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index a50d0670245..8ca94ca8edf 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -184,15 +184,13 @@ OC.L10N.register(
"Personal files" : "Personlige filer",
"Sort favorites first" : "Vis favoritter først",
"Sort folders before files" : "Sorter mapper før filer",
+ "Enable folder tree" : "Aktiver mappetræ",
"Show hidden files" : "Vis skjulte filer",
"Crop image previews" : "Beskær forhåndsvisninger af billeder",
- "Enable folder tree" : "Aktiver mappetræ",
"Additional settings" : "Yderligere indstillinger",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopier til udklipsholder",
- "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktiveret 2-faktor godkendelse, skal du oprette en app-token, ved at følge dette link.",
"Warnings" : "Advarsler",
"Prevent warning dialogs from open or reenable them." : "Forhindr advarselsdialoger i at åbner, eller genaktiver dem.",
"Show a warning dialog when changing a file extension." : "Vis en advarselsdialog når en filendelse ændres.",
@@ -439,6 +437,8 @@ OC.L10N.register(
"Submitting fields…" : "Sender felter...",
"Filter filenames…" : "Filtrer filnavne...",
"Enable the grid view" : "Aktiver gittervisning",
+ "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktiveret 2-faktor godkendelse, skal du oprette en app-token, ved at følge dette link.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mapper","1 fil og {folderCount} mapper"],
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index 850e58505d1..0c6588ba055 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -182,15 +182,13 @@
"Personal files" : "Personlige filer",
"Sort favorites first" : "Vis favoritter først",
"Sort folders before files" : "Sorter mapper før filer",
+ "Enable folder tree" : "Aktiver mappetræ",
"Show hidden files" : "Vis skjulte filer",
"Crop image previews" : "Beskær forhåndsvisninger af billeder",
- "Enable folder tree" : "Aktiver mappetræ",
"Additional settings" : "Yderligere indstillinger",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopier til udklipsholder",
- "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktiveret 2-faktor godkendelse, skal du oprette en app-token, ved at følge dette link.",
"Warnings" : "Advarsler",
"Prevent warning dialogs from open or reenable them." : "Forhindr advarselsdialoger i at åbner, eller genaktiver dem.",
"Show a warning dialog when changing a file extension." : "Vis en advarselsdialog når en filendelse ændres.",
@@ -437,6 +435,8 @@
"Submitting fields…" : "Sender felter...",
"Filter filenames…" : "Filtrer filnavne...",
"Enable the grid view" : "Aktiver gittervisning",
+ "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktiveret 2-faktor godkendelse, skal du oprette en app-token, ved at følge dette link.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mapper","1 fil og {folderCount} mapper"],
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 14d374f4399..4033e8e4788 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Neuen Ordner erstellen",
"This name is already in use." : "Dieser Name wird bereits verwendet.",
"Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
"Fill template fields" : "Vorlagenfelder ausfüllen",
"Submitting fields …" : "Felder werden übermittelt …",
"Submit" : "Übermitteln",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Persönliche Dateien",
"Sort favorites first" : "Favoriten zuerst sortieren",
"Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Visual settings" : "Anzeigeeinstellungen",
"Show hidden files" : "Versteckte Dateien anzeigen",
"Show file type column" : "Dateityp-Spalte anzeigen",
"Crop image previews" : "Bildvorschauen zuschneiden",
- "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Show files extensions" : "Dateierweiterungen anzeigen",
"Additional settings" : "Zusätzliche Einstellungen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-URL",
"Copy to clipboard" : "In die Zwischenablage kopieren",
- "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf deine Dateien zuzugreifen.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn du 2FA aktiviert hast, musst du ein neues App-Passwort erstellen und verwenden, indem du hier klickst.",
+ "Use this address to access your Files via WebDAV." : "Diese Adresse verwenden, um über WebDAV auf deine Dateien zuzugreifen.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für dein Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
"Warnings" : "Warnungen",
"Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
"Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Vorlagen",
"New template folder" : "Neuer Vorlagenordner",
"In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
"Search in folder: {folder}" : "Im Ordner suchen: {folder}",
"One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Dein Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen.",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Felder werden übermittelt…",
"Filter filenames…" : "Dateinamen filtern…",
"Enable the grid view" : "Kachelansicht aktivieren",
+ "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf deine Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn du 2FA aktiviert hast, musst du ein neues App-Passwort erstellen und verwenden, indem du hier klickst.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 15706b73308..a17708f6c1d 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -140,6 +140,7 @@
"Create new folder" : "Neuen Ordner erstellen",
"This name is already in use." : "Dieser Name wird bereits verwendet.",
"Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
"Fill template fields" : "Vorlagenfelder ausfüllen",
"Submitting fields …" : "Felder werden übermittelt …",
"Submit" : "Übermitteln",
@@ -198,16 +199,18 @@
"Personal files" : "Persönliche Dateien",
"Sort favorites first" : "Favoriten zuerst sortieren",
"Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Visual settings" : "Anzeigeeinstellungen",
"Show hidden files" : "Versteckte Dateien anzeigen",
"Show file type column" : "Dateityp-Spalte anzeigen",
"Crop image previews" : "Bildvorschauen zuschneiden",
- "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Show files extensions" : "Dateierweiterungen anzeigen",
"Additional settings" : "Zusätzliche Einstellungen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-URL",
"Copy to clipboard" : "In die Zwischenablage kopieren",
- "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf deine Dateien zuzugreifen.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn du 2FA aktiviert hast, musst du ein neues App-Passwort erstellen und verwenden, indem du hier klickst.",
+ "Use this address to access your Files via WebDAV." : "Diese Adresse verwenden, um über WebDAV auf deine Dateien zuzugreifen.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für dein Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
"Warnings" : "Warnungen",
"Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
"Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
@@ -329,6 +332,7 @@
"Templates" : "Vorlagen",
"New template folder" : "Neuer Vorlagenordner",
"In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
"Search in folder: {folder}" : "Im Ordner suchen: {folder}",
"One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Dein Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen.",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Felder werden übermittelt…",
"Filter filenames…" : "Dateinamen filtern…",
"Enable the grid view" : "Kachelansicht aktivieren",
+ "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf deine Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn du 2FA aktiviert hast, musst du ein neues App-Passwort erstellen und verwenden, indem du hier klickst.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index b3ee58163bb..8eea01e2109 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Neuen Ordner erstellen",
"This name is already in use." : "Dieser Name wird bereits verwendet.",
"Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
"Fill template fields" : "Vorlagenfelder ausfüllen",
"Submitting fields …" : "Felder werden übermittelt …",
"Submit" : "Übermitteln",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Persönliche Dateien",
"Sort favorites first" : "Favoriten zuerst sortieren",
"Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Visual settings" : "Anzeigeeinstellungen",
"Show hidden files" : "Versteckte Dateien anzeigen",
"Show file type column" : "Dateityp-Spalte anzeigen",
"Crop image previews" : "Bildvorschauen zuschneiden",
- "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Show files extensions" : "Dateierweiterungen anzeigen",
"Additional settings" : "Zusätzliche Einstellungen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-URL",
"Copy to clipboard" : "In die Zwischenablage kopieren",
- "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn Sie 2FA aktiviert haben, müssen Sie ein neues App-Passwort erstellen und verwenden, indem Sie hier klicken.",
+ "Use this address to access your Files via WebDAV." : "Diese Adresse verwenden, um über WebDAV auf Ihre Dateien zuzugreifen.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für Ihr Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
"Warnings" : "Warnungen",
"Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
"Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Vorlagen",
"New template folder" : "Neuer Vorlagenordner",
"In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
"Search in folder: {folder}" : "Im Ordner suchen: {folder}",
"One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ihr Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Felder werden übermittelt…",
"Filter filenames…" : "Dateinamen filtern…",
"Enable the grid view" : "Kachelansicht aktivieren",
+ "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn Sie 2FA aktiviert haben, müssen Sie ein neues App-Passwort erstellen und verwenden, indem Sie hier klicken.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index c61a211de0d..7264f1be01f 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -140,6 +140,7 @@
"Create new folder" : "Neuen Ordner erstellen",
"This name is already in use." : "Dieser Name wird bereits verwendet.",
"Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
"Fill template fields" : "Vorlagenfelder ausfüllen",
"Submitting fields …" : "Felder werden übermittelt …",
"Submit" : "Übermitteln",
@@ -198,16 +199,18 @@
"Personal files" : "Persönliche Dateien",
"Sort favorites first" : "Favoriten zuerst sortieren",
"Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Visual settings" : "Anzeigeeinstellungen",
"Show hidden files" : "Versteckte Dateien anzeigen",
"Show file type column" : "Dateityp-Spalte anzeigen",
"Crop image previews" : "Bildvorschauen zuschneiden",
- "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Show files extensions" : "Dateierweiterungen anzeigen",
"Additional settings" : "Zusätzliche Einstellungen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-URL",
"Copy to clipboard" : "In die Zwischenablage kopieren",
- "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn Sie 2FA aktiviert haben, müssen Sie ein neues App-Passwort erstellen und verwenden, indem Sie hier klicken.",
+ "Use this address to access your Files via WebDAV." : "Diese Adresse verwenden, um über WebDAV auf Ihre Dateien zuzugreifen.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für Ihr Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
"Warnings" : "Warnungen",
"Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
"Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
@@ -329,6 +332,7 @@
"Templates" : "Vorlagen",
"New template folder" : "Neuer Vorlagenordner",
"In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
"Search in folder: {folder}" : "Im Ordner suchen: {folder}",
"One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ihr Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Felder werden übermittelt…",
"Filter filenames…" : "Dateinamen filtern…",
"Enable the grid view" : "Kachelansicht aktivieren",
+ "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn Sie 2FA aktiviert haben, müssen Sie ein neues App-Passwort erstellen und verwenden, indem Sie hier klicken.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js
index 4e506a4d0b0..c5009fc79a6 100644
--- a/apps/files/l10n/el.js
+++ b/apps/files/l10n/el.js
@@ -156,8 +156,6 @@ OC.L10N.register(
"Additional settings" : "Επιπρόσθετες ρυθμίσεις",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Αντιγραφή στο πρόχειρο",
- "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Εάν έχετε ενεργοποιήσει το 2FA, πρέπει να δημιουργήσετε και να χρησιμοποιήσετε έναν νέο κωδικό πρόσβασης εφαρμογής κάνοντας κλικ εδώ.",
"Keyboard shortcuts" : "Συντομεύσεις πληκτρολογίου",
"Selection" : "Επιλογή",
"Navigation" : "Πλοήγηση",
@@ -339,6 +337,8 @@ OC.L10N.register(
"Upload (max. %s)" : "Μεταφόρτωση (max. %s)",
"Filter filenames…" : "Φιλτράρετε τα ονόματα αρχείων...",
"Enable the grid view" : "Ενεργοποίηση της προβολής πλέγματος",
+ "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Εάν έχετε ενεργοποιήσει το 2FA, πρέπει να δημιουργήσετε και να χρησιμοποιήσετε έναν νέο κωδικό πρόσβασης εφαρμογής κάνοντας κλικ εδώ.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} φάκελος","{folderCount} φακέλοι"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} αρχείο","{fileCount} αρχεία"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 αρχείο και {folderCount} φάκελος","1 αρχείο και {folderCount} φακέλοι"],
diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json
index c0a46a52758..0f3b86970ab 100644
--- a/apps/files/l10n/el.json
+++ b/apps/files/l10n/el.json
@@ -154,8 +154,6 @@
"Additional settings" : "Επιπρόσθετες ρυθμίσεις",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Αντιγραφή στο πρόχειρο",
- "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Εάν έχετε ενεργοποιήσει το 2FA, πρέπει να δημιουργήσετε και να χρησιμοποιήσετε έναν νέο κωδικό πρόσβασης εφαρμογής κάνοντας κλικ εδώ.",
"Keyboard shortcuts" : "Συντομεύσεις πληκτρολογίου",
"Selection" : "Επιλογή",
"Navigation" : "Πλοήγηση",
@@ -337,6 +335,8 @@
"Upload (max. %s)" : "Μεταφόρτωση (max. %s)",
"Filter filenames…" : "Φιλτράρετε τα ονόματα αρχείων...",
"Enable the grid view" : "Ενεργοποίηση της προβολής πλέγματος",
+ "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Εάν έχετε ενεργοποιήσει το 2FA, πρέπει να δημιουργήσετε και να χρησιμοποιήσετε έναν νέο κωδικό πρόσβασης εφαρμογής κάνοντας κλικ εδώ.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} φάκελος","{folderCount} φακέλοι"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} αρχείο","{fileCount} αρχεία"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 αρχείο και {folderCount} φάκελος","1 αρχείο και {folderCount} φακέλοι"],
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index 086e763f4ab..1fdda0d2231 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Create new folder",
"This name is already in use." : "This name is already in use.",
"Create" : "Create",
+ "Files starting with a dot are hidden by default" : "Files starting with a dot are hidden by default",
"Fill template fields" : "Fill template fields",
"Submitting fields …" : "Submitting fields …",
"Submit" : "Submit",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Personal files",
"Sort favorites first" : "Sort favourites first",
"Sort folders before files" : "Sort folders before files",
+ "Enable folder tree" : "Enable folder tree",
+ "Visual settings" : "Visual settings",
"Show hidden files" : "Show hidden files",
"Show file type column" : "Show file type column",
"Crop image previews" : "Crop image previews",
- "Enable folder tree" : "Enable folder tree",
+ "Show files extensions" : "Show files extensions",
"Additional settings" : "Additional settings",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copy to clipboard",
- "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
+ "Use this address to access your Files via WebDAV." : "Use this address to access your Files via WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client.",
"Warnings" : "Warnings",
"Prevent warning dialogs from open or reenable them." : "Prevent warning dialogues from opening or reenable them.",
"Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Templates",
"New template folder" : "New template folder",
"In folder" : "In folder",
+ "Search in all files" : "Search in all files",
"Search in folder: {folder}" : "Search in folder: {folder}",
"One of the dropped files could not be processed" : "One of the dropped files could not be processed",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Submitting fields…",
"Filter filenames…" : "Filter filenames…",
"Enable the grid view" : "Enable the grid view",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index 33d8c73111f..82c19e3405d 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -140,6 +140,7 @@
"Create new folder" : "Create new folder",
"This name is already in use." : "This name is already in use.",
"Create" : "Create",
+ "Files starting with a dot are hidden by default" : "Files starting with a dot are hidden by default",
"Fill template fields" : "Fill template fields",
"Submitting fields …" : "Submitting fields …",
"Submit" : "Submit",
@@ -198,16 +199,18 @@
"Personal files" : "Personal files",
"Sort favorites first" : "Sort favourites first",
"Sort folders before files" : "Sort folders before files",
+ "Enable folder tree" : "Enable folder tree",
+ "Visual settings" : "Visual settings",
"Show hidden files" : "Show hidden files",
"Show file type column" : "Show file type column",
"Crop image previews" : "Crop image previews",
- "Enable folder tree" : "Enable folder tree",
+ "Show files extensions" : "Show files extensions",
"Additional settings" : "Additional settings",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copy to clipboard",
- "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
+ "Use this address to access your Files via WebDAV." : "Use this address to access your Files via WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client.",
"Warnings" : "Warnings",
"Prevent warning dialogs from open or reenable them." : "Prevent warning dialogues from opening or reenable them.",
"Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
@@ -329,6 +332,7 @@
"Templates" : "Templates",
"New template folder" : "New template folder",
"In folder" : "In folder",
+ "Search in all files" : "Search in all files",
"Search in folder: {folder}" : "Search in folder: {folder}",
"One of the dropped files could not be processed" : "One of the dropped files could not be processed",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Submitting fields…",
"Filter filenames…" : "Filter filenames…",
"Enable the grid view" : "Enable the grid view",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 391bbf5b859..eb7bd9723cc 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -199,16 +199,14 @@ OC.L10N.register(
"Personal files" : "Archivos personales",
"Sort favorites first" : "Ordenar los favoritos primero",
"Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
"Show hidden files" : "Mostrar archivos ocultos",
"Show file type column" : "Mostrar la columna de tipo de archivo",
"Crop image previews" : "Recortar la previsualización de las imágenes",
- "Enable folder tree" : "Habilitar el árbol de carpetas",
"Additional settings" : "Ajustes adicionales",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copiar al portapapeles",
- "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"Warnings" : "Advertencias",
"Prevent warning dialogs from open or reenable them." : "Evitar que se abran los diálogos de advertencia o volver a habilitarlos.",
"Show a warning dialog when changing a file extension." : "Mostrar un diálogo de advertencia cuando se cambia la extensión de un archivo.",
@@ -457,6 +455,8 @@ OC.L10N.register(
"Submitting fields…" : "Enviando campos…",
"Filter filenames…" : "Filtrar nombres de archivo…",
"Enable the grid view" : "Habilitar vista de cuadrícula",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 1498a2fc8b9..4e639341be7 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -197,16 +197,14 @@
"Personal files" : "Archivos personales",
"Sort favorites first" : "Ordenar los favoritos primero",
"Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
"Show hidden files" : "Mostrar archivos ocultos",
"Show file type column" : "Mostrar la columna de tipo de archivo",
"Crop image previews" : "Recortar la previsualización de las imágenes",
- "Enable folder tree" : "Habilitar el árbol de carpetas",
"Additional settings" : "Ajustes adicionales",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copiar al portapapeles",
- "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"Warnings" : "Advertencias",
"Prevent warning dialogs from open or reenable them." : "Evitar que se abran los diálogos de advertencia o volver a habilitarlos.",
"Show a warning dialog when changing a file extension." : "Mostrar un diálogo de advertencia cuando se cambia la extensión de un archivo.",
@@ -455,6 +453,8 @@
"Submitting fields…" : "Enviando campos…",
"Filter filenames…" : "Filtrar nombres de archivo…",
"Enable the grid view" : "Habilitar vista de cuadrícula",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
diff --git a/apps/files/l10n/es_EC.js b/apps/files/l10n/es_EC.js
index 37412a96b67..4308a1c4b61 100644
--- a/apps/files/l10n/es_EC.js
+++ b/apps/files/l10n/es_EC.js
@@ -125,8 +125,6 @@ OC.L10N.register(
"Additional settings" : "Configuraciones adicionales",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Copiar al portapapeles",
- "Use this address to access your Files via WebDAV" : "Usa esta dirección para acceder a tus archivos a través de WebDAV.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si has habilitado la autenticación de dos factores (2FA), debes crear y usar una nueva contraseña de aplicación haciendo clic aquí.",
"Keyboard shortcuts" : "Atajos del teclado",
"Selection" : "Selección",
"Navigation" : "Navegación",
@@ -252,6 +250,8 @@ OC.L10N.register(
"Upload file" : "Cargar archivo",
"An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
"Upload (max. %s)" : "Cargar (max. %s)",
+ "Use this address to access your Files via WebDAV" : "Usa esta dirección para acceder a tus archivos a través de WebDAV.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si has habilitado la autenticación de dos factores (2FA), debes crear y usar una nueva contraseña de aplicación haciendo clic aquí.",
"Text file" : "Archivo de texto",
"New text file.txt" : "Nuevo ArchivoDeTexto.txt"
},
diff --git a/apps/files/l10n/es_EC.json b/apps/files/l10n/es_EC.json
index 1aab3813846..ef081f469df 100644
--- a/apps/files/l10n/es_EC.json
+++ b/apps/files/l10n/es_EC.json
@@ -123,8 +123,6 @@
"Additional settings" : "Configuraciones adicionales",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Copiar al portapapeles",
- "Use this address to access your Files via WebDAV" : "Usa esta dirección para acceder a tus archivos a través de WebDAV.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si has habilitado la autenticación de dos factores (2FA), debes crear y usar una nueva contraseña de aplicación haciendo clic aquí.",
"Keyboard shortcuts" : "Atajos del teclado",
"Selection" : "Selección",
"Navigation" : "Navegación",
@@ -250,6 +248,8 @@
"Upload file" : "Cargar archivo",
"An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
"Upload (max. %s)" : "Cargar (max. %s)",
+ "Use this address to access your Files via WebDAV" : "Usa esta dirección para acceder a tus archivos a través de WebDAV.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si has habilitado la autenticación de dos factores (2FA), debes crear y usar una nueva contraseña de aplicación haciendo clic aquí.",
"Text file" : "Archivo de texto",
"New text file.txt" : "Nuevo ArchivoDeTexto.txt"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js
index a1536fc579d..9155789cad9 100644
--- a/apps/files/l10n/es_MX.js
+++ b/apps/files/l10n/es_MX.js
@@ -168,15 +168,13 @@ OC.L10N.register(
"Personal files" : "Archivos personales",
"Sort favorites first" : "Ordenar los favoritos primero",
"Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
"Show hidden files" : "Mostrar archivos ocultos",
"Crop image previews" : "Recortar la previsualización de las imágenes",
- "Enable folder tree" : "Habilitar el árbol de carpetas",
"Additional settings" : "Configuraciones adicionales",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copiar al portapapeles",
- "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"Keyboard shortcuts" : "Atajos del teclado",
"Selection" : "Selección",
"Navigation" : "Navegación",
@@ -384,6 +382,8 @@ OC.L10N.register(
"Submitting fields…" : "Enviando campos...",
"Filter filenames…" : "Filtrar nombres de archivos...",
"Enable the grid view" : "Habilitar la vista de cuadrícula",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json
index 88da99c2174..e43aa6e8e16 100644
--- a/apps/files/l10n/es_MX.json
+++ b/apps/files/l10n/es_MX.json
@@ -166,15 +166,13 @@
"Personal files" : "Archivos personales",
"Sort favorites first" : "Ordenar los favoritos primero",
"Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
"Show hidden files" : "Mostrar archivos ocultos",
"Crop image previews" : "Recortar la previsualización de las imágenes",
- "Enable folder tree" : "Habilitar el árbol de carpetas",
"Additional settings" : "Configuraciones adicionales",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copiar al portapapeles",
- "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"Keyboard shortcuts" : "Atajos del teclado",
"Selection" : "Selección",
"Navigation" : "Navegación",
@@ -382,6 +380,8 @@
"Submitting fields…" : "Enviando campos...",
"Filter filenames…" : "Filtrar nombres de archivos...",
"Enable the grid view" : "Habilitar la vista de cuadrícula",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index 46b4b946732..7851ca46c64 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Loo uus kaust",
"This name is already in use." : "See nimi on juba kasutusel.",
"Create" : "Loo",
+ "Files starting with a dot are hidden by default" : "Punktiga algavad failinimed vaikimisi muudavad faili peidetuks",
"Fill template fields" : "Täida malli väljad",
"Submitting fields …" : "Saadan välju…",
"Submit" : "Saada",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Isiklikud failid",
"Sort favorites first" : "Järjesta lemmikud esimesena",
"Sort folders before files" : "Järjesta kaustad enne faile",
+ "Enable folder tree" : "Võta kasutusele kaustapuu",
+ "Visual settings" : "Visuaalsed seadistused",
"Show hidden files" : "Näita peidetud faile",
"Show file type column" : "Näita failitüübi veergu",
"Crop image previews" : "Kadreeri piltide eelvaated",
- "Enable folder tree" : "Võta kasutusele kaustapuu",
+ "Show files extensions" : "Näita failide laiendusi",
"Additional settings" : "Lisaseadistused",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-i võrguaadress",
"Copy to clipboard" : "Kopeeri lõikelauale",
- "Use this address to access your Files via WebDAV" : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Kui sa oled kaheastmelise autentimise kasutusele võtnud, siis pead looma ja kasutama rakenduse uut salasõna klikates siia.",
+ "Use this address to access your Files via WebDAV." : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Kaheastmeline autentimine on sellel kontol kasutusel ja seega pead välise WebDAV-i kliendi jaoks kasutama rakenduse salasõna.",
"Warnings" : "Hoiatused",
"Prevent warning dialogs from open or reenable them." : "Ära kasuta hoiatusteateid nende avamisel või uuesti kasutusele võtmisel.",
"Show a warning dialog when changing a file extension." : "Faililaiendi muutmisel näita hoiatust.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Mallid",
"New template folder" : "Uus kaustamall",
"In folder" : "Kaustas",
+ "Search in all files" : "Otsi kõikide failide seast",
"Search in folder: {folder}" : "Otsi kaustast: {folder}",
"One of the dropped files could not be processed" : "Ühte siia lisatud failidest ei õnnestunud töödelda",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Sinu veebibrauser ei toeta „Filesystem API“ liidestust. Kaustad jäävad üleslaadimata",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Saadan välju…",
"Filter filenames…" : "Otsi failinimesid…",
"Enable the grid view" : "Võta kasutusele ruudustikuvaade",
+ "Use this address to access your Files via WebDAV" : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Kui sa oled kaheastmelise autentimise kasutusele võtnud, siis pead looma ja kasutama rakenduse uut salasõna klikates siia.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kaust","{folderCount} kausta"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fail","{fileCount} faili"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fail ja {folderCount} kaust","1 fail ja {folderCount} kausta"],
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index 3f6533f9aa2..4d90c441cd7 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -140,6 +140,7 @@
"Create new folder" : "Loo uus kaust",
"This name is already in use." : "See nimi on juba kasutusel.",
"Create" : "Loo",
+ "Files starting with a dot are hidden by default" : "Punktiga algavad failinimed vaikimisi muudavad faili peidetuks",
"Fill template fields" : "Täida malli väljad",
"Submitting fields …" : "Saadan välju…",
"Submit" : "Saada",
@@ -198,16 +199,18 @@
"Personal files" : "Isiklikud failid",
"Sort favorites first" : "Järjesta lemmikud esimesena",
"Sort folders before files" : "Järjesta kaustad enne faile",
+ "Enable folder tree" : "Võta kasutusele kaustapuu",
+ "Visual settings" : "Visuaalsed seadistused",
"Show hidden files" : "Näita peidetud faile",
"Show file type column" : "Näita failitüübi veergu",
"Crop image previews" : "Kadreeri piltide eelvaated",
- "Enable folder tree" : "Võta kasutusele kaustapuu",
+ "Show files extensions" : "Näita failide laiendusi",
"Additional settings" : "Lisaseadistused",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-i võrguaadress",
"Copy to clipboard" : "Kopeeri lõikelauale",
- "Use this address to access your Files via WebDAV" : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Kui sa oled kaheastmelise autentimise kasutusele võtnud, siis pead looma ja kasutama rakenduse uut salasõna klikates siia.",
+ "Use this address to access your Files via WebDAV." : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Kaheastmeline autentimine on sellel kontol kasutusel ja seega pead välise WebDAV-i kliendi jaoks kasutama rakenduse salasõna.",
"Warnings" : "Hoiatused",
"Prevent warning dialogs from open or reenable them." : "Ära kasuta hoiatusteateid nende avamisel või uuesti kasutusele võtmisel.",
"Show a warning dialog when changing a file extension." : "Faililaiendi muutmisel näita hoiatust.",
@@ -329,6 +332,7 @@
"Templates" : "Mallid",
"New template folder" : "Uus kaustamall",
"In folder" : "Kaustas",
+ "Search in all files" : "Otsi kõikide failide seast",
"Search in folder: {folder}" : "Otsi kaustast: {folder}",
"One of the dropped files could not be processed" : "Ühte siia lisatud failidest ei õnnestunud töödelda",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Sinu veebibrauser ei toeta „Filesystem API“ liidestust. Kaustad jäävad üleslaadimata",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Saadan välju…",
"Filter filenames…" : "Otsi failinimesid…",
"Enable the grid view" : "Võta kasutusele ruudustikuvaade",
+ "Use this address to access your Files via WebDAV" : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Kui sa oled kaheastmelise autentimise kasutusele võtnud, siis pead looma ja kasutama rakenduse uut salasõna klikates siia.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kaust","{folderCount} kausta"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fail","{fileCount} faili"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fail ja {folderCount} kaust","1 fail ja {folderCount} kausta"],
diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js
index 7ddbb25d5d4..4dba1c45621 100644
--- a/apps/files/l10n/eu.js
+++ b/apps/files/l10n/eu.js
@@ -175,15 +175,13 @@ OC.L10N.register(
"Personal files" : "Fitxategi pertsonalak",
"Sort favorites first" : "Ordenatu gogokoak lehenengo",
"Sort folders before files" : "Ordenatu karpetak fitxategien aurretik",
+ "Enable folder tree" : "Gaitu karpeta-zuhaitza",
"Show hidden files" : "Erakutsi ezkutuko fitxategiak",
"Crop image previews" : "Moztu irudien aurrebistak",
- "Enable folder tree" : "Gaitu karpeta-zuhaitza",
"Additional settings" : "Ezarpen gehiago",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URLa",
"Copy to clipboard" : "Kopiatu arbelera",
- "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FA gaitu baduzu, aplikazioaren pasahitz berria sortu eta erabili behar duzu hemen klik eginez.",
"Keyboard shortcuts" : "Teklatuaren lasterbideak",
"Speed up your Files experience with these quick shortcuts." : "Azkartu zure Fitxategi esperientzia lasterbide bizkor hauekin",
"Open the actions menu for a file" : "Ireki ekintza menua fitxategi baterako",
@@ -411,6 +409,8 @@ OC.L10N.register(
"Submitting fields…" : "Eremuak bidaltzen…",
"Filter filenames…" : "Iragazi fitxategi-izenak...",
"Enable the grid view" : "Gaitu sareta ikuspegira",
+ "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FA gaitu baduzu, aplikazioaren pasahitz berria sortu eta erabili behar duzu hemen klik eginez.",
"_{folderCount} folder_::_{folderCount} folders_" : ["Karpeta {folderCount}","{folderCount} karpeta"],
"_{fileCount} file_::_{fileCount} files_" : ["Fitxategi {fileCount}","{fileCount} fitxategi"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["Fitxategi 1 eta karpeta {folderCount}","Fitxategi 1 eta {folderCount} karpeta"],
diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json
index 744fd082680..84ef3467e9b 100644
--- a/apps/files/l10n/eu.json
+++ b/apps/files/l10n/eu.json
@@ -173,15 +173,13 @@
"Personal files" : "Fitxategi pertsonalak",
"Sort favorites first" : "Ordenatu gogokoak lehenengo",
"Sort folders before files" : "Ordenatu karpetak fitxategien aurretik",
+ "Enable folder tree" : "Gaitu karpeta-zuhaitza",
"Show hidden files" : "Erakutsi ezkutuko fitxategiak",
"Crop image previews" : "Moztu irudien aurrebistak",
- "Enable folder tree" : "Gaitu karpeta-zuhaitza",
"Additional settings" : "Ezarpen gehiago",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URLa",
"Copy to clipboard" : "Kopiatu arbelera",
- "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FA gaitu baduzu, aplikazioaren pasahitz berria sortu eta erabili behar duzu hemen klik eginez.",
"Keyboard shortcuts" : "Teklatuaren lasterbideak",
"Speed up your Files experience with these quick shortcuts." : "Azkartu zure Fitxategi esperientzia lasterbide bizkor hauekin",
"Open the actions menu for a file" : "Ireki ekintza menua fitxategi baterako",
@@ -409,6 +407,8 @@
"Submitting fields…" : "Eremuak bidaltzen…",
"Filter filenames…" : "Iragazi fitxategi-izenak...",
"Enable the grid view" : "Gaitu sareta ikuspegira",
+ "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FA gaitu baduzu, aplikazioaren pasahitz berria sortu eta erabili behar duzu hemen klik eginez.",
"_{folderCount} folder_::_{folderCount} folders_" : ["Karpeta {folderCount}","{folderCount} karpeta"],
"_{fileCount} file_::_{fileCount} files_" : ["Fitxategi {fileCount}","{fileCount} fitxategi"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["Fitxategi 1 eta karpeta {folderCount}","Fitxategi 1 eta {folderCount} karpeta"],
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js
index 50a5c76fd91..859c70717d7 100644
--- a/apps/files/l10n/fa.js
+++ b/apps/files/l10n/fa.js
@@ -192,16 +192,14 @@ OC.L10N.register(
"Personal files" : "فایل‌های شخصی",
"Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید",
"Sort folders before files" : "Sort folders before files",
+ "Enable folder tree" : "Enable folder tree",
"Show hidden files" : "نمایش پرونده‌های مخفی",
"Show file type column" : "Show file type column",
"Crop image previews" : "پیش نمایش تصویر برش",
- "Enable folder tree" : "Enable folder tree",
"Additional settings" : "تنظیمات اضافی",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "کپی به کلیپ بورد",
- "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
"Warnings" : "Warnings",
"Prevent warning dialogs from open or reenable them." : "Prevent warning dialogs from open or reenable them.",
"Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
@@ -446,6 +444,8 @@ OC.L10N.register(
"Submitting fields…" : "Submitting fields…",
"Filter filenames…" : "Filter filenames…",
"Enable the grid view" : "Enable the grid view",
+ "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} پوشه","{folderCount} پوشه"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} پرونده","{fileCount} پرونده"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json
index b29437755f4..c92d393b608 100644
--- a/apps/files/l10n/fa.json
+++ b/apps/files/l10n/fa.json
@@ -190,16 +190,14 @@
"Personal files" : "فایل‌های شخصی",
"Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید",
"Sort folders before files" : "Sort folders before files",
+ "Enable folder tree" : "Enable folder tree",
"Show hidden files" : "نمایش پرونده‌های مخفی",
"Show file type column" : "Show file type column",
"Crop image previews" : "پیش نمایش تصویر برش",
- "Enable folder tree" : "Enable folder tree",
"Additional settings" : "تنظیمات اضافی",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "کپی به کلیپ بورد",
- "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
"Warnings" : "Warnings",
"Prevent warning dialogs from open or reenable them." : "Prevent warning dialogs from open or reenable them.",
"Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
@@ -444,6 +442,8 @@
"Submitting fields…" : "Submitting fields…",
"Filter filenames…" : "Filter filenames…",
"Enable the grid view" : "Enable the grid view",
+ "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} پوشه","{folderCount} پوشه"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} پرونده","{fileCount} پرونده"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js
index 603e354950c..85b728b48f0 100644
--- a/apps/files/l10n/fi.js
+++ b/apps/files/l10n/fi.js
@@ -171,16 +171,14 @@ OC.L10N.register(
"Personal files" : "Henkilökohtaiset tiedostot",
"Sort favorites first" : "Järjestä suosikit ensiksi",
"Sort folders before files" : "Järjestä kansiot ennen tiedostoja",
+ "Enable folder tree" : "Ota kansiopuu käyttöön",
"Show hidden files" : "Näytä piilotetut tiedostot",
"Show file type column" : "Näytä tiedostotyypin sarake",
"Crop image previews" : "Rajaa kuvien esikatseluja",
- "Enable folder tree" : "Ota kansiopuu käyttöön",
"Additional settings" : "Lisäasetukset",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV:in URL-osoite",
"Copy to clipboard" : "Kopioi leikepöydälle",
- "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta yhdistääksesi tiedostosi WebDAV:in kautta",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jos sinulla on kaksivaiheinen todennus käytössä, sinun täytyy luoda uusi sovellussalasana ja käyttää sitä napsauttamalla tästä.",
"Warnings" : "Varoitukset",
"Keyboard shortcuts" : "Pikanäppäimet",
"Speed up your Files experience with these quick shortcuts." : "Nopeuta tiedostonhallinnan kokemusta näillä pikanäppäimillä.",
@@ -404,6 +402,8 @@ OC.L10N.register(
"Submitting fields…" : "Lähetetään tietoja...",
"Filter filenames…" : "Suodata tiedostonimiä...",
"Enable the grid view" : "Käytä ruudukkonäkymää",
+ "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta yhdistääksesi tiedostosi WebDAV:in kautta",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jos sinulla on kaksivaiheinen todennus käytössä, sinun täytyy luoda uusi sovellussalasana ja käyttää sitä napsauttamalla tästä.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kansio","{folderCount} kansiota"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} tiedosto","{fileCount} tiedostoa"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tiedosto ja {folderCount} kansio","1 tiedosto ja {folderCount} kansiota"],
diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json
index d0876aac932..035811928ef 100644
--- a/apps/files/l10n/fi.json
+++ b/apps/files/l10n/fi.json
@@ -169,16 +169,14 @@
"Personal files" : "Henkilökohtaiset tiedostot",
"Sort favorites first" : "Järjestä suosikit ensiksi",
"Sort folders before files" : "Järjestä kansiot ennen tiedostoja",
+ "Enable folder tree" : "Ota kansiopuu käyttöön",
"Show hidden files" : "Näytä piilotetut tiedostot",
"Show file type column" : "Näytä tiedostotyypin sarake",
"Crop image previews" : "Rajaa kuvien esikatseluja",
- "Enable folder tree" : "Ota kansiopuu käyttöön",
"Additional settings" : "Lisäasetukset",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV:in URL-osoite",
"Copy to clipboard" : "Kopioi leikepöydälle",
- "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta yhdistääksesi tiedostosi WebDAV:in kautta",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jos sinulla on kaksivaiheinen todennus käytössä, sinun täytyy luoda uusi sovellussalasana ja käyttää sitä napsauttamalla tästä.",
"Warnings" : "Varoitukset",
"Keyboard shortcuts" : "Pikanäppäimet",
"Speed up your Files experience with these quick shortcuts." : "Nopeuta tiedostonhallinnan kokemusta näillä pikanäppäimillä.",
@@ -402,6 +400,8 @@
"Submitting fields…" : "Lähetetään tietoja...",
"Filter filenames…" : "Suodata tiedostonimiä...",
"Enable the grid view" : "Käytä ruudukkonäkymää",
+ "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta yhdistääksesi tiedostosi WebDAV:in kautta",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jos sinulla on kaksivaiheinen todennus käytössä, sinun täytyy luoda uusi sovellussalasana ja käyttää sitä napsauttamalla tästä.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kansio","{folderCount} kansiota"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} tiedosto","{fileCount} tiedostoa"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tiedosto ja {folderCount} kansio","1 tiedosto ja {folderCount} kansiota"],
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index b5384fd1687..e526e1c7926 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -197,16 +197,14 @@ OC.L10N.register(
"Personal files" : "Fichiers personnels",
"Sort favorites first" : "Trier les favoris en premier",
"Sort folders before files" : "Trier les dossiers avant les fichiers",
+ "Enable folder tree" : "Activer l'arborescence des dossiers",
"Show hidden files" : "Montrer les fichiers masqués",
"Show file type column" : "Afficher la colonne du type de fichier",
"Crop image previews" : "Afficher en miniatures carrées",
- "Enable folder tree" : "Activer l'arborescence des dossiers",
"Additional settings" : "Paramètres supplémentaires",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Copier dans le presse-papiers",
- "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.",
"Warnings" : "Avertissements",
"Prevent warning dialogs from open or reenable them." : "Empêchez l'ouverture des boîtes de dialogue d'avertissement ou réactivez-les.",
"Show a warning dialog when changing a file extension." : "Afficher un avertissement quand l'extension du fichier est modifiée.",
@@ -234,7 +232,7 @@ OC.L10N.register(
"Show those shortcuts" : "Montrer ces raccourcis",
"You" : "Vous",
"Shared multiple times with different people" : "Partagé plusieurs fois avec plusieurs personnes",
- "Unable to change the favorite state of the file" : "Impossible de modifier l'état favori du fichier",
+ "Unable to change the favorite state of the file" : "Impossible de modifier l'état de mise en favori du fichier",
"Error while loading the file data" : "Erreur lors du chargement du fichier de données",
"Owner" : "Propriétaire",
"Remove from favorites" : "Retirer des favoris",
@@ -455,6 +453,8 @@ OC.L10N.register(
"Submitting fields…" : "Validation des champs...",
"Filter filenames…" : "Filtrer par nom de fichier…",
"Enable the grid view" : "Activer la vue en grille",
+ "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} dossier","{folderCount} dossiers","{folderCount} dossiers"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fichier","{fileCount} fichiers","{fileCount} fichiers"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fichier et {folderCount} dossier","1 fichier et {folderCount} dossiers","1 fichier et {folderCount} dossiers"],
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 10ef7c45cae..b09ae33d0b9 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -195,16 +195,14 @@
"Personal files" : "Fichiers personnels",
"Sort favorites first" : "Trier les favoris en premier",
"Sort folders before files" : "Trier les dossiers avant les fichiers",
+ "Enable folder tree" : "Activer l'arborescence des dossiers",
"Show hidden files" : "Montrer les fichiers masqués",
"Show file type column" : "Afficher la colonne du type de fichier",
"Crop image previews" : "Afficher en miniatures carrées",
- "Enable folder tree" : "Activer l'arborescence des dossiers",
"Additional settings" : "Paramètres supplémentaires",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Copier dans le presse-papiers",
- "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.",
"Warnings" : "Avertissements",
"Prevent warning dialogs from open or reenable them." : "Empêchez l'ouverture des boîtes de dialogue d'avertissement ou réactivez-les.",
"Show a warning dialog when changing a file extension." : "Afficher un avertissement quand l'extension du fichier est modifiée.",
@@ -232,7 +230,7 @@
"Show those shortcuts" : "Montrer ces raccourcis",
"You" : "Vous",
"Shared multiple times with different people" : "Partagé plusieurs fois avec plusieurs personnes",
- "Unable to change the favorite state of the file" : "Impossible de modifier l'état favori du fichier",
+ "Unable to change the favorite state of the file" : "Impossible de modifier l'état de mise en favori du fichier",
"Error while loading the file data" : "Erreur lors du chargement du fichier de données",
"Owner" : "Propriétaire",
"Remove from favorites" : "Retirer des favoris",
@@ -453,6 +451,8 @@
"Submitting fields…" : "Validation des champs...",
"Filter filenames…" : "Filtrer par nom de fichier…",
"Enable the grid view" : "Activer la vue en grille",
+ "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} dossier","{folderCount} dossiers","{folderCount} dossiers"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fichier","{fileCount} fichiers","{fileCount} fichiers"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fichier et {folderCount} dossier","1 fichier et {folderCount} dossiers","1 fichier et {folderCount} dossiers"],
diff --git a/apps/files/l10n/ga.js b/apps/files/l10n/ga.js
index b872f9b4c48..444be11b720 100644
--- a/apps/files/l10n/ga.js
+++ b/apps/files/l10n/ga.js
@@ -129,6 +129,7 @@ OC.L10N.register(
"Search globally by filename …" : "Cuardaigh go domhanda de réir ainm comhaid …",
"Search here by filename …" : "Cuardaigh anseo de réir ainm comhaid …",
"Search scope options" : "Roghanna raon feidhme cuardaigh",
+ "Filter and search from this location" : "Scag agus déan cuardach ón suíomh seo",
"Search globally" : "Cuardaigh go domhanda",
"{usedQuotaByte} used" : "{usedQuotaByte} úsáidte",
"{used} of {quota} used" : "{used} de {quota} in úsáid",
@@ -141,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Cruthaigh fillteán nua",
"This name is already in use." : "Tá an t-ainm seo in úsáid cheana féin.",
"Create" : "Cruthaigh",
+ "Files starting with a dot are hidden by default" : "Bíonn comhaid a thosaíonn le ponc i bhfolach de réir réamhshocraithe",
"Fill template fields" : "Líon réimsí teimpléid",
"Submitting fields …" : "Réimsí á gcur isteach…",
"Submit" : "Cuir isteach",
@@ -199,19 +201,22 @@ OC.L10N.register(
"Personal files" : "Comhaid phearsanta",
"Sort favorites first" : "Sórtáil na cinn is ansa leat ar dtús",
"Sort folders before files" : "Sórtáil fillteáin roimh chomhaid",
+ "Enable folder tree" : "Cumasaigh crann fillteáin",
+ "Visual settings" : "Socruithe amhairc",
"Show hidden files" : "Taispeáin comhaid i bhfolach",
"Show file type column" : "Taispeáin colún cineál comhaid",
"Crop image previews" : "Réamhamhairc íomhá barr",
- "Enable folder tree" : "Cumasaigh crann fillteáin",
+ "Show files extensions" : "Taispeáin síntí comhad",
"Additional settings" : "Socruithe breise",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce",
- "Use this address to access your Files via WebDAV" : "Úsáid an seoladh seo chun do Chomhaid a rochtain trí WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Má tá 2FA cumasaithe agat, ní mór duit pasfhocal aip nua a chruthú agus a úsáid trí chliceáil anseo.",
+ "Use this address to access your Files via WebDAV." : "Úsáid an seoladh seo chun rochtain a fháil ar do Chomhaid trí WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tá Fíordheimhniú Dhá Fhachtóir cumasaithe do do chuntas, agus dá bhrí sin ní mór duit pasfhocal aipe a úsáid chun cliant seachtrach WebDAV a nascadh.",
"Warnings" : "Rabhaidh",
"Prevent warning dialogs from open or reenable them." : "Cosc a chur ar dialóga rabhaidh ó iad a oscailt nó iad a athchumasú.",
"Show a warning dialog when changing a file extension." : "Taispeáin dialóg rabhaidh nuair a athraítear síneadh comhad.",
+ "Show a warning dialog when deleting files." : "Taispeáin comhrá rabhaidh agus comhaid á scriosadh.",
"Keyboard shortcuts" : "Aicearraí méarchláir",
"Speed up your Files experience with these quick shortcuts." : "Déan do thaithí Comhaid a bhrostú leis na haicearraí tapa seo.",
"Open the actions menu for a file" : "Oscail an roghchlár gníomhartha le haghaidh comhad",
@@ -329,6 +334,7 @@ OC.L10N.register(
"Templates" : "Teimpléid",
"New template folder" : "Fillteán teimpléid nua",
"In folder" : "I bhfillteán",
+ "Search in all files" : "Cuardaigh i ngach comhad",
"Search in folder: {folder}" : "Cuardaigh i bhfillteán: {folder}",
"One of the dropped files could not be processed" : "Níorbh fhéidir ceann de na comhaid a thit a phróiseáil",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ní thacaíonn do bhrabhsálaí leis an API System File. Ní dhéanfar eolaire a uaslódáil",
@@ -457,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Réimsí á gcur isteach…",
"Filter filenames…" : "Scag ainmneacha comhaid…",
"Enable the grid view" : "Cumasaigh an radharc greille",
+ "Use this address to access your Files via WebDAV" : "Úsáid an seoladh seo chun do Chomhaid a rochtain trí WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Má tá 2FA cumasaithe agat, ní mór duit pasfhocal aip nua a chruthú agus a úsáid trí chliceáil anseo.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} fillteán","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} comhad","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 chomhad agus {folderCount} fillteán","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin"],
diff --git a/apps/files/l10n/ga.json b/apps/files/l10n/ga.json
index c71888d8c2b..212bec646a4 100644
--- a/apps/files/l10n/ga.json
+++ b/apps/files/l10n/ga.json
@@ -127,6 +127,7 @@
"Search globally by filename …" : "Cuardaigh go domhanda de réir ainm comhaid …",
"Search here by filename …" : "Cuardaigh anseo de réir ainm comhaid …",
"Search scope options" : "Roghanna raon feidhme cuardaigh",
+ "Filter and search from this location" : "Scag agus déan cuardach ón suíomh seo",
"Search globally" : "Cuardaigh go domhanda",
"{usedQuotaByte} used" : "{usedQuotaByte} úsáidte",
"{used} of {quota} used" : "{used} de {quota} in úsáid",
@@ -139,6 +140,7 @@
"Create new folder" : "Cruthaigh fillteán nua",
"This name is already in use." : "Tá an t-ainm seo in úsáid cheana féin.",
"Create" : "Cruthaigh",
+ "Files starting with a dot are hidden by default" : "Bíonn comhaid a thosaíonn le ponc i bhfolach de réir réamhshocraithe",
"Fill template fields" : "Líon réimsí teimpléid",
"Submitting fields …" : "Réimsí á gcur isteach…",
"Submit" : "Cuir isteach",
@@ -197,19 +199,22 @@
"Personal files" : "Comhaid phearsanta",
"Sort favorites first" : "Sórtáil na cinn is ansa leat ar dtús",
"Sort folders before files" : "Sórtáil fillteáin roimh chomhaid",
+ "Enable folder tree" : "Cumasaigh crann fillteáin",
+ "Visual settings" : "Socruithe amhairc",
"Show hidden files" : "Taispeáin comhaid i bhfolach",
"Show file type column" : "Taispeáin colún cineál comhaid",
"Crop image previews" : "Réamhamhairc íomhá barr",
- "Enable folder tree" : "Cumasaigh crann fillteáin",
+ "Show files extensions" : "Taispeáin síntí comhad",
"Additional settings" : "Socruithe breise",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce",
- "Use this address to access your Files via WebDAV" : "Úsáid an seoladh seo chun do Chomhaid a rochtain trí WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Má tá 2FA cumasaithe agat, ní mór duit pasfhocal aip nua a chruthú agus a úsáid trí chliceáil anseo.",
+ "Use this address to access your Files via WebDAV." : "Úsáid an seoladh seo chun rochtain a fháil ar do Chomhaid trí WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tá Fíordheimhniú Dhá Fhachtóir cumasaithe do do chuntas, agus dá bhrí sin ní mór duit pasfhocal aipe a úsáid chun cliant seachtrach WebDAV a nascadh.",
"Warnings" : "Rabhaidh",
"Prevent warning dialogs from open or reenable them." : "Cosc a chur ar dialóga rabhaidh ó iad a oscailt nó iad a athchumasú.",
"Show a warning dialog when changing a file extension." : "Taispeáin dialóg rabhaidh nuair a athraítear síneadh comhad.",
+ "Show a warning dialog when deleting files." : "Taispeáin comhrá rabhaidh agus comhaid á scriosadh.",
"Keyboard shortcuts" : "Aicearraí méarchláir",
"Speed up your Files experience with these quick shortcuts." : "Déan do thaithí Comhaid a bhrostú leis na haicearraí tapa seo.",
"Open the actions menu for a file" : "Oscail an roghchlár gníomhartha le haghaidh comhad",
@@ -327,6 +332,7 @@
"Templates" : "Teimpléid",
"New template folder" : "Fillteán teimpléid nua",
"In folder" : "I bhfillteán",
+ "Search in all files" : "Cuardaigh i ngach comhad",
"Search in folder: {folder}" : "Cuardaigh i bhfillteán: {folder}",
"One of the dropped files could not be processed" : "Níorbh fhéidir ceann de na comhaid a thit a phróiseáil",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ní thacaíonn do bhrabhsálaí leis an API System File. Ní dhéanfar eolaire a uaslódáil",
@@ -455,6 +461,8 @@
"Submitting fields…" : "Réimsí á gcur isteach…",
"Filter filenames…" : "Scag ainmneacha comhaid…",
"Enable the grid view" : "Cumasaigh an radharc greille",
+ "Use this address to access your Files via WebDAV" : "Úsáid an seoladh seo chun do Chomhaid a rochtain trí WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Má tá 2FA cumasaithe agat, ní mór duit pasfhocal aip nua a chruthú agus a úsáid trí chliceáil anseo.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} fillteán","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} comhad","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 chomhad agus {folderCount} fillteán","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin"],
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index 9311626fb89..b7536174fe8 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -185,15 +185,13 @@ OC.L10N.register(
"Personal files" : "Ficheiros persoais",
"Sort favorites first" : "Ordene antes os favoritos",
"Sort folders before files" : "Ordenar os cartafoles diante dos ficheiros",
+ "Enable folder tree" : "Activar a árbore de cartafoles",
"Show hidden files" : "Amosar os ficheiros agochados",
"Crop image previews" : "Recortar a vista previa das imaxes",
- "Enable folder tree" : "Activar a árbore de cartafoles",
"Additional settings" : "Axustes adicionais",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copiar no portapapeis.",
- "Use this address to access your Files via WebDAV" : "Empregue este enderezo para acceder ao seu Ficheiros mediante WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se activou 2FA, cree e utilice un novo contrasinal de aplicación premendo aquí.",
"Warnings" : "Advertencias",
"Prevent warning dialogs from open or reenable them." : "Impedir abrir ou reactivar os diálogos de advertencia",
"Show a warning dialog when changing a file extension." : "Amosar un diálogo de advertencia ao cambiar unha extensión de ficheiro.",
@@ -438,6 +436,8 @@ OC.L10N.register(
"Submitting fields…" : "Enviando os campos...",
"Filter filenames…" : "Filtrar os nomes de ficheiro…",
"Enable the grid view" : "Activar á vista de grade",
+ "Use this address to access your Files via WebDAV" : "Empregue este enderezo para acceder ao seu Ficheiros mediante WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se activou 2FA, cree e utilice un novo contrasinal de aplicación premendo aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartafol","{folderCount} cartafoles"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheiro","{fileCount} ficheiros"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheiro e {folderCount} cartafol","1 ficheiro e {folderCount} cartafoles"],
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index a39f32c834d..3f99b0356b0 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -183,15 +183,13 @@
"Personal files" : "Ficheiros persoais",
"Sort favorites first" : "Ordene antes os favoritos",
"Sort folders before files" : "Ordenar os cartafoles diante dos ficheiros",
+ "Enable folder tree" : "Activar a árbore de cartafoles",
"Show hidden files" : "Amosar os ficheiros agochados",
"Crop image previews" : "Recortar a vista previa das imaxes",
- "Enable folder tree" : "Activar a árbore de cartafoles",
"Additional settings" : "Axustes adicionais",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copiar no portapapeis.",
- "Use this address to access your Files via WebDAV" : "Empregue este enderezo para acceder ao seu Ficheiros mediante WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se activou 2FA, cree e utilice un novo contrasinal de aplicación premendo aquí.",
"Warnings" : "Advertencias",
"Prevent warning dialogs from open or reenable them." : "Impedir abrir ou reactivar os diálogos de advertencia",
"Show a warning dialog when changing a file extension." : "Amosar un diálogo de advertencia ao cambiar unha extensión de ficheiro.",
@@ -436,6 +434,8 @@
"Submitting fields…" : "Enviando os campos...",
"Filter filenames…" : "Filtrar os nomes de ficheiro…",
"Enable the grid view" : "Activar á vista de grade",
+ "Use this address to access your Files via WebDAV" : "Empregue este enderezo para acceder ao seu Ficheiros mediante WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se activou 2FA, cree e utilice un novo contrasinal de aplicación premendo aquí.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartafol","{folderCount} cartafoles"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheiro","{fileCount} ficheiros"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheiro e {folderCount} cartafol","1 ficheiro e {folderCount} cartafoles"],
diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js
index bb8ba7e08e6..884f1fee21c 100644
--- a/apps/files/l10n/hu.js
+++ b/apps/files/l10n/hu.js
@@ -193,16 +193,14 @@ OC.L10N.register(
"Personal files" : "Személyes fájlok",
"Sort favorites first" : "Kedvencek előre rendezése",
"Sort folders before files" : "Mappák fájlok elé rendezése",
+ "Enable folder tree" : "Mappafa engedélyezése",
"Show hidden files" : "Rejtett fájlok megjelenítése",
"Show file type column" : "Fájltípus oszlop megjelenítése",
"Crop image previews" : "Kép előnézetek vágása",
- "Enable folder tree" : "Mappafa engedélyezése",
"Additional settings" : "További beállítások",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-webcím",
"Copy to clipboard" : "Másolás a vágólapra",
- "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ha engedélyezte a kétfaktoros hitelesítést, akkor kattintson ide, hogy létrehozzon egy új alkalmazásjelszót, és azt használja.",
"Warnings" : "Figyelmeztetések",
"Prevent warning dialogs from open or reenable them." : "Figyelmeztető párbeszédablakok megnyitásának megakadályozása vagy engedélyezése.",
"Show a warning dialog when changing a file extension." : "Figyelmeztető párbeszédablakok megnyitása a fájlkiterjesztés módosításakor.",
@@ -450,6 +448,8 @@ OC.L10N.register(
"Submitting fields…" : "Mezők beküldése…",
"Filter filenames…" : "Fájlnevek szűrése…",
"Enable the grid view" : "Rácsnézet engedélyezése",
+ "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ha engedélyezte a kétfaktoros hitelesítést, akkor kattintson ide, hogy létrehozzon egy új alkalmazásjelszót, és azt használja.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} mappa"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fájl","{fileCount} fájl"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fájl és {folderCount} mappa","1 fájl és {folderCount} mappa"],
diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json
index 3f4fbe4ce97..236e7d922c6 100644
--- a/apps/files/l10n/hu.json
+++ b/apps/files/l10n/hu.json
@@ -191,16 +191,14 @@
"Personal files" : "Személyes fájlok",
"Sort favorites first" : "Kedvencek előre rendezése",
"Sort folders before files" : "Mappák fájlok elé rendezése",
+ "Enable folder tree" : "Mappafa engedélyezése",
"Show hidden files" : "Rejtett fájlok megjelenítése",
"Show file type column" : "Fájltípus oszlop megjelenítése",
"Crop image previews" : "Kép előnézetek vágása",
- "Enable folder tree" : "Mappafa engedélyezése",
"Additional settings" : "További beállítások",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-webcím",
"Copy to clipboard" : "Másolás a vágólapra",
- "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ha engedélyezte a kétfaktoros hitelesítést, akkor kattintson ide, hogy létrehozzon egy új alkalmazásjelszót, és azt használja.",
"Warnings" : "Figyelmeztetések",
"Prevent warning dialogs from open or reenable them." : "Figyelmeztető párbeszédablakok megnyitásának megakadályozása vagy engedélyezése.",
"Show a warning dialog when changing a file extension." : "Figyelmeztető párbeszédablakok megnyitása a fájlkiterjesztés módosításakor.",
@@ -448,6 +446,8 @@
"Submitting fields…" : "Mezők beküldése…",
"Filter filenames…" : "Fájlnevek szűrése…",
"Enable the grid view" : "Rácsnézet engedélyezése",
+ "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ha engedélyezte a kétfaktoros hitelesítést, akkor kattintson ide, hogy létrehozzon egy új alkalmazásjelszót, és azt használja.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} mappa"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fájl","{fileCount} fájl"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fájl és {folderCount} mappa","1 fájl és {folderCount} mappa"],
diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js
index 6640156031c..47c165a4246 100644
--- a/apps/files/l10n/is.js
+++ b/apps/files/l10n/is.js
@@ -176,15 +176,13 @@ OC.L10N.register(
"Personal files" : "Einkaskrár",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
+ "Enable folder tree" : "Virkja möppugreinar",
"Show hidden files" : "Sýna faldar skrár",
"Crop image previews" : "Skera utan af forskoðun mynda",
- "Enable folder tree" : "Virkja möppugreinar",
"Additional settings" : "Valfrjálsar stillingar",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-slóð",
"Copy to clipboard" : "Afrita á klippispjald",
- "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skráaforritið þitt með WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ef þú hefur virkjað 2FA tveggja-þrepa-auðkenningu, þarftu að útbúa nýtt lykilorð forrits og nota það með því að smella hér.",
"Keyboard shortcuts" : "Flýtileiðir á lyklaborði",
"Speed up your Files experience with these quick shortcuts." : "Flýttu fyrir vinnu þinni með skrár með þessum flýtilyklum.",
"Open the actions menu for a file" : "Opna aðgerðavalmynd fyrir skrá",
@@ -421,6 +419,8 @@ OC.L10N.register(
"Submitting fields…" : "Sendi inn gögn úr reitum…",
"Filter filenames…" : "Sía skráaheiti…",
"Enable the grid view" : "Virkja reitasýnina",
+ "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skráaforritið þitt með WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ef þú hefur virkjað 2FA tveggja-þrepa-auðkenningu, þarftu að útbúa nýtt lykilorð forrits og nota það með því að smella hér.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} möppur"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} skrá","{fileCount} skrár"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 skrá og {folderCount} mappa","1 skrá og {folderCount} möppur"],
diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json
index aa0dcfe4af5..71191eb3d93 100644
--- a/apps/files/l10n/is.json
+++ b/apps/files/l10n/is.json
@@ -174,15 +174,13 @@
"Personal files" : "Einkaskrár",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
+ "Enable folder tree" : "Virkja möppugreinar",
"Show hidden files" : "Sýna faldar skrár",
"Crop image previews" : "Skera utan af forskoðun mynda",
- "Enable folder tree" : "Virkja möppugreinar",
"Additional settings" : "Valfrjálsar stillingar",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV-slóð",
"Copy to clipboard" : "Afrita á klippispjald",
- "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skráaforritið þitt með WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ef þú hefur virkjað 2FA tveggja-þrepa-auðkenningu, þarftu að útbúa nýtt lykilorð forrits og nota það með því að smella hér.",
"Keyboard shortcuts" : "Flýtileiðir á lyklaborði",
"Speed up your Files experience with these quick shortcuts." : "Flýttu fyrir vinnu þinni með skrár með þessum flýtilyklum.",
"Open the actions menu for a file" : "Opna aðgerðavalmynd fyrir skrá",
@@ -419,6 +417,8 @@
"Submitting fields…" : "Sendi inn gögn úr reitum…",
"Filter filenames…" : "Sía skráaheiti…",
"Enable the grid view" : "Virkja reitasýnina",
+ "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skráaforritið þitt með WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ef þú hefur virkjað 2FA tveggja-þrepa-auðkenningu, þarftu að útbúa nýtt lykilorð forrits og nota það með því að smella hér.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} möppur"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} skrá","{fileCount} skrár"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 skrá og {folderCount} mappa","1 skrá og {folderCount} möppur"],
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index 39787e39664..55790ea82f9 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -82,7 +82,7 @@ OC.L10N.register(
"Current directory path" : "Percorso della cartella corrente",
"Your have used your space quota and cannot upload files anymore" : "Hai esaurito la tua quota di spazio e non puoi più caricare file",
"You do not have permission to upload or create files here." : "Non hai l'autorizzazione per caricare o creare file qui.",
- "Drag and drop files here to upload" : "Trascina i file qui per caricarli",
+ "Drag and drop files here to upload" : "Trascina e rilascia i file qui per caricarli",
"Favorite" : "Preferito",
"Back" : "Indietro",
"Toggle selection for file \"{displayName}\"" : "Attiva/disattiva la selezione per il file \"{displayName}\"",
@@ -129,6 +129,7 @@ OC.L10N.register(
"Search globally by filename …" : "Cerca globalmente per nome file…",
"Search here by filename …" : "Cerca qui per nome file…",
"Search scope options" : "Opzioni nell'ambito di ricerca",
+ "Filter and search from this location" : "Filtra e cerca da questa posizione",
"Search globally" : "Cerca globalmente",
"{usedQuotaByte} used" : "{usedQuotaByte} usato",
"{used} of {quota} used" : "{used} di {quota} utilizzati",
@@ -141,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Crea una nuova cartella",
"This name is already in use." : "Questo nome è già utilizzato.",
"Create" : "Crea",
+ "Files starting with a dot are hidden by default" : "I file che iniziano con un punto sono nascosti per impostazione predefinita",
"Fill template fields" : "Compila i campi del modello",
"Submitting fields …" : "Invio dei campi …",
"Submit" : "Invia",
@@ -199,19 +201,20 @@ OC.L10N.register(
"Personal files" : "File personali",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina cartelle prima dei files",
+ "Enable folder tree" : "Abilita l'albero delle cartelle",
"Show hidden files" : "Mostra i file nascosti",
"Show file type column" : "Mostra colonna tipo di file",
"Crop image previews" : "Ritaglia le anteprime delle immagini",
- "Enable folder tree" : "Abilita l'albero delle cartelle",
"Additional settings" : "Impostazioni aggiuntive",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Copia negli appunti",
- "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se hai abilitato il 2FA, devi creare ed usare una nuova password per l'applicazione facendo clic qui.",
+ "Use this address to access your Files via WebDAV." : "Utilizza questo indirizzo per accedere ai tuoi file tramite WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Per il tuo account è abilitata l'autenticazione a due fattori, pertanto devi utilizzare una password dell'app per connetterti a un client WebDAV esterno.",
"Warnings" : "Avvertenze",
"Prevent warning dialogs from open or reenable them." : "Impedire l'apertura delle finestre di dialogo di avviso o riattivarle.",
"Show a warning dialog when changing a file extension." : "Mostra una finestra di dialogo di avviso quando si modifica l'estensione di un file.",
+ "Show a warning dialog when deleting files." : "Mostra un dialogo di avviso quando si cancellano dei file.",
"Keyboard shortcuts" : "Scorciatoie da tastiera",
"Speed up your Files experience with these quick shortcuts." : "Velocizza la tua esperienza con i File con queste rapide scorciatoie.",
"Open the actions menu for a file" : "Aprire il menu delle azioni per un file",
@@ -330,7 +333,7 @@ OC.L10N.register(
"New template folder" : "Nuova cartella dei modelli",
"In folder" : "Nella cartella",
"Search in folder: {folder}" : "Cerca nella cartella: {folder}",
- "One of the dropped files could not be processed" : "Impossibile elaborare uno dei file eliminati",
+ "One of the dropped files could not be processed" : "Impossibile elaborare uno dei file depositati",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Il tuo browser non supporta l'API del file system. Le directory non verranno caricate",
"No files to upload" : "Nessun file da caricare",
"Unable to create the directory {directory}" : "Impossibile creare la directory {directory}",
@@ -457,6 +460,8 @@ OC.L10N.register(
"Submitting fields…" : "Invio dei campi…",
"Filter filenames…" : "Filtra nomi di file…",
"Enable the grid view" : "Attiva visuale a griglia",
+ "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se hai abilitato il 2FA, devi creare ed usare una nuova password per l'applicazione facendo clic qui.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartelle","{folderCount} cartelle"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} file","{fileCount} file"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file e {folderCount} cartella","1 file e {folderCount} cartelle","1 file e {folderCount} cartelle"],
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 40edb4b3f9a..07b8d760ff7 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -80,7 +80,7 @@
"Current directory path" : "Percorso della cartella corrente",
"Your have used your space quota and cannot upload files anymore" : "Hai esaurito la tua quota di spazio e non puoi più caricare file",
"You do not have permission to upload or create files here." : "Non hai l'autorizzazione per caricare o creare file qui.",
- "Drag and drop files here to upload" : "Trascina i file qui per caricarli",
+ "Drag and drop files here to upload" : "Trascina e rilascia i file qui per caricarli",
"Favorite" : "Preferito",
"Back" : "Indietro",
"Toggle selection for file \"{displayName}\"" : "Attiva/disattiva la selezione per il file \"{displayName}\"",
@@ -127,6 +127,7 @@
"Search globally by filename …" : "Cerca globalmente per nome file…",
"Search here by filename …" : "Cerca qui per nome file…",
"Search scope options" : "Opzioni nell'ambito di ricerca",
+ "Filter and search from this location" : "Filtra e cerca da questa posizione",
"Search globally" : "Cerca globalmente",
"{usedQuotaByte} used" : "{usedQuotaByte} usato",
"{used} of {quota} used" : "{used} di {quota} utilizzati",
@@ -139,6 +140,7 @@
"Create new folder" : "Crea una nuova cartella",
"This name is already in use." : "Questo nome è già utilizzato.",
"Create" : "Crea",
+ "Files starting with a dot are hidden by default" : "I file che iniziano con un punto sono nascosti per impostazione predefinita",
"Fill template fields" : "Compila i campi del modello",
"Submitting fields …" : "Invio dei campi …",
"Submit" : "Invia",
@@ -197,19 +199,20 @@
"Personal files" : "File personali",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina cartelle prima dei files",
+ "Enable folder tree" : "Abilita l'albero delle cartelle",
"Show hidden files" : "Mostra i file nascosti",
"Show file type column" : "Mostra colonna tipo di file",
"Crop image previews" : "Ritaglia le anteprime delle immagini",
- "Enable folder tree" : "Abilita l'albero delle cartelle",
"Additional settings" : "Impostazioni aggiuntive",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Copia negli appunti",
- "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se hai abilitato il 2FA, devi creare ed usare una nuova password per l'applicazione facendo clic qui.",
+ "Use this address to access your Files via WebDAV." : "Utilizza questo indirizzo per accedere ai tuoi file tramite WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Per il tuo account è abilitata l'autenticazione a due fattori, pertanto devi utilizzare una password dell'app per connetterti a un client WebDAV esterno.",
"Warnings" : "Avvertenze",
"Prevent warning dialogs from open or reenable them." : "Impedire l'apertura delle finestre di dialogo di avviso o riattivarle.",
"Show a warning dialog when changing a file extension." : "Mostra una finestra di dialogo di avviso quando si modifica l'estensione di un file.",
+ "Show a warning dialog when deleting files." : "Mostra un dialogo di avviso quando si cancellano dei file.",
"Keyboard shortcuts" : "Scorciatoie da tastiera",
"Speed up your Files experience with these quick shortcuts." : "Velocizza la tua esperienza con i File con queste rapide scorciatoie.",
"Open the actions menu for a file" : "Aprire il menu delle azioni per un file",
@@ -328,7 +331,7 @@
"New template folder" : "Nuova cartella dei modelli",
"In folder" : "Nella cartella",
"Search in folder: {folder}" : "Cerca nella cartella: {folder}",
- "One of the dropped files could not be processed" : "Impossibile elaborare uno dei file eliminati",
+ "One of the dropped files could not be processed" : "Impossibile elaborare uno dei file depositati",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Il tuo browser non supporta l'API del file system. Le directory non verranno caricate",
"No files to upload" : "Nessun file da caricare",
"Unable to create the directory {directory}" : "Impossibile creare la directory {directory}",
@@ -455,6 +458,8 @@
"Submitting fields…" : "Invio dei campi…",
"Filter filenames…" : "Filtra nomi di file…",
"Enable the grid view" : "Attiva visuale a griglia",
+ "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se hai abilitato il 2FA, devi creare ed usare una nuova password per l'applicazione facendo clic qui.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartelle","{folderCount} cartelle"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} file","{fileCount} file"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file e {folderCount} cartella","1 file e {folderCount} cartelle","1 file e {folderCount} cartelle"],
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 86accfd0959..be3bf30fb98 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -129,6 +129,7 @@ OC.L10N.register(
"Search globally by filename …" : "ファイル名でグローバルに検索 …",
"Search here by filename …" : "ファイル名でここを検索 …",
"Search scope options" : "検索範囲オプション",
+ "Filter and search from this location" : "この場所からフィルターをかけて検索",
"Search globally" : "グローバルに検索",
"{usedQuotaByte} used" : "{usedQuotaByte} 使用されています",
"{used} of {quota} used" : "{used} / {quota} 使用中",
@@ -141,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "新しいフォルダーを作成",
"This name is already in use." : "この名前は既に使用されています。",
"Create" : "作成",
+ "Files starting with a dot are hidden by default" : "ドットで始まるファイルはデフォルトで非表示になっています",
"Fill template fields" : "テンプレートフィールドへの入力",
"Submitting fields …" : "フィールドを送信中…",
"Submit" : "提出する",
@@ -194,23 +196,25 @@ OC.L10N.register(
"Search for files" : "ファイルを検索",
"Clipboard is not available" : "クリップボードは利用できません",
"WebDAV URL copied to clipboard" : "WebDAVのURLがクリップボードにコピーされました",
+ "Default view" : "デフォルト表示",
"All files" : "すべてのファイル",
"Personal files" : "個人ファイル",
"Sort favorites first" : "お気に入りを最初に並べる",
"Sort folders before files" : "ファイルよりもフォルダを先に並べ替えます",
+ "Enable folder tree" : "フォルダーツリーを有効にする",
"Show hidden files" : "隠しファイルを表示",
"Show file type column" : "ファイルの種類のカラムを表示する",
"Crop image previews" : "プレビュー画像を切り抜く",
- "Enable folder tree" : "フォルダーツリーを有効にする",
"Additional settings" : "追加設定",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "クリップボードにコピー",
- "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FAを有効にしている場合は、ここをクリックして新しいアプリのパスワードを作成し、使用する必要があります。",
+ "Use this address to access your Files via WebDAV." : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます。",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "2要素認証がアカウントに有効化されています。そのため、外部WebDAVクライアントを接続するにはアプリパスワードを使用する必要があります。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "警告ダイアログが開かないようにするか、再度有効にする。",
"Show a warning dialog when changing a file extension." : "ファイルの拡張子を変更する際に、警告ダイアログを表示する。",
+ "Show a warning dialog when deleting files." : "ファイルを削除する際に警告ダイアログを表示します。",
"Keyboard shortcuts" : "キーボードショートカット",
"Speed up your Files experience with these quick shortcuts." : "これらのショートカットでファイルの取り扱いを高速化します",
"Open the actions menu for a file" : "ファイルのアクションメニューを開く",
@@ -456,6 +460,8 @@ OC.L10N.register(
"Submitting fields…" : "フィールドを送信中…",
"Filter filenames…" : "ファイルネームフィルター…",
"Enable the grid view" : "グリッド表示を有効にする",
+ "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FAを有効にしている場合は、ここをクリックして新しいアプリのパスワードを作成し、使用する必要があります。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} フォルダ"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ファイル"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ファイルと {folderCount} フォルダ"],
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 0764c1dafa8..0cb0109bf69 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -127,6 +127,7 @@
"Search globally by filename …" : "ファイル名でグローバルに検索 …",
"Search here by filename …" : "ファイル名でここを検索 …",
"Search scope options" : "検索範囲オプション",
+ "Filter and search from this location" : "この場所からフィルターをかけて検索",
"Search globally" : "グローバルに検索",
"{usedQuotaByte} used" : "{usedQuotaByte} 使用されています",
"{used} of {quota} used" : "{used} / {quota} 使用中",
@@ -139,6 +140,7 @@
"Create new folder" : "新しいフォルダーを作成",
"This name is already in use." : "この名前は既に使用されています。",
"Create" : "作成",
+ "Files starting with a dot are hidden by default" : "ドットで始まるファイルはデフォルトで非表示になっています",
"Fill template fields" : "テンプレートフィールドへの入力",
"Submitting fields …" : "フィールドを送信中…",
"Submit" : "提出する",
@@ -192,23 +194,25 @@
"Search for files" : "ファイルを検索",
"Clipboard is not available" : "クリップボードは利用できません",
"WebDAV URL copied to clipboard" : "WebDAVのURLがクリップボードにコピーされました",
+ "Default view" : "デフォルト表示",
"All files" : "すべてのファイル",
"Personal files" : "個人ファイル",
"Sort favorites first" : "お気に入りを最初に並べる",
"Sort folders before files" : "ファイルよりもフォルダを先に並べ替えます",
+ "Enable folder tree" : "フォルダーツリーを有効にする",
"Show hidden files" : "隠しファイルを表示",
"Show file type column" : "ファイルの種類のカラムを表示する",
"Crop image previews" : "プレビュー画像を切り抜く",
- "Enable folder tree" : "フォルダーツリーを有効にする",
"Additional settings" : "追加設定",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "クリップボードにコピー",
- "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FAを有効にしている場合は、ここをクリックして新しいアプリのパスワードを作成し、使用する必要があります。",
+ "Use this address to access your Files via WebDAV." : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます。",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "2要素認証がアカウントに有効化されています。そのため、外部WebDAVクライアントを接続するにはアプリパスワードを使用する必要があります。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "警告ダイアログが開かないようにするか、再度有効にする。",
"Show a warning dialog when changing a file extension." : "ファイルの拡張子を変更する際に、警告ダイアログを表示する。",
+ "Show a warning dialog when deleting files." : "ファイルを削除する際に警告ダイアログを表示します。",
"Keyboard shortcuts" : "キーボードショートカット",
"Speed up your Files experience with these quick shortcuts." : "これらのショートカットでファイルの取り扱いを高速化します",
"Open the actions menu for a file" : "ファイルのアクションメニューを開く",
@@ -454,6 +458,8 @@
"Submitting fields…" : "フィールドを送信中…",
"Filter filenames…" : "ファイルネームフィルター…",
"Enable the grid view" : "グリッド表示を有効にする",
+ "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FAを有効にしている場合は、ここをクリックして新しいアプリのパスワードを作成し、使用する必要があります。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} フォルダ"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ファイル"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ファイルと {folderCount} フォルダ"],
diff --git a/apps/files/l10n/ka.js b/apps/files/l10n/ka.js
index 555841ae491..e2bba4852a0 100644
--- a/apps/files/l10n/ka.js
+++ b/apps/files/l10n/ka.js
@@ -138,8 +138,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copy to clipboard",
- "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
"Keyboard shortcuts" : "Keyboard shortcuts",
"Navigation" : "Navigation",
"View" : "View",
@@ -287,6 +285,8 @@ OC.L10N.register(
"An error occurred while trying to update the tags" : "An error occurred while trying to update the tags",
"Upload (max. %s)" : "Upload (max. %s)",
"Enable the grid view" : "Enable the grid view",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
diff --git a/apps/files/l10n/ka.json b/apps/files/l10n/ka.json
index 311c45c7a87..1647fd0d042 100644
--- a/apps/files/l10n/ka.json
+++ b/apps/files/l10n/ka.json
@@ -136,8 +136,6 @@
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Copy to clipboard",
- "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
"Keyboard shortcuts" : "Keyboard shortcuts",
"Navigation" : "Navigation",
"View" : "View",
@@ -285,6 +283,8 @@
"An error occurred while trying to update the tags" : "An error occurred while trying to update the tags",
"Upload (max. %s)" : "Upload (max. %s)",
"Enable the grid view" : "Enable the grid view",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index 0bd515f67a0..33cfc8a2c52 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -184,15 +184,13 @@ OC.L10N.register(
"Personal files" : "개인 파일",
"Sort favorites first" : "즐겨찾기를 처음에 나열",
"Sort folders before files" : "폴더를 파일보다 먼저 정렬",
+ "Enable folder tree" : "폴더 트리 활성화",
"Show hidden files" : "숨김 파일 보이기",
"Crop image previews" : "이미지 미리보기 확대",
- "Enable folder tree" : "폴더 트리 활성화",
"Additional settings" : "고급 설정",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "클립보드로 복사",
- "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
"Keyboard shortcuts" : "키보드 단축키",
"Speed up your Files experience with these quick shortcuts." : "이 빠른 단축키를 사용하여 파일 사용 속도를 높이세요.",
"Open the actions menu for a file" : "파일 작업 메뉴 열기",
@@ -426,6 +424,8 @@ OC.L10N.register(
"Submitting fields…" : "입력란 제출중...",
"Filter filenames…" : "파일 이름 필터...",
"Enable the grid view" : "바둑판식 보기 활성화",
+ "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount}개 폴더"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount}개 파일"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1개 파일과 {folderCount}개 폴더"],
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index 13a6a4e0375..2a059b545b1 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -182,15 +182,13 @@
"Personal files" : "개인 파일",
"Sort favorites first" : "즐겨찾기를 처음에 나열",
"Sort folders before files" : "폴더를 파일보다 먼저 정렬",
+ "Enable folder tree" : "폴더 트리 활성화",
"Show hidden files" : "숨김 파일 보이기",
"Crop image previews" : "이미지 미리보기 확대",
- "Enable folder tree" : "폴더 트리 활성화",
"Additional settings" : "고급 설정",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "클립보드로 복사",
- "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
"Keyboard shortcuts" : "키보드 단축키",
"Speed up your Files experience with these quick shortcuts." : "이 빠른 단축키를 사용하여 파일 사용 속도를 높이세요.",
"Open the actions menu for a file" : "파일 작업 메뉴 열기",
@@ -424,6 +422,8 @@
"Submitting fields…" : "입력란 제출중...",
"Filter filenames…" : "파일 이름 필터...",
"Enable the grid view" : "바둑판식 보기 활성화",
+ "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount}개 폴더"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount}개 파일"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1개 파일과 {folderCount}개 폴더"],
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index 9a2e3004b28..bfa25a5efa6 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -135,13 +135,12 @@ OC.L10N.register(
"WebDAV URL copied to clipboard" : "WebDAV URL nukopijuotas į iškarpinę",
"All files" : "Visi failai",
"Personal files" : "Asmeniniai failai",
+ "Enable folder tree" : "Įjungti direktorijų medį",
"Show hidden files" : "Rodyti paslėptus failus",
"Crop image previews" : "Apkirpti paveikslėlių peržiūras",
- "Enable folder tree" : "Įjungti direktorijų medį",
"Additional settings" : "Papildomi nustatymai",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Kopijuoti į iškarpinę",
- "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
"Warnings" : "Įspėjimai",
"Keyboard shortcuts" : "Spartieji klavišai",
"Rename a file" : "Pervadinti failą",
@@ -309,6 +308,7 @@ OC.L10N.register(
"Upload (max. %s)" : "Įkelti (maks. %s)",
"Filter filenames…" : "Filtruoti failų pavadinimus…",
"Enable the grid view" : "Įjungti grid peržiūrą",
+ "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} aplankas","{folderCount} aplankai","{folderCount} aplankų","{folderCount} aplankas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} failas","{fileCount} failai","{fileCount} failų","{fileCount} failas"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 failas ir {folderCount} aplankas","1 failas ir {folderCount} aplankai","1 failas ir {folderCount} aplankų","1 failas ir {folderCount} aplankas"],
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index 9b0253a3f82..ca7adc3638c 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -133,13 +133,12 @@
"WebDAV URL copied to clipboard" : "WebDAV URL nukopijuotas į iškarpinę",
"All files" : "Visi failai",
"Personal files" : "Asmeniniai failai",
+ "Enable folder tree" : "Įjungti direktorijų medį",
"Show hidden files" : "Rodyti paslėptus failus",
"Crop image previews" : "Apkirpti paveikslėlių peržiūras",
- "Enable folder tree" : "Įjungti direktorijų medį",
"Additional settings" : "Papildomi nustatymai",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Kopijuoti į iškarpinę",
- "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
"Warnings" : "Įspėjimai",
"Keyboard shortcuts" : "Spartieji klavišai",
"Rename a file" : "Pervadinti failą",
@@ -307,6 +306,7 @@
"Upload (max. %s)" : "Įkelti (maks. %s)",
"Filter filenames…" : "Filtruoti failų pavadinimus…",
"Enable the grid view" : "Įjungti grid peržiūrą",
+ "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} aplankas","{folderCount} aplankai","{folderCount} aplankų","{folderCount} aplankas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} failas","{fileCount} failai","{fileCount} failų","{fileCount} failas"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 failas ir {folderCount} aplankas","1 failas ir {folderCount} aplankai","1 failas ir {folderCount} aplankų","1 failas ir {folderCount} aplankas"],
diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js
index 50725de8aad..e869de2b765 100644
--- a/apps/files/l10n/mk.js
+++ b/apps/files/l10n/mk.js
@@ -183,16 +183,14 @@ OC.L10N.register(
"Personal files" : "Лични датотеки",
"Sort favorites first" : "Прво омилените",
"Sort folders before files" : "Подреди ги папките пред датотеките",
+ "Enable folder tree" : "Овозможи поглед на дрво",
"Show hidden files" : "Прикажи сокриени датотеки",
"Show file type column" : "Прикажи колона за тип на датотека",
"Crop image previews" : "Исечи ја сликата за преглед",
- "Enable folder tree" : "Овозможи поглед на дрво",
"Additional settings" : "Дополнителни параметри",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV адреса",
"Copy to clipboard" : "Копирај во клипборд",
- "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако имате овозможено 2FA, мора да креирате и користите нова лозинка за апликација со кликнување овде.",
"Warnings" : "Предупредувања",
"Prevent warning dialogs from open or reenable them." : "Спречете ги дијалозите за предупредување да се отвораат или повторно овозможете ги.",
"Show a warning dialog when changing a file extension." : "Прикажи дијалог за предупредување при промена на екстензија на датотека.",
@@ -389,6 +387,8 @@ OC.L10N.register(
"Upload (max. %s)" : "Префрлање (макс. %s)",
"Filter filenames…" : "Филтрирај имиња на датотеки ...",
"Enable the grid view" : "Овозможи поглед во мрежа",
+ "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако имате овозможено 2FA, мора да креирате и користите нова лозинка за апликација со кликнување овде.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} датотека","{fileCount} датотеки"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 датотека и {folderCount} папки","1 датотека и {folderCount} папки"],
diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json
index 1494bfaae99..4bff6ca193b 100644
--- a/apps/files/l10n/mk.json
+++ b/apps/files/l10n/mk.json
@@ -181,16 +181,14 @@
"Personal files" : "Лични датотеки",
"Sort favorites first" : "Прво омилените",
"Sort folders before files" : "Подреди ги папките пред датотеките",
+ "Enable folder tree" : "Овозможи поглед на дрво",
"Show hidden files" : "Прикажи сокриени датотеки",
"Show file type column" : "Прикажи колона за тип на датотека",
"Crop image previews" : "Исечи ја сликата за преглед",
- "Enable folder tree" : "Овозможи поглед на дрво",
"Additional settings" : "Дополнителни параметри",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV адреса",
"Copy to clipboard" : "Копирај во клипборд",
- "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако имате овозможено 2FA, мора да креирате и користите нова лозинка за апликација со кликнување овде.",
"Warnings" : "Предупредувања",
"Prevent warning dialogs from open or reenable them." : "Спречете ги дијалозите за предупредување да се отвораат или повторно овозможете ги.",
"Show a warning dialog when changing a file extension." : "Прикажи дијалог за предупредување при промена на екстензија на датотека.",
@@ -387,6 +385,8 @@
"Upload (max. %s)" : "Префрлање (макс. %s)",
"Filter filenames…" : "Филтрирај имиња на датотеки ...",
"Enable the grid view" : "Овозможи поглед во мрежа",
+ "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако имате овозможено 2FA, мора да креирате и користите нова лозинка за апликација со кликнување овде.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} датотека","{fileCount} датотеки"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 датотека и {folderCount} папки","1 датотека и {folderCount} папки"],
diff --git a/apps/files/l10n/nb.js b/apps/files/l10n/nb.js
index cd928970711..2b30edeae6d 100644
--- a/apps/files/l10n/nb.js
+++ b/apps/files/l10n/nb.js
@@ -174,15 +174,13 @@ OC.L10N.register(
"Personal files" : "Personlige filer",
"Sort favorites first" : "Sorter favoritter først",
"Sort folders before files" : "Sorter mapper før filer",
+ "Enable folder tree" : "Aktiver mappetre",
"Show hidden files" : "Vis skjulte filer",
"Crop image previews" : "Beskjær forhåndsvisninger av bilder",
- "Enable folder tree" : "Aktiver mappetre",
"Additional settings" : "Flere innstillinger",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopiert til utklippstavlen",
- "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktivert 2FA, må du opprette og bruke et nytt app-passord ved å klikke her.",
"Keyboard shortcuts" : "Tastatursnarveier",
"Speed up your Files experience with these quick shortcuts." : "Jobb raskere med filer ved å bruke disse hurtigtastene.",
"Open the actions menu for a file" : "Åpner handlingsmenyen for en fil",
@@ -407,6 +405,8 @@ OC.L10N.register(
"Submitting fields…" : "Sender inn felt...",
"Filter filenames…" : "Filtrer filnavn...",
"Enable the grid view" : "Aktiver rutenettvisningen",
+ "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktivert 2FA, må du opprette og bruke et nytt app-passord ved å klikke her.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mappe","1 fil og {folderCount} mapper"],
diff --git a/apps/files/l10n/nb.json b/apps/files/l10n/nb.json
index c036a20f9a1..1c1429abe62 100644
--- a/apps/files/l10n/nb.json
+++ b/apps/files/l10n/nb.json
@@ -172,15 +172,13 @@
"Personal files" : "Personlige filer",
"Sort favorites first" : "Sorter favoritter først",
"Sort folders before files" : "Sorter mapper før filer",
+ "Enable folder tree" : "Aktiver mappetre",
"Show hidden files" : "Vis skjulte filer",
"Crop image previews" : "Beskjær forhåndsvisninger av bilder",
- "Enable folder tree" : "Aktiver mappetre",
"Additional settings" : "Flere innstillinger",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopiert til utklippstavlen",
- "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktivert 2FA, må du opprette og bruke et nytt app-passord ved å klikke her.",
"Keyboard shortcuts" : "Tastatursnarveier",
"Speed up your Files experience with these quick shortcuts." : "Jobb raskere med filer ved å bruke disse hurtigtastene.",
"Open the actions menu for a file" : "Åpner handlingsmenyen for en fil",
@@ -405,6 +403,8 @@
"Submitting fields…" : "Sender inn felt...",
"Filter filenames…" : "Filtrer filnavn...",
"Enable the grid view" : "Aktiver rutenettvisningen",
+ "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktivert 2FA, må du opprette og bruke et nytt app-passord ved å klikke her.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mappe","1 fil og {folderCount} mapper"],
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 2fdd0911225..c2b4bec6650 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -200,16 +200,14 @@ OC.L10N.register(
"Personal files" : "Persoonlijke bestanden",
"Sort favorites first" : "Sorteer eerst favorieten",
"Sort folders before files" : "Sorteer mappen voor bestanden",
+ "Enable folder tree" : "Mappenboom inschakelen",
"Show hidden files" : "Toon verborgen bestanden",
"Show file type column" : "Toon bestandstypekolom",
"Crop image previews" : "Snij afbeeldingvoorbeelden bij",
- "Enable folder tree" : "Mappenboom inschakelen",
"Additional settings" : "Aanvullende instellingen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopiëren naar het klembord",
- "Use this address to access your Files via WebDAV" : "Gebruik dit adres om je bestanden via WebDAV te benaderen",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Als je 2FA hebt ingeschakeld moet je een app wachtwoord maken en gebruiken door hier te klikken.",
"Warnings" : "Waarschuwingen",
"Prevent warning dialogs from open or reenable them." : "Voorkom dat waarschuwingsvensters worden geopend of schakel ze opnieuw in.",
"Show a warning dialog when changing a file extension." : "Een waarschuwingsvenster tonen bij het wijzigen van een bestandsextensie.",
@@ -454,6 +452,8 @@ OC.L10N.register(
"Submitting fields…" : "Verzenden velden ...",
"Filter filenames…" : "Filter bestandsnamen...",
"Enable the grid view" : "Roosterweergave inschakelen",
+ "Use this address to access your Files via WebDAV" : "Gebruik dit adres om je bestanden via WebDAV te benaderen",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Als je 2FA hebt ingeschakeld moet je een app wachtwoord maken en gebruiken door hier te klikken.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} map","{folderCount} mappen"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} bestand","{fileCount} bestanden"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 bestand en {folderCount} map","1 bestand en {folderCount} mappen"],
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index 987a89398f3..37cbf200cf7 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -198,16 +198,14 @@
"Personal files" : "Persoonlijke bestanden",
"Sort favorites first" : "Sorteer eerst favorieten",
"Sort folders before files" : "Sorteer mappen voor bestanden",
+ "Enable folder tree" : "Mappenboom inschakelen",
"Show hidden files" : "Toon verborgen bestanden",
"Show file type column" : "Toon bestandstypekolom",
"Crop image previews" : "Snij afbeeldingvoorbeelden bij",
- "Enable folder tree" : "Mappenboom inschakelen",
"Additional settings" : "Aanvullende instellingen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopiëren naar het klembord",
- "Use this address to access your Files via WebDAV" : "Gebruik dit adres om je bestanden via WebDAV te benaderen",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Als je 2FA hebt ingeschakeld moet je een app wachtwoord maken en gebruiken door hier te klikken.",
"Warnings" : "Waarschuwingen",
"Prevent warning dialogs from open or reenable them." : "Voorkom dat waarschuwingsvensters worden geopend of schakel ze opnieuw in.",
"Show a warning dialog when changing a file extension." : "Een waarschuwingsvenster tonen bij het wijzigen van een bestandsextensie.",
@@ -452,6 +450,8 @@
"Submitting fields…" : "Verzenden velden ...",
"Filter filenames…" : "Filter bestandsnamen...",
"Enable the grid view" : "Roosterweergave inschakelen",
+ "Use this address to access your Files via WebDAV" : "Gebruik dit adres om je bestanden via WebDAV te benaderen",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Als je 2FA hebt ingeschakeld moet je een app wachtwoord maken en gebruiken door hier te klikken.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} map","{folderCount} mappen"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} bestand","{fileCount} bestanden"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 bestand en {folderCount} map","1 bestand en {folderCount} mappen"],
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index 3da5bfecf09..a4ffa0d0785 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -129,6 +129,7 @@ OC.L10N.register(
"Search globally by filename …" : "Szukaj globalnie według nazwy pliku...",
"Search here by filename …" : "Szukaj tutaj według nazwy pliku...",
"Search scope options" : "Opcje zakresu wyszukiwania",
+ "Filter and search from this location" : "Filtruj i szukaj z tej lokalizacji",
"Search globally" : "Szukaj globalnie",
"{usedQuotaByte} used" : "Wykorzystano {usedQuotaByte}",
"{used} of {quota} used" : "Wykorzystane {used} z {quota}",
@@ -141,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Utwórz nowy katalog",
"This name is already in use." : "Ta nazwa jest już używana.",
"Create" : "Utwórz",
+ "Files starting with a dot are hidden by default" : "Pliki zaczynające się od kropki są domyślnie ukryte",
"Fill template fields" : "Wypełnij pola szablonu",
"Submitting fields …" : "Wysyłanie pól…",
"Submit" : "Wyślij",
@@ -194,23 +196,23 @@ OC.L10N.register(
"Search for files" : "Szukaj plików",
"Clipboard is not available" : "Schowek jest niedostępny",
"WebDAV URL copied to clipboard" : "Adres URL WebDAV skopiowany do schowka",
+ "Default view" : "Widok domyślny",
"All files" : "Wszystkie pliki",
"Personal files" : "Pliki osobiste",
"Sort favorites first" : "Najpierw sortuj ulubione",
"Sort folders before files" : "Sortuj katalogi przed plikami",
+ "Enable folder tree" : "Włącz drzewo katalogów",
"Show hidden files" : "Pokaż ukryte pliki",
"Show file type column" : "Pokaż kolumnę typu pliku",
"Crop image previews" : "Przytnij podglądy obrazów",
- "Enable folder tree" : "Włącz drzewo katalogów",
"Additional settings" : "Ustawienia dodatkowe",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Kopiuj do schowka",
- "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jeśli włączyłeś 2FA, musisz utworzyć i używać nowego hasła do aplikacji, klikając tutaj.",
"Warnings" : "Ostrzeżenie",
"Prevent warning dialogs from open or reenable them." : "Zapobiegaj otwieraniu okien dialogowych z ostrzeżeniami lub włącz je ponownie.",
"Show a warning dialog when changing a file extension." : "Pokaż okno dialogowe z ostrzeżeniem przy zmianie rozszerzenia pliku.",
+ "Show a warning dialog when deleting files." : "Pokaż ostrzeżenie przy usuwaniu plików.",
"Keyboard shortcuts" : "Skróty klawiaturowe",
"Speed up your Files experience with these quick shortcuts." : "Przyspiesz korzystanie z Plików dzięki tym szybkim skrótom.",
"Open the actions menu for a file" : "Otwórz menu akcji dla pliku",
@@ -456,6 +458,8 @@ OC.L10N.register(
"Submitting fields…" : "Przesyłanie pól…",
"Filter filenames…" : "Filtruj nazwy plików…",
"Enable the grid view" : "Włącz widok siatki",
+ "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jeśli włączyłeś 2FA, musisz utworzyć i używać nowego hasła do aplikacji, klikając tutaj.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} katalog","{folderCount} katalogi","{folderCount} katalogów","{folderCount} katalogów"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} plik","{fileCount} pliki","{fileCount} plików","{fileCount} plików"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 plik i {folderCount} katalog","1 plik i {folderCount} katalogi","1 plik i {folderCount} katalogów","1 plik i {folderCount} katalogów"],
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index 317d56d6744..0ee4112f44d 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -127,6 +127,7 @@
"Search globally by filename …" : "Szukaj globalnie według nazwy pliku...",
"Search here by filename …" : "Szukaj tutaj według nazwy pliku...",
"Search scope options" : "Opcje zakresu wyszukiwania",
+ "Filter and search from this location" : "Filtruj i szukaj z tej lokalizacji",
"Search globally" : "Szukaj globalnie",
"{usedQuotaByte} used" : "Wykorzystano {usedQuotaByte}",
"{used} of {quota} used" : "Wykorzystane {used} z {quota}",
@@ -139,6 +140,7 @@
"Create new folder" : "Utwórz nowy katalog",
"This name is already in use." : "Ta nazwa jest już używana.",
"Create" : "Utwórz",
+ "Files starting with a dot are hidden by default" : "Pliki zaczynające się od kropki są domyślnie ukryte",
"Fill template fields" : "Wypełnij pola szablonu",
"Submitting fields …" : "Wysyłanie pól…",
"Submit" : "Wyślij",
@@ -192,23 +194,23 @@
"Search for files" : "Szukaj plików",
"Clipboard is not available" : "Schowek jest niedostępny",
"WebDAV URL copied to clipboard" : "Adres URL WebDAV skopiowany do schowka",
+ "Default view" : "Widok domyślny",
"All files" : "Wszystkie pliki",
"Personal files" : "Pliki osobiste",
"Sort favorites first" : "Najpierw sortuj ulubione",
"Sort folders before files" : "Sortuj katalogi przed plikami",
+ "Enable folder tree" : "Włącz drzewo katalogów",
"Show hidden files" : "Pokaż ukryte pliki",
"Show file type column" : "Pokaż kolumnę typu pliku",
"Crop image previews" : "Przytnij podglądy obrazów",
- "Enable folder tree" : "Włącz drzewo katalogów",
"Additional settings" : "Ustawienia dodatkowe",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Kopiuj do schowka",
- "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jeśli włączyłeś 2FA, musisz utworzyć i używać nowego hasła do aplikacji, klikając tutaj.",
"Warnings" : "Ostrzeżenie",
"Prevent warning dialogs from open or reenable them." : "Zapobiegaj otwieraniu okien dialogowych z ostrzeżeniami lub włącz je ponownie.",
"Show a warning dialog when changing a file extension." : "Pokaż okno dialogowe z ostrzeżeniem przy zmianie rozszerzenia pliku.",
+ "Show a warning dialog when deleting files." : "Pokaż ostrzeżenie przy usuwaniu plików.",
"Keyboard shortcuts" : "Skróty klawiaturowe",
"Speed up your Files experience with these quick shortcuts." : "Przyspiesz korzystanie z Plików dzięki tym szybkim skrótom.",
"Open the actions menu for a file" : "Otwórz menu akcji dla pliku",
@@ -454,6 +456,8 @@
"Submitting fields…" : "Przesyłanie pól…",
"Filter filenames…" : "Filtruj nazwy plików…",
"Enable the grid view" : "Włącz widok siatki",
+ "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jeśli włączyłeś 2FA, musisz utworzyć i używać nowego hasła do aplikacji, klikając tutaj.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} katalog","{folderCount} katalogi","{folderCount} katalogów","{folderCount} katalogów"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} plik","{fileCount} pliki","{fileCount} plików","{fileCount} plików"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 plik i {folderCount} katalog","1 plik i {folderCount} katalogi","1 plik i {folderCount} katalogów","1 plik i {folderCount} katalogów"],
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 5606fb9fd95..ff3488b2e3a 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Criar nova pasta",
"This name is already in use." : "Este nome já está em uso.",
"Create" : "Criar",
+ "Files starting with a dot are hidden by default" : "Os arquivos que começam com um ponto são ocultos por padrão",
"Fill template fields" : "Preencher campos do template",
"Submitting fields …" : "Enviando os campos …",
"Submit" : "Enviar",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Arquivos pessoais",
"Sort favorites first" : "Ordenar favoritos primeiro",
"Sort folders before files" : "Ordenar pastas antes de arquivos",
+ "Enable folder tree" : "Ativar árvore de pastas",
+ "Visual settings" : "Configurações visuais",
"Show hidden files" : "Mostrar arquivos ocultos",
"Show file type column" : "Mostrar coluna de tipo de arquivo",
"Crop image previews" : "Cortar visualizações de imagem",
- "Enable folder tree" : "Ativar árvore de pastas",
+ "Show files extensions" : "Mostrar extensões de arquivos",
"Additional settings" : "Configurações adicionais",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Copiar para área de transferência",
- "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se tiver ativado a 2FA, você deverá criar e usar uma nova senha do aplicativo clicando aqui.",
+ "Use this address to access your Files via WebDAV." : "Use este endereço para acessar seus arquivos via WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "A Autenticação de Dois Fatores está ativada para sua conta e, portanto, você precisa usar uma senha de aplicativo para conectar um cliente WebDAV externo.",
"Warnings" : "Avisos",
"Prevent warning dialogs from open or reenable them." : "Impedir que as caixas de diálogo de aviso sejam abertas ou reativá-las.",
"Show a warning dialog when changing a file extension." : "Mostrar uma caixa de diálogo de aviso ao alterar uma extensão de arquivo.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Modelos",
"New template folder" : "Nova pasta de modelo",
"In folder" : "Na pasta",
+ "Search in all files" : "Pesquisar em todos os arquivos",
"Search in folder: {folder}" : "Pesquisar na pasta: {folder}",
"One of the dropped files could not be processed" : "Um dos arquivos depositados não pôde ser processado",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Seu navegador não oferece suporte à API Filesystem. Os diretórios não serão carregados",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Enviando campos…",
"Filter filenames…" : "Filtrar nomes de arquivos…",
"Enable the grid view" : "Ativar a visualização em grade",
+ "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se tiver ativado a 2FA, você deverá criar e usar uma nova senha do aplicativo clicando aqui.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} pasta","{folderCount} de pastas","{folderCount} pastas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} arquivo","{fileCount} de arquivos","{fileCount} arquivos"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 arquivo e {folderCount} pasta","1 arquivo e {folderCount} de pastas","1 arquivo e {folderCount} pastas"],
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index 424ede47ef1..be4ae3eeddb 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -140,6 +140,7 @@
"Create new folder" : "Criar nova pasta",
"This name is already in use." : "Este nome já está em uso.",
"Create" : "Criar",
+ "Files starting with a dot are hidden by default" : "Os arquivos que começam com um ponto são ocultos por padrão",
"Fill template fields" : "Preencher campos do template",
"Submitting fields …" : "Enviando os campos …",
"Submit" : "Enviar",
@@ -198,16 +199,18 @@
"Personal files" : "Arquivos pessoais",
"Sort favorites first" : "Ordenar favoritos primeiro",
"Sort folders before files" : "Ordenar pastas antes de arquivos",
+ "Enable folder tree" : "Ativar árvore de pastas",
+ "Visual settings" : "Configurações visuais",
"Show hidden files" : "Mostrar arquivos ocultos",
"Show file type column" : "Mostrar coluna de tipo de arquivo",
"Crop image previews" : "Cortar visualizações de imagem",
- "Enable folder tree" : "Ativar árvore de pastas",
+ "Show files extensions" : "Mostrar extensões de arquivos",
"Additional settings" : "Configurações adicionais",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Copiar para área de transferência",
- "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se tiver ativado a 2FA, você deverá criar e usar uma nova senha do aplicativo clicando aqui.",
+ "Use this address to access your Files via WebDAV." : "Use este endereço para acessar seus arquivos via WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "A Autenticação de Dois Fatores está ativada para sua conta e, portanto, você precisa usar uma senha de aplicativo para conectar um cliente WebDAV externo.",
"Warnings" : "Avisos",
"Prevent warning dialogs from open or reenable them." : "Impedir que as caixas de diálogo de aviso sejam abertas ou reativá-las.",
"Show a warning dialog when changing a file extension." : "Mostrar uma caixa de diálogo de aviso ao alterar uma extensão de arquivo.",
@@ -329,6 +332,7 @@
"Templates" : "Modelos",
"New template folder" : "Nova pasta de modelo",
"In folder" : "Na pasta",
+ "Search in all files" : "Pesquisar em todos os arquivos",
"Search in folder: {folder}" : "Pesquisar na pasta: {folder}",
"One of the dropped files could not be processed" : "Um dos arquivos depositados não pôde ser processado",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Seu navegador não oferece suporte à API Filesystem. Os diretórios não serão carregados",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Enviando campos…",
"Filter filenames…" : "Filtrar nomes de arquivos…",
"Enable the grid view" : "Ativar a visualização em grade",
+ "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se tiver ativado a 2FA, você deverá criar e usar uma nova senha do aplicativo clicando aqui.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} pasta","{folderCount} de pastas","{folderCount} pastas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} arquivo","{fileCount} de arquivos","{fileCount} arquivos"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 arquivo e {folderCount} pasta","1 arquivo e {folderCount} de pastas","1 arquivo e {folderCount} pastas"],
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 29655d9be9b..77059059f79 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -133,8 +133,6 @@ OC.L10N.register(
"Additional settings" : "Setări adiționale",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Copiază în clipboard",
- "Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Dacă ați activat 2FA, trebuie să creați și să folosiți o nouă parolă de aplicație, dând click aici.",
"Keyboard shortcuts" : "Scurtături din tastatură",
"Navigation" : "Navigare",
"View" : "Vizualizare",
@@ -273,6 +271,8 @@ OC.L10N.register(
"An error occurred while trying to update the tags" : "A apărut o eroare în timpul actualizării etichetelor",
"Upload (max. %s)" : "Încarcă (max. %s)",
"Enable the grid view" : "Activați organizarea tip grilă",
+ "Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Dacă ați activat 2FA, trebuie să creați și să folosiți o nouă parolă de aplicație, dând click aici.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} foldere","{folderCount} foldere"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fișier","{fileCount} fișiere","{fileCount} fișiere"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fișier și {folderCount} folder","1 fișier și {folderCount} foldere","1 fișier și {folderCount} foldere"],
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index b36afb204f3..d635b50078b 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -131,8 +131,6 @@
"Additional settings" : "Setări adiționale",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "Copiază în clipboard",
- "Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Dacă ați activat 2FA, trebuie să creați și să folosiți o nouă parolă de aplicație, dând click aici.",
"Keyboard shortcuts" : "Scurtături din tastatură",
"Navigation" : "Navigare",
"View" : "Vizualizare",
@@ -271,6 +269,8 @@
"An error occurred while trying to update the tags" : "A apărut o eroare în timpul actualizării etichetelor",
"Upload (max. %s)" : "Încarcă (max. %s)",
"Enable the grid view" : "Activați organizarea tip grilă",
+ "Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Dacă ați activat 2FA, trebuie să creați și să folosiți o nouă parolă de aplicație, dând click aici.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} foldere","{folderCount} foldere"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fișier","{fileCount} fișiere","{fileCount} fișiere"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fișier și {folderCount} folder","1 fișier și {folderCount} foldere","1 fișier și {folderCount} foldere"],
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 33498f0ad41..579ced09c6a 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -200,16 +200,14 @@ OC.L10N.register(
"Personal files" : "Личные файлы",
"Sort favorites first" : "Сначала избранное",
"Sort folders before files" : "Начинать список с папок",
+ "Enable folder tree" : "Включить дерево папок",
"Show hidden files" : "Показывать скрытые файлы",
"Show file type column" : "Показать колонку с типом файла",
"Crop image previews" : "Обрезать пред. просмотр",
- "Enable folder tree" : "Включить дерево папок",
"Additional settings" : "Дополнительные параметры",
"WebDAV" : "WebDAV",
"WebDAV URL" : "Ссылка WebDAV",
"Copy to clipboard" : "Копировать в буфер",
- "Use this address to access your Files via WebDAV" : "Используйте этот адрес для подключения WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Если вы включили двухфакторную аутентификацию, то нажмите здесь, чтобы создать пароль приложения.",
"Warnings" : "Предупреждения",
"Prevent warning dialogs from open or reenable them." : "Предотвратить открытие диалоговых окон с предупреждениями или включить их повторно.",
"Show a warning dialog when changing a file extension." : "Показать диалоговое окно предупреждения при изменении расширения файла.",
@@ -336,11 +334,11 @@ OC.L10N.register(
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Папки не будут загружены, так как используемый браузер не поддерживает работу с файловой системой.",
"No files to upload" : "Не выбрано ни одного файла для передачи на сервер",
"Unable to create the directory {directory}" : "Не удалось создать папку «{directory}»",
- "Some files could not be uploaded" : "Некоторые файлы не могут быть загружены",
+ "Some files could not be uploaded" : "Не удалось загрузить некоторые файлы",
"Files uploaded successfully" : "Файлы успешно обновлены",
- "No files to process" : "Не ни одного файла для обработки",
- "Some files could not be copied" : "Некоторые файлы не могут быть скопированы",
- "Some files could not be moved" : "Некоторые файлы не могут быть перемещены",
+ "No files to process" : "Нет файлов для обработки",
+ "Some files could not be copied" : "Не удалось скопировать некоторые файлы",
+ "Some files could not be moved" : "Не удалось переместить некоторые файлы",
"Files copied successfully" : "Файлы успешно скопированы",
"Files moved successfully" : "Файлы успешно перемещены",
"Conflicts resolution skipped" : "Разрешение конфликтов пропущено",
@@ -459,6 +457,8 @@ OC.L10N.register(
"Submitting fields…" : "Отправка полей…",
"Filter filenames…" : "Фильтровать имена файлов…",
"Enable the grid view" : "Включить режим просмотра сеткой",
+ "Use this address to access your Files via WebDAV" : "Используйте этот адрес для подключения WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Если вы включили двухфакторную аутентификацию, то нажмите здесь, чтобы создать пароль приложения.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки","{folderCount} папок","{folderCount} папки"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файла","{fileCount} файлов","{fileCount} файла"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["один файл и {folderCount} папка","один файл и {folderCount} папки","один файл и {folderCount} папок","один файл и {folderCount} папки"],
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 1331913eeb9..53e64a0a5b6 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -198,16 +198,14 @@
"Personal files" : "Личные файлы",
"Sort favorites first" : "Сначала избранное",
"Sort folders before files" : "Начинать список с папок",
+ "Enable folder tree" : "Включить дерево папок",
"Show hidden files" : "Показывать скрытые файлы",
"Show file type column" : "Показать колонку с типом файла",
"Crop image previews" : "Обрезать пред. просмотр",
- "Enable folder tree" : "Включить дерево папок",
"Additional settings" : "Дополнительные параметры",
"WebDAV" : "WebDAV",
"WebDAV URL" : "Ссылка WebDAV",
"Copy to clipboard" : "Копировать в буфер",
- "Use this address to access your Files via WebDAV" : "Используйте этот адрес для подключения WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Если вы включили двухфакторную аутентификацию, то нажмите здесь, чтобы создать пароль приложения.",
"Warnings" : "Предупреждения",
"Prevent warning dialogs from open or reenable them." : "Предотвратить открытие диалоговых окон с предупреждениями или включить их повторно.",
"Show a warning dialog when changing a file extension." : "Показать диалоговое окно предупреждения при изменении расширения файла.",
@@ -334,11 +332,11 @@
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Папки не будут загружены, так как используемый браузер не поддерживает работу с файловой системой.",
"No files to upload" : "Не выбрано ни одного файла для передачи на сервер",
"Unable to create the directory {directory}" : "Не удалось создать папку «{directory}»",
- "Some files could not be uploaded" : "Некоторые файлы не могут быть загружены",
+ "Some files could not be uploaded" : "Не удалось загрузить некоторые файлы",
"Files uploaded successfully" : "Файлы успешно обновлены",
- "No files to process" : "Не ни одного файла для обработки",
- "Some files could not be copied" : "Некоторые файлы не могут быть скопированы",
- "Some files could not be moved" : "Некоторые файлы не могут быть перемещены",
+ "No files to process" : "Нет файлов для обработки",
+ "Some files could not be copied" : "Не удалось скопировать некоторые файлы",
+ "Some files could not be moved" : "Не удалось переместить некоторые файлы",
"Files copied successfully" : "Файлы успешно скопированы",
"Files moved successfully" : "Файлы успешно перемещены",
"Conflicts resolution skipped" : "Разрешение конфликтов пропущено",
@@ -457,6 +455,8 @@
"Submitting fields…" : "Отправка полей…",
"Filter filenames…" : "Фильтровать имена файлов…",
"Enable the grid view" : "Включить режим просмотра сеткой",
+ "Use this address to access your Files via WebDAV" : "Используйте этот адрес для подключения WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Если вы включили двухфакторную аутентификацию, то нажмите здесь, чтобы создать пароль приложения.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки","{folderCount} папок","{folderCount} папки"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файла","{fileCount} файлов","{fileCount} файла"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["один файл и {folderCount} папка","один файл и {folderCount} папки","один файл и {folderCount} папок","один файл и {folderCount} папки"],
diff --git a/apps/files/l10n/sc.js b/apps/files/l10n/sc.js
index a0033763251..6a7aa87d364 100644
--- a/apps/files/l10n/sc.js
+++ b/apps/files/l10n/sc.js
@@ -126,8 +126,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Còpia in is punta de billete",
- "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si as ativadu 2FA, depes creare e impreare una crae de s'aplicatzione noa incarchende inoghe.",
"Keyboard shortcuts" : "Curtziadòrgios de tecladu",
"Selection" : "Seletzione",
"Navigation" : "Navigatzione",
@@ -282,6 +280,8 @@ OC.L10N.register(
"Upload (max. %s)" : "Càrriga (max. %s)",
"Filter filenames…" : "Filtra nùmenes de archìviu...",
"Enable the grid view" : "Ativa sa visualizatzione de mosàicu",
+ "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si as ativadu 2FA, depes creare e impreare una crae de s'aplicatzione noa incarchende inoghe.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartellas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archìviu","{fileCount} archìvios"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archìviu e {folderCount} cartella","1 archìviu e {folderCount} cartellas"],
diff --git a/apps/files/l10n/sc.json b/apps/files/l10n/sc.json
index 468d8b34fcb..fd2dd3048a1 100644
--- a/apps/files/l10n/sc.json
+++ b/apps/files/l10n/sc.json
@@ -124,8 +124,6 @@
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL WebDAV",
"Copy to clipboard" : "Còpia in is punta de billete",
- "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si as ativadu 2FA, depes creare e impreare una crae de s'aplicatzione noa incarchende inoghe.",
"Keyboard shortcuts" : "Curtziadòrgios de tecladu",
"Selection" : "Seletzione",
"Navigation" : "Navigatzione",
@@ -280,6 +278,8 @@
"Upload (max. %s)" : "Càrriga (max. %s)",
"Filter filenames…" : "Filtra nùmenes de archìviu...",
"Enable the grid view" : "Ativa sa visualizatzione de mosàicu",
+ "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si as ativadu 2FA, depes creare e impreare una crae de s'aplicatzione noa incarchende inoghe.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartellas"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archìviu","{fileCount} archìvios"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archìviu e {folderCount} cartella","1 archìviu e {folderCount} cartellas"],
diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js
index 0483a5b142a..9ff736fc16e 100644
--- a/apps/files/l10n/sk.js
+++ b/apps/files/l10n/sk.js
@@ -185,15 +185,13 @@ OC.L10N.register(
"Personal files" : "Osobné súbory",
"Sort favorites first" : "Zoradiť od najobľúbenejších",
"Sort folders before files" : "Zoradiť adresáre pred súbormi",
+ "Enable folder tree" : "Povoliť adresárový strom",
"Show hidden files" : "Zobraziť skryté súbory",
"Crop image previews" : "Orezať náhľady obrázkov",
- "Enable folder tree" : "Povoliť adresárový strom",
"Additional settings" : "Ďalšie nastavenia",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Skopírovať do schránky",
- "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ak ste povolili 2FA, musíte kliknutím sem vytvoriť a použiť nové heslo pre aplikáciu.",
"Warnings" : "Upozornenia",
"Prevent warning dialogs from open or reenable them." : "Zabrániť otváraniu varovných dialógov alebo ich znova povoliť.",
"Show a warning dialog when changing a file extension." : "Pri zmene prípony súboru zobraziť dialógové okno s upozornením.",
@@ -440,6 +438,8 @@ OC.L10N.register(
"Submitting fields…" : "Položky sa odosielajú ...",
"Filter filenames…" : "Filtrovať názvy súborov...",
"Enable the grid view" : "Povoliť zobrazenie v mriežke",
+ "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ak ste povolili 2FA, musíte kliknutím sem vytvoriť a použiť nové heslo pre aplikáciu.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} priečinok","{folderCount} priečinky","{folderCount} priečinkov","{folderCount} priečinkov"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} súbor","{fileCount} súbory","{fileCount} súborov","{fileCount} súborov"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 súbor a {folderCount} priečinok","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky"],
diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json
index caa39defeaa..6e12bc9b0a4 100644
--- a/apps/files/l10n/sk.json
+++ b/apps/files/l10n/sk.json
@@ -183,15 +183,13 @@
"Personal files" : "Osobné súbory",
"Sort favorites first" : "Zoradiť od najobľúbenejších",
"Sort folders before files" : "Zoradiť adresáre pred súbormi",
+ "Enable folder tree" : "Povoliť adresárový strom",
"Show hidden files" : "Zobraziť skryté súbory",
"Crop image previews" : "Orezať náhľady obrázkov",
- "Enable folder tree" : "Povoliť adresárový strom",
"Additional settings" : "Ďalšie nastavenia",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Skopírovať do schránky",
- "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ak ste povolili 2FA, musíte kliknutím sem vytvoriť a použiť nové heslo pre aplikáciu.",
"Warnings" : "Upozornenia",
"Prevent warning dialogs from open or reenable them." : "Zabrániť otváraniu varovných dialógov alebo ich znova povoliť.",
"Show a warning dialog when changing a file extension." : "Pri zmene prípony súboru zobraziť dialógové okno s upozornením.",
@@ -438,6 +436,8 @@
"Submitting fields…" : "Položky sa odosielajú ...",
"Filter filenames…" : "Filtrovať názvy súborov...",
"Enable the grid view" : "Povoliť zobrazenie v mriežke",
+ "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ak ste povolili 2FA, musíte kliknutím sem vytvoriť a použiť nové heslo pre aplikáciu.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} priečinok","{folderCount} priečinky","{folderCount} priečinkov","{folderCount} priečinkov"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} súbor","{fileCount} súbory","{fileCount} súborov","{fileCount} súborov"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 súbor a {folderCount} priečinok","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky"],
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index e80e779ffb0..b2b83a2bea1 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -186,15 +186,13 @@ OC.L10N.register(
"Personal files" : "Osebne datoteke",
"Sort favorites first" : "Razvrsti najprej priljubljene",
"Sort folders before files" : "Razvrsti mape pred datotekami",
+ "Enable folder tree" : "Omogoči drevesno strukturo map",
"Show hidden files" : "Pokaži skrite datoteke",
"Crop image previews" : "Obreži slike predogleda",
- "Enable folder tree" : "Omogoči drevesno strukturo map",
"Additional settings" : "Dodatne nastavitve",
"WebDAV" : "WebDAV",
"WebDAV URL" : "Naslov URL WebDAV",
"Copy to clipboard" : "Kopiraj v odložišče",
- "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek z uporabo WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Če je omogočen sistem dvostopenjskega overjanja 2FA, je treba ustvariti in uporabiti novo geslo programa s klikom na to mesto.",
"Warnings" : "Opozorila",
"Prevent warning dialogs from open or reenable them." : "Preprečite odpiranje dialogov z opozorili ali jih ponovno omogočite.",
"Show a warning dialog when changing a file extension." : "Prikaži opozorilo ob spreminjanju končnice datoteke.",
@@ -439,6 +437,8 @@ OC.L10N.register(
"Submitting fields…" : "Poteka objavljanje vsebine polj ...",
"Filter filenames…" : "Filtriraj imena datotek ...",
"Enable the grid view" : "Omogoči mrežni pogled",
+ "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek z uporabo WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Če je omogočen sistem dvostopenjskega overjanja 2FA, je treba ustvariti in uporabiti novo geslo programa s klikom na to mesto.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapa","{folderCount} mapi","{folderCount} mape","{folderCount} map"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} datoteka","{fileCount} datoteki","{fileCount} datoteke","{fileCount} datotek"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 datoteka in {folderCount} mapa","1 datoteka in {folderCount} mapi","1 datoteka in {folderCount} mape","1 datoteka in {folderCount} map"],
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 80ee3a57508..7ea477d6ee1 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -184,15 +184,13 @@
"Personal files" : "Osebne datoteke",
"Sort favorites first" : "Razvrsti najprej priljubljene",
"Sort folders before files" : "Razvrsti mape pred datotekami",
+ "Enable folder tree" : "Omogoči drevesno strukturo map",
"Show hidden files" : "Pokaži skrite datoteke",
"Crop image previews" : "Obreži slike predogleda",
- "Enable folder tree" : "Omogoči drevesno strukturo map",
"Additional settings" : "Dodatne nastavitve",
"WebDAV" : "WebDAV",
"WebDAV URL" : "Naslov URL WebDAV",
"Copy to clipboard" : "Kopiraj v odložišče",
- "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek z uporabo WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Če je omogočen sistem dvostopenjskega overjanja 2FA, je treba ustvariti in uporabiti novo geslo programa s klikom na to mesto.",
"Warnings" : "Opozorila",
"Prevent warning dialogs from open or reenable them." : "Preprečite odpiranje dialogov z opozorili ali jih ponovno omogočite.",
"Show a warning dialog when changing a file extension." : "Prikaži opozorilo ob spreminjanju končnice datoteke.",
@@ -437,6 +435,8 @@
"Submitting fields…" : "Poteka objavljanje vsebine polj ...",
"Filter filenames…" : "Filtriraj imena datotek ...",
"Enable the grid view" : "Omogoči mrežni pogled",
+ "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek z uporabo WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Če je omogočen sistem dvostopenjskega overjanja 2FA, je treba ustvariti in uporabiti novo geslo programa s klikom na to mesto.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapa","{folderCount} mapi","{folderCount} mape","{folderCount} map"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} datoteka","{fileCount} datoteki","{fileCount} datoteke","{fileCount} datotek"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 datoteka in {folderCount} mapa","1 datoteka in {folderCount} mapi","1 datoteka in {folderCount} mape","1 datoteka in {folderCount} map"],
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 79cf3a8e266..b507d844521 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -200,16 +200,14 @@ OC.L10N.register(
"Personal files" : "Лични фајлови",
"Sort favorites first" : "Сортирај прво омиљене",
"Sort folders before files" : "Поређај фолдере испред фајлова",
+ "Enable folder tree" : "Укључи стабло фолдера",
"Show hidden files" : "Прикажи скривене фајлове",
"Show file type column" : "Прикажи колону са типом фајла",
"Crop image previews" : "Опсецање прегледа слика",
- "Enable folder tree" : "Укључи стабло фолдера",
"Additional settings" : "Додатне поставке",
"WebDAV" : "ВебДАВ",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Копирај у оставу",
- "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте укључили 2FA, морате кликом овде да крерате нову лозинку апликације.",
"Warnings" : "Упозорења",
"Prevent warning dialogs from open or reenable them." : "Спречава да се дијалози упозорења отворе или да се поново укључе.",
"Show a warning dialog when changing a file extension." : "Прикажи дијалог упозорења када се мења екстензија фајла.",
@@ -459,6 +457,8 @@ OC.L10N.register(
"Submitting fields…" : "Поља се подносе…",
"Filter filenames…" : "Филтрирање имена фајлова…",
"Enable the grid view" : "Укључи приказ мреже",
+ "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте укључили 2FA, морате кликом овде да крерате нову лозинку апликације.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} фолдер","{folderCount} фолдера","{folderCount} фолдера"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} фајл","{fileCount} фајла","{fileCount} фајлова"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 фајл и {folderCount} фолдер","1 фајл и {folderCount} фолдера","1 фајл и {folderCount} фолдера"],
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index 0062c1cd828..f32bbb8a77e 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -198,16 +198,14 @@
"Personal files" : "Лични фајлови",
"Sort favorites first" : "Сортирај прво омиљене",
"Sort folders before files" : "Поређај фолдере испред фајлова",
+ "Enable folder tree" : "Укључи стабло фолдера",
"Show hidden files" : "Прикажи скривене фајлове",
"Show file type column" : "Прикажи колону са типом фајла",
"Crop image previews" : "Опсецање прегледа слика",
- "Enable folder tree" : "Укључи стабло фолдера",
"Additional settings" : "Додатне поставке",
"WebDAV" : "ВебДАВ",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Копирај у оставу",
- "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте укључили 2FA, морате кликом овде да крерате нову лозинку апликације.",
"Warnings" : "Упозорења",
"Prevent warning dialogs from open or reenable them." : "Спречава да се дијалози упозорења отворе или да се поново укључе.",
"Show a warning dialog when changing a file extension." : "Прикажи дијалог упозорења када се мења екстензија фајла.",
@@ -457,6 +455,8 @@
"Submitting fields…" : "Поља се подносе…",
"Filter filenames…" : "Филтрирање имена фајлова…",
"Enable the grid view" : "Укључи приказ мреже",
+ "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте укључили 2FA, морате кликом овде да крерате нову лозинку апликације.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} фолдер","{folderCount} фолдера","{folderCount} фолдера"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} фајл","{fileCount} фајла","{fileCount} фајлова"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 фајл и {folderCount} фолдер","1 фајл и {folderCount} фолдера","1 фајл и {folderCount} фолдера"],
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 99e837cb1cb..e6bdf15abff 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Skapa ny mapp",
"This name is already in use." : "Namnet används redan.",
"Create" : "Skapa",
+ "Files starting with a dot are hidden by default" : "Filer som börjar med en punkt är dolda som standard",
"Fill template fields" : "Fyll mallfält",
"Submitting fields …" : "Skickar fält ...",
"Submit" : "Skicka",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Personliga filer",
"Sort favorites first" : "Sortera favoriter först",
"Sort folders before files" : "Sortera mappar före filer",
+ "Enable folder tree" : "Aktivera mappträd",
+ "Visual settings" : "Visuella inställningar",
"Show hidden files" : "Visa dolda filer",
"Show file type column" : "Visa kolumn för filtyp",
"Crop image previews" : "Beskär förhandsgranskningar för bilder",
- "Enable folder tree" : "Aktivera mappträd",
+ "Show files extensions" : "Visa filändelser",
"Additional settings" : "Övriga inställningar",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopiera till urklipp",
- "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Om du har aktiverat 2FA måste du skapa och använda ett nytt applösenord genom att klicka här.",
+ "Use this address to access your Files via WebDAV." : "Använd denna adress för att komma åt dina filer med WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tvåfaktorsautentisering är aktiverad för ditt konto och därför måste du använda ett applösenord för att ansluta en extern WebDAV-klient.",
"Warnings" : "Varningar",
"Prevent warning dialogs from open or reenable them." : "Förhindra varningsdialoger från att öppnas eller aktivera dem igen.",
"Show a warning dialog when changing a file extension." : "Visa en varningsdialog vid ändring av filändelse.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
+ "Search in all files" : "Sök i alla filer",
"Search in folder: {folder}" : "Sök i mapp: {folder}",
"One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Din webbläsare stöder inte Filesystem API. Mappar kommer inte att laddas upp",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Skickar fält...",
"Filter filenames…" : "Filtrera filnamn...",
"Enable the grid view" : "Aktivera rutnätsvy",
+ "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Om du har aktiverat 2FA måste du skapa och använda ett nytt applösenord genom att klicka här.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapp","{folderCount} mappar"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil och {folderCount} mapp","1 fil och {folderCount} mappar"],
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index 016467d97d6..f839d69bdd5 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -140,6 +140,7 @@
"Create new folder" : "Skapa ny mapp",
"This name is already in use." : "Namnet används redan.",
"Create" : "Skapa",
+ "Files starting with a dot are hidden by default" : "Filer som börjar med en punkt är dolda som standard",
"Fill template fields" : "Fyll mallfält",
"Submitting fields …" : "Skickar fält ...",
"Submit" : "Skicka",
@@ -198,16 +199,18 @@
"Personal files" : "Personliga filer",
"Sort favorites first" : "Sortera favoriter först",
"Sort folders before files" : "Sortera mappar före filer",
+ "Enable folder tree" : "Aktivera mappträd",
+ "Visual settings" : "Visuella inställningar",
"Show hidden files" : "Visa dolda filer",
"Show file type column" : "Visa kolumn för filtyp",
"Crop image previews" : "Beskär förhandsgranskningar för bilder",
- "Enable folder tree" : "Aktivera mappträd",
+ "Show files extensions" : "Visa filändelser",
"Additional settings" : "Övriga inställningar",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "Kopiera till urklipp",
- "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Om du har aktiverat 2FA måste du skapa och använda ett nytt applösenord genom att klicka här.",
+ "Use this address to access your Files via WebDAV." : "Använd denna adress för att komma åt dina filer med WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tvåfaktorsautentisering är aktiverad för ditt konto och därför måste du använda ett applösenord för att ansluta en extern WebDAV-klient.",
"Warnings" : "Varningar",
"Prevent warning dialogs from open or reenable them." : "Förhindra varningsdialoger från att öppnas eller aktivera dem igen.",
"Show a warning dialog when changing a file extension." : "Visa en varningsdialog vid ändring av filändelse.",
@@ -329,6 +332,7 @@
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
+ "Search in all files" : "Sök i alla filer",
"Search in folder: {folder}" : "Sök i mapp: {folder}",
"One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Din webbläsare stöder inte Filesystem API. Mappar kommer inte att laddas upp",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Skickar fält...",
"Filter filenames…" : "Filtrera filnamn...",
"Enable the grid view" : "Aktivera rutnätsvy",
+ "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Om du har aktiverat 2FA måste du skapa och använda ett nytt applösenord genom att klicka här.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapp","{folderCount} mappar"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil och {folderCount} mapp","1 fil och {folderCount} mappar"],
diff --git a/apps/files/l10n/sw.js b/apps/files/l10n/sw.js
index a142df5ddc6..ec90a183ee1 100644
--- a/apps/files/l10n/sw.js
+++ b/apps/files/l10n/sw.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Tengeneza kisanduku kipya",
"This name is already in use." : "Jina hili liko katika matumizi tayari",
"Create" : "Tengeneza",
+ "Files starting with a dot are hidden by default" : "Faili zinazoanza na nukta zimefichwa kwa chaguo-msingi",
"Fill template fields" : "Jaza sehemu za violezo",
"Submitting fields …" : "Inawasilisha violezo",
"Submit" : "Wasilisha",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Faili binafsi",
"Sort favorites first" : "Chagua za upendeleo kwanza",
"Sort folders before files" : "Chagua vikasha kabla ya mafaili",
+ "Enable folder tree" : "Wezesha faili la tatu",
+ "Visual settings" : "Mipangilio ya kuona",
"Show hidden files" : "Onesha mafaili yaliyofichwa",
"Show file type column" : "Onyesha safu wima ya aina ya faili",
"Crop image previews" : "Punguza onyesho la kukagua picha",
- "Enable folder tree" : "Wezesha faili la tatu",
+ "Show files extensions" : "Onyesha viendelezi vya faili",
"Additional settings" : "Mipangilio ya nyongeza",
"WebDAV" : "WavutiDAV",
"WebDAV URL" : "WavutiDAV URL",
"Copy to clipboard" : "Nakili kwenye ubao wa kunakili",
- "Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
+ "Use this address to access your Files via WebDAV." : "Tumia anwani hii kufikia Faili zako kupitia WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Uthibitishaji wa Mambo Mbili umewashwa kwa akaunti yako, na kwa hivyo unahitaji kutumia nenosiri la programu kuunganisha mteja wa nje wa WebDAV.",
"Warnings" : "Maonyo",
"Prevent warning dialogs from open or reenable them." : "Zuia mazungumzo ya onyo yasifunguliwe au uwashe upya.",
"Show a warning dialog when changing a file extension." : "Onyesha mazungumzo ya onyo unapobadilisha kiendelezi cha faili.",
@@ -237,7 +240,7 @@ OC.L10N.register(
"Open the sidebar for a file" : "Fungua utepe kwa faili",
"Show those shortcuts" : "Onesha mikato hiyo",
"You" : "Wewe",
- "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Shared multiple times with different people" : "Imeshirikiwa mara nyingi na watu tofauti",
"Unable to change the favorite state of the file" : "Haiwezi kubadilisha hali ya faili inayopendwa",
"Error while loading the file data" : "Hitilafu wakati wa kupakia data za faili",
"Owner" : "Mmiliki",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Violezo",
"New template folder" : "Kisanduku kipya cha violezo",
"In folder" : "Ndani ya kisanduku",
+ "Search in all files" : "Tafuta katika faili zote",
"Search in folder: {folder}" : "Tafuta katika kisanduku {folder}",
"One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Inawasilisha migunda",
"Filter filenames…" : "Chuja majina ya faili",
"Enable the grid view" : "Wezesha mwonekano wa gridi",
+ "Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"],
diff --git a/apps/files/l10n/sw.json b/apps/files/l10n/sw.json
index 0808e457152..09739074da2 100644
--- a/apps/files/l10n/sw.json
+++ b/apps/files/l10n/sw.json
@@ -140,6 +140,7 @@
"Create new folder" : "Tengeneza kisanduku kipya",
"This name is already in use." : "Jina hili liko katika matumizi tayari",
"Create" : "Tengeneza",
+ "Files starting with a dot are hidden by default" : "Faili zinazoanza na nukta zimefichwa kwa chaguo-msingi",
"Fill template fields" : "Jaza sehemu za violezo",
"Submitting fields …" : "Inawasilisha violezo",
"Submit" : "Wasilisha",
@@ -198,16 +199,18 @@
"Personal files" : "Faili binafsi",
"Sort favorites first" : "Chagua za upendeleo kwanza",
"Sort folders before files" : "Chagua vikasha kabla ya mafaili",
+ "Enable folder tree" : "Wezesha faili la tatu",
+ "Visual settings" : "Mipangilio ya kuona",
"Show hidden files" : "Onesha mafaili yaliyofichwa",
"Show file type column" : "Onyesha safu wima ya aina ya faili",
"Crop image previews" : "Punguza onyesho la kukagua picha",
- "Enable folder tree" : "Wezesha faili la tatu",
+ "Show files extensions" : "Onyesha viendelezi vya faili",
"Additional settings" : "Mipangilio ya nyongeza",
"WebDAV" : "WavutiDAV",
"WebDAV URL" : "WavutiDAV URL",
"Copy to clipboard" : "Nakili kwenye ubao wa kunakili",
- "Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
+ "Use this address to access your Files via WebDAV." : "Tumia anwani hii kufikia Faili zako kupitia WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Uthibitishaji wa Mambo Mbili umewashwa kwa akaunti yako, na kwa hivyo unahitaji kutumia nenosiri la programu kuunganisha mteja wa nje wa WebDAV.",
"Warnings" : "Maonyo",
"Prevent warning dialogs from open or reenable them." : "Zuia mazungumzo ya onyo yasifunguliwe au uwashe upya.",
"Show a warning dialog when changing a file extension." : "Onyesha mazungumzo ya onyo unapobadilisha kiendelezi cha faili.",
@@ -235,7 +238,7 @@
"Open the sidebar for a file" : "Fungua utepe kwa faili",
"Show those shortcuts" : "Onesha mikato hiyo",
"You" : "Wewe",
- "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Shared multiple times with different people" : "Imeshirikiwa mara nyingi na watu tofauti",
"Unable to change the favorite state of the file" : "Haiwezi kubadilisha hali ya faili inayopendwa",
"Error while loading the file data" : "Hitilafu wakati wa kupakia data za faili",
"Owner" : "Mmiliki",
@@ -329,6 +332,7 @@
"Templates" : "Violezo",
"New template folder" : "Kisanduku kipya cha violezo",
"In folder" : "Ndani ya kisanduku",
+ "Search in all files" : "Tafuta katika faili zote",
"Search in folder: {folder}" : "Tafuta katika kisanduku {folder}",
"One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Inawasilisha migunda",
"Filter filenames…" : "Chuja majina ya faili",
"Enable the grid view" : "Wezesha mwonekano wa gridi",
+ "Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"],
diff --git a/apps/files/l10n/th.js b/apps/files/l10n/th.js
index 2dfedd93723..07a3c22fb01 100644
--- a/apps/files/l10n/th.js
+++ b/apps/files/l10n/th.js
@@ -108,7 +108,6 @@ OC.L10N.register(
"Additional settings" : "การตั้งค่าเพิ่มเติม",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "คัดลอกไปยังคลิปบอร์ด",
- "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อเข้าถึงไฟล์ของคุณผ่าน WebDAV",
"Keyboard shortcuts" : "แป้นพิมพ์ลัด",
"View" : "มุมมอง",
"Error while loading the file data" : "ข้อผิดพลาดขณะโหลดข้อมูลไฟล์",
@@ -239,6 +238,7 @@ OC.L10N.register(
"Upload file" : "อัปโหลดไฟล์",
"An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะกำลังพยายามอัปเดตแท็ก",
"Upload (max. %s)" : "อัปโหลด (สูงสุด %s)",
+ "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อเข้าถึงไฟล์ของคุณผ่าน WebDAV",
"Text file" : "ไฟล์ข้อความ",
"New text file.txt" : "ไฟล์ข้อความใหม่.txt"
},
diff --git a/apps/files/l10n/th.json b/apps/files/l10n/th.json
index 91f139413cc..a1e92ecddf6 100644
--- a/apps/files/l10n/th.json
+++ b/apps/files/l10n/th.json
@@ -106,7 +106,6 @@
"Additional settings" : "การตั้งค่าเพิ่มเติม",
"WebDAV" : "WebDAV",
"Copy to clipboard" : "คัดลอกไปยังคลิปบอร์ด",
- "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อเข้าถึงไฟล์ของคุณผ่าน WebDAV",
"Keyboard shortcuts" : "แป้นพิมพ์ลัด",
"View" : "มุมมอง",
"Error while loading the file data" : "ข้อผิดพลาดขณะโหลดข้อมูลไฟล์",
@@ -237,6 +236,7 @@
"Upload file" : "อัปโหลดไฟล์",
"An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะกำลังพยายามอัปเดตแท็ก",
"Upload (max. %s)" : "อัปโหลด (สูงสุด %s)",
+ "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อเข้าถึงไฟล์ของคุณผ่าน WebDAV",
"Text file" : "ไฟล์ข้อความ",
"New text file.txt" : "ไฟล์ข้อความใหม่.txt"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 06851221df4..2080d884150 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -129,6 +129,7 @@ OC.L10N.register(
"Search globally by filename …" : "Dosya adına göre genel ara…",
"Search here by filename …" : "Dosya adına göre burada ara…",
"Search scope options" : "Arama kapsamı seçenekleri",
+ "Filter and search from this location" : "Süz ve bu konumdan ara",
"Search globally" : "Genel arama",
"{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
"{used} of {quota} used" : "{used} / {quota} kullanılmış",
@@ -141,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Klasör ekle",
"This name is already in use." : "Bu ad zaten kullanılıyor.",
"Create" : "Ekle",
+ "Files starting with a dot are hidden by default" : "Bir nokta ile başlayan dosyalar varsayılan olarak gizlidir",
"Fill template fields" : "Kalıp alanlarını doldur",
"Submitting fields …" : "Alanlar gönderiliyor…",
"Submit" : "Gönder",
@@ -194,23 +196,23 @@ OC.L10N.register(
"Search for files" : "Dosya ara",
"Clipboard is not available" : "Pano kullanılamıyor",
"WebDAV URL copied to clipboard" : "WebDAV adresi panoya kopyalandı",
+ "Default view" : "Varsayılan görünüm",
"All files" : "Tüm dosyalar",
"Personal files" : "Kişisel dosyalar",
"Sort favorites first" : "Sık kullanılanlar üstte sıralansın",
"Sort folders before files" : "Klasörler dosyaların üzerinde sıralansın",
+ "Enable folder tree" : "Klasör ağacını aç",
"Show hidden files" : "Gizli dosyaları görüntüle",
"Show file type column" : "Dosya türü sütunu görüntülensin",
"Crop image previews" : "Görsel ön izlemeleri kırpılsın",
- "Enable folder tree" : "Klasör ağacını aç",
"Additional settings" : "Ek ayarlar",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV adresi",
"Copy to clipboard" : "Panoya kopyala",
- "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "İki adımlı doğrulamayı açtıysanız buraya tıklayarak yeni bir uygulama parolası oluşturmalısınız.",
"Warnings" : "Uyarılar",
"Prevent warning dialogs from open or reenable them." : "Uyarı pencerelerinin görüntülenmesini açın ya da kapatın.",
"Show a warning dialog when changing a file extension." : "Dosya uzantısı değiştirilirken uyarı penceresi görüntülensin.",
+ "Show a warning dialog when deleting files." : "Dosyalar silinirken uyarı penceresi görüntülensin.",
"Keyboard shortcuts" : "Kısayol tuşları",
"Speed up your Files experience with these quick shortcuts." : "Şu kısayol tuşlarını kullanarak Dosyalar deneyiminizi hızlandırabilirsiniz.",
"Open the actions menu for a file" : "Bir dosyanın işlemler menüsünü açar",
@@ -456,6 +458,8 @@ OC.L10N.register(
"Submitting fields…" : "Alanlar gönderiliyor…",
"Filter filenames…" : "Dosya adlarını süz…",
"Enable the grid view" : "Tablo görünümü kullanılsın",
+ "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "İki adımlı doğrulamayı açtıysanız buraya tıklayarak yeni bir uygulama parolası oluşturmalısınız.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} klasör","{folderCount} klasör"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} dosya","{fileCount} dosya"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 dosya ve {folderCount} klasör","1 dosya ve {folderCount} klasör"],
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 4114ac386c4..365aa79c914 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -127,6 +127,7 @@
"Search globally by filename …" : "Dosya adına göre genel ara…",
"Search here by filename …" : "Dosya adına göre burada ara…",
"Search scope options" : "Arama kapsamı seçenekleri",
+ "Filter and search from this location" : "Süz ve bu konumdan ara",
"Search globally" : "Genel arama",
"{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
"{used} of {quota} used" : "{used} / {quota} kullanılmış",
@@ -139,6 +140,7 @@
"Create new folder" : "Klasör ekle",
"This name is already in use." : "Bu ad zaten kullanılıyor.",
"Create" : "Ekle",
+ "Files starting with a dot are hidden by default" : "Bir nokta ile başlayan dosyalar varsayılan olarak gizlidir",
"Fill template fields" : "Kalıp alanlarını doldur",
"Submitting fields …" : "Alanlar gönderiliyor…",
"Submit" : "Gönder",
@@ -192,23 +194,23 @@
"Search for files" : "Dosya ara",
"Clipboard is not available" : "Pano kullanılamıyor",
"WebDAV URL copied to clipboard" : "WebDAV adresi panoya kopyalandı",
+ "Default view" : "Varsayılan görünüm",
"All files" : "Tüm dosyalar",
"Personal files" : "Kişisel dosyalar",
"Sort favorites first" : "Sık kullanılanlar üstte sıralansın",
"Sort folders before files" : "Klasörler dosyaların üzerinde sıralansın",
+ "Enable folder tree" : "Klasör ağacını aç",
"Show hidden files" : "Gizli dosyaları görüntüle",
"Show file type column" : "Dosya türü sütunu görüntülensin",
"Crop image previews" : "Görsel ön izlemeleri kırpılsın",
- "Enable folder tree" : "Klasör ağacını aç",
"Additional settings" : "Ek ayarlar",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV adresi",
"Copy to clipboard" : "Panoya kopyala",
- "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "İki adımlı doğrulamayı açtıysanız buraya tıklayarak yeni bir uygulama parolası oluşturmalısınız.",
"Warnings" : "Uyarılar",
"Prevent warning dialogs from open or reenable them." : "Uyarı pencerelerinin görüntülenmesini açın ya da kapatın.",
"Show a warning dialog when changing a file extension." : "Dosya uzantısı değiştirilirken uyarı penceresi görüntülensin.",
+ "Show a warning dialog when deleting files." : "Dosyalar silinirken uyarı penceresi görüntülensin.",
"Keyboard shortcuts" : "Kısayol tuşları",
"Speed up your Files experience with these quick shortcuts." : "Şu kısayol tuşlarını kullanarak Dosyalar deneyiminizi hızlandırabilirsiniz.",
"Open the actions menu for a file" : "Bir dosyanın işlemler menüsünü açar",
@@ -454,6 +456,8 @@
"Submitting fields…" : "Alanlar gönderiliyor…",
"Filter filenames…" : "Dosya adlarını süz…",
"Enable the grid view" : "Tablo görünümü kullanılsın",
+ "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "İki adımlı doğrulamayı açtıysanız buraya tıklayarak yeni bir uygulama parolası oluşturmalısınız.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} klasör","{folderCount} klasör"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} dosya","{fileCount} dosya"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 dosya ve {folderCount} klasör","1 dosya ve {folderCount} klasör"],
diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js
index 20f8dd1f1bc..96bf944eb2b 100644
--- a/apps/files/l10n/ug.js
+++ b/apps/files/l10n/ug.js
@@ -161,15 +161,13 @@ OC.L10N.register(
"Personal files" : "شەخسىي ھۆججەتلەر",
"Sort favorites first" : "ياقتۇرىدىغانلارنى رەتلەڭ",
"Sort folders before files" : "ھۆججەتلەرنى ھۆججەتتىن بۇرۇن تەرتىپلەڭ",
+ "Enable folder tree" : "ھۆججەت قىسقۇچنى قوزغىتىڭ",
"Show hidden files" : "يوشۇرۇن ھۆججەتلەرنى كۆرسەت",
"Crop image previews" : "رەسىمنى ئالدىن كۆرۈش",
- "Enable folder tree" : "ھۆججەت قىسقۇچنى قوزغىتىڭ",
"Additional settings" : "قوشۇمچە تەڭشەكلەر",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "چاپلاش تاختىسىغا كۆچۈرۈڭ",
- "Use this address to access your Files via WebDAV" : "بۇ ئادرېسنى ئىشلىتىپ WebDAV ئارقىلىق ھۆججەتلىرىڭىزنى زىيارەت قىلىڭ",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "ئەگەر سىز 2FA نى قوزغىتىپ قويغان بولسىڭىز ، بۇ يەرنى چېكىپ چوقۇم يېڭى ئەپ پارولى قۇرالايسىز ۋە ئىشلىتىڭ.",
"Keyboard shortcuts" : "كۇنۇپكا تاختىسى تېزلەتمىسى",
"Selection" : "تاللاش",
"Navigation" : "يول باشلاش",
@@ -367,6 +365,8 @@ OC.L10N.register(
"Submitting fields…" : "يول يوللاش…",
"Filter filenames…" : "ھۆججەت نامىنى سۈزۈڭ…",
"Enable the grid view" : "كاتەكچە كۆرۈنۈشىنى قوزغىتىڭ",
+ "Use this address to access your Files via WebDAV" : "بۇ ئادرېسنى ئىشلىتىپ WebDAV ئارقىلىق ھۆججەتلىرىڭىزنى زىيارەت قىلىڭ",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "ئەگەر سىز 2FA نى قوزغىتىپ قويغان بولسىڭىز ، بۇ يەرنى چېكىپ چوقۇم يېڭى ئەپ پارولى قۇرالايسىز ۋە ئىشلىتىڭ.",
"{fileCount} files and {folderCount} folders" : "{fileCount} ھۆججەتلىرى ۋە {folderCount} ھۆججەت قىسقۇچلىرى",
"Personal Files" : "شەخسىي ھۆججەتلەر",
"Text file" : "تېكىست ھۆججەت",
diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json
index 754d1873cff..cfb1b0bd53c 100644
--- a/apps/files/l10n/ug.json
+++ b/apps/files/l10n/ug.json
@@ -159,15 +159,13 @@
"Personal files" : "شەخسىي ھۆججەتلەر",
"Sort favorites first" : "ياقتۇرىدىغانلارنى رەتلەڭ",
"Sort folders before files" : "ھۆججەتلەرنى ھۆججەتتىن بۇرۇن تەرتىپلەڭ",
+ "Enable folder tree" : "ھۆججەت قىسقۇچنى قوزغىتىڭ",
"Show hidden files" : "يوشۇرۇن ھۆججەتلەرنى كۆرسەت",
"Crop image previews" : "رەسىمنى ئالدىن كۆرۈش",
- "Enable folder tree" : "ھۆججەت قىسقۇچنى قوزغىتىڭ",
"Additional settings" : "قوشۇمچە تەڭشەكلەر",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "چاپلاش تاختىسىغا كۆچۈرۈڭ",
- "Use this address to access your Files via WebDAV" : "بۇ ئادرېسنى ئىشلىتىپ WebDAV ئارقىلىق ھۆججەتلىرىڭىزنى زىيارەت قىلىڭ",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "ئەگەر سىز 2FA نى قوزغىتىپ قويغان بولسىڭىز ، بۇ يەرنى چېكىپ چوقۇم يېڭى ئەپ پارولى قۇرالايسىز ۋە ئىشلىتىڭ.",
"Keyboard shortcuts" : "كۇنۇپكا تاختىسى تېزلەتمىسى",
"Selection" : "تاللاش",
"Navigation" : "يول باشلاش",
@@ -365,6 +363,8 @@
"Submitting fields…" : "يول يوللاش…",
"Filter filenames…" : "ھۆججەت نامىنى سۈزۈڭ…",
"Enable the grid view" : "كاتەكچە كۆرۈنۈشىنى قوزغىتىڭ",
+ "Use this address to access your Files via WebDAV" : "بۇ ئادرېسنى ئىشلىتىپ WebDAV ئارقىلىق ھۆججەتلىرىڭىزنى زىيارەت قىلىڭ",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "ئەگەر سىز 2FA نى قوزغىتىپ قويغان بولسىڭىز ، بۇ يەرنى چېكىپ چوقۇم يېڭى ئەپ پارولى قۇرالايسىز ۋە ئىشلىتىڭ.",
"{fileCount} files and {folderCount} folders" : "{fileCount} ھۆججەتلىرى ۋە {folderCount} ھۆججەت قىسقۇچلىرى",
"Personal Files" : "شەخسىي ھۆججەتلەر",
"Text file" : "تېكىست ھۆججەت",
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index 94c32c72b0b..55c24f1616d 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "Створити новий каталог",
"This name is already in use." : "Це ім'я вже використовується",
"Create" : "Створити",
+ "Files starting with a dot are hidden by default" : "Файли, що починаються з крапки, типово приховано",
"Fill template fields" : "Заповнити поля шаблону",
"Submitting fields …" : "Надсилання полів ...",
"Submit" : "Відправити",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "Мої документи",
"Sort favorites first" : "Спочатку показувати із зірочкою",
"Sort folders before files" : "Показувати каталоги перед файлами",
+ "Enable folder tree" : "Увімкнути дерево каталогів",
+ "Visual settings" : "Візуальні налаштування",
"Show hidden files" : "Показувати приховані файли",
"Show file type column" : "Показувати стовпець з типом файлу",
"Crop image previews" : "Попередній перегляд перед кадруванням",
- "Enable folder tree" : "Увімкнути дерево каталогів",
+ "Show files extensions" : "Показати розширення файлів",
"Additional settings" : "Додатково",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL-адреса WebDAV",
"Copy to clipboard" : "Копіювати до буферу обміну",
- "Use this address to access your Files via WebDAV" : "Адреса для доступу до файлів за допомогою протоколу WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Якщо увімкнено двофакторної авторизацію, вам потрібно створити та використовувати окремий пароль на застосунок. Для цього клацніть тут.",
+ "Use this address to access your Files via WebDAV." : "Використовуйте цю адресу для доступу до ваших файлів за допомогою WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Для вашого облікового запису увімкнено двофакторну авторизацію, таким чином вам потрібно буде використовувати пароль для застосунку для з'єднання із зовнішнім клієнтом WebDAV.",
"Warnings" : "Застереження",
"Prevent warning dialogs from open or reenable them." : "Не дозволяти показувати діялоги застережень або повторно увімкнути їх.",
"Show a warning dialog when changing a file extension." : "Показувати діялог застереження у разі зміни розширення файлу.",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "Шаблони",
"New template folder" : "Новий каталог шаблонів",
"In folder" : "У каталозі",
+ "Search in all files" : "Пошук у всіх файлах",
"Search in folder: {folder}" : "Шукати у каталозі: {folder}",
"One of the dropped files could not be processed" : "Один із завантажених файлів не вдалося обробити",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш бравзер не підтримує Filesystem API. Каталоги не буде завантажено",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "Поля для надсилання...",
"Filter filenames…" : "Вибрати файли за ім'ям ...",
"Enable the grid view" : "Увімкнути подання сіткою",
+ "Use this address to access your Files via WebDAV" : "Адреса для доступу до файлів за допомогою протоколу WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Якщо увімкнено двофакторної авторизацію, вам потрібно створити та використовувати окремий пароль на застосунок. Для цього клацніть тут.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} каталог","{folderCount} каталоги","{folderCount} каталогів","{folderCount} каталогів"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файли","{fileCount} файлів","{fileCount} файлів"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл та {folderCount} каталог","1 файл та {folderCount} каталоги","1 файл та {folderCount} каталогів","1 файл та {folderCount} каталогів"],
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index daf35eb80d8..081f07db235 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -140,6 +140,7 @@
"Create new folder" : "Створити новий каталог",
"This name is already in use." : "Це ім'я вже використовується",
"Create" : "Створити",
+ "Files starting with a dot are hidden by default" : "Файли, що починаються з крапки, типово приховано",
"Fill template fields" : "Заповнити поля шаблону",
"Submitting fields …" : "Надсилання полів ...",
"Submit" : "Відправити",
@@ -198,16 +199,18 @@
"Personal files" : "Мої документи",
"Sort favorites first" : "Спочатку показувати із зірочкою",
"Sort folders before files" : "Показувати каталоги перед файлами",
+ "Enable folder tree" : "Увімкнути дерево каталогів",
+ "Visual settings" : "Візуальні налаштування",
"Show hidden files" : "Показувати приховані файли",
"Show file type column" : "Показувати стовпець з типом файлу",
"Crop image previews" : "Попередній перегляд перед кадруванням",
- "Enable folder tree" : "Увімкнути дерево каталогів",
+ "Show files extensions" : "Показати розширення файлів",
"Additional settings" : "Додатково",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL-адреса WebDAV",
"Copy to clipboard" : "Копіювати до буферу обміну",
- "Use this address to access your Files via WebDAV" : "Адреса для доступу до файлів за допомогою протоколу WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Якщо увімкнено двофакторної авторизацію, вам потрібно створити та використовувати окремий пароль на застосунок. Для цього клацніть тут.",
+ "Use this address to access your Files via WebDAV." : "Використовуйте цю адресу для доступу до ваших файлів за допомогою WebDAV.",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Для вашого облікового запису увімкнено двофакторну авторизацію, таким чином вам потрібно буде використовувати пароль для застосунку для з'єднання із зовнішнім клієнтом WebDAV.",
"Warnings" : "Застереження",
"Prevent warning dialogs from open or reenable them." : "Не дозволяти показувати діялоги застережень або повторно увімкнути їх.",
"Show a warning dialog when changing a file extension." : "Показувати діялог застереження у разі зміни розширення файлу.",
@@ -329,6 +332,7 @@
"Templates" : "Шаблони",
"New template folder" : "Новий каталог шаблонів",
"In folder" : "У каталозі",
+ "Search in all files" : "Пошук у всіх файлах",
"Search in folder: {folder}" : "Шукати у каталозі: {folder}",
"One of the dropped files could not be processed" : "Один із завантажених файлів не вдалося обробити",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш бравзер не підтримує Filesystem API. Каталоги не буде завантажено",
@@ -457,6 +461,8 @@
"Submitting fields…" : "Поля для надсилання...",
"Filter filenames…" : "Вибрати файли за ім'ям ...",
"Enable the grid view" : "Увімкнути подання сіткою",
+ "Use this address to access your Files via WebDAV" : "Адреса для доступу до файлів за допомогою протоколу WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Якщо увімкнено двофакторної авторизацію, вам потрібно створити та використовувати окремий пароль на застосунок. Для цього клацніть тут.",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} каталог","{folderCount} каталоги","{folderCount} каталогів","{folderCount} каталогів"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файли","{fileCount} файлів","{fileCount} файлів"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл та {folderCount} каталог","1 файл та {folderCount} каталоги","1 файл та {folderCount} каталогів","1 файл та {folderCount} каталогів"],
diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js
index 875e668a622..41aa3c15960 100644
--- a/apps/files/l10n/vi.js
+++ b/apps/files/l10n/vi.js
@@ -161,13 +161,11 @@ OC.L10N.register(
"All files" : "Tất cả tệp tin",
"Sort favorites first" : "Sắp xếp mục yêu thích trước",
"Sort folders before files" : "Sắp xếp thư mục trước tập tin",
+ "Enable folder tree" : "Bật cây thư mục",
"Show hidden files" : "Hiển thị các tệp ẩn",
"Crop image previews" : "Xén ảnh xem trước",
- "Enable folder tree" : "Bật cây thư mục",
"Additional settings" : "Cài đặt bổ sung",
"Copy to clipboard" : "Sao chép vào bộ nhớ tạm",
- "Use this address to access your Files via WebDAV" : "Sử dụng địa chỉ này để truy cập Tệp của bạn qua WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Nếu bạn đã bật 2FA, bạn phải tạo và sử dụng mật khẩu ứng dụng mới bằng cách nhấp vào đây.",
"Keyboard shortcuts" : "Phím tắt",
"Selection" : "Lựa chọn",
"Navigation" : "Điều hướng",
@@ -366,6 +364,8 @@ OC.L10N.register(
"Upload (max. %s)" : "Tải lên (tối đa %s)",
"Filter filenames…" : "Lọc tên tệp…",
"Enable the grid view" : "Bật chế độ xem lưới",
+ "Use this address to access your Files via WebDAV" : "Sử dụng địa chỉ này để truy cập Tệp của bạn qua WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Nếu bạn đã bật 2FA, bạn phải tạo và sử dụng mật khẩu ứng dụng mới bằng cách nhấp vào đây.",
"_{folderCount} folder_::_{folderCount} folders_" : ["thư mục {folderCount}"],
"_{fileCount} file_::_{fileCount} files_" : ["tệp {fileCount}"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tệp và thư mục {folderCount}"],
diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json
index 85b46410eef..374dd8a087b 100644
--- a/apps/files/l10n/vi.json
+++ b/apps/files/l10n/vi.json
@@ -159,13 +159,11 @@
"All files" : "Tất cả tệp tin",
"Sort favorites first" : "Sắp xếp mục yêu thích trước",
"Sort folders before files" : "Sắp xếp thư mục trước tập tin",
+ "Enable folder tree" : "Bật cây thư mục",
"Show hidden files" : "Hiển thị các tệp ẩn",
"Crop image previews" : "Xén ảnh xem trước",
- "Enable folder tree" : "Bật cây thư mục",
"Additional settings" : "Cài đặt bổ sung",
"Copy to clipboard" : "Sao chép vào bộ nhớ tạm",
- "Use this address to access your Files via WebDAV" : "Sử dụng địa chỉ này để truy cập Tệp của bạn qua WebDAV",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Nếu bạn đã bật 2FA, bạn phải tạo và sử dụng mật khẩu ứng dụng mới bằng cách nhấp vào đây.",
"Keyboard shortcuts" : "Phím tắt",
"Selection" : "Lựa chọn",
"Navigation" : "Điều hướng",
@@ -364,6 +362,8 @@
"Upload (max. %s)" : "Tải lên (tối đa %s)",
"Filter filenames…" : "Lọc tên tệp…",
"Enable the grid view" : "Bật chế độ xem lưới",
+ "Use this address to access your Files via WebDAV" : "Sử dụng địa chỉ này để truy cập Tệp của bạn qua WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Nếu bạn đã bật 2FA, bạn phải tạo và sử dụng mật khẩu ứng dụng mới bằng cách nhấp vào đây.",
"_{folderCount} folder_::_{folderCount} folders_" : ["thư mục {folderCount}"],
"_{fileCount} file_::_{fileCount} files_" : ["tệp {fileCount}"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tệp và thư mục {folderCount}"],
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 76d9628dd35..cb7c93be64f 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -200,16 +200,14 @@ OC.L10N.register(
"Personal files" : "个人文件",
"Sort favorites first" : "收藏排序优先",
"Sort folders before files" : "将文件夹排在文件前面",
+ "Enable folder tree" : "启用文件夹树",
"Show hidden files" : "显示隐藏文件",
"Show file type column" : "显示文件类型列",
"Crop image previews" : "裁剪图片预览",
- "Enable folder tree" : "启用文件夹树",
"Additional settings" : "其他设置",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "复制到剪贴板",
- "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果启用两步验证,您必须点击此处来创建和使用一个新的应用程序密码。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "防止打开或重新启用警告对话框。",
"Show a warning dialog when changing a file extension." : "更改文件扩展名时显示警告对话框。",
@@ -458,6 +456,8 @@ OC.L10N.register(
"Submitting fields…" : "提交字段...",
"Filter filenames…" : "过滤文件名...",
"Enable the grid view" : "启用网格视图",
+ "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果启用两步验证,您必须点击此处来创建和使用一个新的应用程序密码。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 个文件夹"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 个文件"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 个文件夹及 {folderCount} 个文件夹"],
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index a626974fef3..2d9ce91e525 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -198,16 +198,14 @@
"Personal files" : "个人文件",
"Sort favorites first" : "收藏排序优先",
"Sort folders before files" : "将文件夹排在文件前面",
+ "Enable folder tree" : "启用文件夹树",
"Show hidden files" : "显示隐藏文件",
"Show file type column" : "显示文件类型列",
"Crop image previews" : "裁剪图片预览",
- "Enable folder tree" : "启用文件夹树",
"Additional settings" : "其他设置",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "复制到剪贴板",
- "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果启用两步验证,您必须点击此处来创建和使用一个新的应用程序密码。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "防止打开或重新启用警告对话框。",
"Show a warning dialog when changing a file extension." : "更改文件扩展名时显示警告对话框。",
@@ -456,6 +454,8 @@
"Submitting fields…" : "提交字段...",
"Filter filenames…" : "过滤文件名...",
"Enable the grid view" : "启用网格视图",
+ "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果启用两步验证,您必须点击此处来创建和使用一个新的应用程序密码。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 个文件夹"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 个文件"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 个文件夹及 {folderCount} 个文件夹"],
diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js
index 23a3baa7b69..e307fcfc036 100644
--- a/apps/files/l10n/zh_HK.js
+++ b/apps/files/l10n/zh_HK.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "新增資料夾",
"This name is already in use." : "這個用戶名稱已經有人使用了。",
"Create" : "創建",
+ "Files starting with a dot are hidden by default" : "以點開頭的檔案默認為隱藏檔案",
"Fill template fields" : "填寫模板欄位",
"Submitting fields …" : "正在遞交欄位 …",
"Submit" : "遞交",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "個人檔案",
"Sort favorites first" : "先排序最愛",
"Sort folders before files" : "將資料夾在檔案之前排序",
+ "Enable folder tree" : "啟用資料夾樹狀結構",
+ "Visual settings" : "視覺設定",
"Show hidden files" : "顯示隱藏檔案",
"Show file type column" : "顯示檔案類型縱列",
"Crop image previews" : "圖片裁剪預覽",
- "Enable folder tree" : "啟用資料夾樹狀結構",
+ "Show files extensions" : "顯示副檔案名",
"Additional settings" : "其他設定",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "複製到剪貼板",
- "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果您啟用了 2FA,則必須通過單擊此處創建和使用新的應用程式密碼。",
+ "Use this address to access your Files via WebDAV." : "使用此位置透過 WebDAV 存取您的檔案。",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "避免開啟警告對話框或重新啟用它們。",
"Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話框。",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "模板",
"New template folder" : "新範本資料夾",
"In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
"Search in folder: {folder}" : "搜尋資料夾: {folder}",
"One of the dropped files could not be processed" : "無法處理其中一個投放的檔案",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "正在遞交欄位 …",
"Filter filenames…" : "過濾檔案名 ...",
"Enable the grid view" : "啟用網格檢視",
+ "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果您啟用了 2FA,則必須通過單擊此處創建和使用新的應用程式密碼。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json
index 53107ba1c65..9f65a4a71be 100644
--- a/apps/files/l10n/zh_HK.json
+++ b/apps/files/l10n/zh_HK.json
@@ -140,6 +140,7 @@
"Create new folder" : "新增資料夾",
"This name is already in use." : "這個用戶名稱已經有人使用了。",
"Create" : "創建",
+ "Files starting with a dot are hidden by default" : "以點開頭的檔案默認為隱藏檔案",
"Fill template fields" : "填寫模板欄位",
"Submitting fields …" : "正在遞交欄位 …",
"Submit" : "遞交",
@@ -198,16 +199,18 @@
"Personal files" : "個人檔案",
"Sort favorites first" : "先排序最愛",
"Sort folders before files" : "將資料夾在檔案之前排序",
+ "Enable folder tree" : "啟用資料夾樹狀結構",
+ "Visual settings" : "視覺設定",
"Show hidden files" : "顯示隱藏檔案",
"Show file type column" : "顯示檔案類型縱列",
"Crop image previews" : "圖片裁剪預覽",
- "Enable folder tree" : "啟用資料夾樹狀結構",
+ "Show files extensions" : "顯示副檔案名",
"Additional settings" : "其他設定",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "複製到剪貼板",
- "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果您啟用了 2FA,則必須通過單擊此處創建和使用新的應用程式密碼。",
+ "Use this address to access your Files via WebDAV." : "使用此位置透過 WebDAV 存取您的檔案。",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "避免開啟警告對話框或重新啟用它們。",
"Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話框。",
@@ -329,6 +332,7 @@
"Templates" : "模板",
"New template folder" : "新範本資料夾",
"In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
"Search in folder: {folder}" : "搜尋資料夾: {folder}",
"One of the dropped files could not be processed" : "無法處理其中一個投放的檔案",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
@@ -457,6 +461,8 @@
"Submitting fields…" : "正在遞交欄位 …",
"Filter filenames…" : "過濾檔案名 ...",
"Enable the grid view" : "啟用網格檢視",
+ "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果您啟用了 2FA,則必須通過單擊此處創建和使用新的應用程式密碼。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index a948411b474..73232496786 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -142,6 +142,7 @@ OC.L10N.register(
"Create new folder" : "新增資料夾",
"This name is already in use." : "此名稱已使用。",
"Create" : "建立",
+ "Files starting with a dot are hidden by default" : "檔案名稱以點開頭的檔案預設隱藏",
"Fill template fields" : "檔案範本欄位",
"Submitting fields …" : "正在遞交欄位……",
"Submit" : "遞交",
@@ -200,16 +201,18 @@ OC.L10N.register(
"Personal files" : "個人檔案",
"Sort favorites first" : "先排序喜愛",
"Sort folders before files" : "將資料夾排序在檔案前",
+ "Enable folder tree" : "啟用資料夾樹",
+ "Visual settings" : "視覺設定",
"Show hidden files" : "顯示隱藏檔",
"Show file type column" : "顯示檔案類型欄位",
"Crop image previews" : "圖片裁剪預覽",
- "Enable folder tree" : "啟用資料夾樹",
+ "Show files extensions" : "顯示副檔名",
"Additional settings" : "其他設定",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "複製到剪貼簿",
- "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "若您啟用了雙因子認證,您必須點擊此處建立並使用新的應用程式密碼。",
+ "Use this address to access your Files via WebDAV." : "使用此位置透過 WebDAV 存取您的檔案。",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "避免開啟警告對話方塊或重新啟用它們。",
"Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話方塊。",
@@ -331,6 +334,7 @@ OC.L10N.register(
"Templates" : "範本",
"New template folder" : "新範本資料夾",
"In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
"Search in folder: {folder}" : "在資料夾中搜尋:{folder}",
"One of the dropped files could not be processed" : "無法處理其中一個投遞的檔案",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
@@ -459,6 +463,8 @@ OC.L10N.register(
"Submitting fields…" : "正在遞交欄位……",
"Filter filenames…" : "篩選檔案名稱……",
"Enable the grid view" : "啟用格狀檢視",
+ "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "若您啟用了雙因子認證,您必須點擊此處建立並使用新的應用程式密碼。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index e8f3e0c69f7..99264c1ed58 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -140,6 +140,7 @@
"Create new folder" : "新增資料夾",
"This name is already in use." : "此名稱已使用。",
"Create" : "建立",
+ "Files starting with a dot are hidden by default" : "檔案名稱以點開頭的檔案預設隱藏",
"Fill template fields" : "檔案範本欄位",
"Submitting fields …" : "正在遞交欄位……",
"Submit" : "遞交",
@@ -198,16 +199,18 @@
"Personal files" : "個人檔案",
"Sort favorites first" : "先排序喜愛",
"Sort folders before files" : "將資料夾排序在檔案前",
+ "Enable folder tree" : "啟用資料夾樹",
+ "Visual settings" : "視覺設定",
"Show hidden files" : "顯示隱藏檔",
"Show file type column" : "顯示檔案類型欄位",
"Crop image previews" : "圖片裁剪預覽",
- "Enable folder tree" : "啟用資料夾樹",
+ "Show files extensions" : "顯示副檔名",
"Additional settings" : "其他設定",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "複製到剪貼簿",
- "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
- "If you have enabled 2FA, you must create and use a new app password by clicking here." : "若您啟用了雙因子認證,您必須點擊此處建立並使用新的應用程式密碼。",
+ "Use this address to access your Files via WebDAV." : "使用此位置透過 WebDAV 存取您的檔案。",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
"Warnings" : "警告",
"Prevent warning dialogs from open or reenable them." : "避免開啟警告對話方塊或重新啟用它們。",
"Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話方塊。",
@@ -329,6 +332,7 @@
"Templates" : "範本",
"New template folder" : "新範本資料夾",
"In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
"Search in folder: {folder}" : "在資料夾中搜尋:{folder}",
"One of the dropped files could not be processed" : "無法處理其中一個投遞的檔案",
"Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
@@ -457,6 +461,8 @@
"Submitting fields…" : "正在遞交欄位……",
"Filter filenames…" : "篩選檔案名稱……",
"Enable the grid view" : "啟用格狀檢視",
+ "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "若您啟用了雙因子認證,您必須點擊此處建立並使用新的應用程式密碼。",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php
index 50b0ae558aa..ecf21cef313 100644
--- a/apps/files/lib/Controller/ViewController.php
+++ b/apps/files/lib/Controller/ViewController.php
@@ -26,6 +26,7 @@ use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
+use OCP\Authentication\TwoFactorAuth\IRegistry;
use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as ResourcesLoadAdditionalScriptsEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Folder;
@@ -60,6 +61,7 @@ class ViewController extends Controller {
private UserConfig $userConfig,
private ViewConfig $viewConfig,
private FilenameValidator $filenameValidator,
+ private IRegistry $twoFactorRegistry,
) {
parent::__construct($appName, $request);
}
@@ -142,7 +144,8 @@ class ViewController extends Controller {
Util::addInitScript('files', 'init');
Util::addScript('files', 'main');
- $userId = $this->userSession->getUser()->getUID();
+ $user = $this->userSession->getUser();
+ $userId = $user->getUID();
// If the file doesn't exists in the folder and
// exists in only one occurrence, redirect to that file
@@ -195,6 +198,15 @@ class ViewController extends Controller {
$this->initialState->provideInitialState('templates_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : false);
$this->initialState->provideInitialState('templates', $this->templateManager->listCreators());
+ $isTwoFactorEnabled = false;
+ foreach ($this->twoFactorRegistry->getProviderStates($user) as $providerId => $providerState) {
+ if ($providerId !== 'backup_codes' && $providerState === true) {
+ $isTwoFactorEnabled = true;
+ }
+ }
+
+ $this->initialState->provideInitialState('isTwoFactorEnabled', $isTwoFactorEnabled);
+
$response = new TemplateResponse(
Application::APP_ID,
'index',
diff --git a/apps/files/lib/Service/UserConfig.php b/apps/files/lib/Service/UserConfig.php
index 4dae198ee55..dcf30b7796d 100644
--- a/apps/files/lib/Service/UserConfig.php
+++ b/apps/files/lib/Service/UserConfig.php
@@ -50,6 +50,12 @@ class UserConfig {
'allowed' => [true, false],
],
[
+ // Whether to show the files extensions in the files list or not
+ 'key' => 'show_files_extensions',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ [
// Whether to show the hidden files or not in the files list
'key' => 'show_hidden',
'default' => false,
diff --git a/apps/files/src/actions/deleteAction.ts b/apps/files/src/actions/deleteAction.ts
index 63f7fd442c5..3e9e441a63c 100644
--- a/apps/files/src/actions/deleteAction.ts
+++ b/apps/files/src/actions/deleteAction.ts
@@ -10,7 +10,7 @@ import PQueue from 'p-queue'
import CloseSvg from '@mdi/svg/svg/close.svg?raw'
import NetworkOffSvg from '@mdi/svg/svg/network-off.svg?raw'
-import TrashCanSvg from '@mdi/svg/svg/trash-can.svg?raw'
+import TrashCanSvg from '@mdi/svg/svg/trash-can-outline.svg?raw'
import { TRASHBIN_VIEW_ID } from '../../../files_trashbin/src/files_views/trashbinView.ts'
import { askConfirmation, canDisconnectOnly, canUnshareOnly, deleteNode, displayName, shouldAskForConfirmation } from './deleteUtils.ts'
diff --git a/apps/files/src/actions/moveOrCopyAction.ts b/apps/files/src/actions/moveOrCopyAction.ts
index 724b65fa515..af68120bb1b 100644
--- a/apps/files/src/actions/moveOrCopyAction.ts
+++ b/apps/files/src/actions/moveOrCopyAction.ts
@@ -16,8 +16,8 @@ import { openConflictPicker, hasConflict } from '@nextcloud/upload'
import { basename, join } from 'path'
import Vue from 'vue'
-import CopyIconSvg from '@mdi/svg/svg/folder-multiple.svg?raw'
-import FolderMoveSvg from '@mdi/svg/svg/folder-move.svg?raw'
+import CopyIconSvg from '@mdi/svg/svg/folder-multiple-outline.svg?raw'
+import FolderMoveSvg from '@mdi/svg/svg/folder-move-outline.svg?raw'
import { MoveCopyAction, canCopy, canMove, getQueue } from './moveOrCopyActionUtils'
import { getContents } from '../services/Files'
diff --git a/apps/files/src/actions/renameAction.ts b/apps/files/src/actions/renameAction.ts
index d421d18c473..715ecb7563e 100644
--- a/apps/files/src/actions/renameAction.ts
+++ b/apps/files/src/actions/renameAction.ts
@@ -5,7 +5,7 @@
import { emit } from '@nextcloud/event-bus'
import { Permission, type Node, FileAction, View } from '@nextcloud/files'
import { translate as t } from '@nextcloud/l10n'
-import PencilSvg from '@mdi/svg/svg/pencil.svg?raw'
+import PencilSvg from '@mdi/svg/svg/pencil-outline.svg?raw'
import { getPinia } from '../store'
import { useFilesStore } from '../store/files'
import { dirname } from 'path'
diff --git a/apps/files/src/actions/viewInFolderAction.ts b/apps/files/src/actions/viewInFolderAction.ts
index eb145dc409f..b22393c1152 100644
--- a/apps/files/src/actions/viewInFolderAction.ts
+++ b/apps/files/src/actions/viewInFolderAction.ts
@@ -2,10 +2,13 @@
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import { Node, FileType, Permission, View, FileAction } from '@nextcloud/files'
-import { translate as t } from '@nextcloud/l10n'
-import FolderMoveSvg from '@mdi/svg/svg/folder-move.svg?raw'
+import type { Node, View } from '@nextcloud/files'
+
import { isPublicShare } from '@nextcloud/sharing/public'
+import { FileAction, FileType, Permission } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+
+import FolderMoveSvg from '@mdi/svg/svg/folder-move-outline.svg?raw'
export const action = new FileAction({
id: 'view-in-folder',
diff --git a/apps/files/src/components/FileEntry/FileEntryName.vue b/apps/files/src/components/FileEntry/FileEntryName.vue
index 2fec9e5d556..418f9581eb6 100644
--- a/apps/files/src/components/FileEntry/FileEntryName.vue
+++ b/apps/files/src/components/FileEntry/FileEntryName.vue
@@ -30,7 +30,7 @@
<span class="files-list__row-name-text" dir="auto">
<!-- Keep the filename stuck to the extension to avoid whitespace rendering issues-->
<span class="files-list__row-name-" v-text="basename" />
- <span class="files-list__row-name-ext" v-text="extension" />
+ <span v-if="userConfigStore.userConfig.show_files_extensions" class="files-list__row-name-ext" v-text="extension" />
</span>
</component>
</template>
@@ -46,11 +46,12 @@ import { defineComponent, inject } from 'vue'
import NcTextField from '@nextcloud/vue/components/NcTextField'
-import { useNavigation } from '../../composables/useNavigation'
+import { getFilenameValidity } from '../../utils/filenameValidity.ts'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
-import { useRouteParameters } from '../../composables/useRouteParameters.ts'
+import { useNavigation } from '../../composables/useNavigation.ts'
import { useRenamingStore } from '../../store/renaming.ts'
-import { getFilenameValidity } from '../../utils/filenameValidity.ts'
+import { useRouteParameters } from '../../composables/useRouteParameters.ts'
+import { useUserConfigStore } from '../../store/userconfig.ts'
import logger from '../../logger.ts'
export default defineComponent({
@@ -95,6 +96,7 @@ export default defineComponent({
const { directory } = useRouteParameters()
const filesListWidth = useFileListWidth()
const renamingStore = useRenamingStore()
+ const userConfigStore = useUserConfigStore()
const defaultFileAction = inject<FileAction | undefined>('defaultFileAction')
@@ -105,6 +107,7 @@ export default defineComponent({
filesListWidth,
renamingStore,
+ userConfigStore,
}
},
diff --git a/apps/files/src/components/FileEntry/FileEntryPreview.vue b/apps/files/src/components/FileEntry/FileEntryPreview.vue
index 506677b49af..3d0fffe7584 100644
--- a/apps/files/src/components/FileEntry/FileEntryPreview.vue
+++ b/apps/files/src/components/FileEntry/FileEntryPreview.vue
@@ -64,7 +64,7 @@ import FolderIcon from 'vue-material-design-icons/Folder.vue'
import FolderOpenIcon from 'vue-material-design-icons/FolderOpen.vue'
import KeyIcon from 'vue-material-design-icons/Key.vue'
import LinkIcon from 'vue-material-design-icons/Link.vue'
-import NetworkIcon from 'vue-material-design-icons/Network.vue'
+import NetworkIcon from 'vue-material-design-icons/NetworkOutline.vue'
import TagIcon from 'vue-material-design-icons/Tag.vue'
import PlayCircleIcon from 'vue-material-design-icons/PlayCircle.vue'
diff --git a/apps/files/src/components/FileListFilter/FileListFilterModified.vue b/apps/files/src/components/FileListFilter/FileListFilterModified.vue
index f3a968dd56e..3a843b2bc3e 100644
--- a/apps/files/src/components/FileListFilter/FileListFilterModified.vue
+++ b/apps/files/src/components/FileListFilter/FileListFilterModified.vue
@@ -7,7 +7,7 @@
:filter-name="t('files', 'Modified')"
@reset-filter="resetFilter">
<template #icon>
- <NcIconSvgWrapper :path="mdiCalendarRange" />
+ <NcIconSvgWrapper :path="mdiCalendarRangeOutline" />
</template>
<NcActionButton v-for="preset of timePresets"
:key="preset.id"
@@ -25,7 +25,7 @@
import type { PropType } from 'vue'
import type { ITimePreset } from '../../filters/ModifiedFilter.ts'
-import { mdiCalendarRange } from '@mdi/js'
+import { mdiCalendarRangeOutline } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
@@ -50,7 +50,7 @@ export default defineComponent({
setup() {
return {
// icons used in template
- mdiCalendarRange,
+ mdiCalendarRangeOutline,
}
},
diff --git a/apps/files/src/components/FileListFilter/FileListFilterType.vue b/apps/files/src/components/FileListFilter/FileListFilterType.vue
index 53e46b48f8c..d3ad791513f 100644
--- a/apps/files/src/components/FileListFilter/FileListFilterType.vue
+++ b/apps/files/src/components/FileListFilter/FileListFilterType.vue
@@ -8,7 +8,7 @@
:filter-name="t('files', 'Type')"
@reset-filter="resetFilter">
<template #icon>
- <NcIconSvgWrapper :path="mdiFile" />
+ <NcIconSvgWrapper :path="mdiFileOutline" />
</template>
<NcActionButton v-for="fileType of typePresets"
:key="fileType.id"
@@ -27,7 +27,7 @@
import type { PropType } from 'vue'
import type { ITypePreset } from '../../filters/TypeFilter.ts'
-import { mdiFile } from '@mdi/js'
+import { mdiFileOutline } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
@@ -57,7 +57,7 @@ export default defineComponent({
setup() {
return {
- mdiFile,
+ mdiFileOutline,
t,
}
},
diff --git a/apps/files/src/components/FilesListVirtual.vue b/apps/files/src/components/FilesListVirtual.vue
index fbf614caede..47b8ef19b19 100644
--- a/apps/files/src/components/FilesListVirtual.vue
+++ b/apps/files/src/components/FilesListVirtual.vue
@@ -888,7 +888,7 @@ export default defineComponent({
}
.files-list__row-size {
- width: calc(var(--row-height) * 1.5);
+ width: calc(var(--row-height) * 2);
// Right align content/text
justify-content: flex-end;
}
@@ -898,11 +898,11 @@ export default defineComponent({
}
.files-list__row-mime {
- width: calc(var(--row-height) * 2.5);
+ width: calc(var(--row-height) * 3.5);
}
.files-list__row-column-custom {
- width: calc(var(--row-height) * 2);
+ width: calc(var(--row-height) * 2.5);
}
}
}
diff --git a/apps/files/src/components/NavigationQuota.vue b/apps/files/src/components/NavigationQuota.vue
index fd10af1c495..46c8e5c9af4 100644
--- a/apps/files/src/components/NavigationQuota.vue
+++ b/apps/files/src/components/NavigationQuota.vue
@@ -33,7 +33,7 @@ import { subscribe } from '@nextcloud/event-bus'
import { translate } from '@nextcloud/l10n'
import axios from '@nextcloud/axios'
-import ChartPie from 'vue-material-design-icons/ChartPie.vue'
+import ChartPie from 'vue-material-design-icons/ChartPieOutline.vue'
import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
diff --git a/apps/files/src/composables/useNavigation.spec.ts b/apps/files/src/composables/useNavigation.spec.ts
index 569e61825e1..b9eb671a181 100644
--- a/apps/files/src/composables/useNavigation.spec.ts
+++ b/apps/files/src/composables/useNavigation.spec.ts
@@ -29,6 +29,7 @@ describe('Composables: useNavigation', () => {
describe('currentView', () => {
beforeEach(() => {
+ // eslint-disable-next-line import/namespace
navigation = new nextcloudFiles.Navigation()
spy.mockImplementation(() => navigation)
})
@@ -39,6 +40,7 @@ describe('Composables: useNavigation', () => {
})
it('should return already active navigation', async () => {
+ // eslint-disable-next-line import/namespace
const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
navigation.register(view)
navigation.setActive(view)
@@ -48,6 +50,7 @@ describe('Composables: useNavigation', () => {
})
it('should be reactive on updating active navigation', async () => {
+ // eslint-disable-next-line import/namespace
const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
navigation.register(view)
const wrapper = mount(TestComponent)
@@ -63,6 +66,7 @@ describe('Composables: useNavigation', () => {
describe('views', () => {
beforeEach(() => {
+ // eslint-disable-next-line import/namespace
navigation = new nextcloudFiles.Navigation()
spy.mockImplementation(() => navigation)
})
@@ -73,6 +77,7 @@ describe('Composables: useNavigation', () => {
})
it('should return already registered views', () => {
+ // eslint-disable-next-line import/namespace
const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
// register before mount
navigation.register(view)
@@ -82,7 +87,9 @@ describe('Composables: useNavigation', () => {
})
it('should be reactive on registering new views', () => {
+ // eslint-disable-next-line import/namespace
const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+ // eslint-disable-next-line import/namespace
const view2 = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-2', name: 'My View 2', order: 1 })
// register before mount
diff --git a/apps/files/src/newMenu/newFolder.ts b/apps/files/src/newMenu/newFolder.ts
index 9a8badb4eb7..bc82d389e54 100644
--- a/apps/files/src/newMenu/newFolder.ts
+++ b/apps/files/src/newMenu/newFolder.ts
@@ -12,7 +12,7 @@ import { showError, showInfo, showSuccess } from '@nextcloud/dialogs'
import { translate as t } from '@nextcloud/l10n'
import axios from '@nextcloud/axios'
-import FolderPlusSvg from '@mdi/svg/svg/folder-plus.svg?raw'
+import FolderPlusSvg from '@mdi/svg/svg/folder-plus-outline.svg?raw'
import { newNodeName } from '../utils/newNodeDialog'
import logger from '../logger'
@@ -43,8 +43,11 @@ export const entry = {
id: 'newFolder',
displayName: t('files', 'New folder'),
enabled: (context: Folder) => Boolean(context.permissions & Permission.CREATE) && Boolean(context.permissions & Permission.READ),
- iconSvgInline: FolderPlusSvg,
+
+ // Make the svg icon color match the primary element color
+ iconSvgInline: FolderPlusSvg.replace(/viewBox/gi, 'style="color: var(--color-primary-element)" viewBox'),
order: 0,
+
async handler(context: Folder, content: Node[]) {
const name = await newNodeName(t('files', 'New folder'), content)
if (name === null) {
diff --git a/apps/files/src/plugins/search/folderSearch.ts b/apps/files/src/plugins/search/folderSearch.ts
index 626b1daa72b..6aabefbfc9d 100644
--- a/apps/files/src/plugins/search/folderSearch.ts
+++ b/apps/files/src/plugins/search/folderSearch.ts
@@ -36,12 +36,15 @@ function init() {
callback: (nodes: Node[]) => {
logger.info('Folder picked', { folder: nodes[0] })
const folder = nodes[0]
+ const filterUpdateText = (folder.root === '/files/' + folder.basename)
+ ? t('files', 'Search in all files')
+ : t('files', 'Search in folder: {folder}', { folder: folder.basename })
emit('nextcloud:unified-search:add-filter', {
id: 'in-folder',
appId: 'files',
searchFrom: 'files',
payload: folder,
- filterUpdateText: t('files', 'Search in folder: {folder}', { folder: folder.basename }),
+ filterUpdateText,
filterParams: { path: folder.path },
})
},
diff --git a/apps/files/src/store/userconfig.ts b/apps/files/src/store/userconfig.ts
index 54e9a75eb8b..48fe01d5134 100644
--- a/apps/files/src/store/userconfig.ts
+++ b/apps/files/src/store/userconfig.ts
@@ -15,6 +15,7 @@ const initialUserConfig = loadState<UserConfig>('files', 'config', {
crop_image_previews: true,
default_view: 'files',
grid_view: false,
+ show_files_extensions: true,
show_hidden: false,
show_mime_column: true,
sort_favorites_first: true,
diff --git a/apps/files/src/types.ts b/apps/files/src/types.ts
index 6757b7f1f45..0096ecc0fdb 100644
--- a/apps/files/src/types.ts
+++ b/apps/files/src/types.ts
@@ -55,6 +55,7 @@ export interface UserConfig {
crop_image_previews: boolean
default_view: 'files' | 'personal'
grid_view: boolean
+ show_files_extensions: boolean
show_hidden: boolean
show_mime_column: boolean
sort_favorites_first: boolean
diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue
index 15a7f93ddf0..3f993e24958 100644
--- a/apps/files/src/views/FilesList.vue
+++ b/apps/files/src/views/FilesList.vue
@@ -176,12 +176,12 @@ import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
-import AccountPlusIcon from 'vue-material-design-icons/AccountPlus.vue'
+import AccountPlusIcon from 'vue-material-design-icons/AccountPlusOutline.vue'
import IconAlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'
import IconReload from 'vue-material-design-icons/Reload.vue'
import LinkIcon from 'vue-material-design-icons/Link.vue'
import ListViewIcon from 'vue-material-design-icons/FormatListBulletedSquare.vue'
-import ViewGridIcon from 'vue-material-design-icons/ViewGrid.vue'
+import ViewGridIcon from 'vue-material-design-icons/ViewGridOutline.vue'
import { action as sidebarAction } from '../actions/sidebarAction.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
diff --git a/apps/files/src/views/Navigation.vue b/apps/files/src/views/Navigation.vue
index c424a0d74b8..0f3c3647c6e 100644
--- a/apps/files/src/views/Navigation.vue
+++ b/apps/files/src/views/Navigation.vue
@@ -47,7 +47,7 @@ import { getNavigation } from '@nextcloud/files'
import { t, getCanonicalLocale, getLanguage } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
-import IconCog from 'vue-material-design-icons/Cog.vue'
+import IconCog from 'vue-material-design-icons/CogOutline.vue'
import NcAppNavigation from '@nextcloud/vue/components/NcAppNavigation'
import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
import NcAppNavigationList from '@nextcloud/vue/components/NcAppNavigationList'
diff --git a/apps/files/src/views/Settings.vue b/apps/files/src/views/Settings.vue
index 49a348eabc3..0838d308af9 100644
--- a/apps/files/src/views/Settings.vue
+++ b/apps/files/src/views/Settings.vue
@@ -29,7 +29,6 @@
{{ t('files', 'Personal files') }}
</NcCheckboxRadioSwitch>
</fieldset>
-
<NcCheckboxRadioSwitch data-cy-files-settings-setting="sort_favorites_first"
:checked="userConfig.sort_favorites_first"
@update:checked="setConfig('sort_favorites_first', $event)">
@@ -40,6 +39,15 @@
@update:checked="setConfig('sort_folders_first', $event)">
{{ t('files', 'Sort folders before files') }}
</NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="folder_tree"
+ :checked="userConfig.folder_tree"
+ @update:checked="setConfig('folder_tree', $event)">
+ {{ t('files', 'Enable folder tree') }}
+ </NcCheckboxRadioSwitch>
+ </NcAppSettingsSection>
+
+ <!-- Visual settings -->
+ <NcAppSettingsSection id="settings" :name="t('files', 'Visual settings')">
<NcCheckboxRadioSwitch data-cy-files-settings-setting="show_hidden"
:checked="userConfig.show_hidden"
@update:checked="setConfig('show_hidden', $event)">
@@ -55,10 +63,10 @@
@update:checked="setConfig('crop_image_previews', $event)">
{{ t('files', 'Crop image previews') }}
</NcCheckboxRadioSwitch>
- <NcCheckboxRadioSwitch data-cy-files-settings-setting="folder_tree"
- :checked="userConfig.folder_tree"
- @update:checked="setConfig('folder_tree', $event)">
- {{ t('files', 'Enable folder tree') }}
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="show_files_extensions"
+ :checked="userConfig.show_files_extensions"
+ @update:checked="setConfig('show_files_extensions', $event)">
+ {{ t('files', 'Show files extensions') }}
</NcCheckboxRadioSwitch>
</NcAppSettingsSection>
@@ -79,6 +87,7 @@
:success="webdavUrlCopied"
:trailing-button-label="t('files', 'Copy to clipboard')"
:value="webdavUrl"
+ class="webdav-url-input"
readonly="readonly"
type="url"
@focus="$event.target.select()"
@@ -92,13 +101,13 @@
:href="webdavDocs"
target="_blank"
rel="noreferrer noopener">
- {{ t('files', 'Use this address to access your Files via WebDAV') }} ↗
+ {{ t('files', 'Use this address to access your Files via WebDAV.') }} ↗
</a>
</em>
<br>
- <em>
+ <em v-if="isTwoFactorEnabled">
<a class="setting-link" :href="appPasswordUrl">
- {{ t('files', 'If you have enabled 2FA, you must create and use a new app password by clicking here.') }} ↗
+ {{ t('files', 'Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client.') }} ↗
</a>
</em>
</NcAppSettingsSection>
@@ -333,6 +342,7 @@ export default {
appPasswordUrl: generateUrl('/settings/user/security#generate-app-token-section'),
webdavUrlCopied: false,
enableGridView: (loadState('core', 'config', [])['enable_non-accessible_features'] ?? true),
+ isTwoFactorEnabled: (loadState('files', 'isTwoFactorEnabled', false)),
}
},
@@ -429,4 +439,8 @@ export default {
white-space: nowrap;
}
}
+
+.webdav-url-input {
+ margin-block-end: 0.5rem;
+}
</style>
diff --git a/apps/files/src/views/favorites.spec.ts b/apps/files/src/views/favorites.spec.ts
index 64c3df0500a..f793eb9f54c 100644
--- a/apps/files/src/views/favorites.spec.ts
+++ b/apps/files/src/views/favorites.spec.ts
@@ -7,6 +7,7 @@
import type { Folder as CFolder, Navigation } from '@nextcloud/files'
import * as filesUtils from '@nextcloud/files'
+import * as filesDavUtils from '@nextcloud/files/dav'
import { CancelablePromise } from 'cancelable-promise'
import { basename } from 'path'
import { beforeEach, describe, expect, test, vi } from 'vitest'
@@ -16,6 +17,7 @@ import { action } from '../actions/favoriteAction'
import * as favoritesService from '../services/Favorites'
import { registerFavoritesView } from './favorites'
+// eslint-disable-next-line import/namespace
const { Folder, getNavigation } = filesUtils
vi.mock('@nextcloud/axios')
@@ -43,7 +45,7 @@ describe('Favorites view definition', () => {
test('Default empty favorite view', async () => {
vi.spyOn(eventBus, 'subscribe')
- vi.spyOn(filesUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
await registerFavoritesView()
@@ -89,8 +91,14 @@ describe('Favorites view definition', () => {
source: 'http://nextcloud.local/remote.php/dav/files/admin/foo/bar',
owner: 'admin',
}),
+ new Folder({
+ id: 4,
+ root: '/files/admin',
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/foo/bar/yabadaba',
+ owner: 'admin',
+ }),
]
- vi.spyOn(filesUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve(favoriteFolders))
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve(favoriteFolders))
vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
await registerFavoritesView()
@@ -98,9 +106,12 @@ describe('Favorites view definition', () => {
const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
// one main view and 3 children
- expect(Navigation.views.length).toBe(4)
+ expect(Navigation.views.length).toBe(5)
expect(favoritesView).toBeDefined()
- expect(favoriteFoldersViews.length).toBe(3)
+ expect(favoriteFoldersViews.length).toBe(4)
+
+ // Sorted by basename: bar, bar, foo
+ const expectedOrder = [2, 0, 1, 3]
favoriteFolders.forEach((folder, index) => {
const favoriteView = favoriteFoldersViews[index]
@@ -108,7 +119,7 @@ describe('Favorites view definition', () => {
expect(favoriteView?.id).toBeDefined()
expect(favoriteView?.name).toBe(basename(folder.path))
expect(favoriteView?.icon).toMatch(/<svg.+<\/svg>/)
- expect(favoriteView?.order).toBe(index)
+ expect(favoriteView?.order).toBe(expectedOrder[index])
expect(favoriteView?.params).toStrictEqual({
dir: folder.path,
fileid: String(folder.fileid),
@@ -132,7 +143,7 @@ describe('Dynamic update of favorite folders', () => {
test('Add a favorite folder creates a new entry in the navigation', async () => {
vi.spyOn(eventBus, 'emit')
- vi.spyOn(filesUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
await registerFavoritesView()
@@ -160,7 +171,7 @@ describe('Dynamic update of favorite folders', () => {
test('Remove a favorite folder remove the entry from the navigation column', async () => {
vi.spyOn(eventBus, 'emit')
- vi.spyOn(filesUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([
new Folder({
id: 42,
root: '/files/admin',
@@ -211,7 +222,7 @@ describe('Dynamic update of favorite folders', () => {
test('Renaming a favorite folder updates the navigation', async () => {
vi.spyOn(eventBus, 'emit')
- vi.spyOn(filesUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
await registerFavoritesView()
diff --git a/apps/files/src/views/favorites.ts b/apps/files/src/views/favorites.ts
index cadc7704e14..cac776507ef 100644
--- a/apps/files/src/views/favorites.ts
+++ b/apps/files/src/views/favorites.ts
@@ -4,13 +4,15 @@
*/
import type { Folder, Node } from '@nextcloud/files'
+import { FileType, View, getNavigation } from '@nextcloud/files'
+import { getCanonicalLocale, getLanguage, t } from '@nextcloud/l10n'
+import { getFavoriteNodes } from '@nextcloud/files/dav'
import { subscribe } from '@nextcloud/event-bus'
-import { FileType, View, getFavoriteNodes, getNavigation } from '@nextcloud/files'
-import { getLanguage, translate as t } from '@nextcloud/l10n'
-import { client } from '../services/WebdavClient.ts'
+
import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
-import StarSvg from '@mdi/svg/svg/star.svg?raw'
+import StarSvg from '@mdi/svg/svg/star-outline.svg?raw'
+import { client } from '../services/WebdavClient.ts'
import { getContents } from '../services/Favorites'
import { hashCode } from '../utils/hashUtils'
import logger from '../logger'
@@ -118,7 +120,7 @@ export const registerFavoritesView = async () => {
* update the order property of the existing views
*/
const updateAndSortViews = function() {
- favoriteFolders.sort((a, b) => a.path.localeCompare(b.path, getLanguage(), { ignorePunctuation: true }))
+ favoriteFolders.sort((a, b) => a.basename.localeCompare(b.basename, [getLanguage(), getCanonicalLocale()], { ignorePunctuation: true, numeric: true, usage: 'sort' }))
favoriteFolders.forEach((folder, index) => {
const view = favoriteFoldersViews.find((view) => view.id === generateIdFromPath(folder.path))
if (view) {
@@ -176,4 +178,6 @@ export const registerFavoritesView = async () => {
removePathFromFavorites(favoriteFolder.path)
addToFavorites(node)
}
+
+ updateAndSortViews()
}
diff --git a/apps/files/src/views/files.ts b/apps/files/src/views/files.ts
index 95450f0d71a..a94aab0f14b 100644
--- a/apps/files/src/views/files.ts
+++ b/apps/files/src/views/files.ts
@@ -10,7 +10,7 @@ import { getContents } from '../services/Files.ts'
import { useActiveStore } from '../store/active.ts'
import { defaultView } from '../utils/filesViews.ts'
-import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
+import FolderSvg from '@mdi/svg/svg/folder-outline.svg?raw'
export const VIEW_ID = 'files'
diff --git a/apps/files/src/views/folderTree.ts b/apps/files/src/views/folderTree.ts
index c38e4721316..2ce4e501e6f 100644
--- a/apps/files/src/views/folderTree.ts
+++ b/apps/files/src/views/folderTree.ts
@@ -13,7 +13,7 @@ import { isSamePath } from '@nextcloud/paths'
import { loadState } from '@nextcloud/initial-state'
import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
-import FolderMultipleSvg from '@mdi/svg/svg/folder-multiple.svg?raw'
+import FolderMultipleSvg from '@mdi/svg/svg/folder-multiple-outline.svg?raw'
import {
folderTreeId,
@@ -151,7 +151,7 @@ const registerTreeRoot = () => {
Navigation.register(new View({
id: folderTreeId,
- name: t('files', 'All folders'),
+ name: t('files', 'Folder tree'),
caption: t('files', 'List of your files and folders.'),
icon: FolderMultipleSvg,
diff --git a/apps/files/src/views/personal-files.ts b/apps/files/src/views/personal-files.ts
index 36888eb7ee0..241582057d1 100644
--- a/apps/files/src/views/personal-files.ts
+++ b/apps/files/src/views/personal-files.ts
@@ -8,7 +8,7 @@ import { View, getNavigation } from '@nextcloud/files'
import { getContents } from '../services/PersonalFiles.ts'
import { defaultView, hasPersonalFilesView } from '../utils/filesViews.ts'
-import AccountIcon from '@mdi/svg/svg/account.svg?raw'
+import AccountIcon from '@mdi/svg/svg/account-outline.svg?raw'
export const VIEW_ID = 'personal'
diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php
index a9a80fc6f35..01aa955a13e 100644
--- a/apps/files/tests/Controller/ViewControllerTest.php
+++ b/apps/files/tests/Controller/ViewControllerTest.php
@@ -19,6 +19,7 @@ use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
+use OCP\Authentication\TwoFactorAuth\IRegistry;
use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\File;
@@ -63,6 +64,7 @@ class ViewControllerTest extends TestCase {
private UserConfig&MockObject $userConfig;
private ViewConfig&MockObject $viewConfig;
private Router $router;
+ private IRegistry&MockObject $twoFactorRegistry;
private ViewController&MockObject $viewController;
@@ -79,6 +81,7 @@ class ViewControllerTest extends TestCase {
$this->userConfig = $this->createMock(UserConfig::class);
$this->userSession = $this->createMock(IUserSession::class);
$this->viewConfig = $this->createMock(ViewConfig::class);
+ $this->twoFactorRegistry = $this->createMock(IRegistry::class);
$this->user = $this->getMockBuilder(IUser::class)->getMock();
$this->user->expects($this->any())
@@ -138,6 +141,7 @@ class ViewControllerTest extends TestCase {
$this->userConfig,
$this->viewConfig,
$filenameValidator,
+ $this->twoFactorRegistry,
])
->onlyMethods([
'getStorageInfo',
@@ -286,4 +290,24 @@ class ViewControllerTest extends TestCase {
$expected = new RedirectResponse('/index.php/apps/files/trashbin/123?dir=/test.d1462861890/sub');
$this->assertEquals($expected, $this->viewController->index('', '', '123'));
}
+
+ public function testTwoFactorAuthEnabled(): void {
+ $this->twoFactorRegistry->method('getProviderStates')
+ ->willReturn([
+ 'totp' => true,
+ 'backup_codes' => true,
+ ]);
+
+ $invokedCountProvideInitialState = $this->exactly(9);
+ $this->initialState->expects($invokedCountProvideInitialState)
+ ->method('provideInitialState')
+ ->willReturnCallback(function ($key, $data) use ($invokedCountProvideInitialState) {
+ if ($invokedCountProvideInitialState->numberOfInvocations() === 9) {
+ $this->assertEquals('isTwoFactorEnabled', $key);
+ $this->assertTrue($data);
+ }
+ });
+
+ $this->viewController->index('', '', null);
+ }
}
diff --git a/apps/files_external/3rdparty/.gitignore b/apps/files_external/3rdparty/.gitignore
deleted file mode 100644
index d086196dec2..00000000000
--- a/apps/files_external/3rdparty/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
-# SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc.
-# SPDX-License-Identifier: AGPL-3.0-only
-example.php
-.editorconfig
-icewind/smb/tests
-icewind/smb/install_libsmbclient.sh
-icewind/smb/Makefile
-icewind/smb/.travis.yml
-icewind/smb/.scrutinizer.yml
-icewind/smb/example-apache-kerberos.php
-icewind/smb/codecov.yml
-icewind/streams/tests
-icewind/**/example*.php
-.github
-.php_cs*
-psalm.xml
diff --git a/apps/files_external/3rdparty/autoload.php b/apps/files_external/3rdparty/autoload.php
deleted file mode 100644
index d3359ad45d9..00000000000
--- a/apps/files_external/3rdparty/autoload.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-// autoload.php @generated by Composer
-
-if (PHP_VERSION_ID < 50600) {
- if (!headers_sent()) {
- header('HTTP/1.1 500 Internal Server Error');
- }
- $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
- if (!ini_get('display_errors')) {
- if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
- fwrite(STDERR, $err);
- } elseif (!headers_sent()) {
- echo $err;
- }
- }
- trigger_error(
- $err,
- E_USER_ERROR
- );
-}
-
-require_once __DIR__ . '/composer/autoload_real.php';
-
-return ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3::getLoader();
diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json
deleted file mode 100644
index 6af1429aa7f..00000000000
--- a/apps/files_external/3rdparty/composer.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "name": "files_external/3rdparty",
- "description": "3rdparty components for files_external",
- "license": "MIT",
- "config": {
- "vendor-dir": ".",
- "optimize-autoloader": true,
- "classmap-authoritative": true
- },
- "require": {
- "icewind/smb": "3.7.0",
- "icewind/streams": "0.7.7"
- }
-}
diff --git a/apps/files_external/3rdparty/composer.json.license b/apps/files_external/3rdparty/composer.json.license
deleted file mode 100644
index 849ed02ad4b..00000000000
--- a/apps/files_external/3rdparty/composer.json.license
+++ /dev/null
@@ -1,3 +0,0 @@
-SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
-SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
-SPDX-License-Identifier: AGPL-3.0-only \ No newline at end of file
diff --git a/apps/files_external/3rdparty/composer.lock b/apps/files_external/3rdparty/composer.lock
deleted file mode 100644
index b0cf919de9c..00000000000
--- a/apps/files_external/3rdparty/composer.lock
+++ /dev/null
@@ -1,111 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "1b75bb2715ed2dae7d090ae40b9843a2",
- "packages": [
- {
- "name": "icewind/smb",
- "version": "v3.7.0",
- "source": {
- "type": "git",
- "url": "https://github.com/icewind1991/SMB.git",
- "reference": "e6904cbe75f678335092f4861c60c656b1a99e84"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SMB/zipball/e6904cbe75f678335092f4861c60c656b1a99e84",
- "reference": "e6904cbe75f678335092f4861c60c656b1a99e84",
- "shasum": ""
- },
- "require": {
- "icewind/streams": ">=0.7.3",
- "php": ">=7.2"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^2.16",
- "phpstan/phpstan": "^0.12.57",
- "phpunit/phpunit": "^8.5|^9.3.8",
- "psalm/phar": "^4.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Icewind\\SMB\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Robin Appelman",
- "email": "icewind@owncloud.com"
- }
- ],
- "description": "php wrapper for smbclient and libsmbclient-php",
- "support": {
- "issues": "https://github.com/icewind1991/SMB/issues",
- "source": "https://github.com/icewind1991/SMB/tree/v3.7.0"
- },
- "time": "2024-11-11T14:08:34+00:00"
- },
- {
- "name": "icewind/streams",
- "version": "v0.7.7",
- "source": {
- "type": "git",
- "url": "https://github.com/icewind1991/Streams.git",
- "reference": "64200fd7cfcc7f550c3c695c48d8fd8bba97fecb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/icewind1991/Streams/zipball/64200fd7cfcc7f550c3c695c48d8fd8bba97fecb",
- "reference": "64200fd7cfcc7f550c3c695c48d8fd8bba97fecb",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^2",
- "phpstan/phpstan": "^0.12",
- "phpunit/phpunit": "^9"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Icewind\\Streams\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Robin Appelman",
- "email": "icewind@owncloud.com"
- }
- ],
- "description": "A set of generic stream wrappers",
- "support": {
- "issues": "https://github.com/icewind1991/Streams/issues",
- "source": "https://github.com/icewind1991/Streams/tree/v0.7.7"
- },
- "time": "2023-03-16T14:52:25+00:00"
- }
- ],
- "packages-dev": [],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": {},
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": {},
- "platform-dev": {},
- "plugin-api-version": "2.6.0"
-}
diff --git a/apps/files_external/3rdparty/composer.lock.license b/apps/files_external/3rdparty/composer.lock.license
deleted file mode 100644
index 849ed02ad4b..00000000000
--- a/apps/files_external/3rdparty/composer.lock.license
+++ /dev/null
@@ -1,3 +0,0 @@
-SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
-SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
-SPDX-License-Identifier: AGPL-3.0-only \ No newline at end of file
diff --git a/apps/files_external/3rdparty/composer/ClassLoader.php b/apps/files_external/3rdparty/composer/ClassLoader.php
deleted file mode 100644
index 7824d8f7eaf..00000000000
--- a/apps/files_external/3rdparty/composer/ClassLoader.php
+++ /dev/null
@@ -1,579 +0,0 @@
-<?php
-
-/*
- * This file is part of Composer.
- *
- * (c) Nils Adermann <naderman@naderman.de>
- * Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Composer\Autoload;
-
-/**
- * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
- *
- * $loader = new \Composer\Autoload\ClassLoader();
- *
- * // register classes with namespaces
- * $loader->add('Symfony\Component', __DIR__.'/component');
- * $loader->add('Symfony', __DIR__.'/framework');
- *
- * // activate the autoloader
- * $loader->register();
- *
- * // to enable searching the include path (eg. for PEAR packages)
- * $loader->setUseIncludePath(true);
- *
- * In this example, if you try to use a class in the Symfony\Component
- * namespace or one of its children (Symfony\Component\Console for instance),
- * the autoloader will first look for the class under the component/
- * directory, and it will then fallback to the framework/ directory if not
- * found before giving up.
- *
- * This class is loosely based on the Symfony UniversalClassLoader.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- * @author Jordi Boggiano <j.boggiano@seld.be>
- * @see https://www.php-fig.org/psr/psr-0/
- * @see https://www.php-fig.org/psr/psr-4/
- */
-class ClassLoader
-{
- /** @var \Closure(string):void */
- private static $includeFile;
-
- /** @var string|null */
- private $vendorDir;
-
- // PSR-4
- /**
- * @var array<string, array<string, int>>
- */
- private $prefixLengthsPsr4 = array();
- /**
- * @var array<string, list<string>>
- */
- private $prefixDirsPsr4 = array();
- /**
- * @var list<string>
- */
- private $fallbackDirsPsr4 = array();
-
- // PSR-0
- /**
- * 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 list<string>
- */
- private $fallbackDirsPsr0 = array();
-
- /** @var bool */
- private $useIncludePath = false;
-
- /**
- * @var array<string, string>
- */
- private $classMap = array();
-
- /** @var bool */
- private $classMapAuthoritative = false;
-
- /**
- * @var array<string, bool>
- */
- private $missingClasses = array();
-
- /** @var string|null */
- private $apcuPrefix;
-
- /**
- * @var array<string, self>
- */
- private static $registeredLoaders = array();
-
- /**
- * @param string|null $vendorDir
- */
- public function __construct($vendorDir = null)
- {
- $this->vendorDir = $vendorDir;
- self::initializeIncludeClosure();
- }
-
- /**
- * @return array<string, list<string>>
- */
- public function getPrefixes()
- {
- if (!empty($this->prefixesPsr0)) {
- return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
- }
-
- return array();
- }
-
- /**
- * @return array<string, list<string>>
- */
- public function getPrefixesPsr4()
- {
- return $this->prefixDirsPsr4;
- }
-
- /**
- * @return list<string>
- */
- public function getFallbackDirs()
- {
- return $this->fallbackDirsPsr0;
- }
-
- /**
- * @return list<string>
- */
- public function getFallbackDirsPsr4()
- {
- return $this->fallbackDirsPsr4;
- }
-
- /**
- * @return array<string, string> Array of classname => path
- */
- public function getClassMap()
- {
- return $this->classMap;
- }
-
- /**
- * @param array<string, string> $classMap Class to filename map
- *
- * @return void
- */
- public function addClassMap(array $classMap)
- {
- if ($this->classMap) {
- $this->classMap = array_merge($this->classMap, $classMap);
- } else {
- $this->classMap = $classMap;
- }
- }
-
- /**
- * 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 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(
- $paths,
- $this->fallbackDirsPsr0
- );
- } else {
- $this->fallbackDirsPsr0 = array_merge(
- $this->fallbackDirsPsr0,
- $paths
- );
- }
-
- return;
- }
-
- $first = $prefix[0];
- if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = $paths;
-
- return;
- }
- if ($prepend) {
- $this->prefixesPsr0[$first][$prefix] = array_merge(
- $paths,
- $this->prefixesPsr0[$first][$prefix]
- );
- } else {
- $this->prefixesPsr0[$first][$prefix] = array_merge(
- $this->prefixesPsr0[$first][$prefix],
- $paths
- );
- }
- }
-
- /**
- * 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 list<string>|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
- *
- * @throws \InvalidArgumentException
- *
- * @return void
- */
- public function addPsr4($prefix, $paths, $prepend = false)
- {
- $paths = (array) $paths;
- if (!$prefix) {
- // Register directories for the root namespace.
- if ($prepend) {
- $this->fallbackDirsPsr4 = array_merge(
- $paths,
- $this->fallbackDirsPsr4
- );
- } else {
- $this->fallbackDirsPsr4 = array_merge(
- $this->fallbackDirsPsr4,
- $paths
- );
- }
- } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
- // Register directories for a new namespace.
- $length = strlen($prefix);
- if ('\\' !== $prefix[$length - 1]) {
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
- }
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = $paths;
- } elseif ($prepend) {
- // Prepend directories for an already registered namespace.
- $this->prefixDirsPsr4[$prefix] = array_merge(
- $paths,
- $this->prefixDirsPsr4[$prefix]
- );
- } else {
- // Append directories for an already registered namespace.
- $this->prefixDirsPsr4[$prefix] = array_merge(
- $this->prefixDirsPsr4[$prefix],
- $paths
- );
- }
- }
-
- /**
- * 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 list<string>|string $paths The PSR-0 base directories
- *
- * @return void
- */
- public function set($prefix, $paths)
- {
- if (!$prefix) {
- $this->fallbackDirsPsr0 = (array) $paths;
- } else {
- $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
- }
- }
-
- /**
- * 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 list<string>|string $paths The PSR-4 base directories
- *
- * @throws \InvalidArgumentException
- *
- * @return void
- */
- public function setPsr4($prefix, $paths)
- {
- if (!$prefix) {
- $this->fallbackDirsPsr4 = (array) $paths;
- } else {
- $length = strlen($prefix);
- if ('\\' !== $prefix[$length - 1]) {
- 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;
- }
- }
-
- /**
- * Turns on searching the include path for class files.
- *
- * @param bool $useIncludePath
- *
- * @return void
- */
- public function setUseIncludePath($useIncludePath)
- {
- $this->useIncludePath = $useIncludePath;
- }
-
- /**
- * Can be used to check if the autoloader uses the include path to check
- * for classes.
- *
- * @return bool
- */
- public function getUseIncludePath()
- {
- return $this->useIncludePath;
- }
-
- /**
- * Turns off searching the prefix and fallback directories for classes
- * that have not been registered with the class map.
- *
- * @param bool $classMapAuthoritative
- *
- * @return void
- */
- public function setClassMapAuthoritative($classMapAuthoritative)
- {
- $this->classMapAuthoritative = $classMapAuthoritative;
- }
-
- /**
- * Should class lookup fail if not found in the current class map?
- *
- * @return bool
- */
- public function isClassMapAuthoritative()
- {
- return $this->classMapAuthoritative;
- }
-
- /**
- * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
- *
- * @param string|null $apcuPrefix
- *
- * @return void
- */
- public function setApcuPrefix($apcuPrefix)
- {
- $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
- }
-
- /**
- * The APCu prefix in use, or null if APCu caching is not enabled.
- *
- * @return string|null
- */
- public function getApcuPrefix()
- {
- return $this->apcuPrefix;
- }
-
- /**
- * Registers this instance as an autoloader.
- *
- * @param bool $prepend Whether to prepend the autoloader or not
- *
- * @return void
- */
- public function register($prepend = false)
- {
- spl_autoload_register(array($this, 'loadClass'), true, $prepend);
-
- if (null === $this->vendorDir) {
- return;
- }
-
- if ($prepend) {
- self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
- } else {
- unset(self::$registeredLoaders[$this->vendorDir]);
- self::$registeredLoaders[$this->vendorDir] = $this;
- }
- }
-
- /**
- * Unregisters this instance as an autoloader.
- *
- * @return void
- */
- public function unregister()
- {
- spl_autoload_unregister(array($this, 'loadClass'));
-
- if (null !== $this->vendorDir) {
- unset(self::$registeredLoaders[$this->vendorDir]);
- }
- }
-
- /**
- * Loads the given class or interface.
- *
- * @param string $class The name of the class
- * @return true|null True if loaded, null otherwise
- */
- public function loadClass($class)
- {
- if ($file = $this->findFile($class)) {
- $includeFile = self::$includeFile;
- $includeFile($file);
-
- return true;
- }
-
- return null;
- }
-
- /**
- * Finds the path to the file where the class is defined.
- *
- * @param string $class The name of the class
- *
- * @return string|false The path if found, false otherwise
- */
- public function findFile($class)
- {
- // class map lookup
- if (isset($this->classMap[$class])) {
- return $this->classMap[$class];
- }
- if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
- return false;
- }
- if (null !== $this->apcuPrefix) {
- $file = apcu_fetch($this->apcuPrefix.$class, $hit);
- if ($hit) {
- return $file;
- }
- }
-
- $file = $this->findFileWithExtension($class, '.php');
-
- // Search for Hack files if we are running on HHVM
- if (false === $file && defined('HHVM_VERSION')) {
- $file = $this->findFileWithExtension($class, '.hh');
- }
-
- if (null !== $this->apcuPrefix) {
- apcu_add($this->apcuPrefix.$class, $file);
- }
-
- if (false === $file) {
- // Remember that this class does not exist.
- $this->missingClasses[$class] = true;
- }
-
- return $file;
- }
-
- /**
- * Returns the currently registered loaders keyed by their corresponding vendor directories.
- *
- * @return array<string, self>
- */
- public static function getRegisteredLoaders()
- {
- return self::$registeredLoaders;
- }
-
- /**
- * @param string $class
- * @param string $ext
- * @return string|false
- */
- private function findFileWithExtension($class, $ext)
- {
- // PSR-4 lookup
- $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
-
- $first = $class[0];
- if (isset($this->prefixLengthsPsr4[$first])) {
- $subPath = $class;
- while (false !== $lastPos = strrpos($subPath, '\\')) {
- $subPath = substr($subPath, 0, $lastPos);
- $search = $subPath . '\\';
- if (isset($this->prefixDirsPsr4[$search])) {
- $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
- foreach ($this->prefixDirsPsr4[$search] as $dir) {
- if (file_exists($file = $dir . $pathEnd)) {
- return $file;
- }
- }
- }
- }
- }
-
- // PSR-4 fallback dirs
- foreach ($this->fallbackDirsPsr4 as $dir) {
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
- return $file;
- }
- }
-
- // PSR-0 lookup
- if (false !== $pos = strrpos($class, '\\')) {
- // namespaced class name
- $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
- . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
- } else {
- // PEAR-like class name
- $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
- }
-
- if (isset($this->prefixesPsr0[$first])) {
- foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
- if (0 === strpos($class, $prefix)) {
- foreach ($dirs as $dir) {
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
- return $file;
- }
- }
- }
- }
- }
-
- // PSR-0 fallback dirs
- foreach ($this->fallbackDirsPsr0 as $dir) {
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
- return $file;
- }
- }
-
- // PSR-0 include paths.
- if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
- return $file;
- }
-
- return false;
- }
-
- /**
- * @return void
- */
- private static function initializeIncludeClosure()
- {
- if (self::$includeFile !== null) {
- return;
- }
-
- /**
- * Scope isolated include.
- *
- * Prevents access to $this/self from included files.
- *
- * @param string $file
- * @return void
- */
- self::$includeFile = \Closure::bind(static function($file) {
- include $file;
- }, null, null);
- }
-}
diff --git a/apps/files_external/3rdparty/composer/InstalledVersions.php b/apps/files_external/3rdparty/composer/InstalledVersions.php
deleted file mode 100644
index 51e734a774b..00000000000
--- a/apps/files_external/3rdparty/composer/InstalledVersions.php
+++ /dev/null
@@ -1,359 +0,0 @@
-<?php
-
-/*
- * This file is part of Composer.
- *
- * (c) Nils Adermann <naderman@naderman.de>
- * Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Composer;
-
-use Composer\Autoload\ClassLoader;
-use Composer\Semver\VersionParser;
-
-/**
- * This class is copied in every Composer installed project and available to all
- *
- * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
- *
- * To require its presence, you can require `composer-runtime-api ^2.0`
- *
- * @final
- */
-class InstalledVersions
-{
- /**
- * @var mixed[]|null
- * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
- */
- private static $installed;
-
- /**
- * @var bool|null
- */
- private static $canGetVendors;
-
- /**
- * @var array[]
- * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
- */
- private static $installedByVendor = array();
-
- /**
- * Returns a list of all package names which are present, either by being installed, replaced or provided
- *
- * @return string[]
- * @psalm-return list<string>
- */
- public static function getInstalledPackages()
- {
- $packages = array();
- foreach (self::getInstalled() as $installed) {
- $packages[] = array_keys($installed['versions']);
- }
-
- if (1 === \count($packages)) {
- return $packages[0];
- }
-
- return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
- }
-
- /**
- * Returns a list of all package names with a specific type e.g. 'library'
- *
- * @param string $type
- * @return string[]
- * @psalm-return list<string>
- */
- public static function getInstalledPackagesByType($type)
- {
- $packagesByType = array();
-
- foreach (self::getInstalled() as $installed) {
- foreach ($installed['versions'] as $name => $package) {
- if (isset($package['type']) && $package['type'] === $type) {
- $packagesByType[] = $name;
- }
- }
- }
-
- return $packagesByType;
- }
-
- /**
- * Checks whether the given package is installed
- *
- * This also returns true if the package name is provided or replaced by another package
- *
- * @param string $packageName
- * @param bool $includeDevRequirements
- * @return bool
- */
- public static function isInstalled($packageName, $includeDevRequirements = true)
- {
- foreach (self::getInstalled() as $installed) {
- if (isset($installed['versions'][$packageName])) {
- return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
- }
- }
-
- return false;
- }
-
- /**
- * Checks whether the given package satisfies a version constraint
- *
- * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
- *
- * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
- *
- * @param VersionParser $parser Install composer/semver to have access to this class and functionality
- * @param string $packageName
- * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
- * @return bool
- */
- public static function satisfies(VersionParser $parser, $packageName, $constraint)
- {
- $constraint = $parser->parseConstraints((string) $constraint);
- $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
-
- return $provided->matches($constraint);
- }
-
- /**
- * Returns a version constraint representing all the range(s) which are installed for a given package
- *
- * It is easier to use this via isInstalled() with the $constraint argument if you need to check
- * whether a given version of a package is installed, and not just whether it exists
- *
- * @param string $packageName
- * @return string Version constraint usable with composer/semver
- */
- public static function getVersionRanges($packageName)
- {
- foreach (self::getInstalled() as $installed) {
- if (!isset($installed['versions'][$packageName])) {
- continue;
- }
-
- $ranges = array();
- if (isset($installed['versions'][$packageName]['pretty_version'])) {
- $ranges[] = $installed['versions'][$packageName]['pretty_version'];
- }
- if (array_key_exists('aliases', $installed['versions'][$packageName])) {
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
- }
- if (array_key_exists('replaced', $installed['versions'][$packageName])) {
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
- }
- if (array_key_exists('provided', $installed['versions'][$packageName])) {
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
- }
-
- return implode(' || ', $ranges);
- }
-
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
- }
-
- /**
- * @param string $packageName
- * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
- */
- public static function getVersion($packageName)
- {
- foreach (self::getInstalled() as $installed) {
- if (!isset($installed['versions'][$packageName])) {
- continue;
- }
-
- if (!isset($installed['versions'][$packageName]['version'])) {
- return null;
- }
-
- return $installed['versions'][$packageName]['version'];
- }
-
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
- }
-
- /**
- * @param string $packageName
- * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
- */
- public static function getPrettyVersion($packageName)
- {
- foreach (self::getInstalled() as $installed) {
- if (!isset($installed['versions'][$packageName])) {
- continue;
- }
-
- if (!isset($installed['versions'][$packageName]['pretty_version'])) {
- return null;
- }
-
- return $installed['versions'][$packageName]['pretty_version'];
- }
-
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
- }
-
- /**
- * @param string $packageName
- * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
- */
- public static function getReference($packageName)
- {
- foreach (self::getInstalled() as $installed) {
- if (!isset($installed['versions'][$packageName])) {
- continue;
- }
-
- if (!isset($installed['versions'][$packageName]['reference'])) {
- return null;
- }
-
- return $installed['versions'][$packageName]['reference'];
- }
-
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
- }
-
- /**
- * @param string $packageName
- * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
- */
- public static function getInstallPath($packageName)
- {
- foreach (self::getInstalled() as $installed) {
- if (!isset($installed['versions'][$packageName])) {
- continue;
- }
-
- return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
- }
-
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
- }
-
- /**
- * @return array
- * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
- */
- public static function getRootPackage()
- {
- $installed = self::getInstalled();
-
- return $installed[0]['root'];
- }
-
- /**
- * Returns the raw installed.php data for custom implementations
- *
- * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
- * @return array[]
- * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
- */
- public static function getRawData()
- {
- @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
-
- if (null === self::$installed) {
- // only require the installed.php file if this file is loaded from its dumped location,
- // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
- if (substr(__DIR__, -8, 1) !== 'C') {
- self::$installed = include __DIR__ . '/installed.php';
- } else {
- self::$installed = array();
- }
- }
-
- return self::$installed;
- }
-
- /**
- * Returns the raw data of all installed.php which are currently loaded for custom implementations
- *
- * @return array[]
- * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
- */
- public static function getAllRawData()
- {
- return self::getInstalled();
- }
-
- /**
- * Lets you reload the static array from another file
- *
- * This is only useful for complex integrations in which a project needs to use
- * this class but then also needs to execute another project's autoloader in process,
- * and wants to ensure both projects have access to their version of installed.php.
- *
- * A typical case would be PHPUnit, where it would need to make sure it reads all
- * the data it needs from this class, then call reload() with
- * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
- * the project in which it runs can then also use this class safely, without
- * interference between PHPUnit's dependencies and the project's dependencies.
- *
- * @param array[] $data A vendor/composer/installed.php data set
- * @return void
- *
- * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
- */
- public static function reload($data)
- {
- self::$installed = $data;
- self::$installedByVendor = array();
- }
-
- /**
- * @return array[]
- * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
- */
- private static function getInstalled()
- {
- if (null === self::$canGetVendors) {
- self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
- }
-
- $installed = array();
-
- if (self::$canGetVendors) {
- foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
- if (isset(self::$installedByVendor[$vendorDir])) {
- $installed[] = self::$installedByVendor[$vendorDir];
- } elseif (is_file($vendorDir.'/composer/installed.php')) {
- /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
- $required = require $vendorDir.'/composer/installed.php';
- $installed[] = self::$installedByVendor[$vendorDir] = $required;
- if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
- self::$installed = $installed[count($installed) - 1];
- }
- }
- }
- }
-
- if (null === self::$installed) {
- // only require the installed.php file if this file is loaded from its dumped location,
- // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
- if (substr(__DIR__, -8, 1) !== 'C') {
- /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
- $required = require __DIR__ . '/installed.php';
- self::$installed = $required;
- } else {
- self::$installed = array();
- }
- }
-
- if (self::$installed !== array()) {
- $installed[] = self::$installed;
- }
-
- return $installed;
- }
-}
diff --git a/apps/files_external/3rdparty/composer/LICENSE b/apps/files_external/3rdparty/composer/LICENSE
deleted file mode 100644
index 62ecfd8d004..00000000000
--- a/apps/files_external/3rdparty/composer/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) Nils Adermann, Jordi Boggiano
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/apps/files_external/3rdparty/composer/autoload_classmap.php b/apps/files_external/3rdparty/composer/autoload_classmap.php
deleted file mode 100644
index 8ed82b84023..00000000000
--- a/apps/files_external/3rdparty/composer/autoload_classmap.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-
-// autoload_classmap.php @generated by Composer
-
-$vendorDir = dirname(__DIR__);
-$baseDir = $vendorDir;
-
-return array(
- 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
- 'Icewind\\SMB\\ACL' => $vendorDir . '/icewind/smb/src/ACL.php',
- 'Icewind\\SMB\\AbstractServer' => $vendorDir . '/icewind/smb/src/AbstractServer.php',
- 'Icewind\\SMB\\AbstractShare' => $vendorDir . '/icewind/smb/src/AbstractShare.php',
- 'Icewind\\SMB\\AnonymousAuth' => $vendorDir . '/icewind/smb/src/AnonymousAuth.php',
- 'Icewind\\SMB\\BasicAuth' => $vendorDir . '/icewind/smb/src/BasicAuth.php',
- 'Icewind\\SMB\\Change' => $vendorDir . '/icewind/smb/src/Change.php',
- 'Icewind\\SMB\\Exception\\AccessDeniedException' => $vendorDir . '/icewind/smb/src/Exception/AccessDeniedException.php',
- 'Icewind\\SMB\\Exception\\AlreadyExistsException' => $vendorDir . '/icewind/smb/src/Exception/AlreadyExistsException.php',
- 'Icewind\\SMB\\Exception\\AuthenticationException' => $vendorDir . '/icewind/smb/src/Exception/AuthenticationException.php',
- 'Icewind\\SMB\\Exception\\ConnectException' => $vendorDir . '/icewind/smb/src/Exception/ConnectException.php',
- 'Icewind\\SMB\\Exception\\ConnectionAbortedException' => $vendorDir . '/icewind/smb/src/Exception/ConnectionAbortedException.php',
- 'Icewind\\SMB\\Exception\\ConnectionException' => $vendorDir . '/icewind/smb/src/Exception/ConnectionException.php',
- 'Icewind\\SMB\\Exception\\ConnectionRefusedException' => $vendorDir . '/icewind/smb/src/Exception/ConnectionRefusedException.php',
- 'Icewind\\SMB\\Exception\\ConnectionResetException' => $vendorDir . '/icewind/smb/src/Exception/ConnectionResetException.php',
- 'Icewind\\SMB\\Exception\\DependencyException' => $vendorDir . '/icewind/smb/src/Exception/DependencyException.php',
- 'Icewind\\SMB\\Exception\\Exception' => $vendorDir . '/icewind/smb/src/Exception/Exception.php',
- 'Icewind\\SMB\\Exception\\FileInUseException' => $vendorDir . '/icewind/smb/src/Exception/FileInUseException.php',
- 'Icewind\\SMB\\Exception\\ForbiddenException' => $vendorDir . '/icewind/smb/src/Exception/ForbiddenException.php',
- 'Icewind\\SMB\\Exception\\HostDownException' => $vendorDir . '/icewind/smb/src/Exception/HostDownException.php',
- 'Icewind\\SMB\\Exception\\InvalidArgumentException' => $vendorDir . '/icewind/smb/src/Exception/InvalidArgumentException.php',
- 'Icewind\\SMB\\Exception\\InvalidHostException' => $vendorDir . '/icewind/smb/src/Exception/InvalidHostException.php',
- 'Icewind\\SMB\\Exception\\InvalidParameterException' => $vendorDir . '/icewind/smb/src/Exception/InvalidParameterException.php',
- 'Icewind\\SMB\\Exception\\InvalidPathException' => $vendorDir . '/icewind/smb/src/Exception/InvalidPathException.php',
- 'Icewind\\SMB\\Exception\\InvalidRequestException' => $vendorDir . '/icewind/smb/src/Exception/InvalidRequestException.php',
- 'Icewind\\SMB\\Exception\\InvalidResourceException' => $vendorDir . '/icewind/smb/src/Exception/InvalidResourceException.php',
- 'Icewind\\SMB\\Exception\\InvalidTicket' => $vendorDir . '/icewind/smb/src/Exception/InvalidTicket.php',
- 'Icewind\\SMB\\Exception\\InvalidTypeException' => $vendorDir . '/icewind/smb/src/Exception/InvalidTypeException.php',
- 'Icewind\\SMB\\Exception\\NoLoginServerException' => $vendorDir . '/icewind/smb/src/Exception/NoLoginServerException.php',
- 'Icewind\\SMB\\Exception\\NoRouteToHostException' => $vendorDir . '/icewind/smb/src/Exception/NoRouteToHostException.php',
- 'Icewind\\SMB\\Exception\\NotEmptyException' => $vendorDir . '/icewind/smb/src/Exception/NotEmptyException.php',
- 'Icewind\\SMB\\Exception\\NotFoundException' => $vendorDir . '/icewind/smb/src/Exception/NotFoundException.php',
- 'Icewind\\SMB\\Exception\\OutOfSpaceException' => $vendorDir . '/icewind/smb/src/Exception/OutOfSpaceException.php',
- 'Icewind\\SMB\\Exception\\RevisionMismatchException' => $vendorDir . '/icewind/smb/src/Exception/RevisionMismatchException.php',
- 'Icewind\\SMB\\Exception\\TimedOutException' => $vendorDir . '/icewind/smb/src/Exception/TimedOutException.php',
- 'Icewind\\SMB\\IAuth' => $vendorDir . '/icewind/smb/src/IAuth.php',
- 'Icewind\\SMB\\IFileInfo' => $vendorDir . '/icewind/smb/src/IFileInfo.php',
- 'Icewind\\SMB\\INotifyHandler' => $vendorDir . '/icewind/smb/src/INotifyHandler.php',
- 'Icewind\\SMB\\IOptions' => $vendorDir . '/icewind/smb/src/IOptions.php',
- 'Icewind\\SMB\\IServer' => $vendorDir . '/icewind/smb/src/IServer.php',
- 'Icewind\\SMB\\IShare' => $vendorDir . '/icewind/smb/src/IShare.php',
- 'Icewind\\SMB\\ISystem' => $vendorDir . '/icewind/smb/src/ISystem.php',
- 'Icewind\\SMB\\ITimeZoneProvider' => $vendorDir . '/icewind/smb/src/ITimeZoneProvider.php',
- 'Icewind\\SMB\\KerberosApacheAuth' => $vendorDir . '/icewind/smb/src/KerberosApacheAuth.php',
- 'Icewind\\SMB\\KerberosAuth' => $vendorDir . '/icewind/smb/src/KerberosAuth.php',
- 'Icewind\\SMB\\KerberosTicket' => $vendorDir . '/icewind/smb/src/KerberosTicket.php',
- 'Icewind\\SMB\\Native\\NativeFileInfo' => $vendorDir . '/icewind/smb/src/Native/NativeFileInfo.php',
- 'Icewind\\SMB\\Native\\NativeReadStream' => $vendorDir . '/icewind/smb/src/Native/NativeReadStream.php',
- 'Icewind\\SMB\\Native\\NativeServer' => $vendorDir . '/icewind/smb/src/Native/NativeServer.php',
- 'Icewind\\SMB\\Native\\NativeShare' => $vendorDir . '/icewind/smb/src/Native/NativeShare.php',
- 'Icewind\\SMB\\Native\\NativeState' => $vendorDir . '/icewind/smb/src/Native/NativeState.php',
- 'Icewind\\SMB\\Native\\NativeStream' => $vendorDir . '/icewind/smb/src/Native/NativeStream.php',
- 'Icewind\\SMB\\Native\\NativeWriteStream' => $vendorDir . '/icewind/smb/src/Native/NativeWriteStream.php',
- 'Icewind\\SMB\\Options' => $vendorDir . '/icewind/smb/src/Options.php',
- 'Icewind\\SMB\\ServerFactory' => $vendorDir . '/icewind/smb/src/ServerFactory.php',
- 'Icewind\\SMB\\StringBuffer' => $vendorDir . '/icewind/smb/src/StringBuffer.php',
- 'Icewind\\SMB\\System' => $vendorDir . '/icewind/smb/src/System.php',
- 'Icewind\\SMB\\TimeZoneProvider' => $vendorDir . '/icewind/smb/src/TimeZoneProvider.php',
- 'Icewind\\SMB\\Wrapped\\Connection' => $vendorDir . '/icewind/smb/src/Wrapped/Connection.php',
- 'Icewind\\SMB\\Wrapped\\ErrorCodes' => $vendorDir . '/icewind/smb/src/Wrapped/ErrorCodes.php',
- 'Icewind\\SMB\\Wrapped\\FileInfo' => $vendorDir . '/icewind/smb/src/Wrapped/FileInfo.php',
- 'Icewind\\SMB\\Wrapped\\NotifyHandler' => $vendorDir . '/icewind/smb/src/Wrapped/NotifyHandler.php',
- 'Icewind\\SMB\\Wrapped\\Parser' => $vendorDir . '/icewind/smb/src/Wrapped/Parser.php',
- 'Icewind\\SMB\\Wrapped\\RawConnection' => $vendorDir . '/icewind/smb/src/Wrapped/RawConnection.php',
- 'Icewind\\SMB\\Wrapped\\Server' => $vendorDir . '/icewind/smb/src/Wrapped/Server.php',
- 'Icewind\\SMB\\Wrapped\\Share' => $vendorDir . '/icewind/smb/src/Wrapped/Share.php',
- 'Icewind\\Streams\\CallbackWrapper' => $vendorDir . '/icewind/streams/src/CallbackWrapper.php',
- 'Icewind\\Streams\\CountWrapper' => $vendorDir . '/icewind/streams/src/CountWrapper.php',
- 'Icewind\\Streams\\Directory' => $vendorDir . '/icewind/streams/src/Directory.php',
- 'Icewind\\Streams\\DirectoryFilter' => $vendorDir . '/icewind/streams/src/DirectoryFilter.php',
- 'Icewind\\Streams\\DirectoryWrapper' => $vendorDir . '/icewind/streams/src/DirectoryWrapper.php',
- 'Icewind\\Streams\\File' => $vendorDir . '/icewind/streams/src/File.php',
- 'Icewind\\Streams\\HashWrapper' => $vendorDir . '/icewind/streams/src/HashWrapper.php',
- 'Icewind\\Streams\\IteratorDirectory' => $vendorDir . '/icewind/streams/src/IteratorDirectory.php',
- 'Icewind\\Streams\\NullWrapper' => $vendorDir . '/icewind/streams/src/NullWrapper.php',
- 'Icewind\\Streams\\Path' => $vendorDir . '/icewind/streams/src/Path.php',
- 'Icewind\\Streams\\PathWrapper' => $vendorDir . '/icewind/streams/src/PathWrapper.php',
- 'Icewind\\Streams\\ReadHashWrapper' => $vendorDir . '/icewind/streams/src/ReadHashWrapper.php',
- 'Icewind\\Streams\\RetryWrapper' => $vendorDir . '/icewind/streams/src/RetryWrapper.php',
- 'Icewind\\Streams\\SeekableWrapper' => $vendorDir . '/icewind/streams/src/SeekableWrapper.php',
- 'Icewind\\Streams\\Url' => $vendorDir . '/icewind/streams/src/Url.php',
- 'Icewind\\Streams\\UrlCallback' => $vendorDir . '/icewind/streams/src/UrlCallback.php',
- 'Icewind\\Streams\\Wrapper' => $vendorDir . '/icewind/streams/src/Wrapper.php',
- 'Icewind\\Streams\\WrapperHandler' => $vendorDir . '/icewind/streams/src/WrapperHandler.php',
- 'Icewind\\Streams\\WriteHashWrapper' => $vendorDir . '/icewind/streams/src/WriteHashWrapper.php',
-);
diff --git a/apps/files_external/3rdparty/composer/autoload_namespaces.php b/apps/files_external/3rdparty/composer/autoload_namespaces.php
deleted file mode 100644
index 3f5c9296251..00000000000
--- a/apps/files_external/3rdparty/composer/autoload_namespaces.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-// autoload_namespaces.php @generated by Composer
-
-$vendorDir = dirname(__DIR__);
-$baseDir = $vendorDir;
-
-return array(
-);
diff --git a/apps/files_external/3rdparty/composer/autoload_psr4.php b/apps/files_external/3rdparty/composer/autoload_psr4.php
deleted file mode 100644
index 6bed531ed31..00000000000
--- a/apps/files_external/3rdparty/composer/autoload_psr4.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-// autoload_psr4.php @generated by Composer
-
-$vendorDir = dirname(__DIR__);
-$baseDir = $vendorDir;
-
-return array(
- 'Icewind\\Streams\\' => array($vendorDir . '/icewind/streams/src'),
- 'Icewind\\SMB\\' => array($vendorDir . '/icewind/smb/src'),
-);
diff --git a/apps/files_external/3rdparty/composer/autoload_real.php b/apps/files_external/3rdparty/composer/autoload_real.php
deleted file mode 100644
index 5eccc1e1cf6..00000000000
--- a/apps/files_external/3rdparty/composer/autoload_real.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-// autoload_real.php @generated by Composer
-
-class ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3
-{
- private static $loader;
-
- public static function loadClassLoader($class)
- {
- if ('Composer\Autoload\ClassLoader' === $class) {
- require __DIR__ . '/ClassLoader.php';
- }
- }
-
- /**
- * @return \Composer\Autoload\ClassLoader
- */
- public static function getLoader()
- {
- if (null !== self::$loader) {
- return self::$loader;
- }
-
- require __DIR__ . '/platform_check.php';
-
- spl_autoload_register(array('ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3', 'loadClassLoader'), true, true);
- self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
- spl_autoload_unregister(array('ComposerAutoloaderInit98fe9b281934250b3a93f69a5ce843b3', 'loadClassLoader'));
-
- require __DIR__ . '/autoload_static.php';
- call_user_func(\Composer\Autoload\ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::getInitializer($loader));
-
- $loader->setClassMapAuthoritative(true);
- $loader->register(true);
-
- return $loader;
- }
-}
diff --git a/apps/files_external/3rdparty/composer/autoload_static.php b/apps/files_external/3rdparty/composer/autoload_static.php
deleted file mode 100644
index 75b1adaa17b..00000000000
--- a/apps/files_external/3rdparty/composer/autoload_static.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-// autoload_static.php @generated by Composer
-
-namespace Composer\Autoload;
-
-class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3
-{
- public static $prefixLengthsPsr4 = array (
- 'I' =>
- array (
- 'Icewind\\Streams\\' => 16,
- 'Icewind\\SMB\\' => 12,
- ),
- );
-
- public static $prefixDirsPsr4 = array (
- 'Icewind\\Streams\\' =>
- array (
- 0 => __DIR__ . '/..' . '/icewind/streams/src',
- ),
- 'Icewind\\SMB\\' =>
- array (
- 0 => __DIR__ . '/..' . '/icewind/smb/src',
- ),
- );
-
- public static $classMap = array (
- 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
- 'Icewind\\SMB\\ACL' => __DIR__ . '/..' . '/icewind/smb/src/ACL.php',
- 'Icewind\\SMB\\AbstractServer' => __DIR__ . '/..' . '/icewind/smb/src/AbstractServer.php',
- 'Icewind\\SMB\\AbstractShare' => __DIR__ . '/..' . '/icewind/smb/src/AbstractShare.php',
- 'Icewind\\SMB\\AnonymousAuth' => __DIR__ . '/..' . '/icewind/smb/src/AnonymousAuth.php',
- 'Icewind\\SMB\\BasicAuth' => __DIR__ . '/..' . '/icewind/smb/src/BasicAuth.php',
- 'Icewind\\SMB\\Change' => __DIR__ . '/..' . '/icewind/smb/src/Change.php',
- 'Icewind\\SMB\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AccessDeniedException.php',
- 'Icewind\\SMB\\Exception\\AlreadyExistsException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AlreadyExistsException.php',
- 'Icewind\\SMB\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AuthenticationException.php',
- 'Icewind\\SMB\\Exception\\ConnectException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectException.php',
- 'Icewind\\SMB\\Exception\\ConnectionAbortedException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectionAbortedException.php',
- 'Icewind\\SMB\\Exception\\ConnectionException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectionException.php',
- 'Icewind\\SMB\\Exception\\ConnectionRefusedException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectionRefusedException.php',
- 'Icewind\\SMB\\Exception\\ConnectionResetException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectionResetException.php',
- 'Icewind\\SMB\\Exception\\DependencyException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/DependencyException.php',
- 'Icewind\\SMB\\Exception\\Exception' => __DIR__ . '/..' . '/icewind/smb/src/Exception/Exception.php',
- 'Icewind\\SMB\\Exception\\FileInUseException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/FileInUseException.php',
- 'Icewind\\SMB\\Exception\\ForbiddenException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ForbiddenException.php',
- 'Icewind\\SMB\\Exception\\HostDownException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/HostDownException.php',
- 'Icewind\\SMB\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidArgumentException.php',
- 'Icewind\\SMB\\Exception\\InvalidHostException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidHostException.php',
- 'Icewind\\SMB\\Exception\\InvalidParameterException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidParameterException.php',
- 'Icewind\\SMB\\Exception\\InvalidPathException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidPathException.php',
- 'Icewind\\SMB\\Exception\\InvalidRequestException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidRequestException.php',
- 'Icewind\\SMB\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidResourceException.php',
- 'Icewind\\SMB\\Exception\\InvalidTicket' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidTicket.php',
- 'Icewind\\SMB\\Exception\\InvalidTypeException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidTypeException.php',
- 'Icewind\\SMB\\Exception\\NoLoginServerException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NoLoginServerException.php',
- 'Icewind\\SMB\\Exception\\NoRouteToHostException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NoRouteToHostException.php',
- 'Icewind\\SMB\\Exception\\NotEmptyException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NotEmptyException.php',
- 'Icewind\\SMB\\Exception\\NotFoundException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NotFoundException.php',
- 'Icewind\\SMB\\Exception\\OutOfSpaceException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/OutOfSpaceException.php',
- 'Icewind\\SMB\\Exception\\RevisionMismatchException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/RevisionMismatchException.php',
- 'Icewind\\SMB\\Exception\\TimedOutException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/TimedOutException.php',
- 'Icewind\\SMB\\IAuth' => __DIR__ . '/..' . '/icewind/smb/src/IAuth.php',
- 'Icewind\\SMB\\IFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/IFileInfo.php',
- 'Icewind\\SMB\\INotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/INotifyHandler.php',
- 'Icewind\\SMB\\IOptions' => __DIR__ . '/..' . '/icewind/smb/src/IOptions.php',
- 'Icewind\\SMB\\IServer' => __DIR__ . '/..' . '/icewind/smb/src/IServer.php',
- 'Icewind\\SMB\\IShare' => __DIR__ . '/..' . '/icewind/smb/src/IShare.php',
- 'Icewind\\SMB\\ISystem' => __DIR__ . '/..' . '/icewind/smb/src/ISystem.php',
- 'Icewind\\SMB\\ITimeZoneProvider' => __DIR__ . '/..' . '/icewind/smb/src/ITimeZoneProvider.php',
- 'Icewind\\SMB\\KerberosApacheAuth' => __DIR__ . '/..' . '/icewind/smb/src/KerberosApacheAuth.php',
- 'Icewind\\SMB\\KerberosAuth' => __DIR__ . '/..' . '/icewind/smb/src/KerberosAuth.php',
- 'Icewind\\SMB\\KerberosTicket' => __DIR__ . '/..' . '/icewind/smb/src/KerberosTicket.php',
- 'Icewind\\SMB\\Native\\NativeFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeFileInfo.php',
- 'Icewind\\SMB\\Native\\NativeReadStream' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeReadStream.php',
- 'Icewind\\SMB\\Native\\NativeServer' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeServer.php',
- 'Icewind\\SMB\\Native\\NativeShare' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeShare.php',
- 'Icewind\\SMB\\Native\\NativeState' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeState.php',
- 'Icewind\\SMB\\Native\\NativeStream' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeStream.php',
- 'Icewind\\SMB\\Native\\NativeWriteStream' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeWriteStream.php',
- 'Icewind\\SMB\\Options' => __DIR__ . '/..' . '/icewind/smb/src/Options.php',
- 'Icewind\\SMB\\ServerFactory' => __DIR__ . '/..' . '/icewind/smb/src/ServerFactory.php',
- 'Icewind\\SMB\\StringBuffer' => __DIR__ . '/..' . '/icewind/smb/src/StringBuffer.php',
- 'Icewind\\SMB\\System' => __DIR__ . '/..' . '/icewind/smb/src/System.php',
- 'Icewind\\SMB\\TimeZoneProvider' => __DIR__ . '/..' . '/icewind/smb/src/TimeZoneProvider.php',
- 'Icewind\\SMB\\Wrapped\\Connection' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Connection.php',
- 'Icewind\\SMB\\Wrapped\\ErrorCodes' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/ErrorCodes.php',
- 'Icewind\\SMB\\Wrapped\\FileInfo' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/FileInfo.php',
- 'Icewind\\SMB\\Wrapped\\NotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/NotifyHandler.php',
- 'Icewind\\SMB\\Wrapped\\Parser' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Parser.php',
- 'Icewind\\SMB\\Wrapped\\RawConnection' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/RawConnection.php',
- 'Icewind\\SMB\\Wrapped\\Server' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Server.php',
- 'Icewind\\SMB\\Wrapped\\Share' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Share.php',
- 'Icewind\\Streams\\CallbackWrapper' => __DIR__ . '/..' . '/icewind/streams/src/CallbackWrapper.php',
- 'Icewind\\Streams\\CountWrapper' => __DIR__ . '/..' . '/icewind/streams/src/CountWrapper.php',
- 'Icewind\\Streams\\Directory' => __DIR__ . '/..' . '/icewind/streams/src/Directory.php',
- 'Icewind\\Streams\\DirectoryFilter' => __DIR__ . '/..' . '/icewind/streams/src/DirectoryFilter.php',
- 'Icewind\\Streams\\DirectoryWrapper' => __DIR__ . '/..' . '/icewind/streams/src/DirectoryWrapper.php',
- 'Icewind\\Streams\\File' => __DIR__ . '/..' . '/icewind/streams/src/File.php',
- 'Icewind\\Streams\\HashWrapper' => __DIR__ . '/..' . '/icewind/streams/src/HashWrapper.php',
- 'Icewind\\Streams\\IteratorDirectory' => __DIR__ . '/..' . '/icewind/streams/src/IteratorDirectory.php',
- 'Icewind\\Streams\\NullWrapper' => __DIR__ . '/..' . '/icewind/streams/src/NullWrapper.php',
- 'Icewind\\Streams\\Path' => __DIR__ . '/..' . '/icewind/streams/src/Path.php',
- 'Icewind\\Streams\\PathWrapper' => __DIR__ . '/..' . '/icewind/streams/src/PathWrapper.php',
- 'Icewind\\Streams\\ReadHashWrapper' => __DIR__ . '/..' . '/icewind/streams/src/ReadHashWrapper.php',
- 'Icewind\\Streams\\RetryWrapper' => __DIR__ . '/..' . '/icewind/streams/src/RetryWrapper.php',
- 'Icewind\\Streams\\SeekableWrapper' => __DIR__ . '/..' . '/icewind/streams/src/SeekableWrapper.php',
- 'Icewind\\Streams\\Url' => __DIR__ . '/..' . '/icewind/streams/src/Url.php',
- 'Icewind\\Streams\\UrlCallback' => __DIR__ . '/..' . '/icewind/streams/src/UrlCallback.php',
- 'Icewind\\Streams\\Wrapper' => __DIR__ . '/..' . '/icewind/streams/src/Wrapper.php',
- 'Icewind\\Streams\\WrapperHandler' => __DIR__ . '/..' . '/icewind/streams/src/WrapperHandler.php',
- 'Icewind\\Streams\\WriteHashWrapper' => __DIR__ . '/..' . '/icewind/streams/src/WriteHashWrapper.php',
- );
-
- public static function getInitializer(ClassLoader $loader)
- {
- return \Closure::bind(function () use ($loader) {
- $loader->prefixLengthsPsr4 = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$prefixLengthsPsr4;
- $loader->prefixDirsPsr4 = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$prefixDirsPsr4;
- $loader->classMap = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$classMap;
-
- }, null, ClassLoader::class);
- }
-}
diff --git a/apps/files_external/3rdparty/composer/installed.json b/apps/files_external/3rdparty/composer/installed.json
deleted file mode 100644
index 275a586f4fb..00000000000
--- a/apps/files_external/3rdparty/composer/installed.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
- "packages": [
- {
- "name": "icewind/smb",
- "version": "v3.7.0",
- "version_normalized": "3.7.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/icewind1991/SMB.git",
- "reference": "e6904cbe75f678335092f4861c60c656b1a99e84"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SMB/zipball/e6904cbe75f678335092f4861c60c656b1a99e84",
- "reference": "e6904cbe75f678335092f4861c60c656b1a99e84",
- "shasum": ""
- },
- "require": {
- "icewind/streams": ">=0.7.3",
- "php": ">=7.2"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^2.16",
- "phpstan/phpstan": "^0.12.57",
- "phpunit/phpunit": "^8.5|^9.3.8",
- "psalm/phar": "^4.3"
- },
- "time": "2024-11-11T14:08:34+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Icewind\\SMB\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Robin Appelman",
- "email": "icewind@owncloud.com"
- }
- ],
- "description": "php wrapper for smbclient and libsmbclient-php",
- "support": {
- "issues": "https://github.com/icewind1991/SMB/issues",
- "source": "https://github.com/icewind1991/SMB/tree/v3.7.0"
- },
- "install-path": "../icewind/smb"
- },
- {
- "name": "icewind/streams",
- "version": "v0.7.7",
- "version_normalized": "0.7.7.0",
- "source": {
- "type": "git",
- "url": "https://github.com/icewind1991/Streams.git",
- "reference": "64200fd7cfcc7f550c3c695c48d8fd8bba97fecb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/icewind1991/Streams/zipball/64200fd7cfcc7f550c3c695c48d8fd8bba97fecb",
- "reference": "64200fd7cfcc7f550c3c695c48d8fd8bba97fecb",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^2",
- "phpstan/phpstan": "^0.12",
- "phpunit/phpunit": "^9"
- },
- "time": "2023-03-16T14:52:25+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Icewind\\Streams\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Robin Appelman",
- "email": "icewind@owncloud.com"
- }
- ],
- "description": "A set of generic stream wrappers",
- "support": {
- "issues": "https://github.com/icewind1991/Streams/issues",
- "source": "https://github.com/icewind1991/Streams/tree/v0.7.7"
- },
- "install-path": "../icewind/streams"
- }
- ],
- "dev": true,
- "dev-package-names": []
-}
diff --git a/apps/files_external/3rdparty/composer/installed.php b/apps/files_external/3rdparty/composer/installed.php
deleted file mode 100644
index 12058ec9474..00000000000
--- a/apps/files_external/3rdparty/composer/installed.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php return array(
- 'root' => array(
- 'name' => 'files_external/3rdparty',
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
- 'reference' => '101c7575ae7684a572e53740c63635cd12685995',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../',
- 'aliases' => array(),
- 'dev' => true,
- ),
- 'versions' => array(
- 'files_external/3rdparty' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
- 'reference' => '101c7575ae7684a572e53740c63635cd12685995',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../',
- 'aliases' => array(),
- 'dev_requirement' => false,
- ),
- 'icewind/smb' => array(
- 'pretty_version' => 'v3.7.0',
- 'version' => '3.7.0.0',
- 'reference' => 'e6904cbe75f678335092f4861c60c656b1a99e84',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../icewind/smb',
- 'aliases' => array(),
- 'dev_requirement' => false,
- ),
- 'icewind/streams' => array(
- 'pretty_version' => 'v0.7.7',
- 'version' => '0.7.7.0',
- 'reference' => '64200fd7cfcc7f550c3c695c48d8fd8bba97fecb',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../icewind/streams',
- 'aliases' => array(),
- 'dev_requirement' => false,
- ),
- ),
-);
diff --git a/apps/files_external/3rdparty/composer/platform_check.php b/apps/files_external/3rdparty/composer/platform_check.php
deleted file mode 100644
index 589e9e770b9..00000000000
--- a/apps/files_external/3rdparty/composer/platform_check.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-// platform_check.php @generated by Composer
-
-$issues = array();
-
-if (!(PHP_VERSION_ID >= 70200)) {
- $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.';
-}
-
-if ($issues) {
- if (!headers_sent()) {
- header('HTTP/1.1 500 Internal Server Error');
- }
- if (!ini_get('display_errors')) {
- if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
- fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
- } elseif (!headers_sent()) {
- echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
- }
- }
- trigger_error(
- 'Composer detected issues in your platform: ' . implode(' ', $issues),
- E_USER_ERROR
- );
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/.gitignore b/apps/files_external/3rdparty/icewind/smb/.gitignore
deleted file mode 100644
index 5c8c3eecba4..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-# SPDX-FileCopyrightText: 2012 Robin Appelman <robin@icewind.nl>
-# SPDX-License-Identifier: MIT
-.idea
-vendor
-composer.lock
-.php_cs.cache
-listen.php
-test.php
-*.cache \ No newline at end of file
diff --git a/apps/files_external/3rdparty/icewind/smb/.php_cs.dist b/apps/files_external/3rdparty/icewind/smb/.php_cs.dist
deleted file mode 100644
index e37135fcb7b..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/.php_cs.dist
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-$finder = PhpCsFixer\Finder::create()
- ->exclude('vendor')
- ->in(__DIR__)
-;
-return PhpCsFixer\Config::create()
- ->setRules([
- '@PSR2' => true,
- 'array_syntax' => ['syntax' => 'short'],
- 'braces' => ['position_after_functions_and_oop_constructs' => 'same'],
- 'binary_operator_spaces' => ['align_double_arrow' => true, 'align_equals' => false],
- ])
- ->setIndent("\t")
- ->setFinder($finder)
- ;
diff --git a/apps/files_external/3rdparty/icewind/smb/LICENSE.txt b/apps/files_external/3rdparty/icewind/smb/LICENSE.txt
deleted file mode 100644
index fa0495d94c3..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/LICENSE.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2014 Robin Appelman <robin@icewind.nl>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/apps/files_external/3rdparty/icewind/smb/LICENSES/AGPL-3.0-or-later.txt b/apps/files_external/3rdparty/icewind/smb/LICENSES/AGPL-3.0-or-later.txt
deleted file mode 100644
index 0c97efd25b5..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/LICENSES/AGPL-3.0-or-later.txt
+++ /dev/null
@@ -1,235 +0,0 @@
-GNU AFFERO GENERAL PUBLIC LICENSE
-Version 3, 19 November 2007
-
-Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
- Preamble
-
-The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.
-
-The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
-
-Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.
-
-A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public.
-
-The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.
-
-An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
- TERMS AND CONDITIONS
-
-0. Definitions.
-
-"This License" refers to version 3 of the GNU Affero General Public License.
-
-"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
-
-"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.
-
-To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.
-
-A "covered work" means either the unmodified Program or a work based on the Program.
-
-To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
-
-To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
-
-An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
-
-1. Source Code.
-The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.
-
-A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
-
-The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
-
-The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
-
-The Corresponding Source for a work in source code form is that same work.
-
-2. Basic Permissions.
-All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
-
-You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
-
-Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
-
-3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
-
-When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
-
-4. Conveying Verbatim Copies.
-You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
-
-You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
-
-5. Conveying Modified Source Versions.
-You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
-
-A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
-
-6. Conveying Non-Source Forms.
-You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
-
- d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
-
-A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
-
-A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
-
-"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
-
-If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
-
-The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
-
-Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
-
-7. Additional Terms.
-"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
-
-When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
-
-Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
-
-All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
-
-If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
-
-Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
-
-8. Termination.
-
-You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
-
-However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
-
-Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
-
-Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
-
-9. Acceptance Not Required for Having Copies.
-
-You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
-
-10. Automatic Licensing of Downstream Recipients.
-
-Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
-
-An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
-
-You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
-
-11. Patents.
-
-A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".
-
-A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
-
-Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
-
-In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
-
-If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
-
-If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
-
-A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
-
-Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
-
-12. No Surrender of Others' Freedom.
-
-If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
-
-13. Remote Network Interaction; Use with the GNU General Public License.
-
-Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.
-
-Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.
-
-14. Revised Versions of this License.
-
-The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation.
-
-If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-
-Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
-
-15. Disclaimer of Warranty.
-
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-16. Limitation of Liability.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-17. Interpretation of Sections 15 and 16.
-
-If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
-
-END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.
-
-You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <http://www.gnu.org/licenses/>.
diff --git a/apps/files_external/3rdparty/icewind/smb/LICENSES/CC0-1.0.txt b/apps/files_external/3rdparty/icewind/smb/LICENSES/CC0-1.0.txt
deleted file mode 100644
index 0e259d42c99..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/LICENSES/CC0-1.0.txt
+++ /dev/null
@@ -1,121 +0,0 @@
-Creative Commons Legal Code
-
-CC0 1.0 Universal
-
- CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
- LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
- ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
- INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
- REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
- PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
- THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
- HEREUNDER.
-
-Statement of Purpose
-
-The laws of most jurisdictions throughout the world automatically confer
-exclusive Copyright and Related Rights (defined below) upon the creator
-and subsequent owner(s) (each and all, an "owner") of an original work of
-authorship and/or a database (each, a "Work").
-
-Certain owners wish to permanently relinquish those rights to a Work for
-the purpose of contributing to a commons of creative, cultural and
-scientific works ("Commons") that the public can reliably and without fear
-of later claims of infringement build upon, modify, incorporate in other
-works, reuse and redistribute as freely as possible in any form whatsoever
-and for any purposes, including without limitation commercial purposes.
-These owners may contribute to the Commons to promote the ideal of a free
-culture and the further production of creative, cultural and scientific
-works, or to gain reputation or greater distribution for their Work in
-part through the use and efforts of others.
-
-For these and/or other purposes and motivations, and without any
-expectation of additional consideration or compensation, the person
-associating CC0 with a Work (the "Affirmer"), to the extent that he or she
-is an owner of Copyright and Related Rights in the Work, voluntarily
-elects to apply CC0 to the Work and publicly distribute the Work under its
-terms, with knowledge of his or her Copyright and Related Rights in the
-Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be
-protected by copyright and related or neighboring rights ("Copyright and
-Related Rights"). Copyright and Related Rights include, but are not
-limited to, the following:
-
- i. the right to reproduce, adapt, distribute, perform, display,
- communicate, and translate a Work;
- ii. moral rights retained by the original author(s) and/or performer(s);
-iii. publicity and privacy rights pertaining to a person's image or
- likeness depicted in a Work;
- iv. rights protecting against unfair competition in regards to a Work,
- subject to the limitations in paragraph 4(a), below;
- v. rights protecting the extraction, dissemination, use and reuse of data
- in a Work;
- vi. database rights (such as those arising under Directive 96/9/EC of the
- European Parliament and of the Council of 11 March 1996 on the legal
- protection of databases, and under any national implementation
- thereof, including any amended or successor version of such
- directive); and
-vii. other similar, equivalent or corresponding rights throughout the
- world based on applicable law or treaty, and any national
- implementations thereof.
-
-2. Waiver. To the greatest extent permitted by, but not in contravention
-of, applicable law, Affirmer hereby overtly, fully, permanently,
-irrevocably and unconditionally waives, abandons, and surrenders all of
-Affirmer's Copyright and Related Rights and associated claims and causes
-of action, whether now known or unknown (including existing as well as
-future claims and causes of action), in the Work (i) in all territories
-worldwide, (ii) for the maximum duration provided by applicable law or
-treaty (including future time extensions), (iii) in any current or future
-medium and for any number of copies, and (iv) for any purpose whatsoever,
-including without limitation commercial, advertising or promotional
-purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
-member of the public at large and to the detriment of Affirmer's heirs and
-successors, fully intending that such Waiver shall not be subject to
-revocation, rescission, cancellation, termination, or any other legal or
-equitable action to disrupt the quiet enjoyment of the Work by the public
-as contemplated by Affirmer's express Statement of Purpose.
-
-3. Public License Fallback. Should any part of the Waiver for any reason
-be judged legally invalid or ineffective under applicable law, then the
-Waiver shall be preserved to the maximum extent permitted taking into
-account Affirmer's express Statement of Purpose. In addition, to the
-extent the Waiver is so judged Affirmer hereby grants to each affected
-person a royalty-free, non transferable, non sublicensable, non exclusive,
-irrevocable and unconditional license to exercise Affirmer's Copyright and
-Related Rights in the Work (i) in all territories worldwide, (ii) for the
-maximum duration provided by applicable law or treaty (including future
-time extensions), (iii) in any current or future medium and for any number
-of copies, and (iv) for any purpose whatsoever, including without
-limitation commercial, advertising or promotional purposes (the
-"License"). The License shall be deemed effective as of the date CC0 was
-applied by Affirmer to the Work. Should any part of the License for any
-reason be judged legally invalid or ineffective under applicable law, such
-partial invalidity or ineffectiveness shall not invalidate the remainder
-of the License, and in such case Affirmer hereby affirms that he or she
-will not (i) exercise any of his or her remaining Copyright and Related
-Rights in the Work or (ii) assert any associated claims and causes of
-action with respect to the Work, in either case contrary to Affirmer's
-express Statement of Purpose.
-
-4. Limitations and Disclaimers.
-
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
- surrendered, licensed or otherwise affected by this document.
- b. Affirmer offers the Work as-is and makes no representations or
- warranties of any kind concerning the Work, express, implied,
- statutory or otherwise, including without limitation warranties of
- title, merchantability, fitness for a particular purpose, non
- infringement, or the absence of latent or other defects, accuracy, or
- the present or absence of errors, whether or not discoverable, all to
- the greatest extent permissible under applicable law.
- c. Affirmer disclaims responsibility for clearing rights of other persons
- that may apply to the Work or any use thereof, including without
- limitation any person's Copyright and Related Rights in the Work.
- Further, Affirmer disclaims responsibility for obtaining any necessary
- consents, permissions or other rights required for any use of the
- Work.
- d. Affirmer understands and acknowledges that Creative Commons is not a
- party to this document and has no duty or obligation with respect to
- this CC0 or use of the Work.
diff --git a/apps/files_external/3rdparty/icewind/smb/LICENSES/MIT.txt b/apps/files_external/3rdparty/icewind/smb/LICENSES/MIT.txt
deleted file mode 100644
index 2071b23b0e0..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/LICENSES/MIT.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-MIT License
-
-Copyright (c) <year> <copyright holders>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/apps/files_external/3rdparty/icewind/smb/README.md b/apps/files_external/3rdparty/icewind/smb/README.md
deleted file mode 100644
index 2a93c8c4717..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/README.md
+++ /dev/null
@@ -1,192 +0,0 @@
-<!--
- - SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- - SPDX-License-Identifier: MIT
--->
-SMB
-===
-
-[![CI](https://github.com/icewind1991/SMB/actions/workflows/ci.yaml/badge.svg)](https://github.com/icewind1991/SMB/actions/workflows/ci.yaml)
-[![codecov](https://codecov.io/gh/icewind1991/SMB/branch/master/graph/badge.svg?token=eTg0P466k6)](https://codecov.io/gh/icewind1991/SMB)
-
-PHP wrapper for `smbclient` and [`libsmbclient-php`](https://github.com/eduardok/libsmbclient-php)
-
-- Reuses a single `smbclient` instance for multiple requests
-- Doesn't leak the password to the process list
-- Simple 1-on-1 mapping of SMB commands
-- A stream-based api to remove the need for temporary files
-- Support for using libsmbclient directly trough [`libsmbclient-php`](https://github.com/eduardok/libsmbclient-php)
-
-Examples
-----
-
-### Connect to a share ###
-
-```php
-<?php
-use Icewind\SMB\ServerFactory;
-use Icewind\SMB\BasicAuth;
-
-require('vendor/autoload.php');
-
-$serverFactory = new ServerFactory();
-$auth = new BasicAuth('user', 'workgroup', 'password');
-$server = $serverFactory->createServer('localhost', $auth);
-
-$share = $server->getShare('test');
-```
-
-The server factory will automatically pick between the `smbclient` and `libsmbclient-php`
-based backend depending on what is available.
-
-### Using anonymous authentication ###
-
-```php
-$serverFactory = new ServerFactory();
-$auth = new AnonymousAuth();
-$server = $serverFactory->createServer('localhost', $auth);
-```
-
-### Using kerberos authentication ###
-
-There are two ways of using kerberos to authenticate against the smb server:
-
-- Using a ticket from the php server
-- Re-using a ticket send by the client
-
-### Using a server ticket
-
-Using a server ticket allows the web server to authenticate against the smb server using an existing machine account.
-
-The ticket needs to be available in the environment of the php process.
-
-```php
-$serverFactory = new ServerFactory();
-$auth = new KerberosAuth();
-$server = $serverFactory->createServer('localhost', $auth);
-```
-
-### Re-using a client ticket
-
-By re-using a client ticket you can create a single sign-on setup where the user authenticates against
-the web service using kerberos. And the web server can forward that ticket to the smb server, allowing it
-to act on the behalf of the user without requiring the user to enter his password.
-
-The setup for such a system is fairly involved and requires roughly the following this
-
-- The web server is authenticated against kerberos with a machine account
-- Delegation is enabled for the web server's machine account
-- The web server is setup to perform kerberos authentication and save the ticket in it's environment
-- Php has the krb5 extension installed
-- The client authenticates using a ticket with forwarding enabled
-
-```php
-$serverFactory = new ServerFactory();
-$auth = new KerberosAuth();
-$auth->setTicket(KerberosTicket::fromEnv());
-$server = $serverFactory->createServer('localhost', $auth);
-```
-
-### Upload a file ###
-
-```php
-$share->put($fileToUpload, 'example.txt');
-```
-
-### Download a file ###
-
-```php
-$share->get('example.txt', $target);
-```
-
-### List shares on the remote server ###
-
-```php
-$shares = $server->listShares();
-
-foreach ($shares as $share) {
- echo $share->getName() . "\n";
-}
-```
-
-### List the content of a folder ###
-
-```php
-$content = $share->dir('test');
-
-foreach ($content as $info) {
- echo $info->getName() . "\n";
- echo "\tsize :" . $info->getSize() . "\n";
-}
-```
-
-### Using read streams
-
-```php
-$fh = $share->read('test.txt');
-echo fread($fh, 4086);
-fclose($fh);
-```
-
-### Using write streams
-
-```php
-$fh = $share->write('test.txt');
-fwrite($fh, 'bar');
-fclose($fh);
-```
-
-**Note**: write() will truncate your file to 0bytes. You may open a writeable stream with append() which will point
-the cursor to the end of the file or create it if it does not exist yet. (append() is only compatible with libsmbclient-php)
-```php
-$fh = $share->append('test.txt');
-fwrite($fh, 'bar');
-fclose($fh);
-```
-
-
-### Using notify
-
-```php
-$share->notify('')->listen(function (\Icewind\SMB\Change $change) {
- echo $change->getCode() . ': ' . $change->getPath() . "\n";
-});
-```
-
-### Changing network timeouts
-
-```php
-$options = new Options();
-$options->setTimeout(5);
-$serverFactory = new ServerFactory($options);
-```
-
-### Setting protocol version
-
-```php
-$options = new Options();
-$options->setMinProtocol(IOptions::PROTOCOL_SMB2);
-$options->setMaxProtocol(IOptions::PROTOCOL_SMB3);
-$serverFactory = new ServerFactory($options);
-```
-
-Note, setting the protocol version is not supported with php-smbclient version 1.0.1 or lower.
-
-### Customizing system integration
-
-The `smbclient` backend needs to get various information about the system it's running on to function
-such as the paths of various binaries or the system timezone.
-While the default logic for getting this information should work on most systems, it is possible to customize this behaviour.
-
-In order to customize the integration you provide a custom implementation of `ITimezoneProvider` and/or `ISystem` and pass them as arguments to the `ServerFactory`.
-
-## Testing SMB
-
-Use the following steps to check if the library can connect to your SMB share.
-
-1. Clone this repository or download the source as [zip](https://github.com/icewind1991/SMB/archive/master.zip)
-2. Make sure [composer](https://getcomposer.org/) is installed
-3. Run `composer install` in the root of the repository
-4. Edit `example.php` with the relevant settings for your share.
-5. Run `php example.php`
-
-If everything works correctly then the contents of the share should be outputted.
diff --git a/apps/files_external/3rdparty/icewind/smb/composer.json b/apps/files_external/3rdparty/icewind/smb/composer.json
deleted file mode 100644
index 6ab6100af71..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/composer.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "icewind/smb",
- "description": "php wrapper for smbclient and libsmbclient-php",
- "license": "MIT",
- "authors": [
- {
- "name": "Robin Appelman",
- "email": "icewind@owncloud.com"
- }
- ],
- "require": {
- "php": ">=7.2",
- "icewind/streams": ">=0.7.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.5|^9.3.8",
- "friendsofphp/php-cs-fixer": "^2.16",
- "phpstan/phpstan": "^0.12.57",
- "psalm/phar": "^4.3"
- },
- "autoload": {
- "psr-4": {
- "Icewind\\SMB\\": "src/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "Icewind\\SMB\\Test\\": "tests/"
- }
- },
- "scripts": {
- "lint": "parallel-lint --exclude src --exclude vendor --exclude target --exclude build .",
- "cs:check": "php-cs-fixer fix --dry-run --diff",
- "cs:fix": "php-cs-fixer fix",
- "psalm": "psalm.phar"
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/composer.json.license b/apps/files_external/3rdparty/icewind/smb/composer.json.license
deleted file mode 100644
index 99ba7368b14..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/composer.json.license
+++ /dev/null
@@ -1,2 +0,0 @@
-SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
-SPDX-License-Identifier: MIT
diff --git a/apps/files_external/3rdparty/icewind/smb/psalm.xml.license b/apps/files_external/3rdparty/icewind/smb/psalm.xml.license
deleted file mode 100644
index 94efc752831..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/psalm.xml.license
+++ /dev/null
@@ -1,2 +0,0 @@
-SPDX-FileCopyrightText: 2021 Robin Appelman <robin@icewind.nl>
-SPDX-License-Identifier: MIT
diff --git a/apps/files_external/3rdparty/icewind/smb/src/ACL.php b/apps/files_external/3rdparty/icewind/smb/src/ACL.php
deleted file mode 100644
index 9d83cd15409..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/ACL.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php declare(strict_types=1);
-/**
- * SPDX-FileCopyrightText: 2020 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-class ACL {
- const TYPE_ALLOW = 0;
- const TYPE_DENY = 1;
-
- const MASK_READ = 0x0001;
- const MASK_WRITE = 0x0002;
- const MASK_EXECUTE = 0x00020;
- const MASK_DELETE = 0x10000;
-
- const FLAG_OBJECT_INHERIT = 0x1;
- const FLAG_CONTAINER_INHERIT = 0x2;
-
- /** @var int */
- private $type;
- /** @var int */
- private $flags;
- /** @var int */
- private $mask;
-
- public function __construct(int $type, int $flags, int $mask) {
- $this->type = $type;
- $this->flags = $flags;
- $this->mask = $mask;
- }
-
- /**
- * Check if the acl allows a specific permissions
- *
- * Note that this does not take inherited acls into account
- *
- * @param int $mask one of the ACL::MASK_* constants
- * @return bool
- */
- public function allows(int $mask): bool {
- return $this->type === self::TYPE_ALLOW && ($this->mask & $mask) === $mask;
- }
-
- /**
- * Check if the acl allows a specific permissions
- *
- * Note that this does not take inherited acls into account
- *
- * @param int $mask one of the ACL::MASK_* constants
- * @return bool
- */
- public function denies(int $mask): bool {
- return $this->type === self::TYPE_DENY && ($this->mask & $mask) === $mask;
- }
-
- public function getType(): int {
- return $this->type;
- }
-
- public function getFlags(): int {
- return $this->flags;
- }
-
- public function getMask(): int {
- return $this->mask;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php b/apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php
deleted file mode 100644
index fe22fb10d19..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-abstract class AbstractServer implements IServer {
- const LOCALE = 'en_US.UTF-8';
-
- /** @var string */
- protected $host;
-
- /** @var IAuth */
- protected $auth;
-
- /** @var ISystem */
- protected $system;
-
- /** @var ITimeZoneProvider */
- protected $timezoneProvider;
-
- /** @var IOptions */
- protected $options;
-
- /**
- * @param string $host
- * @param IAuth $auth
- * @param ISystem $system
- * @param ITimeZoneProvider $timeZoneProvider
- * @param IOptions $options
- */
- public function __construct(string $host, IAuth $auth, ISystem $system, ITimeZoneProvider $timeZoneProvider, IOptions $options) {
- $this->host = $host;
- $this->auth = $auth;
- $this->system = $system;
- $this->timezoneProvider = $timeZoneProvider;
- $this->options = $options;
- }
-
- public function getAuth(): IAuth {
- return $this->auth;
- }
-
- public function getHost(): string {
- return $this->host;
- }
-
- public function getTimeZone(): string {
- return $this->timezoneProvider->get($this->host);
- }
-
- public function getSystem(): ISystem {
- return $this->system;
- }
-
- public function getOptions(): IOptions {
- return $this->options;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/AbstractShare.php b/apps/files_external/3rdparty/icewind/smb/src/AbstractShare.php
deleted file mode 100644
index 77f50e4ca9d..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/AbstractShare.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2015 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\InvalidPathException;
-
-abstract class AbstractShare implements IShare {
- /** @var string[] */
- private $forbiddenCharacters;
-
- public function __construct() {
- $this->forbiddenCharacters = ['?', '<', '>', ':', '*', '|', '"', chr(0), "\n", "\r"];
- }
-
- /**
- * @param string $path
- * @throws InvalidPathException
- */
- protected function verifyPath(string $path): void {
- foreach ($this->forbiddenCharacters as $char) {
- if (strpos($path, $char) !== false) {
- throw new InvalidPathException('Invalid path, "' . $char . '" is not allowed');
- }
- }
- }
-
- /**
- * @param string[] $charList
- */
- public function setForbiddenChars(array $charList): void {
- $this->forbiddenCharacters = $charList;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php b/apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php
deleted file mode 100644
index 87bce1663dd..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\Exception;
-
-class AnonymousAuth implements IAuth {
- public function getUsername(): ?string {
- return null;
- }
-
- public function getWorkgroup(): ?string {
- return 'dummy';
- }
-
- public function getPassword(): ?string {
- return null;
- }
-
- public function getExtraCommandLineArguments(): string {
- return '-N';
- }
-
- public function setExtraSmbClientOptions($smbClientState): void {
- if (smbclient_option_set($smbClientState, SMBCLIENT_OPT_AUTO_ANONYMOUS_LOGIN, true) === false) {
- throw new Exception("Failed to set smbclient options for anonymous auth");
- }
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php b/apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php
deleted file mode 100644
index a462109b3c2..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-class BasicAuth implements IAuth {
- /** @var string */
- private $username;
- /** @var string|null */
- private $workgroup;
- /** @var string */
- private $password;
-
- public function __construct(string $username, ?string $workgroup, string $password) {
- $this->username = $username;
- $this->workgroup = $workgroup;
- $this->password = $password;
- }
-
- public function getUsername(): ?string {
- return $this->username;
- }
-
- public function getWorkgroup(): ?string {
- return $this->workgroup;
- }
-
- public function getPassword(): ?string {
- return $this->password;
- }
-
- public function getExtraCommandLineArguments(): string {
- return ($this->workgroup) ? '-W ' . escapeshellarg($this->workgroup) : '';
- }
-
- public function setExtraSmbClientOptions($smbClientState): void {
- // noop
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Change.php b/apps/files_external/3rdparty/icewind/smb/src/Change.php
deleted file mode 100644
index c21297a2bec..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Change.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2016 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB;
-
-class Change {
- /** @var int */
- private $code;
- /** @var string */
- private $path;
-
- public function __construct(int $code, string $path) {
- $this->code = $code;
- $this->path = $path;
- }
-
- public function getCode(): int {
- return $this->code;
- }
-
- public function getPath(): string {
- return $this->path;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/AccessDeniedException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/AccessDeniedException.php
deleted file mode 100644
index 7e8a81d88ba..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/AccessDeniedException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class AccessDeniedException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/AlreadyExistsException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/AlreadyExistsException.php
deleted file mode 100644
index 7828efe8529..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/AlreadyExistsException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class AlreadyExistsException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/AuthenticationException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/AuthenticationException.php
deleted file mode 100644
index bf51f5c2bd1..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/AuthenticationException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class AuthenticationException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectException.php
deleted file mode 100644
index 527e5835c25..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class ConnectException extends Exception {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionAbortedException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionAbortedException.php
deleted file mode 100644
index cc959c27734..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionAbortedException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class ConnectionAbortedException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionException.php
deleted file mode 100644
index deabfcd78b7..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class ConnectionException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionRefusedException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionRefusedException.php
deleted file mode 100644
index 826a19615a2..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionRefusedException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class ConnectionRefusedException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionResetException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionResetException.php
deleted file mode 100644
index 464e752c2c6..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/ConnectionResetException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2020 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class ConnectionResetException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php
deleted file mode 100644
index ed3d427918d..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2016 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class DependencyException extends Exception {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php
deleted file mode 100644
index 199cdf3056b..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-use Throwable;
-
-/**
- * @psalm-consistent-constructor
- */
-class Exception extends \Exception {
- public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null) {
- parent::__construct($message, $code, $previous);
- }
-
- /**
- * @param string|null $path
- * @param string|int|null $error
- * @return Exception
- */
- public static function unknown(?string $path, $error): Exception {
- $message = 'Unknown error (' . (string)$error . ')';
- if ($path) {
- $message .= ' for ' . $path;
- }
-
- return new Exception($message, is_int($error) ? $error : 0);
- }
-
- /**
- * @param array<int|string, class-string<Exception>> $exceptionMap
- * @param string|int|null $error
- * @param string|null $path
- * @return Exception
- */
- public static function fromMap(array $exceptionMap, $error, ?string $path): Exception {
- if (isset($exceptionMap[$error])) {
- $exceptionClass = $exceptionMap[$error];
- if (is_numeric($error)) {
- return new $exceptionClass($path, $error);
- } else {
- return new $exceptionClass($path);
- }
- } else {
- return Exception::unknown($path, $error);
- }
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/FileInUseException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/FileInUseException.php
deleted file mode 100644
index 44affabc428..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/FileInUseException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class FileInUseException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/ForbiddenException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/ForbiddenException.php
deleted file mode 100644
index 2d070543114..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/ForbiddenException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class ForbiddenException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/HostDownException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/HostDownException.php
deleted file mode 100644
index 321f8d2f902..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/HostDownException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class HostDownException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidArgumentException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidArgumentException.php
deleted file mode 100644
index 69422392123..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidArgumentException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidArgumentException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidHostException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidHostException.php
deleted file mode 100644
index 630734ee855..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidHostException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidHostException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php
deleted file mode 100644
index 57a50a16496..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidParameterException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidPathException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidPathException.php
deleted file mode 100644
index 8b2ea3aeab3..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidPathException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidPathException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidRequestException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidRequestException.php
deleted file mode 100644
index d6ee8db0698..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidRequestException.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidRequestException extends Exception {
- /**
- * @var string
- */
- protected $path;
-
- public function __construct(string $path = "", int $code = 0, ?\Throwable $previous = null) {
- $class = get_class($this);
- $parts = explode('\\', $class);
- $baseName = array_pop($parts);
- parent::__construct('Invalid request for ' . $path . ' (' . $baseName . ')', $code, $previous);
- $this->path = $path;
- }
-
- /**
- * @return string
- */
- public function getPath() {
- return $this->path;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidResourceException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidResourceException.php
deleted file mode 100644
index 95507e4f4ea..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidResourceException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidResourceException extends Exception {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTicket.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTicket.php
deleted file mode 100644
index eb718af37e8..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTicket.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * SPDX-FileCopyrightText: 2022 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidTicket extends Exception {
-
-} \ No newline at end of file
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTypeException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTypeException.php
deleted file mode 100644
index 4a5b12cbab8..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidTypeException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class InvalidTypeException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/NoLoginServerException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/NoLoginServerException.php
deleted file mode 100644
index efe5b4e9197..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/NoLoginServerException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class NoLoginServerException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/NoRouteToHostException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/NoRouteToHostException.php
deleted file mode 100644
index 475aaef6699..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/NoRouteToHostException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class NoRouteToHostException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/NotEmptyException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/NotEmptyException.php
deleted file mode 100644
index e76980b1f60..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/NotEmptyException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class NotEmptyException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/NotFoundException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/NotFoundException.php
deleted file mode 100644
index 9cea30d86f3..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/NotFoundException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class NotFoundException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php
deleted file mode 100644
index 1db6a7208a9..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class OutOfSpaceException extends InvalidRequestException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php
deleted file mode 100644
index a3954018b4c..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-use Throwable;
-
-class RevisionMismatchException extends Exception {
- public function __construct(string $message = 'Protocol version mismatch', int $code = 0, Throwable $previous = null) {
- parent::__construct($message, $code, $previous);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/TimedOutException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/TimedOutException.php
deleted file mode 100644
index 57eeb0f0ba8..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Exception/TimedOutException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Exception;
-
-class TimedOutException extends ConnectException {
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/IAuth.php b/apps/files_external/3rdparty/icewind/smb/src/IAuth.php
deleted file mode 100644
index 46ba4b81b18..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/IAuth.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-interface IAuth {
- public function getUsername(): ?string;
-
- public function getWorkgroup(): ?string;
-
- public function getPassword(): ?string;
-
- /**
- * Any extra command line option for smbclient that are required
- *
- * @return string
- */
- public function getExtraCommandLineArguments(): string;
-
- /**
- * Set any extra options for libsmbclient that are required
- *
- * @param resource $smbClientState
- */
- public function setExtraSmbClientOptions($smbClientState): void;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php b/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php
deleted file mode 100644
index e71e0e40a1e..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB;
-
-interface IFileInfo {
- /*
- * Mappings of the DOS mode bits, as returned by smbc_getxattr() when the
- * attribute name "system.dos_attr.mode" (or "system.dos_attr.*" or
- * "system.*") is specified.
- */
- const MODE_READONLY = 0x01;
- const MODE_HIDDEN = 0x02;
- const MODE_SYSTEM = 0x04;
- const MODE_VOLUME_ID = 0x08;
- const MODE_DIRECTORY = 0x10;
- const MODE_ARCHIVE = 0x20;
- const MODE_NORMAL = 0x80;
-
- public function getPath(): string;
-
- public function getName(): string;
-
- public function getSize(): int;
-
- public function getMTime(): int;
-
- public function isDirectory(): bool;
-
- public function isReadOnly(): bool;
-
- public function isHidden(): bool;
-
- public function isSystem(): bool;
-
- public function isArchived(): bool;
-
- /**
- * @return ACL[]
- */
- public function getAcls(): array;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php b/apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php
deleted file mode 100644
index 829ac7d9a0a..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2016 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB;
-
-interface INotifyHandler {
- // https://msdn.microsoft.com/en-us/library/dn392331.aspx
- const NOTIFY_ADDED = 1;
- const NOTIFY_REMOVED = 2;
- const NOTIFY_MODIFIED = 3;
- const NOTIFY_RENAMED_OLD = 4;
- const NOTIFY_RENAMED_NEW = 5;
- const NOTIFY_ADDED_STREAM = 6;
- const NOTIFY_REMOVED_STREAM = 7;
- const NOTIFY_MODIFIED_STREAM = 8;
- const NOTIFY_REMOVED_BY_DELETE = 9;
-
- /**
- * Get all changes detected since the start of the notify process or the last call to getChanges
- *
- * @return Change[]
- */
- public function getChanges(): array;
-
- /**
- * Listen actively to all incoming changes
- *
- * Note that this is a blocking process and will cause the process to block forever if not explicitly terminated
- *
- * @param callable(Change):?bool $callback
- */
- public function listen(callable $callback): void;
-
- /**
- * Stop listening for changes
- *
- * Note that any pending changes will be discarded
- */
- public function stop(): void;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/IOptions.php b/apps/files_external/3rdparty/icewind/smb/src/IOptions.php
deleted file mode 100644
index b72700c9d8c..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/IOptions.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-interface IOptions {
- const PROTOCOL_NT1 = 'NT1';
- const PROTOCOL_SMB2 = 'SMB2';
- const PROTOCOL_SMB2_02 = 'SMB2_02';
- const PROTOCOL_SMB2_22 = 'SMB2_22';
- const PROTOCOL_SMB2_24 = 'SMB2_24';
- const PROTOCOL_SMB3 = 'SMB3';
- const PROTOCOL_SMB3_00 = 'SMB3_00';
- const PROTOCOL_SMB3_02 = 'SMB3_02';
- const PROTOCOL_SMB3_10 = 'SMB3_10';
- const PROTOCOL_SMB3_11 = 'SMB3_11';
-
- public function getTimeout(): int;
-
- public function getMinProtocol(): ?string;
-
- public function getMaxProtocol(): ?string;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/IServer.php b/apps/files_external/3rdparty/icewind/smb/src/IServer.php
deleted file mode 100644
index c11fb450853..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/IServer.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-interface IServer {
- public function getAuth(): IAuth;
-
- public function getHost(): string;
-
- /**
- * @return \Icewind\SMB\IShare[]
- *
- * @throws \Icewind\SMB\Exception\AuthenticationException
- * @throws \Icewind\SMB\Exception\InvalidHostException
- */
- public function listShares(): array;
-
- public function getShare(string $name): IShare;
-
- public function getTimeZone(): string;
-
- public function getSystem(): ISystem;
-
- public function getOptions(): IOptions;
-
- public static function available(ISystem $system): bool;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/IShare.php b/apps/files_external/3rdparty/icewind/smb/src/IShare.php
deleted file mode 100644
index 617b81746ea..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/IShare.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\AlreadyExistsException;
-use Icewind\SMB\Exception\InvalidRequestException;
-use Icewind\SMB\Exception\InvalidTypeException;
-use Icewind\SMB\Exception\NotFoundException;
-
-interface IShare {
- /**
- * Get the name of the share
- *
- * @return string
- */
- public function getName(): string;
-
- /**
- * Download a remote file
- *
- * @param string $source remote file
- * @param string $target local file
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function get(string $source, string $target): bool;
-
- /**
- * Upload a local file
- *
- * @param string $source local file
- * @param string $target remote file
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function put(string $source, string $target): bool;
-
- /**
- * Open a readable stream to a remote file
- *
- * @param string $source
- * @return resource a read only stream with the contents of the remote file
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function read(string $source);
-
- /**
- * Open a writable stream to a remote file
- * Note: This method will truncate the file to 0bytes
- *
- * @param string $target
- * @return resource a write only stream to upload a remote file
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function write(string $target);
-
- /**
- * Open a writable stream to a remote file and set the cursor to the end of the file
- *
- * @param string $target
- * @return resource a write only stream to upload a remote file
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- * @throws InvalidRequestException
- */
- public function append(string $target);
-
- /**
- * Rename a remote file
- *
- * @param string $from
- * @param string $to
- * @return bool
- *
- * @throws NotFoundException
- * @throws AlreadyExistsException
- */
- public function rename(string $from, string $to): bool;
-
- /**
- * Delete a file on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function del(string $path): bool;
-
- /**
- * List the content of a remote folder
- *
- * @param string $path
- * @return IFileInfo[]
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function dir(string $path): array;
-
- /**
- * @param string $path
- * @return IFileInfo
- *
- * @throws NotFoundException
- */
- public function stat(string $path): IFileInfo;
-
- /**
- * Create a folder on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws AlreadyExistsException
- */
- public function mkdir(string $path): bool;
-
- /**
- * Remove a folder on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function rmdir(string $path): bool;
-
- /**
- * @param string $path
- * @param int $mode a combination of FileInfo::MODE_READONLY, FileInfo::MODE_ARCHIVE, FileInfo::MODE_SYSTEM and FileInfo::MODE_HIDDEN, FileInfo::NORMAL
- * @return mixed
- */
- public function setMode(string $path, int $mode);
-
- /**
- * @param string $path
- * @return INotifyHandler
- */
- public function notify(string $path);
-
- /**
- * Get the IServer instance for this share
- *
- * @return IServer
- */
- public function getServer(): IServer;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/ISystem.php b/apps/files_external/3rdparty/icewind/smb/src/ISystem.php
deleted file mode 100644
index 90209f9ae24..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/ISystem.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-/**
- * The `ISystem` interface provides a way to access system dependent information
- * such as the availability and location of certain binaries.
- */
-interface ISystem {
- /**
- * Get the path to a file descriptor of the current process
- *
- * @param int $num the file descriptor id
- * @return string
- */
- public function getFD(int $num): string;
-
- /**
- * Get the full path to the `smbclient` binary of null if the binary is not available
- *
- * @return string|null
- */
- public function getSmbclientPath(): ?string;
-
- /**
- * Get the full path to the `net` binary of null if the binary is not available
- *
- * @return string|null
- */
- public function getNetPath(): ?string;
-
- /**
- * Get the full path to the `smbcacls` binary of null if the binary is not available
- *
- * @return string|null
- */
- public function getSmbcAclsPath(): ?string;
-
- /**
- * Get the full path to the `stdbuf` binary of null if the binary is not available
- *
- * @return string|null
- */
- public function getStdBufPath(): ?string;
-
- /**
- * Get the full path to the `date` binary of null if the binary is not available
- *
- * @return string|null
- */
- public function getDatePath(): ?string;
-
- /**
- * Whether or not the smbclient php extension is enabled
- *
- * @return bool
- */
- public function libSmbclientAvailable(): bool;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/ITimeZoneProvider.php b/apps/files_external/3rdparty/icewind/smb/src/ITimeZoneProvider.php
deleted file mode 100644
index dba3b58132e..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/ITimeZoneProvider.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-interface ITimeZoneProvider {
- /**
- * Get the timezone of the smb server
- *
- * @param string $host
- * @return string
- */
- public function get(string $host): string;
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/KerberosApacheAuth.php b/apps/files_external/3rdparty/icewind/smb/src/KerberosApacheAuth.php
deleted file mode 100644
index eb22982f0ec..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/KerberosApacheAuth.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\DependencyException;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\InvalidTicket;
-
-/**
- * Use existing kerberos ticket to authenticate and reuse the apache ticket cache (mod_auth_kerb)
- *
- * @deprecated Use `KerberosAuth` with `$auth->setTicket(KerberosTicket::fromEnv())` instead
- */
-class KerberosApacheAuth extends KerberosAuth implements IAuth {
- public function getTicket(): KerberosTicket {
- if ($this->ticket === null) {
- $ticket = KerberosTicket::fromEnv();
- if ($ticket === null) {
- throw new InvalidTicket("No ticket found in environment");
- }
- $this->ticket = $ticket;
- }
- return $this->ticket;
- }
-
- /**
- * Copy the ticket to a temporary location and use that ticket for authentication
- *
- * @return void
- */
- public function copyTicket(): void {
- $this->ticket = KerberosTicket::load($this->getTicket()->save());
- }
-
- /**
- * Check if a valid kerberos ticket is present
- *
- * @return bool
- */
- public function checkTicket(): bool {
- return $this->getTicket()->isValid();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php b/apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php
deleted file mode 100644
index 6e35f9bd8f3..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\Exception;
-
-/**
- * Use existing kerberos ticket to authenticate
- */
-class KerberosAuth implements IAuth {
- /** @var ?KerberosTicket */
- protected $ticket = null;
-
- public function getTicket(): ?KerberosTicket {
- return $this->ticket;
- }
-
- public function setTicket(?KerberosTicket $ticket): void {
- $this->ticket = $ticket;
- }
-
- public function getUsername(): ?string {
- return 'dummy';
- }
-
- public function getWorkgroup(): ?string {
- return 'dummy';
- }
-
- public function getPassword(): ?string {
- return null;
- }
-
- private function setEnv():void {
- $ticket = $this->getTicket();
- if ($ticket) {
- $ticket->validate();
-
- // note that even if the ticket name is the value we got from `getenv("KRB5CCNAME")` we still need to set the env variable ourselves
- // this is because `getenv` also reads the variables passed from the SAPI (apache-php) and we need to set the variable in the OS's env
- putenv("KRB5CCNAME=" . $ticket->getCacheName());
- }
- }
-
- public function getExtraCommandLineArguments(): string {
- $this->setEnv();
- return '-k';
- }
-
- public function setExtraSmbClientOptions($smbClientState): void {
- $this->setEnv();
-
- $success = (bool)smbclient_option_set($smbClientState, SMBCLIENT_OPT_USE_KERBEROS, true);
- $success = $success && smbclient_option_set($smbClientState, SMBCLIENT_OPT_FALLBACK_AFTER_KERBEROS, false);
-
- if (!$success) {
- throw new Exception("Failed to set smbclient options for kerberos auth");
- }
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/KerberosTicket.php b/apps/files_external/3rdparty/icewind/smb/src/KerberosTicket.php
deleted file mode 100644
index c019b18119a..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/KerberosTicket.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * SPDX-FileCopyrightText: 2022 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\InvalidTicket;
-use KRB5CCache;
-
-class KerberosTicket {
- /** @var KRB5CCache */
- private $krb5;
- /** @var string */
- private $cacheName;
-
- public function __construct(KRB5CCache $krb5, string $cacheName) {
- $this->krb5 = $krb5;
- $this->cacheName = $cacheName;
- }
-
- public function getCacheName(): string {
- return $this->cacheName;
- }
-
- public function getName(): string{
- return $this->krb5->getName();
- }
-
- public function isValid(): bool {
- return count($this->krb5->getEntries()) > 0;
- }
-
- public function validate(): void {
- if (!$this->isValid()) {
- throw new InvalidTicket("No kerberos ticket found.");
- }
- }
-
- /**
- * Load the ticket from the cache specified by the KRB5CCNAME variable.
- *
- * @return KerberosTicket|null
- */
- public static function fromEnv(): ?KerberosTicket {
- $ticketName = getenv("KRB5CCNAME");
- if (!$ticketName) {
- return null;
- }
- $krb5 = new KRB5CCache();
- $krb5->open($ticketName);
- return new KerberosTicket($krb5, $ticketName);
- }
-
- public static function load(string $ticket): KerberosTicket {
- $tmpFilename = tempnam(sys_get_temp_dir(), "krb5cc_php_");
- file_put_contents($tmpFilename, $ticket);
- register_shutdown_function(function () use ($tmpFilename) {
- if (file_exists($tmpFilename)) {
- unlink($tmpFilename);
- }
- });
-
- $ticketName = "FILE:" . $tmpFilename;
- $krb5 = new KRB5CCache();
- $krb5->open($ticketName);
- return new KerberosTicket($krb5, $ticketName);
- }
-
- public function save(): string {
- if (substr($this->cacheName, 0, 5) === 'FILE:') {
- $ticket = file_get_contents(substr($this->cacheName, 5));
- } else {
- $tmpFilename = tempnam(sys_get_temp_dir(), "krb5cc_php_");
- $tmpCacheFile = "FILE:" . $tmpFilename;
- $this->krb5->save($tmpCacheFile);
- $ticket = file_get_contents($tmpFilename);
- unlink($tmpFilename);
- }
- return $ticket;
- }
-} \ No newline at end of file
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeFileInfo.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeFileInfo.php
deleted file mode 100644
index 48804afb108..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeFileInfo.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\ACL;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\NotFoundException;
-use Icewind\SMB\IFileInfo;
-
-class NativeFileInfo implements IFileInfo {
- /** @var string */
- protected $path;
- /** @var string */
- protected $name;
- /** @var NativeShare */
- protected $share;
- /** @var array{"mode": int, "size": int, "mtime": int}|null */
- protected $statCache = null;
-
- public function __construct(NativeShare $share, string $path, string $name) {
- $this->share = $share;
- $this->path = $path;
- $this->name = $name;
- }
-
- public function getPath(): string {
- return $this->path;
- }
-
- public function getName(): string {
- return $this->name;
- }
-
- /**
- * @return array{"mode": int, "size": int, "mtime": int}
- */
- protected function stat(): array {
- if (is_null($this->statCache)) {
- $this->statCache = $this->share->rawStat($this->path);
- }
- return $this->statCache;
- }
-
- public function getSize(): int {
- $stat = $this->stat();
- return $stat['size'];
- }
-
- public function getMTime(): int {
- $stat = $this->stat();
- return $stat['mtime'];
- }
-
- /**
- * On "mode":
- *
- * different smbclient versions seem to return different mode values for 'system.dos_attr.mode'
- *
- * older versions return the dos permissions mask as defined in `IFileInfo::MODE_*` while
- * newer versions return the equivalent unix permission mask.
- *
- * Since the unix mask doesn't contain the proper hidden/archive/system flags we have to assume them
- * as false (except for `hidden` where we use the unix dotfile convention)
- */
-
- protected function getMode(): int {
- $mode = $this->stat()['mode'];
-
- // Let us ignore the ATTR_NOT_CONTENT_INDEXED for now
- $mode &= ~0x00002000;
-
- return $mode;
- }
-
- public function isDirectory(): bool {
- $mode = $this->getMode();
- if ($mode > 0x1000) {
- return ($mode & 0x4000 && !($mode & 0x8000)); // 0x4000: unix directory flag shares bits with 0xC000: socket
- } else {
- return (bool)($mode & IFileInfo::MODE_DIRECTORY);
- }
- }
-
- public function isReadOnly(): bool {
- $mode = $this->getMode();
- if ($mode > 0x1000) {
- return !(bool)($mode & 0x80); // 0x80: owner write permissions
- } else {
- return (bool)($mode & IFileInfo::MODE_READONLY);
- }
- }
-
- public function isHidden(): bool {
- $mode = $this->getMode();
- if ($mode > 0x1000) {
- return strlen($this->name) > 0 && $this->name[0] === '.';
- } else {
- return (bool)($mode & IFileInfo::MODE_HIDDEN);
- }
- }
-
- public function isSystem(): bool {
- $mode = $this->getMode();
- if ($mode > 0x1000) {
- return false;
- } else {
- return (bool)($mode & IFileInfo::MODE_SYSTEM);
- }
- }
-
- public function isArchived(): bool {
- $mode = $this->getMode();
- if ($mode > 0x1000) {
- return false;
- } else {
- return (bool)($mode & IFileInfo::MODE_ARCHIVE);
- }
- }
-
- /**
- * @return ACL[]
- */
- public function getAcls(): array {
- $acls = [];
- $attribute = $this->share->getAttribute($this->path, 'system.nt_sec_desc.acl.*+');
-
- foreach (explode(',', $attribute) as $acl) {
- list($user, $permissions) = explode(':', $acl, 2);
- $user = trim($user, '\\');
- list($type, $flags, $mask) = explode('/', $permissions);
- $mask = hexdec($mask);
-
- $acls[$user] = new ACL((int)$type, (int)$flags, (int)$mask);
- }
-
- return $acls;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeReadStream.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeReadStream.php
deleted file mode 100644
index af1aa49613e..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeReadStream.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\StringBuffer;
-
-/**
- * Stream optimized for read only usage
- */
-class NativeReadStream extends NativeStream {
- const CHUNK_SIZE = 1048576; // 1MB chunks
-
- /** @var StringBuffer */
- private $readBuffer;
-
- public function __construct() {
- $this->readBuffer = new StringBuffer();
- }
-
- /** @var int */
- private $pos = 0;
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- return parent::stream_open($path, $mode, $options, $opened_path);
- }
-
- /**
- * Wrap a stream from libsmbclient-php into a regular php stream
- *
- * @param NativeState $state
- * @param resource $smbStream
- * @param string $mode
- * @param string $url
- * @return resource
- */
- public static function wrap(NativeState $state, $smbStream, string $mode, string $url) {
- return parent::wrapClass($state, $smbStream, $mode, $url, NativeReadStream::class);
- }
-
- public function stream_read($count) {
- // php reads 8192 bytes at once
- // however due to network latency etc, it's faster to read in larger chunks
- // and buffer the result
- if (!parent::stream_eof() && $this->readBuffer->remaining() < $count) {
- $chunk = parent::stream_read(self::CHUNK_SIZE);
- if ($chunk === false) {
- return false;
- }
- $this->readBuffer->push($chunk);
- }
-
- $result = $this->readBuffer->read($count);
-
- $read = strlen($result);
- $this->pos += $read;
-
- return $result;
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- $result = parent::stream_seek($offset, $whence);
- if ($result) {
- $this->readBuffer->clear();
- $pos = parent::stream_tell();
- if ($pos === false) {
- return false;
- }
- $this->pos = $pos;
- }
- return $result;
- }
-
- public function stream_eof() {
- return $this->readBuffer->remaining() <= 0 && parent::stream_eof();
- }
-
- public function stream_tell() {
- return $this->pos;
- }
-
- public function stream_write($data) {
- return false;
- }
-
- public function stream_truncate($size) {
- return false;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeServer.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeServer.php
deleted file mode 100644
index 2a9153ad549..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeServer.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\AbstractServer;
-use Icewind\SMB\Exception\AuthenticationException;
-use Icewind\SMB\Exception\InvalidHostException;
-use Icewind\SMB\IAuth;
-use Icewind\SMB\IOptions;
-use Icewind\SMB\IShare;
-use Icewind\SMB\ISystem;
-use Icewind\SMB\ITimeZoneProvider;
-
-class NativeServer extends AbstractServer {
- /**
- * @var NativeState
- */
- protected $state;
-
- public function __construct(string $host, IAuth $auth, ISystem $system, ITimeZoneProvider $timeZoneProvider, IOptions $options) {
- parent::__construct($host, $auth, $system, $timeZoneProvider, $options);
- $this->state = new NativeState();
- }
-
- protected function connect(): void {
- $this->state->init($this->getAuth(), $this->getOptions());
- }
-
- /**
- * @return IShare[]
- * @throws AuthenticationException
- * @throws InvalidHostException
- */
- public function listShares(): array {
- $this->connect();
- $shares = [];
- $dh = $this->state->opendir('smb://' . $this->getHost());
- while ($share = $this->state->readdir($dh, '')) {
- if ($share['type'] === 'file share') {
- $shares[] = $this->getShare($share['name']);
- }
- }
- $this->state->closedir($dh, '');
- return $shares;
- }
-
- public function getShare(string $name): IShare {
- return new NativeShare($this, $name);
- }
-
- /**
- * Check if the smbclient php extension is available
- *
- * @param ISystem $system
- * @return bool
- */
- public static function available(ISystem $system): bool {
- return $system->libSmbclientAvailable();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeShare.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeShare.php
deleted file mode 100644
index 0c7e3471e32..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeShare.php
+++ /dev/null
@@ -1,369 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\AbstractShare;
-use Icewind\SMB\Exception\AlreadyExistsException;
-use Icewind\SMB\Exception\AuthenticationException;
-use Icewind\SMB\Exception\ConnectionException;
-use Icewind\SMB\Exception\DependencyException;
-use Icewind\SMB\Exception\InvalidHostException;
-use Icewind\SMB\Exception\InvalidPathException;
-use Icewind\SMB\Exception\InvalidResourceException;
-use Icewind\SMB\Exception\InvalidTypeException;
-use Icewind\SMB\Exception\NotFoundException;
-use Icewind\SMB\IFileInfo;
-use Icewind\SMB\INotifyHandler;
-use Icewind\SMB\IServer;
-use Icewind\SMB\Wrapped\Server;
-use Icewind\SMB\Wrapped\Share;
-
-class NativeShare extends AbstractShare {
- /**
- * @var IServer $server
- */
- private $server;
-
- /**
- * @var string $name
- */
- private $name;
-
- /** @var NativeState|null $state */
- private $state = null;
-
- public function __construct(IServer $server, string $name) {
- parent::__construct();
- $this->server = $server;
- $this->name = $name;
- }
-
- /**
- * @throws ConnectionException
- * @throws AuthenticationException
- * @throws InvalidHostException
- */
- protected function getState(): NativeState {
- if ($this->state) {
- return $this->state;
- }
-
- $this->state = new NativeState();
- $this->state->init($this->server->getAuth(), $this->server->getOptions());
- return $this->state;
- }
-
- /**
- * Get the name of the share
- *
- * @return string
- */
- public function getName(): string {
- return $this->name;
- }
-
- private function buildUrl(string $path): string {
- $this->verifyPath($path);
- $url = sprintf('smb://%s/%s', $this->server->getHost(), $this->name);
- if ($path) {
- $path = trim($path, '/');
- $url .= '/';
- $url .= implode('/', array_map('rawurlencode', explode('/', $path)));
- }
- return $url;
- }
-
- /**
- * List the content of a remote folder
- *
- * @param string $path
- * @return IFileInfo[]
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function dir(string $path): array {
- $files = [];
-
- $dh = $this->getState()->opendir($this->buildUrl($path));
- while ($file = $this->getState()->readdir($dh, $path)) {
- $name = $file['name'];
- if ($name !== '.' and $name !== '..') {
- $fullPath = $path . '/' . $name;
- $files [] = new NativeFileInfo($this, $fullPath, $name);
- }
- }
-
- $this->getState()->closedir($dh, $path);
- return $files;
- }
-
- /**
- * @param string $path
- * @return IFileInfo
- */
- public function stat(string $path): IFileInfo {
- $info = new NativeFileInfo($this, $path, self::mb_basename($path));
-
- // trigger attribute loading
- $info->getSize();
-
- return $info;
- }
-
- /**
- * @return array{"mode": int, "size": int, "mtime": int}
- */
- public function rawStat(string $path): array {
- return $this->getState()->stat($this->buildUrl($path));
- }
-
- /**
- * Multibyte unicode safe version of basename()
- *
- * @param string $path
- * @link http://php.net/manual/en/function.basename.php#121405
- * @return string
- */
- protected static function mb_basename(string $path): string {
- if (preg_match('@^.*[\\\\/]([^\\\\/]+)$@s', $path, $matches)) {
- return $matches[1];
- } elseif (preg_match('@^([^\\\\/]+)$@s', $path, $matches)) {
- return $matches[1];
- }
-
- return '';
- }
-
- /**
- * Create a folder on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws AlreadyExistsException
- */
- public function mkdir(string $path): bool {
- return $this->getState()->mkdir($this->buildUrl($path));
- }
-
- /**
- * Remove a folder on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function rmdir(string $path): bool {
- return $this->getState()->rmdir($this->buildUrl($path));
- }
-
- /**
- * Delete a file on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function del(string $path): bool {
- return $this->getState()->unlink($this->buildUrl($path));
- }
-
- /**
- * Rename a remote file
- *
- * @param string $from
- * @param string $to
- * @return bool
- *
- * @throws NotFoundException
- * @throws AlreadyExistsException
- */
- public function rename(string $from, string $to): bool {
- return $this->getState()->rename($this->buildUrl($from), $this->buildUrl($to));
- }
-
- /**
- * Upload a local file
- *
- * @param string $source local file
- * @param string $target remove file
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function put(string $source, string $target): bool {
- $sourceHandle = fopen($source, 'rb');
- $targetUrl = $this->buildUrl($target);
-
- $targetHandle = $this->getState()->create($targetUrl);
-
- while ($data = fread($sourceHandle, NativeReadStream::CHUNK_SIZE)) {
- $this->getState()->write($targetHandle, $data, $targetUrl);
- }
- $this->getState()->close($targetHandle, $targetUrl);
- return true;
- }
-
- /**
- * Download a remote file
- *
- * @param string $source remove file
- * @param string $target local file
- * @return bool
- *
- * @throws AuthenticationException
- * @throws ConnectionException
- * @throws InvalidHostException
- * @throws InvalidPathException
- * @throws InvalidResourceException
- */
- public function get(string $source, string $target): bool {
- if (!$target) {
- throw new InvalidPathException('Invalid target path: Filename cannot be empty');
- }
-
- $sourceHandle = $this->getState()->open($this->buildUrl($source), 'r');
-
- $targetHandle = @fopen($target, 'wb');
- if (!$targetHandle) {
- $error = error_get_last();
- if (is_array($error)) {
- $reason = $error['message'];
- } else {
- $reason = 'Unknown error';
- }
- $this->getState()->close($sourceHandle, $this->buildUrl($source));
- throw new InvalidResourceException('Failed opening local file "' . $target . '" for writing: ' . $reason);
- }
-
- while ($data = $this->getState()->read($sourceHandle, NativeReadStream::CHUNK_SIZE, $source)) {
- fwrite($targetHandle, $data);
- }
- $this->getState()->close($sourceHandle, $this->buildUrl($source));
- return true;
- }
-
- /**
- * Open a readable stream to a remote file
- *
- * @param string $source
- * @return resource a read only stream with the contents of the remote file
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function read(string $source) {
- $url = $this->buildUrl($source);
- $handle = $this->getState()->open($url, 'r');
- return NativeReadStream::wrap($this->getState(), $handle, 'r', $url);
- }
-
- /**
- * Open a writeable stream to a remote file
- * Note: This method will truncate the file to 0bytes first
- *
- * @param string $target
- * @return resource a writeable stream
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function write(string $target) {
- $url = $this->buildUrl($target);
- $handle = $this->getState()->create($url);
- return NativeWriteStream::wrap($this->getState(), $handle, 'w', $url);
- }
-
- /**
- * Open a writeable stream and set the cursor to the end of the stream
- *
- * @param string $target
- * @return resource a writeable stream
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function append(string $target) {
- $url = $this->buildUrl($target);
- $handle = $this->getState()->open($url, "a+");
- return NativeWriteStream::wrap($this->getState(), $handle, "a", $url);
- }
-
- /**
- * Get extended attributes for the path
- *
- * @param string $path
- * @param string $attribute attribute to get the info
- * @return string the attribute value
- */
- public function getAttribute(string $path, string $attribute): string {
- return $this->getState()->getxattr($this->buildUrl($path), $attribute);
- }
-
- /**
- * Set extended attributes for the given path
- *
- * @param string $path
- * @param string $attribute attribute to get the info
- * @param string|int $value
- * @return mixed the attribute value
- */
- public function setAttribute(string $path, string $attribute, $value) {
- if (is_int($value)) {
- if ($attribute === 'system.dos_attr.mode') {
- $value = '0x' . dechex($value);
- } else {
- throw new \InvalidArgumentException("Invalid value for attribute");
- }
- }
-
- return $this->getState()->setxattr($this->buildUrl($path), $attribute, $value);
- }
-
- /**
- * Set DOS comaptible node mode
- *
- * @param string $path
- * @param int $mode a combination of FileInfo::MODE_READONLY, FileInfo::MODE_ARCHIVE, FileInfo::MODE_SYSTEM and FileInfo::MODE_HIDDEN, FileInfo::NORMAL
- * @return mixed
- */
- public function setMode(string $path, int $mode) {
- return $this->setAttribute($path, 'system.dos_attr.mode', $mode);
- }
-
- /**
- * Start smb notify listener
- * Note: This is a blocking call
- *
- * @param string $path
- * @return INotifyHandler
- */
- public function notify(string $path): INotifyHandler {
- // php-smbclient does not support notify (https://github.com/eduardok/libsmbclient-php/issues/29)
- // so we use the smbclient based backend for this
- if (!Server::available($this->server->getSystem())) {
- throw new DependencyException('smbclient not found in path for notify command');
- }
- $share = new Share($this->server, $this->getName(), $this->server->getSystem());
- return $share->notify($path);
- }
-
- public function getServer(): IServer {
- return $this->server;
- }
-
- public function __destruct() {
- unset($this->state);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeState.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeState.php
deleted file mode 100644
index 99cef052d55..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeState.php
+++ /dev/null
@@ -1,433 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\Exception\AlreadyExistsException;
-use Icewind\SMB\Exception\ConnectionException;
-use Icewind\SMB\Exception\ConnectionRefusedException;
-use Icewind\SMB\Exception\ConnectionResetException;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\FileInUseException;
-use Icewind\SMB\Exception\ForbiddenException;
-use Icewind\SMB\Exception\HostDownException;
-use Icewind\SMB\Exception\InvalidArgumentException;
-use Icewind\SMB\Exception\InvalidTypeException;
-use Icewind\SMB\Exception\ConnectionAbortedException;
-use Icewind\SMB\Exception\NoRouteToHostException;
-use Icewind\SMB\Exception\NotEmptyException;
-use Icewind\SMB\Exception\NotFoundException;
-use Icewind\SMB\Exception\OutOfSpaceException;
-use Icewind\SMB\Exception\TimedOutException;
-use Icewind\SMB\IAuth;
-use Icewind\SMB\IOptions;
-
-/**
- * Low level wrapper for libsmbclient-php with error handling
- */
-class NativeState {
- /** @var resource|null */
- protected $state = null;
-
- /** @var bool */
- protected $connected = false;
-
- /**
- * sync the garbage collection cycle
- * __deconstruct() of KerberosAuth should not called too soon
- *
- * @var IAuth|null $auth
- */
- protected $auth = null;
-
- // see error.h
- const EXCEPTION_MAP = [
- 1 => ForbiddenException::class,
- 2 => NotFoundException::class,
- 13 => ForbiddenException::class,
- 16 => FileInUseException::class,
- 17 => AlreadyExistsException::class,
- 20 => InvalidTypeException::class,
- 21 => InvalidTypeException::class,
- 22 => InvalidArgumentException::class,
- 28 => OutOfSpaceException::class,
- 39 => NotEmptyException::class,
- 103 => ConnectionAbortedException::class,
- 104 => ConnectionResetException::class,
- 110 => TimedOutException::class,
- 111 => ConnectionRefusedException::class,
- 112 => HostDownException::class,
- 113 => NoRouteToHostException::class
- ];
-
- protected function handleError(?string $path): void {
- if (!$this->state) {
- return;
- }
- $error = smbclient_state_errno($this->state);
- if ($error === 0) {
- return;
- }
- throw Exception::fromMap(self::EXCEPTION_MAP, $error, $path);
- }
-
- /**
- * @param mixed $result
- * @param string|null $uri
- * @throws Exception
- */
- protected function testResult($result, ?string $uri): void {
- if ($result === false or $result === null) {
- // smb://host/share/path
- if (is_string($uri) && count(explode('/', $uri, 5)) > 4) {
- list(, , , , $path) = explode('/', $uri, 5);
- $path = '/' . $path;
- } else {
- $path = $uri;
- }
- $this->handleError($path);
- }
- }
-
- /**
- * @param IAuth $auth
- * @param IOptions $options
- * @return bool
- */
- public function init(IAuth $auth, IOptions $options) {
- if ($this->connected) {
- return true;
- }
- /** @var resource $state */
- $state = smbclient_state_new();
- $this->state = $state;
- /** @psalm-suppress UnusedFunctionCall */
- smbclient_option_set($this->state, SMBCLIENT_OPT_AUTO_ANONYMOUS_LOGIN, false);
- /** @psalm-suppress UnusedFunctionCall */
- smbclient_option_set($this->state, SMBCLIENT_OPT_TIMEOUT, $options->getTimeout() * 1000);
-
- if (function_exists('smbclient_client_protocols')) {
- smbclient_client_protocols($this->state, $options->getMinProtocol(), $options->getMaxProtocol());
- }
-
- $auth->setExtraSmbClientOptions($this->state);
-
- // sync the garbage collection cycle
- // __deconstruct() of KerberosAuth should not caled too soon
- $this->auth = $auth;
-
- $result = @smbclient_state_init($this->state, $auth->getWorkgroup(), $auth->getUsername(), $auth->getPassword());
-
- $this->testResult($result, '');
- $this->connected = true;
- return $result;
- }
-
- /**
- * @param string $uri
- * @return resource
- */
- public function opendir(string $uri) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var resource $result */
- $result = @smbclient_opendir($this->state, $uri);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param resource $dir
- * @param string $path
- * @return array{"type": string, "comment": string, "name": string}|false
- */
- public function readdir($dir, string $path) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var array{"type": string, "comment": string, "name": string}|false $result */
- $result = @smbclient_readdir($this->state, $dir);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param resource $dir
- * @param string $path
- * @return bool
- */
- public function closedir($dir, string $path): bool {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- $result = @smbclient_closedir($this->state, $dir);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param string $old
- * @param string $new
- * @return bool
- */
- public function rename(string $old, string $new): bool {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- $result = @smbclient_rename($this->state, $old, $this->state, $new);
-
- $this->testResult($result, $new);
- return $result;
- }
-
- /**
- * @param string $uri
- * @return bool
- */
- public function unlink(string $uri): bool {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- $result = @smbclient_unlink($this->state, $uri);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param string $uri
- * @param int $mask
- * @return bool
- */
- public function mkdir(string $uri, int $mask = 0777): bool {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- $result = @smbclient_mkdir($this->state, $uri, $mask);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param string $uri
- * @return bool
- */
- public function rmdir(string $uri): bool {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- $result = @smbclient_rmdir($this->state, $uri);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param string $uri
- * @return array{"mtime": int, "size": int, "mode": int}
- */
- public function stat(string $uri): array {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var array{"mtime": int, "size": int, "mode": int} $result */
- $result = @smbclient_stat($this->state, $uri);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param resource $file
- * @param string $path
- * @return array{"mtime": int, "size": int, "mode": int}
- */
- public function fstat($file, string $path): array {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var array{"mtime": int, "size": int, "mode": int} $result */
- $result = @smbclient_fstat($this->state, $file);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param string $uri
- * @param string $mode
- * @param int $mask
- * @return resource
- */
- public function open(string $uri, string $mode, int $mask = 0666) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var resource $result */
- $result = @smbclient_open($this->state, $uri, $mode, $mask);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param string $uri
- * @param int $mask
- * @return resource
- */
- public function create(string $uri, int $mask = 0666) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var resource $result */
- $result = @smbclient_creat($this->state, $uri, $mask);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param resource $file
- * @param int $bytes
- * @param string $path
- * @return string
- */
- public function read($file, int $bytes, string $path): string {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var string $result */
- $result = @smbclient_read($this->state, $file, $bytes);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param resource $file
- * @param string $data
- * @param string $path
- * @param int|null $length
- * @return int
- */
- public function write($file, string $data, string $path, ?int $length = null): int {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- if ($length) {
- $result = @smbclient_write($this->state, $file, $data, $length);
- } else {
- $result = @smbclient_write($this->state, $file, $data);
- }
-
- $this->testResult($result, $path);
- if ($result === false) {
- return 0;
- }
- return $result;
- }
-
- /**
- * @param resource $file
- * @param int $offset
- * @param int $whence SEEK_SET | SEEK_CUR | SEEK_END
- * @param string|null $path
- *
- * @return false|int new file offset as measured from the start of the file on success.
- */
- public function lseek($file, int $offset, int $whence = SEEK_SET, string $path = null) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- // psalm doesn't think int|false == int|false for some reason, so we do a needless annotation to help it out
- /**
- * @psalm-suppress UnnecessaryVarAnnotation
- * @var int|false $result
- */
- $result = @smbclient_lseek($this->state, $file, $offset, $whence);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param resource $file
- * @param int $size
- * @param string $path
- * @return bool
- */
- public function ftruncate($file, int $size, string $path): bool {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- $result = @smbclient_ftruncate($this->state, $file, $size);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param resource $file
- * @param string $path
- * @return bool
- */
- public function close($file, string $path): bool {
- if (!$this->state) {
- return false;
- }
- $result = @smbclient_close($this->state, $file);
-
- $this->testResult($result, $path);
- return $result;
- }
-
- /**
- * @param string $uri
- * @param string $key
- * @return string
- */
- public function getxattr(string $uri, string $key) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var string $result */
- $result = @smbclient_getxattr($this->state, $uri, $key);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- /**
- * @param string $uri
- * @param string $key
- * @param string $value
- * @param int $flags
- * @return bool
- */
- public function setxattr(string $uri, string $key, string $value, int $flags = 0) {
- if (!$this->state) {
- throw new ConnectionException("Not connected");
- }
- /** @var bool $result */
- $result = @smbclient_setxattr($this->state, $uri, $key, $value, $flags);
-
- $this->testResult($result, $uri);
- return $result;
- }
-
- public function __destruct() {
- if ($this->connected && $this->state) {
- if (smbclient_state_free($this->state) === false) {
- throw new Exception("Failed to free smb state");
- }
- }
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeStream.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeStream.php
deleted file mode 100644
index 6916660906f..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeStream.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\InvalidRequestException;
-use Icewind\Streams\File;
-use InvalidArgumentException;
-
-abstract class NativeStream implements File {
- /**
- * @var resource
- * @psalm-suppress PropertyNotSetInConstructor
- */
- public $context;
-
- /**
- * @var NativeState
- * @psalm-suppress PropertyNotSetInConstructor
- */
- protected $state;
-
- /**
- * @var resource
- * @psalm-suppress PropertyNotSetInConstructor
- */
- protected $handle;
-
- /**
- * @var bool
- */
- protected $eof = false;
-
- /**
- * @var string
- */
- protected $url = '';
-
- /**
- * Wrap a stream from libsmbclient-php into a regular php stream
- *
- * @param NativeState $state
- * @param resource $smbStream
- * @param string $mode
- * @param string $url
- * @param class-string<NativeStream> $class
- * @return resource
- */
- protected static function wrapClass(NativeState $state, $smbStream, string $mode, string $url, string $class) {
- if (stream_wrapper_register('nativesmb', $class) === false) {
- throw new Exception("Failed to register stream wrapper");
- }
- $context = stream_context_create([
- 'nativesmb' => [
- 'state' => $state,
- 'handle' => $smbStream,
- 'url' => $url
- ]
- ]);
- $fh = fopen('nativesmb://', $mode, false, $context);
- if (stream_wrapper_unregister('nativesmb') === false) {
- throw new Exception("Failed to unregister stream wrapper");
- }
- return $fh;
- }
-
- public function stream_close() {
- try {
- return $this->state->close($this->handle, $this->url);
- } catch (\Exception $e) {
- return false;
- }
- }
-
- public function stream_eof() {
- return $this->eof;
- }
-
- public function stream_flush() {
- return false;
- }
-
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $context = stream_context_get_options($this->context);
- if (!isset($context['nativesmb']) || !is_array($context['nativesmb'])) {
- throw new InvalidArgumentException("context not set");
- }
- $state = $context['nativesmb']['state'];
- if (!$state instanceof NativeState) {
- throw new InvalidArgumentException("invalid context set");
- }
- $this->state = $state;
- $handle = $context['nativesmb']['handle'];
- if (!is_resource($handle)) {
- throw new InvalidArgumentException("invalid context set");
- }
- $this->handle = $handle;
- $url = $context['nativesmb']['url'];
- if (!is_string($url)) {
- throw new InvalidArgumentException("invalid context set");
- }
- $this->url = $url;
- return true;
- }
-
- public function stream_read($count) {
- $result = $this->state->read($this->handle, $count, $this->url);
- if (strlen($result) < $count) {
- $this->eof = true;
- }
- return $result;
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- $this->eof = false;
- try {
- return $this->state->lseek($this->handle, $offset, $whence, $this->url) !== false;
- } catch (InvalidRequestException $e) {
- return false;
- }
- }
-
- /**
- * @return array{"mtime": int, "size": int, "mode": int}|false
- */
- public function stream_stat() {
- try {
- return $this->state->fstat($this->handle, $this->url);
- } catch (Exception $e) {
- return false;
- }
- }
-
- public function stream_tell() {
- return $this->state->lseek($this->handle, 0, SEEK_CUR, $this->url);
- }
-
- public function stream_write($data) {
- return $this->state->write($this->handle, $data, $this->url);
- }
-
- public function stream_truncate($size) {
- return $this->state->ftruncate($this->handle, $size, $this->url);
- }
-
- public function stream_set_option($option, $arg1, $arg2) {
- return false;
- }
-
- public function stream_lock($operation) {
- return false;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeWriteStream.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeWriteStream.php
deleted file mode 100644
index f09c80eec7c..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Native/NativeWriteStream.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Native;
-
-use Icewind\SMB\StringBuffer;
-
-/**
- * Stream optimized for write only usage
- */
-class NativeWriteStream extends NativeStream {
- const CHUNK_SIZE = 1048576; // 1MB chunks
-
- /** @var StringBuffer */
- private $writeBuffer;
-
- /** @var int */
- private $pos = 0;
-
- public function __construct() {
- $this->writeBuffer = new StringBuffer();
- }
-
- public function stream_open($path, $mode, $options, &$opened_path): bool {
- return parent::stream_open($path, $mode, $options, $opened_path);
- }
-
- /**
- * Wrap a stream from libsmbclient-php into a regular php stream
- *
- * @param NativeState $state
- * @param resource $smbStream
- * @param string $mode
- * @param string $url
- * @return resource
- */
- public static function wrap(NativeState $state, $smbStream, string $mode, string $url) {
- return parent::wrapClass($state, $smbStream, $mode, $url, NativeWriteStream::class);
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- $this->flushWrite();
- $result = parent::stream_seek($offset, $whence);
- if ($result) {
- $pos = parent::stream_tell();
- if ($pos === false) {
- return false;
- }
- $this->pos = $pos;
- }
- return $result;
- }
-
- private function flushWrite(): void {
- parent::stream_write($this->writeBuffer->flush());
- }
-
- public function stream_write($data) {
- $written = $this->writeBuffer->push($data);
- $this->pos += $written;
-
- if ($this->writeBuffer->remaining() >= self::CHUNK_SIZE) {
- $this->flushWrite();
- }
-
- return $written;
- }
-
- public function stream_close() {
- try {
- $this->flushWrite();
- $flushResult = true;
- } catch (\Exception $e) {
- $flushResult = false;
- }
- return parent::stream_close() && $flushResult;
- }
-
- public function stream_tell() {
- return $this->pos;
- }
-
- public function stream_read($count) {
- return false;
- }
-
- public function stream_truncate($size) {
- $this->flushWrite();
- $this->pos = $size;
- return parent::stream_truncate($size);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Options.php b/apps/files_external/3rdparty/icewind/smb/src/Options.php
deleted file mode 100644
index f250d4defb3..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Options.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-class Options implements IOptions {
- /** @var int */
- private $timeout = 20;
-
- /** @var string|null */
- private $minProtocol;
- /** @var string|null */
- private $maxProtocol;
-
- public function getTimeout(): int {
- return $this->timeout;
- }
-
- public function setTimeout(int $timeout): void {
- $this->timeout = $timeout;
- }
-
- public function getMinProtocol(): ?string {
- return $this->minProtocol;
- }
-
- public function setMinProtocol(?string $minProtocol): void {
- $this->minProtocol = $minProtocol;
- }
-
- public function getMaxProtocol(): ?string {
- return $this->maxProtocol;
- }
-
- public function setMaxProtocol(?string $maxProtocol): void {
- $this->maxProtocol = $maxProtocol;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php b/apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php
deleted file mode 100644
index ee7e5af83bb..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\DependencyException;
-use Icewind\SMB\Native\NativeServer;
-use Icewind\SMB\Wrapped\Server;
-
-class ServerFactory {
- const BACKENDS = [
- NativeServer::class,
- Server::class
- ];
-
- /** @var ISystem */
- private $system;
-
- /** @var IOptions */
- private $options;
-
- /** @var ITimeZoneProvider */
- private $timeZoneProvider;
-
- /**
- * ServerFactory constructor.
- *
- * @param IOptions|null $options
- * @param ISystem|null $system
- * @param ITimeZoneProvider|null $timeZoneProvider
- */
- public function __construct(
- ?IOptions $options = null,
- ?ISystem $system = null,
- ?ITimeZoneProvider $timeZoneProvider = null
- ) {
- if (is_null($options)) {
- $options = new Options();
- }
- if (is_null($system)) {
- $system = new System();
- }
- if (is_null($timeZoneProvider)) {
- $timeZoneProvider = new TimeZoneProvider($system);
- }
- $this->options = $options;
- $this->system = $system;
- $this->timeZoneProvider = $timeZoneProvider;
- }
-
-
- /**
- * @param string $host
- * @param IAuth $credentials
- * @return IServer
- * @throws DependencyException
- */
- public function createServer(string $host, IAuth $credentials): IServer {
- foreach (self::BACKENDS as $backend) {
- if (call_user_func("$backend::available", $this->system)) {
- return new $backend($host, $credentials, $this->system, $this->timeZoneProvider, $this->options);
- }
- }
-
- throw new DependencyException('No valid backend available, ensure smbclient is in the path or php-smbclient is installed');
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/StringBuffer.php b/apps/files_external/3rdparty/icewind/smb/src/StringBuffer.php
deleted file mode 100644
index 56d14edb857..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/StringBuffer.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * SPDX-FileCopyrightText: 2021 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\SMB;
-
-class StringBuffer {
- /** @var string */
- private $buffer = "";
- /** @var int */
- private $pos = 0;
-
- public function clear(): void {
- $this->buffer = "";
- $this->pos = 0;
- }
-
- public function push(string $data): int {
- $this->buffer = $this->flush() . $data;
- return strlen($data);
- }
-
- public function remaining(): int {
- return strlen($this->buffer) - $this->pos;
- }
-
- public function read(int $count): string {
- $chunk = substr($this->buffer, $this->pos, $count);
- $this->pos += strlen($chunk);
- return $chunk;
- }
-
- public function flush(): string {
- if ($this->pos === 0) {
- $remaining = $this->buffer;
- } else {
- $remaining = substr($this->buffer, $this->pos);
- }
-
- $this->clear();
-
- return $remaining;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/System.php b/apps/files_external/3rdparty/icewind/smb/src/System.php
deleted file mode 100644
index 2867b8eec42..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/System.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB;
-
-use Icewind\SMB\Exception\Exception;
-
-class System implements ISystem {
- /** @var (string|null)[] */
- private $paths = [];
-
- /**
- * Get the path to a file descriptor of the current process
- *
- * @param int $num the file descriptor id
- * @return string
- * @throws Exception
- */
- public function getFD(int $num): string {
- $folders = [
- '/proc/self/fd',
- '/dev/fd'
- ];
- foreach ($folders as $folder) {
- if (file_exists($folder)) {
- return $folder . '/' . $num;
- }
- }
- throw new Exception('Cant find file descriptor path');
- }
-
- public function getSmbclientPath(): ?string {
- return $this->getBinaryPath('smbclient');
- }
-
- public function getNetPath(): ?string {
- return $this->getBinaryPath('net');
- }
-
- public function getSmbcAclsPath(): ?string {
- return $this->getBinaryPath('smbcacls');
- }
-
- public function getStdBufPath(): ?string {
- return $this->getBinaryPath('stdbuf');
- }
-
- public function getDatePath(): ?string {
- return $this->getBinaryPath('date');
- }
-
- public function libSmbclientAvailable(): bool {
- return function_exists('smbclient_state_new');
- }
-
- protected function getBinaryPath(string $binary): ?string {
- if (!isset($this->paths[$binary])) {
- $result = null;
- $output = [];
- exec("which $binary 2>&1", $output, $result);
-
- if ($result === 0 && isset($output[0])) {
- $this->paths[$binary] = (string)$output[0];
- } elseif (is_executable("/usr/bin/$binary")) {
- $this->paths[$binary] = "/usr/bin/$binary";
- } else {
- $this->paths[$binary] = null;
- }
- }
- return $this->paths[$binary];
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/TimeZoneProvider.php b/apps/files_external/3rdparty/icewind/smb/src/TimeZoneProvider.php
deleted file mode 100644
index f1d2c38f634..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/TimeZoneProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2015 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-namespace Icewind\SMB;
-
-class TimeZoneProvider implements ITimeZoneProvider {
- /**
- * @var string[]
- */
- private $timeZones = [];
-
- /**
- * @var ISystem
- */
- private $system;
-
- /**
- * @param ISystem $system
- */
- public function __construct(ISystem $system) {
- $this->system = $system;
- }
-
- public function get(string $host): string {
- if (!isset($this->timeZones[$host])) {
- $timeZone = null;
- $net = $this->system->getNetPath();
- // for local domain names we can assume same timezone
- if ($net && $host && strpos($host, '.') !== false) {
- $command = sprintf(
- '%s time zone -S %s',
- $net,
- escapeshellarg($host)
- );
- $timeZone = exec($command);
- }
-
- if (!$timeZone) {
- $date = $this->system->getDatePath();
- if ($date) {
- $timeZone = exec($date . " +%z");
- } else {
- $timeZone = date_default_timezone_get();
- }
- }
- $this->timeZones[$host] = $timeZone;
- }
- return $this->timeZones[$host];
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Connection.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Connection.php
deleted file mode 100644
index 95e63fb16d9..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Connection.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\Exception\AccessDeniedException;
-use Icewind\SMB\Exception\AuthenticationException;
-use Icewind\SMB\Exception\ConnectException;
-use Icewind\SMB\Exception\ConnectionException;
-use Icewind\SMB\Exception\ConnectionRefusedException;
-use Icewind\SMB\Exception\InvalidHostException;
-use Icewind\SMB\Exception\NoLoginServerException;
-
-class Connection extends RawConnection {
- const DELIMITER = 'smb:';
- const DELIMITER_LENGTH = 4;
-
- /** @var Parser */
- private $parser;
-
- /**
- * @param string $command
- * @param Parser $parser
- * @param array<string, string> $env
- */
- public function __construct(string $command, Parser $parser, array $env = []) {
- parent::__construct($command, $env);
- $this->parser = $parser;
- }
-
- /**
- * send input to smbclient
- *
- * @param string $input
- */
- public function write(string $input) {
- return parent::write($input . PHP_EOL);
- }
-
- /**
- * @throws ConnectException
- */
- public function clearTillPrompt(): void {
- $this->write('');
- do {
- $promptLine = $this->readTillPrompt();
- if ($promptLine === false) {
- break;
- }
- $this->parser->checkConnectionError($promptLine);
- } while (!$this->isPrompt($promptLine));
- if ($this->write('') === false) {
- throw new ConnectionRefusedException();
- }
- $this->readTillPrompt();
- }
-
- /**
- * get all unprocessed output from smbclient until the next prompt
- *
- * @return string[]
- * @throws AuthenticationException
- * @throws ConnectException
- * @throws ConnectionException
- * @throws InvalidHostException
- * @throws NoLoginServerException
- * @throws AccessDeniedException
- */
- public function read(): array {
- if (!$this->isValid()) {
- throw new ConnectionException('Connection not valid');
- }
- $output = $this->readTillPrompt();
- if ($output === false) {
- $this->unknownError(false);
- }
- $output = explode("\n", $output);
- // last line contains the prompt
- array_pop($output);
- return $output;
- }
-
- private function isPrompt(string $line): bool {
- return substr($line, 0, self::DELIMITER_LENGTH) === self::DELIMITER;
- }
-
- /**
- * @param string|bool $promptLine (optional) prompt line that might contain some info about the error
- * @throws ConnectException
- * @return no-return
- */
- private function unknownError($promptLine = '') {
- if ($promptLine) { //maybe we have some error we missed on the previous line
- throw new ConnectException('Unknown error (' . $promptLine . ')');
- } else {
- $error = $this->readError(); // maybe something on stderr
- if ($error) {
- throw new ConnectException('Unknown error (stderr: ' . $error . ')');
- } else {
- throw new ConnectException('Unknown error');
- }
- }
- }
-
- public function close(bool $terminate = true): void {
- if (get_resource_type($this->getInputStream()) === 'stream') {
- // ignore any errors while trying to send the close command, the process might already be dead
- @$this->write('close' . PHP_EOL);
- }
- $this->close_process($terminate);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/ErrorCodes.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/ErrorCodes.php
deleted file mode 100644
index c053f7b4a8e..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/ErrorCodes.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-class ErrorCodes {
- /**
- * connection errors
- */
- const LogonFailure = 'NT_STATUS_LOGON_FAILURE';
- const BadHostName = 'NT_STATUS_BAD_NETWORK_NAME';
- const Unsuccessful = 'NT_STATUS_UNSUCCESSFUL';
- const ConnectionRefused = 'NT_STATUS_CONNECTION_REFUSED';
- const NoLogonServers = 'NT_STATUS_NO_LOGON_SERVERS';
-
- const PathNotFound = 'NT_STATUS_OBJECT_PATH_NOT_FOUND';
- const NoSuchFile = 'NT_STATUS_NO_SUCH_FILE';
- const ObjectNotFound = 'NT_STATUS_OBJECT_NAME_NOT_FOUND';
- const NameCollision = 'NT_STATUS_OBJECT_NAME_COLLISION';
- const AccessDenied = 'NT_STATUS_ACCESS_DENIED';
- const DirectoryNotEmpty = 'NT_STATUS_DIRECTORY_NOT_EMPTY';
- const FileIsADirectory = 'NT_STATUS_FILE_IS_A_DIRECTORY';
- const NotADirectory = 'NT_STATUS_NOT_A_DIRECTORY';
- const SharingViolation = 'NT_STATUS_SHARING_VIOLATION';
- const InvalidParameter = 'NT_STATUS_INVALID_PARAMETER';
- const RevisionMismatch = 'NT_STATUS_REVISION_MISMATCH';
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/FileInfo.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/FileInfo.php
deleted file mode 100644
index 5e957bd6fec..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/FileInfo.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\ACL;
-use Icewind\SMB\IFileInfo;
-
-class FileInfo implements IFileInfo {
- /** @var string */
- protected $path;
- /** @var string */
- protected $name;
- /** @var int */
- protected $size;
- /** @var int */
- protected $time;
- /** @var int */
- protected $mode;
- /** @var callable(): ACL[] */
- protected $aclCallback;
-
- /**
- * @param string $path
- * @param string $name
- * @param int $size
- * @param int $time
- * @param int $mode
- * @param callable(): ACL[] $aclCallback
- */
- public function __construct(string $path, string $name, int $size, int $time, int $mode, callable $aclCallback) {
- $this->path = $path;
- $this->name = $name;
- $this->size = $size;
- $this->time = $time;
- $this->mode = $mode;
- $this->aclCallback = $aclCallback;
- }
-
- /**
- * @return string
- */
- public function getPath(): string {
- return $this->path;
- }
-
- public function getName(): string {
- return $this->name;
- }
-
- public function getSize(): int {
- return $this->size;
- }
-
- public function getMTime(): int {
- return $this->time;
- }
-
- public function isDirectory(): bool {
- return (bool)($this->mode & IFileInfo::MODE_DIRECTORY);
- }
-
- public function isReadOnly(): bool {
- return (bool)($this->mode & IFileInfo::MODE_READONLY);
- }
-
- public function isHidden(): bool {
- return (bool)($this->mode & IFileInfo::MODE_HIDDEN);
- }
-
- public function isSystem(): bool {
- return (bool)($this->mode & IFileInfo::MODE_SYSTEM);
- }
-
- public function isArchived(): bool {
- return (bool)($this->mode & IFileInfo::MODE_ARCHIVE);
- }
-
- /**
- * @return ACL[]
- */
- public function getAcls(): array {
- return ($this->aclCallback)();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/NotifyHandler.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/NotifyHandler.php
deleted file mode 100644
index 7063873460d..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/NotifyHandler.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2016 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\Change;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\RevisionMismatchException;
-use Icewind\SMB\INotifyHandler;
-
-class NotifyHandler implements INotifyHandler {
- /** @var Connection */
- private $connection;
-
- /** @var string */
- private $path;
-
- /** @var bool */
- private $listening = true;
-
- // see error.h
- const EXCEPTION_MAP = [
- ErrorCodes::RevisionMismatch => RevisionMismatchException::class,
- ];
-
- /**
- * @param Connection $connection
- * @param string $path
- */
- public function __construct(Connection $connection, string $path) {
- $this->connection = $connection;
- $this->path = $path;
- }
-
- /**
- * Get all changes detected since the start of the notify process or the last call to getChanges
- *
- * @return Change[]
- */
- public function getChanges(): array {
- if (!$this->listening) {
- return [];
- }
- stream_set_blocking($this->connection->getOutputStream(), false);
- $lines = [];
- while (($line = $this->connection->readLine())) {
- $this->checkForError($line);
- $lines[] = $line;
- }
- stream_set_blocking($this->connection->getOutputStream(), true);
- return array_values(array_filter(array_map([$this, 'parseChangeLine'], $lines)));
- }
-
- /**
- * Listen actively to all incoming changes
- *
- * Note that this is a blocking process and will cause the process to block forever if not explicitly terminated
- *
- * @param callable(Change):?bool $callback
- */
- public function listen(callable $callback): void {
- if ($this->listening) {
- while (true) {
- $line = $this->connection->readLine();
- if ($line === false) {
- break;
- }
- $this->checkForError($line);
- $change = $this->parseChangeLine($line);
- if ($change) {
- $result = $callback($change);
- if ($result === false) {
- break;
- }
- }
- };
- }
- }
-
- private function parseChangeLine(string $line): ?Change {
- $code = (int)substr($line, 0, 4);
- if ($code === 0) {
- return null;
- }
- $subPath = str_replace('\\', '/', substr($line, 5));
- if ($this->path === '') {
- return new Change($code, $subPath);
- } else {
- return new Change($code, $this->path . '/' . $subPath);
- }
- }
-
- private function checkForError(string $line): void {
- if (substr($line, 0, 16) === 'notify returned ') {
- $error = substr($line, 16);
- throw Exception::fromMap(array_merge(self::EXCEPTION_MAP, Parser::EXCEPTION_MAP), $error, 'Notify is not supported with the used smb version');
- }
- }
-
- public function stop(): void {
- $this->listening = false;
- $this->connection->close();
- }
-
- public function __destruct() {
- $this->stop();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Parser.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Parser.php
deleted file mode 100644
index 06812ee61ef..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Parser.php
+++ /dev/null
@@ -1,276 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\ACL;
-use Icewind\SMB\Exception\AccessDeniedException;
-use Icewind\SMB\Exception\AlreadyExistsException;
-use Icewind\SMB\Exception\AuthenticationException;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\FileInUseException;
-use Icewind\SMB\Exception\InvalidHostException;
-use Icewind\SMB\Exception\InvalidParameterException;
-use Icewind\SMB\Exception\InvalidResourceException;
-use Icewind\SMB\Exception\InvalidTypeException;
-use Icewind\SMB\Exception\NoLoginServerException;
-use Icewind\SMB\Exception\NotEmptyException;
-use Icewind\SMB\Exception\NotFoundException;
-
-class Parser {
- const MSG_NOT_FOUND = 'Error opening local file ';
-
- /**
- * @var string
- */
- protected $timeZone;
-
- // see error.h
- const EXCEPTION_MAP = [
- ErrorCodes::LogonFailure => AuthenticationException::class,
- ErrorCodes::PathNotFound => NotFoundException::class,
- ErrorCodes::ObjectNotFound => NotFoundException::class,
- ErrorCodes::NoSuchFile => NotFoundException::class,
- ErrorCodes::NameCollision => AlreadyExistsException::class,
- ErrorCodes::AccessDenied => AccessDeniedException::class,
- ErrorCodes::DirectoryNotEmpty => NotEmptyException::class,
- ErrorCodes::FileIsADirectory => InvalidTypeException::class,
- ErrorCodes::NotADirectory => InvalidTypeException::class,
- ErrorCodes::SharingViolation => FileInUseException::class,
- ErrorCodes::InvalidParameter => InvalidParameterException::class
- ];
-
- const MODE_STRINGS = [
- 'R' => FileInfo::MODE_READONLY,
- 'H' => FileInfo::MODE_HIDDEN,
- 'S' => FileInfo::MODE_SYSTEM,
- 'D' => FileInfo::MODE_DIRECTORY,
- 'A' => FileInfo::MODE_ARCHIVE,
- 'N' => FileInfo::MODE_NORMAL
- ];
-
- /**
- * @param string $timeZone
- */
- public function __construct(string $timeZone) {
- $this->timeZone = $timeZone;
- }
-
- private function getErrorCode(string $line): ?string {
- $parts = explode(' ', $line);
- foreach ($parts as $part) {
- if (substr($part, 0, 9) === 'NT_STATUS') {
- return $part;
- }
- }
- return null;
- }
-
- /**
- * @param string[] $output
- * @param string $path
- * @return no-return
- * @throws Exception
- * @throws InvalidResourceException
- * @throws NotFoundException
- */
- public function checkForError(array $output, string $path): void {
- if (strpos($output[0], 'does not exist')) {
- throw new NotFoundException($path);
- }
- $error = $this->getErrorCode($output[0]);
-
- if (substr($output[0], 0, strlen(self::MSG_NOT_FOUND)) === self::MSG_NOT_FOUND) {
- $localPath = substr($output[0], strlen(self::MSG_NOT_FOUND));
- throw new InvalidResourceException('Failed opening local file "' . $localPath . '" for writing');
- }
-
- throw Exception::fromMap(self::EXCEPTION_MAP, $error, $path);
- }
-
- /**
- * check if the first line holds a connection failure
- *
- * @param string $line
- * @throws AuthenticationException
- * @throws InvalidHostException
- * @throws NoLoginServerException
- * @throws AccessDeniedException
- */
- public function checkConnectionError(string $line): void {
- $line = rtrim($line, ')');
- if (substr($line, -23) === ErrorCodes::LogonFailure) {
- throw new AuthenticationException('Invalid login');
- }
- if (substr($line, -26) === ErrorCodes::BadHostName) {
- throw new InvalidHostException('Invalid hostname');
- }
- if (substr($line, -22) === ErrorCodes::Unsuccessful) {
- throw new InvalidHostException('Connection unsuccessful');
- }
- if (substr($line, -28) === ErrorCodes::ConnectionRefused) {
- throw new InvalidHostException('Connection refused');
- }
- if (substr($line, -26) === ErrorCodes::NoLogonServers) {
- throw new NoLoginServerException('No login server');
- }
- if (substr($line, -23) === ErrorCodes::AccessDenied) {
- throw new AccessDeniedException('Access denied');
- }
- }
-
- public function parseMode(string $mode): int {
- $result = 0;
- foreach (self::MODE_STRINGS as $char => $val) {
- if (strpos($mode, $char) !== false) {
- $result |= $val;
- }
- }
- return $result;
- }
-
- /**
- * @param string[] $output
- * @return array{"mtime": int, "mode": int, "size": int}
- * @throws Exception
- */
- public function parseStat(array $output): array {
- $data = [];
- foreach ($output as $line) {
- // A line = explode statement may not fill all array elements
- // properly. May happen when accessing non Windows Fileservers
- $words = explode(':', $line, 2);
- $name = isset($words[0]) ? $words[0] : '';
- $value = isset($words[1]) ? $words[1] : '';
- $value = trim($value);
-
- if (!isset($data[$name])) {
- $data[$name] = $value;
- }
- }
- $attributeStart = strpos($data['attributes'], '(');
- if ($attributeStart === false) {
- throw new Exception("Malformed state response from server");
- }
- return [
- 'mtime' => strtotime($data['write_time']),
- 'mode' => hexdec(substr($data['attributes'], $attributeStart + 1, -1)),
- 'size' => isset($data['stream']) ? (int)(explode(' ', $data['stream'])[1]) : 0
- ];
- }
-
- /**
- * @param string[] $output
- * @param string $basePath
- * @param callable(string):ACL[] $aclCallback
- * @return FileInfo[]
- */
- public function parseDir(array $output, string $basePath, callable $aclCallback): array {
- //last line is used space
- array_pop($output);
- $regex = '/^\s*(.*?)\s\s\s\s+(?:([NDHARSCndharsc]*)\s+)?([0-9]+)\s+(.*)$/';
- //2 spaces, filename, optional type, size, date
- $content = [];
- foreach ($output as $line) {
- if (preg_match($regex, $line, $matches)) {
- list(, $name, $mode, $size, $time) = $matches;
- if ($name !== '.' and $name !== '..') {
- $mode = $this->parseMode(strtoupper($mode));
- $time = strtotime($time . ' ' . $this->timeZone);
- $path = $basePath . '/' . $name;
- $content[] = new FileInfo($path, $name, (int)$size, $time, $mode, function () use ($aclCallback, $path): array {
- return $aclCallback($path);
- });
- }
- }
- }
- return $content;
- }
-
- /**
- * @param string[] $output
- * @return array<string, string>
- */
- public function parseListShares(array $output): array {
- $shareNames = [];
- foreach ($output as $line) {
- if (strpos($line, '|')) {
- list($type, $name, $description) = explode('|', $line);
- if (strtolower($type) === 'disk') {
- $shareNames[$name] = $description;
- }
- } elseif (strpos($line, 'Disk')) {
- // new output format
- list($name, $description) = explode('Disk', $line);
- $shareNames[trim($name)] = trim($description);
- }
- }
- return $shareNames;
- }
-
- /**
- * @param string[] $rawAcls
- * @return ACL[]
- */
- public function parseACLs(array $rawAcls): array {
- $acls = [];
- foreach ($rawAcls as $acl) {
- if (strpos($acl, ':') === false) {
- continue;
- }
- [$type, $acl] = explode(':', $acl, 2);
- if ($type !== 'ACL') {
- continue;
- }
- [$user, $permissions] = explode(':', $acl, 2);
- [$type, $flags, $mask] = explode('/', $permissions);
-
- $type = $type === 'ALLOWED' ? ACL::TYPE_ALLOW : ACL::TYPE_DENY;
-
- $flagsInt = 0;
- foreach (explode('|', $flags) as $flagString) {
- if ($flagString === 'OI') {
- $flagsInt += ACL::FLAG_OBJECT_INHERIT;
- } elseif ($flagString === 'CI') {
- $flagsInt += ACL::FLAG_CONTAINER_INHERIT;
- }
- }
-
- if (substr($mask, 0, 2) === '0x') {
- $maskInt = hexdec($mask);
- } else {
- $maskInt = 0;
- foreach (explode('|', $mask) as $maskString) {
- if ($maskString === 'R') {
- $maskInt += ACL::MASK_READ;
- } elseif ($maskString === 'W') {
- $maskInt += ACL::MASK_WRITE;
- } elseif ($maskString === 'X') {
- $maskInt += ACL::MASK_EXECUTE;
- } elseif ($maskString === 'D') {
- $maskInt += ACL::MASK_DELETE;
- } elseif ($maskString === 'READ') {
- $maskInt += ACL::MASK_READ + ACL::MASK_EXECUTE;
- } elseif ($maskString === 'CHANGE') {
- $maskInt += ACL::MASK_READ + ACL::MASK_EXECUTE + ACL::MASK_WRITE + ACL::MASK_DELETE;
- } elseif ($maskString === 'FULL') {
- $maskInt += ACL::MASK_READ + ACL::MASK_EXECUTE + ACL::MASK_WRITE + ACL::MASK_DELETE;
- }
- }
- }
-
- if (isset($acls[$user])) {
- $existing = $acls[$user];
- $maskInt += $existing->getMask();
- }
- $acls[$user] = new ACL($type, $flagsInt, $maskInt);
- }
-
- ksort($acls);
-
- return $acls;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/RawConnection.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/RawConnection.php
deleted file mode 100644
index 13828d28334..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/RawConnection.php
+++ /dev/null
@@ -1,250 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\Exception\ConnectException;
-use Icewind\SMB\Exception\ConnectionException;
-
-class RawConnection {
- /**
- * @var string
- */
- private $command;
-
- /**
- * @var string[]
- */
- private $env;
-
- /**
- * @var resource[] $pipes
- *
- * $pipes[0] holds STDIN for smbclient
- * $pipes[1] holds STDOUT for smbclient
- * $pipes[3] holds the authfile for smbclient
- * $pipes[4] holds the stream for writing files
- * $pipes[5] holds the stream for reading files
- */
- private $pipes = [];
-
- /**
- * @var resource|null $process
- */
- private $process;
-
- /**
- * @var resource|null $authStream
- */
- private $authStream = null;
-
- /**
- * @param string $command
- * @param array<string, string> $env
- */
- public function __construct(string $command, array $env = []) {
- $this->command = $command;
- $this->env = $env;
- }
-
- /**
- * @throws ConnectException
- * @psalm-assert resource $this->process
- */
- public function connect(): void {
- if (is_null($this->getAuthStream())) {
- throw new ConnectException('Authentication not set before connecting');
- }
-
- $descriptorSpec = [
- 0 => ['pipe', 'r'], // child reads from stdin
- 1 => ['pipe', 'w'], // child writes to stdout
- 2 => ['pipe', 'w'], // child writes to stderr
- 3 => $this->getAuthStream(), // child reads from fd#3
- 4 => ['pipe', 'r'], // child reads from fd#4
- 5 => ['pipe', 'w'] // child writes to fd#5
- ];
-
- setlocale(LC_ALL, Server::LOCALE);
- $env = array_merge($this->env, [
- 'CLI_FORCE_INTERACTIVE' => 'y', // Make sure the prompt is displayed
- 'CLI_NO_READLINE' => 1, // Not all distros build smbclient with readline, disable it to get consistent behaviour
- 'LC_ALL' => Server::LOCALE,
- 'LANG' => Server::LOCALE,
- 'COLUMNS' => 8192, // prevent smbclient from line-wrapping it's output
- 'TZ' => 'UTC',
- ]);
- $this->process = proc_open($this->command, $descriptorSpec, $this->pipes, '/', $env);
- if (!$this->isValid()) {
- throw new ConnectionException();
- }
- }
-
- /**
- * check if the connection is still active
- *
- * @return bool
- * @psalm-assert-if-true resource $this->process
- */
- public function isValid(): bool {
- if (is_resource($this->process)) {
- $status = proc_get_status($this->process);
- return $status['running'];
- } else {
- return false;
- }
- }
-
- /**
- * send input to the process
- *
- * @param string $input
- * @return int|bool
- */
- public function write(string $input) {
- $result = @fwrite($this->getInputStream(), $input);
- fflush($this->getInputStream());
- return $result;
- }
-
- /**
- * read output till the next prompt
- *
- * @return string|false
- */
- public function readTillPrompt() {
- $output = "";
- do {
- $chunk = $this->readLine('\> ');
- if ($chunk === false) {
- return false;
- }
- $output .= $chunk;
- } while (strlen($chunk) == 4096 && strpos($chunk, "smb:") === false);
- return $output;
- }
-
- /**
- * read a line of output
- *
- * @return string|false
- */
- public function readLine(string $end = "\n") {
- return stream_get_line($this->getOutputStream(), 4096, $end);
- }
-
- /**
- * read a line of output
- *
- * @return string|false
- */
- public function readError() {
- $line = stream_get_line($this->getErrorStream(), 4086);
- return $line !== false ? trim($line) : false;
- }
-
- /**
- * get all output until the process closes
- *
- * @return string[]
- */
- public function readAll(): array {
- $output = [];
- while ($line = $this->readLine()) {
- $output[] = $line;
- }
- return $output;
- }
-
- /**
- * @return resource
- */
- public function getInputStream() {
- return $this->pipes[0];
- }
-
- /**
- * @return resource
- */
- public function getOutputStream() {
- return $this->pipes[1];
- }
-
- /**
- * @return resource
- */
- public function getErrorStream() {
- return $this->pipes[2];
- }
-
- /**
- * @return resource|null
- */
- public function getAuthStream() {
- return $this->authStream;
- }
-
- /**
- * @return resource
- */
- public function getFileInputStream() {
- return $this->pipes[4];
- }
-
- /**
- * @return resource
- */
- public function getFileOutputStream() {
- return $this->pipes[5];
- }
-
- /**
- * @param string|null $user
- * @param string|null $password
- * @psalm-assert resource $this->authStream
- */
- public function writeAuthentication(?string $user, ?string $password): void {
- $auth = ($password === null)
- ? "username=$user"
- : "username=$user\npassword=$password\n";
-
- $this->authStream = fopen('php://temp', 'w+');
- fwrite($this->authStream, $auth);
- rewind($this->authStream);
- }
-
- /**
- * @param bool $terminate
- * @psalm-assert null $this->process
- */
- public function close(bool $terminate = true): void {
- $this->close_process($terminate);
- }
-
- /**
- * @param bool $terminate
- * @psalm-assert null $this->process
- */
- protected function close_process(bool $terminate = true): void {
- if (!is_resource($this->process)) {
- return;
- }
- if ($terminate) {
- proc_terminate($this->process);
- }
- proc_close($this->process);
- $this->process = null;
- }
-
- public function reconnect(): void {
- $this->close();
- $this->connect();
- }
-
- public function __destruct() {
- $this->close();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php
deleted file mode 100644
index 6d6052966f7..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\AbstractServer;
-use Icewind\SMB\Exception\AuthenticationException;
-use Icewind\SMB\Exception\ConnectException;
-use Icewind\SMB\Exception\ConnectionException;
-use Icewind\SMB\Exception\ConnectionRefusedException;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\InvalidHostException;
-use Icewind\SMB\IShare;
-use Icewind\SMB\ISystem;
-
-class Server extends AbstractServer {
- /**
- * Check if the smbclient php extension is available
- *
- * @param ISystem $system
- * @return bool
- */
- public static function available(ISystem $system): bool {
- return $system->getSmbclientPath() !== null;
- }
-
- private function getAuthFileArgument(): string {
- if ($this->getAuth()->getUsername()) {
- return '--authentication-file=' . $this->system->getFD(3);
- } else {
- return '';
- }
- }
-
- /**
- * @return IShare[]
- *
- * @throws AuthenticationException
- * @throws InvalidHostException
- * @throws ConnectException
- */
- public function listShares(): array {
- $maxProtocol = $this->options->getMaxProtocol();
- $minProtocol = $this->options->getMinProtocol();
- $smbClient = $this->system->getSmbclientPath();
- if ($smbClient === null) {
- throw new Exception("Backend not available");
- }
- $command = sprintf(
- '%s %s %s %s %s -L %s',
- $smbClient,
- $this->getAuthFileArgument(),
- $this->getAuth()->getExtraCommandLineArguments(),
- $maxProtocol ? "--option='client max protocol=" . $maxProtocol . "'" : "",
- $minProtocol ? "--option='client min protocol=" . $minProtocol . "'" : "",
- escapeshellarg('//' . $this->getHost())
- );
- $connection = new RawConnection($command);
- $connection->writeAuthentication($this->getAuth()->getUsername(), $this->getAuth()->getPassword());
- $connection->connect();
- if (!$connection->isValid()) {
- throw new ConnectionException((string)$connection->readLine());
- }
-
- $parser = new Parser('UTC');
-
- $output = $connection->readAll();
- if (isset($output[0])) {
- $parser->checkConnectionError($output[0]);
- }
-
- // sometimes we get an empty line first
- if (count($output) < 2) {
- $output = $connection->readAll();
- }
-
- if (isset($output[0])) {
- $parser->checkConnectionError($output[0]);
- }
- if (count($output) === 0) {
- throw new ConnectionRefusedException();
- }
-
- $shareNames = $parser->parseListShares($output);
-
- $shares = [];
- foreach ($shareNames as $name => $_description) {
- $shares[] = $this->getShare($name);
- }
- return $shares;
- }
-
- /**
- * @param string $name
- * @return IShare
- */
- public function getShare(string $name): IShare {
- return new Share($this, $name, $this->system);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Share.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Share.php
deleted file mode 100644
index 63e1490d72c..00000000000
--- a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Share.php
+++ /dev/null
@@ -1,553 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\SMB\Wrapped;
-
-use Icewind\SMB\AbstractShare;
-use Icewind\SMB\ACL;
-use Icewind\SMB\Exception\AlreadyExistsException;
-use Icewind\SMB\Exception\AuthenticationException;
-use Icewind\SMB\Exception\ConnectException;
-use Icewind\SMB\Exception\ConnectionException;
-use Icewind\SMB\Exception\DependencyException;
-use Icewind\SMB\Exception\Exception;
-use Icewind\SMB\Exception\FileInUseException;
-use Icewind\SMB\Exception\InvalidHostException;
-use Icewind\SMB\Exception\InvalidTypeException;
-use Icewind\SMB\Exception\NotFoundException;
-use Icewind\SMB\Exception\InvalidRequestException;
-use Icewind\SMB\IFileInfo;
-use Icewind\SMB\INotifyHandler;
-use Icewind\SMB\IServer;
-use Icewind\SMB\ISystem;
-use Icewind\Streams\CallbackWrapper;
-use Icewind\SMB\Native\NativeShare;
-use Icewind\SMB\Native\NativeServer;
-
-class Share extends AbstractShare {
- /**
- * @var IServer $server
- */
- private $server;
-
- /**
- * @var string $name
- */
- private $name;
-
- /**
- * @var Connection|null $connection
- */
- public $connection = null;
-
- /**
- * @var Parser
- */
- protected $parser;
-
- /**
- * @var ISystem
- */
- private $system;
-
- const MODE_MAP = [
- FileInfo::MODE_READONLY => 'r',
- FileInfo::MODE_HIDDEN => 'h',
- FileInfo::MODE_ARCHIVE => 'a',
- FileInfo::MODE_SYSTEM => 's'
- ];
-
- const EXEC_CMD = 'exec';
-
- /**
- * @param IServer $server
- * @param string $name
- * @param ISystem $system
- */
- public function __construct(IServer $server, string $name, ISystem $system) {
- parent::__construct();
- $this->server = $server;
- $this->name = $name;
- $this->system = $system;
- $this->parser = new Parser('UTC');
- }
-
- private function getAuthFileArgument(): string {
- if ($this->server->getAuth()->getUsername()) {
- return '--authentication-file=' . $this->system->getFD(3);
- } else {
- return '';
- }
- }
-
- protected function getConnection(): Connection {
- $maxProtocol = $this->server->getOptions()->getMaxProtocol();
- $minProtocol = $this->server->getOptions()->getMinProtocol();
- $smbClient = $this->system->getSmbclientPath();
- $stdBuf = $this->system->getStdBufPath();
- if ($smbClient === null) {
- throw new Exception("Backend not available");
- }
- $command = sprintf(
- '%s %s%s -t %s %s %s %s %s %s',
- self::EXEC_CMD,
- $stdBuf ? $stdBuf . ' -o0 ' : '',
- $smbClient,
- $this->server->getOptions()->getTimeout(),
- $this->getAuthFileArgument(),
- $this->server->getAuth()->getExtraCommandLineArguments(),
- $maxProtocol ? "--option='client max protocol=" . $maxProtocol . "'" : "",
- $minProtocol ? "--option='client min protocol=" . $minProtocol . "'" : "",
- escapeshellarg('//' . $this->server->getHost() . '/' . $this->name)
- );
- $connection = new Connection($command, $this->parser);
- $connection->writeAuthentication($this->server->getAuth()->getUsername(), $this->server->getAuth()->getPassword());
- $connection->connect();
- if (!$connection->isValid()) {
- throw new ConnectionException((string)$connection->readLine());
- }
- // some versions of smbclient add a help message in first of the first prompt
- $connection->clearTillPrompt();
- return $connection;
- }
-
- /**
- * @throws ConnectionException
- * @throws AuthenticationException
- * @throws InvalidHostException
- * @psalm-assert Connection $this->connection
- */
- protected function connect(): Connection {
- if ($this->connection and $this->connection->isValid()) {
- return $this->connection;
- }
- $this->connection = $this->getConnection();
- return $this->connection;
- }
-
- /**
- * @throws ConnectionException
- * @throws AuthenticationException
- * @throws InvalidHostException
- * @psalm-assert Connection $this->connection
- */
- protected function reconnect(): void {
- if ($this->connection === null) {
- $this->connect();
- } else {
- $this->connection->reconnect();
- if (!$this->connection->isValid()) {
- throw new ConnectionException();
- }
- }
- }
-
- /**
- * Get the name of the share
- *
- * @return string
- */
- public function getName(): string {
- return $this->name;
- }
-
- protected function simpleCommand(string $command, string $path): bool {
- $escapedPath = $this->escapePath($path);
- $cmd = $command . ' ' . $escapedPath;
- $output = $this->execute($cmd);
- return $this->parseOutput($output, $path);
- }
-
- /**
- * List the content of a remote folder
- *
- * @param string $path
- * @return IFileInfo[]
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function dir(string $path): array {
- $escapedPath = $this->escapePath($path);
- $output = $this->execute('cd ' . $escapedPath);
- //check output for errors
- $this->parseOutput($output, $path);
- $output = $this->execute('dir');
-
- $this->execute('cd /');
-
- return $this->parser->parseDir($output, $path, function (string $path) {
- return $this->getAcls($path);
- });
- }
-
- /**
- * @param string $path
- * @return IFileInfo
- */
- public function stat(string $path): IFileInfo {
- // some windows server setups don't seem to like the allinfo command
- // use the dir command instead to get the file info where possible
- if ($path !== "" && $path !== "/") {
- $parent = dirname($path);
- $dir = $this->dir($parent);
- $file = array_values(array_filter($dir, function (IFileInfo $info) use ($path) {
- return $info->getPath() === $path;
- }));
- if ($file) {
- return $file[0];
- }
- }
-
- $escapedPath = $this->escapePath($path);
- $output = $this->execute('allinfo ' . $escapedPath);
- // Windows and non Windows Fileserver may respond different
- // to the allinfo command for directories. If the result is a single
- // line = error line, redo it with a different allinfo parameter
- if ($escapedPath == '""' && count($output) < 2) {
- $output = $this->execute('allinfo ' . '"."');
- }
- if (count($output) < 3) {
- $this->parseOutput($output, $path);
- }
- $stat = $this->parser->parseStat($output);
- return new FileInfo($path, basename($path), $stat['size'], $stat['mtime'], $stat['mode'], function () use ($path) {
- return $this->getAcls($path);
- });
- }
-
- /**
- * Create a folder on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws AlreadyExistsException
- */
- public function mkdir(string $path): bool {
- return $this->simpleCommand('mkdir', $path);
- }
-
- /**
- * Remove a folder on the share
- *
- * @param string $path
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function rmdir(string $path): bool {
- return $this->simpleCommand('rmdir', $path);
- }
-
- /**
- * Delete a file on the share
- *
- * @param string $path
- * @param bool $secondTry
- * @return bool
- * @throws InvalidTypeException
- * @throws NotFoundException
- * @throws \Exception
- */
- public function del(string $path, bool $secondTry = false): bool {
- //del return a file not found error when trying to delete a folder
- //we catch it so we can check if $path doesn't exist or is of invalid type
- try {
- return $this->simpleCommand('del', $path);
- } catch (NotFoundException $e) {
- //no need to do anything with the result, we just check if this throws the not found error
- try {
- $this->simpleCommand('ls', $path);
- } catch (NotFoundException $e2) {
- throw $e;
- } catch (\Exception $e2) {
- throw new InvalidTypeException($path);
- }
- throw $e;
- } catch (FileInUseException $e) {
- if ($secondTry) {
- throw $e;
- }
- $this->reconnect();
- return $this->del($path, true);
- }
- }
-
- /**
- * Rename a remote file
- *
- * @param string $from
- * @param string $to
- * @return bool
- *
- * @throws NotFoundException
- * @throws AlreadyExistsException
- */
- public function rename(string $from, string $to): bool {
- $path1 = $this->escapePath($from);
- $path2 = $this->escapePath($to);
- $output = $this->execute('rename ' . $path1 . ' ' . $path2);
- return $this->parseOutput($output, $to);
- }
-
- /**
- * Upload a local file
- *
- * @param string $source local file
- * @param string $target remove file
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function put(string $source, string $target): bool {
- $path1 = $this->escapeLocalPath($source); //first path is local, needs different escaping
- $path2 = $this->escapePath($target);
- $output = $this->execute('put ' . $path1 . ' ' . $path2);
- return $this->parseOutput($output, $target);
- }
-
- /**
- * Download a remote file
- *
- * @param string $source remove file
- * @param string $target local file
- * @return bool
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function get(string $source, string $target): bool {
- $path1 = $this->escapePath($source);
- $path2 = $this->escapeLocalPath($target); //second path is local, needs different escaping
- $output = $this->execute('get ' . $path1 . ' ' . $path2);
- return $this->parseOutput($output, $source);
- }
-
- /**
- * Open a readable stream to a remote file
- *
- * @param string $source
- * @return resource a read only stream with the contents of the remote file
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function read(string $source) {
- $source = $this->escapePath($source);
- // since returned stream is closed by the caller we need to create a new instance
- // since we can't re-use the same file descriptor over multiple calls
- $connection = $this->getConnection();
- stream_set_blocking($connection->getOutputStream(), false);
-
- $connection->write('get ' . $source . ' ' . $this->system->getFD(5));
- $connection->write('exit');
- $fh = $connection->getFileOutputStream();
- $fh = CallbackWrapper::wrap($fh, function() use ($connection) {
- $connection->write('');
- });
- if (!is_resource($fh)) {
- throw new Exception("Failed to wrap file output");
- }
- return $fh;
- }
-
- /**
- * Open a writable stream to a remote file
- *
- * @param string $target
- * @return resource a write only stream to upload a remote file
- *
- * @throws NotFoundException
- * @throws InvalidTypeException
- */
- public function write(string $target) {
- $target = $this->escapePath($target);
- // since returned stream is closed by the caller we need to create a new instance
- // since we can't re-use the same file descriptor over multiple calls
- $connection = $this->getConnection();
-
- $fh = $connection->getFileInputStream();
- $connection->write('put ' . $this->system->getFD(4) . ' ' . $target);
- $connection->write('exit');
-
- // use a close callback to ensure the upload is finished before continuing
- // this also serves as a way to keep the connection in scope
- $stream = CallbackWrapper::wrap($fh, function() use ($connection) {
- $connection->write('');
- }, null, function () use ($connection) {
- $connection->close(false); // dont terminate, give the upload some time
- });
- if (is_resource($stream)) {
- return $stream;
- } else {
- throw new InvalidRequestException($target);
- }
- }
-
- /**
- * Append to stream
- * Note: smbclient does not support this (Use php-libsmbclient)
- *
- * @param string $target
- *
- * @throws DependencyException
- */
- public function append(string $target) {
- throw new DependencyException('php-libsmbclient is required for append');
- }
-
- /**
- * @param string $path
- * @param int $mode a combination of FileInfo::MODE_READONLY, FileInfo::MODE_ARCHIVE, FileInfo::MODE_SYSTEM and FileInfo::MODE_HIDDEN, FileInfo::NORMAL
- * @return mixed
- */
- public function setMode(string $path, int $mode) {
- $modeString = '';
- foreach (self::MODE_MAP as $modeByte => $string) {
- if ($mode & $modeByte) {
- $modeString .= $string;
- }
- }
- $path = $this->escapePath($path);
-
- // first reset the mode to normal
- $cmd = 'setmode ' . $path . ' -rsha';
- $output = $this->execute($cmd);
- $this->parseOutput($output, $path);
-
- if ($mode !== FileInfo::MODE_NORMAL) {
- // then set the modes we want
- $cmd = 'setmode ' . $path . ' ' . $modeString;
- $output = $this->execute($cmd);
- return $this->parseOutput($output, $path);
- } else {
- return true;
- }
- }
-
- /**
- * @param string $path
- * @return INotifyHandler
- * @throws ConnectionException
- * @throws DependencyException
- */
- public function notify(string $path): INotifyHandler {
- if (!$this->system->getStdBufPath()) { //stdbuf is required to disable smbclient's output buffering
- throw new DependencyException('stdbuf is required for usage of the notify command');
- }
- $connection = $this->getConnection(); // use a fresh connection since the notify command blocks the process
- $command = 'notify ' . $this->escapePath($path);
- $connection->write($command . PHP_EOL);
- return new NotifyHandler($connection, $path);
- }
-
- /**
- * @param string $command
- * @return string[]
- */
- protected function execute(string $command): array {
- $this->connect()->write($command);
- return $this->connect()->read();
- }
-
- /**
- * check output for errors
- *
- * @param string[] $lines
- * @param string $path
- *
- * @return bool
- * @throws AlreadyExistsException
- * @throws \Icewind\SMB\Exception\AccessDeniedException
- * @throws \Icewind\SMB\Exception\NotEmptyException
- * @throws InvalidTypeException
- * @throws \Icewind\SMB\Exception\Exception
- * @throws NotFoundException
- */
- protected function parseOutput(array $lines, string $path = ''): bool {
- if (count($lines) === 0) {
- return true;
- } else {
- $this->parser->checkForError($lines, $path);
- }
- }
-
- /**
- * @param string $string
- * @return string
- */
- protected function escape(string $string): string {
- return escapeshellarg($string);
- }
-
- /**
- * @param string $path
- * @return string
- */
- protected function escapePath(string $path): string {
- $this->verifyPath($path);
- if ($path === '/') {
- $path = '';
- }
- $path = str_replace('/', '\\', $path);
- $path = str_replace('"', '^"', $path);
- $path = ltrim($path, '\\');
- return '"' . $path . '"';
- }
-
- /**
- * @param string $path
- * @return string
- */
- protected function escapeLocalPath(string $path): string {
- $path = str_replace('"', '\"', $path);
- return '"' . $path . '"';
- }
-
- /**
- * @param string $path
- * @return ACL[]
- * @throws ConnectionException
- * @throws ConnectException
- */
- protected function getAcls(string $path): array {
- $commandPath = $this->system->getSmbcAclsPath();
- if (!$commandPath) {
- return [];
- }
-
- $command = sprintf(
- '%s %s %s %s/%s %s',
- $commandPath,
- $this->getAuthFileArgument(),
- $this->server->getAuth()->getExtraCommandLineArguments(),
- escapeshellarg('//' . $this->server->getHost()),
- escapeshellarg($this->name),
- escapeshellarg($path)
- );
- $connection = new RawConnection($command);
- $connection->writeAuthentication($this->server->getAuth()->getUsername(), $this->server->getAuth()->getPassword());
- $connection->connect();
- if (!$connection->isValid()) {
- throw new ConnectionException((string)$connection->readLine());
- }
-
- $rawAcls = $connection->readAll();
- return $this->parser->parseACLs($rawAcls);
- }
-
- public function getServer(): IServer {
- return $this->server;
- }
-
- public function __destruct() {
- unset($this->connection);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams-dummy/composer.json b/apps/files_external/3rdparty/icewind/streams-dummy/composer.json
deleted file mode 100644
index ad6a6a1b1c1..00000000000
--- a/apps/files_external/3rdparty/icewind/streams-dummy/composer.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "icewind/streams-dummy",
- "provide": {
- "icewind/streams": "0.2"
- }
-}
-
diff --git a/apps/files_external/3rdparty/icewind/streams-dummy/composer.json.license b/apps/files_external/3rdparty/icewind/streams-dummy/composer.json.license
deleted file mode 100644
index 99ba7368b14..00000000000
--- a/apps/files_external/3rdparty/icewind/streams-dummy/composer.json.license
+++ /dev/null
@@ -1,2 +0,0 @@
-SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
-SPDX-License-Identifier: MIT
diff --git a/apps/files_external/3rdparty/icewind/streams/.gitignore b/apps/files_external/3rdparty/icewind/streams/.gitignore
deleted file mode 100644
index ad93d8acd1a..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
-# SPDX-License-Identifier: MIT
-.idea
-vendor
-composer.lock
-build
-example.php
-*.cache
diff --git a/apps/files_external/3rdparty/icewind/streams/LICENSE.txt b/apps/files_external/3rdparty/icewind/streams/LICENSE.txt
deleted file mode 100644
index 2cc1fa91e49..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/LICENSE.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 Robin Appelman <robin@icewind.nl>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/apps/files_external/3rdparty/icewind/streams/README.md b/apps/files_external/3rdparty/icewind/streams/README.md
deleted file mode 100644
index c8b9accdadc..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
- - SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- - SPDX-License-Identifier: MIT
--->
-# Streams #
-
-[![CI](https://github.com/icewind1991/Streams/actions/workflows/ci.yaml/badge.svg)](https://github.com/icewind1991/Streams/actions/workflows/ci.yaml)
-[![codecov](https://codecov.io/gh/icewind1991/Streams/branch/master/graph/badge.svg?token=bfPcAdGAaq)](https://codecov.io/gh/icewind1991/Streams)
-
-Generic stream wrappers for php.
-
-## CallBackWrapper ##
-
-A `CallBackWrapper` can be used to register callbacks on read, write and closing of the stream,
-it wraps an existing stream and can thus be used for any stream in php
-
-The callbacks are passed in the stream context along with the source stream
-and can be any valid [php callable](http://php.net/manual/en/language.types.callable.php)
-
-### Example ###
-```php
-<?php
-
-use \Icewind\Streams\CallBackWrapper;
-
-require('vendor/autoload.php');
-
-// get an existing stream to wrap
-$source = fopen('php://temp', 'r+');
-
-// register the callbacks
-$stream = CallbackWrapper::wrap($source,
- // read callback
- function ($count) {
- echo "read " . $count . "bytes\n";
- },
- // write callback
- function ($data) {
- echo "wrote '" . $data . "'\n";
- },
- // close callback
- function () {
- echo "stream closed\n";
- });
-
-fwrite($stream, 'some dummy data');
-
-rewind($stream);
-fread($stream, 5);
-
-fclose($stream);
-```
-
-Note: due to php's internal stream buffering the `$count` passed to the read callback
-will be equal to php's internal buffer size (8192 on default) an not the number of bytes
-requested by `fopen()`
diff --git a/apps/files_external/3rdparty/icewind/streams/composer.json b/apps/files_external/3rdparty/icewind/streams/composer.json
deleted file mode 100644
index 2a148158fbc..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/composer.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "name": "icewind/streams",
- "description": "A set of generic stream wrappers",
- "license": "MIT",
- "authors": [
- {
- "name": "Robin Appelman",
- "email": "icewind@owncloud.com"
- }
- ],
- "require": {
- "php": ">=7.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9",
- "friendsofphp/php-cs-fixer": "^2",
- "phpstan/phpstan": "^0.12"
- },
- "autoload": {
- "psr-4": {
- "Icewind\\Streams\\": "src/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "Icewind\\Streams\\Tests\\": "tests/"
- }
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/composer.json.license b/apps/files_external/3rdparty/icewind/streams/composer.json.license
deleted file mode 100644
index 99ba7368b14..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/composer.json.license
+++ /dev/null
@@ -1,2 +0,0 @@
-SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
-SPDX-License-Identifier: MIT
diff --git a/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php
deleted file mode 100644
index a50aa05c7ca..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/CallbackWrapper.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-namespace Icewind\Streams;
-
-/**
- * Wrapper that provides callbacks for write, read and close
- *
- * The following options should be passed in the context when opening the stream
- * [
- * 'callback' => [
- * 'source' => resource
- * 'read' => function($count){} (optional)
- * 'write' => function($data){} (optional)
- * 'close' => function(){} (optional)
- * 'readdir' => function(){} (optional)
- * ]
- * ]
- *
- * All callbacks are called after the operation is executed on the source stream
- */
-class CallbackWrapper extends Wrapper {
- /**
- * @var callable|null
- */
- protected $readCallback;
-
- /**
- * @var callable|null
- */
- protected $writeCallback;
-
- /**
- * @var callable|null
- */
- protected $closeCallback;
-
- /**
- * @var callable|null
- */
- protected $readDirCallBack;
-
- /**
- * @var callable|null
- */
- protected $preCloseCallback;
-
- /**
- * Wraps a stream with the provided callbacks
- *
- * @param resource $source
- * @param callable|null $read (optional)
- * @param callable|null $write (optional)
- * @param callable|null $close (optional)
- * @param callable|null $readDir (optional)
- * @param callable|null $preClose (optional)
- * @return resource|false
- *
- */
- public static function wrap($source, $read = null, $write = null, $close = null, $readDir = null, $preClose = null) {
- $context = [
- 'source' => $source,
- 'read' => $read,
- 'write' => $write,
- 'close' => $close,
- 'readDir' => $readDir,
- 'preClose' => $preClose,
- ];
- return self::wrapSource($source, $context);
- }
-
- protected function open() {
- $context = $this->loadContext();
-
- $this->readCallback = $context['read'];
- $this->writeCallback = $context['write'];
- $this->closeCallback = $context['close'];
- $this->readDirCallBack = $context['readDir'];
- $this->preCloseCallback = $context['preClose'];
- return true;
- }
-
- public function dir_opendir($path, $options) {
- return $this->open();
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- return $this->open();
- }
-
- public function stream_read($count) {
- $result = parent::stream_read($count);
- if (is_callable($this->readCallback)) {
- call_user_func($this->readCallback, strlen($result));
- }
- return $result;
- }
-
- public function stream_write($data) {
- $result = parent::stream_write($data);
- if (is_callable($this->writeCallback)) {
- call_user_func($this->writeCallback, $data);
- }
- return $result;
- }
-
- public function stream_close() {
- if (is_callable($this->preCloseCallback)) {
- call_user_func($this->preCloseCallback, $this->source);
- // prevent further calls by potential PHP 7 GC ghosts
- $this->preCloseCallback = null;
- }
- $result = parent::stream_close();
- if (is_callable($this->closeCallback)) {
- call_user_func($this->closeCallback);
- // prevent further calls by potential PHP 7 GC ghosts
- $this->closeCallback = null;
- }
- return $result;
- }
-
- public function dir_readdir() {
- $result = parent::dir_readdir();
- if (is_callable($this->readDirCallBack)) {
- call_user_func($this->readDirCallBack);
- }
- return $result;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/CountWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/CountWrapper.php
deleted file mode 100644
index d1427dd97af..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/CountWrapper.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2018 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper that counts the amount of data read and written
- *
- * The following options should be passed in the context when opening the stream
- * [
- * 'callback' => [
- * 'source' => resource
- * 'callback' => function($readCount, $writeCount){}
- * ]
- * ]
- *
- * The callback will be called when the stream is closed
- */
-class CountWrapper extends Wrapper {
- /**
- * @var int
- */
- protected $readCount = 0;
-
- /**
- * @var int
- */
- protected $writeCount = 0;
-
- /**
- * @var callable
- */
- protected $callback;
-
- /**
- * Wraps a stream with the provided callbacks
- *
- * @param resource $source
- * @param callable $callback
- * @return resource|false
- *
- * @throws \BadMethodCallException
- */
- public static function wrap($source, $callback) {
- if (!is_callable($callback)) {
- throw new \InvalidArgumentException('Invalid or missing callback');
- }
- return self::wrapSource($source, [
- 'source' => $source,
- 'callback' => $callback
- ]);
- }
-
- protected function open() {
- $context = $this->loadContext();
- $this->callback = $context['callback'];
- return true;
- }
-
- public function dir_opendir($path, $options) {
- return $this->open();
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- return $this->open();
- }
-
- public function stream_read($count) {
- $result = parent::stream_read($count);
- $this->readCount += strlen($result);
- return $result;
- }
-
- public function stream_write($data) {
- $result = parent::stream_write($data);
- $this->writeCount += strlen($data);
- return $result;
- }
-
- public function stream_close() {
- $result = parent::stream_close();
- call_user_func($this->callback, $this->readCount, $this->writeCount);
- return $result;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Directory.php b/apps/files_external/3rdparty/icewind/streams/src/Directory.php
deleted file mode 100644
index 3a4d01e67c8..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/Directory.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Interface for stream wrappers that implements a directory
- */
-interface Directory {
- /**
- * @param string $path
- * @param array $options
- * @return bool
- */
- public function dir_opendir($path, $options);
-
- /**
- * @return string|bool
- */
- public function dir_readdir();
-
- /**
- * @return bool
- */
- public function dir_closedir();
-
- /**
- * @return bool
- */
- public function dir_rewinddir();
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php b/apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php
deleted file mode 100644
index 3df6a37f281..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/DirectoryFilter.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2015 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper allows filtering of directories
- *
- * The filter callback will be called for each entry in the folder
- * when the callback return false the entry will be filtered out
- */
-class DirectoryFilter extends DirectoryWrapper {
- /**
- * @var callable
- */
- private $filter;
-
- /**
- * @param string $path
- * @param array $options
- * @return bool
- */
- public function dir_opendir($path, $options) {
- $context = $this->loadContext();
- $this->filter = $context['filter'];
- return true;
- }
-
- /**
- * @return string
- */
- public function dir_readdir() {
- $file = readdir($this->source);
- $filter = $this->filter;
- // keep reading until we have an accepted entry or we're at the end of the folder
- while ($file !== false && $filter($file) === false) {
- $file = readdir($this->source);
- }
- return $file;
- }
-
- /**
- * @param resource $source
- * @param callable $filter
- * @return resource|false
- */
- public static function wrap($source, callable $filter) {
- return self::wrapSource($source, [
- 'source' => $source,
- 'filter' => $filter
- ]);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php
deleted file mode 100644
index fbae56a88cf..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/DirectoryWrapper.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2015 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-class DirectoryWrapper extends Wrapper implements Directory {
- public function stream_open($path, $mode, $options, &$opened_path) {
- return false;
- }
-
- /**
- * @param string $path
- * @param array $options
- * @return bool
- */
- public function dir_opendir($path, $options) {
- $this->loadContext();
- return true;
- }
-
- /**
- * @return string|false
- */
- public function dir_readdir() {
- return readdir($this->source);
- }
-
- /**
- * @return bool
- */
- public function dir_closedir() {
- closedir($this->source);
- return true;
- }
-
- /**
- * @return bool
- */
- public function dir_rewinddir() {
- rewinddir($this->source);
- return true;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/File.php b/apps/files_external/3rdparty/icewind/streams/src/File.php
deleted file mode 100644
index 249c92d1a4e..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/File.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Interface for stream wrappers that implements a file
- */
-interface File {
- /**
- * @param string $path
- * @param string $mode
- * @param int $options
- * @param string $opened_path
- * @return bool
- */
- public function stream_open($path, $mode, $options, &$opened_path);
-
- /**
- * @param int $offset
- * @param int $whence
- * @return bool
- */
- public function stream_seek($offset, $whence = SEEK_SET);
-
- /**
- * @return int|false
- */
- public function stream_tell();
-
- /**
- * @param int $count
- * @return string|false
- */
- public function stream_read($count);
-
- /**
- * @param string $data
- * @return int|false
- */
- public function stream_write($data);
-
- /**
- * @param int $option
- * @param int $arg1
- * @param int $arg2
- * @return bool
- */
- public function stream_set_option($option, $arg1, $arg2);
-
- /**
- * @param int $size
- * @return bool
- */
- public function stream_truncate($size);
-
- /**
- * @return array|false
- */
- public function stream_stat();
-
- /**
- * @param int $operation
- * @return bool
- */
- public function stream_lock($operation);
-
- /**
- * @return bool
- */
- public function stream_flush();
-
- /**
- * @return bool
- */
- public function stream_eof();
-
- /**
- * @return bool
- */
- public function stream_close();
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/HashWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/HashWrapper.php
deleted file mode 100644
index 7fb739e0d49..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/HashWrapper.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2019 Roeland Jago Douma <roeland@famdouma.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\Streams;
-
-abstract class HashWrapper extends Wrapper {
-
- /**
- * @var callable|null
- */
- private $callback;
-
- /**
- * @var resource|\HashContext
- */
- private $hashContext;
-
- /**
- * Wraps a stream to make it seekable
- *
- * @param resource $source
- * @param string $hash
- * @param callable $callback
- * @return resource|false
- *
- * @throws \BadMethodCallException
- */
- public static function wrap($source, $hash, $callback) {
- $context = [
- 'hash' => $hash,
- 'callback' => $callback,
- ];
- return self::wrapSource($source, $context);
- }
-
- public function dir_opendir($path, $options) {
- return false;
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $context = $this->loadContext();
- $this->callback = $context['callback'];
- $this->hashContext = hash_init($context['hash']);
- return true;
- }
-
- protected function updateHash($data) {
- hash_update($this->hashContext, $data);
- }
-
- public function stream_close() {
- $hash = hash_final($this->hashContext);
- if ($this->hashContext !== false && is_callable($this->callback)) {
- call_user_func($this->callback, $hash);
- }
- return parent::stream_close();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php b/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php
deleted file mode 100644
index 24a4723d1e3..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/IteratorDirectory.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Create a directory handle from an iterator or array
- *
- * The following options should be passed in the context when opening the stream
- * [
- * 'dir' => [
- * 'array' => string[]
- * 'iterator' => \Iterator
- * ]
- * ]
- *
- * Either 'array' or 'iterator' need to be set, if both are set, 'iterator' takes preference
- */
-class IteratorDirectory extends WrapperHandler implements Directory {
- /**
- * @var resource
- */
- public $context;
-
- /**
- * @var \Iterator
- */
- protected $iterator;
-
- /**
- * Load the source from the stream context and return the context options
- *
- * @param string $name
- * @return array
- * @throws \BadMethodCallException
- */
- protected function loadContext($name = null) {
- $context = parent::loadContext($name);
- if (isset($context['iterator'])) {
- $this->iterator = $context['iterator'];
- } elseif (isset($context['array'])) {
- $this->iterator = new \ArrayIterator($context['array']);
- } else {
- throw new \BadMethodCallException('Invalid context, iterator or array not set');
- }
- return $context;
- }
-
- /**
- * @param string $path
- * @param array $options
- * @return bool
- */
- public function dir_opendir($path, $options) {
- $this->loadContext();
- return true;
- }
-
- /**
- * @return string|bool
- */
- public function dir_readdir() {
- if ($this->iterator->valid()) {
- $result = $this->iterator->current();
- $this->iterator->next();
- return $result;
- } else {
- return false;
- }
- }
-
- /**
- * @return bool
- */
- public function dir_closedir() {
- return true;
- }
-
- /**
- * @return bool
- */
- public function dir_rewinddir() {
- $this->iterator->rewind();
- return true;
- }
-
- /**
- * Creates a directory handle from the provided array or iterator
- *
- * @param \Iterator | array $source
- * @return resource|false
- *
- * @throws \BadMethodCallException
- */
- public static function wrap($source) {
- if ($source instanceof \Iterator) {
- $options = [
- 'iterator' => $source
- ];
- } elseif (is_array($source)) {
- $options = [
- 'array' => $source
- ];
- } else {
- throw new \BadMethodCallException('$source should be an Iterator or array');
- }
- return self::wrapSource(self::NO_SOURCE_DIR, $options);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php
deleted file mode 100644
index f92279381a5..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/NullWrapper.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Stream wrapper that does nothing, used for tests
- */
-class NullWrapper extends Wrapper {
- public static function wrap($source) {
- return self::wrapSource($source);
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $this->loadContext();
- return true;
- }
-
- public function dir_opendir($path, $options) {
- $this->loadContext();
- return true;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Path.php b/apps/files_external/3rdparty/icewind/streams/src/Path.php
deleted file mode 100644
index 63fbd6504da..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/Path.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * A string-like object that automatically registers a stream wrapper when used and removes the stream wrapper when no longer used
- *
- * Can optionally pass context options to the stream wrapper
- */
-class Path {
-
- /**
- * @var bool
- */
- protected $registered = false;
-
- /**
- * @var string
- */
- protected $protocol;
-
- /**
- * @var string
- */
- protected $class;
-
- /**
- * @var array
- */
- protected $contextOptions;
-
- /**
- * @param string $class
- * @param array $contextOptions
- */
- public function __construct($class, $contextOptions = []) {
- $this->class = $class;
- $this->contextOptions = $contextOptions;
- }
-
- public function getProtocol() {
- if (!$this->protocol) {
- $this->protocol = 'auto' . uniqid();
- }
- return $this->protocol;
- }
-
- public function wrapPath($path) {
- return $this->getProtocol() . '://' . $path;
- }
-
- protected function register() {
- if (!$this->registered) {
- $this->appendDefaultContent($this->contextOptions);
- stream_wrapper_register($this->getProtocol(), $this->class);
- $this->registered = true;
- }
- }
-
- protected function unregister() {
- stream_wrapper_unregister($this->getProtocol());
- $this->unsetDefaultContent($this->getProtocol());
- $this->registered = false;
- }
-
- /**
- * Add values to the default stream context
- *
- * @param array $values
- */
- protected function appendDefaultContent($values) {
- if (!is_array(current($values))) {
- $values = [$this->getProtocol() => $values];
- }
- $context = stream_context_get_default();
- $defaults = stream_context_get_options($context);
- foreach ($values as $key => $value) {
- $defaults[$key] = $value;
- }
- stream_context_set_default($defaults);
- }
-
- /**
- * Remove values from the default stream context
- *
- * @param string $key
- */
- protected function unsetDefaultContent($key) {
- $context = stream_context_get_default();
- $defaults = stream_context_get_options($context);
- unset($defaults[$key]);
- stream_context_set_default($defaults);
- }
-
- public function __toString() {
- $this->register();
- return $this->protocol . '://';
- }
-
- public function __destruct() {
- $this->unregister();
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/PathWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/PathWrapper.php
deleted file mode 100644
index 3a6e236942f..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/PathWrapper.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2016 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * A string-like object that maps to an existing stream when opened
- */
-class PathWrapper extends NullWrapper {
- /**
- * @param resource $source
- * @return Path|string
- */
- public static function getPath($source) {
- return new Path(NullWrapper::class, [
- NullWrapper::getProtocol() => ['source' => $source]
- ]);
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/ReadHashWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/ReadHashWrapper.php
deleted file mode 100644
index a9e9fc831e6..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/ReadHashWrapper.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2019 Roeland Jago Douma <roeland@famdouma.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper that calculates the hash on the stream on read
- *
- * The stream and hash should be passed in when wrapping the stream.
- * On close the callback will be called with the calculated checksum.
- *
- * For supported hashes see: http://php.net/manual/en/function.hash-algos.php
- */
-class ReadHashWrapper extends HashWrapper {
- public function stream_read($count) {
- $data = parent::stream_read($count);
- $this->updateHash($data);
- return $data;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php
deleted file mode 100644
index 2899a97a0d1..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2016 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper that retries reads/writes to remote streams that dont deliver/recieve all requested data at once
- */
-class RetryWrapper extends Wrapper {
- public static function wrap($source) {
- return self::wrapSource($source);
- }
-
- public function dir_opendir($path, $options) {
- return false;
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $this->loadContext();
- return true;
- }
-
- public function stream_read($count) {
- $result = parent::stream_read($count);
-
- $bytesReceived = strlen($result);
- while (strlen($result) > 0 && $bytesReceived < $count && !$this->stream_eof()) {
- $result .= parent::stream_read($count - $bytesReceived);
- $bytesReceived = strlen($result);
- }
-
- return $result;
- }
-
- public function stream_write($data) {
- $bytesToSend = strlen($data);
- $bytesWritten = parent::stream_write($data);
- $result = $bytesWritten;
-
- while ($bytesWritten > 0 && $result < $bytesToSend && !$this->stream_eof()) {
- $dataLeft = substr($data, $result);
- $bytesWritten = parent::stream_write($dataLeft);
- $result += $bytesWritten;
- }
-
- return $result;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php
deleted file mode 100644
index 1eb06c6294c..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/SeekableWrapper.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper that provides callbacks for write, read and close
- *
- * The following options should be passed in the context when opening the stream
- * [
- * 'callback' => [
- * 'source' => resource
- * ]
- * ]
- *
- * All callbacks are called after the operation is executed on the source stream
- */
-class SeekableWrapper extends Wrapper {
- /**
- * @var resource
- */
- protected $cache;
-
- public static function wrap($source) {
- return self::wrapSource($source);
- }
-
- public function dir_opendir($path, $options) {
- return false;
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $this->loadContext();
- $cache = fopen('php://temp', 'w+');
- if ($cache === false) {
- return false;
- }
- $this->cache = $cache;
- return true;
- }
-
- protected function readTill($position) {
- $current = ftell($this->source);
- if ($position > $current) {
- $data = parent::stream_read($position - $current);
- $cachePosition = ftell($this->cache);
- fseek($this->cache, $current);
- fwrite($this->cache, $data);
- fseek($this->cache, $cachePosition);
- }
- }
-
- public function stream_read($count) {
- $current = ftell($this->cache);
- $this->readTill($current + $count);
- return fread($this->cache, $count);
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- if ($whence === SEEK_SET) {
- $target = $offset;
- } elseif ($whence === SEEK_CUR) {
- $current = ftell($this->cache);
- $target = $current + $offset;
- } else {
- return false;
- }
- $this->readTill($target);
- return fseek($this->cache, $target) === 0;
- }
-
- public function stream_tell() {
- return ftell($this->cache);
- }
-
- public function stream_eof() {
- return parent::stream_eof() and (ftell($this->source) === ftell($this->cache));
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Url.php b/apps/files_external/3rdparty/icewind/streams/src/Url.php
deleted file mode 100644
index dfe36a00d6f..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/Url.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Interface for stream wrappers that implement url functions such as unlink, stat
- */
-interface Url {
- /**
- * @param string $path
- * @param array $options
- * @return bool
- */
- public function dir_opendir($path, $options);
-
- /**
- * @param string $path
- * @param string $mode
- * @param int $options
- * @param string $opened_path
- * @return bool
- */
- public function stream_open($path, $mode, $options, &$opened_path);
-
- /**
- * @param string $path
- * @param int $mode
- * @param int $options
- * @return bool
- */
- public function mkdir($path, $mode, $options);
-
- /**
- * @param string $source
- * @param string $target
- * @return bool
- */
- public function rename($source, $target);
-
- /**
- * @param string $path
- * @param int $options
- * @return bool
- */
- public function rmdir($path, $options);
-
- /**
- * @param string $path
- * @return bool
- */
- public function unlink($path);
-
- /**
- * @param string $path
- * @param int $flags
- * @return array|false
- */
- public function url_stat($path, $flags);
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/UrlCallback.php b/apps/files_external/3rdparty/icewind/streams/src/UrlCallback.php
deleted file mode 100644
index 4471c2d4f1f..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/UrlCallback.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper that provides callbacks for url actions such as fopen, unlink, rename
- *
- * Usage:
- *
- * $path = UrlCallBack('/path/so/source', function(){
- * echo 'fopen';
- * }, function(){
- * echo 'opendir';
- * }, function(){
- * echo 'mkdir';
- * }, function(){
- * echo 'rename';
- * }, function(){
- * echo 'rmdir';
- * }, function(){
- * echo 'unlink';
- * }, function(){
- * echo 'stat';
- * });
- *
- * mkdir($path);
- * ...
- *
- * All callbacks are called after the operation is executed on the source stream
- */
-class UrlCallback extends Wrapper implements Url {
-
- /**
- * @param string $source
- * @param callable $fopen
- * @param callable $opendir
- * @param callable $mkdir
- * @param callable $rename
- * @param callable $rmdir
- * @param callable $unlink
- * @param callable $stat
- * @return \Icewind\Streams\Path
- *
- * @throws \BadMethodCallException
- */
- public static function wrap(
- $source,
- $fopen = null,
- $opendir = null,
- $mkdir = null,
- $rename = null,
- $rmdir = null,
- $unlink = null,
- $stat = null
- ) {
- return new Path(static::class, [
- 'source' => $source,
- 'fopen' => $fopen,
- 'opendir' => $opendir,
- 'mkdir' => $mkdir,
- 'rename' => $rename,
- 'rmdir' => $rmdir,
- 'unlink' => $unlink,
- 'stat' => $stat
- ]);
- }
-
- protected function loadUrlContext($url) {
- list($protocol) = explode('://', $url);
- $options = stream_context_get_options($this->context);
- return $options[$protocol];
- }
-
- protected function callCallBack($context, $callback) {
- if (is_callable($context[$callback])) {
- call_user_func($context[$callback]);
- }
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $context = $this->loadUrlContext($path);
- $this->callCallBack($context, 'fopen');
- $source = fopen($context['source'], $mode);
- if ($source === false) {
- return false;
- }
- $this->setSourceStream($source);
- return true;
- }
-
- public function dir_opendir($path, $options) {
- $context = $this->loadUrlContext($path);
- $this->callCallBack($context, 'opendir');
- $source = opendir($context['source']);
- if ($source === false) {
- return false;
- }
- $this->setSourceStream($source);
- return true;
- }
-
- public function mkdir($path, $mode, $options) {
- $context = $this->loadUrlContext($path);
- $this->callCallBack($context, 'mkdir');
- return mkdir($context['source'], $mode, ($options & STREAM_MKDIR_RECURSIVE) > 0);
- }
-
- public function rmdir($path, $options) {
- $context = $this->loadUrlContext($path);
- $this->callCallBack($context, 'rmdir');
- return rmdir($context['source']);
- }
-
- public function rename($source, $target) {
- $context = $this->loadUrlContext($source);
- $this->callCallBack($context, 'rename');
- list(, $target) = explode('://', $target);
- return rename($context['source'], $target);
- }
-
- public function unlink($path) {
- $context = $this->loadUrlContext($path);
- $this->callCallBack($context, 'unlink');
- return unlink($context['source']);
- }
-
- public function url_stat($path, $flags) {
- throw new \Exception('stat is not supported due to php bug 50526');
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php b/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php
deleted file mode 100644
index 0a9c07bee83..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: MIT
- */
-
-namespace Icewind\Streams;
-
-/**
- * Base class for stream wrappers, wraps an existing stream
- *
- * This wrapper itself doesn't implement any functionality but is just a base class for other wrappers to extend
- */
-abstract class Wrapper extends WrapperHandler implements File, Directory {
- /**
- * @var resource
- */
- public $context;
-
- /**
- * The wrapped stream
- *
- * @var resource
- */
- protected $source;
-
- /**
- * @param resource $source
- */
- protected function setSourceStream($source) {
- $this->source = $source;
- }
-
- protected function loadContext($name = null) {
- $context = parent::loadContext($name);
- if (isset($context['source']) and is_resource($context['source'])) {
- $this->setSourceStream($context['source']);
- } else {
- throw new \BadMethodCallException('Invalid context, source not set');
- }
- return $context;
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- $result = fseek($this->source, $offset, $whence);
- return $result == 0;
- }
-
- public function stream_tell() {
- return ftell($this->source);
- }
-
- public function stream_read($count) {
- return fread($this->source, $count);
- }
-
- public function stream_write($data) {
- return fwrite($this->source, $data);
- }
-
- public function stream_set_option($option, $arg1, $arg2) {
- switch ($option) {
- case STREAM_OPTION_BLOCKING:
- return stream_set_blocking($this->source, (bool)$arg1);
- case STREAM_OPTION_READ_TIMEOUT:
- return stream_set_timeout($this->source, $arg1, $arg2);
- case STREAM_OPTION_WRITE_BUFFER:
- return stream_set_write_buffer($this->source, $arg1) === 0;
- }
- return false;
- }
-
- public function stream_truncate($size) {
- return ftruncate($this->source, $size);
- }
-
- public function stream_stat() {
- return fstat($this->source);
- }
-
- public function stream_lock($mode) {
- return flock($this->source, $mode);
- }
-
- public function stream_flush() {
- return fflush($this->source);
- }
-
- public function stream_eof() {
- return feof($this->source);
- }
-
- public function stream_close() {
- if (is_resource($this->source)) {
- return fclose($this->source);
- }
- }
-
- public function dir_readdir() {
- return readdir($this->source);
- }
-
- public function dir_closedir() {
- closedir($this->source);
- return true;
- }
-
- public function dir_rewinddir() {
- return rewind($this->source);
- }
-
- public function getSource() {
- return $this->source;
- }
-
- /**
- * Retrieves header/metadata from the source stream.
- *
- * This is equivalent to calling `stream_get_meta_data` on the source stream except nested stream wrappers are handled transparently
- *
- * @return array
- */
- public function getMetaData(): array {
- $meta = stream_get_meta_data($this->source);
- while (isset($meta['wrapper_data']) && $meta['wrapper_data'] instanceof Wrapper) {
- $meta = $meta['wrapper_data']->getMetaData();
- }
- return $meta;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/WrapperHandler.php b/apps/files_external/3rdparty/icewind/streams/src/WrapperHandler.php
deleted file mode 100644
index 64b3be213a3..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/WrapperHandler.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2019 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\Streams;
-
-class WrapperHandler {
- /** @var resource $context */
- protected $context;
-
- const NO_SOURCE_DIR = 1;
-
- /**
- * get the protocol name that is generated for the class
- * @param string|null $class
- * @return string
- */
- public static function getProtocol($class = null) {
- if ($class === null) {
- $class = static::class;
- }
-
- $parts = explode('\\', $class);
- return strtolower(array_pop($parts));
- }
-
- private static function buildContext($protocol, $context, $source) {
- if (is_array($context)) {
- $context['source'] = $source;
- return stream_context_create([$protocol => $context]);
- } else {
- return $context;
- }
- }
-
- /**
- * @param resource|int $source
- * @param resource|array $context
- * @param string|null $protocol deprecated, protocol is now automatically generated
- * @param string|null $class deprecated, class is now automatically generated
- * @return resource|false
- */
- protected static function wrapSource($source, $context = [], $protocol = null, $class = null, $mode = 'r+') {
- if ($class === null) {
- $class = static::class;
- }
-
- if ($protocol === null) {
- $protocol = self::getProtocol($class);
- }
-
- $context = self::buildContext($protocol, $context, $source);
- try {
- stream_wrapper_register($protocol, $class);
- if (self::isDirectoryHandle($source)) {
- return opendir($protocol . '://', $context);
- } else {
- return fopen($protocol . '://', $mode, false, $context);
- }
- } finally {
- stream_wrapper_unregister($protocol);
- }
- }
-
- protected static function isDirectoryHandle($resource) {
- if ($resource === self::NO_SOURCE_DIR) {
- return true;
- }
- if (!is_resource($resource)) {
- throw new \BadMethodCallException('Invalid stream source');
- }
- $meta = stream_get_meta_data($resource);
- return $meta['stream_type'] === 'dir' || $meta['stream_type'] === 'user-space-dir';
- }
-
- /**
- * Load the source from the stream context and return the context options
- *
- * @param string|null $name if not set, the generated protocol name is used
- * @return array
- * @throws \BadMethodCallException
- */
- protected function loadContext($name = null) {
- if ($name === null) {
- $parts = explode('\\', static::class);
- $name = strtolower(array_pop($parts));
- }
-
- $context = stream_context_get_options($this->context);
- if (isset($context[$name])) {
- $context = $context[$name];
- } else {
- throw new \BadMethodCallException('Invalid context, "' . $name . '" options not set');
- }
- return $context;
- }
-}
diff --git a/apps/files_external/3rdparty/icewind/streams/src/WriteHashWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/WriteHashWrapper.php
deleted file mode 100644
index 685d73c1fbd..00000000000
--- a/apps/files_external/3rdparty/icewind/streams/src/WriteHashWrapper.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2019 Robin Appelman <robin@icewind.nl>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace Icewind\Streams;
-
-/**
- * Wrapper that calculates the hash on the stream on write
- *
- * The stream and hash should be passed in when wrapping the stream.
- * On close the callback will be called with the calculated checksum.
- *
- * For supported hashes see: http://php.net/manual/en/function.hash-algos.php
- */
-class WriteHashWrapper extends HashWrapper {
- public function stream_write($data) {
- $this->updateHash($data);
- return parent::stream_write($data);
- }
-}
diff --git a/apps/files_external/l10n/mk.js b/apps/files_external/l10n/mk.js
index 4708014f4d2..a41f84e471a 100644
--- a/apps/files_external/l10n/mk.js
+++ b/apps/files_external/l10n/mk.js
@@ -64,7 +64,12 @@ OC.L10N.register(
"External storage support" : "Поддршка за надворешно складиште",
"Confirm" : "Потврди",
"Open in Files" : "Отвори во датотеките",
+ "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Се појави грешка со ова надворешно складиште. Дали сакате да ја прегледате оваа конфигурација на страницата со поставки?",
"External mount error" : "Грешка при надворешно монтирање",
+ "List of external storage." : "Листа на надворешни складишта.",
+ "There is no external storage configured. You can configure them in your Personal settings." : "Нема конфигурирано надворешно складирање. Можете да ги конфигурирате во вашите лични поставки.",
+ "There is no external storage configured and you don't have the permission to configure them." : "Нема конфигурирано надворешно складирање и немате дозвола да го конфигурирате.",
+ "No external storage" : "Нема надворешно складиште",
"Storage type" : "Вид на складиште",
"Unknown" : "Непознат",
"Scope" : "Опсег",
diff --git a/apps/files_external/l10n/mk.json b/apps/files_external/l10n/mk.json
index b4de5a8bed7..413265d40c3 100644
--- a/apps/files_external/l10n/mk.json
+++ b/apps/files_external/l10n/mk.json
@@ -62,7 +62,12 @@
"External storage support" : "Поддршка за надворешно складиште",
"Confirm" : "Потврди",
"Open in Files" : "Отвори во датотеките",
+ "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Се појави грешка со ова надворешно складиште. Дали сакате да ја прегледате оваа конфигурација на страницата со поставки?",
"External mount error" : "Грешка при надворешно монтирање",
+ "List of external storage." : "Листа на надворешни складишта.",
+ "There is no external storage configured. You can configure them in your Personal settings." : "Нема конфигурирано надворешно складирање. Можете да ги конфигурирате во вашите лични поставки.",
+ "There is no external storage configured and you don't have the permission to configure them." : "Нема конфигурирано надворешно складирање и немате дозвола да го конфигурирате.",
+ "No external storage" : "Нема надворешно складиште",
"Storage type" : "Вид на складиште",
"Unknown" : "Непознат",
"Scope" : "Опсег",
diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js
index f697df74fcb..36ca4ecc62a 100644
--- a/apps/files_external/l10n/uk.js
+++ b/apps/files_external/l10n/uk.js
@@ -64,6 +64,7 @@ OC.L10N.register(
"Enable Path Style" : "Включити стиль шляху",
"Legacy (v2) authentication" : "Застарілий метод авторизації (v2) ",
"Enable multipart copy" : "Дозволити множинне копіювання",
+ "SSE-C encryption key" : "Ключ шифрування SSE-C",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Віддалений підкаталог",
@@ -83,6 +84,7 @@ OC.L10N.register(
"Case sensitive file system" : "Файлова система, чутлива до регістру символів",
"Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Вимкнення цього параметра дозволить використовувати файлову систему, нечутливу до регістру, але це також призведе до зниження продуктивності",
"Verify ACL access when listing files" : "Перевірте доступ до ACL під час переліку файлів",
+ "Check the ACL's of each file or folder inside a directory to filter out items where the account has no read permissions, comes with a performance penalty" : "Перевірте ACL для кожного файлу або папки в каталозі, щоб відфільтрувати елементи, на які обліковий запис не має дозволів на читання, що призводить до зниження продуктивності",
"Timeout" : "Час вичерпано",
"SMB/CIFS using OC login" : "SMB/CIFS з використанням входу OC",
"Login as share" : "Увійти під спільним доступом",
@@ -95,10 +97,18 @@ OC.L10N.register(
"External storage" : "Зовнішнє сховище",
"External storage support" : "Підтримка зовнішнього сховища",
"Adds basic external storage support" : "Додає базову підтримку зовнішньої пам’яті",
+ "This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Ця програма дозволяє адміністраторам налаштовувати підключення до зовнішніх сховищ, таких як FTP-сервери, сховища об'єктів S3 або SWIFT, інші сервери Nextcloud, WebDAV-сервери тощо. Адміністрація може вибирати, які типи сховищ увімкнути, і може монтувати ці сховища для облікового запису, групи або всієї системи. Користувачі побачать нову папку в кореневому каталозі Nextcloud, до якої вони зможуть отримати доступ і використовувати її як будь-яку іншу папку Nextcloud. Зовнішнє сховище також дозволяє користувачам ділитися файлами, що зберігаються в цих зовнішніх сховищах. У цих випадках облікові дані власника файлу використовуються, коли одержувач запитує файл із зовнішнього сховища, таким чином гарантуючи, що одержувач зможе отримати доступ до файлу, до якого надано спільний доступ.\n\nЗовнішнє сховище можна налаштувати за допомогою графічного інтерфейсу або командного рядка. Другий варіант надає адміністратору більше можливостей для налаштування масового монтування зовнішнього сховища і встановлення пріоритетів монтування. Докладнішу інформацію можна знайти у документації до графічного інтерфейсу зовнішнього сховища та документації до файлу конфігурації зовнішнього сховища.",
"Confirm" : "Підтвердити",
+ "Storage credentials" : "Облікові дані для зберігання",
+ "To access the storage, you need to provide the authentication credentials." : "Щоб отримати доступ до сховища, вам потрібно надати облікові дані для автентифікації.",
+ "Enter the storage login" : "Введіть логін до сховища",
+ "Enter the storage password" : "Введіть пароль до сховища",
"Unable to update this external storage config. {statusMessage}" : "Не вдалося оновити конфігурацію цього зовнішнього сховища. {statusMessage}",
"New configuration successfully saved" : "Нову конфігурацію успішно збережено",
"Enter missing credentials" : "Зазначте відсутні дані авторизації",
+ "Credentials successfully set" : "Облікові дані успішно встановлено",
+ "Error while setting credentials: {error}" : "Помилка під час встановлення облікових даних: {error}",
+ "Checking storage …" : "Перевірка сховища ...",
"There was an error with this external storage." : "З цим зовнішнім сховищем виникла помилка.",
"We were unable to check the external storage {basename}" : "Нам не вдалося перевірити зовнішнє сховище {basename}",
"Examine this faulty external storage configuration" : "Перевірте цю несправну конфігурацію зовнішнього сховища",
@@ -125,6 +135,7 @@ OC.L10N.register(
"Once every direct access" : "Один раз при кожному прямому доступі",
"Read only" : "Тільки читання",
"Disconnect" : "Від'єднати",
+ "Unknown backend: {backendName}" : "Невідомий бекенд: {backendName}",
"Admin defined" : "Визначено адміністратором",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Автоматична перевірка статусу вимкнена через велику кількість налаштованих сховищ, натисніть, щоб перевірити статус",
"Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Ви впевнені, що бажаєте від’єднати це зовнішнє сховище? Це призведе до того, що сховище стане недоступним у хмарі Nextcloud, а також вилучить файли та каталоги на клієнтських пристроях, які наразі синхронізуються з хмарою. Файли та каталоги у зовнішньому сховищі не буде вилучено.",
@@ -133,8 +144,11 @@ OC.L10N.register(
"Saved" : "Збережено",
"Saving …" : "Збереження …",
"Save" : "Зберегти",
+ "Failed to save global credentials" : "Не вдалося зберегти глобальні облікові дані",
+ "Failed to save global credentials: {message}" : "Не вдалося зберегти глобальні облікові дані: {повідомлення}",
"No external storage configured or you don't have the permission to configure them" : "Зовнішнє сховище не налаштовано або ви не маєте дозволу на їх налаштування",
"Open documentation" : "Відкрити документацію",
+ "External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow people to mount their own external storage services." : "Зовнішнє сховище дає змогу підключати зовнішні сервіси та пристрої для зберігання даних як вторинні пристрої Nextcloud. Ви також можете дозволити користувачам монтувати власні зовнішні сховища.",
"Folder name" : "Назва каталогу",
"Authentication" : "Авторизація",
"Configuration" : "Налаштування",
diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json
index a650d9d93ce..6bed2dc94c7 100644
--- a/apps/files_external/l10n/uk.json
+++ b/apps/files_external/l10n/uk.json
@@ -62,6 +62,7 @@
"Enable Path Style" : "Включити стиль шляху",
"Legacy (v2) authentication" : "Застарілий метод авторизації (v2) ",
"Enable multipart copy" : "Дозволити множинне копіювання",
+ "SSE-C encryption key" : "Ключ шифрування SSE-C",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Віддалений підкаталог",
@@ -81,6 +82,7 @@
"Case sensitive file system" : "Файлова система, чутлива до регістру символів",
"Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Вимкнення цього параметра дозволить використовувати файлову систему, нечутливу до регістру, але це також призведе до зниження продуктивності",
"Verify ACL access when listing files" : "Перевірте доступ до ACL під час переліку файлів",
+ "Check the ACL's of each file or folder inside a directory to filter out items where the account has no read permissions, comes with a performance penalty" : "Перевірте ACL для кожного файлу або папки в каталозі, щоб відфільтрувати елементи, на які обліковий запис не має дозволів на читання, що призводить до зниження продуктивності",
"Timeout" : "Час вичерпано",
"SMB/CIFS using OC login" : "SMB/CIFS з використанням входу OC",
"Login as share" : "Увійти під спільним доступом",
@@ -93,10 +95,18 @@
"External storage" : "Зовнішнє сховище",
"External storage support" : "Підтримка зовнішнього сховища",
"Adds basic external storage support" : "Додає базову підтримку зовнішньої пам’яті",
+ "This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Ця програма дозволяє адміністраторам налаштовувати підключення до зовнішніх сховищ, таких як FTP-сервери, сховища об'єктів S3 або SWIFT, інші сервери Nextcloud, WebDAV-сервери тощо. Адміністрація може вибирати, які типи сховищ увімкнути, і може монтувати ці сховища для облікового запису, групи або всієї системи. Користувачі побачать нову папку в кореневому каталозі Nextcloud, до якої вони зможуть отримати доступ і використовувати її як будь-яку іншу папку Nextcloud. Зовнішнє сховище також дозволяє користувачам ділитися файлами, що зберігаються в цих зовнішніх сховищах. У цих випадках облікові дані власника файлу використовуються, коли одержувач запитує файл із зовнішнього сховища, таким чином гарантуючи, що одержувач зможе отримати доступ до файлу, до якого надано спільний доступ.\n\nЗовнішнє сховище можна налаштувати за допомогою графічного інтерфейсу або командного рядка. Другий варіант надає адміністратору більше можливостей для налаштування масового монтування зовнішнього сховища і встановлення пріоритетів монтування. Докладнішу інформацію можна знайти у документації до графічного інтерфейсу зовнішнього сховища та документації до файлу конфігурації зовнішнього сховища.",
"Confirm" : "Підтвердити",
+ "Storage credentials" : "Облікові дані для зберігання",
+ "To access the storage, you need to provide the authentication credentials." : "Щоб отримати доступ до сховища, вам потрібно надати облікові дані для автентифікації.",
+ "Enter the storage login" : "Введіть логін до сховища",
+ "Enter the storage password" : "Введіть пароль до сховища",
"Unable to update this external storage config. {statusMessage}" : "Не вдалося оновити конфігурацію цього зовнішнього сховища. {statusMessage}",
"New configuration successfully saved" : "Нову конфігурацію успішно збережено",
"Enter missing credentials" : "Зазначте відсутні дані авторизації",
+ "Credentials successfully set" : "Облікові дані успішно встановлено",
+ "Error while setting credentials: {error}" : "Помилка під час встановлення облікових даних: {error}",
+ "Checking storage …" : "Перевірка сховища ...",
"There was an error with this external storage." : "З цим зовнішнім сховищем виникла помилка.",
"We were unable to check the external storage {basename}" : "Нам не вдалося перевірити зовнішнє сховище {basename}",
"Examine this faulty external storage configuration" : "Перевірте цю несправну конфігурацію зовнішнього сховища",
@@ -123,6 +133,7 @@
"Once every direct access" : "Один раз при кожному прямому доступі",
"Read only" : "Тільки читання",
"Disconnect" : "Від'єднати",
+ "Unknown backend: {backendName}" : "Невідомий бекенд: {backendName}",
"Admin defined" : "Визначено адміністратором",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Автоматична перевірка статусу вимкнена через велику кількість налаштованих сховищ, натисніть, щоб перевірити статус",
"Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Ви впевнені, що бажаєте від’єднати це зовнішнє сховище? Це призведе до того, що сховище стане недоступним у хмарі Nextcloud, а також вилучить файли та каталоги на клієнтських пристроях, які наразі синхронізуються з хмарою. Файли та каталоги у зовнішньому сховищі не буде вилучено.",
@@ -131,8 +142,11 @@
"Saved" : "Збережено",
"Saving …" : "Збереження …",
"Save" : "Зберегти",
+ "Failed to save global credentials" : "Не вдалося зберегти глобальні облікові дані",
+ "Failed to save global credentials: {message}" : "Не вдалося зберегти глобальні облікові дані: {повідомлення}",
"No external storage configured or you don't have the permission to configure them" : "Зовнішнє сховище не налаштовано або ви не маєте дозволу на їх налаштування",
"Open documentation" : "Відкрити документацію",
+ "External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow people to mount their own external storage services." : "Зовнішнє сховище дає змогу підключати зовнішні сервіси та пристрої для зберігання даних як вторинні пристрої Nextcloud. Ви також можете дозволити користувачам монтувати власні зовнішні сховища.",
"Folder name" : "Назва каталогу",
"Authentication" : "Авторизація",
"Configuration" : "Налаштування",
diff --git a/apps/files_external/lib/AppInfo/Application.php b/apps/files_external/lib/AppInfo/Application.php
index d5181e783ce..3ded9f7cca0 100644
--- a/apps/files_external/lib/AppInfo/Application.php
+++ b/apps/files_external/lib/AppInfo/Application.php
@@ -54,8 +54,6 @@ use OCP\Files\Config\IMountProviderCollection;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\User\Events\UserDeletedEvent;
-require_once __DIR__ . '/../../3rdparty/autoload.php';
-
/**
* @package OCA\Files_External\AppInfo
*/
diff --git a/apps/files_external/lib/Command/Verify.php b/apps/files_external/lib/Command/Verify.php
index 18cbc5a6774..ecebbe0f7e6 100644
--- a/apps/files_external/lib/Command/Verify.php
+++ b/apps/files_external/lib/Command/Verify.php
@@ -97,7 +97,6 @@ class Verify extends Base {
MountConfig::getBackendStatus(
$backend->getStorageClass(),
$storage->getBackendOptions(),
- false
)
);
} catch (InsufficientDataForMeaningfulAnswerException $e) {
diff --git a/apps/files_external/lib/ConfigLexicon.php b/apps/files_external/lib/ConfigLexicon.php
index e162efc92cf..154f76c1989 100644
--- a/apps/files_external/lib/ConfigLexicon.php
+++ b/apps/files_external/lib/ConfigLexicon.php
@@ -8,30 +8,30 @@ declare(strict_types=1);
namespace OCA\Files_External;
-use NCU\Config\Lexicon\ConfigLexiconEntry;
-use NCU\Config\Lexicon\ConfigLexiconStrictness;
-use NCU\Config\Lexicon\IConfigLexicon;
-use NCU\Config\ValueType;
+use OCP\Config\Lexicon\Entry;
+use OCP\Config\Lexicon\ILexicon;
+use OCP\Config\Lexicon\Strictness;
+use OCP\Config\ValueType;
/**
* Config Lexicon for files_sharing.
*
* Please Add & Manage your Config Keys in that file and keep the Lexicon up to date!
*
- * {@see IConfigLexicon}
+ * {@see ILexicon}
*/
-class ConfigLexicon implements IConfigLexicon {
+class ConfigLexicon implements ILexicon {
public const ALLOW_USER_MOUNTING = 'allow_user_mounting';
public const USER_MOUNTING_BACKENDS = 'user_mounting_backends';
- public function getStrictness(): ConfigLexiconStrictness {
- return ConfigLexiconStrictness::NOTICE;
+ public function getStrictness(): Strictness {
+ return Strictness::NOTICE;
}
public function getAppConfigs(): array {
return [
- new ConfigLexiconEntry(self::ALLOW_USER_MOUNTING, ValueType::BOOL, false, 'allow users to mount their own external filesystems', true),
- new ConfigLexiconEntry(self::USER_MOUNTING_BACKENDS, ValueType::STRING, '', 'list of mounting backends available for users', true),
+ new Entry(self::ALLOW_USER_MOUNTING, ValueType::BOOL, false, 'allow users to mount their own external filesystems', true),
+ new Entry(self::USER_MOUNTING_BACKENDS, ValueType::STRING, '', 'list of mounting backends available for users', true),
];
}
diff --git a/apps/files_external/lib/Controller/GlobalStoragesController.php b/apps/files_external/lib/Controller/GlobalStoragesController.php
index 132295f6b35..e7274c9cfb6 100644
--- a/apps/files_external/lib/Controller/GlobalStoragesController.php
+++ b/apps/files_external/lib/Controller/GlobalStoragesController.php
@@ -133,7 +133,6 @@ class GlobalStoragesController extends StoragesController {
* @param array $applicableUsers users for which to mount the storage
* @param array $applicableGroups groups for which to mount the storage
* @param int $priority priority
- * @param bool $testOnly whether to storage should only test the connection or do more things
*
* @return DataResponse
*/
@@ -148,7 +147,6 @@ class GlobalStoragesController extends StoragesController {
$applicableUsers,
$applicableGroups,
$priority,
- $testOnly = true,
) {
$storage = $this->createStorage(
$mountPoint,
@@ -181,7 +179,7 @@ class GlobalStoragesController extends StoragesController {
);
}
- $this->updateStorageStatus($storage, $testOnly);
+ $this->updateStorageStatus($storage);
return new DataResponse(
$storage->jsonSerialize(true),
diff --git a/apps/files_external/lib/Controller/StoragesController.php b/apps/files_external/lib/Controller/StoragesController.php
index 18f8d3164b7..df3a4528054 100644
--- a/apps/files_external/lib/Controller/StoragesController.php
+++ b/apps/files_external/lib/Controller/StoragesController.php
@@ -213,9 +213,8 @@ abstract class StoragesController extends Controller {
* on whether the remote storage is available or not.
*
* @param StorageConfig $storage storage configuration
- * @param bool $testOnly whether to storage should only test the connection or do more things
*/
- protected function updateStorageStatus(StorageConfig &$storage, $testOnly = true) {
+ protected function updateStorageStatus(StorageConfig &$storage) {
try {
$this->manipulateStorageConfig($storage);
@@ -226,8 +225,6 @@ abstract class StoragesController extends Controller {
MountConfig::getBackendStatus(
$backend->getStorageClass(),
$storage->getBackendOptions(),
- false,
- $testOnly
)
);
} catch (InsufficientDataForMeaningfulAnswerException $e) {
@@ -268,15 +265,14 @@ abstract class StoragesController extends Controller {
* Get an external storage entry.
*
* @param int $id storage id
- * @param bool $testOnly whether to storage should only test the connection or do more things
*
* @return DataResponse
*/
- public function show(int $id, $testOnly = true) {
+ public function show(int $id) {
try {
$storage = $this->service->getStorage($id);
- $this->updateStorageStatus($storage, $testOnly);
+ $this->updateStorageStatus($storage);
} catch (NotFoundException $e) {
return new DataResponse(
[
diff --git a/apps/files_external/lib/Controller/UserGlobalStoragesController.php b/apps/files_external/lib/Controller/UserGlobalStoragesController.php
index 5f428db9661..88a9f936401 100644
--- a/apps/files_external/lib/Controller/UserGlobalStoragesController.php
+++ b/apps/files_external/lib/Controller/UserGlobalStoragesController.php
@@ -97,15 +97,14 @@ class UserGlobalStoragesController extends StoragesController {
* Get an external storage entry.
*
* @param int $id storage id
- * @param bool $testOnly whether to storage should only test the connection or do more things
* @return DataResponse
*/
#[NoAdminRequired]
- public function show($id, $testOnly = true) {
+ public function show($id) {
try {
$storage = $this->service->getStorage($id);
- $this->updateStorageStatus($storage, $testOnly);
+ $this->updateStorageStatus($storage);
} catch (NotFoundException $e) {
return new DataResponse(
[
@@ -133,7 +132,6 @@ class UserGlobalStoragesController extends StoragesController {
*
* @param int $id storage id
* @param array $backendOptions backend-specific options
- * @param bool $testOnly whether to storage should only test the connection or do more things
*
* @return DataResponse
*/
@@ -142,7 +140,6 @@ class UserGlobalStoragesController extends StoragesController {
public function update(
$id,
$backendOptions,
- $testOnly = true,
) {
try {
$storage = $this->service->getStorage($id);
@@ -167,7 +164,7 @@ class UserGlobalStoragesController extends StoragesController {
);
}
- $this->updateStorageStatus($storage, $testOnly);
+ $this->updateStorageStatus($storage);
$this->sanitizeStorage($storage);
return new DataResponse(
diff --git a/apps/files_external/lib/Controller/UserStoragesController.php b/apps/files_external/lib/Controller/UserStoragesController.php
index 7b0c858e51b..7b564d57f7e 100644
--- a/apps/files_external/lib/Controller/UserStoragesController.php
+++ b/apps/files_external/lib/Controller/UserStoragesController.php
@@ -85,8 +85,8 @@ class UserStoragesController extends StoragesController {
* {@inheritdoc}
*/
#[NoAdminRequired]
- public function show(int $id, $testOnly = true) {
- return parent::show($id, $testOnly);
+ public function show(int $id) {
+ return parent::show($id);
}
/**
@@ -152,7 +152,6 @@ class UserStoragesController extends StoragesController {
* @param string $authMechanism authentication mechanism identifier
* @param array $backendOptions backend-specific options
* @param array $mountOptions backend-specific mount options
- * @param bool $testOnly whether to storage should only test the connection or do more things
*
* @return DataResponse
*/
@@ -165,7 +164,6 @@ class UserStoragesController extends StoragesController {
$authMechanism,
$backendOptions,
$mountOptions,
- $testOnly = true,
) {
$storage = $this->createStorage(
$mountPoint,
@@ -195,7 +193,7 @@ class UserStoragesController extends StoragesController {
);
}
- $this->updateStorageStatus($storage, $testOnly);
+ $this->updateStorageStatus($storage);
return new DataResponse(
$storage->jsonSerialize(true),
diff --git a/apps/files_external/lib/MountConfig.php b/apps/files_external/lib/MountConfig.php
index a7d9e6f2603..5637ee71ec1 100644
--- a/apps/files_external/lib/MountConfig.php
+++ b/apps/files_external/lib/MountConfig.php
@@ -76,7 +76,7 @@ class MountConfig {
* @return int see self::STATUS_*
* @throws \Exception
*/
- public static function getBackendStatus($class, $options, $isPersonal, $testOnly = true) {
+ public static function getBackendStatus($class, $options) {
if (self::$skipTest) {
return StorageNotAvailableException::STATUS_SUCCESS;
}
@@ -93,7 +93,7 @@ class MountConfig {
$storage = new $class($options);
try {
- $result = $storage->test($isPersonal, $testOnly);
+ $result = $storage->test();
$storage->setAvailability($result);
if ($result) {
return StorageNotAvailableException::STATUS_SUCCESS;
diff --git a/apps/files_external/src/init.ts b/apps/files_external/src/init.ts
index 3f33e9cf5b6..a8a265500dd 100644
--- a/apps/files_external/src/init.ts
+++ b/apps/files_external/src/init.ts
@@ -5,7 +5,7 @@
import { loadState } from '@nextcloud/initial-state'
import { translate as t } from '@nextcloud/l10n'
import { View, getNavigation, Column, registerFileAction } from '@nextcloud/files'
-import FolderNetworkSvg from '@mdi/svg/svg/folder-network.svg?raw'
+import FolderNetworkSvg from '@mdi/svg/svg/folder-network-outline.svg?raw'
import { action as enterCredentialsAction } from './actions/enterCredentialsAction'
import { action as inlineStorageCheckAction } from './actions/inlineStorageCheckAction'
diff --git a/apps/files_reminders/l10n/uk.js b/apps/files_reminders/l10n/uk.js
index 297864768b3..a9bc88520bc 100644
--- a/apps/files_reminders/l10n/uk.js
+++ b/apps/files_reminders/l10n/uk.js
@@ -5,7 +5,11 @@ OC.L10N.register(
"Reminder for {name}" : "Нагадування для {name}",
"View file" : "Переглянути файл",
"View folder" : "Переглянути каталог",
+ "Files reminder" : "Нагадування для файлів",
+ "The \"files_reminders\" app can work properly." : "Додаток «files_reminders» може працювати належним чином.",
+ "The \"files_reminders\" app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "Для нормальної роботи програми «files_reminders» необхідна програма сповіщень. Вам слід або увімкнути сповіщення, або вимкнути files_reminder.",
"Set file reminders" : "Встановити нагадування для файлу",
+ "**📣 File reminders**\n\nSet file reminders.\n\nNote: to use the `File reminders` app, ensure that the `Notifications` app is installed and enabled. The `Notifications` app provides the necessary APIs for the `File reminders` app to work correctly." : "**📣 Нагадування про файли**\n\nВстановіть нагадування про файли.\n\nПримітка: щоб використовувати додаток «Нагадування про файли», переконайтеся, що додаток «Повідомлення» встановлено та увімкнено. Додаток «Повідомлення» надає необхідні API для коректної роботи додатка «Нагадування про файли».",
"Set reminder for \"{fileName}\"" : "Встановити нагадування для \"{fileName}\"",
"Set reminder at custom date & time" : "Встановити нагадування на власну дату та час",
"Clear reminder" : "Зняти нагадування",
@@ -26,6 +30,8 @@ OC.L10N.register(
"This weekend" : "Цими вихідними",
"Set reminder for this weekend" : "Встановити нагадування на ці вихідні",
"Next week" : "Наступний тиждень",
- "Set reminder for next week" : "Встановити нагадування на наступний тиждень"
+ "Set reminder for next week" : "Встановити нагадування на наступний тиждень",
+ "This files_reminder can work properly." : "Цей files_reminder може працювати належним чином.",
+ "The files_reminder app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "Для нормальної роботи програми files_reminder необхідна програма сповіщень. Вам слід або увімкнути сповіщення, або вимкнути files_reminder."
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/files_reminders/l10n/uk.json b/apps/files_reminders/l10n/uk.json
index a8679ae6221..5bc997af508 100644
--- a/apps/files_reminders/l10n/uk.json
+++ b/apps/files_reminders/l10n/uk.json
@@ -3,7 +3,11 @@
"Reminder for {name}" : "Нагадування для {name}",
"View file" : "Переглянути файл",
"View folder" : "Переглянути каталог",
+ "Files reminder" : "Нагадування для файлів",
+ "The \"files_reminders\" app can work properly." : "Додаток «files_reminders» може працювати належним чином.",
+ "The \"files_reminders\" app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "Для нормальної роботи програми «files_reminders» необхідна програма сповіщень. Вам слід або увімкнути сповіщення, або вимкнути files_reminder.",
"Set file reminders" : "Встановити нагадування для файлу",
+ "**📣 File reminders**\n\nSet file reminders.\n\nNote: to use the `File reminders` app, ensure that the `Notifications` app is installed and enabled. The `Notifications` app provides the necessary APIs for the `File reminders` app to work correctly." : "**📣 Нагадування про файли**\n\nВстановіть нагадування про файли.\n\nПримітка: щоб використовувати додаток «Нагадування про файли», переконайтеся, що додаток «Повідомлення» встановлено та увімкнено. Додаток «Повідомлення» надає необхідні API для коректної роботи додатка «Нагадування про файли».",
"Set reminder for \"{fileName}\"" : "Встановити нагадування для \"{fileName}\"",
"Set reminder at custom date & time" : "Встановити нагадування на власну дату та час",
"Clear reminder" : "Зняти нагадування",
@@ -24,6 +28,8 @@
"This weekend" : "Цими вихідними",
"Set reminder for this weekend" : "Встановити нагадування на ці вихідні",
"Next week" : "Наступний тиждень",
- "Set reminder for next week" : "Встановити нагадування на наступний тиждень"
+ "Set reminder for next week" : "Встановити нагадування на наступний тиждень",
+ "This files_reminder can work properly." : "Цей files_reminder може працювати належним чином.",
+ "The files_reminder app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "Для нормальної роботи програми files_reminder необхідна програма сповіщень. Вам слід або увімкнути сповіщення, або вимкнути files_reminder."
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js
index 924bb029de8..552ddc7dfeb 100644
--- a/apps/files_sharing/l10n/de.js
+++ b/apps/files_sharing/l10n/de.js
@@ -210,9 +210,9 @@ OC.L10N.register(
"Shared via link by {initiator}" : "Geteilt mittels Link von {initiator}",
"File request ({label})" : "Dateianfrage ({label})",
"Mail share ({label})" : "Mail teilen ({label})",
- "Share link ({label})" : "Link teilen ({label})",
+ "Share link ({label})" : "Externer Link ({label})",
"Mail share" : "E-Mail-Freigabe",
- "Share link ({index})" : "Link teilen ({index})",
+ "Share link ({index})" : "Externer Link ({index})",
"Create public link" : "Öffentlichen Link erstellen",
"Actions for \"{title}\"" : "Aktionen für \"{title}\"",
"Copy public link of \"{title}\" to clipboard" : "Öffentlichen Link von \"{title}\" in die Zwischenablage kopieren",
@@ -223,8 +223,8 @@ OC.L10N.register(
"Password protection (enforced)" : "Passwortschutz (erzwungen)",
"Password protection" : "Passwortschutz",
"Enter a password" : "Passwort eingeben",
- "Enable link expiration (enforced)" : "Gültigkeit des Links aktivieren (erzwungen)",
- "Enable link expiration" : "Ablauf des Links aktivieren",
+ "Enable link expiration (enforced)" : "Ablaufdatum des Links aktivieren (erzwungen)",
+ "Enable link expiration" : "Ablaufdatum des Links aktivieren",
"Enter expiration date (enforced)" : "Ablaufdatum eingeben (erzwungen)",
"Enter expiration date" : "Ablaufdatum eingeben",
"Create share" : "Freigabe erstellen",
@@ -341,7 +341,7 @@ OC.L10N.register(
"Public share" : "Öffentliche Freigabe",
"Publicly shared files." : "Öffentlich geteilte Dateien.",
"No files" : "Keine Dateien",
- "Files and folders shared with you will show up here" : "Mit dir geteilte Dateien und Ordner werden hier angezeigt",
+ "Files and folders shared with you will show up here" : "Freigegebene Dateien und Ordner werden hier angezeigt werden",
"Overview of shared files." : "Übersicht geteilter Dateien.",
"No shares" : "Keine Freigaben",
"Files and folders you shared or have been shared with you will show up here" : "Von dir oder mit dir geteilte Ordner und Dateien werden hier angezeigt",
diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json
index 05ff5637b68..99df8ab199c 100644
--- a/apps/files_sharing/l10n/de.json
+++ b/apps/files_sharing/l10n/de.json
@@ -208,9 +208,9 @@
"Shared via link by {initiator}" : "Geteilt mittels Link von {initiator}",
"File request ({label})" : "Dateianfrage ({label})",
"Mail share ({label})" : "Mail teilen ({label})",
- "Share link ({label})" : "Link teilen ({label})",
+ "Share link ({label})" : "Externer Link ({label})",
"Mail share" : "E-Mail-Freigabe",
- "Share link ({index})" : "Link teilen ({index})",
+ "Share link ({index})" : "Externer Link ({index})",
"Create public link" : "Öffentlichen Link erstellen",
"Actions for \"{title}\"" : "Aktionen für \"{title}\"",
"Copy public link of \"{title}\" to clipboard" : "Öffentlichen Link von \"{title}\" in die Zwischenablage kopieren",
@@ -221,8 +221,8 @@
"Password protection (enforced)" : "Passwortschutz (erzwungen)",
"Password protection" : "Passwortschutz",
"Enter a password" : "Passwort eingeben",
- "Enable link expiration (enforced)" : "Gültigkeit des Links aktivieren (erzwungen)",
- "Enable link expiration" : "Ablauf des Links aktivieren",
+ "Enable link expiration (enforced)" : "Ablaufdatum des Links aktivieren (erzwungen)",
+ "Enable link expiration" : "Ablaufdatum des Links aktivieren",
"Enter expiration date (enforced)" : "Ablaufdatum eingeben (erzwungen)",
"Enter expiration date" : "Ablaufdatum eingeben",
"Create share" : "Freigabe erstellen",
@@ -339,7 +339,7 @@
"Public share" : "Öffentliche Freigabe",
"Publicly shared files." : "Öffentlich geteilte Dateien.",
"No files" : "Keine Dateien",
- "Files and folders shared with you will show up here" : "Mit dir geteilte Dateien und Ordner werden hier angezeigt",
+ "Files and folders shared with you will show up here" : "Freigegebene Dateien und Ordner werden hier angezeigt werden",
"Overview of shared files." : "Übersicht geteilter Dateien.",
"No shares" : "Keine Freigaben",
"Files and folders you shared or have been shared with you will show up here" : "Von dir oder mit dir geteilte Ordner und Dateien werden hier angezeigt",
diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js
index 42f8084872a..c2514fd2500 100644
--- a/apps/files_sharing/l10n/de_DE.js
+++ b/apps/files_sharing/l10n/de_DE.js
@@ -141,7 +141,7 @@ OC.L10N.register(
"_{count} email address already added_::_{count} email addresses already added_" : ["{count} E-Mail-Adresse bereits hinzugefügt","{count} E-Mail-Adressen bereits hinzugefügt"],
"_{count} email address added_::_{count} email addresses added_" : ["{count} E-Mail-Adresse hinzugefügt","{count} E-Mail-Adressen hinzugefügt"],
"You can now share the link below to allow people to upload files to your directory." : "Sie können jetzt den unten stehenden Link freigeben, damit andere Dateien in Ihr Verzeichnis hochladen können.",
- "Share link" : "Link teilen",
+ "Share link" : "Freigabe Link",
"Copy to clipboard" : "In die Zwischenablage kopieren",
"Send link via email" : "Link per E-Mail verschicken",
"Enter an email address or paste a list" : "E-Mail-Adresse eingeben oder eine Liste einfügen",
@@ -210,21 +210,21 @@ OC.L10N.register(
"Shared via link by {initiator}" : "Geteilt mittels Link von {initiator}",
"File request ({label})" : "Dateianfrage ({label})",
"Mail share ({label})" : "Mail-Freigabe ({label})",
- "Share link ({label})" : "Link teilen ({label})",
+ "Share link ({label})" : "Externer Link ({label})",
"Mail share" : "E-Mail-Freigabe",
- "Share link ({index})" : "Link teilen ({index})",
+ "Share link ({index})" : "Externer Link ({index})",
"Create public link" : "Öffentlichen Link erstellen",
"Actions for \"{title}\"" : "Aktionen für \"{title}\"",
"Copy public link of \"{title}\" to clipboard" : "Öffentlichen Link von \"{title}\" in die Zwischenablage kopieren",
"Error, please enter proper password and/or expiration date" : "Fehler. Bitte gebe das richtige Passwort und/oder Ablaufdatum ein",
"Link share created" : "Link-Freigabe erstellt",
"Error while creating the share" : "Fehler beim Erstellen der Freigabe",
- "Please enter the following required information before creating the share" : "Bitte geben Sie die benötigten Informationen ein, bevor die Freigabe erstellt wird",
+ "Please enter the following required information before creating the share" : "Vor Erstellen der Freigabe bitte die erforderlichen Informationen eingeben",
"Password protection (enforced)" : "Passwortschutz (erzwungen)",
"Password protection" : "Passwortschutz",
"Enter a password" : "Passwort eingeben",
- "Enable link expiration (enforced)" : "Gültigkeit des Links aktivieren (erzwungen)",
- "Enable link expiration" : "Gültigkeit des Links aktivieren",
+ "Enable link expiration (enforced)" : "Ablaufdatum des Links aktivieren (erzwungen)",
+ "Enable link expiration" : "Ablaufdatum des Links aktivieren",
"Enter expiration date (enforced)" : "Ablaufdatum eingeben (erzwungen)",
"Enter expiration date" : "Ablaufdatum eingeben",
"Create share" : "Freigabe erstellen",
@@ -283,7 +283,7 @@ OC.L10N.register(
"Advanced settings" : "Erweiterte Einstellungen",
"Share label" : "Freigabe-Label",
"Share link token" : "Freigabe-Token teilen",
- "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Das öffentliche Freigabelink-Token auf einen Begriff festlegen, der leicht zu merken ist , oder generieren Sie ein neues Token. Es ist nicht empfehlenswert, ein erratbares Token für Freigaben zu verwenden, die vertrauliche Informationen enthalten.",
+ "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Das öffentliche Freigabelink-Token auf einen Begriff festlegen, der leicht zu merken ist, oder ein neues Token erstellen. Es ist nicht zu empfehlen, für Freigaben , die vertrauliche Informationen enthalten, ein erratbares Token zu verwenden.",
"Generating…" : "Generieren…",
"Generate new token" : "Neues Token generieren",
"Set password" : "Passwort festlegen",
@@ -398,7 +398,7 @@ OC.L10N.register(
"Password created successfully" : "Passwort erstellt",
"Error generating password from password policy" : "Fehler beim Erzeugen des Passworts aufgrund der Passwortrichtlinie",
"Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Ihnen und der Gruppe {group} geteilt",
- "Shared with you and {circle} by {owner}" : "{owner} hat dies mit Dir und dem Kreis {circle} geteilt",
+ "Shared with you and {circle} by {owner}" : "{owner} hat dies mit Ihnen und dem Kreis {circle} geteilt",
"Shared with you and the conversation {conversation} by {owner}" : "{owner} hat diese mit Ihnen und der Unterhaltung {conversation} geteilt",
"Shared with you in a conversation by {owner}" : "{owner} hat diese mit Ihnen in einer Unterhaltung geteilt",
"Share note" : "Notiz teilen",
diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json
index 875aa3a5f6c..4a8a5fcfeb3 100644
--- a/apps/files_sharing/l10n/de_DE.json
+++ b/apps/files_sharing/l10n/de_DE.json
@@ -139,7 +139,7 @@
"_{count} email address already added_::_{count} email addresses already added_" : ["{count} E-Mail-Adresse bereits hinzugefügt","{count} E-Mail-Adressen bereits hinzugefügt"],
"_{count} email address added_::_{count} email addresses added_" : ["{count} E-Mail-Adresse hinzugefügt","{count} E-Mail-Adressen hinzugefügt"],
"You can now share the link below to allow people to upload files to your directory." : "Sie können jetzt den unten stehenden Link freigeben, damit andere Dateien in Ihr Verzeichnis hochladen können.",
- "Share link" : "Link teilen",
+ "Share link" : "Freigabe Link",
"Copy to clipboard" : "In die Zwischenablage kopieren",
"Send link via email" : "Link per E-Mail verschicken",
"Enter an email address or paste a list" : "E-Mail-Adresse eingeben oder eine Liste einfügen",
@@ -208,21 +208,21 @@
"Shared via link by {initiator}" : "Geteilt mittels Link von {initiator}",
"File request ({label})" : "Dateianfrage ({label})",
"Mail share ({label})" : "Mail-Freigabe ({label})",
- "Share link ({label})" : "Link teilen ({label})",
+ "Share link ({label})" : "Externer Link ({label})",
"Mail share" : "E-Mail-Freigabe",
- "Share link ({index})" : "Link teilen ({index})",
+ "Share link ({index})" : "Externer Link ({index})",
"Create public link" : "Öffentlichen Link erstellen",
"Actions for \"{title}\"" : "Aktionen für \"{title}\"",
"Copy public link of \"{title}\" to clipboard" : "Öffentlichen Link von \"{title}\" in die Zwischenablage kopieren",
"Error, please enter proper password and/or expiration date" : "Fehler. Bitte gebe das richtige Passwort und/oder Ablaufdatum ein",
"Link share created" : "Link-Freigabe erstellt",
"Error while creating the share" : "Fehler beim Erstellen der Freigabe",
- "Please enter the following required information before creating the share" : "Bitte geben Sie die benötigten Informationen ein, bevor die Freigabe erstellt wird",
+ "Please enter the following required information before creating the share" : "Vor Erstellen der Freigabe bitte die erforderlichen Informationen eingeben",
"Password protection (enforced)" : "Passwortschutz (erzwungen)",
"Password protection" : "Passwortschutz",
"Enter a password" : "Passwort eingeben",
- "Enable link expiration (enforced)" : "Gültigkeit des Links aktivieren (erzwungen)",
- "Enable link expiration" : "Gültigkeit des Links aktivieren",
+ "Enable link expiration (enforced)" : "Ablaufdatum des Links aktivieren (erzwungen)",
+ "Enable link expiration" : "Ablaufdatum des Links aktivieren",
"Enter expiration date (enforced)" : "Ablaufdatum eingeben (erzwungen)",
"Enter expiration date" : "Ablaufdatum eingeben",
"Create share" : "Freigabe erstellen",
@@ -281,7 +281,7 @@
"Advanced settings" : "Erweiterte Einstellungen",
"Share label" : "Freigabe-Label",
"Share link token" : "Freigabe-Token teilen",
- "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Das öffentliche Freigabelink-Token auf einen Begriff festlegen, der leicht zu merken ist , oder generieren Sie ein neues Token. Es ist nicht empfehlenswert, ein erratbares Token für Freigaben zu verwenden, die vertrauliche Informationen enthalten.",
+ "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Das öffentliche Freigabelink-Token auf einen Begriff festlegen, der leicht zu merken ist, oder ein neues Token erstellen. Es ist nicht zu empfehlen, für Freigaben , die vertrauliche Informationen enthalten, ein erratbares Token zu verwenden.",
"Generating…" : "Generieren…",
"Generate new token" : "Neues Token generieren",
"Set password" : "Passwort festlegen",
@@ -396,7 +396,7 @@
"Password created successfully" : "Passwort erstellt",
"Error generating password from password policy" : "Fehler beim Erzeugen des Passworts aufgrund der Passwortrichtlinie",
"Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Ihnen und der Gruppe {group} geteilt",
- "Shared with you and {circle} by {owner}" : "{owner} hat dies mit Dir und dem Kreis {circle} geteilt",
+ "Shared with you and {circle} by {owner}" : "{owner} hat dies mit Ihnen und dem Kreis {circle} geteilt",
"Shared with you and the conversation {conversation} by {owner}" : "{owner} hat diese mit Ihnen und der Unterhaltung {conversation} geteilt",
"Shared with you in a conversation by {owner}" : "{owner} hat diese mit Ihnen in einer Unterhaltung geteilt",
"Share note" : "Notiz teilen",
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index a4b3ce4bd80..ec4da5a6c7d 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -128,7 +128,7 @@ OC.L10N.register(
"Select a date" : "Sélectionner une date",
"Your administrator has enforced a {count} days expiration policy." : "Votre administrateur a imposé une politique d'expiration de {count} jours.",
"What password should be used for the request?" : "Quel mot de passe doit être utilisé pour la demande ?",
- "Set a password" : "Saisissez un mot de passe",
+ "Set a password" : "Saisir un mot de passe",
"Password" : "Mot de passe",
"Enter a valid password" : "Saisir un mot de passe valide",
"Generate a new password" : "Générer un nouveau mot de passe",
@@ -143,7 +143,7 @@ OC.L10N.register(
"You can now share the link below to allow people to upload files to your directory." : "Vous pouvez désormais partager le lien ci-dessous pour permettre aux gens de téléverser des fichiers dans votre dossier.",
"Share link" : "Lien de partage",
"Copy to clipboard" : "Copier dans le presse-papiers",
- "Send link via email" : "Envoyer le lien par mail",
+ "Send link via email" : "Envoyer le lien par e-mail",
"Enter an email address or paste a list" : "Entrez une adresse e-mail ou collez une liste",
"Remove email" : "Retirer l'e-mail",
"Select a destination" : "Choisir une destination",
@@ -169,8 +169,8 @@ OC.L10N.register(
"Error sending emails: {errorMessage}" : "Erreur à l'envoi des mails {errorMessage}",
"Error sending emails" : "Erreur à l'envoi des e-mails",
"Create a file request" : "Créer une demande de fichier",
- "Collect files from others even if they do not have an account." : "Collecter les fichiers d'autres personnes même si elles n'ont pas de compte.",
- "To ensure you can receive files, verify you have enough storage available." : "Pour vous assurer que vous pouvez recevoir des fichiers, vérifier que vous avez suffisamment d'espace disque.",
+ "Collect files from others even if they do not have an account." : "Collectez des fichiers auprès d'autres personnes, même si elles n'ont pas de compte.",
+ "To ensure you can receive files, verify you have enough storage available." : "Pour vous assurer de pouvoir recevoir des fichiers, vérifiez que vous disposez d'un espace de stockage suffisant.",
"File request" : "Demande de fichier",
"Previous step" : "Étape précédente",
"Cancel" : "Annuler",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index b3a8d9cdf08..29f6978ea47 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -126,7 +126,7 @@
"Select a date" : "Sélectionner une date",
"Your administrator has enforced a {count} days expiration policy." : "Votre administrateur a imposé une politique d'expiration de {count} jours.",
"What password should be used for the request?" : "Quel mot de passe doit être utilisé pour la demande ?",
- "Set a password" : "Saisissez un mot de passe",
+ "Set a password" : "Saisir un mot de passe",
"Password" : "Mot de passe",
"Enter a valid password" : "Saisir un mot de passe valide",
"Generate a new password" : "Générer un nouveau mot de passe",
@@ -141,7 +141,7 @@
"You can now share the link below to allow people to upload files to your directory." : "Vous pouvez désormais partager le lien ci-dessous pour permettre aux gens de téléverser des fichiers dans votre dossier.",
"Share link" : "Lien de partage",
"Copy to clipboard" : "Copier dans le presse-papiers",
- "Send link via email" : "Envoyer le lien par mail",
+ "Send link via email" : "Envoyer le lien par e-mail",
"Enter an email address or paste a list" : "Entrez une adresse e-mail ou collez une liste",
"Remove email" : "Retirer l'e-mail",
"Select a destination" : "Choisir une destination",
@@ -167,8 +167,8 @@
"Error sending emails: {errorMessage}" : "Erreur à l'envoi des mails {errorMessage}",
"Error sending emails" : "Erreur à l'envoi des e-mails",
"Create a file request" : "Créer une demande de fichier",
- "Collect files from others even if they do not have an account." : "Collecter les fichiers d'autres personnes même si elles n'ont pas de compte.",
- "To ensure you can receive files, verify you have enough storage available." : "Pour vous assurer que vous pouvez recevoir des fichiers, vérifier que vous avez suffisamment d'espace disque.",
+ "Collect files from others even if they do not have an account." : "Collectez des fichiers auprès d'autres personnes, même si elles n'ont pas de compte.",
+ "To ensure you can receive files, verify you have enough storage available." : "Pour vous assurer de pouvoir recevoir des fichiers, vérifiez que vous disposez d'un espace de stockage suffisant.",
"File request" : "Demande de fichier",
"Previous step" : "Étape précédente",
"Cancel" : "Annuler",
diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js
index 23f0a3b4a28..fa7d330d86e 100644
--- a/apps/files_sharing/l10n/it.js
+++ b/apps/files_sharing/l10n/it.js
@@ -254,7 +254,7 @@ OC.L10N.register(
"Search for internal recipients" : "Cerca destinatari interni",
"Note from" : "Nota da",
"Note:" : "Nota:",
- "File drop" : "Elimina file",
+ "File drop" : "Deposita file",
"Upload files to {foldername}." : "Carica i file su{foldername}.",
"By uploading files, you agree to the terms of service." : "Caricando i file accetti i termini del servizio.",
"Successfully uploaded files" : "File caricati correttamente",
diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json
index fc84fa187f2..77427218f18 100644
--- a/apps/files_sharing/l10n/it.json
+++ b/apps/files_sharing/l10n/it.json
@@ -252,7 +252,7 @@
"Search for internal recipients" : "Cerca destinatari interni",
"Note from" : "Nota da",
"Note:" : "Nota:",
- "File drop" : "Elimina file",
+ "File drop" : "Deposita file",
"Upload files to {foldername}." : "Carica i file su{foldername}.",
"By uploading files, you agree to the terms of service." : "Caricando i file accetti i termini del servizio.",
"Successfully uploaded files" : "File caricati correttamente",
diff --git a/apps/files_sharing/l10n/mk.js b/apps/files_sharing/l10n/mk.js
index cec23d796d7..2adfb9c2b4b 100644
--- a/apps/files_sharing/l10n/mk.js
+++ b/apps/files_sharing/l10n/mk.js
@@ -224,7 +224,7 @@ OC.L10N.register(
"Password protection" : "Заштитено со лозинка",
"Enter a password" : "Внесете лозинка",
"Enable link expiration (enforced)" : "Овозможи истекување на линк (задолжително)",
- "Enable link expiration" : "Овозможи истекување на ллинк",
+ "Enable link expiration" : "Овозможи истекување на линк",
"Enter expiration date (enforced)" : "Внесете датум на истекување (задолжително)",
"Enter expiration date" : "Внесете датум на истекување",
"Create share" : "Ново споделување",
diff --git a/apps/files_sharing/l10n/mk.json b/apps/files_sharing/l10n/mk.json
index 01c8062bc45..a2d48498c20 100644
--- a/apps/files_sharing/l10n/mk.json
+++ b/apps/files_sharing/l10n/mk.json
@@ -222,7 +222,7 @@
"Password protection" : "Заштитено со лозинка",
"Enter a password" : "Внесете лозинка",
"Enable link expiration (enforced)" : "Овозможи истекување на линк (задолжително)",
- "Enable link expiration" : "Овозможи истекување на ллинк",
+ "Enable link expiration" : "Овозможи истекување на линк",
"Enter expiration date (enforced)" : "Внесете датум на истекување (задолжително)",
"Enter expiration date" : "Внесете датум на истекување",
"Create share" : "Ново споделување",
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 599859b6be9..5d02bef1e15 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -368,6 +368,7 @@ OC.L10N.register(
"List of unapproved shares." : "Список ресурсов общего доступа, которые вы еще не приняли",
"No pending shares" : "Ожидающие общие ресурсы отсуствуют",
"Shares you have received but not approved will show up here" : "Здесь появятся ресурсы общего доступа, которые Вам предоставлены, но еще не подтверждены с Вашей стороны",
+ "Error deleting the share: {errorMessage}" : "Ошибка при удалении общего ресурса: {errorMessage}",
"Error deleting the share" : "Ошибка прекращения общего доступа",
"Error updating the share: {errorMessage}" : "Не удалось изменить общий ресурс: {errorMessage}",
"Error updating the share" : "Ошибка изменения параметров общего доступа",
diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index f570c39184c..9b6b0154230 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -366,6 +366,7 @@
"List of unapproved shares." : "Список ресурсов общего доступа, которые вы еще не приняли",
"No pending shares" : "Ожидающие общие ресурсы отсуствуют",
"Shares you have received but not approved will show up here" : "Здесь появятся ресурсы общего доступа, которые Вам предоставлены, но еще не подтверждены с Вашей стороны",
+ "Error deleting the share: {errorMessage}" : "Ошибка при удалении общего ресурса: {errorMessage}",
"Error deleting the share" : "Ошибка прекращения общего доступа",
"Error updating the share: {errorMessage}" : "Не удалось изменить общий ресурс: {errorMessage}",
"Error updating the share" : "Ошибка изменения параметров общего доступа",
diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js
index ace63ae6a4a..7da314c64ac 100644
--- a/apps/files_sharing/l10n/uk.js
+++ b/apps/files_sharing/l10n/uk.js
@@ -116,6 +116,7 @@ OC.L10N.register(
"Remember to upload the files to %s" : "Пам'ятати про завантаження файлів до %s",
"We would like to kindly remind you that you have not yet uploaded any files to the shared folder." : "Нагадування про те, що ви ще не завантажили жодного файлу до спільного каталогу.",
"Open \"%s\"" : "Відкрити \"%s\"",
+ "This application enables people to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable people can then share files and folders with other accounts and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other people outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Ця програма дозволяє користувачам обмінюватися файлами в Nextcloud. Якщо ця функція увімкнена, адміністратор може вибрати, які групи можуть обмінюватися файлами. Відповідні користувачі можуть обмінюватися файлами та каталогами з іншими обліковими записами та групами в Nextcloud. Крім того, якщо адміністратор увімкне функцію спільного доступу за посиланням, зовнішнє посилання можна використовувати для обміну файлами з іншими людьми поза Nextcloud. Адміністратори також можуть встановлювати паролі, терміни дії та вмикати обмін між серверами за допомогою посилань для спільного доступу, а також обмін з мобільних пристроїв.\n\nВимкнення цієї функції видаляє спільні файли та каталоги на сервері для всіх одержувачів спільного доступу, а також на клієнтах синхронізації та в мобільних додатках. Більше інформації можна знайти в документації Nextcloud.",
"People" : "Користувачі",
"Filter accounts" : "Вибрати користувачів",
"The request will expire on {date} at midnight and will be password protected." : "Термін дії запиту спливе опівночі {date}, запит буде захищено паролем. ",
diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json
index 3af74737035..d1ad7a12475 100644
--- a/apps/files_sharing/l10n/uk.json
+++ b/apps/files_sharing/l10n/uk.json
@@ -114,6 +114,7 @@
"Remember to upload the files to %s" : "Пам'ятати про завантаження файлів до %s",
"We would like to kindly remind you that you have not yet uploaded any files to the shared folder." : "Нагадування про те, що ви ще не завантажили жодного файлу до спільного каталогу.",
"Open \"%s\"" : "Відкрити \"%s\"",
+ "This application enables people to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable people can then share files and folders with other accounts and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other people outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Ця програма дозволяє користувачам обмінюватися файлами в Nextcloud. Якщо ця функція увімкнена, адміністратор може вибрати, які групи можуть обмінюватися файлами. Відповідні користувачі можуть обмінюватися файлами та каталогами з іншими обліковими записами та групами в Nextcloud. Крім того, якщо адміністратор увімкне функцію спільного доступу за посиланням, зовнішнє посилання можна використовувати для обміну файлами з іншими людьми поза Nextcloud. Адміністратори також можуть встановлювати паролі, терміни дії та вмикати обмін між серверами за допомогою посилань для спільного доступу, а також обмін з мобільних пристроїв.\n\nВимкнення цієї функції видаляє спільні файли та каталоги на сервері для всіх одержувачів спільного доступу, а також на клієнтах синхронізації та в мобільних додатках. Більше інформації можна знайти в документації Nextcloud.",
"People" : "Користувачі",
"Filter accounts" : "Вибрати користувачів",
"The request will expire on {date} at midnight and will be password protected." : "Термін дії запиту спливе опівночі {date}, запит буде захищено паролем. ",
diff --git a/apps/files_sharing/lib/Config/ConfigLexicon.php b/apps/files_sharing/lib/Config/ConfigLexicon.php
index a463b4e7ef2..c2743a2c4ce 100644
--- a/apps/files_sharing/lib/Config/ConfigLexicon.php
+++ b/apps/files_sharing/lib/Config/ConfigLexicon.php
@@ -8,28 +8,30 @@ declare(strict_types=1);
namespace OCA\Files_Sharing\Config;
-use NCU\Config\Lexicon\ConfigLexiconEntry;
-use NCU\Config\Lexicon\ConfigLexiconStrictness;
-use NCU\Config\Lexicon\IConfigLexicon;
-use NCU\Config\ValueType;
+use OCP\Config\Lexicon\Entry;
+use OCP\Config\Lexicon\ILexicon;
+use OCP\Config\Lexicon\Strictness;
+use OCP\Config\ValueType;
/**
* Config Lexicon for files_sharing.
*
* Please Add & Manage your Config Keys in that file and keep the Lexicon up to date!
*
- * {@see IConfigLexicon}
+ * {@see ILexicon}
*/
-class ConfigLexicon implements IConfigLexicon {
+class ConfigLexicon implements ILexicon {
public const SHOW_FEDERATED_AS_INTERNAL = 'show_federated_shares_as_internal';
+ public const SHOW_FEDERATED_TO_TRUSTED_AS_INTERNAL = 'show_federated_shares_to_trusted_servers_as_internal';
- public function getStrictness(): ConfigLexiconStrictness {
- return ConfigLexiconStrictness::IGNORE;
+ public function getStrictness(): Strictness {
+ return Strictness::IGNORE;
}
public function getAppConfigs(): array {
return [
- new ConfigLexiconEntry(self::SHOW_FEDERATED_AS_INTERNAL, ValueType::BOOL, false, 'shows federated shares as internal shares', true),
+ new Entry(self::SHOW_FEDERATED_AS_INTERNAL, ValueType::BOOL, false, 'shows federated shares as internal shares', true),
+ new Entry(self::SHOW_FEDERATED_TO_TRUSTED_AS_INTERNAL, ValueType::BOOL, false, 'shows federated shares to trusted servers as internal shares', true),
];
}
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index 7591493167f..095a8a75963 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -15,6 +15,7 @@ use OC\Files\FileInfo;
use OC\Files\Storage\Wrapper\Wrapper;
use OCA\Circles\Api\v1\Circles;
use OCA\Deck\Sharing\ShareAPIHelper;
+use OCA\Federation\TrustedServers;
use OCA\Files\Helper;
use OCA\Files_Sharing\Exceptions\SharingRightsException;
use OCA\Files_Sharing\External\Storage;
@@ -76,6 +77,7 @@ use Psr\Log\LoggerInterface;
class ShareAPIController extends OCSController {
private ?Node $lockedNode = null;
+ private array $trustedServerCache = [];
/**
* Share20OCS constructor.
@@ -100,6 +102,7 @@ class ShareAPIController extends OCSController {
private IProviderFactory $factory,
private IMailer $mailer,
private ITagManager $tagManager,
+ private ?TrustedServers $trustedServers,
private ?string $userId = null,
) {
parent::__construct($appName, $request);
@@ -202,6 +205,32 @@ class ShareAPIController extends OCSController {
$result['item_size'] = $node->getSize();
$result['item_mtime'] = $node->getMTime();
+ if ($this->trustedServers !== null && in_array($share->getShareType(), [IShare::TYPE_REMOTE, IShare::TYPE_REMOTE_GROUP], true)) {
+ $result['is_trusted_server'] = false;
+ $sharedWith = $share->getSharedWith();
+ $remoteIdentifier = is_string($sharedWith) ? strrchr($sharedWith, '@') : false;
+ if ($remoteIdentifier !== false) {
+ $remote = substr($remoteIdentifier, 1);
+
+ if (isset($this->trustedServerCache[$remote])) {
+ $result['is_trusted_server'] = $this->trustedServerCache[$remote];
+ } else {
+ try {
+ $isTrusted = $this->trustedServers->isTrustedServer($remote);
+ $this->trustedServerCache[$remote] = $isTrusted;
+ $result['is_trusted_server'] = $isTrusted;
+ } catch (\Exception $e) {
+ // Server not found or other issue, we consider it not trusted
+ $this->trustedServerCache[$remote] = false;
+ $this->logger->error(
+ 'Error checking if remote server is trusted (treating as untrusted): ' . $e->getMessage(),
+ ['exception' => $e]
+ );
+ }
+ }
+ }
+ }
+
$expiration = $share->getExpirationDate();
if ($expiration !== null) {
$expiration->setTimezone($this->dateTimeZone->getTimeZone());
diff --git a/apps/files_sharing/lib/Listener/LoadSidebarListener.php b/apps/files_sharing/lib/Listener/LoadSidebarListener.php
index 9f0eee9159a..88c39f38545 100644
--- a/apps/files_sharing/lib/Listener/LoadSidebarListener.php
+++ b/apps/files_sharing/lib/Listener/LoadSidebarListener.php
@@ -38,6 +38,7 @@ class LoadSidebarListener implements IEventListener {
$appConfig = Server::get(IAppConfig::class);
$this->initialState->provideInitialState('showFederatedSharesAsInternal', $appConfig->getValueBool('files_sharing', ConfigLexicon::SHOW_FEDERATED_AS_INTERNAL));
+ $this->initialState->provideInitialState('showFederatedSharesToTrustedServersAsInternal', $appConfig->getValueBool('files_sharing', ConfigLexicon::SHOW_FEDERATED_TO_TRUSTED_AS_INTERNAL));
Util::addScript(Application::APP_ID, 'files_sharing_tab', 'files');
}
}
diff --git a/apps/files_sharing/lib/ResponseDefinitions.php b/apps/files_sharing/lib/ResponseDefinitions.php
index 6b6b0fcc4b6..71a2b25a70c 100644
--- a/apps/files_sharing/lib/ResponseDefinitions.php
+++ b/apps/files_sharing/lib/ResponseDefinitions.php
@@ -22,6 +22,7 @@ namespace OCA\Files_Sharing;
* file_target: string,
* has_preview: bool,
* hide_download: 0|1,
+ * is_trusted_server?: bool,
* is-mount-root: bool,
* id: string,
* item_mtime: int,
diff --git a/apps/files_sharing/openapi.json b/apps/files_sharing/openapi.json
index 627c25ce8ea..b2df1ecb7b3 100644
--- a/apps/files_sharing/openapi.json
+++ b/apps/files_sharing/openapi.json
@@ -548,6 +548,9 @@
1
]
},
+ "is_trusted_server": {
+ "type": "boolean"
+ },
"is-mount-root": {
"type": "boolean"
},
@@ -897,40 +900,76 @@
"type": "string"
},
"name": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"email": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"address": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"website": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"twitter": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"phone": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"twitter_signature": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"website_signature": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
},
"userid": {
- "$ref": "#/components/schemas/Lookup",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Lookup"
+ }
+ ]
}
}
},
diff --git a/apps/files_sharing/src/components/FileListFilterAccount.vue b/apps/files_sharing/src/components/FileListFilterAccount.vue
index 46c847e7b19..150516e139b 100644
--- a/apps/files_sharing/src/components/FileListFilterAccount.vue
+++ b/apps/files_sharing/src/components/FileListFilterAccount.vue
@@ -8,7 +8,7 @@
:filter-name="t('files_sharing', 'People')"
@reset-filter="resetFilter">
<template #icon>
- <NcIconSvgWrapper :path="mdiAccountMultiple" />
+ <NcIconSvgWrapper :path="mdiAccountMultipleOutline" />
</template>
<NcActionInput v-if="availableAccounts.length > 1"
:label="t('files_sharing', 'Filter accounts')"
@@ -39,7 +39,7 @@
import type { IAccountData } from '../files_filters/AccountFilter.ts'
import { translate as t } from '@nextcloud/l10n'
-import { mdiAccountMultiple } from '@mdi/js'
+import { mdiAccountMultipleOutline } from '@mdi/js'
import { computed, ref, watch } from 'vue'
import FileListFilter from '../../../files/src/components/FileListFilter/FileListFilter.vue'
diff --git a/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogIntro.vue b/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogIntro.vue
index 2d4d8eafa2b..5ac60c37e29 100644
--- a/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogIntro.vue
+++ b/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogIntro.vue
@@ -78,7 +78,7 @@ import { getFilePickerBuilder } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import IconFolder from 'vue-material-design-icons/Folder.vue'
-import IconInfo from 'vue-material-design-icons/Information.vue'
+import IconInfo from 'vue-material-design-icons/InformationOutline.vue'
import IconLock from 'vue-material-design-icons/Lock.vue'
import NcTextArea from '@nextcloud/vue/components/NcTextArea'
import NcTextField from '@nextcloud/vue/components/NcTextField'
diff --git a/apps/files_sharing/src/components/SharingEntry.vue b/apps/files_sharing/src/components/SharingEntry.vue
index 4ff5fae364b..1fbe740cb11 100644
--- a/apps/files_sharing/src/components/SharingEntry.vue
+++ b/apps/files_sharing/src/components/SharingEntry.vue
@@ -77,9 +77,9 @@ export default {
title += ` (${t('files_sharing', 'group')})`
} else if (this.share.type === ShareType.Room) {
title += ` (${t('files_sharing', 'conversation')})`
- } else if (this.share.type === ShareType.Remote) {
+ } else if (this.share.type === ShareType.Remote && !this.share.isTrustedServer) {
title += ` (${t('files_sharing', 'remote')})`
- } else if (this.share.type === ShareType.RemoteGroup) {
+ } else if (this.share.type === ShareType.RemoteGroup && !this.share.isTrustedServer) {
title += ` (${t('files_sharing', 'remote group')})`
} else if (this.share.type === ShareType.Guest) {
title += ` (${t('files_sharing', 'guest')})`
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 702b876306f..6a456fa0a15 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -74,10 +74,10 @@
{{ config.enforcePasswordForPublicLink ? t('files_sharing', 'Password protection (enforced)') : t('files_sharing', 'Password protection') }}
</NcActionCheckbox>
- <NcActionInput v-if="pendingEnforcedPassword || share.password"
+ <NcActionInput v-if="pendingEnforcedPassword || isPasswordProtected"
class="share-link-password"
:label="t('files_sharing', 'Enter a password')"
- :value.sync="share.password"
+ :value.sync="share.newPassword"
:disabled="saving"
:required="config.enableLinkPasswordByDefault || config.enforcePasswordForPublicLink"
:minlength="isPasswordPolicyEnabled && config.passwordPolicy.minLength"
@@ -115,7 +115,8 @@
</template>
</NcActionInput>
- <NcActionButton @click.prevent.stop="onNewLinkShare(true)">
+ <NcActionButton :disabled="pendingEnforcedPassword && !share.newPassword"
+ @click.prevent.stop="onNewLinkShare(true)">
<template #icon>
<CheckIcon :size="20" />
</template>
@@ -242,10 +243,10 @@ import NcAvatar from '@nextcloud/vue/components/NcAvatar'
import NcDialog from '@nextcloud/vue/components/NcDialog'
import Tune from 'vue-material-design-icons/Tune.vue'
-import IconCalendarBlank from 'vue-material-design-icons/CalendarBlank.vue'
+import IconCalendarBlank from 'vue-material-design-icons/CalendarBlankOutline.vue'
import IconQr from 'vue-material-design-icons/Qrcode.vue'
import ErrorIcon from 'vue-material-design-icons/Exclamation.vue'
-import LockIcon from 'vue-material-design-icons/Lock.vue'
+import LockIcon from 'vue-material-design-icons/LockOutline.vue'
import CheckIcon from 'vue-material-design-icons/CheckBold.vue'
import ClipboardIcon from 'vue-material-design-icons/ContentCopy.vue'
import CloseIcon from 'vue-material-design-icons/Close.vue'
@@ -646,6 +647,7 @@ export default {
// create share & close menu
const share = new Share(shareDefaults)
+ share.newPassword = share.password
const component = await new Promise(resolve => {
this.$emit('add:share', share, resolve)
})
@@ -838,7 +840,7 @@ export default {
*/
onPasswordSubmit() {
if (this.hasUnsavedPassword) {
- this.share.password = this.share.newPassword.trim()
+ this.share.newPassword = this.share.newPassword.trim()
this.queueUpdate('password')
}
},
@@ -853,7 +855,7 @@ export default {
*/
onPasswordProtectedByTalkChange() {
if (this.hasUnsavedPassword) {
- this.share.password = this.share.newPassword.trim()
+ this.share.newPassword = this.share.newPassword.trim()
}
this.queueUpdate('sendPasswordByTalk', 'password')
diff --git a/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue b/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue
index 041841201d0..102eea63cb6 100644
--- a/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue
+++ b/apps/files_sharing/src/components/SharingEntryQuickShareSelect.vue
@@ -36,7 +36,7 @@ import ShareDetails from '../mixins/ShareDetails.js'
import NcActions from '@nextcloud/vue/components/NcActions'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import IconEyeOutline from 'vue-material-design-icons/EyeOutline.vue'
-import IconPencil from 'vue-material-design-icons/Pencil.vue'
+import IconPencil from 'vue-material-design-icons/PencilOutline.vue'
import IconFileUpload from 'vue-material-design-icons/FileUpload.vue'
import IconTune from 'vue-material-design-icons/Tune.vue'
diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue
index b886ba95a17..f50dc96fc08 100644
--- a/apps/files_sharing/src/components/SharingInput.vue
+++ b/apps/files_sharing/src/components/SharingInput.vue
@@ -192,14 +192,27 @@ export default {
lookup = true
}
- let shareType = []
-
const remoteTypes = [ShareType.Remote, ShareType.RemoteGroup]
-
- if (this.isExternal && !this.config.showFederatedSharesAsInternal) {
- shareType.push(...remoteTypes)
+ const shareType = []
+
+ const showFederatedAsInternal
+ = this.config.showFederatedSharesAsInternal
+ || this.config.showFederatedSharesToTrustedServersAsInternal
+
+ const shouldAddRemoteTypes
+ // For internal users, add remote types if config says to show them as internal
+ = (!this.isExternal && showFederatedAsInternal)
+ // For external users, add them if config *doesn't* say to show them as internal
+ || (this.isExternal && !showFederatedAsInternal)
+ // Edge case: federated-to-trusted is a separate "add" trigger for external users
+ || (this.isExternal && this.config.showFederatedSharesToTrustedServersAsInternal)
+
+ if (this.isExternal) {
+ if (getCapabilities().files_sharing.public.enabled === true) {
+ shareType.push(ShareType.Email)
+ }
} else {
- shareType = shareType.concat([
+ shareType.push(
ShareType.User,
ShareType.Group,
ShareType.Team,
@@ -207,15 +220,11 @@ export default {
ShareType.Guest,
ShareType.Deck,
ShareType.ScienceMesh,
- ])
-
- if (this.config.showFederatedSharesAsInternal) {
- shareType.push(...remoteTypes)
- }
+ )
}
- if (getCapabilities().files_sharing.public.enabled === true && this.isExternal) {
- shareType.push(ShareType.Email)
+ if (shouldAddRemoteTypes) {
+ shareType.push(...remoteTypes)
}
let request = null
@@ -366,6 +375,11 @@ export default {
// filter out existing mail shares
if (share.value.shareType === ShareType.Email) {
+ // When sharing internally, we don't want to suggest email addresses
+ // that the user previously created shares to
+ if (!this.isExternal) {
+ return arr
+ }
const emails = this.linkShares.map(elem => elem.shareWith)
if (emails.indexOf(share.value.shareWith.trim()) !== -1) {
return arr
diff --git a/apps/files_sharing/src/files_actions/sharingStatusAction.ts b/apps/files_sharing/src/files_actions/sharingStatusAction.ts
index 75fe7d54096..2dfd8467c5b 100644
--- a/apps/files_sharing/src/files_actions/sharingStatusAction.ts
+++ b/apps/files_sharing/src/files_actions/sharingStatusAction.ts
@@ -8,8 +8,8 @@ import { translate as t } from '@nextcloud/l10n'
import { ShareType } from '@nextcloud/sharing'
import { isPublicShare } from '@nextcloud/sharing/public'
-import AccountGroupSvg from '@mdi/svg/svg/account-group.svg?raw'
-import AccountPlusSvg from '@mdi/svg/svg/account-plus.svg?raw'
+import AccountGroupSvg from '@mdi/svg/svg/account-group-outline.svg?raw'
+import AccountPlusSvg from '@mdi/svg/svg/account-plus-outline.svg?raw'
import LinkSvg from '@mdi/svg/svg/link.svg?raw'
import CircleSvg from '../../../../core/img/apps/circles.svg?raw'
diff --git a/apps/files_sharing/src/files_newMenu/newFileRequest.ts b/apps/files_sharing/src/files_newMenu/newFileRequest.ts
index f7c5cc4057a..1d58e3552a2 100644
--- a/apps/files_sharing/src/files_newMenu/newFileRequest.ts
+++ b/apps/files_sharing/src/files_newMenu/newFileRequest.ts
@@ -7,7 +7,7 @@ import type { Entry, Folder, Node } from '@nextcloud/files'
import { defineAsyncComponent } from 'vue'
import { spawnDialog } from '@nextcloud/dialogs'
import { translate as t } from '@nextcloud/l10n'
-import FileUploadSvg from '@mdi/svg/svg/file-upload.svg?raw'
+import FileUploadSvg from '@mdi/svg/svg/file-upload-outline.svg?raw'
import Config from '../services/ConfigService'
import { isPublicShare } from '@nextcloud/sharing/public'
diff --git a/apps/files_sharing/src/files_views/shares.ts b/apps/files_sharing/src/files_views/shares.ts
index 297fd4796fd..fd5e908638c 100644
--- a/apps/files_sharing/src/files_views/shares.ts
+++ b/apps/files_sharing/src/files_views/shares.ts
@@ -6,11 +6,11 @@ import { translate as t } from '@nextcloud/l10n'
import { View, getNavigation } from '@nextcloud/files'
import { ShareType } from '@nextcloud/sharing'
import AccountClockSvg from '@mdi/svg/svg/account-clock.svg?raw'
-import AccountGroupSvg from '@mdi/svg/svg/account-group.svg?raw'
-import AccountPlusSvg from '@mdi/svg/svg/account-plus.svg?raw'
+import AccountGroupSvg from '@mdi/svg/svg/account-group-outline.svg?raw'
+import AccountPlusSvg from '@mdi/svg/svg/account-plus-outline.svg?raw'
import AccountSvg from '@mdi/svg/svg/account.svg?raw'
import DeleteSvg from '@mdi/svg/svg/delete.svg?raw'
-import FileUploadSvg from '@mdi/svg/svg/file-upload.svg?raw'
+import FileUploadSvg from '@mdi/svg/svg/file-upload-outline.svg?raw'
import LinkSvg from '@mdi/svg/svg/link.svg?raw'
import { getContents, isFileRequest } from '../services/SharingService'
diff --git a/apps/files_sharing/src/mixins/SharesMixin.js b/apps/files_sharing/src/mixins/SharesMixin.js
index c5bad91314e..a461da56d85 100644
--- a/apps/files_sharing/src/mixins/SharesMixin.js
+++ b/apps/files_sharing/src/mixins/SharesMixin.js
@@ -165,12 +165,12 @@ export default {
isPasswordProtected: {
get() {
return this.config.enforcePasswordForPublicLink
- || !!this.share.password
+ || this.share.password !== ''
+ || this.share.newPassword !== undefined
},
async set(enabled) {
if (enabled) {
- this.share.password = await GeneratePassword(true)
- this.$set(this.share, 'newPassword', this.share.password)
+ this.$set(this.share, 'newPassword', await GeneratePassword(true))
} else {
this.share.password = ''
this.$delete(this.share, 'newPassword')
@@ -272,7 +272,7 @@ export default {
this.loading = true
this.open = false
await this.deleteShare(this.share.id)
- console.debug('Share deleted', this.share.id)
+ logger.debug('Share deleted', { shareId: this.share.id })
const message = this.share.itemType === 'file'
? t('files_sharing', 'File "{path}" has been unshared', { path: this.share.path })
: t('files_sharing', 'Folder "{path}" has been unshared', { path: this.share.path })
@@ -303,7 +303,12 @@ export default {
const properties = {}
// force value to string because that is what our
// share api controller accepts
- propertyNames.forEach(name => {
+ for (const name of propertyNames) {
+ if (name === 'password') {
+ properties[name] = this.share.newPassword ?? this.share.password
+ continue
+ }
+
if (this.share[name] === null || this.share[name] === undefined) {
properties[name] = ''
} else if ((typeof this.share[name]) === 'object') {
@@ -311,7 +316,7 @@ export default {
} else {
properties[name] = this.share[name].toString()
}
- })
+ }
return this.updateQueue.add(async () => {
this.saving = true
@@ -319,8 +324,9 @@ export default {
try {
const updatedShare = await this.updateShare(this.share.id, properties)
- if (propertyNames.indexOf('password') >= 0) {
+ if (propertyNames.includes('password')) {
// reset password state after sync
+ this.share.password = this.share.newPassword ?? ''
this.$delete(this.share, 'newPassword')
// updates password expiration time after sync
@@ -328,14 +334,18 @@ export default {
}
// clear any previous errors
- this.$delete(this.errors, propertyNames[0])
+ for (const property of propertyNames) {
+ this.$delete(this.errors, property)
+ }
showSuccess(this.updateSuccessMessage(propertyNames))
} catch (error) {
logger.error('Could not update share', { error, share: this.share, propertyNames })
const { message } = error
if (message && message !== '') {
- this.onSyncError(propertyNames[0], message)
+ for (const property of propertyNames) {
+ this.onSyncError(property, message)
+ }
showError(message)
} else {
// We do not have information what happened, but we should still inform the user
@@ -384,6 +394,13 @@ export default {
* @param {string} message the error message
*/
onSyncError(property, message) {
+ if (property === 'password' && this.share.newPassword) {
+ if (this.share.newPassword === this.share.password) {
+ this.share.password = ''
+ }
+ this.$delete(this.share, 'newPassword')
+ }
+
// re-open menu if closed
this.open = true
switch (property) {
diff --git a/apps/files_sharing/src/models/Share.ts b/apps/files_sharing/src/models/Share.ts
index fb76a655d53..b0638b29448 100644
--- a/apps/files_sharing/src/models/Share.ts
+++ b/apps/files_sharing/src/models/Share.ts
@@ -486,4 +486,11 @@ export default class Share {
return this._share.status
}
+ /**
+ * Is the share from a trusted server
+ */
+ get isTrustedServer(): boolean {
+ return !!this._share.is_trusted_server
+ }
+
}
diff --git a/apps/files_sharing/src/services/ConfigService.ts b/apps/files_sharing/src/services/ConfigService.ts
index 2114e2d1bae..f75f34c7936 100644
--- a/apps/files_sharing/src/services/ConfigService.ts
+++ b/apps/files_sharing/src/services/ConfigService.ts
@@ -315,4 +315,12 @@ export default class Config {
return loadState('files_sharing', 'showFederatedSharesAsInternal', false)
}
+ /**
+ * Show federated shares to trusted servers as internal shares
+ * @return {boolean}
+ */
+ get showFederatedSharesToTrustedServersAsInternal(): boolean {
+ return loadState('files_sharing', 'showFederatedSharesToTrustedServersAsInternal', false)
+ }
+
}
diff --git a/apps/files_sharing/src/utils/GeneratePassword.ts b/apps/files_sharing/src/utils/GeneratePassword.ts
index 2f3f65c51d8..82efaaa69d4 100644
--- a/apps/files_sharing/src/utils/GeneratePassword.ts
+++ b/apps/files_sharing/src/utils/GeneratePassword.ts
@@ -38,10 +38,29 @@ export default async function(verbose = false): Promise<string> {
const array = new Uint8Array(10)
const ratio = passwordSet.length / 255
- self.crypto.getRandomValues(array)
+ getRandomValues(array)
let password = ''
for (let i = 0; i < array.length; i++) {
password += passwordSet.charAt(array[i] * ratio)
}
return password
}
+
+/**
+ * Fills the given array with cryptographically secure random values.
+ * If the crypto API is not available, it falls back to less secure Math.random().
+ * Crypto API is available in modern browsers on secure contexts (HTTPS).
+ *
+ * @param {Uint8Array} array - The array to fill with random values.
+ */
+function getRandomValues(array: Uint8Array): void {
+ if (self?.crypto?.getRandomValues) {
+ self.crypto.getRandomValues(array)
+ return
+ }
+
+ let len = array.length
+ while (len--) {
+ array[len] = Math.floor(Math.random() * 256)
+ }
+}
diff --git a/apps/files_sharing/src/views/CollaborationView.vue b/apps/files_sharing/src/views/CollaborationView.vue
deleted file mode 100644
index b75ad53e1b8..00000000000
--- a/apps/files_sharing/src/views/CollaborationView.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
- - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
- - SPDX-License-Identifier: AGPL-3.0-or-later
--->
-
-<template>
- <CollectionList v-if="fileId"
- :id="fileId"
- type="file"
- :name="filename" />
-</template>
-
-<script>
-import { CollectionList } from 'nextcloud-vue-collections'
-
-export default {
- name: 'CollaborationView',
- components: {
- CollectionList,
- },
- computed: {
- fileId() {
- if (this.$root.model && this.$root.model.id) {
- return '' + this.$root.model.id
- }
- return null
- },
- filename() {
- if (this.$root.model && this.$root.model.name) {
- return '' + this.$root.model.name
- }
- return ''
- },
- },
-}
-</script>
diff --git a/apps/files_sharing/src/views/FilesViewFileDropEmptyContent.vue b/apps/files_sharing/src/views/FilesViewFileDropEmptyContent.vue
index 33fec9af028..dac22748d8a 100644
--- a/apps/files_sharing/src/views/FilesViewFileDropEmptyContent.vue
+++ b/apps/files_sharing/src/views/FilesViewFileDropEmptyContent.vue
@@ -68,7 +68,7 @@ import NcDialog from '@nextcloud/vue/components/NcDialog'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
-import svgCloudUpload from '@mdi/svg/svg/cloud-upload.svg?raw'
+import svgCloudUpload from '@mdi/svg/svg/cloud-upload-outline.svg?raw'
defineProps<{
foldername: string
diff --git a/apps/files_sharing/src/views/SharingDetailsTab.vue b/apps/files_sharing/src/views/SharingDetailsTab.vue
index f1fb78e548b..ee902a24c8a 100644
--- a/apps/files_sharing/src/views/SharingDetailsTab.vue
+++ b/apps/files_sharing/src/views/SharingDetailsTab.vue
@@ -128,7 +128,7 @@
</NcCheckboxRadioSwitch>
<NcPasswordField v-if="isPasswordProtected"
autocomplete="new-password"
- :value="hasUnsavedPassword ? share.newPassword : ''"
+ :value="share.newPassword ?? ''"
:error="passwordError"
:helper-text="errorPasswordLabel || passwordHint"
:required="isPasswordEnforced && isNewShare"
@@ -281,7 +281,7 @@ import NcTextArea from '@nextcloud/vue/components/NcTextArea'
import CircleIcon from 'vue-material-design-icons/CircleOutline.vue'
import CloseIcon from 'vue-material-design-icons/Close.vue'
-import EditIcon from 'vue-material-design-icons/Pencil.vue'
+import EditIcon from 'vue-material-design-icons/PencilOutline.vue'
import EmailIcon from 'vue-material-design-icons/Email.vue'
import LinkIcon from 'vue-material-design-icons/Link.vue'
import GroupIcon from 'vue-material-design-icons/AccountGroup.vue'
@@ -872,7 +872,6 @@ export default {
if (this.isNewShare) {
if ((this.config.enableLinkPasswordByDefault || this.isPasswordEnforced) && this.isPublicShare) {
this.$set(this.share, 'newPassword', await GeneratePassword(true))
- this.$set(this.share, 'password', this.share.newPassword)
this.advancedSectionAccordionExpanded = true
}
/* Set default expiration dates if configured */
@@ -973,10 +972,7 @@ export default {
this.share.note = ''
}
if (this.isPasswordProtected) {
- if (this.hasUnsavedPassword && this.isValidShareAttribute(this.share.newPassword)) {
- this.share.password = this.share.newPassword
- this.$delete(this.share, 'newPassword')
- } else if (this.isPasswordEnforced && this.isNewShare && !this.isValidShareAttribute(this.share.password)) {
+ if (this.isPasswordEnforced && this.isNewShare && !this.isValidShareAttribute(this.share.password)) {
this.passwordError = true
}
} else {
@@ -1000,7 +996,7 @@ export default {
incomingShare.expireDate = this.hasExpirationDate ? this.share.expireDate : ''
if (this.isPasswordProtected) {
- incomingShare.password = this.share.password
+ incomingShare.password = this.share.newPassword
}
let share
@@ -1032,9 +1028,8 @@ export default {
this.$emit('add:share', this.share)
} else {
// Let's update after creation as some attrs are only available after creation
+ await this.queueUpdate(...permissionsAndAttributes)
this.$emit('update:share', this.share)
- emit('update:share', this.share)
- this.queueUpdate(...permissionsAndAttributes)
}
await this.getNode()
@@ -1111,10 +1106,6 @@ export default {
* "sendPasswordByTalk".
*/
onPasswordProtectedByTalkChange() {
- if (this.hasUnsavedPassword) {
- this.share.password = this.share.newPassword.trim()
- }
-
this.queueUpdate('sendPasswordByTalk', 'password')
},
isValidShareAttribute(value) {
diff --git a/apps/files_sharing/src/views/SharingLinkList.vue b/apps/files_sharing/src/views/SharingLinkList.vue
index 3dd6fdf317b..c3d9a7f83dc 100644
--- a/apps/files_sharing/src/views/SharingLinkList.vue
+++ b/apps/files_sharing/src/views/SharingLinkList.vue
@@ -7,12 +7,6 @@
<ul v-if="canLinkShare"
:aria-label="t('files_sharing', 'Link shares')"
class="sharing-link-list">
- <!-- If no link shares, show the add link default entry -->
- <SharingEntryLink v-if="!hasLinkShares && canReshare"
- :can-reshare="canReshare"
- :file-info="fileInfo"
- @add:share="addShare" />
-
<!-- Else we display the list -->
<template v-if="hasShares">
<!-- using shares[index] to work with .sync -->
@@ -27,6 +21,12 @@
@remove:share="removeShare"
@open-sharing-details="openSharingDetails(share)" />
</template>
+
+ <!-- If no link shares, show the add link default entry -->
+ <SharingEntryLink v-if="!hasLinkShares && canReshare"
+ :can-reshare="canReshare"
+ :file-info="fileInfo"
+ @add:share="addShare" />
</ul>
</template>
diff --git a/apps/files_sharing/src/views/SharingTab.vue b/apps/files_sharing/src/views/SharingTab.vue
index 82a11dea2e0..262504aca01 100644
--- a/apps/files_sharing/src/views/SharingTab.vue
+++ b/apps/files_sharing/src/views/SharingTab.vue
@@ -138,7 +138,7 @@
<div v-if="projectsEnabled"
v-show="!showSharingDetailsView && fileInfo"
class="sharingTab__additionalContent">
- <CollectionList :id="`${fileInfo.id}`"
+ <NcCollectionList :id="`${fileInfo.id}`"
type="file"
:name="fileInfo.name" />
</div>
@@ -161,16 +161,16 @@ import { getCapabilities } from '@nextcloud/capabilities'
import { orderBy } from '@nextcloud/files'
import { loadState } from '@nextcloud/initial-state'
import { generateOcsUrl } from '@nextcloud/router'
-import { CollectionList } from 'nextcloud-vue-collections'
import { ShareType } from '@nextcloud/sharing'
-import InfoIcon from 'vue-material-design-icons/Information.vue'
+import NcAvatar from '@nextcloud/vue/components/NcAvatar'
+import NcButton from '@nextcloud/vue/components/NcButton'
+import NcCollectionList from '@nextcloud/vue/components/NcCollectionList'
import NcPopover from '@nextcloud/vue/components/NcPopover'
+import InfoIcon from 'vue-material-design-icons/InformationOutline.vue'
import axios from '@nextcloud/axios'
import moment from '@nextcloud/moment'
-import NcAvatar from '@nextcloud/vue/components/NcAvatar'
-import NcButton from '@nextcloud/vue/components/NcButton'
import { shareWithTitle } from '../utils/SharedWithMe.js'
@@ -192,10 +192,10 @@ export default {
name: 'SharingTab',
components: {
- CollectionList,
InfoIcon,
NcAvatar,
NcButton,
+ NcCollectionList,
NcPopover,
SharingEntryInternal,
SharingEntrySimple,
@@ -402,7 +402,13 @@ export default {
if ([ShareType.Link, ShareType.Email].includes(share.type)) {
this.linkShares.push(share)
} else if ([ShareType.Remote, ShareType.RemoteGroup].includes(share.type)) {
- if (this.config.showFederatedSharesAsInternal) {
+ if (this.config.showFederatedSharesToTrustedServersAsInternal) {
+ if (share.isTrustedServer) {
+ this.shares.push(share)
+ } else {
+ this.externalShares.push(share)
+ }
+ } else if (this.config.showFederatedSharesAsInternal) {
this.shares.push(share)
} else {
this.externalShares.push(share)
@@ -478,6 +484,10 @@ export default {
} else if ([ShareType.Remote, ShareType.RemoteGroup].includes(share.type)) {
if (this.config.showFederatedSharesAsInternal) {
this.shares.unshift(share)
+ } if (this.config.showFederatedSharesToTrustedServersAsInternal) {
+ if (share.isTrustedServer) {
+ this.shares.unshift(share)
+ }
} else {
this.externalShares.unshift(share)
}
diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php
index 676809eebff..960f29224bb 100644
--- a/apps/files_sharing/tests/ApiTest.php
+++ b/apps/files_sharing/tests/ApiTest.php
@@ -13,6 +13,7 @@ use OC\Files\FileInfo;
use OC\Files\Filesystem;
use OC\Files\Storage\Temporary;
use OC\Files\View;
+use OCA\Federation\TrustedServers;
use OCA\Files_Sharing\Controller\ShareAPIController;
use OCP\App\IAppManager;
use OCP\AppFramework\OCS\OCSBadRequestException;
@@ -117,6 +118,7 @@ class ApiTest extends TestCase {
$providerFactory = $this->createMock(IProviderFactory::class);
$mailer = $this->createMock(IMailer::class);
$tagManager = $this->createMock(ITagManager::class);
+ $trustedServers = $this->createMock(TrustedServers::class);
$dateTimeZone->method('getTimeZone')->willReturn(new \DateTimeZone(date_default_timezone_get()));
return new ShareAPIController(
@@ -139,6 +141,7 @@ class ApiTest extends TestCase {
$providerFactory,
$mailer,
$tagManager,
+ $trustedServers,
$userId,
);
}
diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
index abc405fc21c..e6be0342c26 100644
--- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
+++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
@@ -7,6 +7,7 @@
*/
namespace OCA\Files_Sharing\Tests\Controller;
+use OCA\Federation\TrustedServers;
use OCA\Files_Sharing\Controller\ShareAPIController;
use OCP\App\IAppManager;
use OCP\AppFramework\Http\DataResponse;
@@ -82,6 +83,7 @@ class ShareAPIControllerTest extends TestCase {
private IProviderFactory&MockObject $factory;
private IMailer&MockObject $mailer;
private ITagManager&MockObject $tagManager;
+ private TrustedServers&MockObject $trustedServers;
protected function setUp(): void {
$this->shareManager = $this->createMock(IManager::class);
@@ -119,6 +121,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory = $this->createMock(IProviderFactory::class);
$this->mailer = $this->createMock(IMailer::class);
$this->tagManager = $this->createMock(ITagManager::class);
+ $this->trustedServers = $this->createMock(TrustedServers::class);
$this->ocs = new ShareAPIController(
$this->appName,
@@ -140,8 +143,10 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
- $this->currentUser,
+ $this->trustedServers,
+ $this->currentUser
);
+
}
/**
@@ -169,6 +174,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
->getMock();
@@ -853,6 +859,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])
->onlyMethods(['canAccessShare'])
@@ -1485,6 +1492,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])
->onlyMethods(['formatShare'])
@@ -1873,6 +1881,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
->getMock();
@@ -1972,6 +1981,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
->getMock();
@@ -2399,6 +2409,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
->getMock();
@@ -2471,6 +2482,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
->getMock();
@@ -2710,6 +2722,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
+ $this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
->getMock();
@@ -4492,6 +4505,7 @@ class ShareAPIControllerTest extends TestCase {
'mount-type' => '',
'attributes' => null,
'item_permissions' => 1,
+ 'is_trusted_server' => false,
], $share, [], false
];
@@ -4545,6 +4559,7 @@ class ShareAPIControllerTest extends TestCase {
'mount-type' => '',
'attributes' => null,
'item_permissions' => 1,
+ 'is_trusted_server' => false,
], $share, [], false
];
@@ -5228,4 +5243,138 @@ class ShareAPIControllerTest extends TestCase {
['file_source' => 42, 'x' => 'y', 'tags' => ['tag1', 'tag2']],
], $result);
}
+
+ public function trustedServerProvider(): array {
+ return [
+ 'Trusted server' => [true, true],
+ 'Untrusted server' => [false, false],
+ ];
+ }
+
+ /**
+ * @dataProvider trustedServerProvider
+ */
+ public function testFormatShareWithFederatedShare(bool $isKnownServer, bool $isTrusted): void {
+ $nodeId = 12;
+ $nodePath = '/test.txt';
+ $share = $this->createShare(
+ 1,
+ IShare::TYPE_REMOTE,
+ 'recipient@remoteserver.com', // shared with
+ 'sender@testserver.com', // shared by
+ 'shareOwner', // share owner
+ $nodePath, // path
+ Constants::PERMISSION_READ,
+ time(),
+ null,
+ null,
+ $nodePath,
+ $nodeId
+ );
+
+ $node = $this->createMock(\OCP\Files\File::class);
+ $node->method('getId')->willReturn($nodeId);
+ $node->method('getPath')->willReturn($nodePath);
+ $node->method('getInternalPath')->willReturn(ltrim($nodePath, '/'));
+ $mountPoint = $this->createMock(\OCP\Files\Mount\IMountPoint::class);
+ $mountPoint->method('getMountType')->willReturn('local');
+ $node->method('getMountPoint')->willReturn($mountPoint);
+ $node->method('getMimetype')->willReturn('text/plain');
+ $storage = $this->createMock(\OCP\Files\Storage\IStorage::class);
+ $storageCache = $this->createMock(\OCP\Files\Cache\ICache::class);
+ $storageCache->method('getNumericStorageId')->willReturn(1);
+ $storage->method('getCache')->willReturn($storageCache);
+ $storage->method('getId')->willReturn('home::shareOwner');
+ $node->method('getStorage')->willReturn($storage);
+ $parent = $this->createMock(\OCP\Files\Folder::class);
+ $parent->method('getId')->willReturn(2);
+ $node->method('getParent')->willReturn($parent);
+ $node->method('getSize')->willReturn(1234);
+ $node->method('getMTime')->willReturn(1234567890);
+
+ $this->previewManager->method('isAvailable')->with($node)->willReturn(false);
+
+ $this->rootFolder->method('getUserFolder')
+ ->with($this->currentUser)
+ ->willReturnSelf();
+
+ $this->rootFolder->method('getFirstNodeById')
+ ->with($share->getNodeId())
+ ->willReturn($node);
+
+ $this->rootFolder->method('getRelativePath')
+ ->with($node->getPath())
+ ->willReturnArgument(0);
+
+ $serverName = 'remoteserver.com';
+ $this->trustedServers->method('isTrustedServer')
+ ->with($serverName)
+ ->willReturn($isKnownServer);
+
+ $result = $this->invokePrivate($this->ocs, 'formatShare', [$share]);
+
+ $this->assertSame($isTrusted, $result['is_trusted_server']);
+ }
+
+ public function testFormatShareWithFederatedShareWithAtInUsername(): void {
+ $nodeId = 12;
+ $nodePath = '/test.txt';
+ $share = $this->createShare(
+ 1,
+ IShare::TYPE_REMOTE,
+ 'recipient@domain.com@remoteserver.com',
+ 'sender@testserver.com',
+ 'shareOwner',
+ $nodePath,
+ Constants::PERMISSION_READ,
+ time(),
+ null,
+ null,
+ $nodePath,
+ $nodeId
+ );
+
+ $node = $this->createMock(\OCP\Files\File::class);
+ $node->method('getId')->willReturn($nodeId);
+ $node->method('getPath')->willReturn($nodePath);
+ $node->method('getInternalPath')->willReturn(ltrim($nodePath, '/'));
+ $mountPoint = $this->createMock(\OCP\Files\Mount\IMountPoint::class);
+ $mountPoint->method('getMountType')->willReturn('local');
+ $node->method('getMountPoint')->willReturn($mountPoint);
+ $node->method('getMimetype')->willReturn('text/plain');
+ $storage = $this->createMock(\OCP\Files\Storage\IStorage::class);
+ $storageCache = $this->createMock(\OCP\Files\Cache\ICache::class);
+ $storageCache->method('getNumericStorageId')->willReturn(1);
+ $storage->method('getCache')->willReturn($storageCache);
+ $storage->method('getId')->willReturn('home::shareOwner');
+ $node->method('getStorage')->willReturn($storage);
+ $parent = $this->createMock(\OCP\Files\Folder::class);
+ $parent->method('getId')->willReturn(2);
+ $node->method('getParent')->willReturn($parent);
+ $node->method('getSize')->willReturn(1234);
+ $node->method('getMTime')->willReturn(1234567890);
+
+ $this->previewManager->method('isAvailable')->with($node)->willReturn(false);
+
+ $this->rootFolder->method('getUserFolder')
+ ->with($this->currentUser)
+ ->willReturnSelf();
+
+ $this->rootFolder->method('getFirstNodeById')
+ ->with($share->getNodeId())
+ ->willReturn($node);
+
+ $this->rootFolder->method('getRelativePath')
+ ->with($node->getPath())
+ ->willReturnArgument(0);
+
+ $serverName = 'remoteserver.com';
+ $this->trustedServers->method('isTrustedServer')
+ ->with($serverName)
+ ->willReturn(true);
+
+ $result = $this->invokePrivate($this->ocs, 'formatShare', [$share]);
+
+ $this->assertTrue($result['is_trusted_server']);
+ }
}
diff --git a/apps/files_sharing/tests/External/CacheTest.php b/apps/files_sharing/tests/External/CacheTest.php
index 60820013f11..39e2057a24c 100644
--- a/apps/files_sharing/tests/External/CacheTest.php
+++ b/apps/files_sharing/tests/External/CacheTest.php
@@ -54,11 +54,11 @@ class CacheTest extends TestCase {
$this->contactsManager = $this->createMock(IManager::class);
$this->cloudIdManager = new CloudIdManager(
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class),
$this->contactsManager,
$this->createMock(IURLGenerator::class),
$this->createMock(IUserManager::class),
- $this->createMock(ICacheFactory::class),
- $this->createMock(IEventDispatcher::class)
);
$this->remoteUser = $this->getUniqueID('remoteuser');
diff --git a/apps/files_sharing/tests/External/ManagerTest.php b/apps/files_sharing/tests/External/ManagerTest.php
index fbe6eb1e85b..14c6afec4d8 100644
--- a/apps/files_sharing/tests/External/ManagerTest.php
+++ b/apps/files_sharing/tests/External/ManagerTest.php
@@ -90,11 +90,11 @@ class ManagerTest extends TestCase {
$this->testMountProvider = new MountProvider(Server::get(IDBConnection::class), function () {
return $this->manager;
}, new CloudIdManager(
+ $this->createMock(ICacheFactory::class),
+ $this->createMock(IEventDispatcher::class),
$this->contactsManager,
$this->createMock(IURLGenerator::class),
$this->userManager,
- $this->createMock(ICacheFactory::class),
- $this->createMock(IEventDispatcher::class)
));
$group1 = $this->createMock(IGroup::class);
diff --git a/apps/files_trashbin/l10n/be.js b/apps/files_trashbin/l10n/be.js
new file mode 100644
index 00000000000..8b825b9cb5f
--- /dev/null
+++ b/apps/files_trashbin/l10n/be.js
@@ -0,0 +1,28 @@
+OC.L10N.register(
+ "files_trashbin",
+ {
+ "restored" : "адноўлены",
+ "Deleted files" : "Выдаленыя файлы",
+ "This application enables people to restore files that were deleted from the system." : "Гэта праграма дазваляе карыстальнікам аднавіць файлы, якія былі выдалены з сістэмы.",
+ "Restore" : "Аднавіць",
+ "Not enough free space to restore the file/folder" : "Недастаткова вольнай прасторы, каб аднавіць файл/папку",
+ "Empty deleted files" : "Ачысціць выдаленыя файлы",
+ "Confirm permanent deletion" : "Пацвердзіце выдаленне назаўжды",
+ "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Вы ўпэўнены, што хочаце назаўжды выдаліць усе файлы і папкі ў сметніцы? Гэта дзеянне нельга адрабіць.",
+ "Cancel" : "Скасаваць",
+ "Deletion cancelled" : "Выдаленне скасавана",
+ "Original location" : "Зыходнае размяшчэнне",
+ "Deleted by" : "Выдалены карыстальнікам ",
+ "Deleted" : "Выдалены",
+ "few seconds ago" : "некалькі секунд таму",
+ "A long time ago" : "Вельмі даўно",
+ "Unknown" : "Невядомы",
+ "All files" : "Усе файлы",
+ "You" : "Вы",
+ "List of files that have been deleted." : "Спіс выдаленых файлаў.",
+ "No deleted files" : "Няма выдаленых файлаў",
+ "Files and folders you have deleted will show up here" : "Тут будуць адлюстроўвацца выдаленыя вамі файлы і папкі",
+ "All files have been permanently deleted" : "Усе файлы былі выдалены назаўжды",
+ "Failed to empty deleted files" : "Не атрымалася ачысціць выдаленыя файлы"
+},
+"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_trashbin/l10n/be.json b/apps/files_trashbin/l10n/be.json
new file mode 100644
index 00000000000..0814ee91169
--- /dev/null
+++ b/apps/files_trashbin/l10n/be.json
@@ -0,0 +1,26 @@
+{ "translations": {
+ "restored" : "адноўлены",
+ "Deleted files" : "Выдаленыя файлы",
+ "This application enables people to restore files that were deleted from the system." : "Гэта праграма дазваляе карыстальнікам аднавіць файлы, якія былі выдалены з сістэмы.",
+ "Restore" : "Аднавіць",
+ "Not enough free space to restore the file/folder" : "Недастаткова вольнай прасторы, каб аднавіць файл/папку",
+ "Empty deleted files" : "Ачысціць выдаленыя файлы",
+ "Confirm permanent deletion" : "Пацвердзіце выдаленне назаўжды",
+ "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Вы ўпэўнены, што хочаце назаўжды выдаліць усе файлы і папкі ў сметніцы? Гэта дзеянне нельга адрабіць.",
+ "Cancel" : "Скасаваць",
+ "Deletion cancelled" : "Выдаленне скасавана",
+ "Original location" : "Зыходнае размяшчэнне",
+ "Deleted by" : "Выдалены карыстальнікам ",
+ "Deleted" : "Выдалены",
+ "few seconds ago" : "некалькі секунд таму",
+ "A long time ago" : "Вельмі даўно",
+ "Unknown" : "Невядомы",
+ "All files" : "Усе файлы",
+ "You" : "Вы",
+ "List of files that have been deleted." : "Спіс выдаленых файлаў.",
+ "No deleted files" : "Няма выдаленых файлаў",
+ "Files and folders you have deleted will show up here" : "Тут будуць адлюстроўвацца выдаленыя вамі файлы і папкі",
+ "All files have been permanently deleted" : "Усе файлы былі выдалены назаўжды",
+ "Failed to empty deleted files" : "Не атрымалася ачысціць выдаленыя файлы"
+},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
+} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/uk.js b/apps/files_trashbin/l10n/uk.js
index 3df1063f300..8f9e802f1e3 100644
--- a/apps/files_trashbin/l10n/uk.js
+++ b/apps/files_trashbin/l10n/uk.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Deleted files" : "Кошик",
"Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Вилучені файли та каталоги з кошику (термін дії може завершитися під час експорту, якщо у вас мало місця для збереження)",
"This application enables people to restore files that were deleted from the system." : "Цей застосунок дозволяє людям відновлювати файли, які було переміщено до кошику.",
+ "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Ця програма дозволяє відновлювати файли, які були видалені з системи. Вона відображає список видалених файлів у веб-інтерфейсі та має опції для відновлення цих видалених файлів у каталоги файлів користувачів або їх остаточного видалення з системи. Відновлення файлу також відновлює пов'язані версії файлу, якщо увімкнено програму версій. Коли файл видаляється з спільного ресурсу, його можна відновити таким самим чином, хоча він більше не буде спільним. За замовчуванням ці файли залишаються в кошику протягом 30 днів.\n\nЩоб запобігти вичерпанню дискового простору облікового запису, програма «Видалені файли» не використовує більше 50% поточної доступної квоти для видалених файлів. Якщо видалені файли перевищують цей ліміт, програма видаляє найстаріші файли, поки не досягне цього ліміту. Більше інформації можна знайти в документації «Видалені файли».",
"Restore" : "Відновити",
"Not enough free space to restore the file/folder" : "Недостатньо вільного простору для відновлення файлу або каталогу",
"Empty deleted files" : "Очистити вилучені файли",
diff --git a/apps/files_trashbin/l10n/uk.json b/apps/files_trashbin/l10n/uk.json
index 18b3bb329b3..7653b390146 100644
--- a/apps/files_trashbin/l10n/uk.json
+++ b/apps/files_trashbin/l10n/uk.json
@@ -3,6 +3,7 @@
"Deleted files" : "Кошик",
"Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Вилучені файли та каталоги з кошику (термін дії може завершитися під час експорту, якщо у вас мало місця для збереження)",
"This application enables people to restore files that were deleted from the system." : "Цей застосунок дозволяє людям відновлювати файли, які було переміщено до кошику.",
+ "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Ця програма дозволяє відновлювати файли, які були видалені з системи. Вона відображає список видалених файлів у веб-інтерфейсі та має опції для відновлення цих видалених файлів у каталоги файлів користувачів або їх остаточного видалення з системи. Відновлення файлу також відновлює пов'язані версії файлу, якщо увімкнено програму версій. Коли файл видаляється з спільного ресурсу, його можна відновити таким самим чином, хоча він більше не буде спільним. За замовчуванням ці файли залишаються в кошику протягом 30 днів.\n\nЩоб запобігти вичерпанню дискового простору облікового запису, програма «Видалені файли» не використовує більше 50% поточної доступної квоти для видалених файлів. Якщо видалені файли перевищують цей ліміт, програма видаляє найстаріші файли, поки не досягне цього ліміту. Більше інформації можна знайти в документації «Видалені файли».",
"Restore" : "Відновити",
"Not enough free space to restore the file/folder" : "Недостатньо вільного простору для відновлення файлу або каталогу",
"Empty deleted files" : "Очистити вилучені файли",
diff --git a/apps/files_trashbin/src/files_views/trashbinView.ts b/apps/files_trashbin/src/files_views/trashbinView.ts
index 5b547071cc7..f55c6b71595 100644
--- a/apps/files_trashbin/src/files_views/trashbinView.ts
+++ b/apps/files_trashbin/src/files_views/trashbinView.ts
@@ -7,7 +7,7 @@ import { t } from '@nextcloud/l10n'
import { deleted, deletedBy, originalLocation } from './columns.ts'
import { getContents } from '../services/trashbin.ts'
-import svgDelete from '@mdi/svg/svg/delete.svg?raw'
+import svgDelete from '@mdi/svg/svg/delete-outline.svg?raw'
export const TRASHBIN_VIEW_ID = 'trashbin'
diff --git a/apps/files_versions/composer/composer/autoload_classmap.php b/apps/files_versions/composer/composer/autoload_classmap.php
index 9c83924ab7c..27e68decdcc 100644
--- a/apps/files_versions/composer/composer/autoload_classmap.php
+++ b/apps/files_versions/composer/composer/autoload_classmap.php
@@ -17,6 +17,7 @@ return array(
'OCA\\Files_Versions\\Db\\VersionEntity' => $baseDir . '/../lib/Db/VersionEntity.php',
'OCA\\Files_Versions\\Db\\VersionsMapper' => $baseDir . '/../lib/Db/VersionsMapper.php',
'OCA\\Files_Versions\\Events\\CreateVersionEvent' => $baseDir . '/../lib/Events/CreateVersionEvent.php',
+ 'OCA\\Files_Versions\\Events\\VersionCreatedEvent' => $baseDir . '/../lib/Events/VersionCreatedEvent.php',
'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => $baseDir . '/../lib/Events/VersionRestoredEvent.php',
'OCA\\Files_Versions\\Expiration' => $baseDir . '/../lib/Expiration.php',
'OCA\\Files_Versions\\Listener\\FileEventsListener' => $baseDir . '/../lib/Listener/FileEventsListener.php',
diff --git a/apps/files_versions/composer/composer/autoload_static.php b/apps/files_versions/composer/composer/autoload_static.php
index 1d95663ac55..8ecc1cb0137 100644
--- a/apps/files_versions/composer/composer/autoload_static.php
+++ b/apps/files_versions/composer/composer/autoload_static.php
@@ -32,6 +32,7 @@ class ComposerStaticInitFiles_Versions
'OCA\\Files_Versions\\Db\\VersionEntity' => __DIR__ . '/..' . '/../lib/Db/VersionEntity.php',
'OCA\\Files_Versions\\Db\\VersionsMapper' => __DIR__ . '/..' . '/../lib/Db/VersionsMapper.php',
'OCA\\Files_Versions\\Events\\CreateVersionEvent' => __DIR__ . '/..' . '/../lib/Events/CreateVersionEvent.php',
+ 'OCA\\Files_Versions\\Events\\VersionCreatedEvent' => __DIR__ . '/..' . '/../lib/Events/VersionCreatedEvent.php',
'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => __DIR__ . '/..' . '/../lib/Events/VersionRestoredEvent.php',
'OCA\\Files_Versions\\Expiration' => __DIR__ . '/..' . '/../lib/Expiration.php',
'OCA\\Files_Versions\\Listener\\FileEventsListener' => __DIR__ . '/..' . '/../lib/Listener/FileEventsListener.php',
diff --git a/apps/files_versions/l10n/be.js b/apps/files_versions/l10n/be.js
new file mode 100644
index 00000000000..7e5200ecb83
--- /dev/null
+++ b/apps/files_versions/l10n/be.js
@@ -0,0 +1,17 @@
+OC.L10N.register(
+ "files_versions",
+ {
+ "Versions" : "Версіі",
+ "Current version" : "Бягучая версія",
+ "You" : "Вы",
+ "Delete version" : "Выдаліць версію",
+ "Cancel" : "Скасаваць",
+ "Remove version name" : "Выдаліць назву версіі",
+ "Save version name" : "Захаваць назву версіі",
+ "Version name" : "Назва версіі",
+ "Version restored" : "Версія адноўлена",
+ "Could not restore version" : "Не ўдалося аднавіць версію",
+ "Could not delete version" : "Не ўдалося выдаліць версію",
+ "File versions" : "Версіі файла"
+},
+"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_versions/l10n/be.json b/apps/files_versions/l10n/be.json
new file mode 100644
index 00000000000..27e4f646a97
--- /dev/null
+++ b/apps/files_versions/l10n/be.json
@@ -0,0 +1,15 @@
+{ "translations": {
+ "Versions" : "Версіі",
+ "Current version" : "Бягучая версія",
+ "You" : "Вы",
+ "Delete version" : "Выдаліць версію",
+ "Cancel" : "Скасаваць",
+ "Remove version name" : "Выдаліць назву версіі",
+ "Save version name" : "Захаваць назву версіі",
+ "Version name" : "Назва версіі",
+ "Version restored" : "Версія адноўлена",
+ "Could not restore version" : "Не ўдалося аднавіць версію",
+ "Could not delete version" : "Не ўдалося выдаліць версію",
+ "File versions" : "Версіі файла"
+},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
+} \ No newline at end of file
diff --git a/apps/files_versions/l10n/ru.js b/apps/files_versions/l10n/ru.js
index 9472af2f1a3..ecdf5913c52 100644
--- a/apps/files_versions/l10n/ru.js
+++ b/apps/files_versions/l10n/ru.js
@@ -3,7 +3,7 @@ OC.L10N.register(
{
"Versions" : "Версии",
"This application automatically maintains older versions of files that are changed." : "Приложение служит для обработки старых версий изменённых файлов.",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Это приложение автоматически поддерживает старые версии файлов, которые были изменены. Если оно включено, в каталоге каждого пользователя создается папка \"Скрытые версии\", которая используется для хранения старых версий файлов. Пользователь может в любой момент вернуться к более старой версии через веб-интерфейс, при этом замененный файл станет версией. Приложение автоматически управляет папкой версий, чтобы гарантировать, что квота учетной записи не исчерпается из-за изменений версий.\n\t\tВ дополнение к истечению срока действия версий, приложение \"Версии\" гарантирует, что вы никогда не будете использовать более 50% доступного в данный момент свободного места в учетной записи. Если сохраненные версии превысят это ограничение, приложение сначала удалит самые старые версии, пока не достигнет этого ограничения. Более подробная информация доступна в документации по версиям.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Это приложение автоматически поддерживает старые версии файлов, которые были изменены. Если оно включено, в каталоге каждого пользователя создаётся папка \"Скрытые версии\", которая используется для хранения старых версий файлов. Пользователь может в любой момент вернуться к более старой версии через веб-интерфейс, при этом заменённый файл станет версией. Приложение автоматически управляет папкой версий, чтобы гарантировать, что квота учётной записи не исчерпается из-за изменений версий.\n\t\tВ дополнение к истечению срока действия версий, приложение \"Версии\" гарантирует, что вы никогда не будете использовать более 50% доступного в данный момент свободного места в учётной записи. Если сохранённые версии превысят это ограничение, приложение сначала удалит самые старые версии, пока не достигнет этого ограничения. Более подробная информация доступна в документации по версиям.",
"Current version" : "Текущая версия",
"Initial version" : "Первоначальная версия",
"You" : "Вы",
diff --git a/apps/files_versions/l10n/ru.json b/apps/files_versions/l10n/ru.json
index f0870081d62..96392c99021 100644
--- a/apps/files_versions/l10n/ru.json
+++ b/apps/files_versions/l10n/ru.json
@@ -1,7 +1,7 @@
{ "translations": {
"Versions" : "Версии",
"This application automatically maintains older versions of files that are changed." : "Приложение служит для обработки старых версий изменённых файлов.",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Это приложение автоматически поддерживает старые версии файлов, которые были изменены. Если оно включено, в каталоге каждого пользователя создается папка \"Скрытые версии\", которая используется для хранения старых версий файлов. Пользователь может в любой момент вернуться к более старой версии через веб-интерфейс, при этом замененный файл станет версией. Приложение автоматически управляет папкой версий, чтобы гарантировать, что квота учетной записи не исчерпается из-за изменений версий.\n\t\tВ дополнение к истечению срока действия версий, приложение \"Версии\" гарантирует, что вы никогда не будете использовать более 50% доступного в данный момент свободного места в учетной записи. Если сохраненные версии превысят это ограничение, приложение сначала удалит самые старые версии, пока не достигнет этого ограничения. Более подробная информация доступна в документации по версиям.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Это приложение автоматически поддерживает старые версии файлов, которые были изменены. Если оно включено, в каталоге каждого пользователя создаётся папка \"Скрытые версии\", которая используется для хранения старых версий файлов. Пользователь может в любой момент вернуться к более старой версии через веб-интерфейс, при этом заменённый файл станет версией. Приложение автоматически управляет папкой версий, чтобы гарантировать, что квота учётной записи не исчерпается из-за изменений версий.\n\t\tВ дополнение к истечению срока действия версий, приложение \"Версии\" гарантирует, что вы никогда не будете использовать более 50% доступного в данный момент свободного места в учётной записи. Если сохранённые версии превысят это ограничение, приложение сначала удалит самые старые версии, пока не достигнет этого ограничения. Более подробная информация доступна в документации по версиям.",
"Current version" : "Текущая версия",
"Initial version" : "Первоначальная версия",
"You" : "Вы",
diff --git a/apps/files_versions/l10n/uk.js b/apps/files_versions/l10n/uk.js
index e2a6801b0af..8b98d0f28c6 100644
--- a/apps/files_versions/l10n/uk.js
+++ b/apps/files_versions/l10n/uk.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Versions" : "Версії",
"This application automatically maintains older versions of files that are changed." : "Цей застосунок підтримує роботу з попередніми версіями файлів, які було змінено.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Ця програма автоматично зберігає старі версії файлів, які були змінені. Коли ця функція увімкнена, у каталозі кожного користувача створюється прихований каталог «версії», яка використовується для зберігання старих версій файлів. Користувач може в будь-який час повернутися до старішої версії через веб-інтерфейс, а замінений файл стане версією. Програма автоматично керує каталогом «версії», щоб уникнути перевищення квоти облікового запису через версії.\n\nОкрім терміну дії версій, програма «Версії» гарантує, що ніколи не буде використовуватися більше 50% вільного місця, доступного на даний момент в обліковому записі. Якщо збережені версії перевищують цей ліміт, програма спочатку видалить найстаріші версії, доки не буде досягнуто цього ліміту. Більше інформації можна знайти в документації «Версії».",
"Current version" : "Поточна версія",
"Initial version" : "Початкова версія",
"You" : "Ви",
diff --git a/apps/files_versions/l10n/uk.json b/apps/files_versions/l10n/uk.json
index 7ff4719704e..e9ec39ed3d9 100644
--- a/apps/files_versions/l10n/uk.json
+++ b/apps/files_versions/l10n/uk.json
@@ -1,6 +1,7 @@
{ "translations": {
"Versions" : "Версії",
"This application automatically maintains older versions of files that are changed." : "Цей застосунок підтримує роботу з попередніми версіями файлів, які було змінено.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Ця програма автоматично зберігає старі версії файлів, які були змінені. Коли ця функція увімкнена, у каталозі кожного користувача створюється прихований каталог «версії», яка використовується для зберігання старих версій файлів. Користувач може в будь-який час повернутися до старішої версії через веб-інтерфейс, а замінений файл стане версією. Програма автоматично керує каталогом «версії», щоб уникнути перевищення квоти облікового запису через версії.\n\nОкрім терміну дії версій, програма «Версії» гарантує, що ніколи не буде використовуватися більше 50% вільного місця, доступного на даний момент в обліковому записі. Якщо збережені версії перевищують цей ліміт, програма спочатку видалить найстаріші версії, доки не буде досягнуто цього ліміту. Більше інформації можна знайти в документації «Версії».",
"Current version" : "Поточна версія",
"Initial version" : "Початкова версія",
"You" : "Ви",
diff --git a/apps/files_versions/lib/Events/VersionCreatedEvent.php b/apps/files_versions/lib/Events/VersionCreatedEvent.php
new file mode 100644
index 00000000000..4dc7a7cb505
--- /dev/null
+++ b/apps/files_versions/lib/Events/VersionCreatedEvent.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files_Versions\Events;
+
+use OCA\Files_Versions\Versions\IVersion;
+use OCP\EventDispatcher\Event;
+use OCP\Files\Node;
+
+/**
+ * Event dispatched after a successful creation of a version
+ */
+class VersionCreatedEvent extends Event {
+ public function __construct(
+ private Node $node,
+ private IVersion $version,
+ ) {
+ parent::__construct();
+ }
+
+ /**
+ * Node of the file that has been versioned
+ */
+ public function getNode(): Node {
+ return $this->node;
+ }
+
+ /**
+ * Version of the file that was created
+ */
+ public function getVersion(): IVersion {
+ return $this->version;
+ }
+}
diff --git a/apps/files_versions/lib/Versions/INeedSyncVersionBackend.php b/apps/files_versions/lib/Versions/INeedSyncVersionBackend.php
index 4faeaa48513..e52e2f8e8bc 100644
--- a/apps/files_versions/lib/Versions/INeedSyncVersionBackend.php
+++ b/apps/files_versions/lib/Versions/INeedSyncVersionBackend.php
@@ -8,13 +8,18 @@ declare(strict_types=1);
*/
namespace OCA\Files_Versions\Versions;
+use OCA\Files_Versions\Db\VersionEntity;
use OCP\Files\File;
/**
* @since 28.0.0
*/
interface INeedSyncVersionBackend {
- public function createVersionEntity(File $file): void;
+ /**
+ * TODO: Convert return type to strong type once all implementations are fixed.
+ * @return null|VersionEntity
+ */
+ public function createVersionEntity(File $file);
public function updateVersionEntity(File $sourceFile, int $revision, array $properties): void;
public function deleteVersionsEntity(File $file): void;
}
diff --git a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php
index 40180674b7c..48d69d31629 100644
--- a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php
+++ b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php
@@ -229,7 +229,7 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
$this->versionsMapper->delete($versionEntity);
}
- public function createVersionEntity(File $file): void {
+ public function createVersionEntity(File $file): ?VersionEntity {
$versionEntity = new VersionEntity();
$versionEntity->setFileId($file->getId());
$versionEntity->setTimestamp($file->getMTime());
@@ -241,8 +241,7 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
while ($tries < 5) {
try {
$this->versionsMapper->insert($versionEntity);
- /* No errors, get out of the method */
- return;
+ return $versionEntity;
} catch (\OCP\DB\Exception $e) {
if (!in_array($e->getReason(), [
\OCP\DB\Exception::REASON_CONSTRAINT_VIOLATION,
@@ -257,6 +256,8 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
$this->logger->warning('Constraint violation while inserting version, retrying with increased timestamp', ['exception' => $e]);
}
}
+
+ return null;
}
public function updateVersionEntity(File $sourceFile, int $revision, array $properties): void {
diff --git a/apps/files_versions/lib/Versions/VersionManager.php b/apps/files_versions/lib/Versions/VersionManager.php
index f72e451f368..9acea8c6513 100644
--- a/apps/files_versions/lib/Versions/VersionManager.php
+++ b/apps/files_versions/lib/Versions/VersionManager.php
@@ -8,6 +8,8 @@ declare(strict_types=1);
*/
namespace OCA\Files_Versions\Versions;
+use OCA\Files_Versions\Db\VersionEntity;
+use OCA\Files_Versions\Events\VersionCreatedEvent;
use OCA\Files_Versions\Events\VersionRestoredEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\File;
@@ -129,7 +131,16 @@ class VersionManager implements IVersionManager, IDeletableVersionBackend, INeed
public function createVersionEntity(File $file): void {
$backend = $this->getBackendForStorage($file->getStorage());
if ($backend instanceof INeedSyncVersionBackend) {
- $backend->createVersionEntity($file);
+ $versionEntity = $backend->createVersionEntity($file);
+
+ if ($versionEntity instanceof VersionEntity) {
+ foreach ($backend->getVersionsForFile($file->getOwner(), $file) as $version) {
+ if ($version->getRevisionId() === $versionEntity->getTimestamp()) {
+ $this->dispatcher->dispatchTyped(new VersionCreatedEvent($file, $version));
+ break;
+ }
+ }
+ }
}
}
diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue
index 275f1d0ddbf..dc36e4134f9 100644
--- a/apps/files_versions/src/components/Version.vue
+++ b/apps/files_versions/src/components/Version.vue
@@ -137,7 +137,7 @@ import Delete from 'vue-material-design-icons/Delete.vue'
import Download from 'vue-material-design-icons/Download.vue'
import FileCompare from 'vue-material-design-icons/FileCompare.vue'
import ImageOffOutline from 'vue-material-design-icons/ImageOffOutline.vue'
-import Pencil from 'vue-material-design-icons/Pencil.vue'
+import Pencil from 'vue-material-design-icons/PencilOutline.vue'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActionLink from '@nextcloud/vue/components/NcActionLink'
diff --git a/apps/lookup_server_connector/l10n/be.js b/apps/lookup_server_connector/l10n/be.js
new file mode 100644
index 00000000000..397c93957a4
--- /dev/null
+++ b/apps/lookup_server_connector/l10n/be.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "lookup_server_connector",
+ {
+ "Lookup Server Connector" : "Злучальнік сервера пошуку",
+ "Sync public account information with the lookup server" : "Сінхранізацыя публічных звестак пра ўліковы запіс з серверам пошуку"
+},
+"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/lookup_server_connector/l10n/be.json b/apps/lookup_server_connector/l10n/be.json
new file mode 100644
index 00000000000..91b91347e2c
--- /dev/null
+++ b/apps/lookup_server_connector/l10n/be.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "Lookup Server Connector" : "Злучальнік сервера пошуку",
+ "Sync public account information with the lookup server" : "Сінхранізацыя публічных звестак пра ўліковы запіс з серверам пошуку"
+},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/sw.js b/apps/oauth2/l10n/sw.js
new file mode 100644
index 00000000000..44e346ffa4f
--- /dev/null
+++ b/apps/oauth2/l10n/sw.js
@@ -0,0 +1,23 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Mteja wako hajaidhinishwa kuunganisha. Tafadhali mjulishe msimamizi wa mteja wako.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "URL yako ya kuelekeza kwingine inahitaji kuwa URL kamili kwa mfano: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Huruhusu uthibitishaji tangamanifu wa OAuth2 kutoka kwa programu zingine za wavuti.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Programu ya OAuth2 huruhusu wasimamizi kusanidi utendakazi wa uthibitishaji uliojengewa ndani ili kuruhusu pia uthibitishaji unaooana na OAuth2 kutoka kwa programu zingine za wavuti.",
+ "OAuth 2.0 clients" : "OAuth 2.0 clients",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 inaruhusu huduma za nje kuomba ufikiaji {instanceName}.",
+ "Name" : "Jina",
+ "Redirection URI" : "URI ya kuelekeza kwingine",
+ "Client Identifier" : "Kitambulisho cha Mteja",
+ "Secret key" : "Ufunguo wa siri",
+ "Delete client" : "Futa mteja",
+ "Make sure you store the secret key, it cannot be recovered." : "Hakikisha umehifadhi ufunguo wa siri, hauwezi kurejeshwa.",
+ "Add client" : "Ongeza mteja",
+ "Add" : "Ongeza",
+ "Show client secret" : "Onyesha siri ya mteja",
+ "Hide client secret" : "Ficha siri ya mteja",
+ "Delete" : "Futa"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/sw.json b/apps/oauth2/l10n/sw.json
new file mode 100644
index 00000000000..0bdbdd3a440
--- /dev/null
+++ b/apps/oauth2/l10n/sw.json
@@ -0,0 +1,21 @@
+{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Mteja wako hajaidhinishwa kuunganisha. Tafadhali mjulishe msimamizi wa mteja wako.",
+ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "URL yako ya kuelekeza kwingine inahitaji kuwa URL kamili kwa mfano: https://yourdomain.com/path",
+ "OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Huruhusu uthibitishaji tangamanifu wa OAuth2 kutoka kwa programu zingine za wavuti.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "Programu ya OAuth2 huruhusu wasimamizi kusanidi utendakazi wa uthibitishaji uliojengewa ndani ili kuruhusu pia uthibitishaji unaooana na OAuth2 kutoka kwa programu zingine za wavuti.",
+ "OAuth 2.0 clients" : "OAuth 2.0 clients",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 inaruhusu huduma za nje kuomba ufikiaji {instanceName}.",
+ "Name" : "Jina",
+ "Redirection URI" : "URI ya kuelekeza kwingine",
+ "Client Identifier" : "Kitambulisho cha Mteja",
+ "Secret key" : "Ufunguo wa siri",
+ "Delete client" : "Futa mteja",
+ "Make sure you store the secret key, it cannot be recovered." : "Hakikisha umehifadhi ufunguo wa siri, hauwezi kurejeshwa.",
+ "Add client" : "Ongeza mteja",
+ "Add" : "Ongeza",
+ "Show client secret" : "Onyesha siri ya mteja",
+ "Hide client secret" : "Ficha siri ya mteja",
+ "Delete" : "Futa"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/uk.js b/apps/oauth2/l10n/uk.js
index dc2e32f69f5..8c3b6433b20 100644
--- a/apps/oauth2/l10n/uk.js
+++ b/apps/oauth2/l10n/uk.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Client Identifier" : "Ідентифікатор клієнта",
"Secret key" : "Пароль",
"Delete client" : "Вилучити клієнта",
+ "Make sure you store the secret key, it cannot be recovered." : "Обов'язково збережіть секретний ключ, його неможливо відновити.",
"Add client" : "Додати клієнта",
"Add" : "Додати",
"Show client secret" : "Показати ключ клієнта",
diff --git a/apps/oauth2/l10n/uk.json b/apps/oauth2/l10n/uk.json
index 9ac03ad0625..ad7906e1795 100644
--- a/apps/oauth2/l10n/uk.json
+++ b/apps/oauth2/l10n/uk.json
@@ -11,6 +11,7 @@
"Client Identifier" : "Ідентифікатор клієнта",
"Secret key" : "Пароль",
"Delete client" : "Вилучити клієнта",
+ "Make sure you store the secret key, it cannot be recovered." : "Обов'язково збережіть секретний ключ, його неможливо відновити.",
"Add client" : "Додати клієнта",
"Add" : "Додати",
"Show client secret" : "Показати ключ клієнта",
diff --git a/apps/oauth2/src/components/OAuthItem.vue b/apps/oauth2/src/components/OAuthItem.vue
index 3341a86168a..5a8f1556203 100644
--- a/apps/oauth2/src/components/OAuthItem.vue
+++ b/apps/oauth2/src/components/OAuthItem.vue
@@ -35,7 +35,7 @@
<script>
-import Delete from 'vue-material-design-icons/Delete.vue'
+import Delete from 'vue-material-design-icons/DeleteOutline.vue'
import EyeOutline from 'vue-material-design-icons/EyeOutline.vue'
import NcButton from '@nextcloud/vue/components/NcButton'
diff --git a/apps/profile/l10n/be.js b/apps/profile/l10n/be.js
new file mode 100644
index 00000000000..40762e2b51c
--- /dev/null
+++ b/apps/profile/l10n/be.js
@@ -0,0 +1,12 @@
+OC.L10N.register(
+ "profile",
+ {
+ "Profile" : "Профіль",
+ "You have not added any info yet" : "Вы пакуль не дадалі ніякай інфармацыі",
+ "{user} has not added any info yet" : "{user} пакуль не дадаў(-ла) ніякай інфармацыі",
+ "Edit Profile" : "Рэдагаваць профіль",
+ "Profile not found" : "Профіль не знойдзены",
+ "The profile does not exist." : "Профіль не існуе.",
+ "Back to %s" : "Назад да %s"
+},
+"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/profile/l10n/be.json b/apps/profile/l10n/be.json
new file mode 100644
index 00000000000..16101d03b70
--- /dev/null
+++ b/apps/profile/l10n/be.json
@@ -0,0 +1,10 @@
+{ "translations": {
+ "Profile" : "Профіль",
+ "You have not added any info yet" : "Вы пакуль не дадалі ніякай інфармацыі",
+ "{user} has not added any info yet" : "{user} пакуль не дадаў(-ла) ніякай інфармацыі",
+ "Edit Profile" : "Рэдагаваць профіль",
+ "Profile not found" : "Профіль не знойдзены",
+ "The profile does not exist." : "Профіль не існуе.",
+ "Back to %s" : "Назад да %s"
+},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
+} \ No newline at end of file
diff --git a/apps/profile/src/views/Profile.vue b/apps/profile/src/views/Profile.vue
index 7865c0d05f1..046a731cb93 100644
--- a/apps/profile/src/views/Profile.vue
+++ b/apps/profile/src/views/Profile.vue
@@ -134,9 +134,9 @@ import NcButton from '@nextcloud/vue/components/NcButton'
import NcContent from '@nextcloud/vue/components/NcContent'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import NcRichText from '@nextcloud/vue/components/NcRichText'
-import AccountIcon from 'vue-material-design-icons/Account.vue'
+import AccountIcon from 'vue-material-design-icons/AccountOutline.vue'
import MapMarkerIcon from 'vue-material-design-icons/MapMarker.vue'
-import PencilIcon from 'vue-material-design-icons/Pencil.vue'
+import PencilIcon from 'vue-material-design-icons/PencilOutline.vue'
interface IProfileAction {
target: string
diff --git a/apps/provisioning_api/l10n/cs.js b/apps/provisioning_api/l10n/cs.js
index 2705acc4fce..a6fdb3482fa 100644
--- a/apps/provisioning_api/l10n/cs.js
+++ b/apps/provisioning_api/l10n/cs.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "Neplatná hodnota hesla",
"An email address is required, to send a password link to the user." : "Je vyžadována e-mailová adresa (pro zaslání odkazu na heslo uživateli).",
"Required email address was not provided" : "Nebyla poskytnuta potřebná e-mailová adresa",
+ "User creation failed" : "Vytváření uživatele se nezdařilo",
"Invalid quota value: %1$s" : "Neplatná hodnota kvóty: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Neplatná hodnota kvóty. %1$s překračuje maximální kvótu",
"Unlimited quota is forbidden on this instance" : "Neomezená kvóta není na této instanci dovolena",
diff --git a/apps/provisioning_api/l10n/cs.json b/apps/provisioning_api/l10n/cs.json
index 00cf059abd9..6f9ad347813 100644
--- a/apps/provisioning_api/l10n/cs.json
+++ b/apps/provisioning_api/l10n/cs.json
@@ -11,6 +11,7 @@
"Invalid password value" : "Neplatná hodnota hesla",
"An email address is required, to send a password link to the user." : "Je vyžadována e-mailová adresa (pro zaslání odkazu na heslo uživateli).",
"Required email address was not provided" : "Nebyla poskytnuta potřebná e-mailová adresa",
+ "User creation failed" : "Vytváření uživatele se nezdařilo",
"Invalid quota value: %1$s" : "Neplatná hodnota kvóty: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Neplatná hodnota kvóty. %1$s překračuje maximální kvótu",
"Unlimited quota is forbidden on this instance" : "Neomezená kvóta není na této instanci dovolena",
diff --git a/apps/provisioning_api/l10n/de.js b/apps/provisioning_api/l10n/de.js
index 155d7f9c848..f4e30f174f7 100644
--- a/apps/provisioning_api/l10n/de.js
+++ b/apps/provisioning_api/l10n/de.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "Ungültiger Passwort-Wert",
"An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.",
"Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben",
+ "User creation failed" : "Benutzererstellung fehlgeschlagen",
"Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent",
"Unlimited quota is forbidden on this instance" : "Unbegrenztes Speicherkontigent ist auf dieser Instanz unzulässig",
diff --git a/apps/provisioning_api/l10n/de.json b/apps/provisioning_api/l10n/de.json
index 0fa532f48cd..85c24424b21 100644
--- a/apps/provisioning_api/l10n/de.json
+++ b/apps/provisioning_api/l10n/de.json
@@ -11,6 +11,7 @@
"Invalid password value" : "Ungültiger Passwort-Wert",
"An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.",
"Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben",
+ "User creation failed" : "Benutzererstellung fehlgeschlagen",
"Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent",
"Unlimited quota is forbidden on this instance" : "Unbegrenztes Speicherkontigent ist auf dieser Instanz unzulässig",
diff --git a/apps/provisioning_api/l10n/de_DE.js b/apps/provisioning_api/l10n/de_DE.js
index b72a261fca5..0a44ee87126 100644
--- a/apps/provisioning_api/l10n/de_DE.js
+++ b/apps/provisioning_api/l10n/de_DE.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "Ungültiger Passwort-Wert",
"An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.",
"Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben",
+ "User creation failed" : "Benutzererstellung fehlgeschlagen",
"Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent",
"Unlimited quota is forbidden on this instance" : "Unbegrenztes Speicherkontigent ist auf dieser Instanz unzulässig",
diff --git a/apps/provisioning_api/l10n/de_DE.json b/apps/provisioning_api/l10n/de_DE.json
index e52417da126..84036ced30b 100644
--- a/apps/provisioning_api/l10n/de_DE.json
+++ b/apps/provisioning_api/l10n/de_DE.json
@@ -11,6 +11,7 @@
"Invalid password value" : "Ungültiger Passwort-Wert",
"An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.",
"Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben",
+ "User creation failed" : "Benutzererstellung fehlgeschlagen",
"Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent",
"Unlimited quota is forbidden on this instance" : "Unbegrenztes Speicherkontigent ist auf dieser Instanz unzulässig",
diff --git a/apps/provisioning_api/l10n/en_GB.js b/apps/provisioning_api/l10n/en_GB.js
index 469642b202c..3469fee516d 100644
--- a/apps/provisioning_api/l10n/en_GB.js
+++ b/apps/provisioning_api/l10n/en_GB.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "Invalid password value",
"An email address is required, to send a password link to the user." : "An email address is required, to send a password link to the user.",
"Required email address was not provided" : "Required email address was not provided",
+ "User creation failed" : "User creation failed",
"Invalid quota value: %1$s" : "Invalid quota value: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Invalid quota value. %1$s is exceeding the maximum quota",
"Unlimited quota is forbidden on this instance" : "Unlimited quota is forbidden on this instance",
diff --git a/apps/provisioning_api/l10n/en_GB.json b/apps/provisioning_api/l10n/en_GB.json
index 0a60e2dc48b..6a6898da4c4 100644
--- a/apps/provisioning_api/l10n/en_GB.json
+++ b/apps/provisioning_api/l10n/en_GB.json
@@ -11,6 +11,7 @@
"Invalid password value" : "Invalid password value",
"An email address is required, to send a password link to the user." : "An email address is required, to send a password link to the user.",
"Required email address was not provided" : "Required email address was not provided",
+ "User creation failed" : "User creation failed",
"Invalid quota value: %1$s" : "Invalid quota value: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Invalid quota value. %1$s is exceeding the maximum quota",
"Unlimited quota is forbidden on this instance" : "Unlimited quota is forbidden on this instance",
diff --git a/apps/provisioning_api/l10n/et_EE.js b/apps/provisioning_api/l10n/et_EE.js
new file mode 100644
index 00000000000..2081f8c467c
--- /dev/null
+++ b/apps/provisioning_api/l10n/et_EE.js
@@ -0,0 +1,41 @@
+OC.L10N.register(
+ "provisioning_api",
+ {
+ "Logged in account must be an administrator or have authorization to edit this setting." : "Sisselogitud kasutajakonto peab olema peakasutajat või omama eraldi õigust selle seadustuse muutmiseks.",
+ "User already exists" : "Kasutaja on juba olemas",
+ "Group %1$s does not exist" : "%1$s gruppi pole olemas",
+ "Insufficient privileges for group %1$s" : "%1$s grupi jaoks pole pole piisavalt õigusi",
+ "No group specified (required for sub-admins)" : "Ühtegi gruppi pole määratud (vajalik peakasutajate alamgrupi puhul)",
+ "Sub-admin group does not exist" : "Peakasutajate alamgruppi pole olemas",
+ "Cannot create sub-admins for admin group" : "Peakasutajate grupi alamgruppi loomine ei õnnestu",
+ "No permissions to promote sub-admins" : "Pole õigusi peakasutajat alamgruppi määramiseks",
+ "Invalid password value" : "Vigane salasõna väärtus",
+ "An email address is required, to send a password link to the user." : "Salasõnalingi saatmiseks kasutajale on vajalik e-posti aadress.",
+ "Required email address was not provided" : "Vajalik e-posti aadress on lisamata",
+ "User creation failed" : "Kasutaja loomine ei õnnestunud",
+ "Invalid quota value: %1$s" : "Vigane kvoodi väärtus: %1$s",
+ "Invalid quota value. %1$s is exceeding the maximum quota" : "Vigane kvoodi väärtus. %1$s üledab maksimumkvoodi piiri",
+ "Unlimited quota is forbidden on this instance" : "Piiramatu kvoodi kasutamine on selles serveris keelatud",
+ "Setting the password is not supported by the users backend" : "Salasõna lisamine pole kasutajate taustateenuse poolt toetatud",
+ "Invalid language" : "Vigane keel",
+ "Invalid locale" : "Vigane lokaat",
+ "Invalid first day of week" : "Vigane nädala esimene päev",
+ "Cannot remove yourself from the admin group" : "Sa ei saa end peakasutajate grupist eemaldada",
+ "Cannot remove yourself from this group as you are a sub-admin" : "Kuna oled peakasutajate alamgrupi liige, siis sa ei saa end eemaldada",
+ "Not viable to remove user from the last group you are sub-admin of" : "Pole mõistlik eemaldada kasutajat viimasest grupist, kus oled peakasutajate alamgrupi liige",
+ "User does not exist" : "Kasutajat pole olemas",
+ "Group does not exist" : "Gruppi pole olemas",
+ "User is not a sub-admin of this group" : "Kasutaja pole selle grupi peakasutajate alamgrupi liige",
+ "Email address not available" : "E-posti aadress pole saadaval",
+ "Sending email failed" : "E-kirja saatmine ei õnnestunud",
+ "Email confirmation" : "E-posti aadressi kinnitamine",
+ "To enable the email address %s please click the button below." : "%s e-posti aadressi kinnitamiseks palun klõpsi järgnevat nuppu.",
+ "Confirm" : "Kinnita",
+ "Email was already removed from account and cannot be confirmed anymore." : "E-posti aadress on kasutaja andmetest eemaldatud ja seda ei saa enam kinnitada.",
+ "Could not verify mail because the token is expired." : "Kuna tunnusluba on aegunud, siis e-posti aadressi kinnitamine pole võimalik.",
+ "Could not verify mail because the token is invalid." : "Kuna tunnusluba on vigane, siis e-posti aadressi kinnitamine pole võimalik.",
+ "An unexpected error occurred. Please contact your admin." : "Tekkis ootamatu viga. Palun võta ühendust peakasutajaga.",
+ "Email confirmation successful" : "E-posti aadressi kinnitamine õnnestus.",
+ "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "See rakendus võtab kasutusele sellised API-d mis võimaldavad välistel süsteemidel hallata kasutajakontosid, gruppe ja rakendusi."
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/provisioning_api/l10n/et_EE.json b/apps/provisioning_api/l10n/et_EE.json
new file mode 100644
index 00000000000..f339e224be0
--- /dev/null
+++ b/apps/provisioning_api/l10n/et_EE.json
@@ -0,0 +1,39 @@
+{ "translations": {
+ "Logged in account must be an administrator or have authorization to edit this setting." : "Sisselogitud kasutajakonto peab olema peakasutajat või omama eraldi õigust selle seadustuse muutmiseks.",
+ "User already exists" : "Kasutaja on juba olemas",
+ "Group %1$s does not exist" : "%1$s gruppi pole olemas",
+ "Insufficient privileges for group %1$s" : "%1$s grupi jaoks pole pole piisavalt õigusi",
+ "No group specified (required for sub-admins)" : "Ühtegi gruppi pole määratud (vajalik peakasutajate alamgrupi puhul)",
+ "Sub-admin group does not exist" : "Peakasutajate alamgruppi pole olemas",
+ "Cannot create sub-admins for admin group" : "Peakasutajate grupi alamgruppi loomine ei õnnestu",
+ "No permissions to promote sub-admins" : "Pole õigusi peakasutajat alamgruppi määramiseks",
+ "Invalid password value" : "Vigane salasõna väärtus",
+ "An email address is required, to send a password link to the user." : "Salasõnalingi saatmiseks kasutajale on vajalik e-posti aadress.",
+ "Required email address was not provided" : "Vajalik e-posti aadress on lisamata",
+ "User creation failed" : "Kasutaja loomine ei õnnestunud",
+ "Invalid quota value: %1$s" : "Vigane kvoodi väärtus: %1$s",
+ "Invalid quota value. %1$s is exceeding the maximum quota" : "Vigane kvoodi väärtus. %1$s üledab maksimumkvoodi piiri",
+ "Unlimited quota is forbidden on this instance" : "Piiramatu kvoodi kasutamine on selles serveris keelatud",
+ "Setting the password is not supported by the users backend" : "Salasõna lisamine pole kasutajate taustateenuse poolt toetatud",
+ "Invalid language" : "Vigane keel",
+ "Invalid locale" : "Vigane lokaat",
+ "Invalid first day of week" : "Vigane nädala esimene päev",
+ "Cannot remove yourself from the admin group" : "Sa ei saa end peakasutajate grupist eemaldada",
+ "Cannot remove yourself from this group as you are a sub-admin" : "Kuna oled peakasutajate alamgrupi liige, siis sa ei saa end eemaldada",
+ "Not viable to remove user from the last group you are sub-admin of" : "Pole mõistlik eemaldada kasutajat viimasest grupist, kus oled peakasutajate alamgrupi liige",
+ "User does not exist" : "Kasutajat pole olemas",
+ "Group does not exist" : "Gruppi pole olemas",
+ "User is not a sub-admin of this group" : "Kasutaja pole selle grupi peakasutajate alamgrupi liige",
+ "Email address not available" : "E-posti aadress pole saadaval",
+ "Sending email failed" : "E-kirja saatmine ei õnnestunud",
+ "Email confirmation" : "E-posti aadressi kinnitamine",
+ "To enable the email address %s please click the button below." : "%s e-posti aadressi kinnitamiseks palun klõpsi järgnevat nuppu.",
+ "Confirm" : "Kinnita",
+ "Email was already removed from account and cannot be confirmed anymore." : "E-posti aadress on kasutaja andmetest eemaldatud ja seda ei saa enam kinnitada.",
+ "Could not verify mail because the token is expired." : "Kuna tunnusluba on aegunud, siis e-posti aadressi kinnitamine pole võimalik.",
+ "Could not verify mail because the token is invalid." : "Kuna tunnusluba on vigane, siis e-posti aadressi kinnitamine pole võimalik.",
+ "An unexpected error occurred. Please contact your admin." : "Tekkis ootamatu viga. Palun võta ühendust peakasutajaga.",
+ "Email confirmation successful" : "E-posti aadressi kinnitamine õnnestus.",
+ "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "See rakendus võtab kasutusele sellised API-d mis võimaldavad välistel süsteemidel hallata kasutajakontosid, gruppe ja rakendusi."
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/provisioning_api/l10n/ga.js b/apps/provisioning_api/l10n/ga.js
index ff44b2ee659..6d6b3944c48 100644
--- a/apps/provisioning_api/l10n/ga.js
+++ b/apps/provisioning_api/l10n/ga.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "Luach pasfhocail neamhbhailí",
"An email address is required, to send a password link to the user." : "Tá seoladh ríomhphoist ag teastáil, chun nasc pasfhocal a sheoladh chuig an úsáideoir.",
"Required email address was not provided" : "Níor cuireadh an seoladh ríomhphoist riachtanach ar fáil",
+ "User creation failed" : "Theip ar chruthú úsáideora",
"Invalid quota value: %1$s" : "Luach cuóta neamhbhailí: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Luach cuóta neamhbhailí. Tá %1$s níos mó ná an t-uaschuóta",
"Unlimited quota is forbidden on this instance" : "Tá cosc ​​ar chuóta neamhtheoranta sa chás seo",
diff --git a/apps/provisioning_api/l10n/ga.json b/apps/provisioning_api/l10n/ga.json
index 7adbb45272a..691a2dc7af6 100644
--- a/apps/provisioning_api/l10n/ga.json
+++ b/apps/provisioning_api/l10n/ga.json
@@ -11,6 +11,7 @@
"Invalid password value" : "Luach pasfhocail neamhbhailí",
"An email address is required, to send a password link to the user." : "Tá seoladh ríomhphoist ag teastáil, chun nasc pasfhocal a sheoladh chuig an úsáideoir.",
"Required email address was not provided" : "Níor cuireadh an seoladh ríomhphoist riachtanach ar fáil",
+ "User creation failed" : "Theip ar chruthú úsáideora",
"Invalid quota value: %1$s" : "Luach cuóta neamhbhailí: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Luach cuóta neamhbhailí. Tá %1$s níos mó ná an t-uaschuóta",
"Unlimited quota is forbidden on this instance" : "Tá cosc ​​ar chuóta neamhtheoranta sa chás seo",
diff --git a/apps/provisioning_api/l10n/pt_BR.js b/apps/provisioning_api/l10n/pt_BR.js
index cff70469649..4fbd4024484 100644
--- a/apps/provisioning_api/l10n/pt_BR.js
+++ b/apps/provisioning_api/l10n/pt_BR.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "Valor de senha inválido",
"An email address is required, to send a password link to the user." : "É necessário um endereço de e-mail, para enviar um link de senha para o usuário.",
"Required email address was not provided" : "O endereço de e-mail obrigatório não foi fornecido",
+ "User creation failed" : "Falha na criação do usuário",
"Invalid quota value: %1$s" : "Valor de cota inválido: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Valor de cota inválido. %1$s está excedendo a cota máxima",
"Unlimited quota is forbidden on this instance" : "Cota ilimitada é proibida nesta instância",
diff --git a/apps/provisioning_api/l10n/pt_BR.json b/apps/provisioning_api/l10n/pt_BR.json
index d074bd9e832..bb951174d30 100644
--- a/apps/provisioning_api/l10n/pt_BR.json
+++ b/apps/provisioning_api/l10n/pt_BR.json
@@ -11,6 +11,7 @@
"Invalid password value" : "Valor de senha inválido",
"An email address is required, to send a password link to the user." : "É necessário um endereço de e-mail, para enviar um link de senha para o usuário.",
"Required email address was not provided" : "O endereço de e-mail obrigatório não foi fornecido",
+ "User creation failed" : "Falha na criação do usuário",
"Invalid quota value: %1$s" : "Valor de cota inválido: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Valor de cota inválido. %1$s está excedendo a cota máxima",
"Unlimited quota is forbidden on this instance" : "Cota ilimitada é proibida nesta instância",
diff --git a/apps/provisioning_api/l10n/uk.js b/apps/provisioning_api/l10n/uk.js
index ca720ba4d75..11c218eea89 100644
--- a/apps/provisioning_api/l10n/uk.js
+++ b/apps/provisioning_api/l10n/uk.js
@@ -11,13 +11,16 @@ OC.L10N.register(
"Cannot create sub-admins for admin group" : "Неможливо створити другорядних адміністраторів для групи адміністраторів",
"No permissions to promote sub-admins" : "Відсутні дозволи для збільшення повноважень другорядних адміністраторів",
"Invalid password value" : "Недійсне значення паролю",
+ "An email address is required, to send a password link to the user." : "Для надсилання посилання на пароль користувачеві необхідна адреса електронної пошти.",
"Required email address was not provided" : "Не зазначено обов'язкової ел. адреси",
+ "User creation failed" : "Не вдалося створити користувача",
"Invalid quota value: %1$s" : "Недійсне значення квоти: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Недійсне значення квоти: %1$s перебільшує максимальну квоту",
"Unlimited quota is forbidden on this instance" : "Необмежену квоту заборонено на цьому примірнику",
"Setting the password is not supported by the users backend" : "Встановлення паролю не підтримується бекендом користувача",
"Invalid language" : "Недійсний вибір мови",
"Invalid locale" : "Недійсний вибір локалі",
+ "Invalid first day of week" : "Недійсний перший день тижня",
"Cannot remove yourself from the admin group" : "Неможливо вилучити себе із групи адміністраторів",
"Cannot remove yourself from this group as you are a sub-admin" : "Неможливо вилучити себе із цієї групи, оскільки ви є другорядним адміністратором",
"Not viable to remove user from the last group you are sub-admin of" : "Неможливо вилучити користувача з останньої групи, в якій ви є другорядним адміністратором",
@@ -35,6 +38,7 @@ OC.L10N.register(
"An unexpected error occurred. Please contact your admin." : "Сталася неочікувана помилка. Будь ласка, зверніться до свого адміністратора.",
"Email confirmation successful" : "Підтвердження електронною поштою успішно",
"Provisioning API" : "API надання",
- "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "Цей застосунок надає доступ до набору API, які можуть використовувати стоонні системи для керування обліковими записами, групами та застосунками."
+ "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "Цей застосунок надає доступ до набору API, які можуть використовувати стоонні системи для керування обліковими записами, групами та застосунками.",
+ "This application enables a set of APIs that external systems can use to create, edit, delete and query account\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin accounts\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." : "Цей застосунок підтримує набір API, які зовнішні системи можуть використовувати для створення, редагування, видалення та запитів користувача атрибути, запит, встановлення та видалення груп, встановлення квоти та запит загального обсягу пам’яті, що використовується в Nextcloud. Адміністратори групи користувачів також можуть надсилати запити Nextcloud і виконувати ті самі функції, що й адміністратори, для груп, якими вони керують. API також дозволяє адміністраторам надсилати запити до активних застосунків Nextcloud, отримувати інформацію про застосунок та віддалено вмикати чи вимикати застосунок. Після увімкнення застосунку HTTP-запити можна використовувати через заголовок Basic Auth для виконання будь-яких функцій, які перераховано вище. Додаткову інформацію можна знайти в документації Provisioning API включно з прикладами викликів та відповідей сервера."
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/provisioning_api/l10n/uk.json b/apps/provisioning_api/l10n/uk.json
index d3ecd2c1336..09884faa2e7 100644
--- a/apps/provisioning_api/l10n/uk.json
+++ b/apps/provisioning_api/l10n/uk.json
@@ -9,13 +9,16 @@
"Cannot create sub-admins for admin group" : "Неможливо створити другорядних адміністраторів для групи адміністраторів",
"No permissions to promote sub-admins" : "Відсутні дозволи для збільшення повноважень другорядних адміністраторів",
"Invalid password value" : "Недійсне значення паролю",
+ "An email address is required, to send a password link to the user." : "Для надсилання посилання на пароль користувачеві необхідна адреса електронної пошти.",
"Required email address was not provided" : "Не зазначено обов'язкової ел. адреси",
+ "User creation failed" : "Не вдалося створити користувача",
"Invalid quota value: %1$s" : "Недійсне значення квоти: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Недійсне значення квоти: %1$s перебільшує максимальну квоту",
"Unlimited quota is forbidden on this instance" : "Необмежену квоту заборонено на цьому примірнику",
"Setting the password is not supported by the users backend" : "Встановлення паролю не підтримується бекендом користувача",
"Invalid language" : "Недійсний вибір мови",
"Invalid locale" : "Недійсний вибір локалі",
+ "Invalid first day of week" : "Недійсний перший день тижня",
"Cannot remove yourself from the admin group" : "Неможливо вилучити себе із групи адміністраторів",
"Cannot remove yourself from this group as you are a sub-admin" : "Неможливо вилучити себе із цієї групи, оскільки ви є другорядним адміністратором",
"Not viable to remove user from the last group you are sub-admin of" : "Неможливо вилучити користувача з останньої групи, в якій ви є другорядним адміністратором",
@@ -33,6 +36,7 @@
"An unexpected error occurred. Please contact your admin." : "Сталася неочікувана помилка. Будь ласка, зверніться до свого адміністратора.",
"Email confirmation successful" : "Підтвердження електронною поштою успішно",
"Provisioning API" : "API надання",
- "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "Цей застосунок надає доступ до набору API, які можуть використовувати стоонні системи для керування обліковими записами, групами та застосунками."
+ "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "Цей застосунок надає доступ до набору API, які можуть використовувати стоонні системи для керування обліковими записами, групами та застосунками.",
+ "This application enables a set of APIs that external systems can use to create, edit, delete and query account\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin accounts\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." : "Цей застосунок підтримує набір API, які зовнішні системи можуть використовувати для створення, редагування, видалення та запитів користувача атрибути, запит, встановлення та видалення груп, встановлення квоти та запит загального обсягу пам’яті, що використовується в Nextcloud. Адміністратори групи користувачів також можуть надсилати запити Nextcloud і виконувати ті самі функції, що й адміністратори, для груп, якими вони керують. API також дозволяє адміністраторам надсилати запити до активних застосунків Nextcloud, отримувати інформацію про застосунок та віддалено вмикати чи вимикати застосунок. Після увімкнення застосунку HTTP-запити можна використовувати через заголовок Basic Auth для виконання будь-яких функцій, які перераховано вище. Додаткову інформацію можна знайти в документації Provisioning API включно з прикладами викликів та відповідей сервера."
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/provisioning_api/l10n/zh_HK.js b/apps/provisioning_api/l10n/zh_HK.js
index a5b009391a8..50e0bd73c4a 100644
--- a/apps/provisioning_api/l10n/zh_HK.js
+++ b/apps/provisioning_api/l10n/zh_HK.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "無效的密碼值",
"An email address is required, to send a password link to the user." : "需要提供電郵地址,以便向用戶發送密碼鏈接。",
"Required email address was not provided" : "未提供必要的電郵地址",
+ "User creation failed" : "用戶建立失敗",
"Invalid quota value: %1$s" : "無效的空間限額值:%1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額",
"Unlimited quota is forbidden on this instance" : "此實例禁止無限空間限額",
diff --git a/apps/provisioning_api/l10n/zh_HK.json b/apps/provisioning_api/l10n/zh_HK.json
index 39fdcf578fa..3ad90d8b398 100644
--- a/apps/provisioning_api/l10n/zh_HK.json
+++ b/apps/provisioning_api/l10n/zh_HK.json
@@ -11,6 +11,7 @@
"Invalid password value" : "無效的密碼值",
"An email address is required, to send a password link to the user." : "需要提供電郵地址,以便向用戶發送密碼鏈接。",
"Required email address was not provided" : "未提供必要的電郵地址",
+ "User creation failed" : "用戶建立失敗",
"Invalid quota value: %1$s" : "無效的空間限額值:%1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額",
"Unlimited quota is forbidden on this instance" : "此實例禁止無限空間限額",
diff --git a/apps/provisioning_api/l10n/zh_TW.js b/apps/provisioning_api/l10n/zh_TW.js
index 038c95a537d..716e6e0ee44 100644
--- a/apps/provisioning_api/l10n/zh_TW.js
+++ b/apps/provisioning_api/l10n/zh_TW.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid password value" : "無效的密碼值",
"An email address is required, to send a password link to the user." : "電子郵件地址必填,用來寄送密碼連結給使用者。",
"Required email address was not provided" : "未提供必要的電子郵件地址",
+ "User creation failed" : "使用者建立失敗",
"Invalid quota value: %1$s" : "無效的空間限額值:%1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額",
"Unlimited quota is forbidden on this instance" : "此站台禁止無限空間限額",
diff --git a/apps/provisioning_api/l10n/zh_TW.json b/apps/provisioning_api/l10n/zh_TW.json
index 91cffa5ce90..e8b80a3f1d2 100644
--- a/apps/provisioning_api/l10n/zh_TW.json
+++ b/apps/provisioning_api/l10n/zh_TW.json
@@ -11,6 +11,7 @@
"Invalid password value" : "無效的密碼值",
"An email address is required, to send a password link to the user." : "電子郵件地址必填,用來寄送密碼連結給使用者。",
"Required email address was not provided" : "未提供必要的電子郵件地址",
+ "User creation failed" : "使用者建立失敗",
"Invalid quota value: %1$s" : "無效的空間限額值:%1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額",
"Unlimited quota is forbidden on this instance" : "此站台禁止無限空間限額",
diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index 51b18306b51..1d1d0e8d2f9 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -542,10 +542,16 @@ class UsersController extends AUserDataOCSController {
throw new OCSException($this->l10n->t('Required email address was not provided'), 110);
}
+ // Create the user
try {
$newUser = $this->userManager->createUser($userid, $password);
- $this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
+ if (!$newUser instanceof IUser) {
+ // If the user is not an instance of IUser, it means the user creation failed
+ $this->logger->error('Failed addUser attempt: User creation failed.', ['app' => 'ocs_api']);
+ throw new OCSException($this->l10n->t('User creation failed'), 111);
+ }
+ $this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
foreach ($groups as $group) {
$this->groupManager->get($group)->addUser($newUser);
$this->logger->info('Added userid ' . $userid . ' to group ' . $group, ['app' => 'ocs_api']);
diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php
index 85ec9e374d6..e838cd16633 100644
--- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php
+++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php
@@ -452,7 +452,8 @@ class UsersControllerTest extends TestCase {
$this->userManager
->expects($this->once())
->method('createUser')
- ->with('NewUser', 'PasswordOfTheNewUser');
+ ->with('NewUser', 'PasswordOfTheNewUser')
+ ->willReturn($this->createMock(IUser::class));
$this->logger
->expects($this->once())
->method('info')
@@ -517,7 +518,8 @@ class UsersControllerTest extends TestCase {
$this->userManager
->expects($this->once())
->method('createUser')
- ->with('NewUser', 'PasswordOfTheNewUser');
+ ->with('NewUser', 'PasswordOfTheNewUser')
+ ->willReturn($this->createMock(IUser::class));
$this->logger
->expects($this->once())
->method('info')
@@ -567,7 +569,8 @@ class UsersControllerTest extends TestCase {
$this->userManager
->expects($this->once())
->method('createUser')
- ->with($this->anything(), 'PasswordOfTheNewUser');
+ ->with($this->anything(), 'PasswordOfTheNewUser')
+ ->willReturn($this->createMock(IUser::class));
$this->logger
->expects($this->once())
->method('info')
diff --git a/apps/settings/img/password.svg b/apps/settings/img/password.svg
index be3362cf765..07d9fcea162 100644
--- a/apps/settings/img/password.svg
+++ b/apps/settings/img/password.svg
@@ -1 +1 @@
-<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M6.308 21.5c-.497 0-.923-.177-1.277-.531a1.742 1.742 0 0 1-.531-1.277v-9.384c0-.497.177-.923.531-1.277.354-.354.78-.531 1.277-.531H7.5v-2c0-1.249.438-2.311 1.314-3.187C9.689 2.438 10.751 2 12 2c1.249 0 2.311.438 3.187 1.313.875.876 1.313 1.938 1.313 3.187v2h1.192c.497 0 .923.177 1.277.531.354.354.531.78.531 1.277v9.384c0 .497-.177.923-.531 1.277-.354.354-.78.531-1.277.531H6.308ZM12 16.75c.486 0 .899-.17 1.24-.51.34-.341.51-.754.51-1.24s-.17-.899-.51-1.239A1.688 1.688 0 0 0 12 13.25c-.486 0-.899.17-1.239.511-.341.34-.511.753-.511 1.239 0 .486.17.899.511 1.24.34.34.753.51 1.239.51ZM9 8.5h6v-2c0-.833-.292-1.542-.875-2.125A2.894 2.894 0 0 0 12 3.5c-.833 0-1.542.292-2.125.875A2.894 2.894 0 0 0 9 6.5v2Z" style="fill-rule:nonzero" transform="matrix(.71795 0 0 .71795 -.61 -.414)"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16"><path d="M12,17C10.89,17 10,16.1 10,15C10,13.89 10.89,13 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10C4,8.89 4.89,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z" /></svg> \ No newline at end of file
diff --git a/apps/settings/img/personal.png b/apps/settings/img/personal.png
index 179b15522b3..7a67761b53c 100644
--- a/apps/settings/img/personal.png
+++ b/apps/settings/img/personal.png
Binary files differ
diff --git a/apps/settings/img/personal.svg b/apps/settings/img/personal.svg
index e7d2b3e9f75..31ffe28b807 100644
--- a/apps/settings/img/personal.svg
+++ b/apps/settings/img/personal.svg
@@ -1 +1 @@
-<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M12 11.692c-.962 0-1.786-.342-2.472-1.028C8.843 9.979 8.5 9.155 8.5 8.192c0-.962.343-1.786 1.028-2.471.686-.686 1.51-1.029 2.472-1.029.963 0 1.786.343 2.472 1.029.685.685 1.028 1.509 1.028 2.471 0 .963-.343 1.787-1.028 2.472-.686.686-1.509 1.028-2.472 1.028Zm-7.5 7.616v-2.224c0-.489.133-.943.399-1.36a2.663 2.663 0 0 1 1.067-.962 14.51 14.51 0 0 1 2.991-1.091 12.965 12.965 0 0 1 6.086 0c1.006.243 2.003.606 2.992 1.091.445.224.8.545 1.066.962.266.417.399.871.399 1.36v2.224h-15Z" style="fill-rule:nonzero" transform="matrix(.95789 0 0 .95789 -3.484 -3.495)"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16"><path d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,6A2,2 0 0,0 10,8A2,2 0 0,0 12,10A2,2 0 0,0 14,8A2,2 0 0,0 12,6M12,13C14.67,13 20,14.33 20,17V20H4V17C4,14.33 9.33,13 12,13M12,14.9C9.03,14.9 5.9,16.36 5.9,17V18.1H18.1V17C18.1,16.36 14.97,14.9 12,14.9Z" /></svg> \ No newline at end of file
diff --git a/apps/settings/img/users-white.svg b/apps/settings/img/users-white.svg
index 4290dcd325f..d52dcac95c2 100644
--- a/apps/settings/img/users-white.svg
+++ b/apps/settings/img/users-white.svg
@@ -1 +1 @@
-<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M1.798 19.308v-2.224c0-.515.133-.975.399-1.379a2.721 2.721 0 0 1 1.066-.944c.95-.465 1.906-.823 2.867-1.076.961-.251 2.017-.377 3.168-.377 1.151 0 2.207.126 3.168.377.961.253 1.917.611 2.867 1.076.445.225.8.539 1.066.944.266.404.399.864.399 1.379v2.224h-15Zm17 0v-2.346c0-.657-.161-1.282-.482-1.877a4.533 4.533 0 0 0-1.368-1.531c.671.1 1.307.255 1.91.464.602.21 1.177.458 1.725.744.516.275.915.6 1.197.974.281.374.422.783.422 1.226v2.346h-3.404Zm-9.5-7.616c-.962 0-1.786-.342-2.472-1.028-.685-.685-1.028-1.509-1.028-2.472 0-.962.343-1.786 1.028-2.471.686-.686 1.51-1.029 2.472-1.029.963 0 1.787.343 2.472 1.029.685.685 1.028 1.509 1.028 2.471 0 .963-.343 1.787-1.028 2.472a3.367 3.367 0 0 1-2.472 1.028Zm8.635-3.5c0 .963-.343 1.787-1.028 2.472-.686.686-1.51 1.028-2.472 1.028-.113 0-.257-.013-.431-.038a3.814 3.814 0 0 1-.431-.085c.395-.474.698-1 .91-1.578a5.209 5.209 0 0 0-.007-3.593 5.774 5.774 0 0 0-.903-1.582c.144-.052.287-.085.431-.1.144-.016.287-.024.431-.024.962 0 1.786.343 2.472 1.029.685.685 1.028 1.509 1.028 2.471Z" style="fill:#fff;fill-rule:nonzero" transform="matrix(.78418 0 0 .78418 -1.41 -1.43)"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16"><path fill="#fff" d="M13.07 10.41A5 5 0 0 0 13.07 4.59A3.39 3.39 0 0 1 15 4A3.5 3.5 0 0 1 15 11A3.39 3.39 0 0 1 13.07 10.41M5.5 7.5A3.5 3.5 0 1 1 9 11A3.5 3.5 0 0 1 5.5 7.5M7.5 7.5A1.5 1.5 0 1 0 9 6A1.5 1.5 0 0 0 7.5 7.5M16 17V19H2V17S2 13 9 13 16 17 16 17M14 17C13.86 16.22 12.67 15 9 15S4.07 16.31 4 17M15.95 13A5.32 5.32 0 0 1 18 17V19H22V17S22 13.37 15.94 13Z" /></svg> \ No newline at end of file
diff --git a/apps/settings/img/users.svg b/apps/settings/img/users.svg
index 6894dfbb44e..91d0afce238 100644
--- a/apps/settings/img/users.svg
+++ b/apps/settings/img/users.svg
@@ -1 +1 @@
-<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M1.798 19.308v-2.224c0-.515.133-.975.399-1.379a2.721 2.721 0 0 1 1.066-.944c.95-.465 1.906-.823 2.867-1.076.961-.251 2.017-.377 3.168-.377 1.151 0 2.207.126 3.168.377.961.253 1.917.611 2.867 1.076.445.225.8.539 1.066.944.266.404.399.864.399 1.379v2.224h-15Zm17 0v-2.346c0-.657-.161-1.282-.482-1.877a4.533 4.533 0 0 0-1.368-1.531c.671.1 1.307.255 1.91.464.602.21 1.177.458 1.725.744.516.275.915.6 1.197.974.281.374.422.783.422 1.226v2.346h-3.404Zm-9.5-7.616c-.962 0-1.786-.342-2.472-1.028-.685-.685-1.028-1.509-1.028-2.472 0-.962.343-1.786 1.028-2.471.686-.686 1.51-1.029 2.472-1.029.963 0 1.787.343 2.472 1.029.685.685 1.028 1.509 1.028 2.471 0 .963-.343 1.787-1.028 2.472a3.367 3.367 0 0 1-2.472 1.028Zm8.635-3.5c0 .963-.343 1.787-1.028 2.472-.686.686-1.51 1.028-2.472 1.028-.113 0-.257-.013-.431-.038a3.814 3.814 0 0 1-.431-.085c.395-.474.698-1 .91-1.578a5.209 5.209 0 0 0-.007-3.593 5.774 5.774 0 0 0-.903-1.582c.144-.052.287-.085.431-.1.144-.016.287-.024.431-.024.962 0 1.786.343 2.472 1.029.685.685 1.028 1.509 1.028 2.471Z" style="fill-rule:nonzero" transform="matrix(.78418 0 0 .78418 -1.41 -1.43)"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16"><path d="M13.07 10.41A5 5 0 0 0 13.07 4.59A3.39 3.39 0 0 1 15 4A3.5 3.5 0 0 1 15 11A3.39 3.39 0 0 1 13.07 10.41M5.5 7.5A3.5 3.5 0 1 1 9 11A3.5 3.5 0 0 1 5.5 7.5M7.5 7.5A1.5 1.5 0 1 0 9 6A1.5 1.5 0 0 0 7.5 7.5M16 17V19H2V17S2 13 9 13 16 17 16 17M14 17C13.86 16.22 12.67 15 9 15S4.07 16.31 4 17M15.95 13A5.32 5.32 0 0 1 18 17V19H22V17S22 13.37 15.94 13Z" /></svg> \ No newline at end of file
diff --git a/apps/settings/l10n/cs.js b/apps/settings/l10n/cs.js
index 15e1f22443a..7fead4b9912 100644
--- a/apps/settings/l10n/cs.js
+++ b/apps/settings/l10n/cs.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Uživatelé i tak budou moci pořizovat snímky/video z obrazovky. Neposkytuje to jakoukoli definitivní ochranu.",
"Allow users to share via link and emails" : "Povolit uživatelům sdílet pomocí odkazů a e-mailů",
"Allow public uploads" : "Povolit veřejné nahrávání souborů",
+ "Allow public shares to be added to other clouds by federation." : "Umožnit přidávání veřejných sdílení do ostatních cloudů prostřednictvím federování.",
+ "This will add share permissions to all newly created link shares." : "Toto přidá oprávnění ke sdílení ke všem nově vytvářeným sdílením odkazem.",
"Always ask for a password" : "Vždy se zeptat na heslo",
"Enforce password protection" : "Vynutit ochranu heslem",
"Exclude groups from password requirements" : "Z požadavků na heslo vynechat následující skupiny",
diff --git a/apps/settings/l10n/cs.json b/apps/settings/l10n/cs.json
index 4637303628d..7269c122bb3 100644
--- a/apps/settings/l10n/cs.json
+++ b/apps/settings/l10n/cs.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Uživatelé i tak budou moci pořizovat snímky/video z obrazovky. Neposkytuje to jakoukoli definitivní ochranu.",
"Allow users to share via link and emails" : "Povolit uživatelům sdílet pomocí odkazů a e-mailů",
"Allow public uploads" : "Povolit veřejné nahrávání souborů",
+ "Allow public shares to be added to other clouds by federation." : "Umožnit přidávání veřejných sdílení do ostatních cloudů prostřednictvím federování.",
+ "This will add share permissions to all newly created link shares." : "Toto přidá oprávnění ke sdílení ke všem nově vytvářeným sdílením odkazem.",
"Always ask for a password" : "Vždy se zeptat na heslo",
"Enforce password protection" : "Vynutit ochranu heslem",
"Exclude groups from password requirements" : "Z požadavků na heslo vynechat následující skupiny",
diff --git a/apps/settings/l10n/de.js b/apps/settings/l10n/de.js
index fe268e4a84d..3b525970801 100644
--- a/apps/settings/l10n/de.js
+++ b/apps/settings/l10n/de.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Benutzer können weiterhin Screenshots erstellen oder den Bildschirm aufzeichnen. Dies bietet jedoch keinen endgültigen Schutz.",
"Allow users to share via link and emails" : "Benutzern erlauben, Inhalte über Links und E-Mails zu teilen",
"Allow public uploads" : "Öffentliches Hochladen erlauben",
+ "Allow public shares to be added to other clouds by federation." : "Ermöglicht das Hinzufügen von öffentlichen Freigaben zu anderen Clouds durch Federation.",
+ "This will add share permissions to all newly created link shares." : "Hierdurch werden allen neu erstellten Linkfreigaben Freigabeberechtigungen hinzugefügt.",
"Always ask for a password" : "Immer nach einem Passwort fragen",
"Enforce password protection" : "Passwortschutz erzwingen",
"Exclude groups from password requirements" : "Gruppen von Passwortanforderungen ausschließen",
diff --git a/apps/settings/l10n/de.json b/apps/settings/l10n/de.json
index bce5b9f9c7e..0f484bf25f0 100644
--- a/apps/settings/l10n/de.json
+++ b/apps/settings/l10n/de.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Benutzer können weiterhin Screenshots erstellen oder den Bildschirm aufzeichnen. Dies bietet jedoch keinen endgültigen Schutz.",
"Allow users to share via link and emails" : "Benutzern erlauben, Inhalte über Links und E-Mails zu teilen",
"Allow public uploads" : "Öffentliches Hochladen erlauben",
+ "Allow public shares to be added to other clouds by federation." : "Ermöglicht das Hinzufügen von öffentlichen Freigaben zu anderen Clouds durch Federation.",
+ "This will add share permissions to all newly created link shares." : "Hierdurch werden allen neu erstellten Linkfreigaben Freigabeberechtigungen hinzugefügt.",
"Always ask for a password" : "Immer nach einem Passwort fragen",
"Enforce password protection" : "Passwortschutz erzwingen",
"Exclude groups from password requirements" : "Gruppen von Passwortanforderungen ausschließen",
diff --git a/apps/settings/l10n/de_DE.js b/apps/settings/l10n/de_DE.js
index 15c4e6fa87a..6e508d71e6e 100644
--- a/apps/settings/l10n/de_DE.js
+++ b/apps/settings/l10n/de_DE.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Benutzer können weiterhin Screenshots erstellen oder den Bildschirm aufzeichnen. Dies bietet jedoch keinen endgültigen Schutz.",
"Allow users to share via link and emails" : "Konten erlauben, Inhalte über Links und E-Mails zu teilen.",
"Allow public uploads" : "Öffentliches Hochladen erlauben",
+ "Allow public shares to be added to other clouds by federation." : "Ermöglicht das Hinzufügen von öffentlichen Freigaben zu anderen Clouds durch Federation.",
+ "This will add share permissions to all newly created link shares." : "Hierdurch werden Freigabeberechtigungen für allen neu erstellten Linkfreigaben hinzugefügt.",
"Always ask for a password" : "Immer nach einem Passwort fragen",
"Enforce password protection" : "Passwortschutz erzwingen",
"Exclude groups from password requirements" : "Gruppen von Passwortanforderungen ausschließen",
diff --git a/apps/settings/l10n/de_DE.json b/apps/settings/l10n/de_DE.json
index 552f5109681..78f70927c19 100644
--- a/apps/settings/l10n/de_DE.json
+++ b/apps/settings/l10n/de_DE.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Benutzer können weiterhin Screenshots erstellen oder den Bildschirm aufzeichnen. Dies bietet jedoch keinen endgültigen Schutz.",
"Allow users to share via link and emails" : "Konten erlauben, Inhalte über Links und E-Mails zu teilen.",
"Allow public uploads" : "Öffentliches Hochladen erlauben",
+ "Allow public shares to be added to other clouds by federation." : "Ermöglicht das Hinzufügen von öffentlichen Freigaben zu anderen Clouds durch Federation.",
+ "This will add share permissions to all newly created link shares." : "Hierdurch werden Freigabeberechtigungen für allen neu erstellten Linkfreigaben hinzugefügt.",
"Always ask for a password" : "Immer nach einem Passwort fragen",
"Enforce password protection" : "Passwortschutz erzwingen",
"Exclude groups from password requirements" : "Gruppen von Passwortanforderungen ausschließen",
diff --git a/apps/settings/l10n/en_GB.js b/apps/settings/l10n/en_GB.js
index c96cc378ed7..c5c2d22ec57 100644
--- a/apps/settings/l10n/en_GB.js
+++ b/apps/settings/l10n/en_GB.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Users will still be able to screenshot or record the screen. This does not provide any definitive protection.",
"Allow users to share via link and emails" : "Allow users to share via link and emails",
"Allow public uploads" : "Allow public uploads",
+ "Allow public shares to be added to other clouds by federation." : "Allow public shares to be added to other clouds by federation.",
+ "This will add share permissions to all newly created link shares." : "This will add share permissions to all newly created link shares.",
"Always ask for a password" : "Always ask for a password",
"Enforce password protection" : "Enforce password protection",
"Exclude groups from password requirements" : "Exclude groups from password requirements",
diff --git a/apps/settings/l10n/en_GB.json b/apps/settings/l10n/en_GB.json
index ffa0f903f65..a4d53a47659 100644
--- a/apps/settings/l10n/en_GB.json
+++ b/apps/settings/l10n/en_GB.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Users will still be able to screenshot or record the screen. This does not provide any definitive protection.",
"Allow users to share via link and emails" : "Allow users to share via link and emails",
"Allow public uploads" : "Allow public uploads",
+ "Allow public shares to be added to other clouds by federation." : "Allow public shares to be added to other clouds by federation.",
+ "This will add share permissions to all newly created link shares." : "This will add share permissions to all newly created link shares.",
"Always ask for a password" : "Always ask for a password",
"Enforce password protection" : "Enforce password protection",
"Exclude groups from password requirements" : "Exclude groups from password requirements",
diff --git a/apps/settings/l10n/es.js b/apps/settings/l10n/es.js
index 30ac4b0b258..7e232991ce5 100644
--- a/apps/settings/l10n/es.js
+++ b/apps/settings/l10n/es.js
@@ -353,9 +353,9 @@ OC.L10N.register(
"Here you can decide which group can access certain sections of the administration settings." : "Aquí puede decidir qué grupo puede acceder a determinadas secciones de la configuración de administración.",
"Unable to modify setting" : "No se ha podido modificar la configuración",
"None" : "Ninguno",
- "Changed disclaimer text" : "Descargo de responsabilidad actualizado",
- "Deleted disclaimer text" : "Descargo de responsabilidad eliminado",
- "Could not set disclaimer text" : "No se pudo establecer el descargo de responsabilidad",
+ "Changed disclaimer text" : "El texto del descargo de responsabilidad ha sido actualizado",
+ "Deleted disclaimer text" : "Texto del descargo de responsabilidad eliminado",
+ "Could not set disclaimer text" : "No se pudo establecer el texto del descargo de responsabilidad",
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartir",
"Allow resharing" : "Permitir que se vuelva a compartir",
"Allow sharing with groups" : "Permitir compartir con grupos",
@@ -394,7 +394,7 @@ OC.L10N.register(
"Restrict account name autocompletion to users based on phone number integration" : "Limitar autocompletar el nombre de usuario a usuarios basándose en la integración del número de teléfono",
"Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Permitir autocompletado del nombre de usuario cuando se introduzca el nombre completo o la dirección del email (ignorando la falta de coincidencia en la agenda de teléfonos y ser del mismo grupo)",
"Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Mostrar texto de aviso en la página de subida de enlace público (solo se muestra cuando la lista de archivos está oculta)",
- "Disclaimer text" : "Descargo de responsabilidad",
+ "Disclaimer text" : "Texto del descargo de responsabilidad",
"This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la página de subida de enlace público cuando la lista de archivos esté oculta.",
"Default share permissions" : "Permisos por defecto para recurso compartido",
"Two-Factor Authentication" : "Autenticación de dos factores",
diff --git a/apps/settings/l10n/es.json b/apps/settings/l10n/es.json
index b8fe2a9ed67..e901dcfa7eb 100644
--- a/apps/settings/l10n/es.json
+++ b/apps/settings/l10n/es.json
@@ -351,9 +351,9 @@
"Here you can decide which group can access certain sections of the administration settings." : "Aquí puede decidir qué grupo puede acceder a determinadas secciones de la configuración de administración.",
"Unable to modify setting" : "No se ha podido modificar la configuración",
"None" : "Ninguno",
- "Changed disclaimer text" : "Descargo de responsabilidad actualizado",
- "Deleted disclaimer text" : "Descargo de responsabilidad eliminado",
- "Could not set disclaimer text" : "No se pudo establecer el descargo de responsabilidad",
+ "Changed disclaimer text" : "El texto del descargo de responsabilidad ha sido actualizado",
+ "Deleted disclaimer text" : "Texto del descargo de responsabilidad eliminado",
+ "Could not set disclaimer text" : "No se pudo establecer el texto del descargo de responsabilidad",
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartir",
"Allow resharing" : "Permitir que se vuelva a compartir",
"Allow sharing with groups" : "Permitir compartir con grupos",
@@ -392,7 +392,7 @@
"Restrict account name autocompletion to users based on phone number integration" : "Limitar autocompletar el nombre de usuario a usuarios basándose en la integración del número de teléfono",
"Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Permitir autocompletado del nombre de usuario cuando se introduzca el nombre completo o la dirección del email (ignorando la falta de coincidencia en la agenda de teléfonos y ser del mismo grupo)",
"Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Mostrar texto de aviso en la página de subida de enlace público (solo se muestra cuando la lista de archivos está oculta)",
- "Disclaimer text" : "Descargo de responsabilidad",
+ "Disclaimer text" : "Texto del descargo de responsabilidad",
"This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la página de subida de enlace público cuando la lista de archivos esté oculta.",
"Default share permissions" : "Permisos por defecto para recurso compartido",
"Two-Factor Authentication" : "Autenticación de dos factores",
diff --git a/apps/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js
index acf6e9d37ec..dfff7899eb5 100644
--- a/apps/settings/l10n/et_EE.js
+++ b/apps/settings/l10n/et_EE.js
@@ -23,13 +23,13 @@ OC.L10N.register(
"{actor} added you to group {group}" : "{actor} lisas sind gruppi {group}",
"You added {user} to group {group}" : "Sa lisasid kasutaja {user} gruppi {group}",
"{actor} added {user} to group {group}" : "{actor} lisas kasutaja {user} gruppi {group}",
- "An administrator added you to group {group}" : "Administraator lisas sind gruppi {group}",
- "An administrator added {user} to group {group}" : "Administraator lisas kasutaja {user} gruppi {group}",
+ "An administrator added you to group {group}" : "Peakasutaja lisas sind gruppi {group}",
+ "An administrator added {user} to group {group}" : "Peakasutaja lisas kasutaja {user} gruppi {group}",
"{actor} removed you from group {group}" : "{actor} eemaldas sind grupist {group}",
"You removed {user} from group {group}" : "Sa eemaldasid kasutaja {user} grupist {group}",
"{actor} removed {user} from group {group}" : "{actor} eemaldas kasutaja {user} grupist {group}",
- "An administrator removed you from group {group}" : "Administraator eemaldas sind grupist {group}",
- "An administrator removed {user} from group {group}" : "Administraator eemaldas kasutaja {user} grupist {group}",
+ "An administrator removed you from group {group}" : "Peakasutaja eemaldas sind grupist {group}",
+ "An administrator removed {user} from group {group}" : "Peakasutaja eemaldas kasutaja {user} grupist {group}",
"Your <strong>group memberships</strong> were modified" : "Sinu <strong>grupide liikmelisus</strong> on muutunud",
"{actor} changed your password" : "{actor} muutis sinu salasõna",
"You changed your password" : "Sa muutsid oma salasõna",
@@ -37,7 +37,7 @@ OC.L10N.register(
"Your password was reset" : "Sinu salasõna on lähtestatud",
"{actor} changed your email address" : "{actor} muutis sinu e-posti aadressi",
"You changed your email address" : "Sa muutsid oma e-posti aadressi",
- "Your email address was changed by an administrator" : "Administraator muutis sinu e-posti aadressi",
+ "Your email address was changed by an administrator" : "Peakasutaja muutis sinu e-posti aadressi",
"You created an app password for a session named \"{token}\"" : "Tegid rakenduse salasõna sessioonile nimega „{token}“",
"An administrator created an app password for a session named \"{token}\"" : "Peakasutaja tegi rakenduse salasõna sessioonile nimega „{token}“",
"You deleted app password \"{token}\"" : "Sina kustutasid rakenduse salasõna „{token}“",
@@ -60,9 +60,9 @@ OC.L10N.register(
"Unable to change password. Password too long." : "Salasõna muutmine ei õnnestu. Salasõna on liiga pikk.",
"Authentication error" : "Autentimise viga",
"Please provide an admin recovery password; otherwise, all account data will be lost." : "Palun sisesta peakasutaja taastesalasõna - vastasel juhul kaotad ligipääsu kõikidele kasutajakonto andmetele.",
- "Wrong admin recovery password. Please check the password and try again." : "Vale administraatori taastesalasõna. Palun kontrolli salasõna ning proovi uuesti.",
+ "Wrong admin recovery password. Please check the password and try again." : "Vale peakasutaja taastesalasõna. Palun kontrolli salasõna ning proovi uuesti.",
"Backend does not support password change, but the encryption of the account key was updated." : "Taustateenus ei toeta salasõna muutmist, aga kasutajakonto võtme krüptimine sai uuendatud.",
- "Administrator documentation" : "Administraatori dokumentatsioon",
+ "Administrator documentation" : "Dokumentatsioon peakasutajale",
"User documentation" : "Kasutaja dokumentatsioon",
"Nextcloud help overview" : "Nextcloudi abiteabe ülevaade",
"Invalid SMTP password." : "Vale SMTP salasõna.",
@@ -90,9 +90,9 @@ OC.L10N.register(
"Your password on %s was reset." : "Sinu salasõna „%s“ sai lähtestatud.",
"Password for %1$s changed on %2$s" : "%1$s salasõna teenuses %2$s on muutunud",
"Password changed for %s" : "%s salasõna on muudetud",
- "If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust administraatoriga.",
+ "If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust peakasutajaga.",
"Your email address on %s was changed." : "Sinu %s e-posti aadressi muudeti.",
- "Your email address on %s was changed by an administrator." : "Administraator muutis sinu %s e-posti aadressi.",
+ "Your email address on %s was changed by an administrator." : "Peakasutaja muutis sinu %s e-posti aadressi.",
"Email address for %1$s changed on %2$s" : "%1$s e-posti aadress muudetud %2$s",
"Email address changed for %s" : "%s e-posti aadress muudetud",
"The new email address is %s" : "Uus e-posti aadress on %s",
@@ -130,7 +130,7 @@ OC.L10N.register(
"Background jobs" : "Taustal toimivad haldustoimingud",
"Unlimited" : "Piiramatult",
"Verifying" : "Kontrollin",
- "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikus",
+ "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikud",
"Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside vahemikud pole seadistatud.",
"Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Seadistuste võtmes „%1$s“ peab olema kirjas massiiv ( aga leidsime „%2$s“). Süsteemihalduseks lubatud IP-aadresside filtreerimine hetkel ei toimi.",
"Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Seadistuste võtmes „%1$s“ on vigane IP-aadressi(de) vahemik: „%2$s“",
@@ -237,6 +237,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "See ei taga lõplikku kaitset - kasutajatel on ikkagi võimalus teha ekraanitõmmiseid või -salvestusi.",
"Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist",
"Allow public uploads" : "Luba avalikud üleslaadimised",
+ "Allow public shares to be added to other clouds by federation." : "Luba avalikku jaosmeediat lisada serveritesse liitpilves.",
+ "This will add share permissions to all newly created link shares." : "Sellega lisatakse vastavad õigused kõigile uutele loodavatale lingiga jagamistele.",
"Always ask for a password" : "Alati küsi salasõna",
"Enforce password protection" : "Jõusta salasõnakaitse",
"Exclude groups from password requirements" : "Välista grupid salasõnareeglitest",
@@ -349,7 +351,7 @@ OC.L10N.register(
"View in store" : "Vaata poes",
"Visit website" : "Külasta veebisaiti",
"Usage documentation" : "Kasutusjuhend",
- "Admin documentation" : "Administraatori dokumentatsioon",
+ "Admin documentation" : "Dokumentatsioon peakasutajale",
"Developer documentation" : "Arendaja dokumentatsioon",
"Details" : "Üksikasjad",
"All" : "Kõik",
@@ -561,7 +563,7 @@ OC.L10N.register(
"Password or insufficient permissions message" : "Teavitus salasõna või puuduvate õiguste kohta",
"Avatar" : "Tunnuspilt ehk avatar",
"Account name" : "Kasutajakonto nimi",
- "Group admin for" : "Grupi admin",
+ "Group admin for" : "Grupi peakasutaja",
"Account backend" : "Kasutajakonto taustateenus",
"Storage location" : "Salvestusruumi asukoht",
"First login" : "Esimene sisselogimine",
@@ -630,7 +632,7 @@ OC.L10N.register(
"No devices configured." : "Ühtegi seadet pole seadistatud.",
"The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:",
"Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.",
- "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Peakasutajana saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
"You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.",
"App Store" : "Rakendustepood",
"Loading app list" : "Laadin rakenduste loendit",
@@ -639,7 +641,7 @@ OC.L10N.register(
"Version {version}, {license}-licensed" : "Versioon {version}, avaldatud {license} litsentsi alusel",
"Version {version}" : "Versioon {version}",
"All accounts" : "Kõik kasutajakontod",
- "Admins" : "Haldurid",
+ "Admins" : "Peakasutajad",
"Account group: {group}" : "Kasutajakontode grupp: {group}",
"Account management" : "Kasutajakontode haldus",
"Sending…" : "Saadan...",
@@ -702,7 +704,7 @@ OC.L10N.register(
"Error while updating device token name" : "Viga seadme tunnusloa nime uuendamisel",
"Error while updating device token scope" : "Viga seadme tunnusloa toimeala uuendamisel",
"Could not set group sorting" : "Grupi järjestamise määramine ei õnnestunud",
- "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Sinu võrgust tuli liiga palju päringuid. Proovi hiljem uuesti, või võta ühendust administraatoriga, kui tegu on veaga.",
+ "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Sinu võrgust tuli liiga palju päringuid. Proovi hiljem uuesti, või võta ühendust peakasutajaga, kui tegu on veaga.",
"Error" : "Viga",
"Account documentation" : "Kasutajakonto juhendid",
"Administration documentation" : "Süsteemihalduse juhendid",
@@ -746,6 +748,7 @@ OC.L10N.register(
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "See Nextcloudi kogukonnaversioon pole toetatud ja kiirteavitused pole saadaval.",
"Use a second factor besides your password to increase security for your account." : "Sinu kasutajakonto turvalisuse parandamiseks kasuta lisaks oma salasõnale ka teist autentimisvõimalust.",
"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." : "Kui kasutad kolmanda osapoole rakenduses Nextcloudi ühendust, siis palun taga, et sa lood ja seadistad rakenduse salasõna enne kaheastmelise autentimise kasutusele võtmist.",
+ "Logged in account must be a subadmin" : "Sisselogitud kasutajakonto peab olema peakasutajate alamgrupi liige",
"File locking" : "Failide lukustus",
"The PHP memory limit is below the recommended value of %s." : "PHP mälukasutuse ülempiir on väiksem, kui soovitatav %s.",
"for WebAuthn passwordless login" : "WebAuthn salasõnata sisselogimise jaoks",
diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json
index 2005a025dff..e642931fd77 100644
--- a/apps/settings/l10n/et_EE.json
+++ b/apps/settings/l10n/et_EE.json
@@ -21,13 +21,13 @@
"{actor} added you to group {group}" : "{actor} lisas sind gruppi {group}",
"You added {user} to group {group}" : "Sa lisasid kasutaja {user} gruppi {group}",
"{actor} added {user} to group {group}" : "{actor} lisas kasutaja {user} gruppi {group}",
- "An administrator added you to group {group}" : "Administraator lisas sind gruppi {group}",
- "An administrator added {user} to group {group}" : "Administraator lisas kasutaja {user} gruppi {group}",
+ "An administrator added you to group {group}" : "Peakasutaja lisas sind gruppi {group}",
+ "An administrator added {user} to group {group}" : "Peakasutaja lisas kasutaja {user} gruppi {group}",
"{actor} removed you from group {group}" : "{actor} eemaldas sind grupist {group}",
"You removed {user} from group {group}" : "Sa eemaldasid kasutaja {user} grupist {group}",
"{actor} removed {user} from group {group}" : "{actor} eemaldas kasutaja {user} grupist {group}",
- "An administrator removed you from group {group}" : "Administraator eemaldas sind grupist {group}",
- "An administrator removed {user} from group {group}" : "Administraator eemaldas kasutaja {user} grupist {group}",
+ "An administrator removed you from group {group}" : "Peakasutaja eemaldas sind grupist {group}",
+ "An administrator removed {user} from group {group}" : "Peakasutaja eemaldas kasutaja {user} grupist {group}",
"Your <strong>group memberships</strong> were modified" : "Sinu <strong>grupide liikmelisus</strong> on muutunud",
"{actor} changed your password" : "{actor} muutis sinu salasõna",
"You changed your password" : "Sa muutsid oma salasõna",
@@ -35,7 +35,7 @@
"Your password was reset" : "Sinu salasõna on lähtestatud",
"{actor} changed your email address" : "{actor} muutis sinu e-posti aadressi",
"You changed your email address" : "Sa muutsid oma e-posti aadressi",
- "Your email address was changed by an administrator" : "Administraator muutis sinu e-posti aadressi",
+ "Your email address was changed by an administrator" : "Peakasutaja muutis sinu e-posti aadressi",
"You created an app password for a session named \"{token}\"" : "Tegid rakenduse salasõna sessioonile nimega „{token}“",
"An administrator created an app password for a session named \"{token}\"" : "Peakasutaja tegi rakenduse salasõna sessioonile nimega „{token}“",
"You deleted app password \"{token}\"" : "Sina kustutasid rakenduse salasõna „{token}“",
@@ -58,9 +58,9 @@
"Unable to change password. Password too long." : "Salasõna muutmine ei õnnestu. Salasõna on liiga pikk.",
"Authentication error" : "Autentimise viga",
"Please provide an admin recovery password; otherwise, all account data will be lost." : "Palun sisesta peakasutaja taastesalasõna - vastasel juhul kaotad ligipääsu kõikidele kasutajakonto andmetele.",
- "Wrong admin recovery password. Please check the password and try again." : "Vale administraatori taastesalasõna. Palun kontrolli salasõna ning proovi uuesti.",
+ "Wrong admin recovery password. Please check the password and try again." : "Vale peakasutaja taastesalasõna. Palun kontrolli salasõna ning proovi uuesti.",
"Backend does not support password change, but the encryption of the account key was updated." : "Taustateenus ei toeta salasõna muutmist, aga kasutajakonto võtme krüptimine sai uuendatud.",
- "Administrator documentation" : "Administraatori dokumentatsioon",
+ "Administrator documentation" : "Dokumentatsioon peakasutajale",
"User documentation" : "Kasutaja dokumentatsioon",
"Nextcloud help overview" : "Nextcloudi abiteabe ülevaade",
"Invalid SMTP password." : "Vale SMTP salasõna.",
@@ -88,9 +88,9 @@
"Your password on %s was reset." : "Sinu salasõna „%s“ sai lähtestatud.",
"Password for %1$s changed on %2$s" : "%1$s salasõna teenuses %2$s on muutunud",
"Password changed for %s" : "%s salasõna on muudetud",
- "If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust administraatoriga.",
+ "If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust peakasutajaga.",
"Your email address on %s was changed." : "Sinu %s e-posti aadressi muudeti.",
- "Your email address on %s was changed by an administrator." : "Administraator muutis sinu %s e-posti aadressi.",
+ "Your email address on %s was changed by an administrator." : "Peakasutaja muutis sinu %s e-posti aadressi.",
"Email address for %1$s changed on %2$s" : "%1$s e-posti aadress muudetud %2$s",
"Email address changed for %s" : "%s e-posti aadress muudetud",
"The new email address is %s" : "Uus e-posti aadress on %s",
@@ -128,7 +128,7 @@
"Background jobs" : "Taustal toimivad haldustoimingud",
"Unlimited" : "Piiramatult",
"Verifying" : "Kontrollin",
- "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikus",
+ "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikud",
"Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside vahemikud pole seadistatud.",
"Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Seadistuste võtmes „%1$s“ peab olema kirjas massiiv ( aga leidsime „%2$s“). Süsteemihalduseks lubatud IP-aadresside filtreerimine hetkel ei toimi.",
"Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Seadistuste võtmes „%1$s“ on vigane IP-aadressi(de) vahemik: „%2$s“",
@@ -235,6 +235,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "See ei taga lõplikku kaitset - kasutajatel on ikkagi võimalus teha ekraanitõmmiseid või -salvestusi.",
"Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist",
"Allow public uploads" : "Luba avalikud üleslaadimised",
+ "Allow public shares to be added to other clouds by federation." : "Luba avalikku jaosmeediat lisada serveritesse liitpilves.",
+ "This will add share permissions to all newly created link shares." : "Sellega lisatakse vastavad õigused kõigile uutele loodavatale lingiga jagamistele.",
"Always ask for a password" : "Alati küsi salasõna",
"Enforce password protection" : "Jõusta salasõnakaitse",
"Exclude groups from password requirements" : "Välista grupid salasõnareeglitest",
@@ -347,7 +349,7 @@
"View in store" : "Vaata poes",
"Visit website" : "Külasta veebisaiti",
"Usage documentation" : "Kasutusjuhend",
- "Admin documentation" : "Administraatori dokumentatsioon",
+ "Admin documentation" : "Dokumentatsioon peakasutajale",
"Developer documentation" : "Arendaja dokumentatsioon",
"Details" : "Üksikasjad",
"All" : "Kõik",
@@ -559,7 +561,7 @@
"Password or insufficient permissions message" : "Teavitus salasõna või puuduvate õiguste kohta",
"Avatar" : "Tunnuspilt ehk avatar",
"Account name" : "Kasutajakonto nimi",
- "Group admin for" : "Grupi admin",
+ "Group admin for" : "Grupi peakasutaja",
"Account backend" : "Kasutajakonto taustateenus",
"Storage location" : "Salvestusruumi asukoht",
"First login" : "Esimene sisselogimine",
@@ -628,7 +630,7 @@
"No devices configured." : "Ühtegi seadet pole seadistatud.",
"The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:",
"Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.",
- "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Peakasutajana saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
"You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.",
"App Store" : "Rakendustepood",
"Loading app list" : "Laadin rakenduste loendit",
@@ -637,7 +639,7 @@
"Version {version}, {license}-licensed" : "Versioon {version}, avaldatud {license} litsentsi alusel",
"Version {version}" : "Versioon {version}",
"All accounts" : "Kõik kasutajakontod",
- "Admins" : "Haldurid",
+ "Admins" : "Peakasutajad",
"Account group: {group}" : "Kasutajakontode grupp: {group}",
"Account management" : "Kasutajakontode haldus",
"Sending…" : "Saadan...",
@@ -700,7 +702,7 @@
"Error while updating device token name" : "Viga seadme tunnusloa nime uuendamisel",
"Error while updating device token scope" : "Viga seadme tunnusloa toimeala uuendamisel",
"Could not set group sorting" : "Grupi järjestamise määramine ei õnnestunud",
- "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Sinu võrgust tuli liiga palju päringuid. Proovi hiljem uuesti, või võta ühendust administraatoriga, kui tegu on veaga.",
+ "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Sinu võrgust tuli liiga palju päringuid. Proovi hiljem uuesti, või võta ühendust peakasutajaga, kui tegu on veaga.",
"Error" : "Viga",
"Account documentation" : "Kasutajakonto juhendid",
"Administration documentation" : "Süsteemihalduse juhendid",
@@ -744,6 +746,7 @@
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "See Nextcloudi kogukonnaversioon pole toetatud ja kiirteavitused pole saadaval.",
"Use a second factor besides your password to increase security for your account." : "Sinu kasutajakonto turvalisuse parandamiseks kasuta lisaks oma salasõnale ka teist autentimisvõimalust.",
"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." : "Kui kasutad kolmanda osapoole rakenduses Nextcloudi ühendust, siis palun taga, et sa lood ja seadistad rakenduse salasõna enne kaheastmelise autentimise kasutusele võtmist.",
+ "Logged in account must be a subadmin" : "Sisselogitud kasutajakonto peab olema peakasutajate alamgrupi liige",
"File locking" : "Failide lukustus",
"The PHP memory limit is below the recommended value of %s." : "PHP mälukasutuse ülempiir on väiksem, kui soovitatav %s.",
"for WebAuthn passwordless login" : "WebAuthn salasõnata sisselogimise jaoks",
diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js
index f3f56954d5e..b796b6bbab5 100644
--- a/apps/settings/l10n/fr.js
+++ b/apps/settings/l10n/fr.js
@@ -343,6 +343,7 @@ OC.L10N.register(
"Nextcloud settings" : "Paramètres Nextcloud",
"Unified task processing" : "Traitement unifié des tâches",
"AI tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Les tâches d'IA peuvent être mises en œuvre par différentes applications. Ici, vous pouvez définir quelle application doit être utilisée pour quelle tâche.",
+ "Allow AI usage for guest users" : "Autoriser l'utilisation de l'IA pour les utilisateurs invités",
"Task:" : "Tâche : ",
"Enable" : "Activer",
"None of your currently installed apps provide Task processing functionality" : "Aucune de vos applications actuellement installées ne fournit de fonctionnalité de traitement des tâches",
@@ -369,6 +370,7 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Les utilisateurs pourront toujours faire des captures d'écran ou enregistrer l'écran. Cela n'offre aucune protection définitive.",
"Allow users to share via link and emails" : "Autoriser les utilisateurs à partager par lien et par e-mail",
"Allow public uploads" : "Autoriser les téléversements publics",
+ "This will add share permissions to all newly created link shares." : "Cela ajoutera les permissions de partage à tous les nouveaux liens de partage.",
"Always ask for a password" : "Toujours demander un mot de passe",
"Enforce password protection" : "Imposer la protection par mot de passe",
"Exclude groups from password requirements" : "Exclure des groupes des contraintes de mot de passe",
diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json
index 2b64850fbd7..323744f2ded 100644
--- a/apps/settings/l10n/fr.json
+++ b/apps/settings/l10n/fr.json
@@ -341,6 +341,7 @@
"Nextcloud settings" : "Paramètres Nextcloud",
"Unified task processing" : "Traitement unifié des tâches",
"AI tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Les tâches d'IA peuvent être mises en œuvre par différentes applications. Ici, vous pouvez définir quelle application doit être utilisée pour quelle tâche.",
+ "Allow AI usage for guest users" : "Autoriser l'utilisation de l'IA pour les utilisateurs invités",
"Task:" : "Tâche : ",
"Enable" : "Activer",
"None of your currently installed apps provide Task processing functionality" : "Aucune de vos applications actuellement installées ne fournit de fonctionnalité de traitement des tâches",
@@ -367,6 +368,7 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Les utilisateurs pourront toujours faire des captures d'écran ou enregistrer l'écran. Cela n'offre aucune protection définitive.",
"Allow users to share via link and emails" : "Autoriser les utilisateurs à partager par lien et par e-mail",
"Allow public uploads" : "Autoriser les téléversements publics",
+ "This will add share permissions to all newly created link shares." : "Cela ajoutera les permissions de partage à tous les nouveaux liens de partage.",
"Always ask for a password" : "Toujours demander un mot de passe",
"Enforce password protection" : "Imposer la protection par mot de passe",
"Exclude groups from password requirements" : "Exclure des groupes des contraintes de mot de passe",
diff --git a/apps/settings/l10n/ga.js b/apps/settings/l10n/ga.js
index 5f8edd63eca..19dd4c69544 100644
--- a/apps/settings/l10n/ga.js
+++ b/apps/settings/l10n/ga.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Beidh úsáideoirí fós in ann scáileán a thógáil nó an scáileán a thaifeadadh. Ní sholáthraíonn sé seo aon chosaint chinntitheach.",
"Allow users to share via link and emails" : "Lig d'úsáideoirí a roinnt trí nasc agus ríomhphoist",
"Allow public uploads" : "Ceadaigh uaslódálacha poiblí",
+ "Allow public shares to be added to other clouds by federation." : "Ceadaigh scaireanna poiblí a chur le scamaill eile trí chónaidhm.",
+ "This will add share permissions to all newly created link shares." : "Cuirfidh sé seo ceadanna comhroinnte le gach comhroinnt nasc nua-chruthaithe.",
"Always ask for a password" : "Iarr pasfhocal i gcónaí",
"Enforce password protection" : "Cuir cosaint phasfhocal i bhfeidhm",
"Exclude groups from password requirements" : "Fág grúpaí ó riachtanais phasfhocal",
diff --git a/apps/settings/l10n/ga.json b/apps/settings/l10n/ga.json
index b565f117530..49dacb4ad00 100644
--- a/apps/settings/l10n/ga.json
+++ b/apps/settings/l10n/ga.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Beidh úsáideoirí fós in ann scáileán a thógáil nó an scáileán a thaifeadadh. Ní sholáthraíonn sé seo aon chosaint chinntitheach.",
"Allow users to share via link and emails" : "Lig d'úsáideoirí a roinnt trí nasc agus ríomhphoist",
"Allow public uploads" : "Ceadaigh uaslódálacha poiblí",
+ "Allow public shares to be added to other clouds by federation." : "Ceadaigh scaireanna poiblí a chur le scamaill eile trí chónaidhm.",
+ "This will add share permissions to all newly created link shares." : "Cuirfidh sé seo ceadanna comhroinnte le gach comhroinnt nasc nua-chruthaithe.",
"Always ask for a password" : "Iarr pasfhocal i gcónaí",
"Enforce password protection" : "Cuir cosaint phasfhocal i bhfeidhm",
"Exclude groups from password requirements" : "Fág grúpaí ó riachtanais phasfhocal",
diff --git a/apps/settings/l10n/lv.js b/apps/settings/l10n/lv.js
index 68226b2dd9f..967ff5dd9e2 100644
--- a/apps/settings/l10n/lv.js
+++ b/apps/settings/l10n/lv.js
@@ -16,6 +16,9 @@ OC.L10N.register(
"Unable to retrieve the group list" : "Nevarēja saņemt grupu sarakstu",
"{actor} changed your password" : "{actor] nomainīja Tavu paroli",
"You changed your password" : "Tu nomainīji savu paroli",
+ "{actor} changed your email address" : "{actor} nomainīja Tavu e-pasta adresi",
+ "You changed your email address" : "Tu nomainīji savu e-pasta adresi",
+ "Your email address was changed by an administrator" : "Pārvaldītājs nomainīja Tavu e-pasta adresi",
"You renamed app password \"{token}\" to \"{newToken}\"" : "Tu pārdēvēji lietotnes paroli \"{token}\" par \"{newToken}\"",
"Security" : "Drošība",
"You successfully logged in using two-factor authentication (%1$s)" : "Sekmīga pieteikšanās ar divpakāpju autentificēšanos (%1$s)",
@@ -37,6 +40,10 @@ OC.L10N.register(
"Unable to change full name" : "Nevar nomainīt pilno vārdu",
"Unable to change email address" : "Nevar mainīt e-pasta adresi",
"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):" : "Lai apliecinātu savu tīmekļvietni, zemāk esošais saturs ir jāglabā tīmekļvietnes pamatmapē kā `.well-known/CloudIdVerificationCode.txt` (lūgums pārliecināties, ka viss teksts ir vienā rindiņā):",
+ "%1$s changed your password on %2$s." : "%1$s nomainīja Tavu %2$sparoli.",
+ "Your password on %s was changed." : "Tava %s parole tika nomainīta.",
+ "Your email address on %s was changed." : "Tava %s e-pasta adrese tika nomainīta.",
+ "Your email address on %s was changed by an administrator." : "Pārvaldītājs nomainīja Tavu %s e-pasta adresi",
"Your %s account was created" : "Konts %s ir izveidots",
"Apps" : "Lietotnes",
"Personal" : "Personīgi",
@@ -194,6 +201,7 @@ OC.L10N.register(
"Admins" : "Pārvaldītāji",
"Sending…" : "Sūta …",
"Email sent" : "E-pasta ziņojums nosūtīts",
+ "For performance reasons, when you enable encryption on a Nextcloud server only new and changed files are encrypted." : "Veiktspējas dēļ, kad Nextcloud serverī iespējo šifrēšanu, jaunās un izmainītās datnes tiek šīfrētas.",
"Location" : "Atrašanās vieta",
"Profile picture" : "Profila attēls",
"About" : "Par",
diff --git a/apps/settings/l10n/lv.json b/apps/settings/l10n/lv.json
index 1231c5bc914..6f58b2bb0d9 100644
--- a/apps/settings/l10n/lv.json
+++ b/apps/settings/l10n/lv.json
@@ -14,6 +14,9 @@
"Unable to retrieve the group list" : "Nevarēja saņemt grupu sarakstu",
"{actor} changed your password" : "{actor] nomainīja Tavu paroli",
"You changed your password" : "Tu nomainīji savu paroli",
+ "{actor} changed your email address" : "{actor} nomainīja Tavu e-pasta adresi",
+ "You changed your email address" : "Tu nomainīji savu e-pasta adresi",
+ "Your email address was changed by an administrator" : "Pārvaldītājs nomainīja Tavu e-pasta adresi",
"You renamed app password \"{token}\" to \"{newToken}\"" : "Tu pārdēvēji lietotnes paroli \"{token}\" par \"{newToken}\"",
"Security" : "Drošība",
"You successfully logged in using two-factor authentication (%1$s)" : "Sekmīga pieteikšanās ar divpakāpju autentificēšanos (%1$s)",
@@ -35,6 +38,10 @@
"Unable to change full name" : "Nevar nomainīt pilno vārdu",
"Unable to change email address" : "Nevar mainīt e-pasta adresi",
"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):" : "Lai apliecinātu savu tīmekļvietni, zemāk esošais saturs ir jāglabā tīmekļvietnes pamatmapē kā `.well-known/CloudIdVerificationCode.txt` (lūgums pārliecināties, ka viss teksts ir vienā rindiņā):",
+ "%1$s changed your password on %2$s." : "%1$s nomainīja Tavu %2$sparoli.",
+ "Your password on %s was changed." : "Tava %s parole tika nomainīta.",
+ "Your email address on %s was changed." : "Tava %s e-pasta adrese tika nomainīta.",
+ "Your email address on %s was changed by an administrator." : "Pārvaldītājs nomainīja Tavu %s e-pasta adresi",
"Your %s account was created" : "Konts %s ir izveidots",
"Apps" : "Lietotnes",
"Personal" : "Personīgi",
@@ -192,6 +199,7 @@
"Admins" : "Pārvaldītāji",
"Sending…" : "Sūta …",
"Email sent" : "E-pasta ziņojums nosūtīts",
+ "For performance reasons, when you enable encryption on a Nextcloud server only new and changed files are encrypted." : "Veiktspējas dēļ, kad Nextcloud serverī iespējo šifrēšanu, jaunās un izmainītās datnes tiek šīfrētas.",
"Location" : "Atrašanās vieta",
"Profile picture" : "Profila attēls",
"About" : "Par",
diff --git a/apps/settings/l10n/mk.js b/apps/settings/l10n/mk.js
index b35af1f27c3..74d77d42867 100644
--- a/apps/settings/l10n/mk.js
+++ b/apps/settings/l10n/mk.js
@@ -181,6 +181,7 @@ OC.L10N.register(
"_%n app has an update available_::_%n apps have an update available_" : ["За %n апликација има достапно ажурирање","За %n апликации има достапно ажурирање"],
"_Update_::_Update all_" : ["Ажурирај","Ажурирај ги сите"],
"Group name" : "Име на група",
+ "Nothing to show" : "Нема што да се прикаже",
"Type" : "Вид",
"Learn more" : "Научи повеќе",
"Confirm" : "Потврди",
@@ -274,6 +275,7 @@ OC.L10N.register(
"Picture provided by original account" : "Слика обезбедена од оригинална сметка",
"Set as profile picture" : "Постави фотографија на профилот",
"Please note that it can take up to 24 hours for your profile picture to be updated everywhere." : "Имајте предвид дека може да потрае до 24 часа за да се ажурира аватарот насекаде.",
+ "Your biography. Markdown is supported." : "Вашата биографија.",
"Enter your date of birth" : "Внесете го вашиот датум на раѓање",
"You are using {s}{usage}{/s}" : "Користите {s}{usage}{/s}",
"You are using {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})" : "Користите {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})",
@@ -366,6 +368,7 @@ OC.L10N.register(
"Show language" : "Прикажи јазик",
"Show storage path" : "Прикажи патека на складиште",
"Show last login" : "Прикажи последно најавување",
+ "Sorting" : "Сортирање",
"Send email" : "Испрати пошта",
"Defaults" : "Стандарди",
"Default quota" : "Стандардна квота",
@@ -402,6 +405,8 @@ OC.L10N.register(
"Locale" : "Локација",
"First day of week" : "Прв ден од неделата",
"Not available as this property is required for core functionality including file sharing and calendar invitations" : "Не е достапно бидејќи ова својство е потребно за основна функционалност, вклучувајќи споделување датотеки и покани од календар",
+ "Not available as federation has been disabled for your account, contact your system administration if you have any questions" : "Не е достапно бидејќи федерацијата е оневозможена за вашата сметка, контактирајте го администраторот доколку имате какви било прашања.",
+ "Not available as publishing account specific data to the lookup server is not allowed, contact your system administration if you have any questions" : "Не е достапно бидејќи не е дозволено објавување специфични податоци за корисникот на серверот за пребарување, контактирајте со вашиот системски администратор ако имате какви било прашања",
"Your apps" : "Ваши апликации",
"Active apps" : "Активни апликации",
"Disabled apps" : "Оневозможени апликации",
diff --git a/apps/settings/l10n/mk.json b/apps/settings/l10n/mk.json
index a84e5c2e4ec..96c0e392842 100644
--- a/apps/settings/l10n/mk.json
+++ b/apps/settings/l10n/mk.json
@@ -179,6 +179,7 @@
"_%n app has an update available_::_%n apps have an update available_" : ["За %n апликација има достапно ажурирање","За %n апликации има достапно ажурирање"],
"_Update_::_Update all_" : ["Ажурирај","Ажурирај ги сите"],
"Group name" : "Име на група",
+ "Nothing to show" : "Нема што да се прикаже",
"Type" : "Вид",
"Learn more" : "Научи повеќе",
"Confirm" : "Потврди",
@@ -272,6 +273,7 @@
"Picture provided by original account" : "Слика обезбедена од оригинална сметка",
"Set as profile picture" : "Постави фотографија на профилот",
"Please note that it can take up to 24 hours for your profile picture to be updated everywhere." : "Имајте предвид дека може да потрае до 24 часа за да се ажурира аватарот насекаде.",
+ "Your biography. Markdown is supported." : "Вашата биографија.",
"Enter your date of birth" : "Внесете го вашиот датум на раѓање",
"You are using {s}{usage}{/s}" : "Користите {s}{usage}{/s}",
"You are using {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})" : "Користите {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})",
@@ -364,6 +366,7 @@
"Show language" : "Прикажи јазик",
"Show storage path" : "Прикажи патека на складиште",
"Show last login" : "Прикажи последно најавување",
+ "Sorting" : "Сортирање",
"Send email" : "Испрати пошта",
"Defaults" : "Стандарди",
"Default quota" : "Стандардна квота",
@@ -400,6 +403,8 @@
"Locale" : "Локација",
"First day of week" : "Прв ден од неделата",
"Not available as this property is required for core functionality including file sharing and calendar invitations" : "Не е достапно бидејќи ова својство е потребно за основна функционалност, вклучувајќи споделување датотеки и покани од календар",
+ "Not available as federation has been disabled for your account, contact your system administration if you have any questions" : "Не е достапно бидејќи федерацијата е оневозможена за вашата сметка, контактирајте го администраторот доколку имате какви било прашања.",
+ "Not available as publishing account specific data to the lookup server is not allowed, contact your system administration if you have any questions" : "Не е достапно бидејќи не е дозволено објавување специфични податоци за корисникот на серверот за пребарување, контактирајте со вашиот системски администратор ако имате какви било прашања",
"Your apps" : "Ваши апликации",
"Active apps" : "Активни апликации",
"Disabled apps" : "Оневозможени апликации",
diff --git a/apps/settings/l10n/pl.js b/apps/settings/l10n/pl.js
index 927a96502e2..9dc8d22078a 100644
--- a/apps/settings/l10n/pl.js
+++ b/apps/settings/l10n/pl.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Użytkownicy nadal będą mogli robić zrzuty ekranu lub nagrywać ekran. Nie stanowi to pełnej ochrony.",
"Allow users to share via link and emails" : "Zezwalaj użytkownikom na udostępnianie za pośrednictwem linków i e-maili",
"Allow public uploads" : "Zezwalaj na publiczne wysyłanie",
+ "Allow public shares to be added to other clouds by federation." : "Zezwalaj na dodawanie publicznych udostępnień do innych chmur przez federację.",
+ "This will add share permissions to all newly created link shares." : "Spowoduje to dodanie uprawnień do udostępniania dla wszystkich nowo tworzonych udostępnień za pomocą linku.",
"Always ask for a password" : "Zawsze pytaj o hasło",
"Enforce password protection" : "Wymuszaj zabezpieczenie hasłem",
"Exclude groups from password requirements" : "Wyklucz grupy z wymagań dotyczących haseł",
diff --git a/apps/settings/l10n/pl.json b/apps/settings/l10n/pl.json
index 76c734bf9de..3e05ea4aaee 100644
--- a/apps/settings/l10n/pl.json
+++ b/apps/settings/l10n/pl.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Użytkownicy nadal będą mogli robić zrzuty ekranu lub nagrywać ekran. Nie stanowi to pełnej ochrony.",
"Allow users to share via link and emails" : "Zezwalaj użytkownikom na udostępnianie za pośrednictwem linków i e-maili",
"Allow public uploads" : "Zezwalaj na publiczne wysyłanie",
+ "Allow public shares to be added to other clouds by federation." : "Zezwalaj na dodawanie publicznych udostępnień do innych chmur przez federację.",
+ "This will add share permissions to all newly created link shares." : "Spowoduje to dodanie uprawnień do udostępniania dla wszystkich nowo tworzonych udostępnień za pomocą linku.",
"Always ask for a password" : "Zawsze pytaj o hasło",
"Enforce password protection" : "Wymuszaj zabezpieczenie hasłem",
"Exclude groups from password requirements" : "Wyklucz grupy z wymagań dotyczących haseł",
diff --git a/apps/settings/l10n/pt_BR.js b/apps/settings/l10n/pt_BR.js
index 26f0728604d..848734a4dbb 100644
--- a/apps/settings/l10n/pt_BR.js
+++ b/apps/settings/l10n/pt_BR.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Os usuários ainda poderão fazer capturas de tela ou gravar a tela. Isso não oferece nenhuma proteção definitiva.",
"Allow users to share via link and emails" : "Permitir que os usuários compartilhem via link e e-mails",
"Allow public uploads" : "Permitir uploads públicos",
+ "Allow public shares to be added to other clouds by federation." : "Permitir que compartilhamentos públicos sejam adicionados a outras nuvens por federação.",
+ "This will add share permissions to all newly created link shares." : "Isso adicionará permissões de compartilhamento a todos os compartilhamentos de link novamente criados.",
"Always ask for a password" : "Sempre pedir a senha",
"Enforce password protection" : "Obrigar proteção com senha",
"Exclude groups from password requirements" : "Excluir grupos dos requisitos de senha",
diff --git a/apps/settings/l10n/pt_BR.json b/apps/settings/l10n/pt_BR.json
index 63c48345a3f..9ed68c369c2 100644
--- a/apps/settings/l10n/pt_BR.json
+++ b/apps/settings/l10n/pt_BR.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Os usuários ainda poderão fazer capturas de tela ou gravar a tela. Isso não oferece nenhuma proteção definitiva.",
"Allow users to share via link and emails" : "Permitir que os usuários compartilhem via link e e-mails",
"Allow public uploads" : "Permitir uploads públicos",
+ "Allow public shares to be added to other clouds by federation." : "Permitir que compartilhamentos públicos sejam adicionados a outras nuvens por federação.",
+ "This will add share permissions to all newly created link shares." : "Isso adicionará permissões de compartilhamento a todos os compartilhamentos de link novamente criados.",
"Always ask for a password" : "Sempre pedir a senha",
"Enforce password protection" : "Obrigar proteção com senha",
"Exclude groups from password requirements" : "Excluir grupos dos requisitos de senha",
diff --git a/apps/settings/l10n/tr.js b/apps/settings/l10n/tr.js
index 7a88f10365f..5d18d8f7ffa 100644
--- a/apps/settings/l10n/tr.js
+++ b/apps/settings/l10n/tr.js
@@ -343,6 +343,7 @@ OC.L10N.register(
"Nextcloud settings" : "Nextcloud ayarları",
"Unified task processing" : "Birleştirilmiş görev işleme",
"AI tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Yapay zeka görevleri farklı uygulamalardan sağlanabilir. Buradan, bu görev için hangi uygulamanın kullanılacağını ayarlayabilirsiniz.",
+ "Allow AI usage for guest users" : "Konuk kullanıcılar YZ kullanabilsin",
"Task:" : "Görev:",
"Enable" : "Kullanıma al",
"None of your currently installed apps provide Task processing functionality" : "Kurulu uygulamaların hiçbirinde görev işleme özelliği yok",
@@ -369,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Kullanıcılar ekran görüntüsü alabilirler veya ekranı kaydedebilirler. Bu seçenek tam bir kesin koruma sağlamaz.",
"Allow users to share via link and emails" : "Kullanıcılar bağlantı ve e-posta ile paylaşabilsin",
"Allow public uploads" : "Herkes yükleyebilsin",
+ "Allow public shares to be added to other clouds by federation." : "Herkese açık paylaşımların birlik ile diğer bulutlara eklenebilmesini sağlar.",
+ "This will add share permissions to all newly created link shares." : "Bu seçenek, yeni oluşturulan tüm bağlantı paylaşımlarına paylaşım izinleri ekler.",
"Always ask for a password" : "Her zaman parola sorulsun",
"Enforce password protection" : "Parola koruması zorunlu kılınsın",
"Exclude groups from password requirements" : "Parola gereksinimlerine katılmayacak gruplar",
diff --git a/apps/settings/l10n/tr.json b/apps/settings/l10n/tr.json
index 7f03aa37823..a2854f91139 100644
--- a/apps/settings/l10n/tr.json
+++ b/apps/settings/l10n/tr.json
@@ -341,6 +341,7 @@
"Nextcloud settings" : "Nextcloud ayarları",
"Unified task processing" : "Birleştirilmiş görev işleme",
"AI tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Yapay zeka görevleri farklı uygulamalardan sağlanabilir. Buradan, bu görev için hangi uygulamanın kullanılacağını ayarlayabilirsiniz.",
+ "Allow AI usage for guest users" : "Konuk kullanıcılar YZ kullanabilsin",
"Task:" : "Görev:",
"Enable" : "Kullanıma al",
"None of your currently installed apps provide Task processing functionality" : "Kurulu uygulamaların hiçbirinde görev işleme özelliği yok",
@@ -367,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Kullanıcılar ekran görüntüsü alabilirler veya ekranı kaydedebilirler. Bu seçenek tam bir kesin koruma sağlamaz.",
"Allow users to share via link and emails" : "Kullanıcılar bağlantı ve e-posta ile paylaşabilsin",
"Allow public uploads" : "Herkes yükleyebilsin",
+ "Allow public shares to be added to other clouds by federation." : "Herkese açık paylaşımların birlik ile diğer bulutlara eklenebilmesini sağlar.",
+ "This will add share permissions to all newly created link shares." : "Bu seçenek, yeni oluşturulan tüm bağlantı paylaşımlarına paylaşım izinleri ekler.",
"Always ask for a password" : "Her zaman parola sorulsun",
"Enforce password protection" : "Parola koruması zorunlu kılınsın",
"Exclude groups from password requirements" : "Parola gereksinimlerine katılmayacak gruplar",
diff --git a/apps/settings/l10n/uk.js b/apps/settings/l10n/uk.js
index 74d5157563c..92fdadf224b 100644
--- a/apps/settings/l10n/uk.js
+++ b/apps/settings/l10n/uk.js
@@ -132,6 +132,8 @@ OC.L10N.register(
"Verifying" : "Перевірка",
"Allowed admin IP ranges" : "Дозволені діапазони адрес IP",
"Admin IP filtering isn't applied." : "Фільтрування адміністраторів за адресою IP не застосовується.",
+ "Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Ключ конфігурації \"%1$s\" очікує масив (%2$s знайдено). Перевірка діапазону IP-адрес адміністратора не застосовуватиметься.",
+ "Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Ключ конфігурації \"%1$s\" містить невірний діапазон IP-адрес: \"%2$s\"",
"Admin IP filtering is correctly configured." : "Фільтрування адміністраторів за адресою IP правильно налаштовано.",
"App directories owner" : "Власник каталогів застосунків",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Окремі каталоги застосунків мають інших користувачів на відміну від користувача вебсервера. Часто таке трапляється, якщо застосунки було встановлено вручну. Перевірте дозволи на такі каталоги застосунків:\n%s",
@@ -140,7 +142,9 @@ OC.L10N.register(
"Your remote address could not be determined." : "Не вдалося визначити вашу віддалену адресу.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваша віддалена адреса була ідентифікована як \"%s\" і наразі щодо неї виконуються спроби грубого підбору паролів, відповідно виконання різних запитів відбувається уповільнено . Якщо віддалена адреса не є вашою адресою, це може свідчити про те, що проксі налаштовано неправильно.",
"Your remote address \"%s\" is not brute-force throttled." : "Ваша віддалена адреса \"%s\" не уповільнена через грубі спроби підбору паролів.",
+ "Old administration imported certificates" : "Стара адміністрація імпортувала сертифікати",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Виконується фонове завдання, яке перевіряє імпортовані SSL-сертифікати на предмет адміністрування. Будь ласка, перевірте пізніше.",
+ "There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Існують деякі імпортовані адміністрацією SSL-сертифікати, які більше не використовуються в Nextcloud 21. Їх можна імпортувати в командному рядку за допомогою команди \"occ security:certificates:import\". Шляхи до них у каталозі даних показано нижче.",
"Code integrity" : "Цілісність коду",
"Integrity checker has been disabled. Integrity cannot be verified." : "Перевірку на цілісність вимкнено. Цілісність буде неможливо перевірити.",
"No altered files" : "Відсутні змінені файли",
@@ -153,12 +157,14 @@ OC.L10N.register(
"Last background job execution ran %s." : "Останнє виконання фонового завдання тривало: %s.",
"Data directory protected" : "Директорія з даними є захищеною",
"Your data directory and files are probably accessible from the internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Ваш каталог даних і файли, ймовірно, доступні з Інтернету. Файл .htaccess не працює. Настійно рекомендується налаштувати веб-сервер так, щоб каталог даних був недоступний, або перемістити каталог даних за межі кореня документа веб-сервера.",
+ "Could not check that the data directory is protected. Please check manually that your server does not allow access to the data directory." : "Не вдалося перевірити, що каталог даних захищено. Будь ласка, перевірте вручну, чи ваш сервер не дозволяє доступ до каталогу даних.",
"Database missing columns" : "Відсутні стовпці у базі даних",
"Missing optional column \"%s\" in table \"%s\"." : "Відсутні необов'язкові стовпці \"%s\" у таблиці \"%s\".",
"The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "У базі даних відсутні деякі необов’язкові стовпці. Через те, що додавання стовпців у великі таблиці може зайняти деякий час, вони не додаються автоматично, коли вони можуть бути необов’язковими. Для створення відсутніх стовпців, будь ласка, виконайте команду \"occ db:add-missing-columns\". Після додавання стовпців деякі функції можуть покращити реагування та зручність використання.",
"Database missing indices" : "Відсутні індекси у базі даних",
"Missing indices:" : "Відсутні індекси:",
"\"%s\" in table \"%s\"" : "\"%s\" в таблиці \"%s\"",
+ "Detected some missing optional indices. Occasionally new indices are added (by Nextcloud or installed applications) to improve database performance. Adding indices can sometimes take awhile and temporarily hurt performance so this is not done automatically during upgrades. Once the indices are added, queries to those tables should be faster. Use the command `occ db:add-missing-indices` to add them." : "Виявлено деякі відсутні необов'язкові індекси. Іноді додаються нові індекси (за допомогою Nextcloud або встановлених додатків) для підвищення продуктивності бази даних. Додавання індексів може зайняти деякий час і тимчасово знизити продуктивність, тому під час оновлень це не робиться автоматично. Після додавання індексів запити до цих таблиць мають працювати швидше. Щоб додати їх, скористайтеся командою `occ db:add-missing-indices`.",
"Database missing primary keys" : "Відсутні первинні ключі у базі даних",
"Missing primary key on table \"%s\"." : "Відсутній первинний ключ у таблиці \"%s\".",
"The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running \"occ db:add-missing-primary-keys\" those missing primary keys could be added manually while the instance keeps running." : "У базі даних відсутні деякі первинні ключі. Через те, що додавання первинних ключів у великі таблиці може зайняти деякий час, вони не додаються автоматично. Для створення первинних ключей, будь ласка, виконайте команду \"occ db:add-missing-primary-keys\".",
@@ -170,42 +176,71 @@ OC.L10N.register(
"Default phone region" : "Типовий телефонний код регіону",
"Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add \"default_phone_region\" with the respective ISO 3166-1 code of the region to your config file." : "У вашому примірнику не налаштовано типовий телефонний регіон. Цей параметр потрібний для підтвердження телефонних номерів у профілі користувача без зазначення коду країни. Щоби дозволити використання телефонних номерів без зазначення коду країни, додайте параметр \"default_phone_region\" із кодом регіону згідно з ISO 3166-1 у вашому файлі конфігурації config.php.",
"Email test" : "Тест ел.пошти",
+ "Mail delivery is disabled by instance config \"%s\"." : "Доставку пошти вимкнено за допомогою конфігурації екземпляра \"%s\".",
"Email test was successfully sent" : "Ел.лист було успішно надіслано",
"You have not set or verified your email server configuration, yet. Please head over to the \"Basic settings\" in order to set them. Afterwards, use the \"Send email\" button below the form to verify your settings." : "Ви ще не налаштувати або не перевірили налаштування поштового сервера. Перейдіть до \"Основних налаштувань. Після цього перевірте коректність поштових налаштувань, для цього клацніть на кнопку \"Надіслати ел.пошту\" під формою.",
"Transactional File Locking" : "Блокування транзакційних файлів",
+ "Transactional File Locking is disabled. This is not a a supported configuraton. It may lead to difficult to isolate problems including file corruption. Please remove the `'filelocking.enabled' => false` configuration entry from your `config.php` to avoid these problems." : "Блокування транзакційних файлів вимкнено. Це не підтримувана конфігурація. Це може призвести до проблем, які важко ізолювати, зокрема до пошкодження файлів. Будь ласка, видаліть запис конфігурації `'filelocking.enabled' => false` з вашого `config.php`, щоб уникнути цих проблем.",
"The database is used for transactional file locking. To enhance performance, please configure memcache, if available." : "База даних використовується для транзакційного блокування файлів. Для кращої продуктивности рекомендується налаштувати memcache, якщо доступний.",
"Forwarded for headers" : "Перенаправлено для заголовків",
"Your \"trusted_proxies\" setting is not correctly set, it should be an array." : "Ваш параметр \"trusted_proxies\" встановлено неправильно, це має бути масив.",
+ "Your \"trusted_proxies\" setting is not correctly set, it should be an array of IP addresses - optionally with range in CIDR notation." : "Ваш параметр \"trusted_proxies\" задано неправильно, це має бути масив IP-адрес - бажано з діапазоном у нотації CIDR.",
"The reverse proxy header configuration is incorrect. This is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud." : "Конфігурація заголовка зворотного проксі неправильна. Це є проблемою безпеки і може дозволити зловмиснику надати Nextcloud оманливу IP-адресу.",
"Your IP address was resolved as %s" : "Ваша IP-адреса була визначена як %s",
+ "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If not, this is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud." : "Конфігурація зворотного заголовка проксі неправильна, або ви отримуєте доступ до Nextcloud від довіреного проксі-сервера. Якщо ні, це є проблемою безпеки і може дозволити зловмиснику підмінити свою IP-адресу видимою для Nextcloud.",
+ "HTTPS access and URLs" : "Доступ HTTPS та URL-адреси",
+ "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead. Without it some important web functionality like \"copy to clipboard\" or \"service workers\" will not work!" : "Небезпечний доступ до сайту через HTTP. Ми наполегливо рекомендуємо налаштувати ваш сервер на використання HTTPS. Без цього деякі важливі веб-функції, такі як \"копіювати в буфер обміну\" або \"сервісні працівники\", не працюватимуть!",
"Accessing site insecurely via HTTP." : "Небезпечний доступ до сайту через HTTP.",
+ "You are accessing your instance over a secure connection, however your instance is generating insecure URLs. This likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Ви отримуєте доступ до свого екземпляра через безпечне з'єднання, проте ваш екземпляр генерує небезпечні URL-адреси. Це, ймовірно, означає, що ваш екземпляр знаходиться за зворотним проксі і значення конфігурації Nextcloud `overwrite*` налаштовані неправильно.",
+ "Your instance is generating insecure URLs. If you access your instance over HTTPS, this likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Ваш екземпляр генерує небезпечні URL-адреси. Якщо ви отримуєте доступ до вашого екземпляра через HTTPS, це, ймовірно, означає, що ваш екземпляр знаходиться за зворотним проксі і значення конфігурації Nextcloud `overwrite*` налаштовані неправильно.",
+ "You are accessing your instance over a secure connection, and your instance is generating secure URLs." : "Ви отримуєте доступ до свого екземпляра через захищене з'єднання, і ваш екземпляр генерує безпечні URL-адреси.",
"Internet connectivity" : "З'єднання з мережею Інтернет",
"Internet connectivity is disabled in configuration file." : "З'єднання з мережею Інтернет вимкнено у файлі конфігурації",
"This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "На цьому сервері не працює з’єднання з Інтернетом: неможливо отримати доступ до кількох кінцевих точок. Це означає, що деякі функції, як-от підключення зовнішньої пам’яті, сповіщення про оновлення або встановлення застосунків сторонніх розробників, не працюватимуть. Віддалений доступ до файлів і надсилання сповіщень електронною поштою також можуть не працювати. Встановіть з’єднання цього сервера з Інтернетом, щоб користуватися всіма функціями.",
"JavaScript modules support" : "Підтримка модулів JavaScript",
+ "Unable to run check for JavaScript support. Please remedy or confirm manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не вдалося запустити перевірку підтримки JavaScript. Будь ласка, виправте помилку або підтвердіть вручну, якщо ваш веб-сервер обслуговує файли `.mjs` з використанням MIME-типу JavaScript.",
"Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "Ваш вебсервер не обслуговує файли `.mjs` за допомогою типу MIME JavaScript. Це призведе до того, що окремі застосунки не працюватимуть коректно, оскільки бравзери не зможуть виконувати файли JavaScript. Вам потрібно визначити обслуговування файлів `.mjs` з типом MIME `text/javascript` або `application/javascript` у налаштуваннях вашого вебсервера.",
+ "JavaScript source map support" : "Підтримка карти джерел JavaScript",
+ "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "Ваш веб-сервер не налаштований на обслуговування файлів `.js.map`. Без цих файлів JavaScript Source Maps не працюватиме належним чином, що ускладнює пошук і усунення несправностей та налагодження будь-яких проблем, які можуть виникнути.",
"Old server-side-encryption" : "Застаріле шифрування на рівні сервера",
"Disabled" : "Вимкнено",
"The old server-side-encryption format is enabled. We recommend disabling this." : "Старий формат шифрування на стороні сервера ввімкнено. Рекомендуємо вимкнути це.",
"Logging level" : "Рівень журналювання",
+ "The %1$s configuration option must be a valid integer value." : "Параметр конфігурації %1$s має бути дійсним цілим числом.",
+ "The logging level is set to debug level. Use debug level only when you have a problem to diagnose, and then reset your log level to a less-verbose level as it outputs a lot of information, and can affect your server performance." : "Рівень журналу встановлено на рівень налагодження. Використовуйте рівень налагодження лише тоді, коли вам потрібно діагностувати проблему, а потім скиньте рівень журналу до менш розлогого рівня, оскільки він виводить багато інформації, що може вплинути на продуктивність вашого сервера.",
"Logging level configured correctly." : "Рівень журналювання правильно налаштовано.",
"Maintenance window start" : "Час початку обслуговування",
"Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "Сервер не має налаштованого часу початку завдань з обслуговування. Це означає, що ресурсомісткі щоденні фонові роботи також будуть виконуватися протягом основного часу використання. Рекомендуємо встановити його у час найнижчого користування хмарою, щоб користувачі менше відчували зменшення продуктивності, яке може спостерігатися у зв'язку із завданнями з обслуговування.",
"Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "Часовий проміжок для виконання ресурсомістких завдань встановлено від {start}:00 UTC до {end}:00 UTC",
"Memcache" : "Memcache",
+ "Memcached is configured as distributed cache, but the wrong PHP module (\"memcache\") is installed. Please install the PHP module \"memcached\"." : "Memcached налаштовано як розподілений кеш, але встановлено неправильний модуль PHP (\"memcache\"). Будь ласка, встановіть модуль PHP \"memcached\".",
+ "Memcached is configured as distributed cache, but the PHP module \"memcached\" is not installed. Please install the PHP module \"memcached\"." : "Memcached налаштовано як розподілений кеш, але PHP-модуль \"memcached\" не встановлено. Будь ласка, встановіть PHP-модуль \"memcached\".",
"No memory cache has been configured. To enhance performance, please configure a memcache, if available." : "Відсутні налаштування кешування пам'яти. Для кращої продуктивности рекомендуємо налаштувати memcache, якщо доступний.",
+ "Failed to write and read a value from local cache." : "Не вдалося записати або прочитати значення з локального кешу.",
+ "Failed to write and read a value from distributed cache." : "Не вдалося записати або прочитати значення з розподіленого кешу.",
"Configured" : "Налаштовано",
+ "Mimetype migrations available" : "Доступні міграції міметипів",
+ "One or more mimetype migrations are available. Occasionally new mimetypes are added to better handle certain file types. Migrating the mimetypes take a long time on larger instances so this is not done automatically during upgrades. Use the command `occ maintenance:repair --include-expensive` to perform the migrations." : "Доступні один або декілька міграцій міметипів. Іноді додаються нові міметипи для кращої обробки певних типів файлів. Перенесення міметипів займає багато часу на великих екземплярах, тому воно не виконується автоматично під час оновлення. Для виконання міграції скористайтеся командою `occ maintenance:repair --include-expensive`.",
"MySQL row format" : "Формат рядка MySQL",
"You are not using MySQL" : "Ви не використовуєте MySQL",
+ "None of your tables use ROW_FORMAT=Compressed" : "Жодна з ваших таблиць не використовує ROW_FORMAT=Compressed",
+ "Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud. Please update row format on the following list: %s." : "У вашій базі даних знайдено неправильний формат рядків. ROW_FORMAT=Dynamic забезпечує найкращу продуктивність бази даних для Nextcloud. Будь ласка, оновіть формат рядків у наступному списку: %s.",
"MySQL Unicode support" : "Підтримка юнікоду в MySQL",
"MySQL is used as database and does support 4-byte characters" : "MySQL використовується яко база даних, увімкнено підтримку 4-бітних символів",
"MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL." : "MySQL використовується яко база даних, проте 4-бітні символи не підтримуються. Для коректного відображення 4-бітних символів (напр., відображення емоційок) рекомендується встановити 4-бітну підтримку в налаштуваннях MySQL.",
+ "OCS provider resolving" : "Дозвіл постачальника OCS",
+ "Could not check if your web server properly resolves the OCM and OCS provider URLs." : "Не вдалося перевірити, чи правильно ваш веб-сервер розпізнає URL-адреси постачальників OCM та OCS.",
+ "Your web server is not properly set up to resolve %1$s.\nThis is most likely related to a web server configuration that was not updated to deliver this folder directly.\nPlease compare your configuration against the shipped rewrite rules in \".htaccess\" for Apache or the provided one in the documentation for Nginx.\nOn Nginx those are typically the lines starting with \"location ~\" that need an update." : "Ваш веб-сервер не налаштовано належним чином для обробки %1$s.\nСкоріш за все, це пов'язано з конфігурацією веб-сервера, яку не було оновлено для безпосередньої доставки цієї теки.\nБудь ласка, порівняйте вашу конфігурацію з правилами перезапису в \".htaccess\" для Apache або з наведеними в документації для Nginx.\nУ Nginx зазвичай оновлення потребують рядки, що починаються з \"location ~\".",
"Overwrite CLI URL" : "Перезаписати CLI URL",
"The \"overwrite.cli.url\" option in your config.php is correctly set to \"%s\"." : "Параметр \"overwrite.cli.url\" у вашому конфігураційному файлі config.php налаштовано правильно зі значенням \"%s\".",
"The \"overwrite.cli.url\" option in your config.php is set to \"%s\" which is a correct URL. Suggested URL is \"%s\"." : "Параметр \"overwrite.cli.url\" у вашому конфігураційному файлі config.php налаштовано зі значенням \"%s\", яке є правильним URL. Рекомендований URL: \"%s\".",
"Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Обов’язково встановіть параметр \"overwrite.cli.url\" у конфігураційному файлі config.php зі значенням URL-адреси, яку ваші користувачі переважно використовують для доступу до цього Nextcloud. Пропонується таке значення: \"%s\". В іншому випадку можуть виникнути проблеми з генерацією URL-адреси через cron. (Однак можливо, що запропонована URL-адреса не є URL-адресою, яку ваші користувачі переважно використовують для доступу до хмари Nextcloud. Будь ласка, перевірте, чи це так.)",
+ "PHP APCu configuration" : "Конфігурація PHP APCu",
+ "Your APCu cache has been running full, consider increasing the apc.shm_size php setting." : "Ваш кеш APCu переповнений, спробуйте збільшити значення параметра apc.shm_size php.",
+ "Your APCu cache is almost full at %s%%, consider increasing the apc.shm_size php setting." : "Ваш кеш APCu майже заповнений за адресою %s%%, розгляньте можливість збільшення параметра apc.shm_size php.",
"PHP default charset" : "Типове кодування сторінки PHP",
"PHP configuration option \"default_charset\" should be UTF-8" : "Параметр конфігурації PHP \"default_charset\" має мати значення UTF-8",
+ "PHP set_time_limit" : "PHP set_time_limit",
"The function is available." : "Функція доступна.",
"The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "Функція PHP \"set_time_limit\" недоступна. Це може призвести до зупинки сценаріїв під час виконання, що порушить установку. Настійно рекомендується вмикати цю функцію.",
"Freetype" : "Freetype",
@@ -213,13 +248,21 @@ OC.L10N.register(
"Your PHP does not have FreeType support, resulting in breakage of profile pictures and the settings interface." : "Ваш PHP не підтримує FreeType, що призводить до поломки зображень профілю та інтерфейсу налаштувань.",
"PHP getenv" : "PHP getenv",
"PHP does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP не налаштований правильно для отримання змінних системного оточення. Запит getenv(\"PATH\") повертає пусті результати.",
+ "PHP file size upload limit" : "Обмеження на розмір завантажуваного PHP-файлу",
+ "The PHP upload_max_filesize is too low. A size of at least %1$s is recommended. Current value: %2$s." : "PHP upload_max_filesize занадто малий. Рекомендується розмір не менше %1$s. Поточне значення: %2$s.",
+ "The PHP post_max_size is too low. A size of at least %1$s is recommended. Current value: %2$s." : "PHP post_max_size занадто малий. Рекомендується розмір не менше %1$s. Поточне значення: %2$s.",
+ "The PHP max_input_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "PHP max_input_time занадто малий. Рекомендується час не менше %1$s. Поточне значення: %2$s.",
+ "The PHP max_execution_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "Занадто малий час виконання PHP max_execution_time. Рекомендується час не менше %1$s. Поточне значення: %2$s.",
"PHP memory limit" : "Обмеження пам'яті PHP",
+ "The PHP memory limit is below the recommended value of %s. Some features or apps - including the Updater - may not function properly." : "Обмеження пам'яті PHP нижче рекомендованого значення %s. Деякі функції або програми, включаючи Updater, можуть не працювати належним чином.",
"PHP modules" : "Модулі PHP",
"increases language translation performance and fixes sorting of non-ASCII characters" : "Покращує продуктивність перекладу мови та виправляє впорядкування не-ASCII знаків",
"for Argon2 for password hashing" : "для Argon2 для хешування паролів",
+ "required for SFTP storage and recommended for WebAuthn performance" : "необхідний для SFTP-сховища та рекомендований для роботи WebAuthn",
"for picture rotation in server and metadata extraction in the Photos app" : "для обертання зображення на сервері та видобування метаданих у застосунку \"Світлини\"",
"This instance is missing some required PHP modules. It is required to install them: %s." : "На цьому примірнику бракує окремі обов'язкові модулі PHP, зокрема, необхідно встановити такі: %s.",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them:\n%s" : "На цьому примірнику бракує окремих рекомендованих модулів PHP. Для кращої продуктивности та сумісности наполегливо рекомендуємо встановити такі модулі:\n%s",
+ "PHP opcache" : "PHP opcache",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Модуль PHP OPcache не завантажується. Для кращої продуктивності рекомендується завантажити його у вашу установку PHP.",
"OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache вимкнено. Для кращої продуктивності рекомендовано встановити значення \"opcache.enable=1\" у конфігураційному файлі PHP.",
"The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "OPcache для розділеної пам'яти вимкнено. Для кращої продуктивності рекомендовано встановити значення \"opcache.file_cache_only=0\" у конфігураційному файлі PHP, використовувати кеш файлів лише як кеш другого рівня.",
@@ -229,9 +272,11 @@ OC.L10N.register(
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Внутрішній буфер рядків OPcache майже переповнено. Рекомендується встановити значення \"opcache.interned_strings_buffer\" у вашому конфігураційному файлі PHP вище за \"%s\", щоб забезпечити ефективне кешування повторюваних рядків.",
"OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache налаштовано для вилучення коментарів коду. Для увімкнененого OPcache потрібно встановити значення \"opcache.save_comments=1\" для правильної роботи Nextcloud.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Серверу Nextcloud не дозволено використовувати OPcache API. Для увімкненого OPcache наполегливо рекомендується додати всі каталоги Nextcloud з \"opcache.restrict_api\" або взагалі не встановлювати таке налаштування й таким чином вимкнути обмеження OPcache API, щоби уникнути помилок під час оновлення основної частини Nextcloud або застосунків.",
+ "Checking from CLI, OPcache checks have been skipped." : "Перевірка з CLI, перевірка OPcache була пропущена.",
"The PHP OPcache module is not properly configured. %s." : "Модуль PHP OPcache не налаштовано належним чином. %s.",
"Correctly configured" : "Правильне налаштування",
"PHP version" : "Версія PHP",
+ "You are currently running PHP %1$s. PHP %2$s is deprecated since Nextcloud %3$s. Nextcloud %4$s may require at least PHP %5$s. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Наразі ви використовуєте PHP %1$s. PHP %2$s застаріла, починаючи з Nextcloud %3$s. Для роботи Nextcloud %4$s може знадобитися щонайменше PHP %5$s. Будь ласка, якнайшвидше оновіть систему до однієї з офіційно підтримуваних версій PHP, наданих PHP Group.",
"You are currently running PHP %s." : "У вас встановлено PHP %s.",
"PHP \"output_buffering\" option" : "Параметр PHP \"\"output_buffering\"",
"PHP configuration option \"output_buffering\" must be disabled" : "Параметр PHP \"\"output_buffering\" потрібно вимкнути",
@@ -245,15 +290,37 @@ OC.L10N.register(
"Configuration file access rights" : "Дозволи доступу до конфігураційного файлу",
"The read-only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Увімкнена конфігурація тільки для читання. Це запобігає встановленню деяких опцій через вебінтерфейс. Крім того, для кожного оновлення файл повинен бути зроблений з доступом на запис.",
"Nextcloud configuration file is writable" : "Файл конфігурації Nextcloud доступний для запису",
+ "Scheduling objects table size" : "Розмір таблиці об'єктів планування",
+ "You have more than %s rows in the scheduling objects table. Please run the expensive repair jobs via occ maintenance:repair --include-expensive." : "У таблиці об'єктів планування є більше %s рядків. Будь ласка, запустіть дорогі ремонтні роботи за допомогою occ maintenance:repair --include-expensive.",
+ "Scheduling objects table size is within acceptable range." : "Розмір таблиці об'єктів планування знаходиться в допустимих межах.",
"HTTP headers" : "Заголовки HTTP",
+ "- The `%1$s` HTTP header is not set to `%2$s`. Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "- HTTP-заголовок `%1$s` не має значення `%2$s`. Деякі функції можуть працювати некоректно, тому рекомендується змінити цей параметр відповідним чином.",
+ "- The `%1$s` HTTP header is not set to `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "- HTTP-заголовок `%1$s` не має значення `%2$s`. Це є потенційним ризиком для безпеки або конфіденційності, тому рекомендується змінити цей параметр відповідним чином.",
+ "- The `%1$s` HTTP header is not set to `%2$s`, `%3$s`, `%4$s`, `%5$s` or `%6$s`. This can leak referer information. See the {w3c-recommendation}." : "- HTTP-заголовок `%1$s` не має значення `%2$s`, `%3$s`, `%4$s`, `%5$s` або `%6$s`. Це може призвести до витоку інформації про реферала. Зверніться до {w3c-recommendation}.",
+ "- The `Strict-Transport-Security` HTTP header is not set to at least `%d` seconds (current value: `%d`). For enhanced security, it is recommended to use a long HSTS policy." : "- HTTP-заголовок `Strict-Transport-Security` не встановлено принаймні `%d` секунд (поточне значення: `%d`). Для підвищення безпеки рекомендується використовувати довгу політику HSTS.",
+ "- The `Strict-Transport-Security` HTTP header is malformed: `%s`. For enhanced security, it is recommended to enable HSTS." : "- Неправильно сформовано HTTP-заголовок `Strict-Transport-Security`: `%s`. Для підвищення безпеки рекомендується увімкнути HSTS.",
+ "- The `Strict-Transport-Security` HTTP header is not set (should be at least `%d` seconds). For enhanced security, it is recommended to enable HSTS." : "- HTTP-заголовок `Strict-Transport-Security` не встановлено (має бути щонайменше `%d` секунд). Для підвищення безпеки рекомендується ввімкнути HSTS.",
+ "Some headers are not set correctly on your instance" : "У вашому екземплярі деякі заголовки задано неправильно",
+ "Could not check that your web server serves security headers correctly. Please check manually." : "Не вдалося перевірити, чи правильно ваш веб-сервер обслуговує заголовки безпеки. Будь ласка, перевірте вручну.",
+ "Could not check that your web server serves security headers correctly, unable to query `%s`" : "Не вдалося перевірити, чи правильно ваш веб-сервер обслуговує заголовки безпеки, не вдалося виконати запит `%s`.",
+ "Your server is correctly configured to send security headers." : "Ваш сервер правильно налаштовано для надсилання заголовків безпеки.",
"Database version" : "Версія бази даних",
+ "MariaDB version 10.3 detected, this version is end-of-life and only supported as part of Ubuntu 20.04. MariaDB >=%1$s and <=%2$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено MariaDB версії 10.3, ця версія застаріла і підтримується лише у складі Ubuntu 20.04. Рекомендується використовувати MariaDB >=%1$s та <=%2$s для кращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
+ "MariaDB version \"%1$s\" detected. MariaDB >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію MariaDB \"%1$s\". Для кращої продуктивності, стабільності та функціональності цієї версії Nextcloud рекомендується використовувати MariaDB >=%2$s та <=%3$s.",
+ "MySQL version \"%1$s\" detected. MySQL >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію MySQL \"%1$s\". Рекомендується використовувати MySQL >=%2$s та <=%3$s для кращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
+ "PostgreSQL version \"%1$s\" detected. PostgreSQL >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію PostgreSQL \"%1$s\". Рекомендується використовувати PostgreSQL >=%2$s та <=%3$s для кращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
"SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend. This is particularly recommended when using the desktop client for file synchronisation. To migrate to another database use the command line tool: \"occ db:convert-type\"." : "Наразі SQLite використовується як база даних. Для більш продуктивних примірників рекомендується переключитися на іншу базу даних. Зокрема це рекомендується у разі використання клієнтів синхронізації файлів для робочих станцій. Щоб мігрувати до іншої бази даних, використовуйте інструмент командного рядка: \"occ db:convert-type\".",
"Unknown database platform" : "Невідома платформа бази даних",
"Architecture" : "Архітектура",
"64-bit" : "64 біти",
"It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Схоже, що у вас встановлено 32-бітну версію PHP. Правильна робота Nextcloud вимагає 64-бітної версії. Оновіть вашу операційну систему та рушій PHP до 64-бітної версії!",
+ "Task Processing pickup speed" : "Швидкість обробки завдань",
+ "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["Запланованих завдань за останні %n годин не було.","Немає запланованих завдань за останні %n годин.","Немає запланованих завдань за останні %n годин.","Немає запланованих завдань за останні %n годин."],
+ "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["Швидкість підхоплення завдань була нормальною протягом останньої %n годин.","Швидкість збирання завдань була нормальною протягом останніх %n годин.","Швидкість збирання завдань була нормальною протягом останніх %n годин.","Швидкість збирання завдань була нормальною протягом останніх %n годин."],
+ "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["Швидкість збирання завдань була низькою протягом останньої %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі.","Швидкість збирання завдань була низькою протягом останніх %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі.","Швидкість збирання завдань була низькою протягом останніх %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі.","Швидкість збирання завдань була низькою протягом останніх %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі."],
"Temporary space available" : "Тимчасовий простір доступний",
"Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Помилка під час перевірки шляху до тимчасового каталогу PHP, його не було правильно налаштовано яко каталог. Отримано значення: %s",
+ "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "Функція PHP \"disk_free_space\" відключена, що перешкоджає перевірці наявності вільного місця в тимчасових каталогах.",
"Error while checking the available disk space of temporary PHP path or no free disk space returned. Temporary path: %s" : "Помилка під час перевірки доступного дискового простору тимчасового каталогу PHP або отримано підтвердження про відсутність вільного дискового простору. Шлях до тимчасового каталогу: %s",
"- %.1f GiB available in %s (PHP temporary directory)" : "- %.1f ГБ доступно у %s (тимчасовий каталог PHP)",
"- %.1f GiB available in %s (Nextcloud temporary directory)" : "- %.1f ГБ доступно у %s (тимчасовий каталог Nextcloud)",
@@ -263,11 +330,20 @@ OC.L10N.register(
"Database transaction isolation level" : "Рівень ізолювання транзакцій бази даних",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Ваша база даних не працює з рівнем ізоляції транзакцій \"READ COMMITTED\". Це може спричинити проблеми, коли кілька дій виконуються паралельно.",
"Was not able to get transaction isolation level: %s" : "Не вдалося отримати рівень ізолюування тразакцій: %s",
+ ".well-known URLs" : ".відомі URL-адреси",
+ "`check_for_working_wellknown_setup` is set to false in your configuration, so this check was skipped." : "У вашій конфігурації `check_for_working_wellknown_setup` встановлено у false, тому цю перевірку було пропущено.",
+ "Could not check that your web server serves `.well-known` correctly. Please check manually." : "Не вдалося перевірити, чи правильно ваш веб-сервер обслуговує `.well-known`. Будь ласка, перевірте вручну.",
+ "Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ваш веб-сервер не налаштовано належним чином для вирішення `.well-known` URL-адрес, failed on:\n`%s`",
+ "Your server is correctly configured to serve `.well-known` URLs." : "Ваш сервер правильно налаштовано для обслуговування `.well-known` URL-адрес.",
"Font file loading" : "Завантаження файлу шрифтів",
+ "Could not check for {extension} loading support. Please check manually if your webserver serves `.{extension}` files." : "Не вдалося перевірити підтримку завантаження {розширення}. Будь ласка, перевірте вручну, чи обслуговує ваш веб-сервер файли `.{розширення}`.",
+ "Your web server is not properly set up to deliver .{extension} files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustment to also deliver .{extension} files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Ваш веб-сервер не налаштовано належним чином для доставки файлів з розширенням .{розширення}. Зазвичай це пов'язано з конфігурацією Nginx. Для Nextcloud 15 його потрібно налаштувати так, щоб він також доставляв файли з розширенням .{extension}. Порівняйте вашу конфігурацію Nginx з рекомендованою конфігурацією в нашій документації.",
"Profile information" : "Інформація профілю",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Зображення профілю, повне ім’я, електронна адреса, номер телефону, адреса, веб-сайт, Twitter, організація, роль, заголовок, біографія та чи активовано ваш профіль",
"Nextcloud settings" : "Налаштування Nextcloud",
"Unified task processing" : "Централізована обробка завдань ",
+ "AI tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Завдання штучного інтелекту можуть виконуватися різними програмами. Тут ви можете вказати, яку програму слід використовувати для виконання того чи іншого завдання.",
+ "Allow AI usage for guest users" : "Дозволити використання ШІ для гостьових користувачів",
"Task:" : "Завдання:",
"Enable" : "Увімкнути",
"None of your currently installed apps provide Task processing functionality" : "Жодний зі встановлених застосунків не надає функціональність з обробки завдань",
@@ -290,13 +366,19 @@ OC.L10N.register(
"Allow sharing with groups" : "Дозволити спільне використання групами",
"Restrict users to only share with users in their groups" : "Дозволити надання у спільний доступ тільки в межах власних груп",
"Ignore the following groups when checking group membership" : "Ігнорувати такі групи під час перевірки участи в групі",
+ "Allow users to preview files even if download is disabled" : "Дозвольте користувачам переглядати файли, навіть якщо завантаження вимкнено",
+ "Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Користувачі все одно зможуть робити скріншоти або записувати екран. Це не забезпечує жодного остаточного захисту.",
"Allow users to share via link and emails" : "Дозволити користувачам надання у спільний доступ за допомогою посилань та ел. листів",
"Allow public uploads" : "Дозволити публічне завантаження",
+ "Allow public shares to be added to other clouds by federation." : "Дозвольте додавати публічні ресурси до інших хмар за допомогою федерації.",
+ "This will add share permissions to all newly created link shares." : "Це додасть дозволи на спільний доступ до всіх новостворених спільних ресурсів посилань.",
"Always ask for a password" : "Завжди запитувати пароль",
"Enforce password protection" : "Захист паролем обов'язковий",
"Exclude groups from password requirements" : "Виключення щодо вимог пароля для груп",
"Exclude groups from creating link shares" : "Не дозволяти користувачам таких груп створювати посилання спільного доступу",
"Allow users to set custom share link tokens" : "Дозволити користвучам встановити власні токени спільних посилань",
+ "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Частки з власними токенами залишатимуться доступними після вимкнення цього параметра",
+ "Shares with guessable tokens may be accessed easily" : "До акцій з вгадуваними токенами можна легко отримати доступ",
"Limit sharing based on groups" : "Обмежити надання у спільний доступ на основі груп",
"Allow sharing for everyone (default)" : "Дозволити надання у спільний доступ для всіх (типово)",
"Exclude some groups from sharing" : "Не дозволяти таким групам надавати у спільний доступ",
@@ -361,7 +443,9 @@ OC.L10N.register(
"Group name" : "Назва групи",
"Please enter a valid group name" : "Введіть дійсну назву групи",
"Search groups…" : "Шукати групи...",
+ "List of groups. This list is not fully populated for performance reasons. The groups will be loaded as you navigate or search through the list." : "Список груп. Цей список не повністю заповнений з міркувань продуктивності. Групи будуть завантажуватися під час навігації або пошуку по списку.",
"Loading groups…" : "Завантаження груп...",
+ "Could not load app discover section" : "Не вдалося завантажити розділ пошуку додатків",
"Could not render element" : "Не вдалося показати елемент",
"Nothing to show" : "Відсутня інформація для показу",
"Could not load section content from app store." : "Не вдалося отримати розділ вмісту із крамнички.",
@@ -373,15 +457,36 @@ OC.L10N.register(
"Choose slide to display" : "Виберіть слайд для показу",
"{index} of {total}" : "{index} із {total}",
"Daemon" : "Демон",
+ "Deploy Daemon" : "Розгортання демона",
"Type" : "Тип",
"Display Name" : "Назва для показу",
"GPUs support" : "Підтримка GPU",
"Compute device" : "Пристрій для обчислення",
+ "Advanced deploy options" : "Розширені параметри розгортання",
+ "Edit ExApp deploy options before installation" : "Редагування параметрів розгортання ExApp перед інсталяцією",
+ "Configured ExApp deploy options. Can be set only during installation" : "Налаштовані параметри розгортання ExApp. Можна налаштувати лише під час інсталяції",
"Learn more" : "Дізнатися більше",
+ "Environment variables" : "Змінні середовища",
+ "ExApp container environment variables" : "Змінні оточення контейнера ExApp",
+ "No environment variables defined" : "Змінні оточення не визначено",
+ "Mounts" : "Кріплення",
+ "Define host folder mounts to bind to the ExApp container" : "Визначте монтування папки хоста для прив'язки до контейнера ExApp",
+ "Must exist on the Deploy daemon host prior to installing the ExApp" : "Повинен існувати на хості демона розгортання до встановлення ExApp",
+ "Host path" : "Шлях до хосту",
+ "Container path" : "Шлях до контейнера",
"Read-only" : "Тільки для читання",
+ "Remove mount" : "Зніміть кріплення",
+ "New mount" : "Нове кріплення",
+ "Enter path to host folder" : "Введіть шлях до папки хоста",
+ "Enter path to container folder" : "Введіть шлях до папки контейнера",
"Toggle read-only mode" : "Перемкнути режим тільки для читання",
+ "Confirm adding new mount" : "Підтвердіть додавання нового кріплення",
"Confirm" : "Підтвердити",
+ "Cancel adding mount" : "Скасувати додавання кріплення",
"Cancel" : "Скасувати",
+ "Add mount" : "Додати кріплення",
+ "ExApp container mounts" : "Кріплення для контейнерів ExApp",
+ "No mounts defined" : "Не визначено жодного кріплення",
"Description" : "Опис",
"View in store" : "Переглянути у крамниці застосунків",
"Visit website" : "Перейти на вебсайт",
@@ -393,6 +498,9 @@ OC.L10N.register(
"Limit app usage to groups" : "Обмежити використання застосунку певними групами",
"No results" : "Нічого не знайдено",
"Update to {version}" : "Оновити до {version}",
+ "Deploy options" : "Варіанти розгортання",
+ "Default Deploy daemon is not accessible" : "За замовчуванням демон розгортання недоступний",
+ "Delete data on remove" : "Видалення даних при видаленні",
"This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Цей застосунок не має обмежень щодо мінімальної версії Nextcloud. В майбутньому це може викликати певні помилки.",
"This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Для цього застосунку не визначено найвищу версію Nextcloud. Це може викликати помилку в майбутньому.",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Цей застосунок не буде встановлено, оскільки такі залежності неможливо виконати:",
@@ -415,6 +523,8 @@ OC.L10N.register(
"{productName} Talk for Android" : "{productName} Talk для Android",
"Sync client" : "Синхронізувати клієнт",
"This session" : "Цей сеанс",
+ "{client} - {version} ({system})" : "{клієнт} - {версія} ({система})",
+ "{client} - {version}" : "{клієнт} - {версія}",
"Device name" : "Назва пристрою",
"Cancel renaming" : "Відхилити перейменування",
"Save new name" : "Зберегти нове ім'я",
@@ -452,34 +562,45 @@ OC.L10N.register(
"Last job ran {relativeTime}." : "Останнє завдання виконано {relativeTime}.",
"Background job did not run yet!" : "Фонове завдання ще не виконано!",
"AJAX" : "AJAX",
+ "Execute one task with each page loaded. Use case: Single account instance." : "Виконувати по одному завданню при кожному завантаженні сторінки. Варіант використання: Один екземпляр облікового запису.",
"Webcron" : "Webcron",
+ "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 accounts depending on the usage)." : "cron.php зареєстровано на сервісі webcron, щоб викликати cron.php кожні 5 хвилин по HTTP. Варіант використання: Дуже маленький екземпляр (1-5 акаунтів залежно від використання).",
"Cron (Recommended)" : "Cron (рекомендовано)",
"Unable to update profile default setting" : "Не вдалося оновити стандартні налаштування профілю",
"Profile" : "Профіль",
"Enable or disable profile by default for new accounts." : "Увімкнути або вимкнути стандартний профіль для нових акаунтів.",
"Password confirmation is required" : "Необхідне підтвердження паролем",
"Failed to save setting" : "Не вдалося зберегти налаштування",
+ "{app}'s declarative setting field: {name}" : "Декларативне поле налаштувань {app}: {name}",
"Unable to update server side encryption config" : "Не вдалося оновити конфігурацію шифрування на стороні сервера",
"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." : "Шифрування на стороні сервера дозволяє шифрувати файли, завантажені на цей сервер. Це має свою ціну, таку як зниження продуктивності, тому ввімкніть його лише за потреби.",
+ "To encrypt all existing files run this OCC command:" : "Щоб зашифрувати всі наявні файли, запустіть цю команду OCC:",
"Enable server-side encryption" : "Увімкнути шифрування на сервері",
+ "Disabling server side encryption is only possible using OCC, please refer to the documentation." : "Вимкнення шифрування на стороні сервера можливе лише за допомогою OCC, будь ласка, зверніться до документації.",
"No encryption module loaded, please enable an encryption module in the app menu." : "Модуль шифрування не завантажено, увімкніть модуль шифрування в меню застосунку.",
"Select default encryption module:" : "Обрати стандартний модуль шифрування:",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Вам потрібно перенести ключі шифрування зі старого шифрування (ownCloud <= 8.0) на нове. Увімкніть \"Стандартний модуль шифрування\" та виконайте {command}",
"Cancel encryption" : "Скасувати шифрування",
"Enable encryption" : "Увімкнути шифрування",
+ "Confirm enabling encryption" : "Підтвердіть увімкнення шифрування",
"Please read carefully before activating 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." : "Після активації шифрування, всі файли завантажені на сервер з цього моменту, будуть зашифровані на сервері. Відключити шифрування пізніше можна буде тільки якщо активний модуль шифрування підтримує цю функцію, і при виконанні певних умов (наприклад, налаштований ключ відновлення).",
+ "By default a master key for the whole instance will be generated. Please check if that level of access is compliant with your needs." : "За замовчуванням буде згенеровано майстер-ключ для всього екземпляра. Будь ласка, перевірте, чи відповідає цей рівень доступу вашим потребам.",
"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." : "Саме по собі шифрування не гарантує безпеку системи. Будь ласка, перегляньте документацію, щоб отримати додаткову інформацію про те, як працює застосунок для шифрування, та про приклади його використання.",
"Be aware that encryption always increases the file size." : "Майте на увазі, що шифрування завжди збільшує розмір файлів.",
"It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Завжди корисно регулярно створювати резервні копії ваших даних, у разі шифрування обов’язково зробіть резервну копію ключів шифрування разом із вашими даними.",
+ "Refer to the admin documentation on how to manually also encrypt existing files." : "Зверніться до документації адміністратора, щоб дізнатися, як вручну зашифрувати наявні файли.",
"This is the final warning: Do you really want to enable encryption?" : "Це останнє попередження: Ви справді хочете ввімкнути шифрування?",
+ "Failed to delete group \"{group}\"" : "Не вдалося вилучити групу \"{group}\"",
"Please confirm the group removal" : "Підтвердіть вилучення групи",
+ "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "Ви збираєтеся видалити групу \"{group}\". Облікові записи НЕ будуть видалені.",
"Submit" : "Продовжити",
"Rename group" : "Перейменувати групу",
"Delete group" : "Вилучити групу",
"Current password" : "Поточний пароль",
"New password" : "Новий пароль",
+ "Change password" : "Змінити пароль",
"Choose your profile picture" : "Виберіть зображення профілю",
"Please select a valid png or jpg file" : "Виберіть дійсний файл png або jpg",
"Error setting profile picture" : "Помилка налаштування зображення профілю",
@@ -494,8 +615,11 @@ OC.L10N.register(
"Picture provided by original account" : "Картинка надана оригінальним обліковим записом",
"Set as profile picture" : "Установити як зображення профілю",
"Please note that it can take up to 24 hours for your profile picture to be updated everywhere." : "Зауважте, що повсюдне оновлення зображення профілю може зайняти до 24 годин.",
+ "Your biography. Markdown is supported." : "Про вас. Підтримується текстова розмітка.",
"Unable to update date of birth" : "Не вдалося оновити дату народження",
"Enter your date of birth" : "Зазначте дату вашого народження",
+ "You are using {s}{usage}{/s}" : "Ви використовуєте {s}{usage}{/s}",
+ "You are using {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})" : "Ви використовуєте {s}{usage}{/s} із {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})",
"You are a member of the following groups:" : "Ви є учасником груп:",
"Your full name" : "Ваше повне ім'я",
"Email options" : "Параметри електронної пошти",
@@ -537,6 +661,7 @@ OC.L10N.register(
"she/her" : "вона/їй",
"he/him" : "він/йому",
"they/them" : "вони/їм",
+ "Your pronouns. E.g. {pronounsExample}" : "Ваші займенники. Наприклад, {pronounsExample}",
"Your role" : "Ваша роль",
"Your X (formerly Twitter) handle" : "Ваш ідентифікатор в X (раніше відомій як Twitter)",
"Your website" : "Ваш сайт",
@@ -558,16 +683,19 @@ OC.L10N.register(
"Password change is disabled because the master key is disabled" : "Зміну пароля вимкнено, оскільки майстер-ключ відключений",
"No accounts" : "Відсутні користувачі",
"Loading accounts …" : "Завантаження облікових записів ...",
+ "List of accounts. This list is not fully rendered for performance reasons. The accounts will be rendered as you navigate through the list." : "Список акаунтів. Цей список не відображається повністю з міркувань продуктивності. Акаунти будуть відображатися в міру того, як ви будете переміщатися по списку.",
"Manager" : "Менеджер",
"Set line manager" : "Встановити безпосереднього начальника",
"Account name will be autogenerated" : "Ім'я користувача буде автоматично створено",
"Account name (required)" : "Ім'я користувача (обов'язково)",
+ "Failed to search groups" : "Не вдалося знайти групи",
"New account" : "Новий обліковий запис",
"Display name" : "Ім'я для показу",
"Either password or email is required" : "Потрібно зазначити або пароль, або адресу ел.пошти",
"Password (required)" : "Пароль (обов'язково)",
"Email (required)" : "Ел. пошта (обов'язково)",
"Email" : "E-mail",
+ "Member of the following groups (required)" : "Учасник таких груп (обов'язково)",
"Member of the following groups" : "Учасник(-ця) таких груп",
"Set account groups" : "Додати користувача до груп",
"Admin of the following groups" : "Адміністратор таких груп",
@@ -585,6 +713,7 @@ OC.L10N.register(
"Avatar" : "Світлина",
"Account name" : "Назва облікового запису",
"Group admin for" : "Адміністратор групи",
+ "Account backend" : "Внутрішня частина облікового запису",
"Storage location" : "Місце розташування сховища",
"First login" : "Перший вхід",
"Last login" : "Останній вхід",
@@ -599,11 +728,16 @@ OC.L10N.register(
"Remote wipe of devices" : "Віддалене стирання даних на пристрої",
"Wipe {userid}'s devices" : "Стерти пристрої {userid}",
"Wiped {userid}'s devices" : "Стерті пристрої {userid}",
+ "Failed to load groups with details" : "Не вдалося завантажити групи з деталями",
+ "Failed to load sub admin groups with details" : "Не вдалося завантажити групи під-адміністраторів з деталями",
+ "Failed to update line manager" : "Не вдалося оновити лінійного керівника",
"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 can't be empty" : "Пароль не може бути порожній",
"Password was successfully changed" : "Пароль успішно змінено",
+ "Email can't be empty" : "Адреса ел. пошти не може бути порожньою",
"Email was successfully changed" : "Адресу електронної пошти успішно змінено",
"Welcome mail sent!" : "Запрошення надіслано!",
"Loading account …" : "Завантаження облікового запису ...",
@@ -623,10 +757,12 @@ OC.L10N.register(
"Show language" : "Показувати мову",
"Show account backend" : "Показувати бекенд користувача",
"Show storage path" : "Показувати шлях до сховища даних",
+ "Show first login" : "Показати перший вхід",
"Show last login" : "Показувати останній вхід",
"Sorting" : "Впорядкування",
"The system config enforces sorting the groups by name. This also disables showing the member count." : "Системні наталаштування визначають впорядкування груп за іменем. Ці налаштування також вимикають лічильник учасників.",
"Group list sorting" : "Впорядкування списку груп",
+ "Sorting only applies to the currently loaded groups for performance reasons. Groups will be loaded as you navigate or search through the list." : "Сортування застосовується лише до поточно завантажених груп з міркувань продуктивності. Групи будуть завантажуватися під час навігації або пошуку в списку.",
"By member count" : "За лічильником учасників",
"By name" : "Зі ім'ям",
"Send email" : "Запрошення",
@@ -647,9 +783,11 @@ OC.L10N.register(
"Your browser does not support WebAuthn." : "Ваш браузер не підтримує WebAuthn.",
"As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Як адміністратор ви можете точно налаштувати поведінку спільного використання. Будь ласка, перегляньте документацію для отримання додаткової інформації.",
"You need to enable the File sharing App." : "Потрібно увімкнути застосунок для обміну файлами.",
+ "App Store" : "App Store",
"Loading app list" : "Завантаження переліку застосунків",
"Loading categories" : "Завантаження категорій",
"Developer documentation ↗" : "Документація розробника ↗",
+ "Version {version}, {license}-licensed" : "Версія {версія}, {ліцензія}-ліцензійний",
"Version {version}" : "Версія {version}",
"All accounts" : "Всі облікові записи",
"Admins" : "Адміністратори",
@@ -657,6 +795,7 @@ OC.L10N.register(
"Account management" : "Керування обліковими записами",
"Sending…" : "Надсилання...",
"Email sent" : "Лист надіслано",
+ "For performance reasons, when you enable encryption on a Nextcloud server only new and changed files are encrypted." : "З міркувань продуктивності, коли ви вмикаєте шифрування на сервері Nextcloud, шифруються лише нові та змінені файли.",
"Location" : "Місце розташування",
"Profile picture" : "Зображення користувача",
"About" : "Опис",
@@ -688,7 +827,11 @@ OC.L10N.register(
"Show to everyone" : "Показувати всім",
"Show to logged in accounts only" : "Показувати тільки для авторизованих",
"Hide" : "Сховати",
+ "Manually installed apps cannot be updated" : "Неможливо оновити програми, встановлені вручну",
+ "{progress}% Deploying …" : "{progress}% Розгортання ...",
+ "{progress}% Initializing …" : "{progress}% Ініціалізація ...",
"Health checking" : "Перевірка доступности",
+ "Deploy and Enable" : "Розгортання та активація",
"Download and enable" : "Звантажити та увімкнути",
"Disable" : "Вимкнути",
"Allow untested app" : "Дозволити непротестовані застосунки",
@@ -700,6 +843,7 @@ OC.L10N.register(
"Could not register device: Probably already registered" : "Не вдалося зареєструвати пристрій. Ймовірно, що його вже зареєстровано",
"Could not register device" : "Не вдалося зареєструвати пристрій",
"An error occurred during the request. Unable to proceed." : "Під час запиту сталася помилка. Неможливо продовжити.",
+ "The app has been enabled but needs to be updated." : "Додаток увімкнено, але його потрібно оновити.",
"Error: This app cannot be enabled because it makes the server unstable" : "Помилка: цю програму неможливо увімкнути, оскільки вона робить сервер нестабільним",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Застосунок активовано, але його потрібно оновити. Вас буде переспрямовано на сторінку оновлення через 5 секунд.",
"Do you really want to wipe your data from this device?" : "Ви справді хочете стерти дані з цього пристрою?",
@@ -708,6 +852,7 @@ OC.L10N.register(
"Error while wiping the device with the token" : "Помилка під час очищення пристрою за допомогою токена",
"Error while updating device token name" : "Помилка під час оновлення назви токена пристрою",
"Error while updating device token scope" : "Помилка під час оновлення області токена пристрою",
+ "Could not set group sorting" : "Не вдалося налаштувати групове сортування",
"There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Забагато запитів із вашої мережі. Повторіть спробу пізніше або зверніться до адміністратора, якщо це помилка.",
"Error" : "Помилка",
"Account documentation" : "Документація для користувача",
@@ -730,6 +875,7 @@ OC.L10N.register(
"Authentication" : "Авторизація",
"Authentication required" : "Потрібна авторизація",
"Credentials" : "Облікові дані",
+ "SMTP Login" : "Логін SMTP",
"SMTP Password" : "Пароль SMTP",
"Save" : "Зберегти",
"Test and verify email settings" : "Перевірити налаштування електронної пошти",
@@ -758,9 +904,12 @@ OC.L10N.register(
"The PHP memory limit is below the recommended value of %s." : "Обмеження пам'яті PHP нижче рекомендованого значення %s.",
"for WebAuthn passwordless login" : "для безпарольного входу за допомогою WebAuthn",
"for WebAuthn passwordless login, and SFTP storage" : "для безпарольного входу за допомогою WebAuthn та сховище SFTP",
+ "- The `%1$s` HTTP header does not contain `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "- HTTP-заголовок `%1$s` не містить `%2$s`. Це потенційний ризик для безпеки або конфіденційності, тому рекомендується змінити цей параметр відповідним чином.",
+ "PostgreSQL version \"%s\" detected. PostgreSQL >=12 and <=16 is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію PostgreSQL \"%s\". Рекомендується використовувати PostgreSQL >=12 та <=16 для найкращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
"Set default expiration date for shares" : "Встановити типовий термін дії для спільних ресурсів",
"Your biography" : "Коротко про себе",
"You are using <strong>{usage}</strong>" : "Ви використовуєте <strong>{usage}",
- "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Ви використовуєте <strong>{usage}</strong> із <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)"
+ "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Ви використовуєте <strong>{usage}</strong> із <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)",
+ "Failed to load subadmin groups with details" : "Не вдалося завантажити групи підадміністраторів з деталями"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/settings/l10n/uk.json b/apps/settings/l10n/uk.json
index eb02aff6dbb..6ff8ab9eeaa 100644
--- a/apps/settings/l10n/uk.json
+++ b/apps/settings/l10n/uk.json
@@ -130,6 +130,8 @@
"Verifying" : "Перевірка",
"Allowed admin IP ranges" : "Дозволені діапазони адрес IP",
"Admin IP filtering isn't applied." : "Фільтрування адміністраторів за адресою IP не застосовується.",
+ "Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Ключ конфігурації \"%1$s\" очікує масив (%2$s знайдено). Перевірка діапазону IP-адрес адміністратора не застосовуватиметься.",
+ "Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Ключ конфігурації \"%1$s\" містить невірний діапазон IP-адрес: \"%2$s\"",
"Admin IP filtering is correctly configured." : "Фільтрування адміністраторів за адресою IP правильно налаштовано.",
"App directories owner" : "Власник каталогів застосунків",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Окремі каталоги застосунків мають інших користувачів на відміну від користувача вебсервера. Часто таке трапляється, якщо застосунки було встановлено вручну. Перевірте дозволи на такі каталоги застосунків:\n%s",
@@ -138,7 +140,9 @@
"Your remote address could not be determined." : "Не вдалося визначити вашу віддалену адресу.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваша віддалена адреса була ідентифікована як \"%s\" і наразі щодо неї виконуються спроби грубого підбору паролів, відповідно виконання різних запитів відбувається уповільнено . Якщо віддалена адреса не є вашою адресою, це може свідчити про те, що проксі налаштовано неправильно.",
"Your remote address \"%s\" is not brute-force throttled." : "Ваша віддалена адреса \"%s\" не уповільнена через грубі спроби підбору паролів.",
+ "Old administration imported certificates" : "Стара адміністрація імпортувала сертифікати",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Виконується фонове завдання, яке перевіряє імпортовані SSL-сертифікати на предмет адміністрування. Будь ласка, перевірте пізніше.",
+ "There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Існують деякі імпортовані адміністрацією SSL-сертифікати, які більше не використовуються в Nextcloud 21. Їх можна імпортувати в командному рядку за допомогою команди \"occ security:certificates:import\". Шляхи до них у каталозі даних показано нижче.",
"Code integrity" : "Цілісність коду",
"Integrity checker has been disabled. Integrity cannot be verified." : "Перевірку на цілісність вимкнено. Цілісність буде неможливо перевірити.",
"No altered files" : "Відсутні змінені файли",
@@ -151,12 +155,14 @@
"Last background job execution ran %s." : "Останнє виконання фонового завдання тривало: %s.",
"Data directory protected" : "Директорія з даними є захищеною",
"Your data directory and files are probably accessible from the internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Ваш каталог даних і файли, ймовірно, доступні з Інтернету. Файл .htaccess не працює. Настійно рекомендується налаштувати веб-сервер так, щоб каталог даних був недоступний, або перемістити каталог даних за межі кореня документа веб-сервера.",
+ "Could not check that the data directory is protected. Please check manually that your server does not allow access to the data directory." : "Не вдалося перевірити, що каталог даних захищено. Будь ласка, перевірте вручну, чи ваш сервер не дозволяє доступ до каталогу даних.",
"Database missing columns" : "Відсутні стовпці у базі даних",
"Missing optional column \"%s\" in table \"%s\"." : "Відсутні необов'язкові стовпці \"%s\" у таблиці \"%s\".",
"The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "У базі даних відсутні деякі необов’язкові стовпці. Через те, що додавання стовпців у великі таблиці може зайняти деякий час, вони не додаються автоматично, коли вони можуть бути необов’язковими. Для створення відсутніх стовпців, будь ласка, виконайте команду \"occ db:add-missing-columns\". Після додавання стовпців деякі функції можуть покращити реагування та зручність використання.",
"Database missing indices" : "Відсутні індекси у базі даних",
"Missing indices:" : "Відсутні індекси:",
"\"%s\" in table \"%s\"" : "\"%s\" в таблиці \"%s\"",
+ "Detected some missing optional indices. Occasionally new indices are added (by Nextcloud or installed applications) to improve database performance. Adding indices can sometimes take awhile and temporarily hurt performance so this is not done automatically during upgrades. Once the indices are added, queries to those tables should be faster. Use the command `occ db:add-missing-indices` to add them." : "Виявлено деякі відсутні необов'язкові індекси. Іноді додаються нові індекси (за допомогою Nextcloud або встановлених додатків) для підвищення продуктивності бази даних. Додавання індексів може зайняти деякий час і тимчасово знизити продуктивність, тому під час оновлень це не робиться автоматично. Після додавання індексів запити до цих таблиць мають працювати швидше. Щоб додати їх, скористайтеся командою `occ db:add-missing-indices`.",
"Database missing primary keys" : "Відсутні первинні ключі у базі даних",
"Missing primary key on table \"%s\"." : "Відсутній первинний ключ у таблиці \"%s\".",
"The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running \"occ db:add-missing-primary-keys\" those missing primary keys could be added manually while the instance keeps running." : "У базі даних відсутні деякі первинні ключі. Через те, що додавання первинних ключів у великі таблиці може зайняти деякий час, вони не додаються автоматично. Для створення первинних ключей, будь ласка, виконайте команду \"occ db:add-missing-primary-keys\".",
@@ -168,42 +174,71 @@
"Default phone region" : "Типовий телефонний код регіону",
"Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add \"default_phone_region\" with the respective ISO 3166-1 code of the region to your config file." : "У вашому примірнику не налаштовано типовий телефонний регіон. Цей параметр потрібний для підтвердження телефонних номерів у профілі користувача без зазначення коду країни. Щоби дозволити використання телефонних номерів без зазначення коду країни, додайте параметр \"default_phone_region\" із кодом регіону згідно з ISO 3166-1 у вашому файлі конфігурації config.php.",
"Email test" : "Тест ел.пошти",
+ "Mail delivery is disabled by instance config \"%s\"." : "Доставку пошти вимкнено за допомогою конфігурації екземпляра \"%s\".",
"Email test was successfully sent" : "Ел.лист було успішно надіслано",
"You have not set or verified your email server configuration, yet. Please head over to the \"Basic settings\" in order to set them. Afterwards, use the \"Send email\" button below the form to verify your settings." : "Ви ще не налаштувати або не перевірили налаштування поштового сервера. Перейдіть до \"Основних налаштувань. Після цього перевірте коректність поштових налаштувань, для цього клацніть на кнопку \"Надіслати ел.пошту\" під формою.",
"Transactional File Locking" : "Блокування транзакційних файлів",
+ "Transactional File Locking is disabled. This is not a a supported configuraton. It may lead to difficult to isolate problems including file corruption. Please remove the `'filelocking.enabled' => false` configuration entry from your `config.php` to avoid these problems." : "Блокування транзакційних файлів вимкнено. Це не підтримувана конфігурація. Це може призвести до проблем, які важко ізолювати, зокрема до пошкодження файлів. Будь ласка, видаліть запис конфігурації `'filelocking.enabled' => false` з вашого `config.php`, щоб уникнути цих проблем.",
"The database is used for transactional file locking. To enhance performance, please configure memcache, if available." : "База даних використовується для транзакційного блокування файлів. Для кращої продуктивности рекомендується налаштувати memcache, якщо доступний.",
"Forwarded for headers" : "Перенаправлено для заголовків",
"Your \"trusted_proxies\" setting is not correctly set, it should be an array." : "Ваш параметр \"trusted_proxies\" встановлено неправильно, це має бути масив.",
+ "Your \"trusted_proxies\" setting is not correctly set, it should be an array of IP addresses - optionally with range in CIDR notation." : "Ваш параметр \"trusted_proxies\" задано неправильно, це має бути масив IP-адрес - бажано з діапазоном у нотації CIDR.",
"The reverse proxy header configuration is incorrect. This is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud." : "Конфігурація заголовка зворотного проксі неправильна. Це є проблемою безпеки і може дозволити зловмиснику надати Nextcloud оманливу IP-адресу.",
"Your IP address was resolved as %s" : "Ваша IP-адреса була визначена як %s",
+ "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If not, this is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud." : "Конфігурація зворотного заголовка проксі неправильна, або ви отримуєте доступ до Nextcloud від довіреного проксі-сервера. Якщо ні, це є проблемою безпеки і може дозволити зловмиснику підмінити свою IP-адресу видимою для Nextcloud.",
+ "HTTPS access and URLs" : "Доступ HTTPS та URL-адреси",
+ "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead. Without it some important web functionality like \"copy to clipboard\" or \"service workers\" will not work!" : "Небезпечний доступ до сайту через HTTP. Ми наполегливо рекомендуємо налаштувати ваш сервер на використання HTTPS. Без цього деякі важливі веб-функції, такі як \"копіювати в буфер обміну\" або \"сервісні працівники\", не працюватимуть!",
"Accessing site insecurely via HTTP." : "Небезпечний доступ до сайту через HTTP.",
+ "You are accessing your instance over a secure connection, however your instance is generating insecure URLs. This likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Ви отримуєте доступ до свого екземпляра через безпечне з'єднання, проте ваш екземпляр генерує небезпечні URL-адреси. Це, ймовірно, означає, що ваш екземпляр знаходиться за зворотним проксі і значення конфігурації Nextcloud `overwrite*` налаштовані неправильно.",
+ "Your instance is generating insecure URLs. If you access your instance over HTTPS, this likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Ваш екземпляр генерує небезпечні URL-адреси. Якщо ви отримуєте доступ до вашого екземпляра через HTTPS, це, ймовірно, означає, що ваш екземпляр знаходиться за зворотним проксі і значення конфігурації Nextcloud `overwrite*` налаштовані неправильно.",
+ "You are accessing your instance over a secure connection, and your instance is generating secure URLs." : "Ви отримуєте доступ до свого екземпляра через захищене з'єднання, і ваш екземпляр генерує безпечні URL-адреси.",
"Internet connectivity" : "З'єднання з мережею Інтернет",
"Internet connectivity is disabled in configuration file." : "З'єднання з мережею Інтернет вимкнено у файлі конфігурації",
"This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "На цьому сервері не працює з’єднання з Інтернетом: неможливо отримати доступ до кількох кінцевих точок. Це означає, що деякі функції, як-от підключення зовнішньої пам’яті, сповіщення про оновлення або встановлення застосунків сторонніх розробників, не працюватимуть. Віддалений доступ до файлів і надсилання сповіщень електронною поштою також можуть не працювати. Встановіть з’єднання цього сервера з Інтернетом, щоб користуватися всіма функціями.",
"JavaScript modules support" : "Підтримка модулів JavaScript",
+ "Unable to run check for JavaScript support. Please remedy or confirm manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не вдалося запустити перевірку підтримки JavaScript. Будь ласка, виправте помилку або підтвердіть вручну, якщо ваш веб-сервер обслуговує файли `.mjs` з використанням MIME-типу JavaScript.",
"Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "Ваш вебсервер не обслуговує файли `.mjs` за допомогою типу MIME JavaScript. Це призведе до того, що окремі застосунки не працюватимуть коректно, оскільки бравзери не зможуть виконувати файли JavaScript. Вам потрібно визначити обслуговування файлів `.mjs` з типом MIME `text/javascript` або `application/javascript` у налаштуваннях вашого вебсервера.",
+ "JavaScript source map support" : "Підтримка карти джерел JavaScript",
+ "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "Ваш веб-сервер не налаштований на обслуговування файлів `.js.map`. Без цих файлів JavaScript Source Maps не працюватиме належним чином, що ускладнює пошук і усунення несправностей та налагодження будь-яких проблем, які можуть виникнути.",
"Old server-side-encryption" : "Застаріле шифрування на рівні сервера",
"Disabled" : "Вимкнено",
"The old server-side-encryption format is enabled. We recommend disabling this." : "Старий формат шифрування на стороні сервера ввімкнено. Рекомендуємо вимкнути це.",
"Logging level" : "Рівень журналювання",
+ "The %1$s configuration option must be a valid integer value." : "Параметр конфігурації %1$s має бути дійсним цілим числом.",
+ "The logging level is set to debug level. Use debug level only when you have a problem to diagnose, and then reset your log level to a less-verbose level as it outputs a lot of information, and can affect your server performance." : "Рівень журналу встановлено на рівень налагодження. Використовуйте рівень налагодження лише тоді, коли вам потрібно діагностувати проблему, а потім скиньте рівень журналу до менш розлогого рівня, оскільки він виводить багато інформації, що може вплинути на продуктивність вашого сервера.",
"Logging level configured correctly." : "Рівень журналювання правильно налаштовано.",
"Maintenance window start" : "Час початку обслуговування",
"Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "Сервер не має налаштованого часу початку завдань з обслуговування. Це означає, що ресурсомісткі щоденні фонові роботи також будуть виконуватися протягом основного часу використання. Рекомендуємо встановити його у час найнижчого користування хмарою, щоб користувачі менше відчували зменшення продуктивності, яке може спостерігатися у зв'язку із завданнями з обслуговування.",
"Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "Часовий проміжок для виконання ресурсомістких завдань встановлено від {start}:00 UTC до {end}:00 UTC",
"Memcache" : "Memcache",
+ "Memcached is configured as distributed cache, but the wrong PHP module (\"memcache\") is installed. Please install the PHP module \"memcached\"." : "Memcached налаштовано як розподілений кеш, але встановлено неправильний модуль PHP (\"memcache\"). Будь ласка, встановіть модуль PHP \"memcached\".",
+ "Memcached is configured as distributed cache, but the PHP module \"memcached\" is not installed. Please install the PHP module \"memcached\"." : "Memcached налаштовано як розподілений кеш, але PHP-модуль \"memcached\" не встановлено. Будь ласка, встановіть PHP-модуль \"memcached\".",
"No memory cache has been configured. To enhance performance, please configure a memcache, if available." : "Відсутні налаштування кешування пам'яти. Для кращої продуктивности рекомендуємо налаштувати memcache, якщо доступний.",
+ "Failed to write and read a value from local cache." : "Не вдалося записати або прочитати значення з локального кешу.",
+ "Failed to write and read a value from distributed cache." : "Не вдалося записати або прочитати значення з розподіленого кешу.",
"Configured" : "Налаштовано",
+ "Mimetype migrations available" : "Доступні міграції міметипів",
+ "One or more mimetype migrations are available. Occasionally new mimetypes are added to better handle certain file types. Migrating the mimetypes take a long time on larger instances so this is not done automatically during upgrades. Use the command `occ maintenance:repair --include-expensive` to perform the migrations." : "Доступні один або декілька міграцій міметипів. Іноді додаються нові міметипи для кращої обробки певних типів файлів. Перенесення міметипів займає багато часу на великих екземплярах, тому воно не виконується автоматично під час оновлення. Для виконання міграції скористайтеся командою `occ maintenance:repair --include-expensive`.",
"MySQL row format" : "Формат рядка MySQL",
"You are not using MySQL" : "Ви не використовуєте MySQL",
+ "None of your tables use ROW_FORMAT=Compressed" : "Жодна з ваших таблиць не використовує ROW_FORMAT=Compressed",
+ "Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud. Please update row format on the following list: %s." : "У вашій базі даних знайдено неправильний формат рядків. ROW_FORMAT=Dynamic забезпечує найкращу продуктивність бази даних для Nextcloud. Будь ласка, оновіть формат рядків у наступному списку: %s.",
"MySQL Unicode support" : "Підтримка юнікоду в MySQL",
"MySQL is used as database and does support 4-byte characters" : "MySQL використовується яко база даних, увімкнено підтримку 4-бітних символів",
"MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL." : "MySQL використовується яко база даних, проте 4-бітні символи не підтримуються. Для коректного відображення 4-бітних символів (напр., відображення емоційок) рекомендується встановити 4-бітну підтримку в налаштуваннях MySQL.",
+ "OCS provider resolving" : "Дозвіл постачальника OCS",
+ "Could not check if your web server properly resolves the OCM and OCS provider URLs." : "Не вдалося перевірити, чи правильно ваш веб-сервер розпізнає URL-адреси постачальників OCM та OCS.",
+ "Your web server is not properly set up to resolve %1$s.\nThis is most likely related to a web server configuration that was not updated to deliver this folder directly.\nPlease compare your configuration against the shipped rewrite rules in \".htaccess\" for Apache or the provided one in the documentation for Nginx.\nOn Nginx those are typically the lines starting with \"location ~\" that need an update." : "Ваш веб-сервер не налаштовано належним чином для обробки %1$s.\nСкоріш за все, це пов'язано з конфігурацією веб-сервера, яку не було оновлено для безпосередньої доставки цієї теки.\nБудь ласка, порівняйте вашу конфігурацію з правилами перезапису в \".htaccess\" для Apache або з наведеними в документації для Nginx.\nУ Nginx зазвичай оновлення потребують рядки, що починаються з \"location ~\".",
"Overwrite CLI URL" : "Перезаписати CLI URL",
"The \"overwrite.cli.url\" option in your config.php is correctly set to \"%s\"." : "Параметр \"overwrite.cli.url\" у вашому конфігураційному файлі config.php налаштовано правильно зі значенням \"%s\".",
"The \"overwrite.cli.url\" option in your config.php is set to \"%s\" which is a correct URL. Suggested URL is \"%s\"." : "Параметр \"overwrite.cli.url\" у вашому конфігураційному файлі config.php налаштовано зі значенням \"%s\", яке є правильним URL. Рекомендований URL: \"%s\".",
"Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Обов’язково встановіть параметр \"overwrite.cli.url\" у конфігураційному файлі config.php зі значенням URL-адреси, яку ваші користувачі переважно використовують для доступу до цього Nextcloud. Пропонується таке значення: \"%s\". В іншому випадку можуть виникнути проблеми з генерацією URL-адреси через cron. (Однак можливо, що запропонована URL-адреса не є URL-адресою, яку ваші користувачі переважно використовують для доступу до хмари Nextcloud. Будь ласка, перевірте, чи це так.)",
+ "PHP APCu configuration" : "Конфігурація PHP APCu",
+ "Your APCu cache has been running full, consider increasing the apc.shm_size php setting." : "Ваш кеш APCu переповнений, спробуйте збільшити значення параметра apc.shm_size php.",
+ "Your APCu cache is almost full at %s%%, consider increasing the apc.shm_size php setting." : "Ваш кеш APCu майже заповнений за адресою %s%%, розгляньте можливість збільшення параметра apc.shm_size php.",
"PHP default charset" : "Типове кодування сторінки PHP",
"PHP configuration option \"default_charset\" should be UTF-8" : "Параметр конфігурації PHP \"default_charset\" має мати значення UTF-8",
+ "PHP set_time_limit" : "PHP set_time_limit",
"The function is available." : "Функція доступна.",
"The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "Функція PHP \"set_time_limit\" недоступна. Це може призвести до зупинки сценаріїв під час виконання, що порушить установку. Настійно рекомендується вмикати цю функцію.",
"Freetype" : "Freetype",
@@ -211,13 +246,21 @@
"Your PHP does not have FreeType support, resulting in breakage of profile pictures and the settings interface." : "Ваш PHP не підтримує FreeType, що призводить до поломки зображень профілю та інтерфейсу налаштувань.",
"PHP getenv" : "PHP getenv",
"PHP does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP не налаштований правильно для отримання змінних системного оточення. Запит getenv(\"PATH\") повертає пусті результати.",
+ "PHP file size upload limit" : "Обмеження на розмір завантажуваного PHP-файлу",
+ "The PHP upload_max_filesize is too low. A size of at least %1$s is recommended. Current value: %2$s." : "PHP upload_max_filesize занадто малий. Рекомендується розмір не менше %1$s. Поточне значення: %2$s.",
+ "The PHP post_max_size is too low. A size of at least %1$s is recommended. Current value: %2$s." : "PHP post_max_size занадто малий. Рекомендується розмір не менше %1$s. Поточне значення: %2$s.",
+ "The PHP max_input_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "PHP max_input_time занадто малий. Рекомендується час не менше %1$s. Поточне значення: %2$s.",
+ "The PHP max_execution_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "Занадто малий час виконання PHP max_execution_time. Рекомендується час не менше %1$s. Поточне значення: %2$s.",
"PHP memory limit" : "Обмеження пам'яті PHP",
+ "The PHP memory limit is below the recommended value of %s. Some features or apps - including the Updater - may not function properly." : "Обмеження пам'яті PHP нижче рекомендованого значення %s. Деякі функції або програми, включаючи Updater, можуть не працювати належним чином.",
"PHP modules" : "Модулі PHP",
"increases language translation performance and fixes sorting of non-ASCII characters" : "Покращує продуктивність перекладу мови та виправляє впорядкування не-ASCII знаків",
"for Argon2 for password hashing" : "для Argon2 для хешування паролів",
+ "required for SFTP storage and recommended for WebAuthn performance" : "необхідний для SFTP-сховища та рекомендований для роботи WebAuthn",
"for picture rotation in server and metadata extraction in the Photos app" : "для обертання зображення на сервері та видобування метаданих у застосунку \"Світлини\"",
"This instance is missing some required PHP modules. It is required to install them: %s." : "На цьому примірнику бракує окремі обов'язкові модулі PHP, зокрема, необхідно встановити такі: %s.",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them:\n%s" : "На цьому примірнику бракує окремих рекомендованих модулів PHP. Для кращої продуктивности та сумісности наполегливо рекомендуємо встановити такі модулі:\n%s",
+ "PHP opcache" : "PHP opcache",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Модуль PHP OPcache не завантажується. Для кращої продуктивності рекомендується завантажити його у вашу установку PHP.",
"OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache вимкнено. Для кращої продуктивності рекомендовано встановити значення \"opcache.enable=1\" у конфігураційному файлі PHP.",
"The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "OPcache для розділеної пам'яти вимкнено. Для кращої продуктивності рекомендовано встановити значення \"opcache.file_cache_only=0\" у конфігураційному файлі PHP, використовувати кеш файлів лише як кеш другого рівня.",
@@ -227,9 +270,11 @@
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Внутрішній буфер рядків OPcache майже переповнено. Рекомендується встановити значення \"opcache.interned_strings_buffer\" у вашому конфігураційному файлі PHP вище за \"%s\", щоб забезпечити ефективне кешування повторюваних рядків.",
"OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache налаштовано для вилучення коментарів коду. Для увімкнененого OPcache потрібно встановити значення \"opcache.save_comments=1\" для правильної роботи Nextcloud.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Серверу Nextcloud не дозволено використовувати OPcache API. Для увімкненого OPcache наполегливо рекомендується додати всі каталоги Nextcloud з \"opcache.restrict_api\" або взагалі не встановлювати таке налаштування й таким чином вимкнути обмеження OPcache API, щоби уникнути помилок під час оновлення основної частини Nextcloud або застосунків.",
+ "Checking from CLI, OPcache checks have been skipped." : "Перевірка з CLI, перевірка OPcache була пропущена.",
"The PHP OPcache module is not properly configured. %s." : "Модуль PHP OPcache не налаштовано належним чином. %s.",
"Correctly configured" : "Правильне налаштування",
"PHP version" : "Версія PHP",
+ "You are currently running PHP %1$s. PHP %2$s is deprecated since Nextcloud %3$s. Nextcloud %4$s may require at least PHP %5$s. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Наразі ви використовуєте PHP %1$s. PHP %2$s застаріла, починаючи з Nextcloud %3$s. Для роботи Nextcloud %4$s може знадобитися щонайменше PHP %5$s. Будь ласка, якнайшвидше оновіть систему до однієї з офіційно підтримуваних версій PHP, наданих PHP Group.",
"You are currently running PHP %s." : "У вас встановлено PHP %s.",
"PHP \"output_buffering\" option" : "Параметр PHP \"\"output_buffering\"",
"PHP configuration option \"output_buffering\" must be disabled" : "Параметр PHP \"\"output_buffering\" потрібно вимкнути",
@@ -243,15 +288,37 @@
"Configuration file access rights" : "Дозволи доступу до конфігураційного файлу",
"The read-only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Увімкнена конфігурація тільки для читання. Це запобігає встановленню деяких опцій через вебінтерфейс. Крім того, для кожного оновлення файл повинен бути зроблений з доступом на запис.",
"Nextcloud configuration file is writable" : "Файл конфігурації Nextcloud доступний для запису",
+ "Scheduling objects table size" : "Розмір таблиці об'єктів планування",
+ "You have more than %s rows in the scheduling objects table. Please run the expensive repair jobs via occ maintenance:repair --include-expensive." : "У таблиці об'єктів планування є більше %s рядків. Будь ласка, запустіть дорогі ремонтні роботи за допомогою occ maintenance:repair --include-expensive.",
+ "Scheduling objects table size is within acceptable range." : "Розмір таблиці об'єктів планування знаходиться в допустимих межах.",
"HTTP headers" : "Заголовки HTTP",
+ "- The `%1$s` HTTP header is not set to `%2$s`. Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "- HTTP-заголовок `%1$s` не має значення `%2$s`. Деякі функції можуть працювати некоректно, тому рекомендується змінити цей параметр відповідним чином.",
+ "- The `%1$s` HTTP header is not set to `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "- HTTP-заголовок `%1$s` не має значення `%2$s`. Це є потенційним ризиком для безпеки або конфіденційності, тому рекомендується змінити цей параметр відповідним чином.",
+ "- The `%1$s` HTTP header is not set to `%2$s`, `%3$s`, `%4$s`, `%5$s` or `%6$s`. This can leak referer information. See the {w3c-recommendation}." : "- HTTP-заголовок `%1$s` не має значення `%2$s`, `%3$s`, `%4$s`, `%5$s` або `%6$s`. Це може призвести до витоку інформації про реферала. Зверніться до {w3c-recommendation}.",
+ "- The `Strict-Transport-Security` HTTP header is not set to at least `%d` seconds (current value: `%d`). For enhanced security, it is recommended to use a long HSTS policy." : "- HTTP-заголовок `Strict-Transport-Security` не встановлено принаймні `%d` секунд (поточне значення: `%d`). Для підвищення безпеки рекомендується використовувати довгу політику HSTS.",
+ "- The `Strict-Transport-Security` HTTP header is malformed: `%s`. For enhanced security, it is recommended to enable HSTS." : "- Неправильно сформовано HTTP-заголовок `Strict-Transport-Security`: `%s`. Для підвищення безпеки рекомендується увімкнути HSTS.",
+ "- The `Strict-Transport-Security` HTTP header is not set (should be at least `%d` seconds). For enhanced security, it is recommended to enable HSTS." : "- HTTP-заголовок `Strict-Transport-Security` не встановлено (має бути щонайменше `%d` секунд). Для підвищення безпеки рекомендується ввімкнути HSTS.",
+ "Some headers are not set correctly on your instance" : "У вашому екземплярі деякі заголовки задано неправильно",
+ "Could not check that your web server serves security headers correctly. Please check manually." : "Не вдалося перевірити, чи правильно ваш веб-сервер обслуговує заголовки безпеки. Будь ласка, перевірте вручну.",
+ "Could not check that your web server serves security headers correctly, unable to query `%s`" : "Не вдалося перевірити, чи правильно ваш веб-сервер обслуговує заголовки безпеки, не вдалося виконати запит `%s`.",
+ "Your server is correctly configured to send security headers." : "Ваш сервер правильно налаштовано для надсилання заголовків безпеки.",
"Database version" : "Версія бази даних",
+ "MariaDB version 10.3 detected, this version is end-of-life and only supported as part of Ubuntu 20.04. MariaDB >=%1$s and <=%2$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено MariaDB версії 10.3, ця версія застаріла і підтримується лише у складі Ubuntu 20.04. Рекомендується використовувати MariaDB >=%1$s та <=%2$s для кращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
+ "MariaDB version \"%1$s\" detected. MariaDB >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію MariaDB \"%1$s\". Для кращої продуктивності, стабільності та функціональності цієї версії Nextcloud рекомендується використовувати MariaDB >=%2$s та <=%3$s.",
+ "MySQL version \"%1$s\" detected. MySQL >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію MySQL \"%1$s\". Рекомендується використовувати MySQL >=%2$s та <=%3$s для кращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
+ "PostgreSQL version \"%1$s\" detected. PostgreSQL >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію PostgreSQL \"%1$s\". Рекомендується використовувати PostgreSQL >=%2$s та <=%3$s для кращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
"SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend. This is particularly recommended when using the desktop client for file synchronisation. To migrate to another database use the command line tool: \"occ db:convert-type\"." : "Наразі SQLite використовується як база даних. Для більш продуктивних примірників рекомендується переключитися на іншу базу даних. Зокрема це рекомендується у разі використання клієнтів синхронізації файлів для робочих станцій. Щоб мігрувати до іншої бази даних, використовуйте інструмент командного рядка: \"occ db:convert-type\".",
"Unknown database platform" : "Невідома платформа бази даних",
"Architecture" : "Архітектура",
"64-bit" : "64 біти",
"It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Схоже, що у вас встановлено 32-бітну версію PHP. Правильна робота Nextcloud вимагає 64-бітної версії. Оновіть вашу операційну систему та рушій PHP до 64-бітної версії!",
+ "Task Processing pickup speed" : "Швидкість обробки завдань",
+ "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["Запланованих завдань за останні %n годин не було.","Немає запланованих завдань за останні %n годин.","Немає запланованих завдань за останні %n годин.","Немає запланованих завдань за останні %n годин."],
+ "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["Швидкість підхоплення завдань була нормальною протягом останньої %n годин.","Швидкість збирання завдань була нормальною протягом останніх %n годин.","Швидкість збирання завдань була нормальною протягом останніх %n годин.","Швидкість збирання завдань була нормальною протягом останніх %n годин."],
+ "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["Швидкість збирання завдань була низькою протягом останньої %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі.","Швидкість збирання завдань була низькою протягом останніх %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі.","Швидкість збирання завдань була низькою протягом останніх %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі.","Швидкість збирання завдань була низькою протягом останніх %n годин. Багато завдань забиралися довше, ніж за 4 хвилини. Подумайте про те, щоб налаштувати працівника на обробку завдань у фоновому режимі."],
"Temporary space available" : "Тимчасовий простір доступний",
"Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Помилка під час перевірки шляху до тимчасового каталогу PHP, його не було правильно налаштовано яко каталог. Отримано значення: %s",
+ "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "Функція PHP \"disk_free_space\" відключена, що перешкоджає перевірці наявності вільного місця в тимчасових каталогах.",
"Error while checking the available disk space of temporary PHP path or no free disk space returned. Temporary path: %s" : "Помилка під час перевірки доступного дискового простору тимчасового каталогу PHP або отримано підтвердження про відсутність вільного дискового простору. Шлях до тимчасового каталогу: %s",
"- %.1f GiB available in %s (PHP temporary directory)" : "- %.1f ГБ доступно у %s (тимчасовий каталог PHP)",
"- %.1f GiB available in %s (Nextcloud temporary directory)" : "- %.1f ГБ доступно у %s (тимчасовий каталог Nextcloud)",
@@ -261,11 +328,20 @@
"Database transaction isolation level" : "Рівень ізолювання транзакцій бази даних",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Ваша база даних не працює з рівнем ізоляції транзакцій \"READ COMMITTED\". Це може спричинити проблеми, коли кілька дій виконуються паралельно.",
"Was not able to get transaction isolation level: %s" : "Не вдалося отримати рівень ізолюування тразакцій: %s",
+ ".well-known URLs" : ".відомі URL-адреси",
+ "`check_for_working_wellknown_setup` is set to false in your configuration, so this check was skipped." : "У вашій конфігурації `check_for_working_wellknown_setup` встановлено у false, тому цю перевірку було пропущено.",
+ "Could not check that your web server serves `.well-known` correctly. Please check manually." : "Не вдалося перевірити, чи правильно ваш веб-сервер обслуговує `.well-known`. Будь ласка, перевірте вручну.",
+ "Your web server is not properly set up to resolve `.well-known` URLs, failed on:\n`%s`" : "Ваш веб-сервер не налаштовано належним чином для вирішення `.well-known` URL-адрес, failed on:\n`%s`",
+ "Your server is correctly configured to serve `.well-known` URLs." : "Ваш сервер правильно налаштовано для обслуговування `.well-known` URL-адрес.",
"Font file loading" : "Завантаження файлу шрифтів",
+ "Could not check for {extension} loading support. Please check manually if your webserver serves `.{extension}` files." : "Не вдалося перевірити підтримку завантаження {розширення}. Будь ласка, перевірте вручну, чи обслуговує ваш веб-сервер файли `.{розширення}`.",
+ "Your web server is not properly set up to deliver .{extension} files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustment to also deliver .{extension} files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Ваш веб-сервер не налаштовано належним чином для доставки файлів з розширенням .{розширення}. Зазвичай це пов'язано з конфігурацією Nginx. Для Nextcloud 15 його потрібно налаштувати так, щоб він також доставляв файли з розширенням .{extension}. Порівняйте вашу конфігурацію Nginx з рекомендованою конфігурацією в нашій документації.",
"Profile information" : "Інформація профілю",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Зображення профілю, повне ім’я, електронна адреса, номер телефону, адреса, веб-сайт, Twitter, організація, роль, заголовок, біографія та чи активовано ваш профіль",
"Nextcloud settings" : "Налаштування Nextcloud",
"Unified task processing" : "Централізована обробка завдань ",
+ "AI tasks can be implemented by different apps. Here you can set which app should be used for which task." : "Завдання штучного інтелекту можуть виконуватися різними програмами. Тут ви можете вказати, яку програму слід використовувати для виконання того чи іншого завдання.",
+ "Allow AI usage for guest users" : "Дозволити використання ШІ для гостьових користувачів",
"Task:" : "Завдання:",
"Enable" : "Увімкнути",
"None of your currently installed apps provide Task processing functionality" : "Жодний зі встановлених застосунків не надає функціональність з обробки завдань",
@@ -288,13 +364,19 @@
"Allow sharing with groups" : "Дозволити спільне використання групами",
"Restrict users to only share with users in their groups" : "Дозволити надання у спільний доступ тільки в межах власних груп",
"Ignore the following groups when checking group membership" : "Ігнорувати такі групи під час перевірки участи в групі",
+ "Allow users to preview files even if download is disabled" : "Дозвольте користувачам переглядати файли, навіть якщо завантаження вимкнено",
+ "Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "Користувачі все одно зможуть робити скріншоти або записувати екран. Це не забезпечує жодного остаточного захисту.",
"Allow users to share via link and emails" : "Дозволити користувачам надання у спільний доступ за допомогою посилань та ел. листів",
"Allow public uploads" : "Дозволити публічне завантаження",
+ "Allow public shares to be added to other clouds by federation." : "Дозвольте додавати публічні ресурси до інших хмар за допомогою федерації.",
+ "This will add share permissions to all newly created link shares." : "Це додасть дозволи на спільний доступ до всіх новостворених спільних ресурсів посилань.",
"Always ask for a password" : "Завжди запитувати пароль",
"Enforce password protection" : "Захист паролем обов'язковий",
"Exclude groups from password requirements" : "Виключення щодо вимог пароля для груп",
"Exclude groups from creating link shares" : "Не дозволяти користувачам таких груп створювати посилання спільного доступу",
"Allow users to set custom share link tokens" : "Дозволити користвучам встановити власні токени спільних посилань",
+ "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Частки з власними токенами залишатимуться доступними після вимкнення цього параметра",
+ "Shares with guessable tokens may be accessed easily" : "До акцій з вгадуваними токенами можна легко отримати доступ",
"Limit sharing based on groups" : "Обмежити надання у спільний доступ на основі груп",
"Allow sharing for everyone (default)" : "Дозволити надання у спільний доступ для всіх (типово)",
"Exclude some groups from sharing" : "Не дозволяти таким групам надавати у спільний доступ",
@@ -359,7 +441,9 @@
"Group name" : "Назва групи",
"Please enter a valid group name" : "Введіть дійсну назву групи",
"Search groups…" : "Шукати групи...",
+ "List of groups. This list is not fully populated for performance reasons. The groups will be loaded as you navigate or search through the list." : "Список груп. Цей список не повністю заповнений з міркувань продуктивності. Групи будуть завантажуватися під час навігації або пошуку по списку.",
"Loading groups…" : "Завантаження груп...",
+ "Could not load app discover section" : "Не вдалося завантажити розділ пошуку додатків",
"Could not render element" : "Не вдалося показати елемент",
"Nothing to show" : "Відсутня інформація для показу",
"Could not load section content from app store." : "Не вдалося отримати розділ вмісту із крамнички.",
@@ -371,15 +455,36 @@
"Choose slide to display" : "Виберіть слайд для показу",
"{index} of {total}" : "{index} із {total}",
"Daemon" : "Демон",
+ "Deploy Daemon" : "Розгортання демона",
"Type" : "Тип",
"Display Name" : "Назва для показу",
"GPUs support" : "Підтримка GPU",
"Compute device" : "Пристрій для обчислення",
+ "Advanced deploy options" : "Розширені параметри розгортання",
+ "Edit ExApp deploy options before installation" : "Редагування параметрів розгортання ExApp перед інсталяцією",
+ "Configured ExApp deploy options. Can be set only during installation" : "Налаштовані параметри розгортання ExApp. Можна налаштувати лише під час інсталяції",
"Learn more" : "Дізнатися більше",
+ "Environment variables" : "Змінні середовища",
+ "ExApp container environment variables" : "Змінні оточення контейнера ExApp",
+ "No environment variables defined" : "Змінні оточення не визначено",
+ "Mounts" : "Кріплення",
+ "Define host folder mounts to bind to the ExApp container" : "Визначте монтування папки хоста для прив'язки до контейнера ExApp",
+ "Must exist on the Deploy daemon host prior to installing the ExApp" : "Повинен існувати на хості демона розгортання до встановлення ExApp",
+ "Host path" : "Шлях до хосту",
+ "Container path" : "Шлях до контейнера",
"Read-only" : "Тільки для читання",
+ "Remove mount" : "Зніміть кріплення",
+ "New mount" : "Нове кріплення",
+ "Enter path to host folder" : "Введіть шлях до папки хоста",
+ "Enter path to container folder" : "Введіть шлях до папки контейнера",
"Toggle read-only mode" : "Перемкнути режим тільки для читання",
+ "Confirm adding new mount" : "Підтвердіть додавання нового кріплення",
"Confirm" : "Підтвердити",
+ "Cancel adding mount" : "Скасувати додавання кріплення",
"Cancel" : "Скасувати",
+ "Add mount" : "Додати кріплення",
+ "ExApp container mounts" : "Кріплення для контейнерів ExApp",
+ "No mounts defined" : "Не визначено жодного кріплення",
"Description" : "Опис",
"View in store" : "Переглянути у крамниці застосунків",
"Visit website" : "Перейти на вебсайт",
@@ -391,6 +496,9 @@
"Limit app usage to groups" : "Обмежити використання застосунку певними групами",
"No results" : "Нічого не знайдено",
"Update to {version}" : "Оновити до {version}",
+ "Deploy options" : "Варіанти розгортання",
+ "Default Deploy daemon is not accessible" : "За замовчуванням демон розгортання недоступний",
+ "Delete data on remove" : "Видалення даних при видаленні",
"This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Цей застосунок не має обмежень щодо мінімальної версії Nextcloud. В майбутньому це може викликати певні помилки.",
"This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Для цього застосунку не визначено найвищу версію Nextcloud. Це може викликати помилку в майбутньому.",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Цей застосунок не буде встановлено, оскільки такі залежності неможливо виконати:",
@@ -413,6 +521,8 @@
"{productName} Talk for Android" : "{productName} Talk для Android",
"Sync client" : "Синхронізувати клієнт",
"This session" : "Цей сеанс",
+ "{client} - {version} ({system})" : "{клієнт} - {версія} ({система})",
+ "{client} - {version}" : "{клієнт} - {версія}",
"Device name" : "Назва пристрою",
"Cancel renaming" : "Відхилити перейменування",
"Save new name" : "Зберегти нове ім'я",
@@ -450,34 +560,45 @@
"Last job ran {relativeTime}." : "Останнє завдання виконано {relativeTime}.",
"Background job did not run yet!" : "Фонове завдання ще не виконано!",
"AJAX" : "AJAX",
+ "Execute one task with each page loaded. Use case: Single account instance." : "Виконувати по одному завданню при кожному завантаженні сторінки. Варіант використання: Один екземпляр облікового запису.",
"Webcron" : "Webcron",
+ "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 accounts depending on the usage)." : "cron.php зареєстровано на сервісі webcron, щоб викликати cron.php кожні 5 хвилин по HTTP. Варіант використання: Дуже маленький екземпляр (1-5 акаунтів залежно від використання).",
"Cron (Recommended)" : "Cron (рекомендовано)",
"Unable to update profile default setting" : "Не вдалося оновити стандартні налаштування профілю",
"Profile" : "Профіль",
"Enable or disable profile by default for new accounts." : "Увімкнути або вимкнути стандартний профіль для нових акаунтів.",
"Password confirmation is required" : "Необхідне підтвердження паролем",
"Failed to save setting" : "Не вдалося зберегти налаштування",
+ "{app}'s declarative setting field: {name}" : "Декларативне поле налаштувань {app}: {name}",
"Unable to update server side encryption config" : "Не вдалося оновити конфігурацію шифрування на стороні сервера",
"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." : "Шифрування на стороні сервера дозволяє шифрувати файли, завантажені на цей сервер. Це має свою ціну, таку як зниження продуктивності, тому ввімкніть його лише за потреби.",
+ "To encrypt all existing files run this OCC command:" : "Щоб зашифрувати всі наявні файли, запустіть цю команду OCC:",
"Enable server-side encryption" : "Увімкнути шифрування на сервері",
+ "Disabling server side encryption is only possible using OCC, please refer to the documentation." : "Вимкнення шифрування на стороні сервера можливе лише за допомогою OCC, будь ласка, зверніться до документації.",
"No encryption module loaded, please enable an encryption module in the app menu." : "Модуль шифрування не завантажено, увімкніть модуль шифрування в меню застосунку.",
"Select default encryption module:" : "Обрати стандартний модуль шифрування:",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Вам потрібно перенести ключі шифрування зі старого шифрування (ownCloud <= 8.0) на нове. Увімкніть \"Стандартний модуль шифрування\" та виконайте {command}",
"Cancel encryption" : "Скасувати шифрування",
"Enable encryption" : "Увімкнути шифрування",
+ "Confirm enabling encryption" : "Підтвердіть увімкнення шифрування",
"Please read carefully before activating 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." : "Після активації шифрування, всі файли завантажені на сервер з цього моменту, будуть зашифровані на сервері. Відключити шифрування пізніше можна буде тільки якщо активний модуль шифрування підтримує цю функцію, і при виконанні певних умов (наприклад, налаштований ключ відновлення).",
+ "By default a master key for the whole instance will be generated. Please check if that level of access is compliant with your needs." : "За замовчуванням буде згенеровано майстер-ключ для всього екземпляра. Будь ласка, перевірте, чи відповідає цей рівень доступу вашим потребам.",
"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." : "Саме по собі шифрування не гарантує безпеку системи. Будь ласка, перегляньте документацію, щоб отримати додаткову інформацію про те, як працює застосунок для шифрування, та про приклади його використання.",
"Be aware that encryption always increases the file size." : "Майте на увазі, що шифрування завжди збільшує розмір файлів.",
"It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Завжди корисно регулярно створювати резервні копії ваших даних, у разі шифрування обов’язково зробіть резервну копію ключів шифрування разом із вашими даними.",
+ "Refer to the admin documentation on how to manually also encrypt existing files." : "Зверніться до документації адміністратора, щоб дізнатися, як вручну зашифрувати наявні файли.",
"This is the final warning: Do you really want to enable encryption?" : "Це останнє попередження: Ви справді хочете ввімкнути шифрування?",
+ "Failed to delete group \"{group}\"" : "Не вдалося вилучити групу \"{group}\"",
"Please confirm the group removal" : "Підтвердіть вилучення групи",
+ "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "Ви збираєтеся видалити групу \"{group}\". Облікові записи НЕ будуть видалені.",
"Submit" : "Продовжити",
"Rename group" : "Перейменувати групу",
"Delete group" : "Вилучити групу",
"Current password" : "Поточний пароль",
"New password" : "Новий пароль",
+ "Change password" : "Змінити пароль",
"Choose your profile picture" : "Виберіть зображення профілю",
"Please select a valid png or jpg file" : "Виберіть дійсний файл png або jpg",
"Error setting profile picture" : "Помилка налаштування зображення профілю",
@@ -492,8 +613,11 @@
"Picture provided by original account" : "Картинка надана оригінальним обліковим записом",
"Set as profile picture" : "Установити як зображення профілю",
"Please note that it can take up to 24 hours for your profile picture to be updated everywhere." : "Зауважте, що повсюдне оновлення зображення профілю може зайняти до 24 годин.",
+ "Your biography. Markdown is supported." : "Про вас. Підтримується текстова розмітка.",
"Unable to update date of birth" : "Не вдалося оновити дату народження",
"Enter your date of birth" : "Зазначте дату вашого народження",
+ "You are using {s}{usage}{/s}" : "Ви використовуєте {s}{usage}{/s}",
+ "You are using {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})" : "Ви використовуєте {s}{usage}{/s} із {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})",
"You are a member of the following groups:" : "Ви є учасником груп:",
"Your full name" : "Ваше повне ім'я",
"Email options" : "Параметри електронної пошти",
@@ -535,6 +659,7 @@
"she/her" : "вона/їй",
"he/him" : "він/йому",
"they/them" : "вони/їм",
+ "Your pronouns. E.g. {pronounsExample}" : "Ваші займенники. Наприклад, {pronounsExample}",
"Your role" : "Ваша роль",
"Your X (formerly Twitter) handle" : "Ваш ідентифікатор в X (раніше відомій як Twitter)",
"Your website" : "Ваш сайт",
@@ -556,16 +681,19 @@
"Password change is disabled because the master key is disabled" : "Зміну пароля вимкнено, оскільки майстер-ключ відключений",
"No accounts" : "Відсутні користувачі",
"Loading accounts …" : "Завантаження облікових записів ...",
+ "List of accounts. This list is not fully rendered for performance reasons. The accounts will be rendered as you navigate through the list." : "Список акаунтів. Цей список не відображається повністю з міркувань продуктивності. Акаунти будуть відображатися в міру того, як ви будете переміщатися по списку.",
"Manager" : "Менеджер",
"Set line manager" : "Встановити безпосереднього начальника",
"Account name will be autogenerated" : "Ім'я користувача буде автоматично створено",
"Account name (required)" : "Ім'я користувача (обов'язково)",
+ "Failed to search groups" : "Не вдалося знайти групи",
"New account" : "Новий обліковий запис",
"Display name" : "Ім'я для показу",
"Either password or email is required" : "Потрібно зазначити або пароль, або адресу ел.пошти",
"Password (required)" : "Пароль (обов'язково)",
"Email (required)" : "Ел. пошта (обов'язково)",
"Email" : "E-mail",
+ "Member of the following groups (required)" : "Учасник таких груп (обов'язково)",
"Member of the following groups" : "Учасник(-ця) таких груп",
"Set account groups" : "Додати користувача до груп",
"Admin of the following groups" : "Адміністратор таких груп",
@@ -583,6 +711,7 @@
"Avatar" : "Світлина",
"Account name" : "Назва облікового запису",
"Group admin for" : "Адміністратор групи",
+ "Account backend" : "Внутрішня частина облікового запису",
"Storage location" : "Місце розташування сховища",
"First login" : "Перший вхід",
"Last login" : "Останній вхід",
@@ -597,11 +726,16 @@
"Remote wipe of devices" : "Віддалене стирання даних на пристрої",
"Wipe {userid}'s devices" : "Стерти пристрої {userid}",
"Wiped {userid}'s devices" : "Стерті пристрої {userid}",
+ "Failed to load groups with details" : "Не вдалося завантажити групи з деталями",
+ "Failed to load sub admin groups with details" : "Не вдалося завантажити групи під-адміністраторів з деталями",
+ "Failed to update line manager" : "Не вдалося оновити лінійного керівника",
"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 can't be empty" : "Пароль не може бути порожній",
"Password was successfully changed" : "Пароль успішно змінено",
+ "Email can't be empty" : "Адреса ел. пошти не може бути порожньою",
"Email was successfully changed" : "Адресу електронної пошти успішно змінено",
"Welcome mail sent!" : "Запрошення надіслано!",
"Loading account …" : "Завантаження облікового запису ...",
@@ -621,10 +755,12 @@
"Show language" : "Показувати мову",
"Show account backend" : "Показувати бекенд користувача",
"Show storage path" : "Показувати шлях до сховища даних",
+ "Show first login" : "Показати перший вхід",
"Show last login" : "Показувати останній вхід",
"Sorting" : "Впорядкування",
"The system config enforces sorting the groups by name. This also disables showing the member count." : "Системні наталаштування визначають впорядкування груп за іменем. Ці налаштування також вимикають лічильник учасників.",
"Group list sorting" : "Впорядкування списку груп",
+ "Sorting only applies to the currently loaded groups for performance reasons. Groups will be loaded as you navigate or search through the list." : "Сортування застосовується лише до поточно завантажених груп з міркувань продуктивності. Групи будуть завантажуватися під час навігації або пошуку в списку.",
"By member count" : "За лічильником учасників",
"By name" : "Зі ім'ям",
"Send email" : "Запрошення",
@@ -645,9 +781,11 @@
"Your browser does not support WebAuthn." : "Ваш браузер не підтримує WebAuthn.",
"As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Як адміністратор ви можете точно налаштувати поведінку спільного використання. Будь ласка, перегляньте документацію для отримання додаткової інформації.",
"You need to enable the File sharing App." : "Потрібно увімкнути застосунок для обміну файлами.",
+ "App Store" : "App Store",
"Loading app list" : "Завантаження переліку застосунків",
"Loading categories" : "Завантаження категорій",
"Developer documentation ↗" : "Документація розробника ↗",
+ "Version {version}, {license}-licensed" : "Версія {версія}, {ліцензія}-ліцензійний",
"Version {version}" : "Версія {version}",
"All accounts" : "Всі облікові записи",
"Admins" : "Адміністратори",
@@ -655,6 +793,7 @@
"Account management" : "Керування обліковими записами",
"Sending…" : "Надсилання...",
"Email sent" : "Лист надіслано",
+ "For performance reasons, when you enable encryption on a Nextcloud server only new and changed files are encrypted." : "З міркувань продуктивності, коли ви вмикаєте шифрування на сервері Nextcloud, шифруються лише нові та змінені файли.",
"Location" : "Місце розташування",
"Profile picture" : "Зображення користувача",
"About" : "Опис",
@@ -686,7 +825,11 @@
"Show to everyone" : "Показувати всім",
"Show to logged in accounts only" : "Показувати тільки для авторизованих",
"Hide" : "Сховати",
+ "Manually installed apps cannot be updated" : "Неможливо оновити програми, встановлені вручну",
+ "{progress}% Deploying …" : "{progress}% Розгортання ...",
+ "{progress}% Initializing …" : "{progress}% Ініціалізація ...",
"Health checking" : "Перевірка доступности",
+ "Deploy and Enable" : "Розгортання та активація",
"Download and enable" : "Звантажити та увімкнути",
"Disable" : "Вимкнути",
"Allow untested app" : "Дозволити непротестовані застосунки",
@@ -698,6 +841,7 @@
"Could not register device: Probably already registered" : "Не вдалося зареєструвати пристрій. Ймовірно, що його вже зареєстровано",
"Could not register device" : "Не вдалося зареєструвати пристрій",
"An error occurred during the request. Unable to proceed." : "Під час запиту сталася помилка. Неможливо продовжити.",
+ "The app has been enabled but needs to be updated." : "Додаток увімкнено, але його потрібно оновити.",
"Error: This app cannot be enabled because it makes the server unstable" : "Помилка: цю програму неможливо увімкнути, оскільки вона робить сервер нестабільним",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Застосунок активовано, але його потрібно оновити. Вас буде переспрямовано на сторінку оновлення через 5 секунд.",
"Do you really want to wipe your data from this device?" : "Ви справді хочете стерти дані з цього пристрою?",
@@ -706,6 +850,7 @@
"Error while wiping the device with the token" : "Помилка під час очищення пристрою за допомогою токена",
"Error while updating device token name" : "Помилка під час оновлення назви токена пристрою",
"Error while updating device token scope" : "Помилка під час оновлення області токена пристрою",
+ "Could not set group sorting" : "Не вдалося налаштувати групове сортування",
"There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Забагато запитів із вашої мережі. Повторіть спробу пізніше або зверніться до адміністратора, якщо це помилка.",
"Error" : "Помилка",
"Account documentation" : "Документація для користувача",
@@ -728,6 +873,7 @@
"Authentication" : "Авторизація",
"Authentication required" : "Потрібна авторизація",
"Credentials" : "Облікові дані",
+ "SMTP Login" : "Логін SMTP",
"SMTP Password" : "Пароль SMTP",
"Save" : "Зберегти",
"Test and verify email settings" : "Перевірити налаштування електронної пошти",
@@ -756,9 +902,12 @@
"The PHP memory limit is below the recommended value of %s." : "Обмеження пам'яті PHP нижче рекомендованого значення %s.",
"for WebAuthn passwordless login" : "для безпарольного входу за допомогою WebAuthn",
"for WebAuthn passwordless login, and SFTP storage" : "для безпарольного входу за допомогою WebAuthn та сховище SFTP",
+ "- The `%1$s` HTTP header does not contain `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "- HTTP-заголовок `%1$s` не містить `%2$s`. Це потенційний ризик для безпеки або конфіденційності, тому рекомендується змінити цей параметр відповідним чином.",
+ "PostgreSQL version \"%s\" detected. PostgreSQL >=12 and <=16 is suggested for best performance, stability and functionality with this version of Nextcloud." : "Виявлено версію PostgreSQL \"%s\". Рекомендується використовувати PostgreSQL >=12 та <=16 для найкращої продуктивності, стабільності та функціональності з цією версією Nextcloud.",
"Set default expiration date for shares" : "Встановити типовий термін дії для спільних ресурсів",
"Your biography" : "Коротко про себе",
"You are using <strong>{usage}</strong>" : "Ви використовуєте <strong>{usage}",
- "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Ви використовуєте <strong>{usage}</strong> із <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)"
+ "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Ви використовуєте <strong>{usage}</strong> із <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)",
+ "Failed to load subadmin groups with details" : "Не вдалося завантажити групи підадміністраторів з деталями"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/zh_HK.js b/apps/settings/l10n/zh_HK.js
index b5db984d060..fe433237b8e 100644
--- a/apps/settings/l10n/zh_HK.js
+++ b/apps/settings/l10n/zh_HK.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "用戶仍可截圖或錄製畫面。這並不能提供任何確切的保護。",
"Allow users to share via link and emails" : "允許用戶透過連結和電郵分享",
"Allow public uploads" : "允許公開上傳",
+ "Allow public shares to be added to other clouds by federation." : "允許透過聯邦方式將公開分享新增至其他雲端。",
+ "This will add share permissions to all newly created link shares." : "這將會為所有新建立的連結分享新增分享權限。",
"Always ask for a password" : "要求輸入密碼",
"Enforce password protection" : "強制密碼保護",
"Exclude groups from password requirements" : "從密碼要求中排除特定群組",
diff --git a/apps/settings/l10n/zh_HK.json b/apps/settings/l10n/zh_HK.json
index 4c0f6e21589..6e1088a9a7f 100644
--- a/apps/settings/l10n/zh_HK.json
+++ b/apps/settings/l10n/zh_HK.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "用戶仍可截圖或錄製畫面。這並不能提供任何確切的保護。",
"Allow users to share via link and emails" : "允許用戶透過連結和電郵分享",
"Allow public uploads" : "允許公開上傳",
+ "Allow public shares to be added to other clouds by federation." : "允許透過聯邦方式將公開分享新增至其他雲端。",
+ "This will add share permissions to all newly created link shares." : "這將會為所有新建立的連結分享新增分享權限。",
"Always ask for a password" : "要求輸入密碼",
"Enforce password protection" : "強制密碼保護",
"Exclude groups from password requirements" : "從密碼要求中排除特定群組",
diff --git a/apps/settings/l10n/zh_TW.js b/apps/settings/l10n/zh_TW.js
index 922d3ba25a4..503ec672c1e 100644
--- a/apps/settings/l10n/zh_TW.js
+++ b/apps/settings/l10n/zh_TW.js
@@ -370,6 +370,8 @@ OC.L10N.register(
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "使用者仍可截圖或錄製畫面。這並不能提供任何確切的保護。",
"Allow users to share via link and emails" : "允許使用者透過連結與電子郵件分享",
"Allow public uploads" : "允許公開上傳",
+ "Allow public shares to be added to other clouds by federation." : "允許透過聯邦方式將公開分享新增至其他雲端。",
+ "This will add share permissions to all newly created link shares." : "這將會為所有新建立的連結分享新增分享權限。",
"Always ask for a password" : "總是詢問密碼",
"Enforce password protection" : "強制密碼保護",
"Exclude groups from password requirements" : "排除特定群組的密碼要求",
diff --git a/apps/settings/l10n/zh_TW.json b/apps/settings/l10n/zh_TW.json
index 8d4cbc9dae0..23d6a3cc553 100644
--- a/apps/settings/l10n/zh_TW.json
+++ b/apps/settings/l10n/zh_TW.json
@@ -368,6 +368,8 @@
"Users will still be able to screenshot or record the screen. This does not provide any definitive protection." : "使用者仍可截圖或錄製畫面。這並不能提供任何確切的保護。",
"Allow users to share via link and emails" : "允許使用者透過連結與電子郵件分享",
"Allow public uploads" : "允許公開上傳",
+ "Allow public shares to be added to other clouds by federation." : "允許透過聯邦方式將公開分享新增至其他雲端。",
+ "This will add share permissions to all newly created link shares." : "這將會為所有新建立的連結分享新增分享權限。",
"Always ask for a password" : "總是詢問密碼",
"Enforce password protection" : "強制密碼保護",
"Exclude groups from password requirements" : "排除特定群組的密碼要求",
diff --git a/apps/settings/lib/Controller/AppSettingsController.php b/apps/settings/lib/Controller/AppSettingsController.php
index 3feb9c0326c..a85ee8cc20a 100644
--- a/apps/settings/lib/Controller/AppSettingsController.php
+++ b/apps/settings/lib/Controller/AppSettingsController.php
@@ -23,7 +23,6 @@ use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
-use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\JSONResponse;
@@ -45,7 +44,9 @@ use OCP\IL10N;
use OCP\INavigationManager;
use OCP\IRequest;
use OCP\IURLGenerator;
+use OCP\IUserSession;
use OCP\L10N\IFactory;
+use OCP\Security\RateLimiting\ILimiter;
use OCP\Server;
use OCP\Util;
use Psr\Log\LoggerInterface;
@@ -129,9 +130,8 @@ class AppSettingsController extends Controller {
* @param string $image
* @throws \Exception
*/
- #[PublicPage]
#[NoCSRFRequired]
- public function getAppDiscoverMedia(string $fileName): Response {
+ public function getAppDiscoverMedia(string $fileName, ILimiter $limiter, IUserSession $session): Response {
$getEtag = $this->discoverFetcher->getETag() ?? date('Y-m');
$etag = trim($getEtag, '"');
@@ -161,6 +161,26 @@ class AppSettingsController extends Controller {
$file = reset($file);
// If not found request from Web
if ($file === false) {
+ $user = $session->getUser();
+ // this route is not public thus we can assume a user is logged-in
+ assert($user !== null);
+ // Register a user request to throttle fetching external data
+ // this will prevent using the server for DoS of other systems.
+ $limiter->registerUserRequest(
+ 'settings-discover-media',
+ // allow up to 24 media requests per hour
+ // this should be a sane default when a completely new section is loaded
+ // keep in mind browsers request all files from a source-set
+ 24,
+ 60 * 60,
+ $user,
+ );
+
+ if (!$this->checkCanDownloadMedia($fileName)) {
+ $this->logger->warning('Tried to load media files for app discover section from untrusted source');
+ return new NotFoundResponse(Http::STATUS_BAD_REQUEST);
+ }
+
try {
$client = $this->clientService->newClient();
$fileResponse = $client->get($fileName);
@@ -182,6 +202,31 @@ class AppSettingsController extends Controller {
return $response;
}
+ private function checkCanDownloadMedia(string $filename): bool {
+ $urlInfo = parse_url($filename);
+ if (!isset($urlInfo['host']) || !isset($urlInfo['path'])) {
+ return false;
+ }
+
+ // Always allowed hosts
+ if ($urlInfo['host'] === 'nextcloud.com') {
+ return true;
+ }
+
+ // Hosts that need further verification
+ // Github is only allowed if from our organization
+ $ALLOWED_HOSTS = ['github.com', 'raw.githubusercontent.com'];
+ if (!in_array($urlInfo['host'], $ALLOWED_HOSTS)) {
+ return false;
+ }
+
+ if (str_starts_with($urlInfo['path'], '/nextcloud/') || str_starts_with($urlInfo['path'], '/nextcloud-gmbh/')) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* Remove orphaned folders from the image cache that do not match the current etag
* @param ISimpleFolder $folder The folder to clear
diff --git a/apps/settings/lib/SetupChecks/SupportedDatabase.php b/apps/settings/lib/SetupChecks/SupportedDatabase.php
index 31b907a825e..d083958d16e 100644
--- a/apps/settings/lib/SetupChecks/SupportedDatabase.php
+++ b/apps/settings/lib/SetupChecks/SupportedDatabase.php
@@ -21,7 +21,7 @@ use OCP\SetupCheck\SetupResult;
class SupportedDatabase implements ISetupCheck {
private const MIN_MARIADB = '10.6';
- private const MAX_MARIADB = '11.4';
+ private const MAX_MARIADB = '11.8';
private const MIN_MYSQL = '8.0';
private const MAX_MYSQL = '8.4';
private const MIN_POSTGRES = '13';
diff --git a/apps/settings/src/components/AppList/AppLevelBadge.vue b/apps/settings/src/components/AppList/AppLevelBadge.vue
index 900aa69b74a..8461f5eb6b9 100644
--- a/apps/settings/src/components/AppList/AppLevelBadge.vue
+++ b/apps/settings/src/components/AppList/AppLevelBadge.vue
@@ -15,7 +15,7 @@
<script setup lang="ts">
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
-import { mdiCheck, mdiStarShooting } from '@mdi/js'
+import { mdiCheck, mdiStarShootingOutline } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
import { computed } from 'vue'
@@ -28,7 +28,7 @@ const props = defineProps<{
const isSupported = computed(() => props.level === 300)
const isFeatured = computed(() => props.level === 200)
-const badgeIcon = computed(() => isSupported.value ? mdiStarShooting : mdiCheck)
+const badgeIcon = computed(() => isSupported.value ? mdiStarShootingOutline : mdiCheck)
const badgeText = computed(() => isSupported.value ? t('settings', 'Supported') : t('settings', 'Featured'))
const badgeTitle = computed(() => isSupported.value
? t('settings', 'This app is supported via your current Nextcloud subscription.')
diff --git a/apps/settings/src/components/AppNavigationGroupList.vue b/apps/settings/src/components/AppNavigationGroupList.vue
index 2be7cce2f8b..8f21d18d695 100644
--- a/apps/settings/src/components/AppNavigationGroupList.vue
+++ b/apps/settings/src/components/AppNavigationGroupList.vue
@@ -18,7 +18,7 @@
<template v-if="isAdminOrDelegatedAdmin" #actions>
<NcActionText>
<template #icon>
- <NcIconSvgWrapper :path="mdiAccountGroup" />
+ <NcIconSvgWrapper :path="mdiAccountGroupOutline" />
</template>
{{ t('settings', 'Create group') }}
</NcActionText>
@@ -60,7 +60,7 @@
import type CancelablePromise from 'cancelable-promise'
import type { IGroup } from '../views/user-types.d.ts'
-import { mdiAccountGroup, mdiPlus } from '@mdi/js'
+import { mdiAccountGroupOutline, mdiPlus } from '@mdi/js'
import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { useElementVisibility } from '@vueuse/core'
diff --git a/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue b/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue
index febc034514f..bb91940c763 100644
--- a/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue
+++ b/apps/settings/src/components/AppStoreDiscover/AppStoreDiscoverSection.vue
@@ -8,7 +8,7 @@
:name="t('settings', 'Nothing to show')"
:description="t('settings', 'Could not load section content from app store.')">
<template #icon>
- <NcIconSvgWrapper :path="mdiEyeOff" :size="64" />
+ <NcIconSvgWrapper :path="mdiEyeOffOutline" :size="64" />
</template>
</NcEmptyContent>
<NcEmptyContent v-else-if="elements.length === 0"
@@ -30,7 +30,7 @@
<script setup lang="ts">
import type { IAppDiscoverElements } from '../../constants/AppDiscoverTypes.ts'
-import { mdiEyeOff } from '@mdi/js'
+import { mdiEyeOffOutline } from '@mdi/js'
import { showError } from '@nextcloud/dialogs'
import { translate as t } from '@nextcloud/l10n'
import { generateUrl } from '@nextcloud/router'
diff --git a/apps/settings/src/components/AppStoreSidebar/AppDeployOptionsModal.vue b/apps/settings/src/components/AppStoreSidebar/AppDeployOptionsModal.vue
index 04c49827b02..67d4afa6566 100644
--- a/apps/settings/src/components/AppStoreSidebar/AppDeployOptionsModal.vue
+++ b/apps/settings/src/components/AppStoreSidebar/AppDeployOptionsModal.vue
@@ -65,7 +65,7 @@
style="margin-top: 6px;"
@click="removeMount(mount)">
<template #icon>
- <NcIconSvgWrapper :path="mdiDelete" />
+ <NcIconSvgWrapper :path="mdiDeleteOutline" />
</template>
</NcButton>
</div>
@@ -160,7 +160,7 @@ import NcButton from '@nextcloud/vue/components/NcButton'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
-import { mdiPlus, mdiCheck, mdiClose, mdiDelete } from '@mdi/js'
+import { mdiPlus, mdiCheck, mdiClose, mdiDeleteOutline } from '@mdi/js'
import { useAppApiStore } from '../../store/app-api-store.ts'
import { useAppsStore } from '../../store/apps-store.ts'
@@ -216,7 +216,7 @@ export default {
mdiPlus,
mdiCheck,
mdiClose,
- mdiDelete,
+ mdiDeleteOutline,
}
},
data() {
diff --git a/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue b/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue
index 3aa42f1d15a..8a387b55ecf 100644
--- a/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue
+++ b/apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue
@@ -8,7 +8,7 @@
:name="t('settings', 'Details')"
:order="1">
<template #icon>
- <NcIconSvgWrapper :path="mdiTextBox" />
+ <NcIconSvgWrapper :path="mdiTextBoxOutline" />
</template>
<div class="app-details">
<div class="app-details__actions">
@@ -82,7 +82,7 @@
type="secondary"
@click="() => showDeployOptionsModal = true">
<template #icon>
- <NcIconSvgWrapper :path="mdiToyBrickPlus" />
+ <NcIconSvgWrapper :path="mdiToyBrickPlusOutline" />
</template>
{{ t('settings', 'Deploy options') }}
</NcButton>
@@ -162,7 +162,7 @@
:aria-label="t('settings', 'Report a bug')"
:title="t('settings', 'Report a bug')">
<template #icon>
- <NcIconSvgWrapper :path="mdiBug" />
+ <NcIconSvgWrapper :path="mdiBugOutline" />
</template>
</NcButton>
<NcButton :disabled="!app.bugs"
@@ -170,7 +170,7 @@
:aria-label="t('settings', 'Request feature')"
:title="t('settings', 'Request feature')">
<template #icon>
- <NcIconSvgWrapper :path="mdiFeatureSearch" />
+ <NcIconSvgWrapper :path="mdiFeatureSearchOutline" />
</template>
</NcButton>
<NcButton v-if="app.appstoreData?.discussion"
@@ -178,7 +178,7 @@
:aria-label="t('settings', 'Ask questions or discuss')"
:title="t('settings', 'Ask questions or discuss')">
<template #icon>
- <NcIconSvgWrapper :path="mdiTooltipQuestion" />
+ <NcIconSvgWrapper :path="mdiTooltipQuestionOutline" />
</template>
</NcButton>
<NcButton v-if="!app.internal"
@@ -209,7 +209,7 @@ import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwit
import AppDeployOptionsModal from './AppDeployOptionsModal.vue'
import AppManagement from '../../mixins/AppManagement.js'
-import { mdiBug, mdiFeatureSearch, mdiStar, mdiTextBox, mdiTooltipQuestion, mdiToyBrickPlus } from '@mdi/js'
+import { mdiBugOutline, mdiFeatureSearchOutline, mdiStar, mdiTextBoxOutline, mdiTooltipQuestionOutline, mdiToyBrickPlusOutline } from '@mdi/js'
import { useAppsStore } from '../../store/apps-store'
import { useAppApiStore } from '../../store/app-api-store'
@@ -242,12 +242,12 @@ export default {
store,
appApiStore,
- mdiBug,
- mdiFeatureSearch,
+ mdiBugOutline,
+ mdiFeatureSearchOutline,
mdiStar,
- mdiTextBox,
- mdiTooltipQuestion,
- mdiToyBrickPlus,
+ mdiTextBoxOutline,
+ mdiTooltipQuestionOutline,
+ mdiToyBrickPlusOutline,
}
},
diff --git a/apps/settings/src/components/AuthToken.vue b/apps/settings/src/components/AuthToken.vue
index 6f3e931d1b9..15286adb135 100644
--- a/apps/settings/src/components/AuthToken.vue
+++ b/apps/settings/src/components/AuthToken.vue
@@ -80,7 +80,7 @@
import type { PropType } from 'vue'
import type { IToken } from '../store/authtoken'
-import { mdiCheck, mdiCellphone, mdiTablet, mdiMonitor, mdiWeb, mdiKey, mdiMicrosoftEdge, mdiFirefox, mdiGoogleChrome, mdiAppleSafari, mdiAndroid, mdiAppleIos } from '@mdi/js'
+import { mdiCheck, mdiCellphone, mdiTablet, mdiMonitor, mdiWeb, mdiKeyOutline, mdiMicrosoftEdge, mdiFirefox, mdiGoogleChrome, mdiAppleSafari, mdiAndroid, mdiAppleIos } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
import { TokenType, useAuthTokenStore } from '../store/authtoken.ts'
@@ -215,7 +215,7 @@ export default defineComponent({
tokenIcon() {
// For custom created app tokens / app passwords
if (this.token.type === TokenType.PERMANENT_TOKEN) {
- return mdiKey
+ return mdiKeyOutline
}
switch (this.client?.id) {
diff --git a/apps/settings/src/components/GroupListItem.vue b/apps/settings/src/components/GroupListItem.vue
index 76088fa74db..69bb8a3f575 100644
--- a/apps/settings/src/components/GroupListItem.vue
+++ b/apps/settings/src/components/GroupListItem.vue
@@ -80,9 +80,9 @@ import NcCounterBubble from '@nextcloud/vue/components/NcCounterBubble'
import NcModal from '@nextcloud/vue/components/NcModal'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
-import AccountGroup from 'vue-material-design-icons/AccountGroup.vue'
-import Delete from 'vue-material-design-icons/Delete.vue'
-import Pencil from 'vue-material-design-icons/Pencil.vue'
+import AccountGroup from 'vue-material-design-icons/AccountGroupOutline.vue'
+import Delete from 'vue-material-design-icons/DeleteOutline.vue'
+import Pencil from 'vue-material-design-icons/PencilOutline.vue'
import { showError } from '@nextcloud/dialogs'
diff --git a/apps/settings/src/components/PersonalInfo/AvatarSection.vue b/apps/settings/src/components/PersonalInfo/AvatarSection.vue
index 400ccb510f3..a99f228668c 100644
--- a/apps/settings/src/components/PersonalInfo/AvatarSection.vue
+++ b/apps/settings/src/components/PersonalInfo/AvatarSection.vue
@@ -88,7 +88,7 @@ import 'cropperjs/dist/cropper.css'
import Upload from 'vue-material-design-icons/Upload.vue'
import Folder from 'vue-material-design-icons/Folder.vue'
-import Delete from 'vue-material-design-icons/Delete.vue'
+import Delete from 'vue-material-design-icons/DeleteOutline.vue'
import HeaderBar from './shared/HeaderBar.vue'
import { NAME_READABLE_ENUM } from '../../constants/AccountPropertyConstants.js'
diff --git a/apps/settings/src/components/PersonalInfo/DetailsSection.vue b/apps/settings/src/components/PersonalInfo/DetailsSection.vue
index b0eb137d9e5..d4bb0ce16ec 100644
--- a/apps/settings/src/components/PersonalInfo/DetailsSection.vue
+++ b/apps/settings/src/components/PersonalInfo/DetailsSection.vue
@@ -36,7 +36,7 @@ import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
-import Account from 'vue-material-design-icons/Account.vue'
+import Account from 'vue-material-design-icons/AccountOutline.vue'
import CircleSlice from 'vue-material-design-icons/CircleSlice3.vue'
import HeaderBar from './shared/HeaderBar.vue'
diff --git a/apps/settings/src/components/PersonalInfo/EmailSection/Email.vue b/apps/settings/src/components/PersonalInfo/EmailSection/Email.vue
index de6114b57bc..6a6baef8817 100644
--- a/apps/settings/src/components/PersonalInfo/EmailSection/Email.vue
+++ b/apps/settings/src/components/PersonalInfo/EmailSection/Email.vue
@@ -48,7 +48,7 @@
:disabled="deleteDisabled"
@click="deleteEmail">
<template #icon>
- <NcIconSvgWrapper :path="mdiTrashCan" />
+ <NcIconSvgWrapper :path="mdiTrashCanOutline" />
</template>
{{ deleteEmailLabel }}
</NcActionButton>
@@ -71,7 +71,7 @@ import NcTextField from '@nextcloud/vue/components/NcTextField'
import debounce from 'debounce'
-import { mdiArrowLeft, mdiLock, mdiStar, mdiStarOutline, mdiTrashCan } from '@mdi/js'
+import { mdiArrowLeft, mdiLockOutline, mdiStar, mdiStarOutline, mdiTrashCanOutline } from '@mdi/js'
import FederationControl from '../shared/FederationControl.vue'
import { handleError } from '../../../utils/handlers.ts'
@@ -133,10 +133,10 @@ export default {
setup() {
return {
mdiArrowLeft,
- mdiLock,
+ mdiLockOutline,
mdiStar,
mdiStarOutline,
- mdiTrashCan,
+ mdiTrashCanOutline,
saveAdditionalEmailScope,
}
},
diff --git a/apps/settings/src/components/UserList.vue b/apps/settings/src/components/UserList.vue
index 84c204805cc..459548fad26 100644
--- a/apps/settings/src/components/UserList.vue
+++ b/apps/settings/src/components/UserList.vue
@@ -19,7 +19,7 @@
<NcLoadingIcon v-if="isInitialLoad && loading.users"
:name="t('settings', 'Loading accounts …')"
:size="64" />
- <NcIconSvgWrapper v-else :path="mdiAccountGroup" :size="64" />
+ <NcIconSvgWrapper v-else :path="mdiAccountGroupOutline" :size="64" />
</template>
</NcEmptyContent>
@@ -58,7 +58,7 @@
</template>
<script>
-import { mdiAccountGroup } from '@mdi/js'
+import { mdiAccountGroupOutline } from '@mdi/js'
import { showError } from '@nextcloud/dialogs'
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
import { Fragment } from 'vue-frag'
@@ -120,7 +120,7 @@ export default {
setup() {
// non reactive properties
return {
- mdiAccountGroup,
+ mdiAccountGroupOutline,
rowHeight: 55,
UserRow,
diff --git a/apps/settings/src/components/Users/UserRowActions.vue b/apps/settings/src/components/Users/UserRowActions.vue
index 8e30d584dfd..efd70d879a7 100644
--- a/apps/settings/src/components/Users/UserRowActions.vue
+++ b/apps/settings/src/components/Users/UserRowActions.vue
@@ -39,7 +39,7 @@ import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActions from '@nextcloud/vue/components/NcActions'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import SvgCheck from '@mdi/svg/svg/check.svg?raw'
-import SvgPencil from '@mdi/svg/svg/pencil.svg?raw'
+import SvgPencil from '@mdi/svg/svg/pencil-outline.svg?raw'
interface UserAction {
action: (event: MouseEvent, user: Record<string, unknown>) => void,
diff --git a/apps/settings/src/constants/AccountPropertyConstants.ts b/apps/settings/src/constants/AccountPropertyConstants.ts
index 5ea15e05c6c..455c210976f 100644
--- a/apps/settings/src/constants/AccountPropertyConstants.ts
+++ b/apps/settings/src/constants/AccountPropertyConstants.ts
@@ -7,7 +7,7 @@
* SYNC to be kept in sync with `lib/public/Accounts/IAccountManager.php`
*/
-import { mdiAccountGroup, mdiCellphone, mdiLock, mdiWeb } from '@mdi/js'
+import { mdiAccountGroupOutline, mdiCellphone, mdiLockOutline, mdiWeb } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
/** Enum of account properties */
@@ -171,14 +171,14 @@ export const SCOPE_PROPERTY_ENUM = Object.freeze({
displayName: t('settings', 'Local'),
tooltip: t('settings', 'Only visible to people on this instance and guests'),
// tooltipDisabled is not required here as this scope is supported by all account properties
- icon: mdiLock,
+ icon: mdiLockOutline,
},
[SCOPE_ENUM.FEDERATED]: {
name: SCOPE_ENUM.FEDERATED,
displayName: t('settings', 'Federated'),
tooltip: t('settings', 'Only synchronize to trusted servers'),
tooltipDisabled: t('settings', 'Not available as federation has been disabled for your account, contact your system administration if you have any questions'),
- icon: mdiAccountGroup,
+ icon: mdiAccountGroupOutline,
},
[SCOPE_ENUM.PUBLISHED]: {
name: SCOPE_ENUM.PUBLISHED,
diff --git a/apps/settings/src/constants/AppstoreCategoryIcons.ts b/apps/settings/src/constants/AppstoreCategoryIcons.ts
index 7e7e00df9b0..24bb0faea6d 100644
--- a/apps/settings/src/constants/AppstoreCategoryIcons.ts
+++ b/apps/settings/src/constants/AppstoreCategoryIcons.ts
@@ -3,29 +3,29 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import {
- mdiAccount,
- mdiAccountMultiple,
- mdiArchive,
+ mdiAccountOutline,
+ mdiAccountMultipleOutline,
+ mdiArchiveOutline,
mdiCheck,
- mdiClipboardFlow,
+ mdiClipboardFlowOutline,
mdiClose,
- mdiCog,
- mdiControllerClassic,
+ mdiCogOutline,
+ mdiControllerClassicOutline,
mdiDownload,
mdiFileDocumentEdit,
mdiFolder,
- mdiKey,
+ mdiKeyOutline,
mdiMagnify,
mdiMonitorEye,
mdiMultimedia,
- mdiOfficeBuilding,
+ mdiOfficeBuildingOutline,
mdiOpenInApp,
mdiSecurity,
mdiStar,
mdiStarCircleOutline,
- mdiStarShooting,
+ mdiStarShootingOutline,
mdiTools,
- mdiViewColumn,
+ mdiViewColumnOutline,
} from '@mdi/js'
/**
@@ -34,28 +34,28 @@ import {
export default Object.freeze({
// system special categories
discover: mdiStarCircleOutline,
- installed: mdiAccount,
+ installed: mdiAccountOutline,
enabled: mdiCheck,
disabled: mdiClose,
- bundles: mdiArchive,
- supported: mdiStarShooting,
+ bundles: mdiArchiveOutline,
+ supported: mdiStarShootingOutline,
featured: mdiStar,
updates: mdiDownload,
// generic categories
- auth: mdiKey,
- customization: mdiCog,
- dashboard: mdiViewColumn,
+ auth: mdiKeyOutline,
+ customization: mdiCogOutline,
+ dashboard: mdiViewColumnOutline,
files: mdiFolder,
- games: mdiControllerClassic,
+ games: mdiControllerClassicOutline,
integration: mdiOpenInApp,
monitoring: mdiMonitorEye,
multimedia: mdiMultimedia,
office: mdiFileDocumentEdit,
- organization: mdiOfficeBuilding,
+ organization: mdiOfficeBuildingOutline,
search: mdiMagnify,
security: mdiSecurity,
- social: mdiAccountMultiple,
+ social: mdiAccountMultipleOutline,
tools: mdiTools,
- workflow: mdiClipboardFlow,
+ workflow: mdiClipboardFlowOutline,
})
diff --git a/apps/settings/src/views/UserManagementNavigation.vue b/apps/settings/src/views/UserManagementNavigation.vue
index df3670bcfc7..95a12ac7c51 100644
--- a/apps/settings/src/views/UserManagementNavigation.vue
+++ b/apps/settings/src/views/UserManagementNavigation.vue
@@ -22,7 +22,7 @@
:name="t('settings', 'All accounts')"
:to="{ name: 'users' }">
<template #icon>
- <NcIconSvgWrapper :path="mdiAccount" />
+ <NcIconSvgWrapper :path="mdiAccountOutline" />
</template>
<template #counter>
<NcCounterBubble v-if="userCount" :type="!selectedGroupDecoded ? 'highlighted' : undefined">
@@ -37,7 +37,7 @@
:name="t('settings', 'Admins')"
:to="{ name: 'group', params: { selectedGroup: 'admin' } }">
<template #icon>
- <NcIconSvgWrapper :path="mdiShieldAccount" />
+ <NcIconSvgWrapper :path="mdiShieldAccountOutline" />
</template>
<template #counter>
<NcCounterBubble v-if="adminGroup && adminGroup.count > 0"
@@ -70,7 +70,7 @@
:name="t('settings', 'Disabled accounts')"
:to="{ name: 'group', params: { selectedGroup: 'disabled' } }">
<template #icon>
- <NcIconSvgWrapper :path="mdiAccountOff" />
+ <NcIconSvgWrapper :path="mdiAccountOffOutline" />
</template>
<template v-if="disabledGroup.usercount > 0" #counter>
<NcCounterBubble :type="selectedGroupDecoded === 'disabled' ? 'highlighted' : undefined">
@@ -87,7 +87,7 @@
type="tertiary"
@click="isDialogOpen = true">
<template #icon>
- <NcIconSvgWrapper :path="mdiCog" />
+ <NcIconSvgWrapper :path="mdiCogOutline" />
</template>
{{ t('settings', 'Account management settings') }}
</NcButton>
@@ -97,7 +97,7 @@
</template>
<script setup lang="ts">
-import { mdiAccount, mdiAccountOff, mdiCog, mdiPlus, mdiShieldAccount, mdiHistory } from '@mdi/js'
+import { mdiAccountOutline, mdiAccountOffOutline, mdiCogOutline, mdiPlus, mdiShieldAccountOutline, mdiHistory } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
import { computed, ref } from 'vue'
diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php
index 16a13786ea1..d28f7c51327 100644
--- a/apps/sharebymail/lib/ShareByMailProvider.php
+++ b/apps/sharebymail/lib/ShareByMailProvider.php
@@ -637,11 +637,6 @@ class ShareByMailProvider extends DefaultShareProvider implements IShareProvider
return $token;
}
- /**
- * Get all children of this share
- *
- * @return IShare[]
- */
public function getChildren(IShare $parent): array {
$children = [];
diff --git a/apps/systemtags/l10n/uk.js b/apps/systemtags/l10n/uk.js
index 0911b417f0d..18e8406193e 100644
--- a/apps/systemtags/l10n/uk.js
+++ b/apps/systemtags/l10n/uk.js
@@ -44,6 +44,7 @@ OC.L10N.register(
"tagged %s" : "позначено міткою %s",
"Collaborative tags" : "Спільні мітки",
"Collaborative tagging functionality which shares tags among people." : "Функціональність спільних міток дозволяє надавати у спільний доступ мітки.",
+ "Collaborative tagging functionality which shares tags among people. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Функція спільного тегування, яка дозволяє ділитися тегами між користувачами. Чудово підходить для команд.\n\t(Якщо ви є постачальником послуг з багатокористувацькою інсталяцією, рекомендуємо деактивувати цей додаток, оскільки теги є спільними.)",
"Public" : "Публічна",
"Restricted" : "Обмежена",
"Invisible" : "Невидима",
@@ -64,24 +65,39 @@ OC.L10N.register(
"Delete" : "Вилучити",
"Reset" : "Скидання",
"Loading …" : "Завантаження …",
+ "_{tag1} will be set and {tag2} will be removed from 1 file._::_{tag1} will be set and {tag2} will be removed from {count} files._" : ["{tag1} буде встановлено та {tag2} буде видалено для 1 файлу.","{tag1} буде встановлено та {tag2} буде видалено для {count} файлів.","{tag1} буде встановлено та {tag2} буде видалено для {count} файлів.","{tag1} буде встановлено та {tag2} буде видалено для {count} файлів."],
+ "_{tag} will be set to 1 file._::_{tag} will be set to {count} files._" : ["{tag} буде встановлено для 1 файлу.","{tag} буде встановлено для {count} файлів.","{tag} буде встановлено для {count} файлів.","{tag} буде встановлено для {count} файлів."],
+ "_{tag} will be removed from 1 file._::_{tag} will be removed from {count} files._" : ["{tag} буде видалено з 1 файлу.","{tag} буде видалено з {count} файлів.","{tag} буде видалено з {count} файлів.","{tag} буде видалено з {count} файлів."],
+ "_{tags} and {lastTag} will be set to 1 file._::_{tags} and {lastTag} will be set to {count} files._" : ["{tags} і {lastTag} буде встановлено для 1 файлу.","{tags} і {lastTag} буде встановлено для {count} файлів.","{tags} і {lastTag} буде встановлено для {count} файлів.","{tags} і {lastTag} буде встановлено для {count} файлів."],
+ "_{tags} and {lastTag} will be removed from 1 file._::_{tags} and {lastTag} will be removed from {count} files._" : ["{tags} і {lastTag} буде видалено для 1 файлу.","{tags} і {lastTag} буде видалено для {count} файлів.","{tags} і {lastTag} буде видалено для {count} файлів.","{tags} і {lastTag} буде видалено для {count} файлів."],
"{displayName} (hidden)" : "{displayName} (приховано)",
"{displayName} (restricted)" : "{displayName} (обмежено)",
+ "Only admins can create new tags" : "Тільки адміністратори можуть створювати нові теги",
"Failed to apply tags changes" : "Не вдалося застосувати зміни до міток",
"File tags modification canceled" : "Скасовано зміни до міток файлів",
"Manage tags" : "Керування мітками",
"Applying tags changes…" : "Застосування змін до міток...",
"Search or create tag" : "Шукати або створити мітку",
+ "Search tag" : "Шукати мітку",
"Change tag color" : "Змінити колір мітки",
"Create new tag" : "Створити нову мітку",
"Select or create tags to apply to all selected files" : "Застосувати до всіх вибраних файлів шукати або створити мітки",
+ "Select tags to apply to all selected files" : "Виберіть теги, які потрібно застосувати до всіх вибраних файлів",
"Cancel" : "Скасувати",
"Apply changes" : "Застосувати зміни",
"Failed to load tags" : "Не вдалося завантажити мітки",
"Failed to load selected tags" : "Не вдалося завантажити вибрані мітки",
"Failed to select tag" : "Не вдалося вибрати мітку",
+ "System admin disabled tag creation. You can only use existing ones." : "Системний адміністратор вимкнув створення тегів. Ви можете використовувати тільки наявні.",
"Loading collaborative tags …" : "Завантажую спільні мітки ...",
"Search or create collaborative tags" : "Пошук або створення спільних міток",
"No tags to select, type to create a new tag" : "Немає міток для вибору, почніть вводити, щоб додати нову мітку",
+ "Unable to update setting" : "Не вдалося оновити налаштування",
+ "System tag creation is now restricted to administrators" : "Створення системних тегів тепер обмежено адміністраторами",
+ "System tag creation is now allowed for everybody" : "Створення системних тегів тепер дозволено для всіх",
+ "System tag management" : "Управління тегами системи",
+ "If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files." : "Якщо ця функція увімкнена, створювати та редагувати теги можуть лише адміністратори. Користувачі можуть як і раніше присвоювати та видаляти теги з файлів.",
+ "Restrict tag creation and editing to administrators" : "Обмежити створення та редагування тегів адміністраторами",
"Collaborative tags are available for all users. Restricted tags are visible to users but cannot be assigned by them. Invisible tags are for internal use, since users cannot see or assign them." : "Спільні мітки доступні для всіх користувачів. Заборонені мітки видимі для користувачів, але вони не можуть їх призначити. Невидимі мітки призначені для внутрішнього використання, оскільки користувачі не можуть бачити або призначати їх.",
"Assigned collaborative tags" : "Призначені спільні мітки",
"Open in Files" : "Відкрити у Файлах",
diff --git a/apps/systemtags/l10n/uk.json b/apps/systemtags/l10n/uk.json
index a908c34bb7a..bfd794fb32c 100644
--- a/apps/systemtags/l10n/uk.json
+++ b/apps/systemtags/l10n/uk.json
@@ -42,6 +42,7 @@
"tagged %s" : "позначено міткою %s",
"Collaborative tags" : "Спільні мітки",
"Collaborative tagging functionality which shares tags among people." : "Функціональність спільних міток дозволяє надавати у спільний доступ мітки.",
+ "Collaborative tagging functionality which shares tags among people. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Функція спільного тегування, яка дозволяє ділитися тегами між користувачами. Чудово підходить для команд.\n\t(Якщо ви є постачальником послуг з багатокористувацькою інсталяцією, рекомендуємо деактивувати цей додаток, оскільки теги є спільними.)",
"Public" : "Публічна",
"Restricted" : "Обмежена",
"Invisible" : "Невидима",
@@ -62,24 +63,39 @@
"Delete" : "Вилучити",
"Reset" : "Скидання",
"Loading …" : "Завантаження …",
+ "_{tag1} will be set and {tag2} will be removed from 1 file._::_{tag1} will be set and {tag2} will be removed from {count} files._" : ["{tag1} буде встановлено та {tag2} буде видалено для 1 файлу.","{tag1} буде встановлено та {tag2} буде видалено для {count} файлів.","{tag1} буде встановлено та {tag2} буде видалено для {count} файлів.","{tag1} буде встановлено та {tag2} буде видалено для {count} файлів."],
+ "_{tag} will be set to 1 file._::_{tag} will be set to {count} files._" : ["{tag} буде встановлено для 1 файлу.","{tag} буде встановлено для {count} файлів.","{tag} буде встановлено для {count} файлів.","{tag} буде встановлено для {count} файлів."],
+ "_{tag} will be removed from 1 file._::_{tag} will be removed from {count} files._" : ["{tag} буде видалено з 1 файлу.","{tag} буде видалено з {count} файлів.","{tag} буде видалено з {count} файлів.","{tag} буде видалено з {count} файлів."],
+ "_{tags} and {lastTag} will be set to 1 file._::_{tags} and {lastTag} will be set to {count} files._" : ["{tags} і {lastTag} буде встановлено для 1 файлу.","{tags} і {lastTag} буде встановлено для {count} файлів.","{tags} і {lastTag} буде встановлено для {count} файлів.","{tags} і {lastTag} буде встановлено для {count} файлів."],
+ "_{tags} and {lastTag} will be removed from 1 file._::_{tags} and {lastTag} will be removed from {count} files._" : ["{tags} і {lastTag} буде видалено для 1 файлу.","{tags} і {lastTag} буде видалено для {count} файлів.","{tags} і {lastTag} буде видалено для {count} файлів.","{tags} і {lastTag} буде видалено для {count} файлів."],
"{displayName} (hidden)" : "{displayName} (приховано)",
"{displayName} (restricted)" : "{displayName} (обмежено)",
+ "Only admins can create new tags" : "Тільки адміністратори можуть створювати нові теги",
"Failed to apply tags changes" : "Не вдалося застосувати зміни до міток",
"File tags modification canceled" : "Скасовано зміни до міток файлів",
"Manage tags" : "Керування мітками",
"Applying tags changes…" : "Застосування змін до міток...",
"Search or create tag" : "Шукати або створити мітку",
+ "Search tag" : "Шукати мітку",
"Change tag color" : "Змінити колір мітки",
"Create new tag" : "Створити нову мітку",
"Select or create tags to apply to all selected files" : "Застосувати до всіх вибраних файлів шукати або створити мітки",
+ "Select tags to apply to all selected files" : "Виберіть теги, які потрібно застосувати до всіх вибраних файлів",
"Cancel" : "Скасувати",
"Apply changes" : "Застосувати зміни",
"Failed to load tags" : "Не вдалося завантажити мітки",
"Failed to load selected tags" : "Не вдалося завантажити вибрані мітки",
"Failed to select tag" : "Не вдалося вибрати мітку",
+ "System admin disabled tag creation. You can only use existing ones." : "Системний адміністратор вимкнув створення тегів. Ви можете використовувати тільки наявні.",
"Loading collaborative tags …" : "Завантажую спільні мітки ...",
"Search or create collaborative tags" : "Пошук або створення спільних міток",
"No tags to select, type to create a new tag" : "Немає міток для вибору, почніть вводити, щоб додати нову мітку",
+ "Unable to update setting" : "Не вдалося оновити налаштування",
+ "System tag creation is now restricted to administrators" : "Створення системних тегів тепер обмежено адміністраторами",
+ "System tag creation is now allowed for everybody" : "Створення системних тегів тепер дозволено для всіх",
+ "System tag management" : "Управління тегами системи",
+ "If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files." : "Якщо ця функція увімкнена, створювати та редагувати теги можуть лише адміністратори. Користувачі можуть як і раніше присвоювати та видаляти теги з файлів.",
+ "Restrict tag creation and editing to administrators" : "Обмежити створення та редагування тегів адміністраторами",
"Collaborative tags are available for all users. Restricted tags are visible to users but cannot be assigned by them. Invisible tags are for internal use, since users cannot see or assign them." : "Спільні мітки доступні для всіх користувачів. Заборонені мітки видимі для користувачів, але вони не можуть їх призначити. Невидимі мітки призначені для внутрішнього використання, оскільки користувачі не можуть бачити або призначати їх.",
"Assigned collaborative tags" : "Призначені спільні мітки",
"Open in Files" : "Відкрити у Файлах",
diff --git a/apps/systemtags/src/components/SystemTagPicker.vue b/apps/systemtags/src/components/SystemTagPicker.vue
index 9a3b8e19b68..377e76ed75f 100644
--- a/apps/systemtags/src/components/SystemTagPicker.vue
+++ b/apps/systemtags/src/components/SystemTagPicker.vue
@@ -148,9 +148,9 @@ import NcTextField from '@nextcloud/vue/components/NcTextField'
import CheckIcon from 'vue-material-design-icons/CheckCircle.vue'
import CircleIcon from 'vue-material-design-icons/Circle.vue'
import CircleOutlineIcon from 'vue-material-design-icons/CircleOutline.vue'
-import PencilIcon from 'vue-material-design-icons/Pencil.vue'
+import PencilIcon from 'vue-material-design-icons/PencilOutline.vue'
import PlusIcon from 'vue-material-design-icons/Plus.vue'
-import TagIcon from 'vue-material-design-icons/Tag.vue'
+import TagIcon from 'vue-material-design-icons/TagOutline.vue'
import { createTag, fetchTag, fetchTags, getTagObjects, setTagObjects, updateTag } from '../services/api.ts'
import { elementColor, invertTextColor, isDarkModeEnabled } from '../utils/colorUtils.ts'
diff --git a/apps/systemtags/src/files_actions/bulkSystemTagsAction.ts b/apps/systemtags/src/files_actions/bulkSystemTagsAction.ts
index 0f33650d588..7dfe90a1527 100644
--- a/apps/systemtags/src/files_actions/bulkSystemTagsAction.ts
+++ b/apps/systemtags/src/files_actions/bulkSystemTagsAction.ts
@@ -10,7 +10,7 @@ import { isPublicShare } from '@nextcloud/sharing/public'
import { spawnDialog } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
-import TagMultipleSvg from '@mdi/svg/svg/tag-multiple.svg?raw'
+import TagMultipleSvg from '@mdi/svg/svg/tag-multiple-outline.svg?raw'
/**
* Spawn a dialog to add or remove tags from multiple nodes.
diff --git a/apps/systemtags/src/files_views/systemtagsView.ts b/apps/systemtags/src/files_views/systemtagsView.ts
index 46e5af6c3c1..624d2036802 100644
--- a/apps/systemtags/src/files_views/systemtagsView.ts
+++ b/apps/systemtags/src/files_views/systemtagsView.ts
@@ -7,7 +7,7 @@ import { translate as t } from '@nextcloud/l10n'
import { View, getNavigation } from '@nextcloud/files'
import { getContents } from '../services/systemtags.js'
-import svgTagMultiple from '@mdi/svg/svg/tag-multiple.svg?raw'
+import svgTagMultiple from '@mdi/svg/svg/tag-multiple-outline.svg?raw'
export const systemTagsViewId = 'tags'
diff --git a/apps/theming/src/components/BackgroundSettings.vue b/apps/theming/src/components/BackgroundSettings.vue
index ce4489138ff..58b76dd9602 100644
--- a/apps/theming/src/components/BackgroundSettings.vue
+++ b/apps/theming/src/components/BackgroundSettings.vue
@@ -87,7 +87,7 @@ import NcColorPicker from '@nextcloud/vue/components/NcColorPicker'
import Check from 'vue-material-design-icons/Check.vue'
import ImageEdit from 'vue-material-design-icons/ImageEdit.vue'
-import ColorPalette from 'vue-material-design-icons/Palette.vue'
+import ColorPalette from 'vue-material-design-icons/PaletteOutline.vue'
const shippedBackgroundList = loadState('theming', 'shippedBackgrounds')
const backgroundImage = loadState('theming', 'userBackgroundImage')
diff --git a/apps/theming/src/components/UserPrimaryColor.vue b/apps/theming/src/components/UserPrimaryColor.vue
index 462ce43e997..f10b8a01825 100644
--- a/apps/theming/src/components/UserPrimaryColor.vue
+++ b/apps/theming/src/components/UserPrimaryColor.vue
@@ -38,7 +38,7 @@ import debounce from 'debounce'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcColorPicker from '@nextcloud/vue/components/NcColorPicker'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
-import IconColorPalette from 'vue-material-design-icons/Palette.vue'
+import IconColorPalette from 'vue-material-design-icons/PaletteOutline.vue'
import IconUndo from 'vue-material-design-icons/UndoVariant.vue'
const { primaryColor, defaultPrimaryColor } = loadState('theming', 'data', { primaryColor: '#0082c9', defaultPrimaryColor: '#0082c9' })
diff --git a/apps/theming/src/components/admin/FileInputField.vue b/apps/theming/src/components/admin/FileInputField.vue
index 698bc53c402..d5e0052f5bd 100644
--- a/apps/theming/src/components/admin/FileInputField.vue
+++ b/apps/theming/src/components/admin/FileInputField.vue
@@ -68,7 +68,7 @@ import { loadState } from '@nextcloud/initial-state'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
-import Delete from 'vue-material-design-icons/Delete.vue'
+import Delete from 'vue-material-design-icons/DeleteOutline.vue'
import Undo from 'vue-material-design-icons/UndoVariant.vue'
import Upload from 'vue-material-design-icons/Upload.vue'
diff --git a/apps/theming/tests/Migration/Version2006Date20240905111627Test.php b/apps/theming/tests/Migration/Version2006Date20240905111627Test.php
index c4bcb75b364..5f7458db11a 100644
--- a/apps/theming/tests/Migration/Version2006Date20240905111627Test.php
+++ b/apps/theming/tests/Migration/Version2006Date20240905111627Test.php
@@ -9,9 +9,9 @@ declare(strict_types=1);
namespace OCA\Theming\Tests\Migration;
-use NCU\Config\IUserConfig;
use OCA\Theming\Migration\Version2006Date20240905111627;
use OCP\BackgroundJob\IJobList;
+use OCP\Config\IUserConfig;
use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\IUserManager;
diff --git a/apps/twofactor_backupcodes/l10n/es.js b/apps/twofactor_backupcodes/l10n/es.js
index 2a53036ac9d..1f0621f4a8c 100644
--- a/apps/twofactor_backupcodes/l10n/es.js
+++ b/apps/twofactor_backupcodes/l10n/es.js
@@ -2,22 +2,22 @@ OC.L10N.register(
"twofactor_backupcodes",
{
"You created two-factor backup codes for your account" : "Has creado códigos de respaldo para la autenticación de dos factores para tu cuenta",
- "Second-factor backup codes" : "Códigos de respaldo para verificación en dos pasos",
+ "Second-factor backup codes" : "Códigos de respaldo para el segundo factor",
"Generate backup codes" : "Generar códigos de respaldo",
"You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Ha habilitado la autenticación de dos factores pero no ha generado aún los códigos de respaldo. Estos son necesarios para acceder a su cuenta en caso de pérdida del segundo factor.",
"Backup code" : "Código de respaldo",
"Use backup code" : "Usar código de respaldo",
- "Two factor backup codes" : "Códigos de respaldo de la verificación en dos pasos",
+ "Two factor backup codes" : "Códigos de respaldo para la verificación de dos factores",
"A two-factor auth backup codes provider" : "Un proveedor de códigos respaldo para autenticación de dos factores",
- "An error occurred while generating your backup codes" : "Ha ocurrido un error mientras se generaban los códigos de respaldo.",
+ "An error occurred while generating your backup codes" : "Ha ocurrido un error mientras se generaban sus códigos de respaldo.",
"Backup codes have been generated. {used} of {total} codes have been used." : "Se han generado códigos de respaldo. Se han usado {used} de {total} códigos.",
- "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Estos son tus códigos de respaldo. Por favor, guárdalos y/o imprímelos, porque no podrás volver a verlos más tarde.",
+ "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Estos son sus códigos de respaldo. Por favor, guárdelos y/o imprima los mismos, ya que no podrá volver a verlos más tarde.",
"Save backup codes" : "Guardar códigos de respaldo",
"Print backup codes" : "Imprimir códigos de respaldo",
"Regenerate backup codes" : "Regenerar códigos de respaldo",
"If you regenerate backup codes, you automatically invalidate old codes." : "Si regenera los códigos de respaldo, automáticamente invalidará los antiguos.",
"{name} backup codes" : "Códigos de respaldo {name}",
- "Use one of the backup codes you saved when setting up two-factor authentication." : "Usa uno de los códigos de respaldo que guardaste cuando activaste la autenticación de dos factores.",
+ "Use one of the backup codes you saved when setting up two-factor authentication." : "Use uno de los códigos de respaldo que guardó cuando activó la autenticación de dos factores.",
"Submit" : "Enviar"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/twofactor_backupcodes/l10n/es.json b/apps/twofactor_backupcodes/l10n/es.json
index da669378de8..bad78f7b72d 100644
--- a/apps/twofactor_backupcodes/l10n/es.json
+++ b/apps/twofactor_backupcodes/l10n/es.json
@@ -1,21 +1,21 @@
{ "translations": {
"You created two-factor backup codes for your account" : "Has creado códigos de respaldo para la autenticación de dos factores para tu cuenta",
- "Second-factor backup codes" : "Códigos de respaldo para verificación en dos pasos",
+ "Second-factor backup codes" : "Códigos de respaldo para el segundo factor",
"Generate backup codes" : "Generar códigos de respaldo",
"You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Ha habilitado la autenticación de dos factores pero no ha generado aún los códigos de respaldo. Estos son necesarios para acceder a su cuenta en caso de pérdida del segundo factor.",
"Backup code" : "Código de respaldo",
"Use backup code" : "Usar código de respaldo",
- "Two factor backup codes" : "Códigos de respaldo de la verificación en dos pasos",
+ "Two factor backup codes" : "Códigos de respaldo para la verificación de dos factores",
"A two-factor auth backup codes provider" : "Un proveedor de códigos respaldo para autenticación de dos factores",
- "An error occurred while generating your backup codes" : "Ha ocurrido un error mientras se generaban los códigos de respaldo.",
+ "An error occurred while generating your backup codes" : "Ha ocurrido un error mientras se generaban sus códigos de respaldo.",
"Backup codes have been generated. {used} of {total} codes have been used." : "Se han generado códigos de respaldo. Se han usado {used} de {total} códigos.",
- "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Estos son tus códigos de respaldo. Por favor, guárdalos y/o imprímelos, porque no podrás volver a verlos más tarde.",
+ "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Estos son sus códigos de respaldo. Por favor, guárdelos y/o imprima los mismos, ya que no podrá volver a verlos más tarde.",
"Save backup codes" : "Guardar códigos de respaldo",
"Print backup codes" : "Imprimir códigos de respaldo",
"Regenerate backup codes" : "Regenerar códigos de respaldo",
"If you regenerate backup codes, you automatically invalidate old codes." : "Si regenera los códigos de respaldo, automáticamente invalidará los antiguos.",
"{name} backup codes" : "Códigos de respaldo {name}",
- "Use one of the backup codes you saved when setting up two-factor authentication." : "Usa uno de los códigos de respaldo que guardaste cuando activaste la autenticación de dos factores.",
+ "Use one of the backup codes you saved when setting up two-factor authentication." : "Use uno de los códigos de respaldo que guardó cuando activó la autenticación de dos factores.",
"Submit" : "Enviar"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/twofactor_backupcodes/l10n/sw.js b/apps/twofactor_backupcodes/l10n/sw.js
new file mode 100644
index 00000000000..1602df7d1dc
--- /dev/null
+++ b/apps/twofactor_backupcodes/l10n/sw.js
@@ -0,0 +1,23 @@
+OC.L10N.register(
+ "twofactor_backupcodes",
+ {
+ "You created two-factor backup codes for your account" : "Umeunda misimbo ya usaidizi ya vipengele viwili vya akaunti yako",
+ "Second-factor backup codes" : "Misimbo ya ambari mbadala za kipengele cha pili",
+ "Generate backup codes" : "Tengeneza misimbo mbadala",
+ "You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Umewasha uthibitishaji wa vipengele viwili lakini bado hukutoa misimbo mbadala. Inahitajika ili kurejesha ufikiaji wa akaunti yako endapo utapoteza kipengele chako cha pili.",
+ "Backup code" : "Msimbo mbadala wa usaidizi",
+ "Use backup code" : "Tumia nambari ya kuthibitisha",
+ "Two factor backup codes" : "Nambari mbili mbadala za misimbo",
+ "A two-factor auth backup codes provider" : "Mtoa huduma wa misimbo ya uthibitishaji wa vipengele viwili",
+ "An error occurred while generating your backup codes" : "Hitilafu ilitokea wakati wa kuunda misimbo yako mbadala",
+ "Backup codes have been generated. {used} of {total} codes have been used." : "Misimbo ya hifadhi rudufu imetolewa. {used}kati ya misimbo {total} zimetumika.",
+ "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Hii ndiyo misimbo yako mbadala. Tafadhali ihifadhi na/au uichapishe kwani hutaweza kusoma misimbo tena baadaye.",
+ "Save backup codes" : "Hifadhi misimbo mbadala ya usaidizi",
+ "Print backup codes" : "Chapisha misimbo mbadala ya usaidizi",
+ "Regenerate backup codes" : "Tengeneza upya misimbo mbadala ya usaidizi",
+ "If you regenerate backup codes, you automatically invalidate old codes." : "Ukiunda upya misimbo mbadala, unabatilisha misimbo ya zamani kiotomatiki.",
+ "{name} backup codes" : "{name} misimbo mbadala ya usaidizi",
+ "Use one of the backup codes you saved when setting up two-factor authentication." : "Tumia mojawapo ya misimbo mbadala uliyohifadhi wakati wa kusanidi uthibitishaji wa vipengele viwili.",
+ "Submit" : "Wasilisha"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/sw.json b/apps/twofactor_backupcodes/l10n/sw.json
new file mode 100644
index 00000000000..b6607a180e5
--- /dev/null
+++ b/apps/twofactor_backupcodes/l10n/sw.json
@@ -0,0 +1,21 @@
+{ "translations": {
+ "You created two-factor backup codes for your account" : "Umeunda misimbo ya usaidizi ya vipengele viwili vya akaunti yako",
+ "Second-factor backup codes" : "Misimbo ya ambari mbadala za kipengele cha pili",
+ "Generate backup codes" : "Tengeneza misimbo mbadala",
+ "You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Umewasha uthibitishaji wa vipengele viwili lakini bado hukutoa misimbo mbadala. Inahitajika ili kurejesha ufikiaji wa akaunti yako endapo utapoteza kipengele chako cha pili.",
+ "Backup code" : "Msimbo mbadala wa usaidizi",
+ "Use backup code" : "Tumia nambari ya kuthibitisha",
+ "Two factor backup codes" : "Nambari mbili mbadala za misimbo",
+ "A two-factor auth backup codes provider" : "Mtoa huduma wa misimbo ya uthibitishaji wa vipengele viwili",
+ "An error occurred while generating your backup codes" : "Hitilafu ilitokea wakati wa kuunda misimbo yako mbadala",
+ "Backup codes have been generated. {used} of {total} codes have been used." : "Misimbo ya hifadhi rudufu imetolewa. {used}kati ya misimbo {total} zimetumika.",
+ "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Hii ndiyo misimbo yako mbadala. Tafadhali ihifadhi na/au uichapishe kwani hutaweza kusoma misimbo tena baadaye.",
+ "Save backup codes" : "Hifadhi misimbo mbadala ya usaidizi",
+ "Print backup codes" : "Chapisha misimbo mbadala ya usaidizi",
+ "Regenerate backup codes" : "Tengeneza upya misimbo mbadala ya usaidizi",
+ "If you regenerate backup codes, you automatically invalidate old codes." : "Ukiunda upya misimbo mbadala, unabatilisha misimbo ya zamani kiotomatiki.",
+ "{name} backup codes" : "{name} misimbo mbadala ya usaidizi",
+ "Use one of the backup codes you saved when setting up two-factor authentication." : "Tumia mojawapo ya misimbo mbadala uliyohifadhi wakati wa kusanidi uthibitishaji wa vipengele viwili.",
+ "Submit" : "Wasilisha"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/updatenotification/src/components/UpdateNotification.vue b/apps/updatenotification/src/components/UpdateNotification.vue
index 3ba6bf5bd69..94c58dbdfd9 100644
--- a/apps/updatenotification/src/components/UpdateNotification.vue
+++ b/apps/updatenotification/src/components/UpdateNotification.vue
@@ -178,7 +178,7 @@ import IconChevronDown from 'vue-material-design-icons/ChevronDown.vue'
import IconCloudCheckVariant from 'vue-material-design-icons/CloudCheckVariant.vue'
import IconLink from 'vue-material-design-icons/Link.vue'
import IconNewBox from 'vue-material-design-icons/NewBox.vue'
-import IconPencil from 'vue-material-design-icons/Pencil.vue'
+import IconPencil from 'vue-material-design-icons/PencilOutline.vue'
import IconSourceBranch from 'vue-material-design-icons/SourceBranch.vue'
import IconStar from 'vue-material-design-icons/Star.vue'
import IconWeatherNight from 'vue-material-design-icons/WeatherNight.vue'
diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js
index 924d5992945..ce71773283b 100644
--- a/apps/user_ldap/l10n/es.js
+++ b/apps/user_ldap/l10n/es.js
@@ -220,9 +220,9 @@ OC.L10N.register(
"Biography Field" : "Campo Biografía",
"User profile Biography will be set from the specified attribute" : "La Biografía en el perfil del usuario será definida desde el atributo especificado",
"Birthdate Field" : "Campo de Fecha de nacimiento",
- "User profile Date of birth will be set from the specified attribute" : "Perfil de usuario La fecha de nacimiento será asignada en base al atributo especificado",
+ "User profile Date of birth will be set from the specified attribute" : "La fecha de nacimiento en el perfil de usuario será asignada en base al atributo especificado",
"Pronouns Field" : "Campo Pronombres",
- "User profile Pronouns will be set from the specified attribute" : "Perfil de usuario Los pronombres se asignarán en base al atributo especificado",
+ "User profile Pronouns will be set from the specified attribute" : "Los pronombres en el perfil de usuario se asignarán en base al atributo especificado",
"Internal Username" : "Nombre de usuario interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesitará convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios DAV. Con esta configuración, se puede anular el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio. Déjelo vacío para usar el comportamiento por defecto.",
"Internal Username Attribute:" : "Atributo de nombre de usuario interno:",
diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json
index 6e44ef31365..2e8253e0fa1 100644
--- a/apps/user_ldap/l10n/es.json
+++ b/apps/user_ldap/l10n/es.json
@@ -218,9 +218,9 @@
"Biography Field" : "Campo Biografía",
"User profile Biography will be set from the specified attribute" : "La Biografía en el perfil del usuario será definida desde el atributo especificado",
"Birthdate Field" : "Campo de Fecha de nacimiento",
- "User profile Date of birth will be set from the specified attribute" : "Perfil de usuario La fecha de nacimiento será asignada en base al atributo especificado",
+ "User profile Date of birth will be set from the specified attribute" : "La fecha de nacimiento en el perfil de usuario será asignada en base al atributo especificado",
"Pronouns Field" : "Campo Pronombres",
- "User profile Pronouns will be set from the specified attribute" : "Perfil de usuario Los pronombres se asignarán en base al atributo especificado",
+ "User profile Pronouns will be set from the specified attribute" : "Los pronombres en el perfil de usuario se asignarán en base al atributo especificado",
"Internal Username" : "Nombre de usuario interno",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesitará convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios DAV. Con esta configuración, se puede anular el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio. Déjelo vacío para usar el comportamiento por defecto.",
"Internal Username Attribute:" : "Atributo de nombre de usuario interno:",
diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js
index 30ab9ad0e15..e9abc7d540c 100644
--- a/apps/user_ldap/l10n/ru.js
+++ b/apps/user_ldap/l10n/ru.js
@@ -199,7 +199,7 @@ OC.L10N.register(
"User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя",
"Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию) или укажите атрибут LDAP/AD.",
"\"$home\" Placeholder Field" : "Поле-заполнитель \"$home\"",
- "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменен значением указанного атрибута",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменён значением указанного атрибута",
"User Profile Attributes" : "Атрибуты профиля пользователей",
"Phone Field" : "Поле телефона",
"User profile Phone will be set from the specified attribute" : "Телефон в профиле пользователя будет установлен из указанного атрибута",
diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json
index eea51dcf3a7..97ac0b1eeb3 100644
--- a/apps/user_ldap/l10n/ru.json
+++ b/apps/user_ldap/l10n/ru.json
@@ -197,7 +197,7 @@
"User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя",
"Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию) или укажите атрибут LDAP/AD.",
"\"$home\" Placeholder Field" : "Поле-заполнитель \"$home\"",
- "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменен значением указанного атрибута",
+ "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменён значением указанного атрибута",
"User Profile Attributes" : "Атрибуты профиля пользователей",
"Phone Field" : "Поле телефона",
"User profile Phone will be set from the specified attribute" : "Телефон в профиле пользователя будет установлен из указанного атрибута",
diff --git a/apps/user_ldap/l10n/uk.js b/apps/user_ldap/l10n/uk.js
index 6b63f214c9f..21992698f59 100644
--- a/apps/user_ldap/l10n/uk.js
+++ b/apps/user_ldap/l10n/uk.js
@@ -6,10 +6,12 @@ OC.L10N.register(
"Invalid configuration: Anonymous binding is not allowed." : "Неправильна конфігурація. Анонімне приєднання не дозволено.",
"Valid configuration, connection established!" : "Правильна конфігурація, з'єднання встановлено!",
"Valid configuration, but binding failed. Please check the server settings and credentials." : "Правильна конфігурація, але приєднання не вдалося. Будь ласка, перевірте налаштування сервера та дані авторизації.",
+ "Invalid configuration: %s" : "Неправильна конфігурація: %s",
"No action specified" : "Ніяких дій не вказано",
"No configuration specified" : "Немає конфігурації",
"No data specified" : "Немає даних",
"Invalid data specified" : "Вказано неправильні дані",
+ "Could not set configuration %1$s to %2$s" : "Не вдалося встановити конфігурацію %1$s на %2$s",
"Action does not exist" : "Дія не існує",
"Renewing …" : "Оновлення...",
"Very weak password" : "Дуже слабкий пароль",
@@ -52,12 +54,25 @@ OC.L10N.register(
"The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заповнювач \"%uid\" відсутній. Його буде замінено ім’ям для входу під час запиту 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: %s" : "Зміну пароля відхилено. Підказка: %s",
+ "Mandatory field \"%s\" left empty" : "Обов'язкове поле \"%s\" залишено порожнім",
+ "A password is given, but not an LDAP agent" : "Надається пароль, але не агент LDAP",
+ "No password is given for the user agent" : "Для користувача-агента пароль не задається",
+ "No LDAP base DN was given" : "Базовий DN LDAP не вказано",
+ "User base DN is not a subnode of global base DN" : "Базовий DN користувача не є підвузлом глобального базового DN",
+ "Group base DN is not a subnode of global base DN" : "Груповий базовий DN не є підвузлом глобального базового DN",
+ "Login filter does not contain %s placeholder." : "Фільтр логінів не містить заповнювача %s.",
"Please login with the new password" : "Будь ласка, увійдіть з новим паролем",
"LDAP User backend" : "Інтерфейс керування користувачами LDAP",
"Your password will expire tomorrow." : "Дія вашого пароля завершується завтра.",
"Your password will expire today." : "Дія вашого пароля завершується сьогодні.",
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Дія вашого пароля завершується через %n день.","Дія вашого пароля завершується через %n дні.","Дія вашого пароля завершується через %n днів.","Дія вашого пароля завершується через %n днів."],
"LDAP/AD integration" : "Інтеграція LDAP/AD",
+ "LDAP Connection" : "Підключення LDAP",
+ "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Зв'язування не вдалося для цієї конфігурації LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s"],
+ "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Не вдалося виконати пошук для цієї конфігурації LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s"],
+ "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Існує неактивна конфігурація LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s"],
+ "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Прив'язка та пошук працює на налаштованому LDAP-з'єднанні (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)"],
"Invalid LDAP UUIDs" : "Недійсні LDAP UUID",
"None found" : "Нічого не знайдено",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Знайдено недійсні ідентифікатори UUID користувачів або груп LDAP. Перевірте налаштування \"Пропускати визначення UUID\" у розділі \"Для експертів\" налаштувань LDAP або виконайте команду \"occ ldap:update-uuid\" для їхнього оновлення.",
@@ -204,6 +219,10 @@ OC.L10N.register(
"User profile Headline will be set from the specified attribute" : "Заголовок в профілі користувача буде встановлено на основі вказаного атрибута",
"Biography Field" : "Поле Біографія",
"User profile Biography will be set from the specified attribute" : "Біографія в профілі користувача буде встановлена на основі вказаного атрибута",
+ "Birthdate Field" : "Поле Дата народження",
+ "User profile Date of birth will be set from the specified attribute" : "Профіль користувача Дата народження буде встановлена з вказаного атрибуту",
+ "Pronouns Field" : "Поле займенників",
+ "User profile Pronouns will be set from the specified attribute" : "Профіль користувача Займенники будуть встановлені з вказаного атрибуту",
"Internal Username" : "Внутрішня Ім'я користувача",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "За замовчуванням внутрішнє ім’я користувача буде створено з атрибута UUID. Це гарантує, що ім’я користувача є унікальним і символи не потрібно конвертувати. Внутрішнє ім’я користувача має обмеження щодо дозволених лише таких символів: [a-zA-Z0-9_.@-]. Інші символи замінюються відповідністю ASCII або просто пропускаються. При зіткненнях число буде додано/збільшено. Внутрішнє ім’я користувача використовується для внутрішньої ідентифікації користувача. Це також назва за замовчуванням для домашнього каталогу користувача. Це також частина віддалених URL-адрес, наприклад, для всіх служб DAV. За допомогою цього параметра поведінку за замовчуванням можна змінити. Зміни діятимуть лише для нещодавно зіставлених (доданих) користувачів LDAP. Залиште поле порожнім для поведінки за замовчуванням.",
"Internal Username Attribute:" : "Внутрішня Ім'я користувача, Атрибут:",
diff --git a/apps/user_ldap/l10n/uk.json b/apps/user_ldap/l10n/uk.json
index cb7befd7271..b1837d05eca 100644
--- a/apps/user_ldap/l10n/uk.json
+++ b/apps/user_ldap/l10n/uk.json
@@ -4,10 +4,12 @@
"Invalid configuration: Anonymous binding is not allowed." : "Неправильна конфігурація. Анонімне приєднання не дозволено.",
"Valid configuration, connection established!" : "Правильна конфігурація, з'єднання встановлено!",
"Valid configuration, but binding failed. Please check the server settings and credentials." : "Правильна конфігурація, але приєднання не вдалося. Будь ласка, перевірте налаштування сервера та дані авторизації.",
+ "Invalid configuration: %s" : "Неправильна конфігурація: %s",
"No action specified" : "Ніяких дій не вказано",
"No configuration specified" : "Немає конфігурації",
"No data specified" : "Немає даних",
"Invalid data specified" : "Вказано неправильні дані",
+ "Could not set configuration %1$s to %2$s" : "Не вдалося встановити конфігурацію %1$s на %2$s",
"Action does not exist" : "Дія не існує",
"Renewing …" : "Оновлення...",
"Very weak password" : "Дуже слабкий пароль",
@@ -50,12 +52,25 @@
"The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заповнювач \"%uid\" відсутній. Його буде замінено ім’ям для входу під час запиту 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: %s" : "Зміну пароля відхилено. Підказка: %s",
+ "Mandatory field \"%s\" left empty" : "Обов'язкове поле \"%s\" залишено порожнім",
+ "A password is given, but not an LDAP agent" : "Надається пароль, але не агент LDAP",
+ "No password is given for the user agent" : "Для користувача-агента пароль не задається",
+ "No LDAP base DN was given" : "Базовий DN LDAP не вказано",
+ "User base DN is not a subnode of global base DN" : "Базовий DN користувача не є підвузлом глобального базового DN",
+ "Group base DN is not a subnode of global base DN" : "Груповий базовий DN не є підвузлом глобального базового DN",
+ "Login filter does not contain %s placeholder." : "Фільтр логінів не містить заповнювача %s.",
"Please login with the new password" : "Будь ласка, увійдіть з новим паролем",
"LDAP User backend" : "Інтерфейс керування користувачами LDAP",
"Your password will expire tomorrow." : "Дія вашого пароля завершується завтра.",
"Your password will expire today." : "Дія вашого пароля завершується сьогодні.",
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Дія вашого пароля завершується через %n день.","Дія вашого пароля завершується через %n дні.","Дія вашого пароля завершується через %n днів.","Дія вашого пароля завершується через %n днів."],
"LDAP/AD integration" : "Інтеграція LDAP/AD",
+ "LDAP Connection" : "Підключення LDAP",
+ "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Зв'язування не вдалося для цієї конфігурації LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s"],
+ "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Не вдалося виконати пошук для цієї конфігурації LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s"],
+ "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Існує неактивна конфігурація LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s"],
+ "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Прив'язка та пошук працює на налаштованому LDAP-з'єднанні (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)"],
"Invalid LDAP UUIDs" : "Недійсні LDAP UUID",
"None found" : "Нічого не знайдено",
"Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Знайдено недійсні ідентифікатори UUID користувачів або груп LDAP. Перевірте налаштування \"Пропускати визначення UUID\" у розділі \"Для експертів\" налаштувань LDAP або виконайте команду \"occ ldap:update-uuid\" для їхнього оновлення.",
@@ -202,6 +217,10 @@
"User profile Headline will be set from the specified attribute" : "Заголовок в профілі користувача буде встановлено на основі вказаного атрибута",
"Biography Field" : "Поле Біографія",
"User profile Biography will be set from the specified attribute" : "Біографія в профілі користувача буде встановлена на основі вказаного атрибута",
+ "Birthdate Field" : "Поле Дата народження",
+ "User profile Date of birth will be set from the specified attribute" : "Профіль користувача Дата народження буде встановлена з вказаного атрибуту",
+ "Pronouns Field" : "Поле займенників",
+ "User profile Pronouns will be set from the specified attribute" : "Профіль користувача Займенники будуть встановлені з вказаного атрибуту",
"Internal Username" : "Внутрішня Ім'я користувача",
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "За замовчуванням внутрішнє ім’я користувача буде створено з атрибута UUID. Це гарантує, що ім’я користувача є унікальним і символи не потрібно конвертувати. Внутрішнє ім’я користувача має обмеження щодо дозволених лише таких символів: [a-zA-Z0-9_.@-]. Інші символи замінюються відповідністю ASCII або просто пропускаються. При зіткненнях число буде додано/збільшено. Внутрішнє ім’я користувача використовується для внутрішньої ідентифікації користувача. Це також назва за замовчуванням для домашнього каталогу користувача. Це також частина віддалених URL-адрес, наприклад, для всіх служб DAV. За допомогою цього параметра поведінку за замовчуванням можна змінити. Зміни діятимуть лише для нещодавно зіставлених (доданих) користувачів LDAP. Залиште поле порожнім для поведінки за замовчуванням.",
"Internal Username Attribute:" : "Внутрішня Ім'я користувача, Атрибут:",
diff --git a/apps/user_status/l10n/sw.js b/apps/user_status/l10n/sw.js
index 5470b5c623f..eb0aab1c727 100644
--- a/apps/user_status/l10n/sw.js
+++ b/apps/user_status/l10n/sw.js
@@ -1,15 +1,33 @@
OC.L10N.register(
"user_status",
{
+ "Recent statuses" : "Hali za hivi karibuni",
+ "No recent status changes" : "Hakuna mabadiliko ya hali ya hivi karibuni",
+ "In a meeting" : "Katika mkutano",
+ "Commuting" : "Kuelekea",
+ "Out sick" : "Nje mgonjwa",
+ "Vacationing" : "Likizo",
"Out of office" : "Nje ya ofisi",
+ "Working remotely" : "Kufanyia kazi mbali",
+ "In a call" : "Katika simu",
"User status" : "Hadhi ya mtumiaji",
- "Emoji for your status message" : "Emoji kwa ujumbe wako wa hadhi",
+ "Clear status after" : "Futa hali baada ya",
+ "Emoji for your status message" : "Emoji kwa hali yako ya ujumbe",
"What is your status?" : "Hadhi yako ni nini?",
+ "Predefined statuses" : "Hali zilizoainishwa awali",
"Previously set" : "Imepangiliwa mwanzo",
"Reset status" : "Pangilia hali",
+ "Reset status to \"{icon} {message}\"" : " Weka upya hali kuwa \"{icon} {message}\"",
+ "Reset status to \"{message}\"" : "Weka upya hali kuwa \"{message}\"",
+ "Reset status to \"{icon}\"" : "Weka upya hali kuwa \"{icon}\"",
+ "There was an error saving the status" : "Kulikuwa na hitilafu katika kuhifadhi hali",
+ "There was an error clearing the status" : "Kulikuwa na hitilafu katika kufuta hali",
+ "There was an error reverting the status" : "Kulikuwa na hitilafu katika kurejesha hali",
"Set status" : "Panglia hali",
- "Online status" : "Hadhi ya mtandaoni",
- "Status message" : "Ujumbe wa hadhi",
+ "Online status" : "Hali ya mtandaoni",
+ "Status message" : "Hali ya ujumbe",
+ "Set absence period" : "Weka kipindi cha kutokuwepo",
+ "Set absence period and replacement" : " Weka kipindi cha kutokuwepo na uingizwaji mbadala",
"Your status was set automatically" : "Hadhi yako ilipangiliwa moja kwa moja",
"Clear status message" : "Futa jumbe za wadhifa",
"Set status message" : "Pangilia hali ya ujumbe",
@@ -21,8 +39,11 @@ OC.L10N.register(
"Do not disturb" : "Acha kusumbua",
"Invisible" : "Haionekani",
"Offline" : "Nje ya mtandao",
+ "There was an error saving the new status" : "Kulikuwa na hitilafu katika kuhifadhi hali mpya",
"30 minutes" : "Dakika 30",
"1 hour" : "Saa 1",
- "4 hours" : "Masaa 4"
+ "4 hours" : "Masaa 4",
+ "Mute all notifications" : "Zima arifu zote",
+ "Appear offline" : "Tokea nje ya mtandao"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/user_status/l10n/sw.json b/apps/user_status/l10n/sw.json
index 6e0c9c6a77c..7fb031bbbea 100644
--- a/apps/user_status/l10n/sw.json
+++ b/apps/user_status/l10n/sw.json
@@ -1,13 +1,31 @@
{ "translations": {
+ "Recent statuses" : "Hali za hivi karibuni",
+ "No recent status changes" : "Hakuna mabadiliko ya hali ya hivi karibuni",
+ "In a meeting" : "Katika mkutano",
+ "Commuting" : "Kuelekea",
+ "Out sick" : "Nje mgonjwa",
+ "Vacationing" : "Likizo",
"Out of office" : "Nje ya ofisi",
+ "Working remotely" : "Kufanyia kazi mbali",
+ "In a call" : "Katika simu",
"User status" : "Hadhi ya mtumiaji",
- "Emoji for your status message" : "Emoji kwa ujumbe wako wa hadhi",
+ "Clear status after" : "Futa hali baada ya",
+ "Emoji for your status message" : "Emoji kwa hali yako ya ujumbe",
"What is your status?" : "Hadhi yako ni nini?",
+ "Predefined statuses" : "Hali zilizoainishwa awali",
"Previously set" : "Imepangiliwa mwanzo",
"Reset status" : "Pangilia hali",
+ "Reset status to \"{icon} {message}\"" : " Weka upya hali kuwa \"{icon} {message}\"",
+ "Reset status to \"{message}\"" : "Weka upya hali kuwa \"{message}\"",
+ "Reset status to \"{icon}\"" : "Weka upya hali kuwa \"{icon}\"",
+ "There was an error saving the status" : "Kulikuwa na hitilafu katika kuhifadhi hali",
+ "There was an error clearing the status" : "Kulikuwa na hitilafu katika kufuta hali",
+ "There was an error reverting the status" : "Kulikuwa na hitilafu katika kurejesha hali",
"Set status" : "Panglia hali",
- "Online status" : "Hadhi ya mtandaoni",
- "Status message" : "Ujumbe wa hadhi",
+ "Online status" : "Hali ya mtandaoni",
+ "Status message" : "Hali ya ujumbe",
+ "Set absence period" : "Weka kipindi cha kutokuwepo",
+ "Set absence period and replacement" : " Weka kipindi cha kutokuwepo na uingizwaji mbadala",
"Your status was set automatically" : "Hadhi yako ilipangiliwa moja kwa moja",
"Clear status message" : "Futa jumbe za wadhifa",
"Set status message" : "Pangilia hali ya ujumbe",
@@ -19,8 +37,11 @@
"Do not disturb" : "Acha kusumbua",
"Invisible" : "Haionekani",
"Offline" : "Nje ya mtandao",
+ "There was an error saving the new status" : "Kulikuwa na hitilafu katika kuhifadhi hali mpya",
"30 minutes" : "Dakika 30",
"1 hour" : "Saa 1",
- "4 hours" : "Masaa 4"
+ "4 hours" : "Masaa 4",
+ "Mute all notifications" : "Zima arifu zote",
+ "Appear offline" : "Tokea nje ya mtandao"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/user_status/openapi.json b/apps/user_status/openapi.json
index 65d9af59fef..d1018fa26e6 100644
--- a/apps/user_status/openapi.json
+++ b/apps/user_status/openapi.json
@@ -124,8 +124,12 @@
"type": "string"
},
"clearAt": {
- "$ref": "#/components/schemas/ClearAt",
- "nullable": true
+ "nullable": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ClearAt"
+ }
+ ]
}
}
},
diff --git a/apps/weather_status/l10n/de.js b/apps/weather_status/l10n/de.js
index 0bf7bc0b2aa..650d19e7e5b 100644
--- a/apps/weather_status/l10n/de.js
+++ b/apps/weather_status/l10n/de.js
@@ -51,7 +51,7 @@ OC.L10N.register(
"There was an error getting the weather status information." : "Beim Abrufen der Wetterstatusinformationen ist ein Fehler aufgetreten.",
"No weather information found" : "Keine Wetterinformationen gefunden",
"Location not found" : "Standort nicht gefunden",
- "There was an error setting the location address." : "Es ist ein Fehler beim Festlegen der Standortadresse aufgetreten.",
+ "There was an error setting the location address." : "Fehler beim Festlegen der Standortadresse aufgetreten.",
"There was an error setting the location." : "Es ist ein Fehler beim Festlegen des Standortes aufgetreten.",
"There was an error saving the mode." : "Es ist ein Fehler beim Festlegen des Modus aufgetreten.",
"There was an error using personal address." : "Es ist ein Fehler beim Verwenden der persönlichen Adresse aufgetreten.",
diff --git a/apps/weather_status/l10n/de.json b/apps/weather_status/l10n/de.json
index 1797cf35272..64576182a00 100644
--- a/apps/weather_status/l10n/de.json
+++ b/apps/weather_status/l10n/de.json
@@ -49,7 +49,7 @@
"There was an error getting the weather status information." : "Beim Abrufen der Wetterstatusinformationen ist ein Fehler aufgetreten.",
"No weather information found" : "Keine Wetterinformationen gefunden",
"Location not found" : "Standort nicht gefunden",
- "There was an error setting the location address." : "Es ist ein Fehler beim Festlegen der Standortadresse aufgetreten.",
+ "There was an error setting the location address." : "Fehler beim Festlegen der Standortadresse aufgetreten.",
"There was an error setting the location." : "Es ist ein Fehler beim Festlegen des Standortes aufgetreten.",
"There was an error saving the mode." : "Es ist ein Fehler beim Festlegen des Modus aufgetreten.",
"There was an error using personal address." : "Es ist ein Fehler beim Verwenden der persönlichen Adresse aufgetreten.",
diff --git a/apps/weather_status/l10n/sw.js b/apps/weather_status/l10n/sw.js
new file mode 100644
index 00000000000..7928eb4db94
--- /dev/null
+++ b/apps/weather_status/l10n/sw.js
@@ -0,0 +1,63 @@
+OC.L10N.register(
+ "weather_status",
+ {
+ "Unknown address" : "Anwani isiyojulikana",
+ "No result." : "Hakuna matokeo",
+ "Malformed JSON data." : "Takwimu za JSON zilizoharibika.",
+ "Error" : "Hitilafu",
+ "Weather status" : "Hali ya hali ya hewa",
+ "Weather status in your dashboard" : "Hali ya hewa kwenye dashibodi yako",
+ "Weather status integrated in the Dashboard app.\n The geographic location 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." : "Hali ya hali ya hewa imeunganishwa katika programu ya Dashibodi.\nEneo la kijiografia linaweza kuamuliwa kiotomatiki au kufafanuliwa kwa mikono. Utabiri wa saa 6 kisha utaonyeshwa.\nHali hii pia inaweza kuunganishwa katika maeneo mengine kama vile programu ya Kalenda.",
+ "{temperature} {unit} clear sky later today" : "{temperature} {unit} anga safi baadaye leo",
+ "{temperature} {unit} clear sky" : "{temperature} {unit}anga safi ",
+ "{temperature} {unit} cloudy later today" : "{temperature} {unit}mawingu baadeye leo ",
+ "{temperature} {unit} cloudy" : "{temperature} {unit}mawingu",
+ "{temperature} {unit} snow and thunder later today" : "{temperature} {unit} theluji na radi baadaye leo ",
+ "{temperature} {unit} snow and thunder" : "{temperature} {unit}theluji na radi ",
+ "{temperature} {unit} snow showers and thunder later today" : "{temperature} {unit} manyunyu ya theluji na radi baadaye leo",
+ "{temperature} {unit} snow showers and thunder" : "{temperature} {unit} manyunyu ya theluji na radi ",
+ "{temperature} {unit} snow showers, thunder and polar twilight later today" : "{temperature} {unit} manyunyu ya theluji, radi na mwangu hafifu wa ncha za dunia baadaye leo",
+ "{temperature} {unit} snow showers, thunder and polar twilight" : "{temperature} {unit}manyunyu ya theluji, radi na mwangu hafifu wa ncha za dunia ",
+ "{temperature} {unit} snow showers later today" : "{temperature} {unit} manyunyu ya theluji baadaye leo",
+ "{temperature} {unit} snow showers" : "{temperature} {unit}manyunyu ya theluji ",
+ "{temperature} {unit} snow showers and polar twilight later today" : "{temperature} {unit} manyunyu ya theluji na machweo ya ncha za dunia baadaye leo",
+ "{temperature} {unit} snow showers and polar twilight" : "{temperature} {unit}manyunyu ya theluji na machweo ya ncha za dunia",
+ "{temperature} {unit} snow later today" : "{temperature} {unit}theluji baadaye leo ",
+ "{temperature} {unit} snow" : "{temperature} {unit}theluji",
+ "{temperature} {unit} fair weather later today" : "{temperature} {unit}hali ya hewa nzuri baadaye leo",
+ "{temperature} {unit} fair weather" : "{temperature} {unit} hali ya hewa nzuri",
+ "{temperature} {unit} partly cloudy later today" : "{temperature} {unit}mawingu sehemu baadaye leo ",
+ "{temperature} {unit} partly cloudy" : "{temperature} {unit}mawingu sehemu ",
+ "{temperature} {unit} foggy later today" : "{temperature} {unit}ukungu baadaye leo ",
+ "{temperature} {unit} foggy" : "{temperature} {unit}ukungu ",
+ "{temperature} {unit} light rainfall later today" : "{temperature} {unit}mvua nyepesi baadaye leo ",
+ "{temperature} {unit} light rainfall" : "{temperature} {unit}mvua nyepesi ",
+ "{temperature} {unit} rainfall later today" : "{temperature} {unit}mvua baadaye leo ",
+ "{temperature} {unit} rainfall" : "{temperature} {unit} mvua",
+ "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} mvua kubwa baadaye leo",
+ "{temperature} {unit} heavy rainfall" : "{temperature} {unit} mvua kubwa",
+ "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} mvua ya manyunyu baadaye leo",
+ "{temperature} {unit} rainfall showers" : "{temperature} {unit}mvua ya manyunyu",
+ "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} manyunyu ya mvua nyepesi baadaye leo",
+ "{temperature} {unit} light rainfall showers" : "{temperature} {unit}manyunyu ya mvua nyepesi",
+ "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} manyunyu ya mvua kubwa leo baadaye",
+ "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit}manyunyu ya mvua kubwa",
+ "More weather for {adr}" : " Hali ya hewa zaidi kwa {adr}",
+ "Loading weather" : "Inapakia hali ya hewa",
+ "Set location for weather" : "Weka eneo kwa hali ya hewa",
+ "Remove from favorites" : "Ondoa kutoka katika pendwa",
+ "Add as favorite" : "Ongeza kama kipendwa",
+ "You are not logged in." : "Hujaingia kwenye akaunti.",
+ "There was an error getting the weather status information." : "Kulikuwa na hitilafu kupata taarifa za hali ya hewa.",
+ "No weather information found" : "Hakuna taarifa za hali ya hewa zilizopatikana",
+ "Location not found" : "Mahali hapajulikani",
+ "There was an error setting the location address." : "Kulikuwa na hitilafu katika kuweka anwani ya eneo.",
+ "There was an error setting the location." : "Kulikuwa na hitilafu katika kuweka eneo.",
+ "There was an error saving the mode." : "Kulikuwa na hitilafu katika kuhifadhi hali.",
+ "There was an error using personal address." : "Kulikuwa na hitilafu katika kutumia anwani ya kibinafsi.",
+ "Unknown weather code" : "Msimbo wa hali ya hewa usiojulikana",
+ "Detect location" : "Tambua eneo",
+ "Set custom address" : "Weka anwani maalum",
+ "Favorites" : "Vipendwa"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/weather_status/l10n/sw.json b/apps/weather_status/l10n/sw.json
new file mode 100644
index 00000000000..985b7b4f15f
--- /dev/null
+++ b/apps/weather_status/l10n/sw.json
@@ -0,0 +1,61 @@
+{ "translations": {
+ "Unknown address" : "Anwani isiyojulikana",
+ "No result." : "Hakuna matokeo",
+ "Malformed JSON data." : "Takwimu za JSON zilizoharibika.",
+ "Error" : "Hitilafu",
+ "Weather status" : "Hali ya hali ya hewa",
+ "Weather status in your dashboard" : "Hali ya hewa kwenye dashibodi yako",
+ "Weather status integrated in the Dashboard app.\n The geographic location 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." : "Hali ya hali ya hewa imeunganishwa katika programu ya Dashibodi.\nEneo la kijiografia linaweza kuamuliwa kiotomatiki au kufafanuliwa kwa mikono. Utabiri wa saa 6 kisha utaonyeshwa.\nHali hii pia inaweza kuunganishwa katika maeneo mengine kama vile programu ya Kalenda.",
+ "{temperature} {unit} clear sky later today" : "{temperature} {unit} anga safi baadaye leo",
+ "{temperature} {unit} clear sky" : "{temperature} {unit}anga safi ",
+ "{temperature} {unit} cloudy later today" : "{temperature} {unit}mawingu baadeye leo ",
+ "{temperature} {unit} cloudy" : "{temperature} {unit}mawingu",
+ "{temperature} {unit} snow and thunder later today" : "{temperature} {unit} theluji na radi baadaye leo ",
+ "{temperature} {unit} snow and thunder" : "{temperature} {unit}theluji na radi ",
+ "{temperature} {unit} snow showers and thunder later today" : "{temperature} {unit} manyunyu ya theluji na radi baadaye leo",
+ "{temperature} {unit} snow showers and thunder" : "{temperature} {unit} manyunyu ya theluji na radi ",
+ "{temperature} {unit} snow showers, thunder and polar twilight later today" : "{temperature} {unit} manyunyu ya theluji, radi na mwangu hafifu wa ncha za dunia baadaye leo",
+ "{temperature} {unit} snow showers, thunder and polar twilight" : "{temperature} {unit}manyunyu ya theluji, radi na mwangu hafifu wa ncha za dunia ",
+ "{temperature} {unit} snow showers later today" : "{temperature} {unit} manyunyu ya theluji baadaye leo",
+ "{temperature} {unit} snow showers" : "{temperature} {unit}manyunyu ya theluji ",
+ "{temperature} {unit} snow showers and polar twilight later today" : "{temperature} {unit} manyunyu ya theluji na machweo ya ncha za dunia baadaye leo",
+ "{temperature} {unit} snow showers and polar twilight" : "{temperature} {unit}manyunyu ya theluji na machweo ya ncha za dunia",
+ "{temperature} {unit} snow later today" : "{temperature} {unit}theluji baadaye leo ",
+ "{temperature} {unit} snow" : "{temperature} {unit}theluji",
+ "{temperature} {unit} fair weather later today" : "{temperature} {unit}hali ya hewa nzuri baadaye leo",
+ "{temperature} {unit} fair weather" : "{temperature} {unit} hali ya hewa nzuri",
+ "{temperature} {unit} partly cloudy later today" : "{temperature} {unit}mawingu sehemu baadaye leo ",
+ "{temperature} {unit} partly cloudy" : "{temperature} {unit}mawingu sehemu ",
+ "{temperature} {unit} foggy later today" : "{temperature} {unit}ukungu baadaye leo ",
+ "{temperature} {unit} foggy" : "{temperature} {unit}ukungu ",
+ "{temperature} {unit} light rainfall later today" : "{temperature} {unit}mvua nyepesi baadaye leo ",
+ "{temperature} {unit} light rainfall" : "{temperature} {unit}mvua nyepesi ",
+ "{temperature} {unit} rainfall later today" : "{temperature} {unit}mvua baadaye leo ",
+ "{temperature} {unit} rainfall" : "{temperature} {unit} mvua",
+ "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} mvua kubwa baadaye leo",
+ "{temperature} {unit} heavy rainfall" : "{temperature} {unit} mvua kubwa",
+ "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} mvua ya manyunyu baadaye leo",
+ "{temperature} {unit} rainfall showers" : "{temperature} {unit}mvua ya manyunyu",
+ "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} manyunyu ya mvua nyepesi baadaye leo",
+ "{temperature} {unit} light rainfall showers" : "{temperature} {unit}manyunyu ya mvua nyepesi",
+ "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} manyunyu ya mvua kubwa leo baadaye",
+ "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit}manyunyu ya mvua kubwa",
+ "More weather for {adr}" : " Hali ya hewa zaidi kwa {adr}",
+ "Loading weather" : "Inapakia hali ya hewa",
+ "Set location for weather" : "Weka eneo kwa hali ya hewa",
+ "Remove from favorites" : "Ondoa kutoka katika pendwa",
+ "Add as favorite" : "Ongeza kama kipendwa",
+ "You are not logged in." : "Hujaingia kwenye akaunti.",
+ "There was an error getting the weather status information." : "Kulikuwa na hitilafu kupata taarifa za hali ya hewa.",
+ "No weather information found" : "Hakuna taarifa za hali ya hewa zilizopatikana",
+ "Location not found" : "Mahali hapajulikani",
+ "There was an error setting the location address." : "Kulikuwa na hitilafu katika kuweka anwani ya eneo.",
+ "There was an error setting the location." : "Kulikuwa na hitilafu katika kuweka eneo.",
+ "There was an error saving the mode." : "Kulikuwa na hitilafu katika kuhifadhi hali.",
+ "There was an error using personal address." : "Kulikuwa na hitilafu katika kutumia anwani ya kibinafsi.",
+ "Unknown weather code" : "Msimbo wa hali ya hewa usiojulikana",
+ "Detect location" : "Tambua eneo",
+ "Set custom address" : "Weka anwani maalum",
+ "Favorites" : "Vipendwa"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/weather_status/l10n/uk.js b/apps/weather_status/l10n/uk.js
index ec68f603865..23ae208a767 100644
--- a/apps/weather_status/l10n/uk.js
+++ b/apps/weather_status/l10n/uk.js
@@ -7,10 +7,23 @@ OC.L10N.register(
"Error" : "Помилка",
"Weather status" : "Прогноз погоди",
"Weather status in your dashboard" : "Статус погоди на вашій інформаційній панелі",
+ "Weather status integrated in the Dashboard app.\n The geographic location 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.\n Географічне розташування може бути визначено автоматично або вручну. Потім відображається прогноз на 6 годин.\n Цей статус також може бути інтегрований в інші місця, наприклад, в додаток \"Календар\".",
"{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} snow and thunder later today" : "{temperature} {unit} сніг та грім сьогодні ввечері",
+ "{temperature} {unit} snow and thunder" : "{temperature} {unit} сніг і грім",
+ "{temperature} {unit} snow showers and thunder later today" : "{temperature} {unit} сьогодні ввечері снігопад та грім",
+ "{temperature} {unit} snow showers and thunder" : "{temperature} {unit} снігові зливи та грім",
+ "{temperature} {unit} snow showers, thunder and polar twilight later today" : "{temperature} {unit} сьогодні ввечері снігопади, грім та полярні сутінки",
+ "{temperature} {unit} snow showers, thunder and polar twilight" : "{temperature} {unit} снігові зливи, грім і полярні сутінки",
+ "{temperature} {unit} snow showers later today" : "{temperature} {unit} Сьогодні ввечері сніг зі снігом.",
+ "{temperature} {unit} snow showers" : "{temperature} {unit} снігопади",
+ "{temperature} {unit} snow showers and polar twilight later today" : "{temperature} {unit} Сьогодні ввечері снігопади та полярні сутінки",
+ "{temperature} {unit} snow showers and polar twilight" : "{temperature} {unit} снігопади та полярні сутінки",
+ "{temperature} {unit} snow later today" : "{temperature} {unit} Сьогодні сніг.",
+ "{temperature} {unit} snow" : "{temperature} {unit} сніг",
"{temperature} {unit} fair weather later today" : "{temperature} {unit} гарна погода пізніше сьогодні",
"{temperature} {unit} fair weather" : "{temperature} {unit} гарна погода",
"{temperature} {unit} partly cloudy later today" : "{temperature} {unit} мінлива хмарність пізніше сьогодні",
@@ -42,6 +55,7 @@ OC.L10N.register(
"There was an error setting the location." : "Під час встановлення місця розташування сталася помилка.",
"There was an error saving the mode." : "Під час збереження режиму сталася помилка.",
"There was an error using personal address." : "Під час використання особистої адреси сталася помилка.",
+ "Unknown weather code" : "Невідомий код погоди",
"Detect location" : "Визначити місце розташування",
"Set custom address" : "Встановити власну адресу",
"Favorites" : "Із зірочкою"
diff --git a/apps/weather_status/l10n/uk.json b/apps/weather_status/l10n/uk.json
index 0898ec9db07..f38063daf56 100644
--- a/apps/weather_status/l10n/uk.json
+++ b/apps/weather_status/l10n/uk.json
@@ -5,10 +5,23 @@
"Error" : "Помилка",
"Weather status" : "Прогноз погоди",
"Weather status in your dashboard" : "Статус погоди на вашій інформаційній панелі",
+ "Weather status integrated in the Dashboard app.\n The geographic location 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.\n Географічне розташування може бути визначено автоматично або вручну. Потім відображається прогноз на 6 годин.\n Цей статус також може бути інтегрований в інші місця, наприклад, в додаток \"Календар\".",
"{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} snow and thunder later today" : "{temperature} {unit} сніг та грім сьогодні ввечері",
+ "{temperature} {unit} snow and thunder" : "{temperature} {unit} сніг і грім",
+ "{temperature} {unit} snow showers and thunder later today" : "{temperature} {unit} сьогодні ввечері снігопад та грім",
+ "{temperature} {unit} snow showers and thunder" : "{temperature} {unit} снігові зливи та грім",
+ "{temperature} {unit} snow showers, thunder and polar twilight later today" : "{temperature} {unit} сьогодні ввечері снігопади, грім та полярні сутінки",
+ "{temperature} {unit} snow showers, thunder and polar twilight" : "{temperature} {unit} снігові зливи, грім і полярні сутінки",
+ "{temperature} {unit} snow showers later today" : "{temperature} {unit} Сьогодні ввечері сніг зі снігом.",
+ "{temperature} {unit} snow showers" : "{temperature} {unit} снігопади",
+ "{temperature} {unit} snow showers and polar twilight later today" : "{temperature} {unit} Сьогодні ввечері снігопади та полярні сутінки",
+ "{temperature} {unit} snow showers and polar twilight" : "{temperature} {unit} снігопади та полярні сутінки",
+ "{temperature} {unit} snow later today" : "{temperature} {unit} Сьогодні сніг.",
+ "{temperature} {unit} snow" : "{temperature} {unit} сніг",
"{temperature} {unit} fair weather later today" : "{temperature} {unit} гарна погода пізніше сьогодні",
"{temperature} {unit} fair weather" : "{temperature} {unit} гарна погода",
"{temperature} {unit} partly cloudy later today" : "{temperature} {unit} мінлива хмарність пізніше сьогодні",
@@ -40,6 +53,7 @@
"There was an error setting the location." : "Під час встановлення місця розташування сталася помилка.",
"There was an error saving the mode." : "Під час збереження режиму сталася помилка.",
"There was an error using personal address." : "Під час використання особистої адреси сталася помилка.",
+ "Unknown weather code" : "Невідомий код погоди",
"Detect location" : "Визначити місце розташування",
"Set custom address" : "Встановити власну адресу",
"Favorites" : "Із зірочкою"
diff --git a/apps/webhook_listeners/l10n/uk.js b/apps/webhook_listeners/l10n/uk.js
new file mode 100644
index 00000000000..d6d8d831e70
--- /dev/null
+++ b/apps/webhook_listeners/l10n/uk.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "webhook_listeners",
+ {
+ "Webhooks" : "Веб-хуки",
+ "Nextcloud webhook support" : "Підтримка веб-хуків Nextcloud"
+},
+"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/webhook_listeners/l10n/uk.json b/apps/webhook_listeners/l10n/uk.json
new file mode 100644
index 00000000000..c408d7268fb
--- /dev/null
+++ b/apps/webhook_listeners/l10n/uk.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "Webhooks" : "Веб-хуки",
+ "Nextcloud webhook support" : "Підтримка веб-хуків Nextcloud"
+},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
+} \ No newline at end of file
diff --git a/apps/webhook_listeners/l10n/uz.js b/apps/webhook_listeners/l10n/uz.js
new file mode 100644
index 00000000000..d0902a1a075
--- /dev/null
+++ b/apps/webhook_listeners/l10n/uz.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "webhook_listeners",
+ {
+ "Webhooks" : "Veb ilgaklari",
+ "Nextcloud webhook support" : "Nextcloud veb-ilgachlarini qo‘llab-quvvatlash"
+},
+"nplurals=1; plural=0;");
diff --git a/apps/webhook_listeners/l10n/uz.json b/apps/webhook_listeners/l10n/uz.json
new file mode 100644
index 00000000000..40fa959de25
--- /dev/null
+++ b/apps/webhook_listeners/l10n/uz.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "Webhooks" : "Veb ilgaklari",
+ "Nextcloud webhook support" : "Nextcloud veb-ilgachlarini qo‘llab-quvvatlash"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/apps/workflowengine/l10n/mk.js b/apps/workflowengine/l10n/mk.js
index 357509f3896..a7f641f0aff 100644
--- a/apps/workflowengine/l10n/mk.js
+++ b/apps/workflowengine/l10n/mk.js
@@ -47,13 +47,19 @@ OC.L10N.register(
"Select a file type" : "Изберете вид на датотека",
"e.g. httpd/unix-directory" : "Пр. httpd/unix-directory",
"Please enter a valid time span" : "Внесете валиден времески осег",
+ "Android client" : "Android клиент",
+ "iOS client" : "iOS клиент",
"Desktop client" : "Клиент за компјутер",
"Select groups" : "Одбери групи",
"Groups" : "Групи",
+ "Select a trigger" : "Избери активатор",
+ "At least one event must be selected" : "Најмалку едно мора да биде означено",
+ "Add new flow" : "Додади нов проток",
"Active" : "Активно",
"Save" : "Зачувај",
"When" : "Кога",
"and" : "и",
+ "Add a new filter" : "Додади нов филтер",
"Cancel" : "Откажи",
"Delete" : "Избриши",
"Available flows" : "Достапни протоци",
@@ -75,6 +81,7 @@ OC.L10N.register(
"less or equals" : "помалку или еднакво",
"greater or equals" : "поголемо или еднакво",
"greater" : "поголемо",
+ "Request remote address" : "Барање од надворешна адреса",
"matches IPv4" : "се совпаѓањаат IPv4",
"does not match IPv4" : "не се совпаѓаат IPv4",
"matches IPv6" : "се совпаѓањаат IPv6",
@@ -82,8 +89,11 @@ OC.L10N.register(
"File system tag" : "Датотека со системска ознака",
"is tagged with" : "е означена со",
"is not tagged with" : "не е означена со",
+ "Request URL" : "Барање URL",
+ "Request time" : "Време на барање",
"between" : "помеѓу",
"not between" : "не помеѓу",
+ "Request user agent" : "Барање од кориснички агент",
"is member of" : "е член на",
"is not member of" : "не е член на"
},
diff --git a/apps/workflowengine/l10n/mk.json b/apps/workflowengine/l10n/mk.json
index a50e5edf93c..f2ef7213da4 100644
--- a/apps/workflowengine/l10n/mk.json
+++ b/apps/workflowengine/l10n/mk.json
@@ -45,13 +45,19 @@
"Select a file type" : "Изберете вид на датотека",
"e.g. httpd/unix-directory" : "Пр. httpd/unix-directory",
"Please enter a valid time span" : "Внесете валиден времески осег",
+ "Android client" : "Android клиент",
+ "iOS client" : "iOS клиент",
"Desktop client" : "Клиент за компјутер",
"Select groups" : "Одбери групи",
"Groups" : "Групи",
+ "Select a trigger" : "Избери активатор",
+ "At least one event must be selected" : "Најмалку едно мора да биде означено",
+ "Add new flow" : "Додади нов проток",
"Active" : "Активно",
"Save" : "Зачувај",
"When" : "Кога",
"and" : "и",
+ "Add a new filter" : "Додади нов филтер",
"Cancel" : "Откажи",
"Delete" : "Избриши",
"Available flows" : "Достапни протоци",
@@ -73,6 +79,7 @@
"less or equals" : "помалку или еднакво",
"greater or equals" : "поголемо или еднакво",
"greater" : "поголемо",
+ "Request remote address" : "Барање од надворешна адреса",
"matches IPv4" : "се совпаѓањаат IPv4",
"does not match IPv4" : "не се совпаѓаат IPv4",
"matches IPv6" : "се совпаѓањаат IPv6",
@@ -80,8 +87,11 @@
"File system tag" : "Датотека со системска ознака",
"is tagged with" : "е означена со",
"is not tagged with" : "не е означена со",
+ "Request URL" : "Барање URL",
+ "Request time" : "Време на барање",
"between" : "помеѓу",
"not between" : "не помеѓу",
+ "Request user agent" : "Барање од кориснички агент",
"is member of" : "е член на",
"is not member of" : "не е член на"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
diff --git a/apps/workflowengine/l10n/sw.js b/apps/workflowengine/l10n/sw.js
new file mode 100644
index 00000000000..302055b39f2
--- /dev/null
+++ b/apps/workflowengine/l10n/sw.js
@@ -0,0 +1,123 @@
+OC.L10N.register(
+ "workflowengine",
+ {
+ "The given operator is invalid" : "Opereta uliyopewa si sahihi",
+ "The given regular expression is invalid" : "Msemo wa kawaida uliotolewa si sahihi",
+ "The given file size is invalid" : "Ukubwa wa faili uliotolewa si sahihi",
+ "The given tag id is invalid" : "Kitambulisho cha lebo kilichotolewa si sahihi",
+ "The given IP range is invalid" : "Anuwai ya IP iliyotolewa si sahihi",
+ "The given IP range is not valid for IPv4" : "Anuwai ya IP iliyotolewa si halali kwa IPv4",
+ "The given IP range is not valid for IPv6" : "Anuwai ya IP iliyotolewa si halali kwa IPv6",
+ "The given time span is invalid" : "Muda uliyopewa si sahihi",
+ "The given start time is invalid" : "Muda wa kuanza uliyopewa si sahihi",
+ "The given end time is invalid" : "Muda wa kumaliza uliyopewa ni batili",
+ "The given group does not exist" : "Kundi lililotolewa halipo",
+ "File" : "Faili",
+ "File created" : "Faili imeundwa",
+ "File updated" : "Faili imesasishwa",
+ "File renamed" : "Faili imepewa jina upya",
+ "File deleted" : "Faili imefutwa",
+ "File accessed" : "Faili imefikiwa",
+ "File copied" : "Faili imenakiliwa",
+ "Tag assigned" : "Lebo imetolewa",
+ "Someone" : "Mtu fulani",
+ "%s created %s" : "%s imeundwa %s",
+ "%s modified %s" : "%s imeboreshwa %s",
+ "%s deleted %s" : "%s imefutwa %s",
+ "%s accessed %s" : "%s imefikiwa %s",
+ "%s renamed %s" : "%s imepewa jina jipya %s",
+ "%s copied %s" : "%s imenakiliwa %s",
+ "%s assigned %s to %s" : "%simekabidhiwa %s kwa %s",
+ "Operation #%s does not exist" : "Operesheni #%s haipo",
+ "Entity %s does not exist" : "Huluki %s haipo",
+ "Entity %s is invalid" : "Huluki %s si sahihi",
+ "No events are chosen." : "Hakuna matukio yaliyochaguliwa.",
+ "Entity %s has no event %s" : "Huluki %s haina tukio %s",
+ "Operation %s does not exist" : "Operesheni %s haipo",
+ "Operation %s is invalid" : "Operesheni %s si sahihi",
+ "At least one check needs to be provided" : "Angalau hundi moja inahitaji kutolewa",
+ "The provided operation data is too long" : "Taarifa za operesheni zilizotolewa ni ndefu sana",
+ "Invalid check provided" : "Hundi batili imetolewa",
+ "Check %s does not exist" : "Angalia %s haipo",
+ "Check %s is invalid" : "Angalia %s si sahihi",
+ "Check %s is not allowed with this entity" : "Kukagua %s hairuhusiwi na huluki hii",
+ "The provided check value is too long" : "Thamani ya hundi iliyotolewa ni ndefu sana",
+ "Check #%s does not exist" : "Ukaguzi #%s haupo",
+ "Check %s is invalid or does not exist" : "Angalia %s si sahihi au haipo",
+ "Flow" : "Mtiririko",
+ "Nextcloud workflow engine" : "Injini ya mtiririko wa kazi ya Nextcloud",
+ "Select a filter" : "Chagua kichujio",
+ "Select a comparator" : "Chagua kipimajoto",
+ "Remove filter" : "Ondoa kichujio",
+ "Folder" : "Kisanduku",
+ "Images" : "Picha",
+ "Office documents" : "Nyaraka za ofisi",
+ "PDF documents" : "Nyaraka za PDF",
+ "Custom MIME type" : "Aina ya MIME ya kawaida",
+ "Custom mimetype" : "Aina maalum ya mime",
+ "Select a file type" : "Chagua aina ya faili",
+ "e.g. httpd/unix-directory" : "e.g. httpd/unix-directory",
+ "Please enter a valid time span" : "Tafadhali ingiza muda halali",
+ "Files WebDAV" : "Faili za WebDAV",
+ "Custom URL" : "URL maalum",
+ "Select a request URL" : "Chagua URL ya ombi",
+ "Android client" : "Mteja wa Android",
+ "iOS client" : "Mteja wa iOS",
+ "Desktop client" : "Mteja wa eneo-kazi",
+ "Thunderbird & Outlook addons" : "Viongezeo vya Thunderbird na Outlook",
+ "Custom user agent" : "Wakala maalum wa mtumiaji ",
+ "Select a user agent" : "Chagua wakala wa mtumiaji",
+ "Select groups" : "Chagua makundi",
+ "Groups" : "Makundi",
+ "Type to search for group …" : "Andika kutafuta kikundi …",
+ "Select a trigger" : "Chagua kichocheo",
+ "At least one event must be selected" : "Angalau tukio moja lazima lichaguliwe",
+ "Add new flow" : "Ongeza mtiririko mpya",
+ "The configuration is invalid" : "Usanidi si sahihi",
+ "Active" : "Hai",
+ "Save" : "Hifadhi",
+ "When" : "Lini",
+ "and" : "na",
+ "Add a new filter" : "Ongeza kichujio kipya",
+ "Cancel" : "Sitisha",
+ "Delete" : "Futa",
+ "Available flows" : "Mitiririko inayopatikana",
+ "For details on how to write your own flow, check out the development documentation." : "Kwa maelezo kuhusu jinsi ya kuandika mtiririko wako mwenyewe, angalia nyaraka za maendeleo.",
+ "No flows installed" : "Hakuna mtiririko uliowekwa",
+ "Ask your administrator to install new flows." : "Muulize msimamizi wako aweke mitiririko mipya.",
+ "More flows" : "Mtiririko zaidi",
+ "Browse the App Store" : "Vinjari hifadhi ya Programu",
+ "Show less" : "Onesha kidogo",
+ "Show more" : "Onesha zaidi",
+ "Configured flows" : "Mitiririko iliyosanidiwa",
+ "Your flows" : "Mitiririko yako",
+ "No flows configured" : "Hakuna mitiririko iliyosanidiwa",
+ "matches" : "inafanana",
+ "does not match" : "haifanani",
+ "is" : "ni",
+ "is not" : "si",
+ "File name" : "Jina la faili",
+ "File MIME type" : "Aina ya MIME ya faili",
+ "File size (upload)" : "Ukubwa wa faili (kupakia)",
+ "less" : "chini",
+ "less or equals" : "chini au sawa na",
+ "greater or equals" : "kubwa au sawa na",
+ "greater" : "kubwa",
+ "Request remote address" : "Omba anwani ya mbali",
+ "matches IPv4" : "Inafanana na IPv4",
+ "does not match IPv4" : "haifanani na IPv4",
+ "matches IPv6" : "inafanana na IPv6",
+ "does not match IPv6" : "haifanani na IPv6",
+ "File system tag" : "Lebo ya mfumo wa faili",
+ "is tagged with" : "Imewekewa alama na",
+ "is not tagged with" : "haijawekewa alama na",
+ "Request URL" : "Omba URL",
+ "Request time" : "Muda wa ombi",
+ "between" : "kati ya",
+ "not between" : "si kati ya",
+ "Request user agent" : "Omba wakala wa mtumiaji",
+ "Group membership" : "Uanachama wa kikundi",
+ "is member of" : "ni mwanachama wa",
+ "is not member of" : "si mwanachama wa"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/workflowengine/l10n/sw.json b/apps/workflowengine/l10n/sw.json
new file mode 100644
index 00000000000..a0d1179f2d9
--- /dev/null
+++ b/apps/workflowengine/l10n/sw.json
@@ -0,0 +1,121 @@
+{ "translations": {
+ "The given operator is invalid" : "Opereta uliyopewa si sahihi",
+ "The given regular expression is invalid" : "Msemo wa kawaida uliotolewa si sahihi",
+ "The given file size is invalid" : "Ukubwa wa faili uliotolewa si sahihi",
+ "The given tag id is invalid" : "Kitambulisho cha lebo kilichotolewa si sahihi",
+ "The given IP range is invalid" : "Anuwai ya IP iliyotolewa si sahihi",
+ "The given IP range is not valid for IPv4" : "Anuwai ya IP iliyotolewa si halali kwa IPv4",
+ "The given IP range is not valid for IPv6" : "Anuwai ya IP iliyotolewa si halali kwa IPv6",
+ "The given time span is invalid" : "Muda uliyopewa si sahihi",
+ "The given start time is invalid" : "Muda wa kuanza uliyopewa si sahihi",
+ "The given end time is invalid" : "Muda wa kumaliza uliyopewa ni batili",
+ "The given group does not exist" : "Kundi lililotolewa halipo",
+ "File" : "Faili",
+ "File created" : "Faili imeundwa",
+ "File updated" : "Faili imesasishwa",
+ "File renamed" : "Faili imepewa jina upya",
+ "File deleted" : "Faili imefutwa",
+ "File accessed" : "Faili imefikiwa",
+ "File copied" : "Faili imenakiliwa",
+ "Tag assigned" : "Lebo imetolewa",
+ "Someone" : "Mtu fulani",
+ "%s created %s" : "%s imeundwa %s",
+ "%s modified %s" : "%s imeboreshwa %s",
+ "%s deleted %s" : "%s imefutwa %s",
+ "%s accessed %s" : "%s imefikiwa %s",
+ "%s renamed %s" : "%s imepewa jina jipya %s",
+ "%s copied %s" : "%s imenakiliwa %s",
+ "%s assigned %s to %s" : "%simekabidhiwa %s kwa %s",
+ "Operation #%s does not exist" : "Operesheni #%s haipo",
+ "Entity %s does not exist" : "Huluki %s haipo",
+ "Entity %s is invalid" : "Huluki %s si sahihi",
+ "No events are chosen." : "Hakuna matukio yaliyochaguliwa.",
+ "Entity %s has no event %s" : "Huluki %s haina tukio %s",
+ "Operation %s does not exist" : "Operesheni %s haipo",
+ "Operation %s is invalid" : "Operesheni %s si sahihi",
+ "At least one check needs to be provided" : "Angalau hundi moja inahitaji kutolewa",
+ "The provided operation data is too long" : "Taarifa za operesheni zilizotolewa ni ndefu sana",
+ "Invalid check provided" : "Hundi batili imetolewa",
+ "Check %s does not exist" : "Angalia %s haipo",
+ "Check %s is invalid" : "Angalia %s si sahihi",
+ "Check %s is not allowed with this entity" : "Kukagua %s hairuhusiwi na huluki hii",
+ "The provided check value is too long" : "Thamani ya hundi iliyotolewa ni ndefu sana",
+ "Check #%s does not exist" : "Ukaguzi #%s haupo",
+ "Check %s is invalid or does not exist" : "Angalia %s si sahihi au haipo",
+ "Flow" : "Mtiririko",
+ "Nextcloud workflow engine" : "Injini ya mtiririko wa kazi ya Nextcloud",
+ "Select a filter" : "Chagua kichujio",
+ "Select a comparator" : "Chagua kipimajoto",
+ "Remove filter" : "Ondoa kichujio",
+ "Folder" : "Kisanduku",
+ "Images" : "Picha",
+ "Office documents" : "Nyaraka za ofisi",
+ "PDF documents" : "Nyaraka za PDF",
+ "Custom MIME type" : "Aina ya MIME ya kawaida",
+ "Custom mimetype" : "Aina maalum ya mime",
+ "Select a file type" : "Chagua aina ya faili",
+ "e.g. httpd/unix-directory" : "e.g. httpd/unix-directory",
+ "Please enter a valid time span" : "Tafadhali ingiza muda halali",
+ "Files WebDAV" : "Faili za WebDAV",
+ "Custom URL" : "URL maalum",
+ "Select a request URL" : "Chagua URL ya ombi",
+ "Android client" : "Mteja wa Android",
+ "iOS client" : "Mteja wa iOS",
+ "Desktop client" : "Mteja wa eneo-kazi",
+ "Thunderbird & Outlook addons" : "Viongezeo vya Thunderbird na Outlook",
+ "Custom user agent" : "Wakala maalum wa mtumiaji ",
+ "Select a user agent" : "Chagua wakala wa mtumiaji",
+ "Select groups" : "Chagua makundi",
+ "Groups" : "Makundi",
+ "Type to search for group …" : "Andika kutafuta kikundi …",
+ "Select a trigger" : "Chagua kichocheo",
+ "At least one event must be selected" : "Angalau tukio moja lazima lichaguliwe",
+ "Add new flow" : "Ongeza mtiririko mpya",
+ "The configuration is invalid" : "Usanidi si sahihi",
+ "Active" : "Hai",
+ "Save" : "Hifadhi",
+ "When" : "Lini",
+ "and" : "na",
+ "Add a new filter" : "Ongeza kichujio kipya",
+ "Cancel" : "Sitisha",
+ "Delete" : "Futa",
+ "Available flows" : "Mitiririko inayopatikana",
+ "For details on how to write your own flow, check out the development documentation." : "Kwa maelezo kuhusu jinsi ya kuandika mtiririko wako mwenyewe, angalia nyaraka za maendeleo.",
+ "No flows installed" : "Hakuna mtiririko uliowekwa",
+ "Ask your administrator to install new flows." : "Muulize msimamizi wako aweke mitiririko mipya.",
+ "More flows" : "Mtiririko zaidi",
+ "Browse the App Store" : "Vinjari hifadhi ya Programu",
+ "Show less" : "Onesha kidogo",
+ "Show more" : "Onesha zaidi",
+ "Configured flows" : "Mitiririko iliyosanidiwa",
+ "Your flows" : "Mitiririko yako",
+ "No flows configured" : "Hakuna mitiririko iliyosanidiwa",
+ "matches" : "inafanana",
+ "does not match" : "haifanani",
+ "is" : "ni",
+ "is not" : "si",
+ "File name" : "Jina la faili",
+ "File MIME type" : "Aina ya MIME ya faili",
+ "File size (upload)" : "Ukubwa wa faili (kupakia)",
+ "less" : "chini",
+ "less or equals" : "chini au sawa na",
+ "greater or equals" : "kubwa au sawa na",
+ "greater" : "kubwa",
+ "Request remote address" : "Omba anwani ya mbali",
+ "matches IPv4" : "Inafanana na IPv4",
+ "does not match IPv4" : "haifanani na IPv4",
+ "matches IPv6" : "inafanana na IPv6",
+ "does not match IPv6" : "haifanani na IPv6",
+ "File system tag" : "Lebo ya mfumo wa faili",
+ "is tagged with" : "Imewekewa alama na",
+ "is not tagged with" : "haijawekewa alama na",
+ "Request URL" : "Omba URL",
+ "Request time" : "Muda wa ombi",
+ "between" : "kati ya",
+ "not between" : "si kati ya",
+ "Request user agent" : "Omba wakala wa mtumiaji",
+ "Group membership" : "Uanachama wa kikundi",
+ "is member of" : "ni mwanachama wa",
+ "is not member of" : "si mwanachama wa"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file