Compare commits

...

132 Commits

Author SHA1 Message Date
Git'Fellow 8bb31e0fec fix(files/cache): uniqueness guarantees in the file cache layer
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-04-11 12:23:04 +02:00
Nextcloud bot f8dbe2349a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-11 00:19:28 +00:00
Louis 0b74ccd426 Merge pull request #59558 from nextcloud/artonge/fix/ldap_credentials_wizards
fix(user_ldap): Do not require credentials in wizard
2026-04-10 18:30:52 +02:00
Joas Schilling a2bb782f66 Merge pull request #59566 from nextcloud/bugfix/noid/fix-reverting-multibyte-strings
fix(testing): Fix fake provider reverting strings with emojis
2026-04-10 18:14:37 +02:00
Joas Schilling b2fef6a112 Merge pull request #59564 from nextcloud/followup/59543/remove-reference-of-old-method
docs(workflowengine): Remove reference of removed method
2026-04-10 16:16:52 +02:00
Joas Schilling a8345b1da7 Merge pull request #59557 from nextcloud/dependabot/composer/aws/aws-sdk-php-3.374.2
build(deps): bump aws/aws-sdk-php to 3.376
2026-04-10 16:07:54 +02:00
Joas Schilling 43c5fd3f76 fix(testing): Fix fake provider reverting strings with emojis
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-10 16:03:25 +02:00
nextcloud-command d407cdd861 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-10 13:34:44 +00:00
Joas Schilling 0c5e1b2ee3 build(deps): bump aws/aws-sdk-php to 3.376
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-10 14:32:21 +02:00
Joas Schilling 8fad0ceffc docs(workflowengine): Remove reference of removed method
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-10 14:13:53 +02:00
Louis Chmn c181720a89 fix(user_ldap): Do not require credentials in wizard
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-04-10 10:41:54 +02:00
Joas Schilling 4841e6ee63 Merge pull request #59529 from nextcloud/dependabot/composer/phpseclib/phpseclib-2.0.52
build(deps): bump phpseclib/phpseclib from 2.0.47 to 2.0.52
2026-04-10 07:03:40 +02:00
Carl Schwan 52ce67b799 Merge pull request #59543 from nextcloud/chore/remove-workflowengine-deprecated-stuff
chore: Remove long-time deprecated things from workflowengine
2026-04-10 02:57:32 +02:00
Nextcloud bot 3c3cbd16b5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-10 00:19:14 +00:00
Carl Schwan 14472cb8cc Merge pull request #59511 from nextcloud/public-share-only-mask-home
Only mask the permissions for the users home directory for public shares
2026-04-10 01:54:17 +02:00
Ferdinand Thiessen 033e78e587 Merge pull request #59289 from nextcloud/fix/sharing-pwd
fix(sharing): show common confirmation on password reset
2026-04-09 19:22:09 +02:00
Ferdinand Thiessen 909ff0e4f1 Merge pull request #59426 from nextcloud/fix/wfe-scripts
fix(workflowengine): remove non existing script loading
2026-04-09 19:12:49 +02:00
Joas Schilling 8ea3fba96e ci(psalm): Update baseline
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-09 18:21:18 +02:00
Côme Chilliet f445c14b76 chore: Update psalm baseline
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-04-09 18:03:18 +02:00
nextcloud-command 17c223efbf chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-09 15:59:10 +00:00
Côme Chilliet 94774ca5c3 chore: Remove long-time deprecated things from workflowengine
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-04-09 17:04:52 +02:00
Ferdinand Thiessen c96099183e fix(sharing): show common confirmation on password reset
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-09 16:59:19 +02:00
Joas Schilling 00609572e4 build(deps): bump phpseclib/phpseclib from 2.0.47 to 2.0.52
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-09 16:28:21 +02:00
Robin Appelman 3cd3c6dd90 fix: only mask the permissions for the users home directory for public shares
this ensures that versions/trashbin/etc is still usable

Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-09 16:19:10 +02:00
Robin Appelman e96a89e630 feat: add permissions mask variant that only masks one directory
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-09 16:19:10 +02:00
Ferdinand Thiessen 1219c8e152 Merge pull request #59325 from mykh-hailo/fix/profile-ui
fix: profile page on small screens
2026-04-09 15:43:38 +02:00
Louis e3e499a63a Merge pull request #59348 from mykh-hailo/feat/ui-enhancement
feat: remove password column from user table
2026-04-09 12:45:26 +02:00
Joas Schilling 9ff0adf239 Merge pull request #59522 from nextcloud/bugfix/noid/make-maintenance-mode-more-obvious
fix(updater): Make "maintenance mode kept active" more obvious
2026-04-09 10:37:44 +02:00
Joas Schilling d6ee1eafa3 fix(updater): Make "maintenance mode kept active" more obvious
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-09 09:10:21 +02:00
Benjamin Gaussorgues c835064a6b Merge pull request #59494 from nextcloud/artonge/fix/drop_transaction_during_scans 2026-04-09 08:56:50 +02:00
Nextcloud bot 5b7ea4e858 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-09 00:19:00 +00:00
mykh-hailo d3ef95c78f fix: profile page on small screens
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-08 13:13:42 -04:00
Robin Appelman e761005e52 Merge pull request #57360 from nextcloud/fix/trashbin-atomic-cache
fix(trashbin): keep cache and db consistent
2026-04-08 18:04:25 +02:00
mykh-hailo 415ecb1cf5 feat: remove password column from user table
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-08 12:03:56 -04:00
Ferdinand Thiessen a30653c6cb Merge pull request #59486 from nextcloud/fix/drop-files-subfolder
fix(files): properly handle dropped files on subfolders
2026-04-08 17:43:07 +02:00
nextcloud-command 48c3933cb6 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-08 15:22:45 +00:00
Ferdinand Thiessen d02df72efe fix(files): properly handle dropped files on subfolders
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-08 17:03:24 +02:00
Git'Fellow 9fd6c4abc1 Merge pull request #59296 from nextcloud/automated/noid/rector-changes
Apply rector changes
2026-04-08 15:29:02 +02:00
Louis Chmn 680ddd93c2 fix(Scanner): Remove high level transaction during scans
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-04-08 14:34:45 +02:00
Louis Chmn 72812b2b07 chore(Scanner): Use modern syntax and APIs
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-04-08 12:26:55 +02:00
Nextcloud bot 2d91bdd74c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-08 00:19:10 +00:00
Ferdinand Thiessen 053f725f98 Merge pull request #59427 from nextcloud/fix/dashboard-list
fix(dashboard): remove status list if there are none
2026-04-07 17:27:32 +02:00
Ferdinand Thiessen 0b5ce4e78a Merge pull request #59423 from nextcloud/fix/webauthn-list
fix(settings): hide list of webauthn devices if empty
2026-04-07 17:27:12 +02:00
nextcloud-command 2fd8961b85 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 15:10:00 +00:00
nextcloud-command 9d70509221 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 15:05:32 +00:00
Ferdinand Thiessen 29628eba33 fix(dashboard): remove status list if there are none
- resolves https://github.com/nextcloud/server/issues/59334

If there are no status entries the list must be removed.
Its not valid to show an empty list as per accessibility rules:
https://www.w3.org/TR/wai-aria-1.2/#mustContain

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 16:56:30 +02:00
Ferdinand Thiessen b060efaca4 fix(settings): hide list of webauthn devices if empty
- resolves https://github.com/nextcloud/server/issues/59339

If there are no devices the list would be empty.
This is invalid for accessibility, as every list needs at least one
listitem.
Ref: https://www.w3.org/TR/wai-aria-1.2/#mustContain

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 16:56:21 +02:00
Ferdinand Thiessen 13583e8c6b Merge pull request #59424 from nextcloud/fix/systemtags-inline
fix(systemtags): only render inline list of tags if there are some
2026-04-07 16:55:25 +02:00
Ferdinand Thiessen 0526c18ac2 Merge pull request #59430 from nextcloud/chore/logger
refactor(files): use consistent logger import
2026-04-07 16:55:11 +02:00
Louis 239c8ccfe1 Merge pull request #59463 from nextcloud/automated/noid/update-min-supported-desktop-version
chore: Update minimum supported desktop version to 3.1.83
2026-04-07 15:58:29 +02:00
nextcloud-command b9e4a2a115 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 13:47:58 +00:00
Benjamin Gaussorgues 1ed4f74551 Merge pull request #58892 from nextcloud/chore/add-test-snowflake-32 2026-04-07 15:47:50 +02:00
nextcloud-command 66881a7cc9 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 13:39:54 +00:00
Ferdinand Thiessen a58a2961f3 fix(systemtags): only render inline list of tags if there are some
- resolves #59332

If there are no tags available, then we cannot render an `<ul>` element
as this would result in invalid HTML / invalid accessibility state.
Ref: https://www.w3.org/TR/wai-aria-1.2/#mustContain

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 14:45:44 +02:00
Ferdinand Thiessen 044f4f076e refactor(files): use consistent logger import
We try to use named exports everywhere so also for the logger for
consistency. Also the logger is more of a util then a main entry point
so moved the implementation to the utils directory.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 14:41:03 +02:00
Côme Chilliet 3f6d0c4192 Merge pull request #59462 from Keeper-of-the-Keys/config-header-attempt-2
feat: add config header and tests.
2026-04-07 14:40:33 +02:00
Carl Schwan c61b17f4a0 Merge pull request #59382 from nextcloud/supressStreamSabreDav
fix(zip): suppress sabre/dav response only if stream was actually sent
2026-04-07 14:05:52 +02:00
Joas Schilling bb0841b81e Merge pull request #59407 from nextcloud/bugfix/noid/make-appointments-talk-meetings
feat(talk): Allow to create conversations that are meetings
2026-04-07 13:33:56 +02:00
Joas Schilling 3f52005674 feat(talk): Allow to create conversations that are meetings
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-07 13:00:29 +02:00
Kent Delante 51cde1a57a Merge pull request #59001 from IONOS-Productivity/tkl/dev/files_external-delegation-rebased-on-NC
feat(files_external): convert to delegated settings
2026-04-07 17:24:03 +08:00
Côme Chilliet c20fcccfa6 Merge pull request #59379 from nextcloud/fix/clean-ldap-ocp-typing
fix: Fix typing in LDAP provider public interfaces
2026-04-07 10:52:36 +02:00
E.S. Rosenberg a.k.a. Keeper of the Keys 3f539d78e3 fix: change config-warning to const per @come-nc request in the PR.
Signed-off-by: E.S. Rosenberg a.k.a. Keeper of the Keys <es-github@rosenberg.org.il>
2026-04-07 11:47:14 +03:00
Côme Chilliet f34d7bef6a Merge pull request #59323 from nextcloud/jtr/ci-path-filter-rector
ci: add path filtering to rector workflow
2026-04-07 10:27:45 +02:00
Tatjana Kaschperko Lindt faff52dff2 feat(files_external): allow delegated admins to search applicable users/groups
Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
2026-04-07 10:09:53 +02:00
Tatjana Kaschperko Lindt 5852eaae0b feat(files_external): allow delegated admins to save global credentials
Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
2026-04-07 10:09:53 +02:00
Tatjana Kaschperko Lindt 67deefe3fb feat(files_external): add #[AuthorizedAdminSetting] to GlobalStoragesController
Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
2026-04-07 10:09:53 +02:00
Tatjana Kaschperko Lindt 14ae3f1a65 feat(files_external): convert to delegated settings
Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
2026-04-07 10:09:53 +02:00
Benjamin Gaussorgues 83e464c3e8 Merge pull request #59255 from moktamd/fix/metrics-escape-label-names 2026-04-07 09:00:10 +02:00
Nextcloud bot ed51f10b73 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-07 00:37:32 +00:00
github-actions[bot] 763a52e2fc Merge pull request #59473 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/vite-7.3.2
chore(deps-dev): Bump vite from 7.3.1 to 7.3.2 in /build/frontend-legacy
2026-04-07 02:14:59 +02:00
dependabot[bot] 58ad5b1a80 chore(deps-dev): Bump vite from 7.3.1 to 7.3.2 in /build/frontend-legacy
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.1 to 7.3.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.3.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 21:52:57 +00:00
nextcloud-command c5e3677d28 chore: Update minimum supported desktop version
Signed-off-by: GitHub <noreply@github.com>
2026-04-06 00:47:07 +00:00
Nextcloud bot b012e5cc16 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-06 00:21:20 +00:00
E.S. Rosenberg a.k.a. Keeper of the Keys 52d092da64 feat: add config header and tests.
Signed-off-by: E.S. Rosenberg a.k.a. Keeper of the Keys <es-github@rosenberg.org.il>
2026-04-06 00:46:26 +03:00
nextcloud-command bf729c53d7 refactor: Apply rector changes
Signed-off-by: GitHub <noreply@github.com>
2026-04-05 14:47:27 +00:00
Nextcloud bot 1afeb1c2d3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-05 00:18:52 +00:00
Nextcloud bot 9a24eaa275 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-04 00:18:47 +00:00
github-actions[bot] fc18ce9cae Merge pull request #59414 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/lodash-4.18.1
chore(deps): Bump lodash from 4.17.23 to 4.18.1 in /build/frontend-legacy
2026-04-03 16:11:25 +00:00
nextcloud-command 137e94bec2 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-03 15:55:16 +00:00
dependabot[bot] 8c55673a25 chore(deps): Bump lodash in /build/frontend-legacy
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-03 17:47:41 +02:00
Ferdinand Thiessen 645350d4b2 fix(workflowengine): remove non existing script loading
- resolves https://github.com/nextcloud/server/issues/59385

The script does not exist anymore, so remove it.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-03 17:23:43 +02:00
Benjamin Gaussorgues 1b241388ee chore(tests): run 32 bits tests when PreviewMapper test change
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-04-03 17:01:47 +02:00
Benjamin Gaussorgues 71aa36860f chore(tests): check Snowflake ID preserved in 32 bits
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-04-03 17:00:01 +02:00
Ferdinand Thiessen 92e4c882fc Merge pull request #59415 from hamidout/fix/user-ldap-last-login-config-key
fix(user_ldap): fix lastLogin reading wrong appid and configkey
2026-04-03 15:00:44 +02:00
hamid b7d6822592 fix(user_ldap): fix lastLogin reading wrong appid and configkey
fetchDetails() was calling getValueInt($uid, 'user_ldap', 'email')
instead of getValueInt($uid, 'login', 'lastLogin'), causing lastLogin
to always return 0 for offline LDAP users.

Fixes #58421

Signed-off-by: hamid <hamid@webpick.net>
2026-04-03 13:06:49 +01:00
Nextcloud bot ae45f67a75 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-03 00:18:44 +00:00
Ferdinand Thiessen 521e61828f Merge pull request #59335 from mykh-hailo/fix/duplicate-dashboard-widget
fix: duplicate dashboard widget
2026-04-02 23:22:12 +02:00
mykh-hailo 708fa13428 fix: move sanitize directly to sanitizeLayout
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-02 20:20:19 +02:00
mykh-hailo 5a8292fe43 fix: duplicate dashboard widget
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-02 20:20:19 +02:00
Ferdinand Thiessen c0cab68f8b Merge pull request #59388 from nextcloud/fix/noid/files-search-default-limit
fix(file-search): use default limit to search query if not provided on request body
2026-04-02 20:13:40 +02:00
Git'Fellow 1a2d36af39 Merge pull request #59267 from nextcloud/backport/59262/master
fix(files_sharing): do not prevent share creation if password is enabled but not supported by the current share type
2026-04-02 17:35:23 +02:00
Joas Schilling 60d71a99e2 Merge pull request #59370 from nextcloud/docs/adapt-codeowners
docs(webhook_listeners): adapt codeowners
2026-04-02 12:15:47 +02:00
Joas Schilling 532ba405cf Merge pull request #59341 from nextcloud/3rdparty/upgrade-zipstreamer
chore(dependencies): upgrade zipstreamer in 3rdparty
2026-04-02 11:33:25 +02:00
John Molakvoæ ca3f77bea2 Merge pull request #58872 from nextcloud/fix/templatespath 2026-04-02 11:27:31 +02:00
Joas Schilling 95e94556e1 Merge pull request #59394 from nextcloud/bugfix/noid/dont-register-invalid-routes
fix(settings): Don't register invalid routes
2026-04-02 11:26:09 +02:00
Ferdinand Thiessen 28724fe496 Merge pull request #59365 from nextcloud/fix/default-values
fix(files_external): properly set default values for backend options
2026-04-02 11:04:06 +02:00
Git'Fellow f637e1c6a2 Merge pull request #59330 from nextcloud/btnOpenShare-2
fix: update email button text to 'Open shared item'
2026-04-02 11:03:43 +02:00
Salvatore Martire c5f4ac1253 chore(dependencies): upgrade zipstreamer in 3rdparty
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-04-02 10:44:10 +02:00
Joas Schilling baec1727b3 fix(settings): Don't register invalid routes
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-02 09:30:15 +02:00
nextcloud-command b3fa62fc3d chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-02 01:56:07 +00:00
Ferdinand Thiessen d3e5a764ba fix(files_external): properly set default values for backend options
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-02 03:47:33 +02:00
Ferdinand Thiessen 456684f138 Merge pull request #59362 from nextcloud/test/deprecations
test: resolve PHPUnit deprecation warning about `addMethods`
2026-04-02 03:46:55 +02:00
Nextcloud bot 04c12502d1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-02 00:19:14 +00:00
nextcloud-command 1bbceea598 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-01 21:22:25 +00:00
skjnldsv 661739c9d7 fix(files_sharing): do not prevent share creation if password is enabled but not supported by the current share type
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2026-04-01 21:20:21 +00:00
Ferdinand Thiessen 03c318d730 Merge pull request #58353 from nextcloud/refactor/55428/comments
refactor(comments): migrate to Vue 3
2026-04-01 20:49:24 +02:00
Robin Appelman 0317e002f3 test: skip testTrashEntryCreatedWhenSourceNotInCache on object store
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 20:23:42 +02:00
Cristian Scheid 3539476d12 fix(file-search): use default limit to search query if not provided on request body
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-04-01 14:55:04 -03:00
Robin Appelman 966db54089 chore: psalm fix
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 19:25:27 +02:00
Robin Appelman b76cdd09cc fix: catch all exceptions during trashbin cache move
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 19:24:26 +02:00
Robin Appelman 921ee17026 test: add test for trashbin when cross-storage move fails
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 19:24:25 +02:00
Robin Appelman 7eae0e5f8c chore: deduplicate trashbin row delete logic
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 18:09:29 +02:00
Hoang Pham b7150ad88c perf(trashbin): avoid full rescan for uncached moves
Signed-off-by: Hoang Pham <hoangmaths96@gmail.com>
2026-04-01 18:00:21 +02:00
Hoang Pham eedd8dce3c fix(trashbin): keep metadata consistent on move
Signed-off-by: Hoang Pham <hoangmaths96@gmail.com>
2026-04-01 18:00:21 +02:00
Hoang Pham ac9c17c7b8 fix: keep trashbin cache and db in sync
Signed-off-by: Hoang Pham <hoangmaths96@gmail.com>
2026-04-01 18:00:19 +02:00
nextcloud-command 78098c8325 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-01 13:41:02 +00:00
Git'Fellow d03604a887 fix(zip): suppress sabre/dav response if stream was actually sent
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-04-01 14:58:27 +02:00
Ferdinand Thiessen e8c47cf3ec fix: properly load async components
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Ferdinand Thiessen 324ebd144c fix: add compatibility layer for apps expecting Vue 2 API
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Ferdinand Thiessen e26588d78c chore: fix ESLint errors
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Edward Ly c56ebcecb2 refactor(comments): migrate to Vue 3
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Edward Ly 3aa22804e1 refactor(comments): migrate to TypeScript
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Edward Ly 4edf863803 build(comments): move from frontend-legacy to frontend
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Jana Peper b87d71c4e5 docs(webhook_listeners): adapt codeowners
Signed-off-by: Jana Peper <jana.peper@nextcloud.com>
2026-04-01 14:48:50 +02:00
Côme Chilliet 99a8e6c3c4 fix: Fix typing in LDAP provider public interfaces
Remove obsolete `resource` typing for ldap with PHP>=8.1.
Add proper attributes.
Add strong typing.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-04-01 14:36:40 +02:00
John Molakvoæ bb1ad1ca15 Merge pull request #59372 from nextcloud/carl/silent-warning-zip 2026-04-01 14:19:13 +02:00
Carl Schwan 7eb0ba9feb fix(zip): Fix warning when downloading Zip file
The HEAD request, create a GET subrequest which is not compatible with
the ZIP plugin since the ZIP plugin is directly streaming the content to
php://output, so we were sending the content in a HEAD request and
creating the ZIP twice and this was creating various warning in logs
too.

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-04-01 12:19:43 +02:00
Ferdinand Thiessen e0c1b74419 test: resolve PHPUnit deprecation warning about addMethods
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 01:12:52 +02:00
moktamd 1c33307a59 fix(metrics): validate label names in Metric, sanitize in AppsInfo
Add validation in the Metric constructor that rejects invalid
OpenMetrics label names with InvalidArgumentException. Sanitize
app IDs at the source in AppsInfo by replacing hyphens with
underscores before creating the Metric.

Fixes nextcloud/server#59247

Signed-off-by: moktamd <moktamd@users.noreply.github.com>
2026-03-31 11:20:40 +00:00
Git'Fellow 545a9c1c73 fix: update email button text to 'Open shared item'
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-31 11:27:58 +02:00
Josh 7ccc7a69f7 ci: add path filtering to rector workflow
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 19:11:49 -04:00
John Molakvoæ (skjnldsv) 5fdebf923c fix(lib): templates core path detection
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2026-03-11 17:24:11 +01:00
1141 changed files with 8419 additions and 7047 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ package-lock.json @nextcloud/server-dependabot
/apps/user_ldap/appinfo/info.xml @come-nc @blizzz
/apps/user_status/appinfo/info.xml @Antreesy @nickvergessen
/apps/weather_status/appinfo/info.xml @julien-nc @juliusknorr
/apps/webhook_listeners/appinfo/info.xml @come-nc @julien-nc
/apps/webhook_listeners/appinfo/info.xml @janepie @julien-nc
/apps/workflowengine/appinfo/info.xml @blizzz @juliusknorr
# Files frontend expertise
+1
View File
@@ -9,6 +9,7 @@ on:
- ".github/workflows/phpunit-32bits.yml"
- "tests/phpunit-autotest.xml"
- "lib/private/Snowflake/*"
- "tests/lib/Preview/PreviewMapperTest.php"
workflow_dispatch:
schedule:
- cron: "15 1 * * 1-6"
+39 -1
View File
@@ -13,10 +13,34 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest-low
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- '3rdparty/**'
- '**/lib/**'
- '**/tests/**'
- '**/vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
- '**.php'
strict:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -43,3 +67,17 @@ jobs:
- name: Show changes
if: always()
run: git diff --exit-code -- . ':!lib/composer'
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, strict]
if: always()
name: rector-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.strict.result != 'success' }}; then exit 1; fi
+32 -27
View File
@@ -1,32 +1,37 @@
OC.L10N.register(
"comments",
{
"Comments" : "Comments",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "Edit comment",
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
"No more messages" : "No more messages",
"Retry" : "Retry",
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "Comment",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "Comment deleted",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment"
"Comments" : "კომენტარები",
"You commented" : "თქვენი კომენტარი",
"{author} commented" : "{author}-ის კომენტარი",
"You commented on %1$s" : "თქვენი კომენტარი %1$s-ზე",
"You commented on {file}" : "თქვენი კომენტარი {file}-ზე",
"%1$s commented on %2$s" : "%1$s-მა დატოვა კომენტარი %2$s-ზე",
"{author} commented on {file}" : "{author}-მა დატოვა კომენტარი {file}-ზე",
"<strong>Comments</strong> for files" : "<strong>კომენტარები</strong> ფაილებისთვის",
"Files" : "ფაილები",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "თქვენ გახსენეს \"{file}\"-ის კომენტარში ანგარიშიდან, რომელიც მის შემდეგ წაიშალა",
"{user} mentioned you in a comment on \"{file}\"" : "{user}-მა გახსენათ კომენტარში ფაილზე \"{file}\"",
"Files app plugin to add comments to files" : "Files აპის დამატება ფაილებზე კომენტარების დასამატებლად",
"Edit comment" : "კომენტარის ჩასწორება",
"Delete comment" : "კომენტარის წაშლა",
"Cancel edit" : "ჩასწორების გაუქმება",
"New comment" : "ახალი კომენტარი",
"Write a comment …" : "კომენტარის დაწერა …",
"Post comment" : "კომენტარის დაპოსტვა",
"@ for mentions, : for emoji, / for smart picker" : "@ ხსენებისთვის, : ემოჯისთვის, / ჭკვიანი ამრჩევისთვის",
"Could not reload comments" : "კომენტარების თავიდან ჩატვირთვა შეუძლებელია",
"Failed to mark comments as read" : "კომენტარების წაკითხულად მონიშვნა ჩავარდა",
"Unable to load the comments list" : "კომენტარების სიის ჩატვირთვა ჩავარდა",
"No comments yet, start the conversation!" : "ჯერ კომენტარები არაა. დაიწყეთ საუბარი!",
"No more messages" : "მეტი შეტყობინება აღარაა",
"Retry" : "თავიდან ცდა",
"_1 new comment_::_{unread} new comments_" : ["1 ახალი კომენტარი","{unread} ახალი კომენტარი"],
"Comment" : "კომენტარი",
"An error occurred while trying to edit the comment" : "კომენტარის ჩასწორებისას აღმოჩენილია შეცდომა",
"Comment deleted" : "კომენტარი წაიშალა",
"An error occurred while trying to delete the comment" : "კომენტარის წაშლისას აღმოჩენილია შეცდომა",
"An error occurred while trying to create the comment" : "კომენტარის შექმნისას აღმოჩენილია შეცდომა",
"Write a comment …" : "კომენტარის დაწერა …"
},
"nplurals=2; plural=(n!=1);");
+32 -27
View File
@@ -1,30 +1,35 @@
{ "translations": {
"Comments" : "Comments",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "Edit comment",
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
"No more messages" : "No more messages",
"Retry" : "Retry",
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "Comment",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "Comment deleted",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment"
"Comments" : "კომენტარები",
"You commented" : "თქვენი კომენტარი",
"{author} commented" : "{author}-ის კომენტარი",
"You commented on %1$s" : "თქვენი კომენტარი %1$s-ზე",
"You commented on {file}" : "თქვენი კომენტარი {file}-ზე",
"%1$s commented on %2$s" : "%1$s-მა დატოვა კომენტარი %2$s-ზე",
"{author} commented on {file}" : "{author}-მა დატოვა კომენტარი {file}-ზე",
"<strong>Comments</strong> for files" : "<strong>კომენტარები</strong> ფაილებისთვის",
"Files" : "ფაილები",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "თქვენ გახსენეს \"{file}\"-ის კომენტარში ანგარიშიდან, რომელიც მის შემდეგ წაიშალა",
"{user} mentioned you in a comment on \"{file}\"" : "{user}-მა გახსენათ კომენტარში ფაილზე \"{file}\"",
"Files app plugin to add comments to files" : "Files აპის დამატება ფაილებზე კომენტარების დასამატებლად",
"Edit comment" : "კომენტარის ჩასწორება",
"Delete comment" : "კომენტარის წაშლა",
"Cancel edit" : "ჩასწორების გაუქმება",
"New comment" : "ახალი კომენტარი",
"Write a comment …" : "კომენტარის დაწერა …",
"Post comment" : "კომენტარის დაპოსტვა",
"@ for mentions, : for emoji, / for smart picker" : "@ ხსენებისთვის, : ემოჯისთვის, / ჭკვიანი ამრჩევისთვის",
"Could not reload comments" : "კომენტარების თავიდან ჩატვირთვა შეუძლებელია",
"Failed to mark comments as read" : "კომენტარების წაკითხულად მონიშვნა ჩავარდა",
"Unable to load the comments list" : "კომენტარების სიის ჩატვირთვა ჩავარდა",
"No comments yet, start the conversation!" : "ჯერ კომენტარები არაა. დაიწყეთ საუბარი!",
"No more messages" : "მეტი შეტყობინება აღარაა",
"Retry" : "თავიდან ცდა",
"_1 new comment_::_{unread} new comments_" : ["1 ახალი კომენტარი","{unread} ახალი კომენტარი"],
"Comment" : "კომენტარი",
"An error occurred while trying to edit the comment" : "კომენტარის ჩასწორებისას აღმოჩენილია შეცდომა",
"Comment deleted" : "კომენტარი წაიშალა",
"An error occurred while trying to delete the comment" : "კომენტარის წაშლისას აღმოჩენილია შეცდომა",
"An error occurred while trying to create the comment" : "კომენტარის შექმნისას აღმოჩენილია შეცდომა",
"Write a comment …" : "კომენტარის დაწერა …"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
}
@@ -34,7 +34,8 @@ class LoadSidebarScripts implements IEventListener {
$this->commentsManager->load();
$this->initialState->provideInitialState('activityEnabled', $this->appManager->isEnabledForUser('activity'));
// Add comments sidebar tab script
// Add comments sidebar tab script/style
Util::addStyle(Application::APP_ID, 'comments-tab');
Util::addScript(Application::APP_ID, 'comments-tab', 'files');
}
}
@@ -7,7 +7,7 @@ import type { IFolder, IView } from '@nextcloud/files'
import { File, Permission } from '@nextcloud/files'
import { describe, expect, test, vi } from 'vitest'
import logger from '../logger.js'
import logger from '../logger.ts'
import { action } from './inlineUnreadCommentsAction.ts'
const view = {
@@ -8,8 +8,8 @@ import type { IFileAction } from '@nextcloud/files'
import CommentProcessingSvg from '@mdi/svg/svg/comment-processing.svg?raw'
import { getSidebar } from '@nextcloud/files'
import { n, t } from '@nextcloud/l10n'
import logger from '../logger.js'
import { isUsingActivityIntegration } from '../utils/activity.js'
import logger from '../logger.ts'
import { isUsingActivityIntegration } from '../utils/activity.ts'
export const action: IFileAction = {
id: 'comments-unread',
+27 -33
View File
@@ -4,46 +4,40 @@
*/
import type { INode } from '@nextcloud/files'
import type { App } from 'vue'
import moment from '@nextcloud/moment'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue, { type ComponentPublicInstance } from 'vue'
import logger from './logger.js'
import { getComments } from './services/GetComments.js'
Vue.use(PiniaVuePlugin)
let ActivityTabPluginView
let ActivityTabPluginInstance
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import logger from './logger.ts'
import { getComments } from './services/GetComments.ts'
/**
* Register the comments plugins for the Activity sidebar
*/
export function registerCommentsPlugins() {
let app: App
window.OCA.Activity.registerSidebarAction({
mount: async (el: HTMLElement, { node, reload }: { node: INode, reload: () => void }) => {
const pinia = createPinia()
if (!ActivityTabPluginView) {
if (!app) {
const { default: ActivityCommentAction } = await import('./views/ActivityCommentAction.vue')
// @ts-expect-error Types are broken for Vue2
ActivityTabPluginView = Vue.extend(ActivityCommentAction)
app = createApp(
ActivityCommentAction,
{
reloadCallback: reload,
resourceId: node.fileid,
},
)
}
ActivityTabPluginInstance = new ActivityTabPluginView({
el,
pinia,
propsData: {
reloadCallback: reload,
resourceId: node.fileid,
},
})
app.use(pinia)
app.mount(el)
logger.info('Comments plugin mounted in Activity sidebar action', { node })
},
unmount: () => {
// destroy previous instance if available
if (ActivityTabPluginInstance) {
ActivityTabPluginInstance.$destroy()
}
app?.unmount()
},
})
@@ -57,26 +51,26 @@ export function registerCommentsPlugins() {
)
logger.debug('Loaded comments', { node, comments })
const { default: CommentView } = await import('./views/ActivityCommentEntry.vue')
// @ts-expect-error Types are broken for Vue2
const CommentsViewObject = Vue.extend(CommentView)
return comments.map((comment) => ({
_CommentsViewInstance: undefined as ComponentPublicInstance | undefined,
_CommentsViewInstance: undefined as App | undefined,
timestamp: moment(comment.props?.creationDateTime).toDate().getTime(),
timestamp: Date.parse(comment.props?.creationDateTime as string | undefined ?? ''),
mount(element: HTMLElement, { reload }) {
this._CommentsViewInstance = new CommentsViewObject({
el: element,
propsData: {
const app = createApp(
CommentView,
{
comment,
resourceId: node.fileid,
reloadCallback: reload,
},
})
)
app.mount(element)
this._CommentsViewInstance = app
},
unmount() {
this._CommentsViewInstance?.$destroy()
this._CommentsViewInstance?.unmount()
},
}))
})
@@ -3,8 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import logger from './logger.js'
import CommentsInstance from './services/CommentsInstance.js'
import logger from './logger.ts'
import CommentsInstance from './services/CommentsInstance.ts'
// Init Comments
if (window.OCA && !window.OCA.Comments) {
+15 -14
View File
@@ -13,7 +13,7 @@
<!-- Author -->
<NcAvatar
class="comment__avatar"
:display-name="actorDisplayName"
:displayName="actorDisplayName"
:user="actorId"
:size="32" />
</div>
@@ -26,7 +26,7 @@
<NcActions v-if="isOwnComment && id && !loading" class="comment__actions">
<template v-if="!editing">
<NcActionButton
close-after-click
closeAfterClick
@click="onEdit">
<template #icon>
<IconPencilOutline :size="20" />
@@ -35,7 +35,7 @@
</NcActionButton>
<NcActionSeparator />
<NcActionButton
close-after-click
closeAfterClick
@click="onDeleteWithUndo">
<template #icon>
<IconTrashCanOutline :size="20" />
@@ -60,7 +60,7 @@
v-else-if="creationDateTime"
class="comment__timestamp"
:timestamp="timestamp"
:ignore-seconds="true" />
:ignoreSeconds="true" />
</div>
<!-- Message editor -->
@@ -68,14 +68,14 @@
<div class="comment__editor-group">
<NcRichContenteditable
ref="editor"
:auto-complete="autoComplete"
v-model="localMessage"
:autoComplete
:contenteditable="!loading"
:label="editor ? t('comments', 'New comment') : t('comments', 'Edit comment')"
:placeholder="t('comments', 'Write a comment ')"
:model-value="localMessage"
:user-data="userData"
:userData
aria-describedby="tab-comments__editor-description"
@update:value="updateLocalMessage"
@update:modelValue="submitted = false"
@submit="onSubmit" />
<div class="comment__submit">
<NcButton
@@ -103,8 +103,8 @@
:class="{ 'comment__message--expanded': expanded }"
:text="richContent.message"
:arguments="richContent.mentions"
use-markdown
@click.native="onExpand" />
useMarkdown
@click="onExpand" />
</div>
</component>
</template>
@@ -113,6 +113,7 @@
import { getCurrentUser } from '@nextcloud/auth'
import { translate as t } from '@nextcloud/l10n'
import { mapStores } from 'pinia'
import { defineAsyncComponent } from 'vue'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActions from '@nextcloud/vue/components/NcActions'
import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'
@@ -125,12 +126,12 @@ import IconArrowRight from 'vue-material-design-icons/ArrowRight.vue'
import IconClose from 'vue-material-design-icons/Close.vue'
import IconPencilOutline from 'vue-material-design-icons/PencilOutline.vue'
import IconTrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'
import CommentMixin from '../mixins/CommentMixin.js'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.js'
import CommentMixin from '../mixins/CommentMixin.ts'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.ts'
// Dynamic loading
const NcRichContenteditable = () => import('@nextcloud/vue/components/NcRichContenteditable')
const NcRichText = () => import('@nextcloud/vue/components/NcRichText')
const NcRichContenteditable = defineAsyncComponent(() => import('@nextcloud/vue/components/NcRichContenteditable'))
const NcRichText = defineAsyncComponent(() => import('@nextcloud/vue/components/NcRichText'))
export default {
/* eslint vue/multi-word-component-names: "warn" */
+10 -16
View File
@@ -4,17 +4,13 @@
*/
import MessageReplyText from '@mdi/svg/svg/message-reply-text.svg?raw'
import { getCSPNonce } from '@nextcloud/auth'
import { registerSidebarTab } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import wrap from '@vue/web-component-wrapper'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue from 'vue'
import { createPinia } from 'pinia'
import { defineCustomElement } from 'vue'
import { registerCommentsPlugins } from './comments-activity-tab.ts'
import { isUsingActivityIntegration } from './utils/activity.ts'
__webpack_nonce__ = getCSPNonce()
const tagName = 'comments_files-sidebar-tab'
if (isUsingActivityIntegration()) {
@@ -32,17 +28,15 @@ if (isUsingActivityIntegration()) {
async onInit() {
const { default: FilesSidebarTab } = await import('./views/FilesSidebarTab.vue')
Vue.use(PiniaVuePlugin)
Vue.mixin({ pinia: createPinia() })
const webComponent = wrap(Vue, FilesSidebarTab)
// In Vue 2, wrap doesn't support disabling shadow. Disable with a hack
Object.defineProperty(webComponent.prototype, 'attachShadow', {
value() { return this },
const FilesSidebarTabElement = defineCustomElement(FilesSidebarTab, {
configureApp(app) {
const pinia = createPinia()
app.use(pinia)
},
shadowRoot: false,
})
Object.defineProperty(webComponent.prototype, 'shadowRoot', {
get() { return this },
})
window.customElements.define(tagName, webComponent)
window.customElements.define(tagName, FilesSidebarTabElement)
},
})
}
@@ -5,11 +5,11 @@
import { showError, showUndo, TOAST_UNDO_TIMEOUT } from '@nextcloud/dialogs'
import { mapStores } from 'pinia'
import logger from '../logger.js'
import DeleteComment from '../services/DeleteComment.js'
import EditComment from '../services/EditComment.js'
import NewComment from '../services/NewComment.js'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.js'
import logger from '../logger.ts'
import DeleteComment from '../services/DeleteComment.ts'
import EditComment from '../services/EditComment.ts'
import NewComment from '../services/NewComment.ts'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.ts'
export default {
props: {
@@ -1,53 +0,0 @@
/**
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCSPNonce } from '@nextcloud/auth'
import { n, t } from '@nextcloud/l10n'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue from 'vue'
import CommentsApp from '../views/Comments.vue'
import logger from '../logger.js'
Vue.use(PiniaVuePlugin)
__webpack_nonce__ = getCSPNonce()
// Add translates functions
Vue.mixin({
data() {
return {
logger,
}
},
methods: {
t,
n,
},
})
export default class CommentInstance {
/**
* Initialize a new Comments instance for the desired type
*
* @param {string} resourceType the comments endpoint type
* @param {object} options the vue options (propsData, parent, el...)
*/
constructor(resourceType = 'files', options = {}) {
const pinia = createPinia()
// Merge options and set `resourceType` property
options = {
...options,
propsData: {
...(options.propsData ?? {}),
resourceType,
},
pinia,
}
// Init Comments component
const View = Vue.extend(CommentsApp)
return new View(options)
}
}
@@ -0,0 +1,94 @@
/*!
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { App, ComponentPublicInstance } from 'vue'
import { n, t } from '@nextcloud/l10n'
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import CommentsApp from '../views/CommentsApp.vue'
import logger from '../logger.ts'
export interface CommentsInstanceOptions {
el?: HTMLElement
props?: Record<string, unknown>
/** @deprecated use `props` instead */
propsData?: Record<string, unknown>
}
export default class CommentInstance {
private app: App
private instance: ComponentPublicInstance<typeof CommentsApp> | undefined
/**
* Initialize a new Comments instance for the desired type
*
* @param resourceType - The comments endpoint type
* @param options - The vue options (props, parent, el...)
*/
constructor(resourceType = 'files', options: CommentsInstanceOptions = {}) {
const pinia = createPinia()
this.app = createApp(
CommentsApp,
{
...(options.propsData ?? {}),
...(options.props ?? {}),
resourceType,
},
)
// Add translates functions
this.app.mixin({
data() {
return {
logger,
}
},
methods: {
t,
n,
},
})
this.app.use(pinia)
if (options.el) {
this.instance = this.app.mount(options.el)
}
}
/**
* Mount the Comments instance to a new element.
*
* @param el - The element to mount the instance on
*/
$mount(el: HTMLElement | string) {
if (this.instance) {
this.app.unmount()
}
this.instance = this.app.mount(el)
}
/**
* Unmount the Comments instance from the DOM and destroy it.
*/
$unmount() {
this.app.unmount()
this.instance = undefined
}
/**
* Update the current resource id.
*
* @param id - The new resource id to load the comments for
*/
update(id: string | number) {
if (this.instance) {
this.instance.update(id)
}
}
}
@@ -5,7 +5,7 @@
import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
import { createClient } from 'webdav'
import { getRootPath } from '../utils/davUtils.js'
import { getRootPath } from '../utils/davUtils.ts'
// init webdav client
const client = createClient(getRootPath())
@@ -3,16 +3,16 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import client from './DavClient.js'
import client from './DavClient.ts'
/**
* Delete a comment
*
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {number} commentId the comment iD
* @param resourceType the resource type
* @param resourceId the resource ID
* @param commentId the comment iD
*/
export default async function(resourceType, resourceId, commentId) {
export default async function(resourceType: string, resourceId: number, commentId: number) {
const commentPath = ['', resourceType, resourceId, commentId].join('/')
// Fetch newly created comment data
@@ -3,17 +3,17 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import client from './DavClient.js'
import client from './DavClient.ts'
/**
* Edit an existing comment
*
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {number} commentId the comment iD
* @param {string} message the message content
* @param resourceType the resource type
* @param resourceId the resource ID
* @param commentId the comment iD
* @param message the message content
*/
export default async function(resourceType, resourceId, commentId, message) {
export default async function(resourceType: string, resourceId: number, commentId: number, message: string) {
const commentPath = ['', resourceType, resourceId, commentId].join('/')
return await client.customRequest(commentPath, {
+1 -1
View File
@@ -8,7 +8,7 @@ import type { DAVResult, FileStat, ResponseDataDetailed } from 'webdav'
import { parseXML } from 'webdav'
import { processResponsePayload } from 'webdav/dist/node/response.js'
import { prepareFileFromProps } from 'webdav/dist/node/tools/dav.js'
import client from './DavClient.js'
import client from './DavClient.ts'
export const DEFAULT_LIMIT = 20
@@ -5,24 +5,24 @@
import { getCurrentUser } from '@nextcloud/auth'
import axios from '@nextcloud/axios'
import { getRootPath } from '../utils/davUtils.js'
import { decodeHtmlEntities } from '../utils/decodeHtmlEntities.js'
import client from './DavClient.js'
import { getRootPath } from '../utils/davUtils.ts'
import { decodeHtmlEntities } from '../utils/decodeHtmlEntities.ts'
import client from './DavClient.ts'
/**
* Retrieve the comments list
*
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {string} message the message
* @return {object} the new comment
* @param resourceType the resource type
* @param resourceId the resource ID
* @param message the message
* @return The new comment
*/
export default async function(resourceType, resourceId, message) {
export default async function(resourceType: string, resourceId: number, message: string) {
const resourcePath = ['', resourceType, resourceId].join('/')
const response = await axios.post(getRootPath() + resourcePath, {
actorDisplayName: getCurrentUser().displayName,
actorId: getCurrentUser().uid,
actorDisplayName: getCurrentUser()!.displayName,
actorId: getCurrentUser()!.uid,
actorType: 'users',
creationDateTime: (new Date()).toUTCString(),
message,
+1 -1
View File
@@ -5,7 +5,7 @@
import type { Response } from 'webdav'
import client from './DavClient.js'
import client from './DavClient.ts'
/**
* Mark comments older than the date timestamp as read
@@ -6,20 +6,20 @@
/**
* Creates a cancelable axios 'request object'.
*
* @param {Function} request the axios promise request
* @return {object}
* @param request the axios promise request
* @return
*/
function cancelableRequest(request) {
function cancelableRequest(request: (url: string, options?: Record<string, unknown>) => Promise<unknown>) {
const controller = new AbortController()
const signal = controller.signal
/**
* Execute the request
*
* @param {string} url the url to send the request to
* @param {object} [options] optional config for the request
* @param url the url to send the request to
* @param [options] optional config for the request
*/
const fetch = async function(url, options) {
const fetch = async function(url: string, options?: Record<string, unknown>) {
const response = await request(
url,
{ signal, ...options },
@@ -4,10 +4,10 @@
*/
/**
* @param {any} value -
* @param {any} passes -
* @param value - the string to decode
* @param passes - the number of times to decode the string, default is 1
*/
export function decodeHtmlEntities(value, passes = 1) {
export function decodeHtmlEntities(value: string, passes = 1) {
const parser = new DOMParser()
let decoded = value
for (let i = 0; i < passes; i++) {
@@ -6,11 +6,11 @@
<template>
<Comment
v-bind="editorData"
:auto-complete="autoComplete"
:resource-type="resourceType"
:autoComplete="autoComplete"
:resourceType="resourceType"
:editor="true"
:user-data="userData"
:resource-id="resourceId"
:userData="userData"
:resourceId="resourceId"
class="comments-action"
@new="onNewComment" />
</template>
@@ -20,8 +20,8 @@ import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
import Comment from '../components/Comment.vue'
import logger from '../logger.js'
import CommentView from '../mixins/CommentView.js'
import logger from '../logger.ts'
import CommentView from '../mixins/CommentView.ts'
export default defineComponent({
components: {
@@ -8,11 +8,11 @@
ref="comment"
tag="li"
v-bind="comment.props"
:auto-complete="autoComplete"
:resource-type="resourceType"
:autoComplete="autoComplete"
:resourceType="resourceType"
:message="commentMessage"
:resource-id="resourceId"
:user-data="genMentionsData(comment.props.mentions)"
:resourceId="resourceId"
:userData="genMentionsData(comment.props.mentions)"
class="comments-activity"
@delete="reloadCallback()" />
</template>
@@ -11,11 +11,11 @@
<!-- Editor -->
<Comment
v-bind="editorData"
:auto-complete="autoComplete"
:resource-type="resourceType"
:editor="true"
:user-data="userData"
:resource-id="currentResourceId"
editor
:autoComplete
:resourceType
:userData
:resourceId="currentResourceId"
class="comments__writer"
@new="onNewComment" />
@@ -33,13 +33,13 @@
<Comment
v-for="comment in comments"
:key="comment.props.id"
v-model="comment.props.message"
tag="li"
v-bind="comment.props"
:auto-complete="autoComplete"
:resource-type="resourceType"
:message.sync="comment.props.message"
:resource-id="currentResourceId"
:user-data="genMentionsData(comment.props.mentions)"
:autoComplete
:resourceType
:resourceId="currentResourceId"
:userData="genMentionsData(comment.props.mentions)"
class="comments__list"
@delete="onDelete" />
</ul>
@@ -79,15 +79,14 @@ import IconAlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline
import IconMessageReplyTextOutline from 'vue-material-design-icons/MessageReplyTextOutline.vue'
import IconRefresh from 'vue-material-design-icons/Refresh.vue'
import Comment from '../components/Comment.vue'
import logger from '../logger.js'
import logger from '../logger.ts'
import CommentView from '../mixins/CommentView.ts'
import { DEFAULT_LIMIT, getComments } from '../services/GetComments.ts'
import { markCommentsAsRead } from '../services/ReadComments.ts'
import cancelableRequest from '../utils/cancelableRequest.js'
import cancelableRequest from '../utils/cancelableRequest.ts'
export default {
/* eslint vue/multi-word-component-names: "warn" */
name: 'Comments',
name: 'CommentsApp',
components: {
Comment,
@@ -104,6 +103,8 @@ export default {
mixins: [CommentView],
expose: ['update'],
data() {
return {
error: '',
+4 -4
View File
@@ -7,7 +7,7 @@
import type { IFolder, INode, IView } from '@nextcloud/files'
import { computed } from 'vue'
import Comments from './Comments.vue'
import CommentsApp from './CommentsApp.vue'
const props = defineProps<{
node?: INode
@@ -24,9 +24,9 @@ const resourceId = computed(() => props.node?.fileid)
</script>
<template>
<Comments
<CommentsApp
v-if="resourceId !== undefined"
:key="resourceId"
:resource-id="resourceId"
resource-type="files" />
:resourceId="resourceId"
resourceType="files" />
</template>
@@ -202,6 +202,7 @@ class DashboardApiController extends OCSController {
#[NoAdminRequired]
#[ApiRoute(verb: 'POST', url: '/api/v3/layout')]
public function updateLayout(array $layout): DataResponse {
$layout = $this->service->sanitizeLayout($layout);
$this->userConfig->setValueString($this->userId, 'dashboard', 'layout', implode(',', $layout));
return new DataResponse(['layout' => $layout]);
}
@@ -31,12 +31,30 @@ class DashboardService {
*/
public function getLayout(): array {
$systemDefault = $this->appConfig->getAppValueString('layout', 'recommendations,spreed,mail,calendar');
return array_values(array_filter(
return $this->sanitizeLayout(
explode(',', $this->userConfig->getValueString($this->userId, 'dashboard', 'layout', $systemDefault)),
fn (string $value) => $value !== '')
);
}
/**
* @param list<string> $layout
* @return list<string>
*/
public function sanitizeLayout(array $layout): array {
$seen = [];
$result = [];
foreach ($layout as $value) {
if ($value === '' || isset($seen[$value])) {
continue;
}
$seen[$value] = true;
$result[] = $value;
}
return $result;
}
/**
* @return list<string>
*/
+1 -1
View File
@@ -5,7 +5,7 @@
<template>
<main id="app-dashboard">
<h2>{{ greeting.text }}</h2>
<ul class="statuses">
<ul v-if="sortedRegisteredStatus.length > 0" class="statuses">
<li
v-for="status in sortedRegisteredStatus"
:id="'status-' + status"
@@ -44,6 +44,25 @@ class DashboardServiceTest extends TestCase {
);
}
public function testGetLayoutRemovesEmptyAndDuplicateEntries(): void {
$this->appConfig->method('getAppValueString')
->with('layout', 'recommendations,spreed,mail,calendar')
->willReturn('recommendations,spreed,mail,calendar');
$this->userConfig->method('getValueString')
->with('alice', 'dashboard', 'layout', 'recommendations,spreed,mail,calendar')
->willReturn('spreed,,mail,mail,calendar,spreed');
$layout = $this->service->getLayout();
$this->assertSame(['spreed', 'mail', 'calendar'], $layout);
}
public function testSanitizeLayoutRemovesEmptyAndDuplicateEntries(): void {
$layout = $this->service->sanitizeLayout(['files', 'calendar', 'files', '', 'mail', 'calendar']);
$this->assertSame(['files', 'calendar', 'mail'], $layout);
}
public function testGetBirthdate(): void {
$user = $this->createMock(IUser::class);
$this->userManager->method('get')
+6 -2
View File
@@ -6,7 +6,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
use OC\Files\Filesystem;
use OC\Files\Storage\Wrapper\PermissionsMask;
use OC\Files\Storage\Wrapper\DirPermissionsMask;
use OC\Files\View;
use OCA\DAV\Connector\LegacyPublicAuth;
use OCA\DAV\Connector\Sabre\ServerFactory;
@@ -98,7 +98,11 @@ $server = $serverFactory->createServer(
// FIXME: should not add storage wrappers outside of preSetup, need to find a better way
$previousLog = Filesystem::logWarningWhenAddingStorageWrapper(false);
Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($share) {
return new PermissionsMask(['storage' => $storage, 'mask' => $share->getPermissions() | Constants::PERMISSION_SHARE]);
return new DirPermissionsMask([
'storage' => $storage,
'mask' => $share->getPermissions() | Constants::PERMISSION_SHARE,
'path' => 'files'
]);
});
Filesystem::addStorageWrapper('shareOwner', function ($mountPoint, $storage) use ($share) {
return new PublicOwnerWrapper(['storage' => $storage, 'owner' => $share->getShareOwner()]);
+3
View File
@@ -204,6 +204,8 @@ OC.L10N.register(
"Could not rename part file to final file, canceled by hook" : "Ezin izan da zati-fitxategiaren izena aldatu azken fitxategira, kakoak bertan behera utzi du",
"Could not rename part file to final file" : "Ezin izan da zati-fitxategia azken fitxategira aldatu",
"Failed to check file size: %1$s" : "Ezin izan da egiaztatu fitxategiaren tamaina:%1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia badagoela dirudi",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia ez dagoela dirudi",
"Encryption not ready: %1$s" : "Enkriptatzea ez dago prest:%1$s",
"Failed to open file: %1$s" : "Ezin izan da fitxategia ireki:%1$s",
"Failed to unlink: %1$s" : "Ezin izan da deskonektatu:%1$s",
@@ -220,6 +222,7 @@ OC.L10N.register(
"Completed on %s" : "%s-an osatua",
"Due on %s by %s" : "%s-(e)an epemuga %s-(e)k",
"Due on %s" : "%s-(e)an epemuga",
"This is an example contact" : "Hau kontaktu adibide bat da",
"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." : "Ongi etorri Nextcloud Egutegira!\n\nHau gertaera erakusgarria da - aztertu plangintzaren malgutasuna Nextcloud Egutegiarekin nahi dituzun edizioak eginez!\n\nNextcloud Egutegia aukerarekin, hau egin dezakezu:\n- Sortu, editatu eta kudeatu gertaerak esfortzurik gabe.\n- Egutegi ugari sortu eta taldekideekin, lagunekin edo familiarekin partekatu.\n- Egiaztatu libre egotea eta bistaratu zure laneko orduak beste batzuei.\n- Aplikazio eta gailuekin arazorik gabe integratzea CalDAV bidez.\n- Zure esperientzia pertsonalizatu: gertaera errepikariak programatu, jakinarazpenak doitu eta bestelako ezarpenak.",
"Example event - open me!" : "Gertaera adibidea - ireki nazazu!",
"System Address Book" : "Sistemaren helbide-liburua",
+3
View File
@@ -202,6 +202,8 @@
"Could not rename part file to final file, canceled by hook" : "Ezin izan da zati-fitxategiaren izena aldatu azken fitxategira, kakoak bertan behera utzi du",
"Could not rename part file to final file" : "Ezin izan da zati-fitxategia azken fitxategira aldatu",
"Failed to check file size: %1$s" : "Ezin izan da egiaztatu fitxategiaren tamaina:%1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia badagoela dirudi",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia ez dagoela dirudi",
"Encryption not ready: %1$s" : "Enkriptatzea ez dago prest:%1$s",
"Failed to open file: %1$s" : "Ezin izan da fitxategia ireki:%1$s",
"Failed to unlink: %1$s" : "Ezin izan da deskonektatu:%1$s",
@@ -218,6 +220,7 @@
"Completed on %s" : "%s-an osatua",
"Due on %s by %s" : "%s-(e)an epemuga %s-(e)k",
"Due on %s" : "%s-(e)an epemuga",
"This is an example contact" : "Hau kontaktu adibide bat da",
"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." : "Ongi etorri Nextcloud Egutegira!\n\nHau gertaera erakusgarria da - aztertu plangintzaren malgutasuna Nextcloud Egutegiarekin nahi dituzun edizioak eginez!\n\nNextcloud Egutegia aukerarekin, hau egin dezakezu:\n- Sortu, editatu eta kudeatu gertaerak esfortzurik gabe.\n- Egutegi ugari sortu eta taldekideekin, lagunekin edo familiarekin partekatu.\n- Egiaztatu libre egotea eta bistaratu zure laneko orduak beste batzuei.\n- Aplikazio eta gailuekin arazorik gabe integratzea CalDAV bidez.\n- Zure esperientzia pertsonalizatu: gertaera errepikariak programatu, jakinarazpenak doitu eta bestelako ezarpenak.",
"Example event - open me!" : "Gertaera adibidea - ireki nazazu!",
"System Address Book" : "Sistemaren helbide-liburua",
+50 -50
View File
@@ -72,39 +72,39 @@ OC.L10N.register(
"Description: %s" : "Leírás: %s",
"Where: %s" : "Hely: %s",
"%1$s via %2$s" : "%1$s %2$s",
"Could not generate when statement" : "Nem sikerült létrehozni amikor az állítást",
"Every Day for the entire day" : "Minden Nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden Nap a teljes napon eddig %1$s",
"Every Day between %1$s - %2$s" : "Minden Nap %1$s - %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden Nap %1$s - %2$s között %3$s-ig",
"Every %1$d Days for the entire day" : "Minden %1$d Nap az teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden%1$d Nap a teljes napra %2$s-ig",
"Every %1$d Days between %2$s - %3$s" : "Minden%1$d Nap %2$s - %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden%1$d Napon %2$s - %3$s között %4$s-ig",
"Could not generate event recurrence statement" : "Nem sikerült megújuló eseményt létrehozni",
"Every Week on %1$s for the entire day" : "Minden hét %1$s napon a teljes napja",
"Every Week on %1$s for the entire day until %2$s" : "Minden Héten %1$s a teljes napra %2$s-ig",
"Every Week on %1$s between %2$s - %3$s" : "Minden Hét %1$s napján %2$s - %3$sközött",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden Hét %1$s napján %2$s - %3$s között %4$s-ig",
"Every %1$d Weeks on %2$s for the entire day" : "Minden%1$d héten %2$s napon a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden%1$d Héten %2$s napján a teljes napon %3$s-ig",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden%1$d hét %2$s napján %3$s - %4$sközött",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden%1$d héten %2$s napján %3$s - %4$s között eddig %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s napján a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s napján a teljes napon %2$s-ig",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s napján %2$sés %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s napján %2$sés %3$s között %4$s-ig",
"Every %1$d Months on the %2$s for the entire day" : "Minden%1$d Hónap %2$s napján a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden%1$d Hónap %2$s napján a teljes napon %3$s-ig",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között %5$s-ig",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónap %2$s napján a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjában %2$s napján a teljes napon %3$s-ig",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$sközött.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$s között eddig %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden%1$d év %2$s hónapján %3$s napján a teljes napra",
"On specific dates for the entire day until %1$s" : "Egy megadott időpontban a teljes napon %1$s-ig ",
"On specific dates between %1$s - %2$s until %3$s" : "Egy megadott időpontban %1$s és %2$s %3$s-ig",
"Could not generate when statement" : "Nem sikerült előállítani az időfeltételt",
"Every Day for the entire day" : "Minden nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden nap a teljes napon eddig: %1$s",
"Every Day between %1$s - %2$s" : "Minden nap %1$s és %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden nap %1$s és %2$s között eddig: %3$s",
"Every %1$d Days for the entire day" : "Minden %1$d. napon, a teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden %1$d. napon, a teljes napra eddig: %2$s",
"Every %1$d Days between %2$s - %3$s" : "Minden %1$d. napon %2$s és %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden %1$d. napon %2$s és %3$s között eddig: %4$s",
"Could not generate event recurrence statement" : "Nem sikerült eseményismétlési utasítást előállítani",
"Every Week on %1$s for the entire day" : "Minden héten %1$s, a teljes napra",
"Every Week on %1$s for the entire day until %2$s" : "Minden héten %1$s, a teljes napra eddig: %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Minden héten %1$s, %2$s és %3$s között",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden héten %1$s, %2$s és %3$s között eddig: %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Minden %1$d. héten %2$s, a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden %1$d. héten %2$s, a teljes napon eddig: %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között eddig: %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s. napján, a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s. napján, a teljes napon eddig: %2$s",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s. napján %2$s és %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s. napján %2$s és %3$s között eddig: %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Minden %1$d. hónap %2$s. napján, a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden %1$d. hónap %2$s. napján, a teljes napon eddig: %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között eddig: %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónapja %2$s. napján, a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjának %2$s. napján, a teljes napon eddig: %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között eddig: %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden %1$d. év %2$s hónapjának %3$s. napján, a teljes napra",
"On specific dates for the entire day until %1$s" : "Adott dátumokon, a teljes napra eddig: %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "Megadott dátumokon %1$s és %2$s között, eddig: %3$s",
"Could not generate next recurrence statement" : "Nem sikerült a következő megújuló eseményt létrehozni",
"Cancelled: %1$s" : "Lemondva: %1$s",
"\"%1$s\" has been canceled" : "A következőt le lett mondva: „%1$s”",
@@ -135,24 +135,24 @@ OC.L10N.register(
"Friday" : "Péntek",
"Saturday" : "Szombat",
"Sunday" : "Vasárnap",
"January" : "Január",
"February" : "Február",
"March" : "Március",
"April" : "Április",
"May" : "Május",
"June" : "Június",
"July" : "Július",
"August" : "Augusztus",
"September" : "Szeptember",
"January" : "január",
"February" : "február",
"March" : "március",
"April" : "április",
"May" : "május",
"June" : "június",
"July" : "július",
"August" : "augusztus",
"September" : "szeptember",
"October" : "Október",
"November" : "November",
"December" : "December",
"November" : "november",
"December" : "december",
"First" : "Első",
"Second" : "Másodperc",
"Second" : "Második",
"Third" : "Harmadik",
"Fourth" : "Negyedik",
"Last" : "Utolsó",
"Second Last" : "Második Utolsó",
"Second Last" : "Utolsó előtti",
"Third Last" : "Harmadik Utolsó",
"Fourth Last" : "Negyedik Utolsó",
"Contacts" : "Névjegyek",
@@ -183,7 +183,7 @@ OC.L10N.register(
"Accounts" : "Fiókok",
"System address book which holds all accounts" : "A rendszer címjegyzéke, amely az összes fiókot tartalmazza",
"File is not updatable: %1$s" : "A fájl nem frissíthető: %1$s",
"Failed to get storage for file" : "Nem sikerlt a tárhely lekérése a fájl számára",
"Failed to get storage for file" : "Nem sikerült a tárhely lekérése a fájl számára",
"Could not write to final file, canceled by hook" : "A végleges fájl nem írható, a hurok megszakította",
"Could not write file contents" : "A fájl tartalma nem írható",
"_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
@@ -208,9 +208,9 @@ OC.L10N.register(
"Completed on %s" : "Befejezve: %s",
"Due on %s by %s" : "Esedékesség: %s, %s által",
"Due on %s" : "Esedékesség: %s",
"DAV system address book" : "DAV rendszer címjegyzék",
"No outstanding DAV system address book sync." : "Nincs kiemelkedő DAV rendszer címjegyzék szinkronizálás.",
"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\"." : "A DAV rendszer címjegyzék szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található vagy hiba történt. Kérem futtassa manuálisan a következő paranccsal: \"occ dav:sync-system-addressbook\".",
"DAV system address book" : "DAV rendszer-címjegyzék",
"No outstanding DAV system address book sync." : "Nincs függőben lévő DAV rendszercímjegyzék-szinkronizálás.",
"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\"." : "A DAV rendszer címjegyzék-szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található, vagy mert hiba történt. Futtassa kézileg a következő paranccsal: occ dav:sync-system-addressbook.",
"WebDAV endpoint" : "WebDAV végpont",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "A webkiszolgáló nincs megfelelően beállítva a fájlok szinkronizálásához, mert a WebDAV interfész hibásnak tűnik.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "A webkisolgáló megfelelően van konfigurálva a WebDAVon keresztüli fájl szinkronizáció engedélyezéséhez.",
+50 -50
View File
@@ -70,39 +70,39 @@
"Description: %s" : "Leírás: %s",
"Where: %s" : "Hely: %s",
"%1$s via %2$s" : "%1$s %2$s",
"Could not generate when statement" : "Nem sikerült létrehozni amikor az állítást",
"Every Day for the entire day" : "Minden Nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden Nap a teljes napon eddig %1$s",
"Every Day between %1$s - %2$s" : "Minden Nap %1$s - %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden Nap %1$s - %2$s között %3$s-ig",
"Every %1$d Days for the entire day" : "Minden %1$d Nap az teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden%1$d Nap a teljes napra %2$s-ig",
"Every %1$d Days between %2$s - %3$s" : "Minden%1$d Nap %2$s - %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden%1$d Napon %2$s - %3$s között %4$s-ig",
"Could not generate event recurrence statement" : "Nem sikerült megújuló eseményt létrehozni",
"Every Week on %1$s for the entire day" : "Minden hét %1$s napon a teljes napja",
"Every Week on %1$s for the entire day until %2$s" : "Minden Héten %1$s a teljes napra %2$s-ig",
"Every Week on %1$s between %2$s - %3$s" : "Minden Hét %1$s napján %2$s - %3$sközött",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden Hét %1$s napján %2$s - %3$s között %4$s-ig",
"Every %1$d Weeks on %2$s for the entire day" : "Minden%1$d héten %2$s napon a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden%1$d Héten %2$s napján a teljes napon %3$s-ig",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden%1$d hét %2$s napján %3$s - %4$sközött",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden%1$d héten %2$s napján %3$s - %4$s között eddig %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s napján a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s napján a teljes napon %2$s-ig",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s napján %2$sés %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s napján %2$sés %3$s között %4$s-ig",
"Every %1$d Months on the %2$s for the entire day" : "Minden%1$d Hónap %2$s napján a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden%1$d Hónap %2$s napján a teljes napon %3$s-ig",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között %5$s-ig",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónap %2$s napján a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjában %2$s napján a teljes napon %3$s-ig",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$sközött.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$s között eddig %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden%1$d év %2$s hónapján %3$s napján a teljes napra",
"On specific dates for the entire day until %1$s" : "Egy megadott időpontban a teljes napon %1$s-ig ",
"On specific dates between %1$s - %2$s until %3$s" : "Egy megadott időpontban %1$s és %2$s %3$s-ig",
"Could not generate when statement" : "Nem sikerült előállítani az időfeltételt",
"Every Day for the entire day" : "Minden nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden nap a teljes napon eddig: %1$s",
"Every Day between %1$s - %2$s" : "Minden nap %1$s és %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden nap %1$s és %2$s között eddig: %3$s",
"Every %1$d Days for the entire day" : "Minden %1$d. napon, a teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden %1$d. napon, a teljes napra eddig: %2$s",
"Every %1$d Days between %2$s - %3$s" : "Minden %1$d. napon %2$s és %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden %1$d. napon %2$s és %3$s között eddig: %4$s",
"Could not generate event recurrence statement" : "Nem sikerült eseményismétlési utasítást előállítani",
"Every Week on %1$s for the entire day" : "Minden héten %1$s, a teljes napra",
"Every Week on %1$s for the entire day until %2$s" : "Minden héten %1$s, a teljes napra eddig: %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Minden héten %1$s, %2$s és %3$s között",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden héten %1$s, %2$s és %3$s között eddig: %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Minden %1$d. héten %2$s, a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden %1$d. héten %2$s, a teljes napon eddig: %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között eddig: %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s. napján, a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s. napján, a teljes napon eddig: %2$s",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s. napján %2$s és %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s. napján %2$s és %3$s között eddig: %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Minden %1$d. hónap %2$s. napján, a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden %1$d. hónap %2$s. napján, a teljes napon eddig: %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között eddig: %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónapja %2$s. napján, a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjának %2$s. napján, a teljes napon eddig: %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között eddig: %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden %1$d. év %2$s hónapjának %3$s. napján, a teljes napra",
"On specific dates for the entire day until %1$s" : "Adott dátumokon, a teljes napra eddig: %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "Megadott dátumokon %1$s és %2$s között, eddig: %3$s",
"Could not generate next recurrence statement" : "Nem sikerült a következő megújuló eseményt létrehozni",
"Cancelled: %1$s" : "Lemondva: %1$s",
"\"%1$s\" has been canceled" : "A következőt le lett mondva: „%1$s”",
@@ -133,24 +133,24 @@
"Friday" : "Péntek",
"Saturday" : "Szombat",
"Sunday" : "Vasárnap",
"January" : "Január",
"February" : "Február",
"March" : "Március",
"April" : "Április",
"May" : "Május",
"June" : "Június",
"July" : "Július",
"August" : "Augusztus",
"September" : "Szeptember",
"January" : "január",
"February" : "február",
"March" : "március",
"April" : "április",
"May" : "május",
"June" : "június",
"July" : "július",
"August" : "augusztus",
"September" : "szeptember",
"October" : "Október",
"November" : "November",
"December" : "December",
"November" : "november",
"December" : "december",
"First" : "Első",
"Second" : "Másodperc",
"Second" : "Második",
"Third" : "Harmadik",
"Fourth" : "Negyedik",
"Last" : "Utolsó",
"Second Last" : "Második Utolsó",
"Second Last" : "Utolsó előtti",
"Third Last" : "Harmadik Utolsó",
"Fourth Last" : "Negyedik Utolsó",
"Contacts" : "Névjegyek",
@@ -181,7 +181,7 @@
"Accounts" : "Fiókok",
"System address book which holds all accounts" : "A rendszer címjegyzéke, amely az összes fiókot tartalmazza",
"File is not updatable: %1$s" : "A fájl nem frissíthető: %1$s",
"Failed to get storage for file" : "Nem sikerlt a tárhely lekérése a fájl számára",
"Failed to get storage for file" : "Nem sikerült a tárhely lekérése a fájl számára",
"Could not write to final file, canceled by hook" : "A végleges fájl nem írható, a hurok megszakította",
"Could not write file contents" : "A fájl tartalma nem írható",
"_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
@@ -206,9 +206,9 @@
"Completed on %s" : "Befejezve: %s",
"Due on %s by %s" : "Esedékesség: %s, %s által",
"Due on %s" : "Esedékesség: %s",
"DAV system address book" : "DAV rendszer címjegyzék",
"No outstanding DAV system address book sync." : "Nincs kiemelkedő DAV rendszer címjegyzék szinkronizálás.",
"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\"." : "A DAV rendszer címjegyzék szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található vagy hiba történt. Kérem futtassa manuálisan a következő paranccsal: \"occ dav:sync-system-addressbook\".",
"DAV system address book" : "DAV rendszer-címjegyzék",
"No outstanding DAV system address book sync." : "Nincs függőben lévő DAV rendszercímjegyzék-szinkronizálás.",
"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\"." : "A DAV rendszer címjegyzék-szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található, vagy mert hiba történt. Futtassa kézileg a következő paranccsal: occ dav:sync-system-addressbook.",
"WebDAV endpoint" : "WebDAV végpont",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "A webkiszolgáló nincs megfelelően beállítva a fájlok szinkronizálásához, mert a WebDAV interfész hibásnak tűnik.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "A webkisolgáló megfelelően van konfigurálva a WebDAVon keresztüli fájl szinkronizáció engedélyezéséhez.",
+3 -2
View File
@@ -250,9 +250,10 @@ OC.L10N.register(
"Completed on %s" : "Completata il %s",
"Due on %s by %s" : "Scade il %s per %s",
"Due on %s" : "Scade il %s",
"This is an example contact" : "Questo è un contatto d'esempio",
"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." : "Benvenuto nel Calendario Nextcloud!\n\nQuesto è un evento di esempio: scopri la flessibilità della pianificazione con Calendario Nextcloud apportando tutte le modifiche che desideri!\n\nCon il Calendario Nextcloud puoi:\n- Creare, modificare e gestire eventi senza alcuno sforzo.\n- Creare più calendari e condividerli con colleghi, amici o familiari.\n- Verificare la disponibilità e mostrare agli altri i tuoi impegni.\n- Integrare perfettamente app e dispositivi tramite CalDAV.\n- Personalizzare la tua esperienza: pianificare eventi ricorrenti, regolare le notifiche e altre impostazioni.",
"Example event - open me!" : "Evento d'esempio - aprimi!",
"System Address Book" : "Rubrica di Sistema",
"System Address Book" : "Rubrica di sistema",
"The system address book contains contact information for all users in your instance." : "La rubrica di sistema contiene le informazioni di contatto di tutti gli utenti della tua istanza.",
"Enable System Address Book" : "Abilita rubrica di sistema",
"DAV system address book" : "Rubrica di sistema DAV",
@@ -324,7 +325,7 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Invia notifiche di promemoria anche ai partecipanti al calendario",
"Reminders are always sent to organizers and attendees." : "I promemoria vengono sempre inviati agli organizzatori e ai partecipanti.",
"Enable notifications for events via push" : "Abilita notifiche per eventi tramite push",
"Example content" : "Contenuto d'esempio",
"Example content" : "Contenuto di esempio",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Il contenuto di esempio serve a mostrare le funzionalità di Nextcloud. Il contenuto predefinito viene fornito con Nextcloud e può essere sostituito da contenuti personalizzati.",
"Availability" : "Disponibilità",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se imposti il tuo orario di lavoro, le altre persone potranno vedere quando non sei in ufficio per organizzare una riunione.",
+3 -2
View File
@@ -248,9 +248,10 @@
"Completed on %s" : "Completata il %s",
"Due on %s by %s" : "Scade il %s per %s",
"Due on %s" : "Scade il %s",
"This is an example contact" : "Questo è un contatto d'esempio",
"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." : "Benvenuto nel Calendario Nextcloud!\n\nQuesto è un evento di esempio: scopri la flessibilità della pianificazione con Calendario Nextcloud apportando tutte le modifiche che desideri!\n\nCon il Calendario Nextcloud puoi:\n- Creare, modificare e gestire eventi senza alcuno sforzo.\n- Creare più calendari e condividerli con colleghi, amici o familiari.\n- Verificare la disponibilità e mostrare agli altri i tuoi impegni.\n- Integrare perfettamente app e dispositivi tramite CalDAV.\n- Personalizzare la tua esperienza: pianificare eventi ricorrenti, regolare le notifiche e altre impostazioni.",
"Example event - open me!" : "Evento d'esempio - aprimi!",
"System Address Book" : "Rubrica di Sistema",
"System Address Book" : "Rubrica di sistema",
"The system address book contains contact information for all users in your instance." : "La rubrica di sistema contiene le informazioni di contatto di tutti gli utenti della tua istanza.",
"Enable System Address Book" : "Abilita rubrica di sistema",
"DAV system address book" : "Rubrica di sistema DAV",
@@ -322,7 +323,7 @@
"Send reminder notifications to calendar sharees as well" : "Invia notifiche di promemoria anche ai partecipanti al calendario",
"Reminders are always sent to organizers and attendees." : "I promemoria vengono sempre inviati agli organizzatori e ai partecipanti.",
"Enable notifications for events via push" : "Abilita notifiche per eventi tramite push",
"Example content" : "Contenuto d'esempio",
"Example content" : "Contenuto di esempio",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Il contenuto di esempio serve a mostrare le funzionalità di Nextcloud. Il contenuto predefinito viene fornito con Nextcloud e può essere sostituito da contenuti personalizzati.",
"Availability" : "Disponibilità",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se imposti il tuo orario di lavoro, le altre persone potranno vedere quando non sei in ufficio per organizzare una riunione.",
+1 -1
View File
@@ -148,7 +148,7 @@ OC.L10N.register(
"\"%1$s\" has been canceled" : "\"%1$s\" foi cancelado",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceitou seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou provisoriamente seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou seu convite como tentativa",
"%1$s has declined your invitation" : "%1$s recusou seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite atualizado: %1$s",
+1 -1
View File
@@ -146,7 +146,7 @@
"\"%1$s\" has been canceled" : "\"%1$s\" foi cancelado",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceitou seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou provisoriamente seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou seu convite como tentativa",
"%1$s has declined your invitation" : "%1$s recusou seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite atualizado: %1$s",
@@ -49,7 +49,7 @@ class BlockLegacyClientPlugin extends ServerPlugin {
return;
}
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.81');
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.83');
$maximumSupportedDesktopVersion = $this->config->getSystemValueString('maximum.supported.desktop.version', '99.99.99');
// Check if the client is a desktop client
@@ -38,6 +38,12 @@ class ZipFolderPlugin extends ServerPlugin {
*/
private ?Server $server = null;
/**
* Whether handleDownload has fully streamed an archive for the current request.
* Used by afterDownload to decide whether to suppress sabre/dav's own response logic.
*/
private bool $streamed = false;
public function __construct(
private Tree $tree,
private LoggerInterface $logger,
@@ -91,10 +97,11 @@ class ZipFolderPlugin extends ServerPlugin {
* It is possible to filter / limit the files that should be downloaded,
* either by passing (multiple) `X-NC-Files: the-file` headers
* or by setting a `files=JSON_ARRAY_OF_FILES` URL query.
*
* @return false|null
*/
public function handleDownload(Request $request, Response $response): ?bool {
public function handleDownload(Request $request, Response $response): ?false {
if ($request->getHeader('X-Sabre-Original-Method') === 'HEAD') {
return null;
}
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof Directory)) {
// only handle directories
@@ -179,21 +186,23 @@ class ZipFolderPlugin extends ServerPlugin {
$this->streamNode($streamer, $node, $rootPath);
}
$streamer->finalize();
$this->streamed = true; // archive fully streamed
return false;
}
/**
* Tell sabre/dav not to trigger it's own response sending logic as the handleDownload will have already send the response
*
* @return false|null
* Tell sabre/dav not to trigger its own response sending logic as the handleDownload will have already sent the response
*/
public function afterDownload(Request $request, Response $response): ?bool {
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof Directory)) {
// only handle directories
public function afterDownload(Request $request, Response $response): ?false {
if ($request->getHeader('X-Sabre-Original-Method') === 'HEAD') {
return null;
} else {
return false;
}
if (!$this->streamed) {
return null;
}
return false;
}
}
+2 -1
View File
@@ -343,6 +343,7 @@ class FileSearchBackend implements ISearchBackend {
}, $query->orderBy);
$limit = $query->limit;
$maxResults = $limit->maxResults !== 0 ? (int)$limit->maxResults : 100;
$offset = $limit->firstResult;
$limitHome = false;
@@ -370,7 +371,7 @@ class FileSearchBackend implements ISearchBackend {
return new SearchQuery(
$operators,
(int)$limit->maxResults,
$maxResults,
$offset,
$orders,
$this->user,
@@ -43,6 +43,14 @@ use Test\TestCase;
use Test\Traits\MountProviderTrait;
use Test\Traits\UserTrait;
/**
* Internal helper to mock legacy hook receiver.
*/
interface EventHandlerMock {
public function writeCallback(): void;
public function postWriteCallback(): void;
}
/**
* Class File
*
@@ -822,9 +830,7 @@ class FileTest extends TestCase {
$wasLockedPre = false;
$wasLockedPost = false;
$eventHandler = $this->getMockBuilder(\stdclass::class)
->addMethods(['writeCallback', 'postWriteCallback'])
->getMock();
$eventHandler = $this->createMock(EventHandlerMock::class);
// both pre and post hooks might need access to the file,
// so only shared lock is acceptable
@@ -97,7 +97,7 @@ class FileSearchBackendTest extends TestCase {
'name',
'foo'
),
0,
100,
0,
[],
$this->user
@@ -126,7 +126,7 @@ class FileSearchBackendTest extends TestCase {
'mimetype',
'foo'
),
0,
100,
0,
[],
$this->user
@@ -155,7 +155,7 @@ class FileSearchBackendTest extends TestCase {
'size',
10
),
0,
100,
0,
[],
$this->user
@@ -184,7 +184,7 @@ class FileSearchBackendTest extends TestCase {
'mtime',
10
),
0,
100,
0,
[],
$this->user
@@ -213,7 +213,7 @@ class FileSearchBackendTest extends TestCase {
'mimetype',
FileInfo::MIMETYPE_FOLDER
),
0,
100,
0,
[],
$this->user
+11 -1
View File
@@ -35,21 +35,30 @@ OC.L10N.register(
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan inte läsa denna filen, troligen är det en delad fil. Vänligen be ägaren att åter dela filen med dig.",
"Default Encryption Module" : "Standardmodul för kryptering",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Standardkrypteringsmodul för Nextcloud serverbaserad kryptering (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att\nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras",
"Encrypt the home storage" : "Kryptera alla filer i molnet",
"Disable recovery key" : "Inaktivera återställningsnyckel",
"Enable recovery key" : "Aktivera återställningsnyckel",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Återställningsnyckeln är en extra krypteringsnyckel som används för att kryptera filer. Den används för att återställa filer från ett konto om lösenordet glöms bort.",
"Recovery key password" : "Ange lösenord",
"Passwords fields do not match" : "Lösenorden matchar inte",
"Repeat recovery key password" : "Repetera lösenord",
"An error occurred while updating the recovery key settings. Please try again." : "Ett fel uppstod vid uppdateringen av inställningarna för återställningsnyckeln. Försök igen.",
"Change recovery key password" : "Ändra lösenordet för återställningsnyckeln",
"Old recovery key password" : "Gammalt lösenord",
"New recovery key password" : "Nytt lösenord",
"Repeat new recovery key password" : "Repetera lösenord",
"An error occurred while changing the recovery key password. Please try again." : "Ett fel uppstod när lösenordet för återställningsnyckeln skulle ändras. Försök igen.",
"Update private key password" : "Uppdatera lösenordet för den privata nyckeln",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord. Ändra lösenordet till din privata nyckel så att det blir detsamma som ditt nuvarande inloggningslösenord.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update" : "Uppdatera",
"Updating recovery keys. This can take some time…" : "Uppdaterar återställningsnycklar. Det kan ta en stund…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Om du aktiverar det här alternativet kan du återställa åtkomst till dina krypterade filer vid lösenordsförlust",
"Enable password recovery" : "Aktivera återställning av lösenord",
"Default encryption module" : "Krypteringsfunktion",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsappen är aktiverad men dina krypteringsnycklar är inte initialiserade, vänligen logga ut och logga in igen.",
"Basic encryption module" : "Kryptering",
@@ -63,6 +72,7 @@ OC.L10N.register(
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
"Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad"
"Disabled" : "Inaktiverad",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att \nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust."
},
"nplurals=2; plural=(n != 1);");
+11 -1
View File
@@ -33,21 +33,30 @@
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan inte läsa denna filen, troligen är det en delad fil. Vänligen be ägaren att åter dela filen med dig.",
"Default Encryption Module" : "Standardmodul för kryptering",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Standardkrypteringsmodul för Nextcloud serverbaserad kryptering (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att\nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras",
"Encrypt the home storage" : "Kryptera alla filer i molnet",
"Disable recovery key" : "Inaktivera återställningsnyckel",
"Enable recovery key" : "Aktivera återställningsnyckel",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Återställningsnyckeln är en extra krypteringsnyckel som används för att kryptera filer. Den används för att återställa filer från ett konto om lösenordet glöms bort.",
"Recovery key password" : "Ange lösenord",
"Passwords fields do not match" : "Lösenorden matchar inte",
"Repeat recovery key password" : "Repetera lösenord",
"An error occurred while updating the recovery key settings. Please try again." : "Ett fel uppstod vid uppdateringen av inställningarna för återställningsnyckeln. Försök igen.",
"Change recovery key password" : "Ändra lösenordet för återställningsnyckeln",
"Old recovery key password" : "Gammalt lösenord",
"New recovery key password" : "Nytt lösenord",
"Repeat new recovery key password" : "Repetera lösenord",
"An error occurred while changing the recovery key password. Please try again." : "Ett fel uppstod när lösenordet för återställningsnyckeln skulle ändras. Försök igen.",
"Update private key password" : "Uppdatera lösenordet för den privata nyckeln",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord. Ändra lösenordet till din privata nyckel så att det blir detsamma som ditt nuvarande inloggningslösenord.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update" : "Uppdatera",
"Updating recovery keys. This can take some time…" : "Uppdaterar återställningsnycklar. Det kan ta en stund…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Om du aktiverar det här alternativet kan du återställa åtkomst till dina krypterade filer vid lösenordsförlust",
"Enable password recovery" : "Aktivera återställning av lösenord",
"Default encryption module" : "Krypteringsfunktion",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsappen är aktiverad men dina krypteringsnycklar är inte initialiserade, vänligen logga ut och logga in igen.",
"Basic encryption module" : "Kryptering",
@@ -61,6 +70,7 @@
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
"Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad"
"Disabled" : "Inaktiverad",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att \nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+1 -1
View File
@@ -244,7 +244,7 @@ OC.L10N.register(
"Files settings" : "Ρυθμίσεις αρχείων",
"Switch to list view" : "Αλλαγή σε προβολή λίστας",
"Switch to grid view" : "Εναλλαγή σε προβολή πλέγματος",
"The file could not be found" : "Το αρχείο δεν μπορούσε να βρεθεί",
"The file could not be found" : "Το αρχείο δεν βρέθηκε",
"Upload was cancelled by user" : "Η μεταφόρτωση ακυρώθηκε από τον χρήστη",
"Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
"Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
+1 -1
View File
@@ -242,7 +242,7 @@
"Files settings" : "Ρυθμίσεις αρχείων",
"Switch to list view" : "Αλλαγή σε προβολή λίστας",
"Switch to grid view" : "Εναλλαγή σε προβολή πλέγματος",
"The file could not be found" : "Το αρχείο δεν μπορούσε να βρεθεί",
"The file could not be found" : "Το αρχείο δεν βρέθηκε",
"Upload was cancelled by user" : "Η μεταφόρτωση ακυρώθηκε από τον χρήστη",
"Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
"Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
+12
View File
@@ -79,6 +79,7 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "Ugrás a(z) „{dir}” könyvtárhoz",
"Current directory path" : "Jelenlegi könyvtár útvonala",
"Share" : "Megosztás",
"Reload content" : "Tartalom újratöltése",
"Your have used your space quota and cannot upload files anymore" : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat",
"You do not have permission to upload or create files here." : "Nincs jogosultsága, hogy fájlokat töltsön fel és hozzon létre itt.",
"Drag and drop files here to upload" : "Húzza ide a fájlokat a feltöltéshez",
@@ -94,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Már létezik ilyen nevű bejegyzés.",
"Invalid filename." : "Érvénytelen fájlnév.",
"Rename file" : "Fájl átnevezése",
"Recently created" : "Nemrég létrehozva",
"Folder" : "Mappa",
"Unknown file type" : "Ismeretlen fájltípus",
"{ext} image" : "{ext}-kép",
@@ -109,6 +111,7 @@ OC.L10N.register(
"Last 30 days" : "Előző 30 nap",
"This year ({year})" : "Idén ({year})",
"Last year ({year})" : "Tavaly ({year})",
"Custom range" : "Egyéni tartomány",
"Custom date range" : "Egyéni dátumtartomány",
"Search everywhere" : "Keresés mindenhol",
"Documents" : "Dokumentumok",
@@ -120,6 +123,7 @@ OC.L10N.register(
"Images" : "Képek",
"Videos" : "Videók",
"Filters" : "Szűrők",
"Back to filters" : "Vissza a szűrőkhöz",
"Appearance" : "Megjelenés",
"Show hidden files" : "Rejtett fájlok megjelenítése",
"Show file type column" : "Fájltípus oszlop megjelenítése",
@@ -231,6 +235,9 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésének eltávolítása olvashatatlanná teheti azt.",
"Adding the file extension \"{new}\" may render the file unreadable." : "A fájl „{new}” kiterjesztésének hozzáadása olvashatatlanná teheti azt.",
"Do not show this dialog again." : "Ne jelenítse meg újra ezt a párbeszédablakot.",
"Rename file to hidden" : "Fájl átnevezése rejtettre",
"Prefixing a filename with a dot may render the file hidden." : "A fájlnév elé pont írása rejtetté teheti a fájlt.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Biztos, hogy átnevezi erre a fájlt: „{filename}”?",
"Cancel" : "Mégse",
"Rename" : "Átnevezés",
"Select file or folder to link to" : "Válassza ki a hivatkozandó fájlt vagy mappát",
@@ -245,6 +252,7 @@ OC.L10N.register(
"Error during upload: {message}" : "Hiba a feltöltés során: {message}",
"Error during upload, status code {status}" : "Hiba a feltöltés közben, állapotkód: {status}",
"Unknown error during upload" : "Ismeretlen hiba a feltöltés során",
"File list is reloading" : "A fájllista újratöltődik",
"Loading current folder" : "Jelenlegi mappa betöltése",
"Retry" : "Újra",
"No files in here" : "Itt nincsenek fájlok",
@@ -312,7 +320,9 @@ OC.L10N.register(
"The files are locked" : "A fájlok zárolva vannak",
"The file does not exist anymore" : "Ez a fájl már nem létezik",
"Moving \"{source}\" to \"{destination}\" …" : "A(z) „{source}” áthelyezése ide: „{destination}”…",
"Moving {count} files to \"{destination}\" …" : "{count} fájl áthelyezési ide: „{destination}”…",
"Copying \"{source}\" to \"{destination}\" …" : "A(z) „{source}” másolása ide: „{destination}”…",
"Copying {count} files to \"{destination}\" …" : "{count} fájl másolása ide: „{destination}”…",
"Choose destination" : "Válasszon célt",
"Copy to {target}" : "Másolás ide: {target}",
"Move to {target}" : "Áthelyezés ide: {target}",
@@ -327,6 +337,7 @@ OC.L10N.register(
"Retry and close" : "Újrapróbálás és bezárás",
"Open online" : "Megnyitás online",
"Details" : "Részletek",
"Open the details sidebar" : "Részletek oldalsáv megnyitása",
"Unfavorite" : "Nem kedvenc",
"View in folder" : "Megtekintés mappában",
"Type" : "Típus",
@@ -336,6 +347,7 @@ OC.L10N.register(
"Templates" : "Sablonok",
"New template folder" : "Új sablonmappa",
"In folder" : "Könyvtárban",
"Pick folder to search in" : "Válasszon mappát a kereséshez",
"Search in all files" : "Keresés az összes fájlban",
"Search in folder: {folder}" : "Keresés a mappában: {folder}",
"One of the dropped files could not be processed" : "Egy vagy több idehúzott fájl nem dolgozható fel",
+12
View File
@@ -77,6 +77,7 @@
"Go to the \"{dir}\" directory" : "Ugrás a(z) „{dir}” könyvtárhoz",
"Current directory path" : "Jelenlegi könyvtár útvonala",
"Share" : "Megosztás",
"Reload content" : "Tartalom újratöltése",
"Your have used your space quota and cannot upload files anymore" : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat",
"You do not have permission to upload or create files here." : "Nincs jogosultsága, hogy fájlokat töltsön fel és hozzon létre itt.",
"Drag and drop files here to upload" : "Húzza ide a fájlokat a feltöltéshez",
@@ -92,6 +93,7 @@
"Another entry with the same name already exists." : "Már létezik ilyen nevű bejegyzés.",
"Invalid filename." : "Érvénytelen fájlnév.",
"Rename file" : "Fájl átnevezése",
"Recently created" : "Nemrég létrehozva",
"Folder" : "Mappa",
"Unknown file type" : "Ismeretlen fájltípus",
"{ext} image" : "{ext}-kép",
@@ -107,6 +109,7 @@
"Last 30 days" : "Előző 30 nap",
"This year ({year})" : "Idén ({year})",
"Last year ({year})" : "Tavaly ({year})",
"Custom range" : "Egyéni tartomány",
"Custom date range" : "Egyéni dátumtartomány",
"Search everywhere" : "Keresés mindenhol",
"Documents" : "Dokumentumok",
@@ -118,6 +121,7 @@
"Images" : "Képek",
"Videos" : "Videók",
"Filters" : "Szűrők",
"Back to filters" : "Vissza a szűrőkhöz",
"Appearance" : "Megjelenés",
"Show hidden files" : "Rejtett fájlok megjelenítése",
"Show file type column" : "Fájltípus oszlop megjelenítése",
@@ -229,6 +233,9 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésének eltávolítása olvashatatlanná teheti azt.",
"Adding the file extension \"{new}\" may render the file unreadable." : "A fájl „{new}” kiterjesztésének hozzáadása olvashatatlanná teheti azt.",
"Do not show this dialog again." : "Ne jelenítse meg újra ezt a párbeszédablakot.",
"Rename file to hidden" : "Fájl átnevezése rejtettre",
"Prefixing a filename with a dot may render the file hidden." : "A fájlnév elé pont írása rejtetté teheti a fájlt.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Biztos, hogy átnevezi erre a fájlt: „{filename}”?",
"Cancel" : "Mégse",
"Rename" : "Átnevezés",
"Select file or folder to link to" : "Válassza ki a hivatkozandó fájlt vagy mappát",
@@ -243,6 +250,7 @@
"Error during upload: {message}" : "Hiba a feltöltés során: {message}",
"Error during upload, status code {status}" : "Hiba a feltöltés közben, állapotkód: {status}",
"Unknown error during upload" : "Ismeretlen hiba a feltöltés során",
"File list is reloading" : "A fájllista újratöltődik",
"Loading current folder" : "Jelenlegi mappa betöltése",
"Retry" : "Újra",
"No files in here" : "Itt nincsenek fájlok",
@@ -310,7 +318,9 @@
"The files are locked" : "A fájlok zárolva vannak",
"The file does not exist anymore" : "Ez a fájl már nem létezik",
"Moving \"{source}\" to \"{destination}\" …" : "A(z) „{source}” áthelyezése ide: „{destination}”…",
"Moving {count} files to \"{destination}\" …" : "{count} fájl áthelyezési ide: „{destination}”…",
"Copying \"{source}\" to \"{destination}\" …" : "A(z) „{source}” másolása ide: „{destination}”…",
"Copying {count} files to \"{destination}\" …" : "{count} fájl másolása ide: „{destination}”…",
"Choose destination" : "Válasszon célt",
"Copy to {target}" : "Másolás ide: {target}",
"Move to {target}" : "Áthelyezés ide: {target}",
@@ -325,6 +335,7 @@
"Retry and close" : "Újrapróbálás és bezárás",
"Open online" : "Megnyitás online",
"Details" : "Részletek",
"Open the details sidebar" : "Részletek oldalsáv megnyitása",
"Unfavorite" : "Nem kedvenc",
"View in folder" : "Megtekintés mappában",
"Type" : "Típus",
@@ -334,6 +345,7 @@
"Templates" : "Sablonok",
"New template folder" : "Új sablonmappa",
"In folder" : "Könyvtárban",
"Pick folder to search in" : "Válasszon mappát a kereséshez",
"Search in all files" : "Keresés az összes fájlban",
"Search in folder: {folder}" : "Keresés a mappában: {folder}",
"One of the dropped files could not be processed" : "Egy vagy több idehúzott fájl nem dolgozható fel",
+21
View File
@@ -79,6 +79,7 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "Fara í heimamöppu",
"Current directory path" : "Fyrirliggjandi slóð að möppu",
"Share" : "Deila",
"Reload content" : "Endurlesa efni",
"Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
"You do not have permission to upload or create files here." : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér.",
"Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
@@ -94,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
"Invalid filename." : "Ógilt skráarheiti.",
"Rename file" : "Endurnefna skrá",
"Recently created" : "Nýlega útbúið",
"Folder" : "Mappa",
"Unknown file type" : "Óþekkt skráartegund",
"{ext} image" : "{ext} mynd",
@@ -109,6 +111,7 @@ OC.L10N.register(
"Last 30 days" : "Síðustu 30 daga",
"This year ({year})" : "Þetta ár ({year})",
"Last year ({year})" : "Síðasta ár ({year})",
"Custom range" : "Sérsniðið bil",
"Custom date range" : "Sérsniðið dagsetningabil",
"Search everywhere" : "Leita allsstaðar",
"Documents" : "Skjöl",
@@ -120,6 +123,7 @@ OC.L10N.register(
"Images" : "Myndir",
"Videos" : "Myndskeið",
"Filters" : "Síur",
"Back to filters" : "Til baka í síur",
"Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
"Show file type column" : "Sýna dálk fyrir skráategund",
@@ -128,6 +132,7 @@ OC.L10N.register(
"General" : "Almennt",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
"Enable folder tree view" : "Virkja möppugreinasýn",
"Default view" : "Sjálfgefin sýn",
"All files" : "Allar skrár",
"Personal files" : "Einkaskrár",
@@ -150,7 +155,10 @@ OC.L10N.register(
"Show those shortcuts" : "Sýna þessa flýtilykla",
"Warnings" : "Aðvaranir",
"Warn before changing a file extension" : "Aðvara áður en skráarendingu er breytt",
"Warn before deleting a file" : "Aðvara áður en skrá er eytt",
"WebDAV URL" : "WebDAV-slóð",
"Create an app password" : "Búa til lykilorð forrits",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Er krafist fyrir WebDAV-auðkenningu þar sem tveggja-þátta auðkenning er virkjuð fyrir þennan aðgang.",
"How to access files using WebDAV" : "Hvernig á að nálgast skrár í gegnum WebDAV",
"Total rows summary" : "Samantek á fjölda raða",
"Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
@@ -227,6 +235,9 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
"Do not show this dialog again." : "Ekki sýna þennan glugga aftur.",
"Rename file to hidden" : "Endurnefna skrá sem falda",
"Prefixing a filename with a dot may render the file hidden." : "Sé settur punktur framan við skráaheiti, gæti skráin orðið falin.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ertu viss um að þú viljir endurnefna skrána sem \"{filename}\"?",
"Cancel" : "Hætta við",
"Rename" : "Endurnefna",
"Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
@@ -241,11 +252,13 @@ OC.L10N.register(
"Error during upload: {message}" : "Villa við innsendingu: {message}",
"Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
"Unknown error during upload" : "Óþekkt villa við innsendingu",
"File list is reloading" : "Skráalisti er að hlaðast inn",
"Loading current folder" : "Hleð inn núverandi möppu",
"Retry" : "Reyna aftur",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
"Go back" : "Fara til baka",
"Loading …" : "Hleð inn…",
"Your files" : "Skrárnar þínar",
"Open in files" : "Opna í skráaforritinu",
"File cannot be accessed" : "Skráin er ekki aðgengileg",
@@ -269,6 +282,9 @@ OC.L10N.register(
"Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
"All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
"One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["Ekki var hægt að umbreyta %n skrá","Ekki var hægt að umbreyta %n skrám"],
"_%n file converted_::_%n files converted_" : ["%n skrá umbreytt","%n skrám umbreytt"],
"Files converted" : "Skrám umbreytt",
"Failed to convert files" : "Mistókst að umbreyta skrám",
"Converting file …" : "Umbreyti skrá…",
"File successfully converted" : "Tókst að umbreyta skrá",
@@ -304,7 +320,9 @@ OC.L10N.register(
"The files are locked" : "Skrárnar eru læstar",
"The file does not exist anymore" : "Skráin er ekki lengur til",
"Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Færi {count} skrár í \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Afrita {count} skrár í \"{destination}\" …",
"Choose destination" : "Veldu áfangastað",
"Copy to {target}" : "Afrita í {target}",
"Move to {target}" : "Færa í {target}",
@@ -319,6 +337,8 @@ OC.L10N.register(
"Retry and close" : "Prófa aftur og loka",
"Open online" : "Opna á netinu",
"Details" : "Nánar",
"Open the details sidebar" : "Opna hliðarspjald með ítarupplýsingum",
"Unfavorite" : "Taka úr eftirlætum",
"View in folder" : "Skoða í möppu",
"Type" : "Tegund",
"Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
@@ -327,6 +347,7 @@ OC.L10N.register(
"Templates" : "Sniðmát",
"New template folder" : "Ný mappa fyrir sniðmát",
"In folder" : "Í möppunni",
"Pick folder to search in" : "Veldu möppu til að leita í",
"Search in all files" : "Leita í öllum skrám",
"Search in folder: {folder}" : "Leita í möppunni: {folder}",
"One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+21
View File
@@ -77,6 +77,7 @@
"Go to the \"{dir}\" directory" : "Fara í heimamöppu",
"Current directory path" : "Fyrirliggjandi slóð að möppu",
"Share" : "Deila",
"Reload content" : "Endurlesa efni",
"Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
"You do not have permission to upload or create files here." : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér.",
"Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
@@ -92,6 +93,7 @@
"Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
"Invalid filename." : "Ógilt skráarheiti.",
"Rename file" : "Endurnefna skrá",
"Recently created" : "Nýlega útbúið",
"Folder" : "Mappa",
"Unknown file type" : "Óþekkt skráartegund",
"{ext} image" : "{ext} mynd",
@@ -107,6 +109,7 @@
"Last 30 days" : "Síðustu 30 daga",
"This year ({year})" : "Þetta ár ({year})",
"Last year ({year})" : "Síðasta ár ({year})",
"Custom range" : "Sérsniðið bil",
"Custom date range" : "Sérsniðið dagsetningabil",
"Search everywhere" : "Leita allsstaðar",
"Documents" : "Skjöl",
@@ -118,6 +121,7 @@
"Images" : "Myndir",
"Videos" : "Myndskeið",
"Filters" : "Síur",
"Back to filters" : "Til baka í síur",
"Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
"Show file type column" : "Sýna dálk fyrir skráategund",
@@ -126,6 +130,7 @@
"General" : "Almennt",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
"Enable folder tree view" : "Virkja möppugreinasýn",
"Default view" : "Sjálfgefin sýn",
"All files" : "Allar skrár",
"Personal files" : "Einkaskrár",
@@ -148,7 +153,10 @@
"Show those shortcuts" : "Sýna þessa flýtilykla",
"Warnings" : "Aðvaranir",
"Warn before changing a file extension" : "Aðvara áður en skráarendingu er breytt",
"Warn before deleting a file" : "Aðvara áður en skrá er eytt",
"WebDAV URL" : "WebDAV-slóð",
"Create an app password" : "Búa til lykilorð forrits",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Er krafist fyrir WebDAV-auðkenningu þar sem tveggja-þátta auðkenning er virkjuð fyrir þennan aðgang.",
"How to access files using WebDAV" : "Hvernig á að nálgast skrár í gegnum WebDAV",
"Total rows summary" : "Samantek á fjölda raða",
"Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
@@ -225,6 +233,9 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
"Do not show this dialog again." : "Ekki sýna þennan glugga aftur.",
"Rename file to hidden" : "Endurnefna skrá sem falda",
"Prefixing a filename with a dot may render the file hidden." : "Sé settur punktur framan við skráaheiti, gæti skráin orðið falin.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ertu viss um að þú viljir endurnefna skrána sem \"{filename}\"?",
"Cancel" : "Hætta við",
"Rename" : "Endurnefna",
"Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
@@ -239,11 +250,13 @@
"Error during upload: {message}" : "Villa við innsendingu: {message}",
"Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
"Unknown error during upload" : "Óþekkt villa við innsendingu",
"File list is reloading" : "Skráalisti er að hlaðast inn",
"Loading current folder" : "Hleð inn núverandi möppu",
"Retry" : "Reyna aftur",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
"Go back" : "Fara til baka",
"Loading …" : "Hleð inn…",
"Your files" : "Skrárnar þínar",
"Open in files" : "Opna í skráaforritinu",
"File cannot be accessed" : "Skráin er ekki aðgengileg",
@@ -267,6 +280,9 @@
"Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
"All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
"One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["Ekki var hægt að umbreyta %n skrá","Ekki var hægt að umbreyta %n skrám"],
"_%n file converted_::_%n files converted_" : ["%n skrá umbreytt","%n skrám umbreytt"],
"Files converted" : "Skrám umbreytt",
"Failed to convert files" : "Mistókst að umbreyta skrám",
"Converting file …" : "Umbreyti skrá…",
"File successfully converted" : "Tókst að umbreyta skrá",
@@ -302,7 +318,9 @@
"The files are locked" : "Skrárnar eru læstar",
"The file does not exist anymore" : "Skráin er ekki lengur til",
"Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Færi {count} skrár í \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Afrita {count} skrár í \"{destination}\" …",
"Choose destination" : "Veldu áfangastað",
"Copy to {target}" : "Afrita í {target}",
"Move to {target}" : "Færa í {target}",
@@ -317,6 +335,8 @@
"Retry and close" : "Prófa aftur og loka",
"Open online" : "Opna á netinu",
"Details" : "Nánar",
"Open the details sidebar" : "Opna hliðarspjald með ítarupplýsingum",
"Unfavorite" : "Taka úr eftirlætum",
"View in folder" : "Skoða í möppu",
"Type" : "Tegund",
"Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
@@ -325,6 +345,7 @@
"Templates" : "Sniðmát",
"New template folder" : "Ný mappa fyrir sniðmát",
"In folder" : "Í möppunni",
"Pick folder to search in" : "Veldu möppu til að leita í",
"Search in all files" : "Leita í öllum skrám",
"Search in folder: {folder}" : "Leita í möppunni: {folder}",
"One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+13 -13
View File
@@ -131,8 +131,8 @@ OC.L10N.register(
"Crop image previews" : "Ritaglia le anteprime delle immagini",
"General" : "Generale",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina cartelle prima dei files",
"Enable folder tree view" : "Abilita visuale ad albero delle cartelle",
"Sort folders before files" : "Ordina le cartelle prima dei file",
"Enable folder tree view" : "Abilita vista ad albero delle cartelle",
"Default view" : "Vista predefinita",
"All files" : "Tutti i file",
"Personal files" : "File personali",
@@ -151,9 +151,9 @@ OC.L10N.register(
"Go left in grid" : "Vai a sinistra nella griglia",
"Go right in grid" : "Vai a destra nella griglia",
"View" : "Visualizza",
"Toggle grid view" : "Commuta la vista a griglia",
"Show those shortcuts" : "Mostra quelle scorciatoie",
"Warnings" : "Avvertenze",
"Toggle grid view" : "Attiva/disattiva la vista a griglia",
"Show those shortcuts" : "Mostra scorciatoie",
"Warnings" : "Avvisi",
"Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
"Warn before deleting a file" : "Avvisa prima di eliminare un file",
"WebDAV URL" : "URL WebDAV",
@@ -243,8 +243,8 @@ OC.L10N.register(
"Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
"Choose {file}" : "Scegli {file}",
"Files settings" : "Impostazioni File",
"Switch to list view" : "Passa alla vista elenco",
"Switch to grid view" : "Passa alla vista griglia",
"Switch to list view" : "Passa alla vista a elenco",
"Switch to grid view" : "Passa alla vista a griglia",
"The file could not be found" : "Il file non è stato trovato",
"Upload was cancelled by user" : "Caricamento annullato dall'utente",
"Not enough free space" : "Spazio libero insufficiente",
@@ -259,16 +259,16 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
"Go back" : "Indietro",
"Loading …" : "Caricamento in corso...",
"Your files" : "I tuoi files",
"Your files" : "I tuoi file",
"Open in files" : "Apri in file",
"File cannot be accessed" : "Il file non possono essere acceduti",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Impossibile trovare il file oppure non disponi dei permessi per visualizzarlo. Chiedi al mittente di condividerlo.",
"No search results for “{query}”" : "Nessun risultato di ricerca per “{query}”",
"Search for files" : "Cerca file",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi di file per assicurarsi che i file vengano sincronizzati con tutti i client. In modo predefinito, tutti i nomi di file validi su POSIX (es. Linux o macOS) sono consentiti.",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi dei file per assicurarsi che questi ultimi possano essere sincronizzati con tutti i client. Per impostazione predefinita, tutti i nomi di file validi su sistemi POSIX (es. Linux o macOS) sono consentiti.",
"After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
"Failed to toggle Windows filename support" : "Impossibile attivare il supporto per i nomi file di Windows",
"Files compatibility" : "Compatibilità di File",
"Files compatibility" : "Compatibilità dei file",
"Enforce Windows compatibility" : "Imponi la compatibilità con Windows",
"This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ciò bloccherà i nomi di file non validi sui sistemi Windows, come l'uso di nomi riservati o caratteri speciali. Tuttavia non verrà imposta la compatibilità con le maiuscole/minuscole.",
"Blank" : "Vuoto",
@@ -317,7 +317,7 @@ OC.L10N.register(
"This file/folder is already in that directory" : "Questo file/cartella è già in quella cartella",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Non puoi spostare un file/cartella in se stesso o in una sottocartella di se stesso",
"A file or folder with that name already exists in this folder" : "Esiste già un file o una cartella con quel nome in questa cartella",
"The files are locked" : "I files sono bloccati",
"The files are locked" : "I file sono bloccati",
"The file does not exist anymore" : "Il file non esiste più",
"Moving \"{source}\" to \"{destination}\" …" : "Spostare \"{source}\" in \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Spostamento di {count} file in \"{destination}\" …",
@@ -355,7 +355,7 @@ OC.L10N.register(
"No files to upload" : "Nessun file da caricare",
"Unable to create the directory {directory}" : "Impossibile creare la cartella {directory}",
"Some files could not be uploaded" : "Alcuni file non possono essere caricati",
"Files uploaded successfully" : "Files caricati correttamente",
"Files uploaded successfully" : "File caricati correttamente",
"No files to process" : "Nessun file da elaborare",
"Files copied successfully" : "File copiati correttamente",
"Files moved successfully" : "File spostati correttamente",
@@ -382,7 +382,7 @@ OC.L10N.register(
"No favorites yet" : "Nessun preferito ancora",
"Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
"List of your files and folders." : "Lista dei tuoi file e cartelle.",
"Folder tree" : "Albero delle cartella",
"Folder tree" : "Albero delle cartelle",
"List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
"No personal files found" : "Nessun file personale trovato",
"Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+13 -13
View File
@@ -129,8 +129,8 @@
"Crop image previews" : "Ritaglia le anteprime delle immagini",
"General" : "Generale",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina cartelle prima dei files",
"Enable folder tree view" : "Abilita visuale ad albero delle cartelle",
"Sort folders before files" : "Ordina le cartelle prima dei file",
"Enable folder tree view" : "Abilita vista ad albero delle cartelle",
"Default view" : "Vista predefinita",
"All files" : "Tutti i file",
"Personal files" : "File personali",
@@ -149,9 +149,9 @@
"Go left in grid" : "Vai a sinistra nella griglia",
"Go right in grid" : "Vai a destra nella griglia",
"View" : "Visualizza",
"Toggle grid view" : "Commuta la vista a griglia",
"Show those shortcuts" : "Mostra quelle scorciatoie",
"Warnings" : "Avvertenze",
"Toggle grid view" : "Attiva/disattiva la vista a griglia",
"Show those shortcuts" : "Mostra scorciatoie",
"Warnings" : "Avvisi",
"Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
"Warn before deleting a file" : "Avvisa prima di eliminare un file",
"WebDAV URL" : "URL WebDAV",
@@ -241,8 +241,8 @@
"Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
"Choose {file}" : "Scegli {file}",
"Files settings" : "Impostazioni File",
"Switch to list view" : "Passa alla vista elenco",
"Switch to grid view" : "Passa alla vista griglia",
"Switch to list view" : "Passa alla vista a elenco",
"Switch to grid view" : "Passa alla vista a griglia",
"The file could not be found" : "Il file non è stato trovato",
"Upload was cancelled by user" : "Caricamento annullato dall'utente",
"Not enough free space" : "Spazio libero insufficiente",
@@ -257,16 +257,16 @@
"Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
"Go back" : "Indietro",
"Loading …" : "Caricamento in corso...",
"Your files" : "I tuoi files",
"Your files" : "I tuoi file",
"Open in files" : "Apri in file",
"File cannot be accessed" : "Il file non possono essere acceduti",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Impossibile trovare il file oppure non disponi dei permessi per visualizzarlo. Chiedi al mittente di condividerlo.",
"No search results for “{query}”" : "Nessun risultato di ricerca per “{query}”",
"Search for files" : "Cerca file",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi di file per assicurarsi che i file vengano sincronizzati con tutti i client. In modo predefinito, tutti i nomi di file validi su POSIX (es. Linux o macOS) sono consentiti.",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi dei file per assicurarsi che questi ultimi possano essere sincronizzati con tutti i client. Per impostazione predefinita, tutti i nomi di file validi su sistemi POSIX (es. Linux o macOS) sono consentiti.",
"After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
"Failed to toggle Windows filename support" : "Impossibile attivare il supporto per i nomi file di Windows",
"Files compatibility" : "Compatibilità di File",
"Files compatibility" : "Compatibilità dei file",
"Enforce Windows compatibility" : "Imponi la compatibilità con Windows",
"This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ciò bloccherà i nomi di file non validi sui sistemi Windows, come l'uso di nomi riservati o caratteri speciali. Tuttavia non verrà imposta la compatibilità con le maiuscole/minuscole.",
"Blank" : "Vuoto",
@@ -315,7 +315,7 @@
"This file/folder is already in that directory" : "Questo file/cartella è già in quella cartella",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Non puoi spostare un file/cartella in se stesso o in una sottocartella di se stesso",
"A file or folder with that name already exists in this folder" : "Esiste già un file o una cartella con quel nome in questa cartella",
"The files are locked" : "I files sono bloccati",
"The files are locked" : "I file sono bloccati",
"The file does not exist anymore" : "Il file non esiste più",
"Moving \"{source}\" to \"{destination}\" …" : "Spostare \"{source}\" in \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Spostamento di {count} file in \"{destination}\" …",
@@ -353,7 +353,7 @@
"No files to upload" : "Nessun file da caricare",
"Unable to create the directory {directory}" : "Impossibile creare la cartella {directory}",
"Some files could not be uploaded" : "Alcuni file non possono essere caricati",
"Files uploaded successfully" : "Files caricati correttamente",
"Files uploaded successfully" : "File caricati correttamente",
"No files to process" : "Nessun file da elaborare",
"Files copied successfully" : "File copiati correttamente",
"Files moved successfully" : "File spostati correttamente",
@@ -380,7 +380,7 @@
"No favorites yet" : "Nessun preferito ancora",
"Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
"List of your files and folders." : "Lista dei tuoi file e cartelle.",
"Folder tree" : "Albero delle cartella",
"Folder tree" : "Albero delle cartelle",
"List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
"No personal files found" : "Nessun file personale trovato",
"Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+1
View File
@@ -95,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Inny wpis o tej samej nazwie już istnieje.",
"Invalid filename." : "Nieprawidłowa nazwa pliku.",
"Rename file" : "Zmień nazwę pliku",
"Recently created" : "Ostatnio utworzone",
"Folder" : "Katalog",
"Unknown file type" : "Nieznany typ pliku",
"{ext} image" : "{ext} zdjęcie",
+1
View File
@@ -93,6 +93,7 @@
"Another entry with the same name already exists." : "Inny wpis o tej samej nazwie już istnieje.",
"Invalid filename." : "Nieprawidłowa nazwa pliku.",
"Rename file" : "Zmień nazwę pliku",
"Recently created" : "Ostatnio utworzone",
"Folder" : "Katalog",
"Unknown file type" : "Nieznany typ pliku",
"{ext} image" : "{ext} zdjęcie",
+10
View File
@@ -95,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
"Invalid filename." : "Ogiltigt filnamn.",
"Rename file" : "Byt namn på fil",
"Recently created" : "Nyligen skapade",
"Folder" : "Mapp",
"Unknown file type" : "Okänd filtyp",
"{ext} image" : "{ext} bild",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Last 30 days" : "Senaste 30 dagarna",
"This year ({year})" : "I år ({year})",
"Last year ({year})" : "Förra året ({year})",
"Custom range" : "Anpassat intervall",
"Custom date range" : "Anpassat datumintervall",
"Search everywhere" : "Sök överallt",
"Documents" : "Dokument",
@@ -233,6 +235,9 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
"Do not show this dialog again." : "Visa inte denna dialog igen.",
"Rename file to hidden" : "Byt namn på filen till ”hidden”",
"Prefixing a filename with a dot may render the file hidden." : "Om man sätter en punkt framför ett filnamn kan filen bli dold.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Är du säker på att du vill byta namn på filen till \"{filename}\"?",
"Cancel" : "Avbryt",
"Rename" : "Byt namn",
"Select file or folder to link to" : "Välj fil eller mapp att länka till",
@@ -315,7 +320,9 @@ OC.L10N.register(
"The files are locked" : "Filerna är låsta",
"The file does not exist anymore" : "Filen finns inte längre",
"Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Flyttar {count}filer till \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Kopierar {count} filer till \"{destination}\" …",
"Choose destination" : "Välj destination",
"Copy to {target}" : "Kopiera till {target}",
"Move to {target}" : "Flytta till {target}",
@@ -330,6 +337,8 @@ OC.L10N.register(
"Retry and close" : "Försök igen och stäng",
"Open online" : "Öppna online",
"Details" : "Detaljer",
"Open the details sidebar" : "Öppna informationsfältet",
"Unfavorite" : "Ta bort från favoriter",
"View in folder" : "Utforska i mapp",
"Type" : "Typ",
"Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
@@ -338,6 +347,7 @@ OC.L10N.register(
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
"Pick folder to search in" : "Välj en mapp att söka i",
"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",
+10
View File
@@ -93,6 +93,7 @@
"Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
"Invalid filename." : "Ogiltigt filnamn.",
"Rename file" : "Byt namn på fil",
"Recently created" : "Nyligen skapade",
"Folder" : "Mapp",
"Unknown file type" : "Okänd filtyp",
"{ext} image" : "{ext} bild",
@@ -108,6 +109,7 @@
"Last 30 days" : "Senaste 30 dagarna",
"This year ({year})" : "I år ({year})",
"Last year ({year})" : "Förra året ({year})",
"Custom range" : "Anpassat intervall",
"Custom date range" : "Anpassat datumintervall",
"Search everywhere" : "Sök överallt",
"Documents" : "Dokument",
@@ -231,6 +233,9 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
"Do not show this dialog again." : "Visa inte denna dialog igen.",
"Rename file to hidden" : "Byt namn på filen till ”hidden”",
"Prefixing a filename with a dot may render the file hidden." : "Om man sätter en punkt framför ett filnamn kan filen bli dold.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Är du säker på att du vill byta namn på filen till \"{filename}\"?",
"Cancel" : "Avbryt",
"Rename" : "Byt namn",
"Select file or folder to link to" : "Välj fil eller mapp att länka till",
@@ -313,7 +318,9 @@
"The files are locked" : "Filerna är låsta",
"The file does not exist anymore" : "Filen finns inte längre",
"Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Flyttar {count}filer till \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Kopierar {count} filer till \"{destination}\" …",
"Choose destination" : "Välj destination",
"Copy to {target}" : "Kopiera till {target}",
"Move to {target}" : "Flytta till {target}",
@@ -328,6 +335,8 @@
"Retry and close" : "Försök igen och stäng",
"Open online" : "Öppna online",
"Details" : "Detaljer",
"Open the details sidebar" : "Öppna informationsfältet",
"Unfavorite" : "Ta bort från favoriter",
"View in folder" : "Utforska i mapp",
"Type" : "Typ",
"Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
@@ -336,6 +345,7 @@
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
"Pick folder to search in" : "Välj en mapp att söka i",
"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",
+7 -2
View File
@@ -8,6 +8,7 @@
namespace OCA\Files\BackgroundJob;
use OC\Files\SetupManager;
use OC\Files\Utils\Scanner;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\TimedJob;
@@ -15,6 +16,7 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;
/**
@@ -33,6 +35,8 @@ class ScanFiles extends TimedJob {
private LoggerInterface $logger,
private IDBConnection $connection,
ITimeFactory $time,
private readonly SetupManager $setupManager,
private readonly IUserManager $userManager,
) {
parent::__construct($time);
// Run once per 10 minutes
@@ -42,10 +46,11 @@ class ScanFiles extends TimedJob {
protected function runScanner(string $user): void {
try {
$scanner = new Scanner(
$user,
$this->userManager->get($user),
null,
$this->dispatcher,
$this->logger
$this->logger,
$this->setupManager,
);
$scanner->backgroundScan('');
} catch (\Exception $e) {
+6 -3
View File
@@ -11,6 +11,7 @@ use OC\Core\Command\Base;
use OC\Core\Command\InterruptedException;
use OC\DB\Connection;
use OC\DB\ConnectionAdapter;
use OC\Files\SetupManager;
use OC\Files\Storage\Wrapper\Jail;
use OC\Files\Utils\Scanner;
use OC\FilesMetadata\FilesMetadataManager;
@@ -49,6 +50,7 @@ class Scan extends Base {
private FilesMetadataManager $filesMetadataManager,
private IEventDispatcher $eventDispatcher,
private LoggerInterface $logger,
private SetupManager $setupManager,
) {
parent::__construct();
}
@@ -111,10 +113,11 @@ class Scan extends Base {
): void {
$connection = $this->reconnectToDatabase($output);
$scanner = new Scanner(
$user,
$this->userManager->get($user),
new ConnectionAdapter($connection),
Server::get(IEventDispatcher::class),
Server::get(LoggerInterface::class)
$this->eventDispatcher,
$this->logger,
$this->setupManager,
);
# check on each file/folder if there was a user interrupt (ctrl-c) and throw an exception
+2
View File
@@ -10,6 +10,7 @@ use OC\Core\Command\Base;
use OC\Core\Command\InterruptedException;
use OC\DB\Connection;
use OC\DB\ConnectionAdapter;
use OC\Files\SetupManager;
use OC\Files\Utils\Scanner;
use OC\ForbiddenException;
use OC\Preview\Storage\StorageFactory;
@@ -60,6 +61,7 @@ class ScanAppData extends Base {
new ConnectionAdapter($connection),
Server::get(IEventDispatcher::class),
Server::get(LoggerInterface::class),
Server::get(SetupManager::class),
);
}
+1 -1
View File
@@ -12,8 +12,8 @@ import { emit } from '@nextcloud/event-bus'
import { n, t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { fetchNode } from '../services/WebdavClient.ts'
import { logger } from '../utils/logger.ts'
type ConversionResponse = {
path: string
+1 -1
View File
@@ -10,7 +10,7 @@ import * as capabilities from '@nextcloud/capabilities'
import * as eventBus from '@nextcloud/event-bus'
import { File, Folder, Permission } from '@nextcloud/files'
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { action } from './deleteAction.ts'
import { shouldAskForConfirmation } from './deleteUtils.ts'
+1 -1
View File
@@ -12,7 +12,7 @@ import { Permission } from '@nextcloud/files'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { askConfirmation, canDisconnectOnly, canUnshareOnly, deleteNode, displayName, shouldAskForConfirmation } from './deleteUtils.ts'
// TODO: once the files app is migrated to the new frontend use the import instead:
+1 -1
View File
@@ -11,10 +11,10 @@ import { showError } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { DefaultType, FileType } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { usePathsStore } from '../store/paths.ts'
import { logger } from '../utils/logger.ts'
import { isDownloadable } from '../utils/permissions.ts'
export const action: IFileAction = {
@@ -9,7 +9,7 @@ import axios from '@nextcloud/axios'
import * as eventBus from '@nextcloud/event-bus'
import { File, Permission } from '@nextcloud/files'
import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { action } from './favoriteAction.ts'
import * as favoriteAction from './favoriteAction.ts'
+1 -1
View File
@@ -16,7 +16,7 @@ import { generateUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import PQueue from 'p-queue'
import Vue from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
const queue = new PQueue({ concurrency: 5 })
+1 -1
View File
@@ -19,8 +19,8 @@ import { t } from '@nextcloud/l10n'
import { getConflicts } from '@nextcloud/upload'
import { basename, join } from 'path'
import Vue from 'vue'
import logger from '../logger.ts'
import { getContents } from '../services/Files.ts'
import { logger } from '../utils/logger.ts'
import { canCopy, canMove, getQueue, MoveCopyAction } from './moveOrCopyActionUtils.ts'
/**
+1 -1
View File
@@ -14,7 +14,7 @@ import { translate as t } from '@nextcloud/l10n'
import { encodePath } from '@nextcloud/paths'
import { generateOcsUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { isSyncable } from '../utils/permissions.ts'
export const action: IFileAction = {
+1 -1
View File
@@ -7,7 +7,7 @@ import type { IView } from '@nextcloud/files'
import { File, Folder, Permission } from '@nextcloud/files'
import { beforeEach, describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { action } from './sidebarAction.ts'
const sidebar = vi.hoisted(() => ({
+1 -1
View File
@@ -9,7 +9,7 @@ import InformationSvg from '@mdi/svg/svg/information-outline.svg?raw'
import { getSidebar, Permission } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { isPublicShare } from '@nextcloud/sharing/public'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export const ACTION_DETAILS = 'details'
+1 -1
View File
@@ -76,7 +76,6 @@ import NcBreadcrumbs from '@nextcloud/vue/components/NcBreadcrumbs'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useViews } from '../composables/useViews.ts'
import logger from '../logger.ts'
import { dataTransferToFileTree, onDropExternalFiles, onDropInternalFiles } from '../services/DropService.ts'
import { useActiveStore } from '../store/active.ts'
import { useDragAndDropStore } from '../store/dragging.ts'
@@ -84,6 +83,7 @@ import { useFilesStore } from '../store/files.ts'
import { usePathsStore } from '../store/paths.ts'
import { useSelectionStore } from '../store/selection.ts'
import { useUploaderStore } from '../store/uploader.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'BreadCrumbs',
@@ -37,9 +37,9 @@ import { UploadStatus } from '@nextcloud/upload'
import debounce from 'debounce'
import { defineComponent } from 'vue'
import TrayArrowDownIcon from 'vue-material-design-icons/TrayArrowDown.vue'
import logger from '../logger.ts'
import { dataTransferToFileTree, onDropExternalFiles } from '../services/DropService.ts'
import { useActiveStore } from '../store/active.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'DragAndDropNotice',
@@ -136,10 +136,10 @@ import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import CustomElementRender from '../CustomElementRender.vue'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
import logger from '../../logger.ts'
import actionsMixins from '../../mixins/actionsMixin.ts'
import { useActiveStore } from '../../store/active.ts'
import { executeAction } from '../../utils/actionUtils.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryActions',
@@ -27,10 +27,10 @@ import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { defineComponent } from 'vue'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useKeyboardStore } from '../../store/keyboard.ts'
import { useSelectionStore } from '../../store/selection.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryCheckbox',
@@ -49,11 +49,11 @@ import { basename } from '@nextcloud/paths'
import { defineComponent, inject } from 'vue'
import NcTextField from '@nextcloud/vue/components/NcTextField'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useRenamingStore } from '../../store/renaming.ts'
import { useUserConfigStore } from '../../store/userconfig.ts'
import { getFilenameValidity } from '../../utils/filenameValidity.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryName',
@@ -78,9 +78,9 @@ import CollectivesIcon from './CollectivesIcon.vue'
import FavoriteIcon from './FavoriteIcon.vue'
import RecentlyCreatedIcon from './RecentlyCreatedIcon.vue'
import { usePreviewImage } from '../../composables/usePreviewImage.ts'
import logger from '../../logger.ts'
import { isLivePhoto } from '../../services/LivePhotos.ts'
import { useUserConfigStore } from '../../store/userconfig.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryPreview',
+12 -7
View File
@@ -14,13 +14,13 @@ import { generateUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import { getConflicts, getUploader } from '@nextcloud/upload'
import { vOnClickOutside } from '@vueuse/components'
import { extname } from 'path'
import { extname, relative } from 'path'
import Vue, { computed, defineComponent } from 'vue'
import { action as sidebarAction } from '../actions/sidebarAction.ts'
import logger from '../logger.ts'
import { onDropInternalFiles } from '../services/DropService.ts'
import { getDragAndDropPreview } from '../utils/dragUtils.ts'
import { hashCode } from '../utils/hashUtils.ts'
import { logger } from '../utils/logger.ts'
import { isDownloadable } from '../utils/permissions.ts'
Vue.directive('onClickOutside', vOnClickOutside)
@@ -488,12 +488,17 @@ export default defineComponent({
const items = Array.from(event.dataTransfer?.items || [])
if (selection.length === 0 && items.some((item) => item.kind === 'file')) {
const files = items.filter((item) => item.kind === 'file')
.map((item) => 'webkitGetAsEntry' in item ? item.webkitGetAsEntry() : item.getAsFile())
.filter(Boolean) as (FileSystemEntry | File)[]
const uploader = getUploader()
const root = uploader.destination.path
const relativePath = relative(root, this.source.path)
logger.debug('Start uploading dropped files', { target: this.source.path, root, relativePath, files: files.map((file) => file.name) })
await uploader.batchUpload(
this.source.path,
items.filter((item) => item.kind === 'file')
.map((item) => 'webkitGetAsEntry' in item ? item.webkitGetAsEntry() : item.getAsFile())
.filter(Boolean) as (FileSystemEntry | File)[],
relativePath,
files,
async (nodes, path) => {
try {
const { contents, folder } = await this.activeView!.getContents(path)
@@ -536,7 +541,7 @@ export default defineComponent({
const isCopy = event.ctrlKey
this.dragover = false
logger.debug('Dropped', { event, folder: this.source, selection, fileTree })
logger.debug('Dropped', { event, folder: this.source, selection })
const nodes = selection.map((source) => this.filesStore.getNode(source)) as Node[]
await onDropInternalFiles(nodes, this.source, contents, isCopy)
@@ -13,7 +13,7 @@ import type { Folder, IFileListHeader, View } from '@nextcloud/files'
import type { PropType } from 'vue'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
/**
* This component is used to render custom
@@ -84,11 +84,11 @@ import { FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID } from './FilesListTableHeaderActi
import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import filesSortingMixin from '../mixins/filesSorting.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
import { useSelectionStore } from '../store/selection.ts'
import { logger } from '../utils/logger.ts'
export const FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID = 'files-list-header-select-all-checkbox'
@@ -88,12 +88,12 @@ import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import { FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID } from './FilesListTableHeader.vue'
import { useFileActions } from '../composables/useFileActions.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import logger from '../logger.ts'
import actionsMixins from '../mixins/actionsMixin.ts'
import { useActionsMenuStore } from '../store/actionsmenu.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
import { useSelectionStore } from '../store/selection.ts'
import { logger } from '../utils/logger.ts'
export const FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID = 'files-list-head-first-batch-action'
@@ -91,10 +91,10 @@ import { useEnabledFileActions } from '../composables/useFileActions.ts'
import { useFileListHeaders } from '../composables/useFileListHeaders.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import { useActiveStore } from '../store/active.ts'
import { useSelectionStore } from '../store/selection.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'FilesListVirtual',
@@ -10,9 +10,9 @@ import { NcIconSvgWrapper, NcLoadingIcon } from '@nextcloud/vue'
import { ref, toRef, watch } from 'vue'
import NcAppSidebarTab from '@nextcloud/vue/components/NcAppSidebarTab'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useSidebarStore } from '../../store/sidebar.ts'
import { logger } from '../../utils/logger.ts'
const props = defineProps<{
/**
@@ -37,7 +37,7 @@ import { debounce, throttle } from 'throttle-debounce'
import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
import ChartPie from 'vue-material-design-icons/ChartPieOutline.vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export default {
name: 'NavigationQuota',
@@ -17,8 +17,8 @@ import NcInputField from '@nextcloud/vue/components/NcInputField'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
import logger from '../../logger.ts'
import { SanitizeFilenameStatus } from '../../models/SanitizeFilenameStatus.ts'
import { logger } from '../../utils/logger.ts'
type ApiStatus = { total: number, processed: number, errors?: Record<string, string[]>, status: SanitizeFilenameStatus }
@@ -52,7 +52,7 @@ import debounce from 'debounce'
import Vue from 'vue'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcSelect from '@nextcloud/vue/components/NcSelect'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
const picker = getFilePickerBuilder(t('files', 'Choose a file or folder to transfer'))
.setMultiSelect(false)
+1 -1
View File
@@ -77,7 +77,7 @@ import type { PropType } from 'vue'
import debounce from 'debounce'
import { defineComponent } from 'vue'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
interface RecycledPoolItem {
key: string
+1 -1
View File
@@ -7,9 +7,9 @@ import { getFileActions } from '@nextcloud/files'
import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { dirname } from 'path'
import { useRoute, useRouter } from 'vue-router/composables'
import logger from '../logger.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { executeAction } from '../utils/actionUtils.ts'
import { logger } from '../utils/logger.ts'
import { useRouteParameters } from './useRouteParameters.ts'
/**
+1 -1
View File
@@ -11,7 +11,7 @@ import { t } from '@nextcloud/l10n'
import wrap from '@vue/web-component-wrapper'
import Vue from 'vue'
import FileListFilterType from '../components/FileListFilter/FileListFilterType.vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export interface ITypePreset {
id: string
+1 -1
View File
@@ -13,7 +13,7 @@ import { emit } from '@nextcloud/event-bus'
import { Folder, Permission } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { basename } from 'path'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { newNodeName } from '../utils/newNodeDialog.ts'
export const entry: NewMenuEntry = {
+1 -1
View File
@@ -14,7 +14,7 @@ import { loadState } from '@nextcloud/initial-state'
import { translate as t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import { join } from 'path'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { newNodeName } from '../utils/newNodeDialog.ts'
const templatesEnabled = loadState<boolean>('files', 'templates_enabled', true)
@@ -9,7 +9,7 @@ import { getFilePickerBuilder } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { translate as t } from '@nextcloud/l10n'
import { imagePath } from '@nextcloud/router'
import logger from '../../logger.ts'
import { logger } from '../../utils/logger.ts'
/**
* Initialize the unified search plugin.
+1 -1
View File
@@ -12,11 +12,11 @@ import { relative } from 'path'
import queryString from 'query-string'
import Vue from 'vue'
import Router, { isNavigationFailure, NavigationFailureType } from 'vue-router'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { usePathsStore } from '../store/paths.ts'
import { defaultView } from '../utils/filesViews.ts'
import { logger } from '../utils/logger.ts'
Vue.use(Router)
+2 -2
View File
@@ -13,7 +13,7 @@ import { join } from '@nextcloud/paths'
import { getUploader, hasConflict } from '@nextcloud/upload'
import { handleCopyMoveNodesTo, HintException } from '../actions/moveOrCopyAction.ts'
import { MoveCopyAction } from '../actions/moveOrCopyActionUtils.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { createDirectoryIfNotExists, Directory, resolveConflict, traverseTree } from './DropServiceUtils.ts'
/**
@@ -123,7 +123,7 @@ export async function onDropExternalFiles(root: RootDirectory, destination: IFol
// then browse its tree and upload its contents.
if (file instanceof Directory) {
try {
logger.debug('Processing directory', { relativePath })
logger.debug('Processing directory', { relativePath, destination })
await createDirectoryIfNotExists(relativePath, destination)
await uploadDirectoryContents(file, relativePath)
} catch (error) {
@@ -6,7 +6,7 @@
import { join } from 'node:path'
import { beforeAll, describe, expect, it, vi } from 'vitest'
import { DataTransferItem as DataTransferItemMock, FileSystemDirectoryEntry, fileSystemEntryToDataTransferItem, FileSystemFileEntry } from '../../../../__tests__/FileSystemAPIUtils.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { dataTransferToFileTree } from './DropService.ts'
import { Directory, traverseTree } from './DropServiceUtils.ts'

Some files were not shown because too many files have changed in this diff Show More