Compare commits

..

282 Commits

Author SHA1 Message Date
Ferdinand Thiessen 6f41f6a050 feat: provide server version as capability
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-19 17:59:45 +02:00
Ferdinand Thiessen 9fd80b2aa2 Merge pull request #54515 from nextcloud/fix/theming-parsing
fix(theming): correctly parse CSS colors for user primary color picker
2025-08-19 17:43:18 +02:00
Kate 4edfef4dd5 Merge pull request #53895 from nextcloud/fix/cleanup-updater-class 2025-08-19 17:40:15 +02:00
Andy Scherzinger d8ccc9fb64 Merge pull request #54454 from nextcloud/dependabot/npm_and_yarn/webpack-5.101.2
chore(deps-dev): bump webpack from 5.101.0 to 5.101.2
2025-08-19 17:30:07 +02:00
nextcloud-command 8d06d2b35e chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-19 15:05:27 +00:00
Ferdinand Thiessen d0012e5672 fix(theming): correctly parse CSS colors for user primary color picker
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-19 16:58:41 +02:00
nextcloud-command d4a91c495e chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-19 14:58:14 +00:00
Ferdinand Thiessen 6404a9925c Merge pull request #54496 from nextcloud/refactor/deprecated-styles
refactor: replace deprecated CSS variables with their replacement
2025-08-19 16:57:11 +02:00
dependabot[bot] 9c365bf347 chore(deps-dev): bump webpack from 5.101.0 to 5.101.2
Bumps [webpack](https://github.com/webpack/webpack) from 5.101.0 to 5.101.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.101.0...v5.101.2)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.101.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-19 16:42:25 +02:00
nextcloud-command 1462e6fc67 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-19 13:58:03 +00:00
Ferdinand Thiessen 82d4d8290b refactor: replace deprecated CSS variables with their replacement
Couple of versions ago:
- `color-text-light` was replaced with `color-main-text`
- `color-text-lighter` was replaced with `color-text-maxcontrast`

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-19 15:50:29 +02:00
Ferdinand Thiessen 24b79aa1f0 Merge pull request #54512 from nextcloud/chore/adjust-for-new-status-colors
fix: adjust server styles for new secondary status colors
2025-08-19 15:50:05 +02:00
Maxence Lange 8a2b02ab9c Merge pull request #54414 from nextcloud/feat/noid/compare-defaults-on-preset
feat(preset): compare default for all preset
2025-08-19 12:31:45 -01:00
nextcloud-command 450c977ca8 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-19 13:13:24 +00:00
Ferdinand Thiessen e99ea1a351 fix: adjust server styles for new secondary status colors
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-19 15:05:01 +02:00
Maxence Lange e1c7f6020c feat(preset): adding /settings/preset endpoint
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-19 10:55:48 -01:00
Maxence Lange 6eda5583db feat(preset): compare default for all preset
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-19 10:50:24 -01:00
Maxence Lange 66cc7b731a Merge pull request #54408 from nextcloud/feat/noid/preset-on-share-link-expire-date
feat(preset): share link expiration date
2025-08-19 10:24:43 -01:00
John Molakvoæ 8e89cc5db0 Merge pull request #54510 from nextcloud/revert-54503-skjnldsv-patch-1 2025-08-19 12:23:52 +02:00
John Molakvoæ bc614e6c08 Revert "fix(workflows): also exclude beta in block-merge-freeze" 2025-08-19 12:18:24 +02:00
Kate c2437ebbff Merge pull request #54440 from nextcloud/fix/caldav/search-uid-urlencode 2025-08-19 11:52:55 +02:00
Kate 74d9649e6e Merge pull request #54058 from nextcloud/feat/preset/load-apps-on-preset 2025-08-19 11:43:54 +02:00
Kate c9c3acdbe0 Merge pull request #54327 from nextcloud/db-schema-export-table 2025-08-19 11:36:47 +02:00
John Molakvoæ f4c74f5f48 Merge pull request #54492 from nextcloud/feat/status-border-text-colors 2025-08-19 10:50:00 +02:00
John Molakvoæ 7c20186b0d Merge pull request #54503 from nextcloud/skjnldsv-patch-1 2025-08-19 10:20:54 +02:00
John Molakvoæ 0ff10e80d6 fix(workflows): also exclude beta in block-merge-freeze
Signed-off-by: John Molakvoæ <skjnldsv@users.noreply.github.com>
2025-08-19 09:45:46 +02:00
Daniel 09607f40eb Merge pull request #53834 from nextcloud/feat/imailaddressvalidator
feat(ocp): add email address validator
2025-08-19 09:38:51 +02:00
Daniel b9da14be0c Merge pull request #54494 from nextcloud/fix/typos
fix: typos in cache and app config
2025-08-19 09:34:24 +02:00
Daniel f7a7ae46ab Merge pull request #54464 from nextcloud/jtr-fix-dav-direct-server-propfind-typo
chore(dav): Fix typo in property name
2025-08-19 09:33:05 +02:00
Kate 96467aefa9 Merge pull request #54500 from nextcloud/chore/psalm/update-baseline 2025-08-19 09:03:03 +02:00
Kent Delante bca451f001 Merge pull request #54474 from nextcloud/leftybournes/feat/contactsmenu_register_actions
feat: provide api to register actions in contacts menu
2025-08-19 15:01:48 +08:00
provokateurin 3ae53e3d2a chore(psalm): Update baseline
Signed-off-by: provokateurin <kate@provokateurin.de>
2025-08-19 08:44:15 +02:00
Andy Scherzinger c026c7c933 Merge pull request #54419 from nextcloud/share-event-catch
fix: catch and log exception from share events
2025-08-19 07:21:52 +02:00
Andy Scherzinger 6ecae88d75 Merge pull request #54434 from nextcloud/fix/core--unified-search--cut-off
fix(core): unified search is cut off on small window
2025-08-19 07:20:20 +02:00
Kent Delante 9f3da00aac feat: provide api to register actions in contacts menu
Signed-off-by: Kent Delante <kent.delante@proton.me>
2025-08-19 09:17:44 +08:00
Nextcloud bot 18da10fd01 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-19 00:12:37 +00:00
Andy Scherzinger f824a5967b Merge pull request #54421 from nextcloud/fix/outline-extra-icons
fix: Replace some more icons with outlined ones
2025-08-19 00:19:42 +02:00
Andy Scherzinger 5072b7e926 Merge pull request #54457 from nextcloud/dependabot/composer/vendor-bin/rector/rector/rector-2.1.4
chore(deps-dev): bump rector/rector from 2.1.2 to 2.1.4 in /vendor-bin/rector
2025-08-19 00:02:53 +02:00
Ferdinand Thiessen 6c003eda5c Merge pull request #54483 from nextcloud/feat/fetch-user-timezone
feat(IDateTimeZone): allow to fetch timezone of specified user
2025-08-18 20:36:46 +02:00
Ferdinand Thiessen a0535ae917 Merge pull request #54439 from nextcloud/feat/secondary-status-colors
feat: use secondary-like status colors
2025-08-18 19:54:32 +02:00
Ferdinand Thiessen 112178d3a0 fix: typos in cache and app config
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 18:35:54 +02:00
Ferdinand Thiessen d79e18ab18 feat: add CSS variables for status border and text
The variables like `--color-error` now are based on our secondary
theming, thus they are less "aggressive" colors. But there are two
usecases for primary based status colors:
- borders
- error text messages (e.g. validation errors in forms)

To simplify app changes due to the secondary color theme change this
introduces 3 new variables:
- `--color-text-error` this shall be used if text should have error
  status theming and is displayed on normal background (while
  `--color-error-text` is only for text shown on `--color-error` similar
  as primary and secondary colors)
- `--color-border-error` and `--color-border-success` those should be
  used for element borders if there is one of those statuses to be
  reported (we use this for validation errors as well as for indicating a
  value was saved)

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 18:17:59 +02:00
Ferdinand Thiessen d779255c5f chore: recompile stylesheets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 18:17:27 +02:00
Ferdinand Thiessen 04c9015210 feat: darken hover colors of primary and secondary
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 18:15:55 +02:00
Ferdinand Thiessen 0394f4cb2a fix: adjust also legacy styles
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 18:15:55 +02:00
Ferdinand Thiessen 64db537b76 feat: use secondary-like status colors
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 18:15:55 +02:00
Richard Steinmetz c519e4a22a Merge pull request #54377 from nextcloud/feat/notification-preload-reason
feat: indicate reason for preloading notifications
2025-08-18 18:15:03 +02:00
Richard Steinmetz 8dc30e4f65 Merge pull request #54485 from nextcloud/fix/caldav-acl
fix: exclude \Sabre\DAVACL\Plugin from prop find monitoring
2025-08-18 18:05:02 +02:00
Côme Chilliet a25797330b fix: Log that using an appinfo/install.php file is deprecated
appinfo/install.php is not part of the official documentation for
 application development but some apps are still using such a file.
 Log a message to deprecate this behavior, to be able to remove support
 for this later.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:25:07 +02:00
Côme Chilliet 8ccf87f7a2 chore: update psalm baseline
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:41 +02:00
Côme Chilliet f5111c0961 chore(tests): Do not mock DependencyAnalyzer in AppManagerTest
Not ideal to have coupled tests like that but it’s the easiest path
 forward to make sure the tests still covers the same usecase and avoid
 code duplication.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:40 +02:00
Côme Chilliet 12edd2b23a fix: Deduplicate code by using DependencyAnalyzer in the AppManager
Was a bit more complicated than expected because of a dependency loop,
the L10N factory uses the app manager, thus the AppManager cannot depend
on I10N directly or indirectly in its constructor.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:40 +02:00
Côme Chilliet 7978b6153d chore: Update autoloader
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:40 +02:00
Côme Chilliet b7c15949ce chore: Get rid of AppLocator helper
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:40 +02:00
Côme Chilliet 3cea218750 chore(tests): Use valid application names for tests
Dash is not allowed in appid, underscore is.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:40 +02:00
Côme Chilliet 0e01bc09a9 chore: Inline OC_App::setupBackgroundJobs
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:39 +02:00
Côme Chilliet e5606d7fe3 chore: Move getAppPath and getAppWebPath implementations into AppManager
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:39 +02:00
Côme Chilliet 3e01a429e7 chore: Replace last calls to OC_App::enable by IAppManager
Also added a few missing deprecations

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:39 +02:00
Côme Chilliet 61a87bc384 chore: Deduplicate common code between installApp and installShippedApp
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 17:09:39 +02:00
Côme Chilliet 4abfd4871f chore: Move isAppCompatible and shouldUpgrade to the app manager
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:18:38 +02:00
Côme Chilliet 25c2279966 chore: Set installShippedApps as non-static in Installer
Make code closer to the one of installApp, to be able to compare them
 and later merge them (in the shadows).

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:18:27 +02:00
Côme Chilliet cb8d960766 chore: Remove check for appinfo/database.xml
It has been unsupported since Nextcloud 22.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:15:27 +02:00
Côme Chilliet f551b9192e chore: Adapt InstallerTest to Installer new construct parameters
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:15:27 +02:00
Côme Chilliet 410389867c chore: Inline private method OC_App::setupLiveMigrations
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:15:27 +02:00
Côme Chilliet f5fac6476f chore: Remove references to obsolete field ocsid in apps info.xml
It’s not even allowed by our xsd schema.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:15:25 +02:00
Côme Chilliet 42c980e093 chore: Add IAppManager property in Installer
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:14:48 +02:00
Côme Chilliet fd17555333 chore: Move OC_App::updateApp to IAppManager::upgradeApp
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:14:45 +02:00
Côme Chilliet 6aa675c6bb fix: Cleanup OC_App uses in Updater class
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-08-18 16:13:14 +02:00
Richard Steinmetz f95ce30994 feat: indicate reason for preloading notifications
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-08-18 15:28:46 +02:00
Ferdinand Thiessen 6d5dd4b389 Merge pull request #54383 from nextcloud/feat/cache-app-config
feat(AppConfig): cache the config if local cache is available
2025-08-18 15:12:09 +02:00
Ferdinand Thiessen cd550d57ef Merge pull request #54402 from nextcloud/fix/streamer-mtime-zip
fix(Streamer): use localtime for ZIP files
2025-08-18 14:39:37 +02:00
Ferdinand Thiessen f7e0f3f241 feat(IDateTimeZone): allow to fetch timezone of specified user
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 14:26:52 +02:00
Ferdinand Thiessen 2fb1cfeb10 Merge pull request #54470 from nextcloud/feat/central-timezone-setting
feat: allow to set your local timezone in settings and provide it to clients
2025-08-18 14:20:13 +02:00
Ferdinand Thiessen 5a2490ba04 Merge pull request #54482 from nextcloud/chore/codeowners-dependabot
chore(CODEOWNERS): remove dependabot team from codeowners
2025-08-18 14:04:26 +02:00
Richard Steinmetz 51f0aa5be2 fix: exclude \Sabre\DAVACL\Plugin from prop find monitoring
Fixes creating events with attendees on the same server.

Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-08-18 13:27:56 +02:00
Ferdinand Thiessen 503f43f655 test(cypress): clear cache after running OCC commands
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 13:24:18 +02:00
Ferdinand Thiessen 866ccae542 docs(IConfig): fix wrong doc block type for $key on setAppValue
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 13:24:18 +02:00
Ferdinand Thiessen 0ef58c96ab refactor(Memcache\Factory): move prefix generation to the factory class
This removes a circular dependency between AppConfig and cache factory.
When a cache in the app config is used.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 13:24:18 +02:00
Ferdinand Thiessen d5e2432bcd fix: resolve invalid usage of AppConfig::getValue
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 13:24:18 +02:00
Ferdinand Thiessen 9d320f8470 test(AppConfig): add proper unit tests
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 13:24:18 +02:00
Ferdinand Thiessen 1c85548f86 feat(AppConfig): cache app config in local cache if available
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 13:24:18 +02:00
Ferdinand Thiessen aa9345c55a chore: recompile assets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:47:39 +02:00
Ferdinand Thiessen 10768a2602 chore: update openAPI exports
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:46:00 +02:00
Ferdinand Thiessen 62804b93e0 chore(CODEOWNERS): remove dependabot team from codeowners
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:42:05 +02:00
Ferdinand Thiessen 20777e4a9d refactor(dav): remove timezone from AvailabilitiyForm
It is handled in personal settings now.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:40:42 +02:00
Ferdinand Thiessen ac545cc478 fix(SetUserTimezoneCommand): only write user login timezone if not yet set
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:40:42 +02:00
Kate d300e32c06 Merge pull request #54479 from nextcloud/fix/files_sharing/shared-with-me-hide-own-reshares 2025-08-18 12:40:28 +02:00
Ferdinand Thiessen 0dd8e5e32e feat(settings): allow to set own timezone in personal settings
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:35:31 +02:00
Ferdinand Thiessen c40350d2e4 feat(core): provide capabilities of the current user
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-18 12:35:31 +02:00
provokateurin 37175e0e2b fix(files_sharing): Also hide own reshares in shared with me section
Signed-off-by: provokateurin <kate@provokateurin.de>
2025-08-18 11:38:05 +02:00
John Molakvoæ 2d659b2f04 Merge pull request #54035 from theking2/patch-1 2025-08-18 11:23:23 +02:00
nextcloud-command 01273b3397 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-18 10:03:14 +02:00
kramo ba4f235628 fix: Replace some more icons with outlined ones
Follow-up to #54054

Signed-off-by: kramo <git@kramo.page>
2025-08-18 10:03:14 +02:00
Nextcloud bot 0bc2b34793 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-18 00:12:13 +00:00
Nextcloud bot 23573c4947 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-17 00:12:00 +00:00
Theking2 1396f76b73 Merge branch 'master' into patch-1 2025-08-16 14:06:37 +02:00
Josh 43df12f148 chore: update psalm-baseline.xml
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-16 07:58:10 -04:00
Josh 1fcf57c3ee chore(dav): Fix typo in property name
Already the parent class default so a no-op either way.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-16 07:56:54 -04:00
dependabot[bot] 545194bc94 Merge pull request #54453 from nextcloud/dependabot/npm_and_yarn/puppeteer-24.16.2 2025-08-16 02:58:10 +00:00
dependabot[bot] 2dec90f558 chore(deps-dev): bump rector/rector in /vendor-bin/rector
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.1.2 to 2.1.4.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.1.2...2.1.4)

---
updated-dependencies:
- dependency-name: rector/rector
  dependency-version: 2.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 02:15:51 +00:00
dependabot[bot] 48f43b5583 chore(deps-dev): bump puppeteer from 24.16.0 to 24.16.2
Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 24.16.0 to 24.16.2.
- [Release notes](https://github.com/puppeteer/puppeteer/releases)
- [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.16.0...puppeteer-v24.16.2)

---
updated-dependencies:
- dependency-name: puppeteer
  dependency-version: 24.16.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 01:58:00 +00:00
Nextcloud bot 22a51aace2 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-16 00:12:03 +00:00
Richard Steinmetz b38c07c682 Merge pull request #54229 from nextcloud/perf/mount-provider-join-array-merge
perf: join array_merge calls in MountProvider::getMountsForUser()
2025-08-15 15:25:39 +02:00
Richard Steinmetz fa80a6199d fix(caldav): encode calendar URLs properly when formatting search results
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-08-15 14:53:49 +02:00
Richard Steinmetz 7bb0e0de7a Merge pull request #54405 from nextcloud/perf/custom-properties-default-value
perf: delete commonly used custom properties instead of setting the default value
2025-08-15 13:34:29 +02:00
Grigorii K. Shartsev 2fb825505b chore(assets): Recompile assets
Signed-off-by: Grigorii K. Shartsev <me@shgk.me>
2025-08-15 12:37:11 +02:00
Grigorii K. Shartsev 501fa4de05 fix(core): unified search is cut off on small window
Signed-off-by: Grigorii K. Shartsev <me@shgk.me>
2025-08-15 12:34:37 +02:00
Salvatore Martire 75d9aaa3b5 Merge pull request #54318 from nextcloud/feat/54115/emitPreloadCollectionEvent
Emits a `preloadCollection` event in the DAV server, so that plugins can listen to it and preload DAV properties for files inside a collection, to avoid the N+1 issue that would follow if loading properties on a per-file basis.
2025-08-15 11:06:48 +02:00
Robin Appelman 89fa14fd77 Merge pull request #54386 from nextcloud/fix-n+1-caldav
fix(performance): Fix n+1 issue when fetching calendar properties
2025-08-15 10:56:11 +02:00
Salvatore Martire 4a0a00a5a2 perf(shares): avoid array_merge in loops
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-08-15 10:46:43 +02:00
Salvatore Martire bdcd583045 feat: make use of preloadCollection in core apps
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-08-15 10:46:43 +02:00
Salvatore Martire 9bbebd6034 feat: emit preloadCollection event in DAV
This allows plugins to preload the content of a Collection to speed-up
subsequent per-node PROPFINDs and reduce database load.

Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-08-15 10:46:43 +02:00
Carl Schwan 9df79bae10 perf(caldav): Only prefetch published properties
Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-15 09:57:58 +02:00
Carl Schwan 46f0c6ebb5 perf(caldav): Cache calendars in CustomPropertiesBackend
We already do that for files, we are now also doing for calendars.
With relatively small amount of calendars, I managed to reduce the
number of DB requests by 35% and from 23 DB requests touching the
oc_properties table to only 3.

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-15 09:57:58 +02:00
Carl Schwan 977541cedf perf(caldav): Add multi users support in findPropertiesByPaths
Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-15 09:57:56 +02:00
Daniel 64c52006dd Merge pull request #54272 from nextcloud/enh/noid/taskprocessing-task-add-cleanup-flag
feat(taskprocessing): add cleanup flag to tasks
2025-08-15 09:48:47 +02:00
Nextcloud bot 2fc58bf45d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-15 00:12:18 +00:00
John Molakvoæ 5f81a77c72 Merge pull request #54370 from nextcloud/chore-remove-unused-ocs-providers 2025-08-14 22:02:23 +02:00
Daniel 92e282af0b Merge pull request #53996 from nextcloud/feat/unified_search/online_providers
feat(UnifiedSearch): Online search providers support, toggle option
2025-08-14 21:08:21 +02:00
Maxence Lange 6076b67696 feat(preset): share link expiration date
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-14 16:07:32 -01:00
Maxence Lange 61fe4c1aba Merge pull request #54336 from nextcloud/feat/noid/preset-on-share-password
feat(preset): share password protection
2025-08-14 16:07:13 -01:00
Daniel Kesselberg 336c6d2957 feat(ocp): add email address validator
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2025-08-14 18:34:36 +02:00
Carl Schwan 806fe6619f perf(caldav): Fetch additional properties for multiple calendars in one query
Instead of doing it for each calendar individually.

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-14 18:25:40 +02:00
Robin Appelman e0a21e5927 Merge pull request #54384 from nextcloud/getpath-node
perf: use more optimized node-by-id logic in View::getPath
2025-08-14 18:21:23 +02:00
Ferdinand Thiessen ba00416040 refactor(Streamer): inject IDateTimeZone as constructor arg
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-14 17:19:28 +02:00
Ferdinand Thiessen bb72eed4a2 fix(Streamer): use localtime for ZIP files
ZIP does not use a proper timestamp but uses something called "DOS time".
This is a weird old format with some limitations like accuracy of only
2 seconds, but also no timezone information.
Also unline UNIX time it is not relative to some specific point in time
with timezone information, but is always considered to be the local
time. Meaning we need to convert it first to the users local time.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-14 17:19:28 +02:00
Benjamin Gaussorgues d7f66eaee4 Merge pull request #54418 from nextcloud/fix/more-transparency 2025-08-14 17:12:39 +02:00
Maxence Lange 9c7ed07571 feat(preset): load apps on new preset
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-14 13:27:33 -01:00
Robin Appelman 06aa7035db Merge pull request #54420 from nextcloud/disable-custom-props-events
perf(calendar): Disable custom properties for individual calendar events
2025-08-14 15:55:36 +02:00
Anna 1a2d0d5c1d Merge pull request #54117 from nextcloud/feat/noid/add-bulk-activity
feat(activity): add bulk activity option
2025-08-14 15:53:33 +02:00
Robin Appelman b69109395b Merge pull request #52786 from nextcloud/multi-object-store
allow configuring multiple object store backends
2025-08-14 15:49:00 +02:00
Andrey Borysenko 5c4e84f128 feat(UnifiedSearch): External search providers support
Signed-off-by: Andrey Borysenko <andrey18106x@gmail.com>
2025-08-14 16:37:39 +03:00
Stephan Orbaugh 7fe5c8fdda Merge pull request #54120 from IONOS-Productivity/fix/unified_search.providers_allowed
fix(search): Fix SearchComposer.php filtering logic
2025-08-14 15:02:42 +02:00
Salvatore Martire 50c9c7e332 Merge pull request #54153 from nextcloud/feat/54114/reportSlowPropfinds
This PR adds an error log when a DAV Plugin fetches data for nodes in a directory on a per-node basis instead of using an eager loading mechanism, which is more efficient.

This is only enabled when `config.php` has `'debug'` set to enabled.
2025-08-14 13:40:31 +02:00
Robin Appelman 1f24090770 Merge pull request #54411 from nextcloud/dav-customerproperties-ignore-nc
perf: ignore any custom property in the nc/oc namespace that isn't explicitly allowed
2025-08-14 13:22:10 +02:00
Robin Appelman 4990d75007 feat: multi object store rename command
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-14 13:06:51 +02:00
Robin Appelman b3c53c7436 feat: allow object store configuration aliases for easier migrations
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-14 13:06:51 +02:00
Robin Appelman 2d4bba7b0c feat: add command to get user objectstore config mappings
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-14 13:06:51 +02:00
Robin Appelman 385dd36ff8 feat: allow configuring multiple objectstore configurations
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-14 13:06:51 +02:00
Maxence Lange cf8203a5f6 fix(lexicon): fix definition for share password by default
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-14 09:52:28 -01:00
Robin Appelman dcc6c1956a fix: catch and log exception from share events
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-14 11:37:11 +02:00
Anna Larch 6a3a244807 feat(activity): add bulk activity option
Signed-off-by: Anna Larch <anna@nextcloud.com>
2025-08-14 11:31:47 +02:00
Carl Schwan 90cc0454a7 perf(calendar): Disable custom properties for individual calendar events
Save a query per event stored in the calendar and at least on the
production instance, there is no entries in the table for the events.

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-14 11:27:44 +02:00
Benjamin Gaussorgues 055b5ddb9e Merge pull request #54393 from nextcloud/automated/noid/master-update-ca-cert-bundle 2025-08-14 10:32:04 +02:00
Ferdinand Thiessen 0305004709 fix: add more transparency to the header icon gradient
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-14 10:06:46 +02:00
nextcloud-command 248adf535c fix(security): Update CA certificate bundle
Signed-off-by: GitHub <noreply@github.com>
2025-08-14 02:43:58 +00:00
Nextcloud bot 1b63b565d4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-14 00:12:21 +00:00
Simon L. ec3be25955 Merge pull request #54413 from nextcloud/perf/render-sharing-tab-sections-only-once
perf: render sharing tab sections only once
2025-08-13 22:59:32 +02:00
Daniel 9dd661f3d8 Merge pull request #53756 from nextcloud/feat/settings/app_api/daemon-selection
feat(settings): Deploy daemon selection support during ExApp installation
2025-08-13 22:57:13 +02:00
Andrey Borysenko 71ef47e70b feat(settings): Deploy daemon selection support during ExApp installation
Signed-off-by: Andrey Borysenko <andrey18106x@gmail.com>
2025-08-13 21:19:38 +03:00
Richard Steinmetz 798f3734be perf: render sharing tab sections only once
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-08-13 20:10:47 +02:00
Richard Steinmetz 7c0ffc0759 perf: delete commonly used custom properties instead of setting the default value
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-08-13 20:07:43 +02:00
Salvatore Martire ec176a933a feat(dav): report inefficient DAV plugins in logs
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-08-13 19:46:18 +02:00
Robin Appelman 06154dd116 fix: don't use view->getPath in ownership transfer
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-13 19:42:42 +02:00
Robin Appelman 34d5a103b4 test: adjust tests to getPath changes
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-13 19:42:42 +02:00
Robin Appelman 5987584b90 perf: use more optimized node-by-id logic in View::getPath
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-13 19:42:42 +02:00
Robin Appelman 46b5ff7467 perf: ignore any customer property in the nc/oc namespace that isn't explicitly allowed
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-13 19:32:45 +02:00
Nextcloud bot d658b9b558 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-13 16:59:00 +00:00
Andy Scherzinger 7d45e9b2a3 Merge pull request #54401 from nextcloud/fix/streamer-directory-mtime
fix(ZipFolderPlugin): set mtime of directories in archive
2025-08-13 17:58:45 +02:00
Ferdinand Thiessen 32703d0500 fix(ZipFolderPlugin): set mtime of directories in archive
Directories should also have the correct mtime set and not the current
time. For this the `Streamer` class needs to support passing a time
attribute for creating folders, the underlying library already supports
this.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-13 10:23:47 +02:00
Nextcloud bot 2979a2bab0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-13 00:12:03 +00:00
Ferdinand Thiessen ec986d479b Merge pull request #54380 from nextcloud/feat/3rdparty-polyfills
chore: update 3rdparty to include PHP polyfills
2025-08-12 22:55:58 +02:00
Johannes kingma 38f190336f fix: adjust memcache config quote escape
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2025-08-12 21:13:17 +02:00
Ferdinand Thiessen 9e3269d3c4 chore: update 3rdparty to include PHP polyfills
| Production Changes        | From    | To      | Compare                                                                    |
|---------------------------|---------|---------|----------------------------------------------------------------------------|
| symfony/polyfill-ctype    | v1.32.0 | REMOVED |                                                                            |
| symfony/polyfill-mbstring | v1.32.0 | REMOVED |                                                                            |
| symfony/polyfill-php80    | v1.32.0 | REMOVED |                                                                            |
| symfony/polyfill-php83    | v1.31.0 | v1.32.0 | [...](https://github.com/symfony/polyfill-php83/compare/v1.31.0...v1.32.0) |
| symfony/polyfill-php82    | NEW     | v1.32.0 |                                                                            |
| symfony/polyfill-php84    | NEW     | v1.32.0 |                                                                            |

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-12 18:31:11 +02:00
Maxence Lange cb84ccc57d feat(preset): share password protection
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-12 14:37:32 -01:00
John Molakvoæ aaca29bdad Merge pull request #54202 from nextcloud/fix/less-words 2025-08-12 17:16:18 +02:00
nextcloud-command 98d37090f4 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-12 13:59:29 +00:00
rakekniven 17b4deb800 fix: Update tests
Signed-off-by: rakekniven <2069590+rakekniven@users.noreply.github.com>
2025-08-12 15:48:22 +02:00
kramo c5d1f2f9ff fix(l10n): Less jargon in source strings
This removes:
- “enable” for settings
- “settings” for settings sections
- “all” when there is no obvious subset of items
- “show” and “open” for navigation actions
- “changes” for applying/discarding
- “to clipboard” when copying
- Explaining things that cannot happen
- Explaining things twice, right below each other
- Unnecessary technical jargon
- Text that sounds like marketing copy and serves no other purpose

Signed-off-by: kramo <git@kramo.page>
2025-08-12 14:37:34 +02:00
Richard Steinmetz b4302fe57c Merge pull request #54371 from nextcloud/fix-getting-trusted-server-other-than-the-first
fix: Fix getting trusted server other than the first
2025-08-12 13:25:55 +02:00
John Molakvoæ cf0b709ddf Merge pull request #54376 from nextcloud/ci/fix-desktop-team 2025-08-12 11:28:16 +02:00
Ferdinand Thiessen a86662705e ci: adjust update desktop version workflow to assign correct team
2 of 3 persons that were assigned are not working in that area anymore.
So just assign the team.
Moreover the date was wrong as the file was created 2025.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-12 10:53:22 +02:00
Daniel Calviño Sánchez b42d125950 fix: Fix getting trusted server other than the first
"array_filter" preserves the keys, so after the trusted servers were
filtered "$server[0]" existed only if the server to get was the first
one in the original array.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2025-08-12 06:47:51 +02:00
Nextcloud bot 2427b864ec fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-12 00:12:12 +00:00
Josh de39c5122c chore: drop unused ocs/providers.php
This appears to have been originally intended to support the providers list functionality mentioned in the OCS <=v1.7 spec. That is, appears to be an implementation of what was suggested be made available at `https://domain.tld/ocs/providers.xml`.

However best as I can tell it never worked. It also doesn't appear in the v2.0 spec drafts.


Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-11 18:20:19 -04:00
John Molakvoæ 43f6f9b25c Merge pull request #54353 from nextcloud/automated/noid/-update-min-supported-desktop-version 2025-08-11 21:54:30 +02:00
John Molakvoæ 6309931feb Merge pull request #54367 from nextcloud/patch-1 2025-08-11 21:11:02 +02:00
F. E Noel Nfebe 49e35f111c Merge pull request #54310 from nextcloud/fix/conditional-federation-placeholders
fix(files_sharing): Implementation conditional federation placeholder
2025-08-11 19:21:43 +01:00
nextcloud-command e54f990757 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 18:16:07 +00:00
Atemu d69e8923fe fix(core): search f keycode
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2025-08-11 18:14:05 +00:00
Andy Scherzinger 65f8de6d94 Merge pull request #54354 from nextcloud/fix/codeowners
chore(CODEOWNERS): ensure every file change has at least 2 reviewers
2025-08-11 20:03:30 +02:00
nextcloud-command dd882127ab chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 18:00:00 +00:00
nfebe e7f4de6296 fix(files_sharing): Implementation conditional federation placeholder
This commits addresses an annoyance where the share input placeholder would
suggest sharing via federated cloud ID even if federation was disabled.

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2025-08-11 18:54:56 +01:00
Ferdinand Thiessen 2e7ac880bb Merge pull request #54360 from nextcloud/fix/display-shares-as-internal
fix(files_sharing): show shares to remote as internal if configured so
2025-08-11 18:05:38 +02:00
nextcloud-command 6001eba392 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 15:20:32 +00:00
Ferdinand Thiessen 5cbfe61b18 fix(files_sharing): show shares to remote as internal if configured so
- if this is a GS instance
- or was configured by administrator

Then show the share as internal (remote and remote group shares).

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-11 15:18:29 +00:00
Ferdinand Thiessen c60cc977b4 Merge pull request #54345 from nextcloud/dependabot/npm_and_yarn/nextcloud/initial-state-3.0.0
chore(deps): bump @nextcloud/initial-state from 2.2.0 to 3.0.0
2025-08-11 17:15:31 +02:00
nextcloud-command 38f0ca875a chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 17:01:32 +02:00
Ferdinand Thiessen 9ad5214fce test(files): adjust mocking initial state for updated library
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-11 17:01:32 +02:00
dependabot[bot] 4d1051891e chore(deps): bump @nextcloud/initial-state from 2.2.0 to 3.0.0
Bumps [@nextcloud/initial-state](https://github.com/nextcloud-libraries/nextcloud-initial-state) from 2.2.0 to 3.0.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-initial-state/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-initial-state/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-initial-state/compare/v2.2.0...v3.0.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/initial-state"
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-11 16:13:04 +02:00
Robin Appelman 615c6916e1 Merge pull request #54200 from nextcloud/test-disable-autoload-apps
test: add env option to disable loading all installed apps during tests
2025-08-11 15:43:49 +02:00
John Molakvoæ 7fb59a4493 Merge pull request #54356 from nextcloud/fix/ai-apps 2025-08-11 15:35:50 +02:00
Robin Appelman 106ac1b123 Merge pull request #54357 from nextcloud/displayname-cache-duration
fix: increase how long we cache display names
2025-08-11 14:21:31 +02:00
nextcloud-command 75ecce0b4c chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 11:50:52 +00:00
skjnldsv 23c5856b39 fix(settings): add missing AI icon
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2025-08-11 11:46:12 +00:00
Robin Appelman 06be851b1f test: add env option to disable loading all installed apps during tests
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-11 13:35:57 +02:00
dependabot[bot] d9bd75bae9 Merge pull request #54343 from nextcloud/dependabot/npm_and_yarn/zip.js/zip.js-2.7.72 2025-08-11 11:14:15 +00:00
dependabot[bot] f0085789e6 Merge pull request #54342 from nextcloud/dependabot/npm_and_yarn/core-js-3.45.0 2025-08-11 10:55:14 +00:00
nextcloud-command 05c90f5c46 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 10:39:16 +00:00
dependabot[bot] 9603805779 Merge pull request #54344 from nextcloud/dependabot/npm_and_yarn/stylelint-16.23.1 2025-08-11 10:37:41 +00:00
dependabot[bot] 0e3d986bca chore(deps): bump core-js from 3.44.0 to 3.45.0
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.44.0 to 3.45.0.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.45.0/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-version: 3.45.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-11 12:30:47 +02:00
dependabot[bot] 5f1f95e2a6 chore(deps-dev): bump stylelint from 16.23.0 to 16.23.1
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.23.0 to 16.23.1.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.23.0...16.23.1)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 16.23.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-11 10:24:35 +00:00
Ferdinand Thiessen 52665f5b62 Merge pull request #54294 from nextcloud/feat/show-gs-users-like-internal
feat(files_sharing): show GS users similar to internal users
2025-08-11 12:21:06 +02:00
dependabot[bot] 9330bc3200 Merge pull request #54346 from nextcloud/dependabot/npm_and_yarn/sass-1.90.0 2025-08-11 10:20:43 +00:00
dependabot[bot] 73d7dde5e2 Merge pull request #54341 from nextcloud/dependabot/npm_and_yarn/puppeteer-24.16.0 2025-08-11 09:46:39 +00:00
Robin Appelman 21c7ae62e0 Merge pull request #53528 from nextcloud/jtr-maint-refresh-part-1
fix(maintenance): refresh page when turned off (sometimes)
2025-08-11 11:44:35 +02:00
dependabot[bot] f3824f7d2c chore(deps-dev): bump sass from 1.89.2 to 1.90.0
Bumps [sass](https://github.com/sass/dart-sass) from 1.89.2 to 1.90.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.89.2...1.90.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-version: 1.90.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-11 11:42:55 +02:00
Ferdinand Thiessen f5c90b2f3d Merge pull request #54340 from nextcloud/fix/ai-settings
feat(settings): Improve AI settings task list and rename to Assistant
2025-08-11 11:33:34 +02:00
nextcloud-command a25af74028 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-11 09:20:10 +00:00
Robin Appelman 8350fea770 fix: increase how long we cache display names
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-11 11:20:05 +02:00
Ferdinand Thiessen ae5d57371a feat(files_sharing): show GS users similar to internal users
- resolves: https://github.com/nextcloud/server/issues/52497

Ensure that when global scale is enabled the federated users are shown
just like internal users.
Meaning no server part but instead use the email address like with internal.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-11 09:18:16 +00:00
Ferdinand Thiessen 109cd123fe Merge pull request #54347 from nextcloud/dependabot/npm_and_yarn/cypress/webpack-preprocessor-7.0.0
chore(deps-dev): bump @cypress/webpack-preprocessor from 6.0.4 to 7.0.0
2025-08-11 10:45:09 +02:00
John Molakvoæ a5139f93eb Merge pull request #54337 from nextcloud/fix/legacyView 2025-08-11 10:22:17 +02:00
Ferdinand Thiessen 7165e54b4e chore(CODEOWNERS): ensure every file change has at least 2 reviewers
For proper review every PR needs 2 reviews, so every file needs at least
2 codeowners. Thus @blizzz is added for `workflowengine` as the app
maintainer.

Additionally added the desktop client team for changes related to them.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-11 10:09:16 +02:00
Misha M.-Kupriyanov 55f55984f0 test(SearchComposerTest): add unit test for getProviders with mixed order values
Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
Misha M.-Kupriyanov d0341bb323 test(SearchComposerTest): add unit tests for getProviders with allowed providers restriction and empty configuration
Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
Misha M.-Kupriyanov 9dfc0b1b23 test(SearchComposerTest): add test for provider icon generation
Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
Misha M.-Kupriyanov 32d263e363 test(SearchComposerTest): add unit test for getProviders with multiple providers
Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
Misha M.-Kupriyanov d08fe6d6b3 test(SearchComposerTest): add test for handling unknown search provider
Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
Misha M.-Kupriyanov 75770a00dd test(SearchComposerTest): add unit tests for SearchComposer
Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
Misha M.-Kupriyanov 69c51bb163 fix(search): Fix SearchComposer.php filtering logic
keep the $this->providers types

Test via ./occ config:app:set --value '["files","settings"]' --type array core unified_search.providers_allowed

should be part of 8e570041

Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-08-11 09:42:56 +02:00
nextcloud-command f5a5b005b6 chore: Update minimum supported desktop version
Signed-off-by: GitHub <noreply@github.com>
2025-08-11 00:34:04 +00:00
Nextcloud bot de4a35b202 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-11 00:12:44 +00:00
nextcloud-command 9ce1066bc8 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-10 17:47:53 +00:00
skjnldsv c1003692f0 fix(files): drop usage of FileInfoModel
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2025-08-10 17:43:55 +00:00
Nextcloud bot b60a8ddc24 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-10 00:12:02 +00:00
Joas Schilling 44b4741384 Merge pull request #54339 from nextcloud/techdebt/noid/reduce-deprecation-spam-2
fix(container): Reduce general deprecation spam on all requests
2025-08-09 12:11:47 +02:00
Joas Schilling 57f09b642e fix(container): Reduce general deprecation spam on all requests
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-08-09 11:53:30 +02:00
dependabot[bot] 50ee26424d chore(deps-dev): bump @cypress/webpack-preprocessor from 6.0.4 to 7.0.0
Bumps [@cypress/webpack-preprocessor](https://github.com/cypress-io/cypress) from 6.0.4 to 7.0.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/@cypress/webpack-preprocessor-v6.0.4...@cypress/webpack-preprocessor-v7.0.0)

---
updated-dependencies:
- dependency-name: "@cypress/webpack-preprocessor"
  dependency-version: 7.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 02:00:39 +00:00
dependabot[bot] 1f64ed9104 chore(deps-dev): bump @zip.js/zip.js from 2.7.71 to 2.7.72
Bumps [@zip.js/zip.js](https://github.com/gildas-lormeau/zip.js) from 2.7.71 to 2.7.72.
- [Release notes](https://github.com/gildas-lormeau/zip.js/releases)
- [Commits](https://github.com/gildas-lormeau/zip.js/compare/v2.7.71...v2.7.72)

---
updated-dependencies:
- dependency-name: "@zip.js/zip.js"
  dependency-version: 2.7.72
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 01:58:06 +00:00
dependabot[bot] 51d72dc4e3 chore(deps-dev): bump puppeteer from 24.15.0 to 24.16.0
Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 24.15.0 to 24.16.0.
- [Release notes](https://github.com/puppeteer/puppeteer/releases)
- [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.15.0...puppeteer-v24.16.0)

---
updated-dependencies:
- dependency-name: puppeteer
  dependency-version: 24.16.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 01:57:10 +00:00
Nextcloud bot b8c6eb82ca fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-09 00:12:21 +00:00
nextcloud-command cb7669d72a chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-08 18:31:48 +00:00
Lukas Schaefer 375369cf68 feat(settings): More condensed task list
Signed-off-by: Lukas Schaefer <lukas@lschaefer.xyz>
2025-08-08 14:25:46 -04:00
Lukas Schaefer 1ae4764073 chore(settings): Rename ai settings to assistant
Signed-off-by: Lukas Schaefer <lukas@lschaefer.xyz>
2025-08-08 13:54:08 -04:00
Maxence Lange eaae5e16d8 Merge pull request #54158 from nextcloud/feat/preset/profile-visibility+presetmanager
feat(preset): profile visibility
2025-08-08 11:21:16 -01:00
Maxence Lange bbc9ed138c fix(config): fix tests+psalm
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-08 11:00:49 -01:00
Maxence Lange a4b9edc8eb feat(preset): Profile Visibility
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-08 10:58:59 -01:00
Maxence Lange f32d865716 fix(lexicon): only filter out null default
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-08 10:58:58 -01:00
Maxence Lange 33c4fe504d feat(preset): new PresetManager
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
2025-08-08 10:58:58 -01:00
Benjamin Gaussorgues 8783679a49 Merge pull request #54303 from nextcloud/jtr-oc-appframework-app-cleanup 2025-08-08 10:41:51 +02:00
John Molakvoæ 7328754eb4 Merge pull request #54312 from nextcloud/fix/smarter-loadmore-unified-search 2025-08-08 10:38:15 +02:00
John Molakvoæ 93296c2679 Merge pull request #54069 from nextcloud/feature/51791/add-bsky-option-to-accounts 2025-08-08 10:32:03 +02:00
nextcloud-command 16f80a8d47 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-08 08:09:23 +00:00
nextcloud-command e53ad663f1 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-08 08:08:47 +00:00
nfebe 7fbf997420 fix(unified-search): Smarter load more button
This commit introduces a change to prevent showing the load more button,
if the length of existing results is not equal to the requested limit (which implies
it is less than because we never expect it to be more)

Additionally, there is an enhancment to override provider filders passed to the find method.
This would improve speed.

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2025-08-08 08:07:26 +00:00
yemkareems 1b4e967604 fix: fontawesome license text added and vue file linting errors fixed
Signed-off-by: yemkareems <yemkareems@gmail.com>
2025-08-08 08:06:46 +00:00
yemkareems 4c887ec12b fix: eslint errors fixed in vue file, IAccountManager since added, bluesky svg added to REUSE.toml file
Signed-off-by: yemkareems <yemkareems@gmail.com>
2025-08-08 08:06:46 +00:00
Ferdinand Thiessen d31be348af chore: add deprecated IAccountManager::PROPERTY_TWITTER to psalm baseline
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-08-08 08:06:45 +00:00
Ferdinand Thiessen d36602acd5 chore: update openapi and autoloaders
Co-authored-by: Ferdinand Thiessen <opensource@fthiessen.de>
Signed-off-by: yemkareems <yemkareems@gmail.com>
2025-08-08 08:06:45 +00:00
yemkareems aa227f1c55 feat: add bluesky to accounts, show the same in profile edit and visibility option, in view profile and also in sharing tab
Signed-off-by: yemkareems <yemkareems@gmail.com>
2025-08-08 08:06:45 +00:00
John Molakvoæ 3dac5b33ee Merge pull request #54282 from nextcloud/techdebt/noid/reduce-deprecation-spam 2025-08-08 10:04:22 +02:00
Joas Schilling 5eeda5fcad Merge pull request #54228 from nextcloud/pulsejet/db-check-maria
feat(db): add method to test mariadb
2025-08-08 08:43:22 +02:00
Joas Schilling 2f18996347 fix(container): Don't use deprecated things to set up controllers for apps
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-08-08 08:42:56 +02:00
Joas Schilling 17c40b9474 fix(container): Log the deprecation to the app when possible
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-08-08 08:42:55 +02:00
John Molakvoæ 117d8dea0a Merge pull request #54328 from nextcloud/jtr-refactor-files-external-oauth1
refactor(files_external): Drop unused oauth1 code
2025-08-08 08:22:14 +02:00
Varun Patil 5ecd3c4b49 feat(database): Add option to test for mariadb
There are some behavioral differences that apps may need to check for.
See discussion on #51175 for more info.

This preserves the existing behavior of getDatabaseProvider()

Signed-off-by: Varun Patil <varunpatil@ucla.edu>
2025-08-08 07:50:51 +02:00
Josh 9c4aaeff75 chore(files_external): update autoload_static
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 22:41:18 -04:00
Josh 1121ae0838 chore(files_external): update autoload_classmap
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 22:40:35 -04:00
Josh af53e9ca06 chore(files_external): Remove oauth1 constant
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 22:25:51 -04:00
Josh 2b21913015 refactor(files_external): Drop oauth1 auth mechanism registration
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 22:23:25 -04:00
Josh e37bc0b580 refactor(files_external): Remove oauth1 route
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 22:21:18 -04:00
Josh 57c62e1ca1 refactor(files_external): Drop OAuth1.php
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 21:54:33 -04:00
Josh e87bfbe278 refactor(files_external): Drop unused oauth1.js
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-07 21:52:46 -04:00
Nextcloud bot 1518ded8b1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-08 00:12:32 +00:00
Josh 2a96042db1 Merge pull request #54260 from nextcloud/fix/less-useless-toasts
fix: Remove redundant toast notifications
2025-08-07 17:08:07 -04:00
nextcloud-command da3a4c6a12 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-08-07 20:35:56 +00:00
kramo 718cf4e15d fix: Remove redundant toast notifications
Since these actions already have highly visible visual confirmation,
no extra notifications are needed.

Split out from #54202

Signed-off-by: kramo <git@kramo.page>
2025-08-07 20:33:55 +00:00
Robin Appelman 4da6081786 feat: add table filter to schema:export and schema:expected
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-08-07 19:09:07 +02:00
Julien Veyssier aa2ca86fb3 feat(taskprocessing): avoid generator cascade
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:22 +02:00
Julien Veyssier e2c65b2493 feat(taskprocessing): fix mistake
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:22 +02:00
Julien Veyssier 222b19b805 feat(taskprocessing): rename cleanup column to allow_cleanup
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:22 +02:00
Julien Veyssier 2b9af820bd feat(taskprocessing): add strict types to all taskprocessing command classes
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:22 +02:00
Julien Veyssier 0dc93bc320 feat(taskprocessing): fix phpunit tests
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:22 +02:00
Julien Veyssier 10921c05b7 feat(taskprocessing): fix some CI
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:21 +02:00
Julien Veyssier cc295f2452 feat(taskprocessing): use Generator::getReturn to get the list of deleted tasks in the cleanup command
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:21 +02:00
Julien Veyssier 19801f7ec4 feat(taskprocessing): move cleanup method to private taskprocessing manager, use it in the cleanup bg job and implement a cleanup command
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:21 +02:00
Julien Veyssier e6adbd921e feat(taskprocessing): generate OpenAPI specs, fix lint issue, fix tests
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:21 +02:00
Julien Veyssier 8c52b6c0fe feat(taskprocessing): add cleanup flag to tasks to decide if they should be cleaned up automatically
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-08-07 15:12:21 +02:00
Josh 67c14b0f11 refactor(App): \OC\AppFramework\App clean-up
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-08-06 17:10:45 -04:00
Richard Steinmetz 0bd5128d45 perf: join array_merge calls in MountProvider::getMountsForUser()
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-08-04 08:18:12 +02:00
Josh 54142b2b20 fix(maintenanceMode): Refresh web page when turned off (part 1)
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-06-16 15:41:59 -04:00
1634 changed files with 19188 additions and 13058 deletions
+14 -12
View File
@@ -9,6 +9,7 @@
# this will override the backend code owners if needed
/__mocks__ @nextcloud/server-frontend
/__tests__ @nextcloud/server-frontend
/dist @nextcloud/server-frontend
/cypress @nextcloud/server-frontend
**/css @nextcloud/server-frontend
**/js @nextcloud/server-frontend
@@ -19,7 +20,6 @@
# dependency management
package.json @nextcloud/server-dependabot @nextcloud/server-frontend
package-lock.json @nextcloud/server-dependabot
/dist @nextcloud/server-dependabot
# App maintainers
/apps/admin_audit/appinfo/info.xml @luka-nextcloud @blizzz
@@ -56,7 +56,7 @@ package-lock.json @nextcloud/server-dependabot
/apps/webhook_listeners/appinfo/info.xml @come-nc @julien-nc
/apps/workflowengine/appinfo/info.xml @blizzz @juliusknorr
# Frontend expertise
# Files frontend expertise
/apps/files/src* @skjnldsv @nextcloud/server-frontend
/apps/files_external/src* @skjnldsv @nextcloud/server-frontend
/apps/files_reminders/src* @skjnldsv @nextcloud/server-frontend
@@ -91,17 +91,19 @@ ResponseDefinitions.php @provokateurin @nextcloud/server-backend
/lib/public/OCM @nickvergessen @nextcloud/talk-backend @nextcloud/server-backend
/lib/public/Talk @nickvergessen @nextcloud/talk-backend
/lib/public/UserStatus @nickvergessen @nextcloud/talk-backend
*/Notifications/* @nickvergessen @nextcloud/talk-backend
# Groupware
/build/integration/dav_features/caldav.feature @st3iny @SebastianKrupinski @tcitworld
/build/integration/dav_features/carddav.feature @hamza221 @SebastianKrupinski
/lib/private/Calendar @st3iny @SebastianKrupinski @tcitworld
/lib/private/Contacts @hamza221 @SebastianKrupinski
/lib/public/Calendar @st3iny @SebastianKrupinski @tcitworld
/lib/public/Contacts @hamza221 @SebastianKrupinski
# Groupware team
/build/integration/dav_features/caldav.feature @st3iny @SebastianKrupinski @tcitworld
/build/integration/dav_features/carddav.feature @hamza221 @SebastianKrupinski
/lib/private/Calendar @st3iny @SebastianKrupinski @tcitworld
/lib/private/Contacts @hamza221 @SebastianKrupinski
/lib/public/Calendar @st3iny @SebastianKrupinski @tcitworld
/lib/public/Contacts @hamza221 @SebastianKrupinski
# Desktop client teamn
/apps/dav/lib/Connector/Sabre/BlockLegacyClientPlugin.php @nextcloud/desktop
# Personal interest
*/Activity/* @nickvergessen @nextcloud/server-backend
*/Notifications/* @nickvergessen @nextcloud/talk-backend
/apps/workflowengine/lib @nickvergessen
/apps/workflowengine/lib @nickvergessen @blizzz
@@ -1,5 +1,6 @@
# SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT
name: Update min supported desktop version
on:
@@ -124,4 +125,4 @@ jobs:
client: 💻 desktop
automated
3. to review
reviewers: tobiasKaminsky, camilasan, claucambra
reviewers: '@nextcloud/desktop'
+7 -1
View File
@@ -282,7 +282,7 @@ SPDX-License-Identifier = "OFL-1.1"
[[annotations]]
path = "apps/settings/img/ai.svg"
precedence = "aggregate"
SPDX-FileCopyrightText = "2019 GreenTurtwig <https://pictogrammers.com/contributor/GreenTurtwig/>"
SPDX-FileCopyrightText = "2018-2024 Google LLC"
SPDX-License-Identifier = "Apache-2.0"
[[annotations]]
@@ -333,6 +333,12 @@ precedence = "aggregate"
SPDX-FileCopyrightText = "X Corp."
SPDX-License-Identifier = "LicenseRef-XTrademarks"
[[annotations]]
path = ["core/img/bluesky.svg", "core/img/actions/bluesky.svg"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2012-2024 Fonticons, Inc."
SPDX-License-Identifier = "CC-BY-4.0"
[[annotations]]
path = ["core/img/facebook.svg", "apps/federatedfilesharing/img/social-facebook.svg"]
precedence = "aggregate"
+21
View File
@@ -0,0 +1,21 @@
OC.L10N.register(
"dashboard",
{
"Dashboard" : "Панэль кіравання",
"Dashboard app" : "Праграма Панэль кіравання",
"Weather" : "Надвор'е",
"Status" : "Стан",
"Good morning" : "Добрай раніцы",
"Good morning, {name}" : "Добрай раніцы, {name}",
"Good afternoon" : "Добры дзень",
"Good afternoon, {name}" : "Добры дзень, {name}",
"Good evening" : "Добры вечар",
"Good evening, {name}" : "Добры вечар, {name}",
"Hello" : "Вітаем",
"Hello, {name}" : "Вітаем, {name}",
"Happy birthday 🥳🤩🎂🎉" : "З народзінамі 🥳🤩🎂🎉",
"Happy birthday, {name} 🥳🤩🎂🎉" : "З народзінамі, {name} 🥳🤩🎂🎉",
"Customize" : "Дапасаваць",
"Edit widgets" : "Рэдагаваць віджэты"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
+19
View File
@@ -0,0 +1,19 @@
{ "translations": {
"Dashboard" : "Панэль кіравання",
"Dashboard app" : "Праграма Панэль кіравання",
"Weather" : "Надвор'е",
"Status" : "Стан",
"Good morning" : "Добрай раніцы",
"Good morning, {name}" : "Добрай раніцы, {name}",
"Good afternoon" : "Добры дзень",
"Good afternoon, {name}" : "Добры дзень, {name}",
"Good evening" : "Добры вечар",
"Good evening, {name}" : "Добры вечар, {name}",
"Hello" : "Вітаем",
"Hello, {name}" : "Вітаем, {name}",
"Happy birthday 🥳🤩🎂🎉" : "З народзінамі 🥳🤩🎂🎉",
"Happy birthday, {name} 🥳🤩🎂🎉" : "З народзінамі, {name} 🥳🤩🎂🎉",
"Customize" : "Дапасаваць",
"Edit widgets" : "Рэдагаваць віджэты"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
}
+1 -1
View File
@@ -10,7 +10,7 @@
<name>WebDAV</name>
<summary>WebDAV endpoint</summary>
<description>WebDAV endpoint</description>
<version>1.34.0</version>
<version>1.34.1</version>
<licence>agpl</licence>
<author>owncloud.org</author>
<namespace>DAV</namespace>
@@ -216,6 +216,8 @@ return array(
'OCA\\DAV\\Connector\\Sabre\\Node' => $baseDir . '/../lib/Connector/Sabre/Node.php',
'OCA\\DAV\\Connector\\Sabre\\ObjectTree' => $baseDir . '/../lib/Connector/Sabre/ObjectTree.php',
'OCA\\DAV\\Connector\\Sabre\\Principal' => $baseDir . '/../lib/Connector/Sabre/Principal.php',
'OCA\\DAV\\Connector\\Sabre\\PropFindMonitorPlugin' => $baseDir . '/../lib/Connector/Sabre/PropFindMonitorPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\PropFindPreloadNotifyPlugin' => $baseDir . '/../lib/Connector/Sabre/PropFindPreloadNotifyPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\PropfindCompressionPlugin' => $baseDir . '/../lib/Connector/Sabre/PropfindCompressionPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\PublicAuth' => $baseDir . '/../lib/Connector/Sabre/PublicAuth.php',
'OCA\\DAV\\Connector\\Sabre\\QuotaPlugin' => $baseDir . '/../lib/Connector/Sabre/QuotaPlugin.php',
@@ -353,6 +355,7 @@ return array(
'OCA\\DAV\\Migration\\Version1029Date20231004091403' => $baseDir . '/../lib/Migration/Version1029Date20231004091403.php',
'OCA\\DAV\\Migration\\Version1030Date20240205103243' => $baseDir . '/../lib/Migration/Version1030Date20240205103243.php',
'OCA\\DAV\\Migration\\Version1031Date20240610134258' => $baseDir . '/../lib/Migration/Version1031Date20240610134258.php',
'OCA\\DAV\\Migration\\Version1034Date20250813093701' => $baseDir . '/../lib/Migration/Version1034Date20250813093701.php',
'OCA\\DAV\\Model\\ExampleEvent' => $baseDir . '/../lib/Model/ExampleEvent.php',
'OCA\\DAV\\Paginate\\LimitedCopyIterator' => $baseDir . '/../lib/Paginate/LimitedCopyIterator.php',
'OCA\\DAV\\Paginate\\PaginateCache' => $baseDir . '/../lib/Paginate/PaginateCache.php',
@@ -231,6 +231,8 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Connector\\Sabre\\Node' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Node.php',
'OCA\\DAV\\Connector\\Sabre\\ObjectTree' => __DIR__ . '/..' . '/../lib/Connector/Sabre/ObjectTree.php',
'OCA\\DAV\\Connector\\Sabre\\Principal' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Principal.php',
'OCA\\DAV\\Connector\\Sabre\\PropFindMonitorPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropFindMonitorPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\PropFindPreloadNotifyPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropFindPreloadNotifyPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\PropfindCompressionPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropfindCompressionPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\PublicAuth' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PublicAuth.php',
'OCA\\DAV\\Connector\\Sabre\\QuotaPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/QuotaPlugin.php',
@@ -368,6 +370,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Migration\\Version1029Date20231004091403' => __DIR__ . '/..' . '/../lib/Migration/Version1029Date20231004091403.php',
'OCA\\DAV\\Migration\\Version1030Date20240205103243' => __DIR__ . '/..' . '/../lib/Migration/Version1030Date20240205103243.php',
'OCA\\DAV\\Migration\\Version1031Date20240610134258' => __DIR__ . '/..' . '/../lib/Migration/Version1031Date20240610134258.php',
'OCA\\DAV\\Migration\\Version1034Date20250813093701' => __DIR__ . '/..' . '/../lib/Migration/Version1034Date20250813093701.php',
'OCA\\DAV\\Model\\ExampleEvent' => __DIR__ . '/..' . '/../lib/Model/ExampleEvent.php',
'OCA\\DAV\\Paginate\\LimitedCopyIterator' => __DIR__ . '/..' . '/../lib/Paginate/LimitedCopyIterator.php',
'OCA\\DAV\\Paginate\\PaginateCache' => __DIR__ . '/..' . '/../lib/Paginate/PaginateCache.php',
+2 -2
View File
@@ -281,7 +281,6 @@ OC.L10N.register(
"Failed to load availability" : "فشل في تحميل أوقات التواجد",
"Saved availability" : "تمّ حفظ أوقات التواجد",
"Failed to save availability" : "تعذّر حفظ أوقات التواجد",
"Time zone:" : "منطقة زمنية:",
"to" : "إلى",
"Delete slot" : "حذف الخانة الزمنية",
"No working hours set" : "لم يتم تحديد ساعات العمل",
@@ -321,6 +320,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "يرجى الاتصال بالمنظم مباشرةً",
"Are you accepting the invitation?" : "هل تقبل الدعوة؟",
"Tentative" : "مبدئي",
"Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ"
"Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ",
"Time zone:" : "منطقة زمنية:"
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
+2 -2
View File
@@ -279,7 +279,6 @@
"Failed to load availability" : "فشل في تحميل أوقات التواجد",
"Saved availability" : "تمّ حفظ أوقات التواجد",
"Failed to save availability" : "تعذّر حفظ أوقات التواجد",
"Time zone:" : "منطقة زمنية:",
"to" : "إلى",
"Delete slot" : "حذف الخانة الزمنية",
"No working hours set" : "لم يتم تحديد ساعات العمل",
@@ -319,6 +318,7 @@
"Please contact the organizer directly." : "يرجى الاتصال بالمنظم مباشرةً",
"Are you accepting the invitation?" : "هل تقبل الدعوة؟",
"Tentative" : "مبدئي",
"Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ"
"Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ",
"Time zone:" : "منطقة زمنية:"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
}
+2 -2
View File
@@ -186,7 +186,6 @@ OC.L10N.register(
"Failed to load availability" : "Nun se pue cargar la disponibilidá",
"Saved availability" : "Disponibilidá guardada",
"Failed to save availability" : "Nun se pue guardar la disponibilidá",
"Time zone:" : "Fusu horariu:",
"to" : "pa",
"Delete slot" : "Desaniciar la ralura",
"No working hours set" : "Nun s'afitó nenguna hora llaboral",
@@ -219,6 +218,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Ponte en contautu direutamente cola organización.",
"Are you accepting the invitation?" : "¿Aceptes la invitación?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "La to asistencia anovóse correutamente."
"Your attendance was updated successfully." : "La to asistencia anovóse correutamente.",
"Time zone:" : "Fusu horariu:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -184,7 +184,6 @@
"Failed to load availability" : "Nun se pue cargar la disponibilidá",
"Saved availability" : "Disponibilidá guardada",
"Failed to save availability" : "Nun se pue guardar la disponibilidá",
"Time zone:" : "Fusu horariu:",
"to" : "pa",
"Delete slot" : "Desaniciar la ralura",
"No working hours set" : "Nun s'afitó nenguna hora llaboral",
@@ -217,6 +216,7 @@
"Please contact the organizer directly." : "Ponte en contautu direutamente cola organización.",
"Are you accepting the invitation?" : "¿Aceptes la invitación?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "La to asistencia anovóse correutamente."
"Your attendance was updated successfully." : "La to asistencia anovóse correutamente.",
"Time zone:" : "Fusu horariu:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -182,7 +182,6 @@ OC.L10N.register(
"Failed to load availability" : "Неуспешно зареждане на наличност",
"Saved availability" : "Запазена наличност",
"Failed to save availability" : "Неуспешно записване на наличност",
"Time zone:" : "Часова зона",
"to" : "до",
"Delete slot" : "Изтриване на слот",
"No working hours set" : "Няма зададено работно време",
@@ -211,6 +210,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Моля, свържете се директно с организатора.",
"Are you accepting the invitation?" : "Приемате ли поканата?",
"Tentative" : "Несигурно",
"Your attendance was updated successfully." : "Вашето присъствие е актуализирано успешно."
"Your attendance was updated successfully." : "Вашето присъствие е актуализирано успешно.",
"Time zone:" : "Часова зона"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -180,7 +180,6 @@
"Failed to load availability" : "Неуспешно зареждане на наличност",
"Saved availability" : "Запазена наличност",
"Failed to save availability" : "Неуспешно записване на наличност",
"Time zone:" : "Часова зона",
"to" : "до",
"Delete slot" : "Изтриване на слот",
"No working hours set" : "Няма зададено работно време",
@@ -209,6 +208,7 @@
"Please contact the organizer directly." : "Моля, свържете се директно с организатора.",
"Are you accepting the invitation?" : "Приемате ли поканата?",
"Tentative" : "Несигурно",
"Your attendance was updated successfully." : "Вашето присъствие е актуализирано успешно."
"Your attendance was updated successfully." : "Вашето присъствие е актуализирано успешно.",
"Time zone:" : "Часова зона"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -281,7 +281,6 @@ OC.L10N.register(
"Failed to load availability" : "No s'ha pogut carregar la disponibilitat",
"Saved availability" : "S'ha desat la disponibilitat",
"Failed to save availability" : "No s'ha pogut desar la disponibilitat",
"Time zone:" : "Fus horari:",
"to" : "a",
"Delete slot" : "Suprimeix la franja",
"No working hours set" : "No s'ha definit cap horari laboral",
@@ -314,6 +313,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Contacteu amb l'organització directament.",
"Are you accepting the invitation?" : "Accepteu la invitació?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "S'ha actualitzat correctament l'assistència."
"Your attendance was updated successfully." : "S'ha actualitzat correctament l'assistència.",
"Time zone:" : "Fus horari:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -279,7 +279,6 @@
"Failed to load availability" : "No s'ha pogut carregar la disponibilitat",
"Saved availability" : "S'ha desat la disponibilitat",
"Failed to save availability" : "No s'ha pogut desar la disponibilitat",
"Time zone:" : "Fus horari:",
"to" : "a",
"Delete slot" : "Suprimeix la franja",
"No working hours set" : "No s'ha definit cap horari laboral",
@@ -312,6 +311,7 @@
"Please contact the organizer directly." : "Contacteu amb l'organització directament.",
"Are you accepting the invitation?" : "Accepteu la invitació?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "S'ha actualitzat correctament l'assistència."
"Your attendance was updated successfully." : "S'ha actualitzat correctament l'assistència.",
"Time zone:" : "Fus horari:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -282,7 +282,6 @@ OC.L10N.register(
"Failed to load availability" : "Nepodařilo se načíst dostupnost",
"Saved availability" : "Uložena dostupnost",
"Failed to save availability" : "Nepodařilo se uložit dostupnost",
"Time zone:" : "Časové pásmo:",
"to" : "do",
"Delete slot" : "Smazat slot",
"No working hours set" : "Nenastaveny pracovní hodiny",
@@ -332,6 +331,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Kontaktujte organizátora přímo.",
"Are you accepting the invitation?" : "Přijímáte pozvání?",
"Tentative" : "Nezávazně",
"Your attendance was updated successfully." : "Vaše účast byla úspěšně aktualizována."
"Your attendance was updated successfully." : "Vaše účast byla úspěšně aktualizována.",
"Time zone:" : "Časové pásmo:"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
+2 -2
View File
@@ -280,7 +280,6 @@
"Failed to load availability" : "Nepodařilo se načíst dostupnost",
"Saved availability" : "Uložena dostupnost",
"Failed to save availability" : "Nepodařilo se uložit dostupnost",
"Time zone:" : "Časové pásmo:",
"to" : "do",
"Delete slot" : "Smazat slot",
"No working hours set" : "Nenastaveny pracovní hodiny",
@@ -330,6 +329,7 @@
"Please contact the organizer directly." : "Kontaktujte organizátora přímo.",
"Are you accepting the invitation?" : "Přijímáte pozvání?",
"Tentative" : "Nezávazně",
"Your attendance was updated successfully." : "Vaše účast byla úspěšně aktualizována."
"Your attendance was updated successfully." : "Vaše účast byla úspěšně aktualizována.",
"Time zone:" : "Časové pásmo:"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
}
+2 -2
View File
@@ -281,7 +281,6 @@ OC.L10N.register(
"Failed to load availability" : "Kunne ikke indlæse tilgængelighed",
"Saved availability" : "Gemt tilgængelighed",
"Failed to save availability" : "Kunne ikke gemme tilgængelighed",
"Time zone:" : "Tidszone:",
"to" : "til",
"Delete slot" : "Slet slot",
"No working hours set" : "Arbejdstider er ikke sat",
@@ -321,6 +320,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Kontakt venligst arrangøren direkte.",
"Are you accepting the invitation?" : "Accepter du invitationen?",
"Tentative" : "Foreløbig",
"Your attendance was updated successfully." : "Dit tilstedeværelse blev opdateret."
"Your attendance was updated successfully." : "Dit tilstedeværelse blev opdateret.",
"Time zone:" : "Tidszone:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -279,7 +279,6 @@
"Failed to load availability" : "Kunne ikke indlæse tilgængelighed",
"Saved availability" : "Gemt tilgængelighed",
"Failed to save availability" : "Kunne ikke gemme tilgængelighed",
"Time zone:" : "Tidszone:",
"to" : "til",
"Delete slot" : "Slet slot",
"No working hours set" : "Arbejdstider er ikke sat",
@@ -319,6 +318,7 @@
"Please contact the organizer directly." : "Kontakt venligst arrangøren direkte.",
"Are you accepting the invitation?" : "Accepter du invitationen?",
"Tentative" : "Foreløbig",
"Your attendance was updated successfully." : "Dit tilstedeværelse blev opdateret."
"Your attendance was updated successfully." : "Dit tilstedeværelse blev opdateret.",
"Time zone:" : "Tidszone:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Verfügbarkeit konnte nicht geladen werden",
"Saved availability" : "Verfügbarkeit gespeichert",
"Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden",
"Time zone:" : "Zeitzone:",
"to" : "bis",
"Delete slot" : "Slot löschen",
"No working hours set" : "Keine Arbeitszeiten konfiguriert",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
"Tentative" : "Vorläufig",
"Your attendance was updated successfully." : "Dein Teilnehmerstatus wurde aktualisiert."
"Your attendance was updated successfully." : "Dein Teilnehmerstatus wurde aktualisiert.",
"Time zone:" : "Zeitzone:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Verfügbarkeit konnte nicht geladen werden",
"Saved availability" : "Verfügbarkeit gespeichert",
"Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden",
"Time zone:" : "Zeitzone:",
"to" : "bis",
"Delete slot" : "Slot löschen",
"No working hours set" : "Keine Arbeitszeiten konfiguriert",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
"Tentative" : "Vorläufig",
"Your attendance was updated successfully." : "Dein Teilnehmerstatus wurde aktualisiert."
"Your attendance was updated successfully." : "Dein Teilnehmerstatus wurde aktualisiert.",
"Time zone:" : "Zeitzone:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Verfügbarkeit konnte nicht geladen werden",
"Saved availability" : "Verfügbarkeit gespeichert",
"Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden",
"Time zone:" : "Zeitzone:",
"to" : "bis",
"Delete slot" : "Zeitfenster löschen",
"No working hours set" : "Keine Arbeitszeiten konfiguriert",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
"Tentative" : "Vorläufig",
"Your attendance was updated successfully." : "Ihr Teilnehmerstatus wurde aktualisiert."
"Your attendance was updated successfully." : "Ihr Teilnehmerstatus wurde aktualisiert.",
"Time zone:" : "Zeitzone:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Verfügbarkeit konnte nicht geladen werden",
"Saved availability" : "Verfügbarkeit gespeichert",
"Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden",
"Time zone:" : "Zeitzone:",
"to" : "bis",
"Delete slot" : "Zeitfenster löschen",
"No working hours set" : "Keine Arbeitszeiten konfiguriert",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
"Tentative" : "Vorläufig",
"Your attendance was updated successfully." : "Ihr Teilnehmerstatus wurde aktualisiert."
"Your attendance was updated successfully." : "Ihr Teilnehmerstatus wurde aktualisiert.",
"Time zone:" : "Zeitzone:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Failed to load availability",
"Saved availability" : "Saved availability",
"Failed to save availability" : "Failed to save availability",
"Time zone:" : "Time zone:",
"to" : "to",
"Delete slot" : "Delete slot",
"No working hours set" : "No working hours set",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Please contact the organiser directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
"Tentative" : "Tentative",
"Your attendance was updated successfully." : "Your attendance was updated successfully."
"Your attendance was updated successfully." : "Your attendance was updated successfully.",
"Time zone:" : "Time zone:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Failed to load availability",
"Saved availability" : "Saved availability",
"Failed to save availability" : "Failed to save availability",
"Time zone:" : "Time zone:",
"to" : "to",
"Delete slot" : "Delete slot",
"No working hours set" : "No working hours set",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Please contact the organiser directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
"Tentative" : "Tentative",
"Your attendance was updated successfully." : "Your attendance was updated successfully."
"Your attendance was updated successfully." : "Your attendance was updated successfully.",
"Time zone:" : "Time zone:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "No se ha podido cargar la disponibilidad",
"Saved availability" : "Disponibilidad guardada",
"Failed to save availability" : "No se ha podido guardar la disponibilidad",
"Time zone:" : "Zona horaria:",
"to" : "para",
"Delete slot" : "Eliminar franja de tiempo",
"No working hours set" : "No se han establecido horas laborales",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Por favor, contacta directamente con el organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "Tu asistencia se ha actualizado con éxito."
"Your attendance was updated successfully." : "Tu asistencia se ha actualizado con éxito.",
"Time zone:" : "Zona horaria:"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "No se ha podido cargar la disponibilidad",
"Saved availability" : "Disponibilidad guardada",
"Failed to save availability" : "No se ha podido guardar la disponibilidad",
"Time zone:" : "Zona horaria:",
"to" : "para",
"Delete slot" : "Eliminar franja de tiempo",
"No working hours set" : "No se han establecido horas laborales",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Por favor, contacta directamente con el organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "Tu asistencia se ha actualizado con éxito."
"Your attendance was updated successfully." : "Tu asistencia se ha actualizado con éxito.",
"Time zone:" : "Zona horaria:"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -176,7 +176,6 @@ OC.L10N.register(
"Failed to load availability" : "Error al cargar la disponibilidad",
"Saved availability" : "Disponibilidad guardada",
"Failed to save availability" : "Error al guardar la disponibilidad",
"Time zone:" : "Zona horaria:",
"to" : "para",
"Delete slot" : "Eliminar ranura",
"No working hours set" : "No se han establecido horas de trabajo",
@@ -203,6 +202,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Por favor, contacta directamente al organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
"Tentative" : "Tentativo",
"Your attendance was updated successfully." : "Tu asistencia se actualizó correctamente."
"Your attendance was updated successfully." : "Tu asistencia se actualizó correctamente.",
"Time zone:" : "Zona horaria:"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -174,7 +174,6 @@
"Failed to load availability" : "Error al cargar la disponibilidad",
"Saved availability" : "Disponibilidad guardada",
"Failed to save availability" : "Error al guardar la disponibilidad",
"Time zone:" : "Zona horaria:",
"to" : "para",
"Delete slot" : "Eliminar ranura",
"No working hours set" : "No se han establecido horas de trabajo",
@@ -201,6 +200,7 @@
"Please contact the organizer directly." : "Por favor, contacta directamente al organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
"Tentative" : "Tentativo",
"Your attendance was updated successfully." : "Tu asistencia se actualizó correctamente."
"Your attendance was updated successfully." : "Tu asistencia se actualizó correctamente.",
"Time zone:" : "Zona horaria:"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -211,7 +211,6 @@ OC.L10N.register(
"Failed to load availability" : "No se pudo cargar la disponibilidad",
"Saved availability" : "Disponibilidad guardada",
"Failed to save availability" : "No se pudo guardar la disponibilidad",
"Time zone:" : "Zona horaria:",
"to" : "para",
"Delete slot" : "Eliminar ranura",
"No working hours set" : "No se han establecido las horas de trabajo",
@@ -244,6 +243,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Por favor, contacte al organizador directamente.",
"Are you accepting the invitation?" : "¿Acepta la invitación?",
"Tentative" : "Tentativo",
"Your attendance was updated successfully." : "Su asistencia se actualizó correctamente."
"Your attendance was updated successfully." : "Su asistencia se actualizó correctamente.",
"Time zone:" : "Zona horaria:"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -209,7 +209,6 @@
"Failed to load availability" : "No se pudo cargar la disponibilidad",
"Saved availability" : "Disponibilidad guardada",
"Failed to save availability" : "No se pudo guardar la disponibilidad",
"Time zone:" : "Zona horaria:",
"to" : "para",
"Delete slot" : "Eliminar ranura",
"No working hours set" : "No se han establecido las horas de trabajo",
@@ -242,6 +241,7 @@
"Please contact the organizer directly." : "Por favor, contacte al organizador directamente.",
"Are you accepting the invitation?" : "¿Acepta la invitación?",
"Tentative" : "Tentativo",
"Your attendance was updated successfully." : "Su asistencia se actualizó correctamente."
"Your attendance was updated successfully." : "Su asistencia se actualizó correctamente.",
"Time zone:" : "Zona horaria:"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Saadavuse laadimine ei õnnestunud",
"Saved availability" : "Saadavus on salvestatud",
"Failed to save availability" : "Saadavuse salvestamine ei õnnestunud",
"Time zone:" : "Ajavöönd:",
"to" : "saaja",
"Delete slot" : "Kustuta ajavahemik",
"No working hours set" : "Tööajad on sisestamata",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Palun võta ühendust korraldajaga otse.",
"Are you accepting the invitation?" : "Kas sa nõustud kutsega?",
"Tentative" : "Esialgne",
"Your attendance was updated successfully." : "Sinu osalemise oleku muutmine õnnestus."
"Your attendance was updated successfully." : "Sinu osalemise oleku muutmine õnnestus.",
"Time zone:" : "Ajavöönd:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Saadavuse laadimine ei õnnestunud",
"Saved availability" : "Saadavus on salvestatud",
"Failed to save availability" : "Saadavuse salvestamine ei õnnestunud",
"Time zone:" : "Ajavöönd:",
"to" : "saaja",
"Delete slot" : "Kustuta ajavahemik",
"No working hours set" : "Tööajad on sisestamata",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Palun võta ühendust korraldajaga otse.",
"Are you accepting the invitation?" : "Kas sa nõustud kutsega?",
"Tentative" : "Esialgne",
"Your attendance was updated successfully." : "Sinu osalemise oleku muutmine õnnestus."
"Your attendance was updated successfully." : "Sinu osalemise oleku muutmine õnnestus.",
"Time zone:" : "Ajavöönd:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -282,7 +282,6 @@ OC.L10N.register(
"Failed to load availability" : "Ezin izan da eskuragarritasuna kargatu",
"Saved availability" : "Eskuragarritasuna gorde da",
"Failed to save availability" : "Ezin izan da eskuragarritasuna gorde",
"Time zone:" : "Ordu-zona:",
"to" : "honi",
"Delete slot" : "Ezabatu tartea",
"No working hours set" : "Ez dira laneko orduak ezarri",
@@ -332,6 +331,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Mesedez jarri harremanetan antolatzailearekin zuzenean.",
"Are you accepting the invitation?" : "Gonbidapena onartzen duzu?",
"Tentative" : "Behin behinekoa",
"Your attendance was updated successfully." : "Zure parte-hartzea ondo eguneratu da."
"Your attendance was updated successfully." : "Zure parte-hartzea ondo eguneratu da.",
"Time zone:" : "Ordu-zona:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -280,7 +280,6 @@
"Failed to load availability" : "Ezin izan da eskuragarritasuna kargatu",
"Saved availability" : "Eskuragarritasuna gorde da",
"Failed to save availability" : "Ezin izan da eskuragarritasuna gorde",
"Time zone:" : "Ordu-zona:",
"to" : "honi",
"Delete slot" : "Ezabatu tartea",
"No working hours set" : "Ez dira laneko orduak ezarri",
@@ -330,6 +329,7 @@
"Please contact the organizer directly." : "Mesedez jarri harremanetan antolatzailearekin zuzenean.",
"Are you accepting the invitation?" : "Gonbidapena onartzen duzu?",
"Tentative" : "Behin behinekoa",
"Your attendance was updated successfully." : "Zure parte-hartzea ondo eguneratu da."
"Your attendance was updated successfully." : "Zure parte-hartzea ondo eguneratu da.",
"Time zone:" : "Ordu-zona:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -281,7 +281,6 @@ OC.L10N.register(
"Failed to load availability" : "بارگذاری در دسترس بودن با شکست مواجه شد",
"Saved availability" : "در دسترس بودن ذخیره شد",
"Failed to save availability" : "ذخیره در دسترس بودن با شکست مواجه شد",
"Time zone:" : "منطقه زمانی:",
"to" : "تا",
"Delete slot" : "حذف بازه زمانی",
"No working hours set" : "ساعات کاری تعیین نشده است",
@@ -321,6 +320,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "لطفاً مستقیماً با برگزارکننده تماس بگیرید.",
"Are you accepting the invitation?" : "آیا دعوت را می‌پذیرید؟",
"Tentative" : "آزمایشی",
"Your attendance was updated successfully." : "وضعیت حضور شما با موفقیت به‌روزرسانی شد."
"Your attendance was updated successfully." : "وضعیت حضور شما با موفقیت به‌روزرسانی شد.",
"Time zone:" : "منطقه زمانی:"
},
"nplurals=2; plural=(n > 1);");
+2 -2
View File
@@ -279,7 +279,6 @@
"Failed to load availability" : "بارگذاری در دسترس بودن با شکست مواجه شد",
"Saved availability" : "در دسترس بودن ذخیره شد",
"Failed to save availability" : "ذخیره در دسترس بودن با شکست مواجه شد",
"Time zone:" : "منطقه زمانی:",
"to" : "تا",
"Delete slot" : "حذف بازه زمانی",
"No working hours set" : "ساعات کاری تعیین نشده است",
@@ -319,6 +318,7 @@
"Please contact the organizer directly." : "لطفاً مستقیماً با برگزارکننده تماس بگیرید.",
"Are you accepting the invitation?" : "آیا دعوت را می‌پذیرید؟",
"Tentative" : "آزمایشی",
"Your attendance was updated successfully." : "وضعیت حضور شما با موفقیت به‌روزرسانی شد."
"Your attendance was updated successfully." : "وضعیت حضور شما با موفقیت به‌روزرسانی شد.",
"Time zone:" : "منطقه زمانی:"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}
+2 -2
View File
@@ -282,7 +282,6 @@ OC.L10N.register(
"Failed to load availability" : "Impossible de charger les disponibilités",
"Saved availability" : "Disponibilités sauvegardées",
"Failed to save availability" : "Impossible de sauvegarder les disponibilités",
"Time zone:" : "Fuseau horaire :",
"to" : "à",
"Delete slot" : "Supprimer le créneau",
"No working hours set" : "Heures de travail non définies",
@@ -332,6 +331,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
"Tentative" : "Provisoire",
"Your attendance was updated successfully." : "Votre présence a été mise à jour avec succès."
"Your attendance was updated successfully." : "Votre présence a été mise à jour avec succès.",
"Time zone:" : "Fuseau horaire :"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -280,7 +280,6 @@
"Failed to load availability" : "Impossible de charger les disponibilités",
"Saved availability" : "Disponibilités sauvegardées",
"Failed to save availability" : "Impossible de sauvegarder les disponibilités",
"Time zone:" : "Fuseau horaire :",
"to" : "à",
"Delete slot" : "Supprimer le créneau",
"No working hours set" : "Heures de travail non définies",
@@ -330,6 +329,7 @@
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
"Tentative" : "Provisoire",
"Your attendance was updated successfully." : "Votre présence a été mise à jour avec succès."
"Your attendance was updated successfully." : "Votre présence a été mise à jour avec succès.",
"Time zone:" : "Fuseau horaire :"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Theip ar infhaighteacht a lódáil",
"Saved availability" : "Infhaighteacht shábháilte",
"Failed to save availability" : "Theip ar infhaighteacht a shábháil",
"Time zone:" : "Crios ama:",
"to" : "chun",
"Delete slot" : "Scrios sliotán",
"No working hours set" : "Níl aon uaireanta oibre socraithe",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Téigh i dteagmháil leis an eagraí go díreach le do thoil.",
"Are you accepting the invitation?" : "An bhfuil tú ag glacadh leis an gcuireadh?",
"Tentative" : "Sealadach",
"Your attendance was updated successfully." : "D'éirigh le do thinreamh a nuashonrú."
"Your attendance was updated successfully." : "D'éirigh le do thinreamh a nuashonrú.",
"Time zone:" : "Crios ama:"
},
"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Theip ar infhaighteacht a lódáil",
"Saved availability" : "Infhaighteacht shábháilte",
"Failed to save availability" : "Theip ar infhaighteacht a shábháil",
"Time zone:" : "Crios ama:",
"to" : "chun",
"Delete slot" : "Scrios sliotán",
"No working hours set" : "Níl aon uaireanta oibre socraithe",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Téigh i dteagmháil leis an eagraí go díreach le do thoil.",
"Are you accepting the invitation?" : "An bhfuil tú ag glacadh leis an gcuireadh?",
"Tentative" : "Sealadach",
"Your attendance was updated successfully." : "D'éirigh le do thinreamh a nuashonrú."
"Your attendance was updated successfully." : "D'éirigh le do thinreamh a nuashonrú.",
"Time zone:" : "Crios ama:"
},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"
}
+2 -2
View File
@@ -278,7 +278,6 @@ OC.L10N.register(
"Failed to load availability" : "Produciuse un erro ao cargar a dispoñibilidade",
"Saved availability" : "Dispoñibilidade gardada",
"Failed to save availability" : "Produciuse un erro ao gardar a dispoñibilidade",
"Time zone:" : "Fuso horario:",
"to" : "para",
"Delete slot" : "Eliminar franxa horaria",
"No working hours set" : "Sen horario de traballo estabelecido",
@@ -311,6 +310,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Contacte directamente co organizador.",
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "A súa asistencia foi actualizada satisfactoriamente."
"Your attendance was updated successfully." : "A súa asistencia foi actualizada satisfactoriamente.",
"Time zone:" : "Fuso horario:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -276,7 +276,6 @@
"Failed to load availability" : "Produciuse un erro ao cargar a dispoñibilidade",
"Saved availability" : "Dispoñibilidade gardada",
"Failed to save availability" : "Produciuse un erro ao gardar a dispoñibilidade",
"Time zone:" : "Fuso horario:",
"to" : "para",
"Delete slot" : "Eliminar franxa horaria",
"No working hours set" : "Sen horario de traballo estabelecido",
@@ -309,6 +308,7 @@
"Please contact the organizer directly." : "Contacte directamente co organizador.",
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
"Tentative" : "Provisional",
"Your attendance was updated successfully." : "A súa asistencia foi actualizada satisfactoriamente."
"Your attendance was updated successfully." : "A súa asistencia foi actualizada satisfactoriamente.",
"Time zone:" : "Fuso horario:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -235,7 +235,6 @@ OC.L10N.register(
"Failed to load availability" : "Az elérhetőség betöltése sikertelen",
"Saved availability" : "Elérhetőség mentve",
"Failed to save availability" : "Az elérhetőség mentése sikertelen",
"Time zone:" : "Időzóna:",
"to" : "",
"Delete slot" : "Idősáv törlése",
"No working hours set" : "Nincs munkaidő beállítva",
@@ -268,6 +267,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Vegye fel a kapcsolatot közvetlenül a szervezővel.",
"Are you accepting the invitation?" : "Elfogadja az meghívást?",
"Tentative" : "Feltételes",
"Your attendance was updated successfully." : "A részvétele frissítése sikeres."
"Your attendance was updated successfully." : "A részvétele frissítése sikeres.",
"Time zone:" : "Időzóna:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -233,7 +233,6 @@
"Failed to load availability" : "Az elérhetőség betöltése sikertelen",
"Saved availability" : "Elérhetőség mentve",
"Failed to save availability" : "Az elérhetőség mentése sikertelen",
"Time zone:" : "Időzóna:",
"to" : "",
"Delete slot" : "Idősáv törlése",
"No working hours set" : "Nincs munkaidő beállítva",
@@ -266,6 +265,7 @@
"Please contact the organizer directly." : "Vegye fel a kapcsolatot közvetlenül a szervezővel.",
"Are you accepting the invitation?" : "Elfogadja az meghívást?",
"Tentative" : "Feltételes",
"Your attendance was updated successfully." : "A részvétele frissítése sikeres."
"Your attendance was updated successfully." : "A részvétele frissítése sikeres.",
"Time zone:" : "Időzóna:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -278,7 +278,6 @@ OC.L10N.register(
"Failed to load availability" : "Mistókst að hlaða inn lausum tímum",
"Saved availability" : "Vistaði lausa tíma",
"Failed to save availability" : "Mistókst að hlaða vista lausa tíma",
"Time zone:" : "Tímabelti:",
"to" : "til",
"Delete slot" : "Eyða tímahólfi",
"No working hours set" : "Enginn vinnutími stilltur",
@@ -311,6 +310,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Hafðu samband beint við skipuleggjendurna.",
"Are you accepting the invitation?" : "Ætlar þú að samþykkja boðið?",
"Tentative" : "Bráðabirgða",
"Your attendance was updated successfully." : "Mætingarstaða þín var uppfærð."
"Your attendance was updated successfully." : "Mætingarstaða þín var uppfærð.",
"Time zone:" : "Tímabelti:"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
+2 -2
View File
@@ -276,7 +276,6 @@
"Failed to load availability" : "Mistókst að hlaða inn lausum tímum",
"Saved availability" : "Vistaði lausa tíma",
"Failed to save availability" : "Mistókst að hlaða vista lausa tíma",
"Time zone:" : "Tímabelti:",
"to" : "til",
"Delete slot" : "Eyða tímahólfi",
"No working hours set" : "Enginn vinnutími stilltur",
@@ -309,6 +308,7 @@
"Please contact the organizer directly." : "Hafðu samband beint við skipuleggjendurna.",
"Are you accepting the invitation?" : "Ætlar þú að samþykkja boðið?",
"Tentative" : "Bráðabirgða",
"Your attendance was updated successfully." : "Mætingarstaða þín var uppfærð."
"Your attendance was updated successfully." : "Mætingarstaða þín var uppfærð.",
"Time zone:" : "Tímabelti:"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
}
+2 -2
View File
@@ -198,7 +198,6 @@ OC.L10N.register(
"Failed to load availability" : "Caricamento disponibilità non riuscito",
"Saved availability" : "Disponibilità salvata",
"Failed to save availability" : "Salvataggio disponibilità non riuscito",
"Time zone:" : "Fuso orario:",
"to" : "a",
"Delete slot" : "Elimina slot",
"No working hours set" : "Orari lavorativi non impostati",
@@ -231,6 +230,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Contatta direttamente l'amministratore.",
"Are you accepting the invitation?" : "Accetti l'invito?",
"Tentative" : "Provvisorio",
"Your attendance was updated successfully." : "La tua partecipazione è stata aggiornata correttamente."
"Your attendance was updated successfully." : "La tua partecipazione è stata aggiornata correttamente.",
"Time zone:" : "Fuso orario:"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -196,7 +196,6 @@
"Failed to load availability" : "Caricamento disponibilità non riuscito",
"Saved availability" : "Disponibilità salvata",
"Failed to save availability" : "Salvataggio disponibilità non riuscito",
"Time zone:" : "Fuso orario:",
"to" : "a",
"Delete slot" : "Elimina slot",
"No working hours set" : "Orari lavorativi non impostati",
@@ -229,6 +228,7 @@
"Please contact the organizer directly." : "Contatta direttamente l'amministratore.",
"Are you accepting the invitation?" : "Accetti l'invito?",
"Tentative" : "Provvisorio",
"Your attendance was updated successfully." : "La tua partecipazione è stata aggiornata correttamente."
"Your attendance was updated successfully." : "La tua partecipazione è stata aggiornata correttamente.",
"Time zone:" : "Fuso orario:"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "可用性の読み込みに失敗",
"Saved availability" : "可用性を保存しました",
"Failed to save availability" : "可用性を保存しました",
"Time zone:" : "タイムゾーン:",
"to" : "宛先",
"Delete slot" : "スロットを削除",
"No working hours set" : "勤務時間未設定",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "主催者に直接お問い合わせください。",
"Are you accepting the invitation?" : "招待を受け入れていますか?",
"Tentative" : "暫定的",
"Your attendance was updated successfully." : "出席は正常に更新されました。"
"Your attendance was updated successfully." : "出席は正常に更新されました。",
"Time zone:" : "タイムゾーン:"
},
"nplurals=1; plural=0;");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "可用性の読み込みに失敗",
"Saved availability" : "可用性を保存しました",
"Failed to save availability" : "可用性を保存しました",
"Time zone:" : "タイムゾーン:",
"to" : "宛先",
"Delete slot" : "スロットを削除",
"No working hours set" : "勤務時間未設定",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "主催者に直接お問い合わせください。",
"Are you accepting the invitation?" : "招待を受け入れていますか?",
"Tentative" : "暫定的",
"Your attendance was updated successfully." : "出席は正常に更新されました。"
"Your attendance was updated successfully." : "出席は正常に更新されました。",
"Time zone:" : "タイムゾーン:"
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -2
View File
@@ -184,7 +184,6 @@ OC.L10N.register(
"Failed to load availability" : "Failed to load availability",
"Saved availability" : "Saved availability",
"Failed to save availability" : "Failed to save availability",
"Time zone:" : "Time zone:",
"to" : "to",
"Delete slot" : "Delete slot",
"No working hours set" : "No working hours set",
@@ -215,6 +214,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Please contact the organizer directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
"Tentative" : "Tentative",
"Your attendance was updated successfully." : "Your attendance was updated successfully."
"Your attendance was updated successfully." : "Your attendance was updated successfully.",
"Time zone:" : "Time zone:"
},
"nplurals=2; plural=(n!=1);");
+2 -2
View File
@@ -182,7 +182,6 @@
"Failed to load availability" : "Failed to load availability",
"Saved availability" : "Saved availability",
"Failed to save availability" : "Failed to save availability",
"Time zone:" : "Time zone:",
"to" : "to",
"Delete slot" : "Delete slot",
"No working hours set" : "No working hours set",
@@ -213,6 +212,7 @@
"Please contact the organizer directly." : "Please contact the organizer directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
"Tentative" : "Tentative",
"Your attendance was updated successfully." : "Your attendance was updated successfully."
"Your attendance was updated successfully." : "Your attendance was updated successfully.",
"Time zone:" : "Time zone:"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
}
+2 -2
View File
@@ -184,7 +184,6 @@ OC.L10N.register(
"Failed to load availability" : "시간 조율 설정 불러오기 실패",
"Saved availability" : "시간 조율 설정 저장함",
"Failed to save availability" : "시간 조율 설정 저장 실패",
"Time zone:" : "시간대:",
"to" : "에서",
"Delete slot" : "시간대 삭제",
"No working hours set" : "업무 시간이 설정되지 않음",
@@ -216,6 +215,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "주최자에게 직접 연락하십시오.",
"Are you accepting the invitation?" : "초대를 수락하시겠습니까?",
"Tentative" : "보류",
"Your attendance was updated successfully." : "참석 정보를 업데이트했습니다."
"Your attendance was updated successfully." : "참석 정보를 업데이트했습니다.",
"Time zone:" : "시간대:"
},
"nplurals=1; plural=0;");
+2 -2
View File
@@ -182,7 +182,6 @@
"Failed to load availability" : "시간 조율 설정 불러오기 실패",
"Saved availability" : "시간 조율 설정 저장함",
"Failed to save availability" : "시간 조율 설정 저장 실패",
"Time zone:" : "시간대:",
"to" : "에서",
"Delete slot" : "시간대 삭제",
"No working hours set" : "업무 시간이 설정되지 않음",
@@ -214,6 +213,7 @@
"Please contact the organizer directly." : "주최자에게 직접 연락하십시오.",
"Are you accepting the invitation?" : "초대를 수락하시겠습니까?",
"Tentative" : "보류",
"Your attendance was updated successfully." : "참석 정보를 업데이트했습니다."
"Your attendance was updated successfully." : "참석 정보를 업데이트했습니다.",
"Time zone:" : "시간대:"
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -2
View File
@@ -172,7 +172,6 @@ OC.L10N.register(
"Failed to load availability" : "Неуспешно вчитување на достапноста",
"Saved availability" : "Достапноста е зачувана",
"Failed to save availability" : "Неуспешно зачувување на достапноста",
"Time zone:" : "Временска зона:",
"to" : "до",
"Delete slot" : "Избриши слот",
"No working hours set" : "Не се поставени работни часови",
@@ -204,6 +203,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Контактирајте го организаторот директно.",
"Are you accepting the invitation?" : "Дали ја прифаќате поканата?",
"Tentative" : "Прелиминарно",
"Your attendance was updated successfully." : "Вашето присуство е успешно ажурирано."
"Your attendance was updated successfully." : "Вашето присуство е успешно ажурирано.",
"Time zone:" : "Временска зона:"
},
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
+2 -2
View File
@@ -170,7 +170,6 @@
"Failed to load availability" : "Неуспешно вчитување на достапноста",
"Saved availability" : "Достапноста е зачувана",
"Failed to save availability" : "Неуспешно зачувување на достапноста",
"Time zone:" : "Временска зона:",
"to" : "до",
"Delete slot" : "Избриши слот",
"No working hours set" : "Не се поставени работни часови",
@@ -202,6 +201,7 @@
"Please contact the organizer directly." : "Контактирајте го организаторот директно.",
"Are you accepting the invitation?" : "Дали ја прифаќате поканата?",
"Tentative" : "Прелиминарно",
"Your attendance was updated successfully." : "Вашето присуство е успешно ажурирано."
"Your attendance was updated successfully." : "Вашето присуство е успешно ажурирано.",
"Time zone:" : "Временска зона:"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
}
+2 -2
View File
@@ -238,7 +238,6 @@ OC.L10N.register(
"Failed to load availability" : "Feilet med laste inn arbeidstid",
"Saved availability" : "Lagret arbeidstid",
"Failed to save availability" : "Feilet ved lagring av arbeidstid",
"Time zone:" : "Tidssone:",
"to" : "til",
"Delete slot" : "Slett tidsluke",
"No working hours set" : "Ingen arbeidstid satt",
@@ -271,6 +270,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Ta kontakt med arrangøren direkte.",
"Are you accepting the invitation?" : "Aksepterer du invitasjonen?",
"Tentative" : "Foreløpig",
"Your attendance was updated successfully." : "Deltakelsen din ble oppdatert."
"Your attendance was updated successfully." : "Deltakelsen din ble oppdatert.",
"Time zone:" : "Tidssone:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -236,7 +236,6 @@
"Failed to load availability" : "Feilet med laste inn arbeidstid",
"Saved availability" : "Lagret arbeidstid",
"Failed to save availability" : "Feilet ved lagring av arbeidstid",
"Time zone:" : "Tidssone:",
"to" : "til",
"Delete slot" : "Slett tidsluke",
"No working hours set" : "Ingen arbeidstid satt",
@@ -269,6 +268,7 @@
"Please contact the organizer directly." : "Ta kontakt med arrangøren direkte.",
"Are you accepting the invitation?" : "Aksepterer du invitasjonen?",
"Tentative" : "Foreløpig",
"Your attendance was updated successfully." : "Deltakelsen din ble oppdatert."
"Your attendance was updated successfully." : "Deltakelsen din ble oppdatert.",
"Time zone:" : "Tidssone:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -242,7 +242,6 @@ OC.L10N.register(
"Failed to load availability" : "Kon beschikbaarheid niet laden",
"Saved availability" : "Beschikbaarheid opgeslagen",
"Failed to save availability" : "Opslaan beschikbaarheid mislukt",
"Time zone:" : "Tijdzone:",
"to" : "aan",
"Delete slot" : "Verwijder slot",
"No working hours set" : "Geen werkuren ingesteld",
@@ -270,6 +269,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Neem rechtstreeks contact op met de organisator.",
"Are you accepting the invitation?" : "Neem je de uitnodiging aan?",
"Tentative" : "Onder voorbehoud",
"Your attendance was updated successfully." : "Je deelname is succesvol bijgewerkt."
"Your attendance was updated successfully." : "Je deelname is succesvol bijgewerkt.",
"Time zone:" : "Tijdzone:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -240,7 +240,6 @@
"Failed to load availability" : "Kon beschikbaarheid niet laden",
"Saved availability" : "Beschikbaarheid opgeslagen",
"Failed to save availability" : "Opslaan beschikbaarheid mislukt",
"Time zone:" : "Tijdzone:",
"to" : "aan",
"Delete slot" : "Verwijder slot",
"No working hours set" : "Geen werkuren ingesteld",
@@ -268,6 +267,7 @@
"Please contact the organizer directly." : "Neem rechtstreeks contact op met de organisator.",
"Are you accepting the invitation?" : "Neem je de uitnodiging aan?",
"Tentative" : "Onder voorbehoud",
"Your attendance was updated successfully." : "Je deelname is succesvol bijgewerkt."
"Your attendance was updated successfully." : "Je deelname is succesvol bijgewerkt.",
"Time zone:" : "Tijdzone:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+37 -2
View File
@@ -79,6 +79,9 @@ OC.L10N.register(
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za tydzień, dnia %1$s, przez cały dzień","Za %n tygodnie, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["W ciągu miesiąca, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za rok dnia %1$s przez cały dzień","Za %n lata dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień"],
"In the past on %1$s between %2$s - %3$s" : "W przeszłości dnia %1$s między %2$s - %3$s",
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Za minutę dnia %1$s między %2$s - %3$s","Za %n minuty dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s"],
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Za godzinę dnia %1$s między %2$s - %3$s","Za %n godziny dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s"],
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za dzień, dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s"],
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za tydzień dnia %1$s między %2$s - %3$s","Za %n tygodnie dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s"],
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za miesiąc dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s"],
@@ -87,18 +90,38 @@ OC.L10N.register(
"Every Day for the entire day" : "Codziennie przez cały dzień",
"Every Day for the entire day until %1$s" : "Codziennie przez cały dzień do %1$s",
"Every Day between %1$s - %2$s" : "Codziennie między %1$s %2$s",
"Every Day between %1$s - %2$s until %3$s" : "Codziennie między %1$s - %2$s do %3$s",
"Every %1$d Days for the entire day" : "Co %1$d dni przez cały dzień",
"Every %1$d Days for the entire day until %2$s" : "Co %1$d dni przez cały dzień aż do %2$s",
"Every %1$d Days between %2$s - %3$s" : "Co %1$d dni pomiędzy %2$s - %3$s",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Co %1$d dni, pomiędzy %2$s - %3$s aż do %4$s",
"Could not generate event recurrence statement" : "Nie można wygenerować zestawienia powtórzeń zdarzenia",
"Every Week on %1$s for the entire day" : "Każdego tygodnia w %1$s przez cały dzień",
"Every Week on %1$s for the entire day until %2$s" : "Co tydzień w %1$s przez cały dzień do %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Co tydzień w %1$s między %2$s - %3$s",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Co tydzień w %1$s między %2$s - %3$s do %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Co %1$d tygodni w %2$s przez cały dzień",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Co %1$d tygodnie w %2$s przez cały dzień do %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s do %5$s",
"Every Month on the %1$s for the entire day" : "Co miesiąc dnia %1$s przez cały dzień",
"Every Month on the %1$s for the entire day until %2$s" : "Co miesiąc dnia %1$s przez cały dzień do %2$s",
"Every Month on the %1$s between %2$s - %3$s" : "Co miesiąc dnia %1$s między %2$s - %3$s",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Co miesiąc dnia %1$s między %2$s - %3$s do %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Co %1$d miesiący dnia %2$s przez cały dzień",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Co %1$d miesięcy dnia %2$s przez cały dzień do %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Co %1$d miesięcy dnia %2$s między %3$s - %4$s",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Każdego %1$d miesiąca dnia %2$s między %3$s - %4$s do %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Co rok w %1$s dnia %2$s przez cały dzień",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Co rok w %1$s dnia %2$s przez cały dzień do %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s do %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Co %1$d lat dnia %2$s o %3$s przez cały dzień",
"Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Co %1$d lat w %2$s dnia %3$s przez cały dzień do %4$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s do %6$s",
"On specific dates for the entire day until %1$s" : "W określonych datach przez cały dzień do %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "W określonych datach między %1$s - %2$s do %3$s",
"In the past on %1$s" : "W przeszłości dnia %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %1$s","Za %n godziny dnia %1$s","Za %n godzin dnia %1$s","Za %n godzin dnia %1$s"],
@@ -108,6 +131,18 @@ OC.L10N.register(
"_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s"],
"In the past on %1$s then on %2$s" : "W przeszłości dnia %1$s, a następnie %2$s",
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %1$s, a następnie %2$s","Za %n minuty dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s"],
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s","Za %n godziny dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s"],
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Jutro dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s"],
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s"],
"_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s","Za %n miesiące dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s"],
"_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Za rok dnia %1$s, następnie dnia %2$s","Za %n lata dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "W przeszłości dnia %1$s, następnie dnia %2$s i %3$s",
"_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Za minutę dnia %1$s, następnie dnia %2$s i %3$s","Za %n minuty dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s i %3$s","Za %%ngodziny dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Jutro, dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesiące dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Za rok dnia %1$s, następnie dnia %2$s i %3$s","Za %n lata dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s"],
"Could not generate next recurrence statement" : "Nie można wygenerować następnej instrukcji powtarzania",
"Cancelled: %1$s" : "Anulowane: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" zostało anulowane",
@@ -248,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Nie udało się wczytać dostępności",
"Saved availability" : "Zapisana dostępność",
"Failed to save availability" : "Nie udało się zapisać dostępności",
"Time zone:" : "Strefa czasowa:",
"to" : "od",
"Delete slot" : "Usuń przedział czasu",
"No working hours set" : "Nie ustawiono godzin pracy",
@@ -298,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Skontaktuj się bezpośrednio z orgnizatorem.",
"Are you accepting the invitation?" : "Czy akceptujesz zaproszenie?",
"Tentative" : "Niepewne",
"Your attendance was updated successfully." : "Twoja obecność została pomyślnie zaktualizowana."
"Your attendance was updated successfully." : "Twoja obecność została pomyślnie zaktualizowana.",
"Time zone:" : "Strefa czasowa:"
},
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
+37 -2
View File
@@ -77,6 +77,9 @@
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za tydzień, dnia %1$s, przez cały dzień","Za %n tygodnie, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["W ciągu miesiąca, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za rok dnia %1$s przez cały dzień","Za %n lata dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień"],
"In the past on %1$s between %2$s - %3$s" : "W przeszłości dnia %1$s między %2$s - %3$s",
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Za minutę dnia %1$s między %2$s - %3$s","Za %n minuty dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s"],
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Za godzinę dnia %1$s między %2$s - %3$s","Za %n godziny dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s"],
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za dzień, dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s"],
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za tydzień dnia %1$s między %2$s - %3$s","Za %n tygodnie dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s"],
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za miesiąc dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s"],
@@ -85,18 +88,38 @@
"Every Day for the entire day" : "Codziennie przez cały dzień",
"Every Day for the entire day until %1$s" : "Codziennie przez cały dzień do %1$s",
"Every Day between %1$s - %2$s" : "Codziennie między %1$s %2$s",
"Every Day between %1$s - %2$s until %3$s" : "Codziennie między %1$s - %2$s do %3$s",
"Every %1$d Days for the entire day" : "Co %1$d dni przez cały dzień",
"Every %1$d Days for the entire day until %2$s" : "Co %1$d dni przez cały dzień aż do %2$s",
"Every %1$d Days between %2$s - %3$s" : "Co %1$d dni pomiędzy %2$s - %3$s",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Co %1$d dni, pomiędzy %2$s - %3$s aż do %4$s",
"Could not generate event recurrence statement" : "Nie można wygenerować zestawienia powtórzeń zdarzenia",
"Every Week on %1$s for the entire day" : "Każdego tygodnia w %1$s przez cały dzień",
"Every Week on %1$s for the entire day until %2$s" : "Co tydzień w %1$s przez cały dzień do %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Co tydzień w %1$s między %2$s - %3$s",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Co tydzień w %1$s między %2$s - %3$s do %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Co %1$d tygodni w %2$s przez cały dzień",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Co %1$d tygodnie w %2$s przez cały dzień do %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s do %5$s",
"Every Month on the %1$s for the entire day" : "Co miesiąc dnia %1$s przez cały dzień",
"Every Month on the %1$s for the entire day until %2$s" : "Co miesiąc dnia %1$s przez cały dzień do %2$s",
"Every Month on the %1$s between %2$s - %3$s" : "Co miesiąc dnia %1$s między %2$s - %3$s",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Co miesiąc dnia %1$s między %2$s - %3$s do %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Co %1$d miesiący dnia %2$s przez cały dzień",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Co %1$d miesięcy dnia %2$s przez cały dzień do %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Co %1$d miesięcy dnia %2$s między %3$s - %4$s",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Każdego %1$d miesiąca dnia %2$s między %3$s - %4$s do %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Co rok w %1$s dnia %2$s przez cały dzień",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Co rok w %1$s dnia %2$s przez cały dzień do %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s do %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Co %1$d lat dnia %2$s o %3$s przez cały dzień",
"Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Co %1$d lat w %2$s dnia %3$s przez cały dzień do %4$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s do %6$s",
"On specific dates for the entire day until %1$s" : "W określonych datach przez cały dzień do %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "W określonych datach między %1$s - %2$s do %3$s",
"In the past on %1$s" : "W przeszłości dnia %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %1$s","Za %n godziny dnia %1$s","Za %n godzin dnia %1$s","Za %n godzin dnia %1$s"],
@@ -106,6 +129,18 @@
"_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s"],
"In the past on %1$s then on %2$s" : "W przeszłości dnia %1$s, a następnie %2$s",
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %1$s, a następnie %2$s","Za %n minuty dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s"],
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s","Za %n godziny dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s"],
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Jutro dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s"],
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s"],
"_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s","Za %n miesiące dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s"],
"_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Za rok dnia %1$s, następnie dnia %2$s","Za %n lata dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "W przeszłości dnia %1$s, następnie dnia %2$s i %3$s",
"_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Za minutę dnia %1$s, następnie dnia %2$s i %3$s","Za %n minuty dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s i %3$s","Za %%ngodziny dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Jutro, dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesiące dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s"],
"_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Za rok dnia %1$s, następnie dnia %2$s i %3$s","Za %n lata dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s"],
"Could not generate next recurrence statement" : "Nie można wygenerować następnej instrukcji powtarzania",
"Cancelled: %1$s" : "Anulowane: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" zostało anulowane",
@@ -246,7 +281,6 @@
"Failed to load availability" : "Nie udało się wczytać dostępności",
"Saved availability" : "Zapisana dostępność",
"Failed to save availability" : "Nie udało się zapisać dostępności",
"Time zone:" : "Strefa czasowa:",
"to" : "od",
"Delete slot" : "Usuń przedział czasu",
"No working hours set" : "Nie ustawiono godzin pracy",
@@ -296,6 +330,7 @@
"Please contact the organizer directly." : "Skontaktuj się bezpośrednio z orgnizatorem.",
"Are you accepting the invitation?" : "Czy akceptujesz zaproszenie?",
"Tentative" : "Niepewne",
"Your attendance was updated successfully." : "Twoja obecność została pomyślnie zaktualizowana."
"Your attendance was updated successfully." : "Twoja obecność została pomyślnie zaktualizowana.",
"Time zone:" : "Strefa czasowa:"
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Falha ao carregar a disponibilidade",
"Saved availability" : "Disponibilidade salva",
"Failed to save availability" : "Falha ao salvar a disponibilidade",
"Time zone:" : "Fuso horário:",
"to" : "para",
"Delete slot" : "Excluir slot",
"No working hours set" : "Sem horário de trabalho definido",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Por favor, contate o organizador diretamente.",
"Are you accepting the invitation?" : "Você está aceitando o convite?",
"Tentative" : "Tentativa",
"Your attendance was updated successfully." : "Sua presença foi atualizada com sucesso."
"Your attendance was updated successfully." : "Sua presença foi atualizada com sucesso.",
"Time zone:" : "Fuso horário:"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Falha ao carregar a disponibilidade",
"Saved availability" : "Disponibilidade salva",
"Failed to save availability" : "Falha ao salvar a disponibilidade",
"Time zone:" : "Fuso horário:",
"to" : "para",
"Delete slot" : "Excluir slot",
"No working hours set" : "Sem horário de trabalho definido",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Por favor, contate o organizador diretamente.",
"Are you accepting the invitation?" : "Você está aceitando o convite?",
"Tentative" : "Tentativa",
"Your attendance was updated successfully." : "Sua presença foi atualizada com sucesso."
"Your attendance was updated successfully." : "Sua presença foi atualizada com sucesso.",
"Time zone:" : "Fuso horário:"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -281,7 +281,6 @@ OC.L10N.register(
"Failed to load availability" : "Falha ao carregar disponibilidade",
"Saved availability" : "Disponibilidade guardada",
"Failed to save availability" : "Falha ao guardar disponibilidade",
"Time zone:" : "Fuso horário:",
"to" : "Para",
"Delete slot" : "Eliminar intervalo",
"No working hours set" : "Sem horário de trabalho definido",
@@ -331,6 +330,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Contacte diretamente o organizador.",
"Are you accepting the invitation?" : "Aceita o convite?",
"Tentative" : "Tentativa",
"Your attendance was updated successfully." : "O seu estado de participação foi atualizado com sucesso."
"Your attendance was updated successfully." : "O seu estado de participação foi atualizado com sucesso.",
"Time zone:" : "Fuso horário:"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+2 -2
View File
@@ -279,7 +279,6 @@
"Failed to load availability" : "Falha ao carregar disponibilidade",
"Saved availability" : "Disponibilidade guardada",
"Failed to save availability" : "Falha ao guardar disponibilidade",
"Time zone:" : "Fuso horário:",
"to" : "Para",
"Delete slot" : "Eliminar intervalo",
"No working hours set" : "Sem horário de trabalho definido",
@@ -329,6 +328,7 @@
"Please contact the organizer directly." : "Contacte diretamente o organizador.",
"Are you accepting the invitation?" : "Aceita o convite?",
"Tentative" : "Tentativa",
"Your attendance was updated successfully." : "O seu estado de participação foi atualizado com sucesso."
"Your attendance was updated successfully." : "O seu estado de participação foi atualizado com sucesso.",
"Time zone:" : "Fuso horário:"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Не удалось получить сведения о доступности",
"Saved availability" : "Сведения о доступности сохранены",
"Failed to save availability" : "Не удалось сохранить сведения о доступности",
"Time zone:" : "Часовой пояс:",
"to" : "по",
"Delete slot" : "Удалить интервал",
"No working hours set" : "Рабочие часы не указаны",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Обратитесь к организатору напрямую.",
"Are you accepting the invitation?" : "Принять приглашение?",
"Tentative" : "Под вопросом",
"Your attendance was updated successfully." : "Статус участия обновлён."
"Your attendance was updated successfully." : "Статус участия обновлён.",
"Time zone:" : "Часовой пояс:"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Не удалось получить сведения о доступности",
"Saved availability" : "Сведения о доступности сохранены",
"Failed to save availability" : "Не удалось сохранить сведения о доступности",
"Time zone:" : "Часовой пояс:",
"to" : "по",
"Delete slot" : "Удалить интервал",
"No working hours set" : "Рабочие часы не указаны",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Обратитесь к организатору напрямую.",
"Are you accepting the invitation?" : "Принять приглашение?",
"Tentative" : "Под вопросом",
"Your attendance was updated successfully." : "Статус участия обновлён."
"Your attendance was updated successfully." : "Статус участия обновлён.",
"Time zone:" : "Часовой пояс:"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
}
+2 -2
View File
@@ -281,7 +281,6 @@ OC.L10N.register(
"Failed to load availability" : "Nepodarilo sa načítať dostupnosť",
"Saved availability" : "Dostupnosť bola uložená",
"Failed to save availability" : "Nepodarilo sa uložiť dostupnosť",
"Time zone:" : "Časová zóna:",
"to" : "do",
"Delete slot" : "Odstrániť slot",
"No working hours set" : "Nenastavená pracovná doba",
@@ -321,6 +320,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Prosím kontaktujte priamo organizátora.",
"Are you accepting the invitation?" : "Príjmate pozvánku?",
"Tentative" : "Neistý",
"Your attendance was updated successfully." : "Vaša účasť bola aktualizovaná úspešne."
"Your attendance was updated successfully." : "Vaša účasť bola aktualizovaná úspešne.",
"Time zone:" : "Časová zóna:"
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");
+2 -2
View File
@@ -279,7 +279,6 @@
"Failed to load availability" : "Nepodarilo sa načítať dostupnosť",
"Saved availability" : "Dostupnosť bola uložená",
"Failed to save availability" : "Nepodarilo sa uložiť dostupnosť",
"Time zone:" : "Časová zóna:",
"to" : "do",
"Delete slot" : "Odstrániť slot",
"No working hours set" : "Nenastavená pracovná doba",
@@ -319,6 +318,7 @@
"Please contact the organizer directly." : "Prosím kontaktujte priamo organizátora.",
"Are you accepting the invitation?" : "Príjmate pozvánku?",
"Tentative" : "Neistý",
"Your attendance was updated successfully." : "Vaša účasť bola aktualizovaná úspešne."
"Your attendance was updated successfully." : "Vaša účasť bola aktualizovaná úspešne.",
"Time zone:" : "Časová zóna:"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
}
+2 -2
View File
@@ -189,7 +189,6 @@ OC.L10N.register(
"Failed to load availability" : "Nalaganje seznama razpoložljivih polj je spodletelo",
"Saved availability" : "Čas razpoložljivosti je shranjen",
"Failed to save availability" : "Shranjevanje časa razpoložljivosti je spodletelo",
"Time zone:" : "Časovni pas:",
"to" : "do",
"Delete slot" : "Izbriši možnost",
"No working hours set" : "Ni navedenih delovnih ur",
@@ -222,6 +221,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Z organizatorjem stopite neposredno v stik.",
"Are you accepting the invitation?" : "Ali želite sprejeti povabilo?",
"Tentative" : "Začasno",
"Your attendance was updated successfully." : "Vaša prisotnost je uspešno posodobljena."
"Your attendance was updated successfully." : "Vaša prisotnost je uspešno posodobljena.",
"Time zone:" : "Časovni pas:"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
+2 -2
View File
@@ -187,7 +187,6 @@
"Failed to load availability" : "Nalaganje seznama razpoložljivih polj je spodletelo",
"Saved availability" : "Čas razpoložljivosti je shranjen",
"Failed to save availability" : "Shranjevanje časa razpoložljivosti je spodletelo",
"Time zone:" : "Časovni pas:",
"to" : "do",
"Delete slot" : "Izbriši možnost",
"No working hours set" : "Ni navedenih delovnih ur",
@@ -220,6 +219,7 @@
"Please contact the organizer directly." : "Z organizatorjem stopite neposredno v stik.",
"Are you accepting the invitation?" : "Ali želite sprejeti povabilo?",
"Tentative" : "Začasno",
"Your attendance was updated successfully." : "Vaša prisotnost je uspešno posodobljena."
"Your attendance was updated successfully." : "Vaša prisotnost je uspešno posodobljena.",
"Time zone:" : "Časovni pas:"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Доступност није могла да се учита",
"Saved availability" : "Доступност је сачувана",
"Failed to save availability" : "Није успело снимање доступности ",
"Time zone:" : "Временска зона:",
"to" : "за",
"Delete slot" : "Обриши прорез",
"No working hours set" : "Нису подешени радни сати",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Контактирајте директно организатора.",
"Are you accepting the invitation?" : "Да ли прихватате позивницу?",
"Tentative" : "Условна потврда",
"Your attendance was updated successfully." : "Ваше присуство је успешно ажурирано."
"Your attendance was updated successfully." : "Ваше присуство је успешно ажурирано.",
"Time zone:" : "Временска зона:"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Доступност није могла да се учита",
"Saved availability" : "Доступност је сачувана",
"Failed to save availability" : "Није успело снимање доступности ",
"Time zone:" : "Временска зона:",
"to" : "за",
"Delete slot" : "Обриши прорез",
"No working hours set" : "Нису подешени радни сати",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Контактирајте директно организатора.",
"Are you accepting the invitation?" : "Да ли прихватате позивницу?",
"Tentative" : "Условна потврда",
"Your attendance was updated successfully." : "Ваше присуство је успешно ажурирано."
"Your attendance was updated successfully." : "Ваше присуство је успешно ажурирано.",
"Time zone:" : "Временска зона:"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
}
+2 -2
View File
@@ -282,7 +282,6 @@ OC.L10N.register(
"Failed to load availability" : "Misslyckades med att ladda tidsluckor",
"Saved availability" : "Sparade tidslucka",
"Failed to save availability" : "Misslyckades med att spara tidslucka",
"Time zone:" : "Tidszon:",
"to" : "till",
"Delete slot" : "Radera lucka",
"No working hours set" : "Inga arbetstimmar satta",
@@ -332,6 +331,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Vänligen kontakta arrangören direkt.",
"Are you accepting the invitation?" : "Acceptera inbjudan?",
"Tentative" : "Preliminärt",
"Your attendance was updated successfully." : "Dina närvaro uppdaterades."
"Your attendance was updated successfully." : "Dina närvaro uppdaterades.",
"Time zone:" : "Tidszon:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -280,7 +280,6 @@
"Failed to load availability" : "Misslyckades med att ladda tidsluckor",
"Saved availability" : "Sparade tidslucka",
"Failed to save availability" : "Misslyckades med att spara tidslucka",
"Time zone:" : "Tidszon:",
"to" : "till",
"Delete slot" : "Radera lucka",
"No working hours set" : "Inga arbetstimmar satta",
@@ -330,6 +329,7 @@
"Please contact the organizer directly." : "Vänligen kontakta arrangören direkt.",
"Are you accepting the invitation?" : "Acceptera inbjudan?",
"Tentative" : "Preliminärt",
"Your attendance was updated successfully." : "Dina närvaro uppdaterades."
"Your attendance was updated successfully." : "Dina närvaro uppdaterades.",
"Time zone:" : "Tidszon:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Uygunluk yüklenemedi",
"Saved availability" : "Uygunluk kaydedildi",
"Failed to save availability" : "Uygunluk kaydedilemedi",
"Time zone:" : "Saat dilimi:",
"to" : "ile",
"Delete slot" : "Aralığı sil",
"No working hours set" : "Çalışma saatleri ayarlanmamış",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Lütfen düzenleyici ile doğrudan görüşün.",
"Are you accepting the invitation?" : "Daveti kabul ediyor musunuz?",
"Tentative" : "Kesin değil",
"Your attendance was updated successfully." : "Katılımınız güncellendi."
"Your attendance was updated successfully." : "Katılımınız güncellendi.",
"Time zone:" : "Saat dilimi:"
},
"nplurals=2; plural=(n > 1);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Uygunluk yüklenemedi",
"Saved availability" : "Uygunluk kaydedildi",
"Failed to save availability" : "Uygunluk kaydedilemedi",
"Time zone:" : "Saat dilimi:",
"to" : "ile",
"Delete slot" : "Aralığı sil",
"No working hours set" : "Çalışma saatleri ayarlanmamış",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Lütfen düzenleyici ile doğrudan görüşün.",
"Are you accepting the invitation?" : "Daveti kabul ediyor musunuz?",
"Tentative" : "Kesin değil",
"Your attendance was updated successfully." : "Katılımınız güncellendi."
"Your attendance was updated successfully." : "Katılımınız güncellendi.",
"Time zone:" : "Saat dilimi:"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}
+2 -2
View File
@@ -230,7 +230,6 @@ OC.L10N.register(
"Failed to load availability" : "ئىشلىتىشچانلىقىنى يۈكلىيەلمىدى",
"Saved availability" : "تېجەشلىك",
"Failed to save availability" : "ئىشلەتكىلى بولمىدى",
"Time zone:" : "ۋاقىت رايونى:",
"to" : "to",
"Delete slot" : "ئورۇننى ئۆچۈرۈڭ",
"No working hours set" : "خىزمەت ۋاقتى بېكىتىلمىدى",
@@ -263,6 +262,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "تەشكىللىگۈچى بىلەن بىۋاسىتە ئالاقىلىشىڭ.",
"Are you accepting the invitation?" : "تەكلىپنى قوبۇل قىلامسىز؟",
"Tentative" : "Tentative",
"Your attendance was updated successfully." : "سىزنىڭ قاتنىشىشىڭىز مۇۋەپپەقىيەتلىك يېڭىلاندى."
"Your attendance was updated successfully." : "سىزنىڭ قاتنىشىشىڭىز مۇۋەپپەقىيەتلىك يېڭىلاندى.",
"Time zone:" : "ۋاقىت رايونى:"
},
"nplurals=2; plural=(n != 1);");
+2 -2
View File
@@ -228,7 +228,6 @@
"Failed to load availability" : "ئىشلىتىشچانلىقىنى يۈكلىيەلمىدى",
"Saved availability" : "تېجەشلىك",
"Failed to save availability" : "ئىشلەتكىلى بولمىدى",
"Time zone:" : "ۋاقىت رايونى:",
"to" : "to",
"Delete slot" : "ئورۇننى ئۆچۈرۈڭ",
"No working hours set" : "خىزمەت ۋاقتى بېكىتىلمىدى",
@@ -261,6 +260,7 @@
"Please contact the organizer directly." : "تەشكىللىگۈچى بىلەن بىۋاسىتە ئالاقىلىشىڭ.",
"Are you accepting the invitation?" : "تەكلىپنى قوبۇل قىلامسىز؟",
"Tentative" : "Tentative",
"Your attendance was updated successfully." : "سىزنىڭ قاتنىشىشىڭىز مۇۋەپپەقىيەتلىك يېڭىلاندى."
"Your attendance was updated successfully." : "سىزنىڭ قاتنىشىشىڭىز مۇۋەپپەقىيەتلىك يېڭىلاندى.",
"Time zone:" : "ۋاقىت رايونى:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "Не вдалося завантажити доступність",
"Saved availability" : "Збережена наявність",
"Failed to save availability" : "Не вдалося зберегти наявність",
"Time zone:" : "Часовий пояс:",
"to" : "до",
"Delete slot" : "Вилучити діапазон",
"No working hours set" : "Робочий час не встановлено",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "Будь-ласка повідомте організатора.",
"Are you accepting the invitation?" : "Чи приймаєте ви запрошення?",
"Tentative" : "Попередній",
"Your attendance was updated successfully." : "Ваша участь успішно оновлена."
"Your attendance was updated successfully." : "Ваша участь успішно оновлена.",
"Time zone:" : "Часовий пояс:"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "Не вдалося завантажити доступність",
"Saved availability" : "Збережена наявність",
"Failed to save availability" : "Не вдалося зберегти наявність",
"Time zone:" : "Часовий пояс:",
"to" : "до",
"Delete slot" : "Вилучити діапазон",
"No working hours set" : "Робочий час не встановлено",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "Будь-ласка повідомте організатора.",
"Are you accepting the invitation?" : "Чи приймаєте ви запрошення?",
"Tentative" : "Попередній",
"Your attendance was updated successfully." : "Ваша участь успішно оновлена."
"Your attendance was updated successfully." : "Ваша участь успішно оновлена.",
"Time zone:" : "Часовий пояс:"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "可用时间段加载失败",
"Saved availability" : "可用时间已保存",
"Failed to save availability" : "可用时间保存失败",
"Time zone:" : "时区:",
"to" : "到",
"Delete slot" : "删除插槽",
"No working hours set" : "尚未设置工作时间",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "请直接联系组织者。",
"Are you accepting the invitation?" : "您是否接受邀请?",
"Tentative" : "暂定",
"Your attendance was updated successfully." : "您的出席状态更新成功。"
"Your attendance was updated successfully." : "您的出席状态更新成功。",
"Time zone:" : "时区:"
},
"nplurals=1; plural=0;");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "可用时间段加载失败",
"Saved availability" : "可用时间已保存",
"Failed to save availability" : "可用时间保存失败",
"Time zone:" : "时区:",
"to" : "到",
"Delete slot" : "删除插槽",
"No working hours set" : "尚未设置工作时间",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "请直接联系组织者。",
"Are you accepting the invitation?" : "您是否接受邀请?",
"Tentative" : "暂定",
"Your attendance was updated successfully." : "您的出席状态更新成功。"
"Your attendance was updated successfully." : "您的出席状态更新成功。",
"Time zone:" : "时区:"
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "加載空閒時間失敗",
"Saved availability" : "已保存空閒時間",
"Failed to save availability" : "未能保存空閒時間",
"Time zone:" : "時區:",
"to" : "至",
"Delete slot" : "刪除欄位",
"No working hours set" : "尚未設置工作時間",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "請直接聯繫絡主辦人",
"Are you accepting the invitation?" : "接受邀請嗎?",
"Tentative" : "暫定",
"Your attendance was updated successfully." : "您的參與狀況成功更新"
"Your attendance was updated successfully." : "您的參與狀況成功更新",
"Time zone:" : "時區:"
},
"nplurals=1; plural=0;");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "加載空閒時間失敗",
"Saved availability" : "已保存空閒時間",
"Failed to save availability" : "未能保存空閒時間",
"Time zone:" : "時區:",
"to" : "至",
"Delete slot" : "刪除欄位",
"No working hours set" : "尚未設置工作時間",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "請直接聯繫絡主辦人",
"Are you accepting the invitation?" : "接受邀請嗎?",
"Tentative" : "暫定",
"Your attendance was updated successfully." : "您的參與狀況成功更新"
"Your attendance was updated successfully." : "您的參與狀況成功更新",
"Time zone:" : "時區:"
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -2
View File
@@ -283,7 +283,6 @@ OC.L10N.register(
"Failed to load availability" : "空閒時間載入失敗",
"Saved availability" : "已儲存空閒時間",
"Failed to save availability" : "儲存空閒時間失敗",
"Time zone:" : "時區:",
"to" : "到",
"Delete slot" : "刪除時段",
"No working hours set" : "未設定工作時間",
@@ -333,6 +332,7 @@ OC.L10N.register(
"Please contact the organizer directly." : "請直接聯絡主辦者。",
"Are you accepting the invitation?" : "您要接受邀請嗎?",
"Tentative" : "考慮接受",
"Your attendance was updated successfully." : "您的參與狀態已成功更新。"
"Your attendance was updated successfully." : "您的參與狀態已成功更新。",
"Time zone:" : "時區:"
},
"nplurals=1; plural=0;");
+2 -2
View File
@@ -281,7 +281,6 @@
"Failed to load availability" : "空閒時間載入失敗",
"Saved availability" : "已儲存空閒時間",
"Failed to save availability" : "儲存空閒時間失敗",
"Time zone:" : "時區:",
"to" : "到",
"Delete slot" : "刪除時段",
"No working hours set" : "未設定工作時間",
@@ -331,6 +330,7 @@
"Please contact the organizer directly." : "請直接聯絡主辦者。",
"Are you accepting the invitation?" : "您要接受邀請嗎?",
"Tentative" : "考慮接受",
"Your attendance was updated successfully." : "您的參與狀態已成功更新。"
"Your attendance was updated successfully." : "您的參與狀態已成功更新。",
"Time zone:" : "時區:"
},"pluralForm" :"nplurals=1; plural=0;"
}
+5 -1
View File
@@ -36,7 +36,7 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IRestorable, IShareable
public function __construct(
BackendInterface $caldavBackend,
$calendarInfo,
array $calendarInfo,
IL10N $l10n,
private IConfig $config,
private LoggerInterface $logger,
@@ -60,6 +60,10 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IRestorable, IShareable
$this->l10n = $l10n;
}
public function getUri(): string {
return $this->calendarInfo['uri'];
}
/**
* {@inheritdoc}
* @throws Forbidden
+29 -6
View File
@@ -36,9 +36,14 @@ class CalendarProvider implements ICalendarProvider {
});
}
$additionalProperties = $this->getAdditionalPropertiesForCalendars($calendarInfos);
$iCalendars = [];
foreach ($calendarInfos as $calendarInfo) {
$calendarInfo = array_merge($calendarInfo, $this->getAdditionalProperties($calendarInfo['principaluri'], $calendarInfo['uri']));
$user = str_replace('principals/users/', '', $calendarInfo['principaluri']);
$path = 'calendars/' . $user . '/' . $calendarInfo['uri'];
$calendarInfo = array_merge($calendarInfo, $additionalProperties[$path] ?? []);
$calendar = new Calendar($this->calDavBackend, $calendarInfo, $this->l10n, $this->config, $this->logger);
$iCalendars[] = new CalendarImpl(
$calendar,
@@ -49,16 +54,34 @@ class CalendarProvider implements ICalendarProvider {
return $iCalendars;
}
public function getAdditionalProperties(string $principalUri, string $calendarUri): array {
$user = str_replace('principals/users/', '', $principalUri);
$path = 'calendars/' . $user . '/' . $calendarUri;
/**
* @param array{
* principaluri: string,
* uri: string,
* }[] $uris
* @return array<string, array<string, string|bool>>
*/
private function getAdditionalPropertiesForCalendars(array $uris): array {
$calendars = [];
foreach ($uris as $uri) {
/** @var string $user */
$user = str_replace('principals/users/', '', $uri['principaluri']);
if (!array_key_exists($user, $calendars)) {
$calendars[$user] = [];
}
$calendars[$user][] = 'calendars/' . $user . '/' . $uri['uri'];
}
$properties = $this->propertyMapper->findPropertiesByPath($user, $path);
$properties = $this->propertyMapper->findPropertiesByPathsAndUsers($calendars);
$list = [];
foreach ($properties as $property) {
if ($property instanceof Property) {
$list[$property->getPropertyname()] = match ($property->getPropertyname()) {
if (!isset($list[$property->getPropertypath()])) {
$list[$property->getPropertypath()] = [];
}
$list[$property->getPropertypath()][$property->getPropertyname()] = match ($property->getPropertyname()) {
'{http://owncloud.org/ns}calendar-enabled' => (bool)$property->getPropertyvalue(),
default => $property->getPropertyvalue()
};
@@ -20,6 +20,7 @@ use OCA\DAV\Connector\Sabre\DavAclPlugin;
use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin;
use OCA\DAV\Connector\Sabre\LockPlugin;
use OCA\DAV\Connector\Sabre\MaintenancePlugin;
use OCA\DAV\Connector\Sabre\PropFindPreloadNotifyPlugin;
use OCA\DAV\Events\SabrePluginAuthInitEvent;
use OCA\DAV\RootCollection;
use OCA\Theming\ThemingDefaults;
@@ -96,6 +97,9 @@ class EmbeddedCalDavServer {
$this->server->addPlugin(Server::get(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class));
}
// collection preload plugin
$this->server->addPlugin(new PropFindPreloadNotifyPlugin());
// wait with registering these until auth is handled and the filesystem is setup
$this->server->on('beforeMethod:*', function () use ($root): void {
// register plugins from apps
@@ -49,7 +49,7 @@ class BlockLegacyClientPlugin extends ServerPlugin {
return;
}
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '2.7.0');
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.0');
$maximumSupportedDesktopVersion = $this->config->getSystemValueString('maximum.supported.desktop.version', '99.99.99');
// Check if the client is a desktop client
@@ -10,6 +10,7 @@ namespace OCA\DAV\Connector\Sabre;
use OCP\Comments\ICommentsManager;
use OCP\IUserSession;
use Sabre\DAV\ICollection;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
@@ -21,6 +22,7 @@ class CommentPropertiesPlugin extends ServerPlugin {
protected ?Server $server = null;
private array $cachedUnreadCount = [];
private array $cachedDirectories = [];
public function __construct(
private ICommentsManager $commentsManager,
@@ -41,6 +43,8 @@ class CommentPropertiesPlugin extends ServerPlugin {
*/
public function initialize(\Sabre\DAV\Server $server) {
$this->server = $server;
$this->server->on('preloadCollection', $this->preloadCollection(...));
$this->server->on('propFind', [$this, 'handleGetProperties']);
}
@@ -69,6 +73,21 @@ class CommentPropertiesPlugin extends ServerPlugin {
}
}
private function preloadCollection(PropFind $propFind, ICollection $collection):
void {
if (!($collection instanceof Directory)) {
return;
}
$collectionPath = $collection->getPath();
if (!isset($this->cachedDirectories[$collectionPath]) && $propFind->getStatus(
self::PROPERTY_NAME_UNREAD
) !== null) {
$this->cacheDirectory($collection);
$this->cachedDirectories[$collectionPath] = true;
}
}
/**
* Adds tags and favorites properties to the response,
* if requested.
@@ -85,14 +104,6 @@ class CommentPropertiesPlugin extends ServerPlugin {
return;
}
// need prefetch ?
if ($node instanceof Directory
&& $propFind->getDepth() !== 0
&& !is_null($propFind->getStatus(self::PROPERTY_NAME_UNREAD))
) {
$this->cacheDirectory($node);
}
$propFind->handle(self::PROPERTY_NAME_COUNT, function () use ($node): int {
return $this->commentsManager->getNumberOfCommentsForObject('files', (string)$node->getId());
});
@@ -0,0 +1,82 @@
<?php
declare(strict_types = 1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\DAV\Connector\Sabre;
use Sabre\DAV\Server as SabreServer;
use Sabre\DAV\ServerPlugin;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
/**
* This plugin runs after requests and logs an error if a plugin is detected
* to be doing too many SQL requests.
*/
class PropFindMonitorPlugin extends ServerPlugin {
/**
* A Plugin can scan up to this amount of nodes without an error being
* reported.
*/
public const THRESHOLD_NODES = 50;
/**
* A plugin can use up to this amount of queries per node.
*/
public const THRESHOLD_QUERY_FACTOR = 1;
private SabreServer $server;
public function initialize(SabreServer $server): void {
$this->server = $server;
$this->server->on('afterResponse', [$this, 'afterResponse']);
}
public function afterResponse(
RequestInterface $request,
ResponseInterface $response): void {
if (!$this->server instanceof Server) {
return;
}
$pluginQueries = $this->server->getPluginQueries();
if (empty($pluginQueries)) {
return;
}
$logger = $this->server->getLogger();
foreach ($pluginQueries as $eventName => $eventQueries) {
$maxDepth = max(0, ...array_keys($eventQueries));
// entries at the top are usually not interesting
unset($eventQueries[$maxDepth]);
foreach ($eventQueries as $depth => $propFinds) {
foreach ($propFinds as $pluginName => $propFind) {
[
'queries' => $queries,
'nodes' => $nodes
] = $propFind;
if ($queries === 0 || $nodes > $queries || $nodes < self::THRESHOLD_NODES
|| $queries < $nodes * self::THRESHOLD_QUERY_FACTOR) {
continue;
}
$logger->error(
'{name}:{event} scanned {scans} nodes with {count} queries in depth {depth}/{maxDepth}. This is bad for performance, please report to the plugin developer!',
[
'name' => $pluginName,
'scans' => $nodes,
'count' => $queries,
'depth' => $depth,
'maxDepth' => $maxDepth,
'event' => $eventName,
]
);
}
}
}
}
}
@@ -0,0 +1,55 @@
<?php
declare(strict_types = 1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\DAV\Connector\Sabre;
use Sabre\DAV\ICollection;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
/**
* This plugin asks other plugins to preload data for a collection, so that
* subsequent PROPFIND handlers for children do not query the DB on a per-node
* basis.
*/
class PropFindPreloadNotifyPlugin extends ServerPlugin {
private Server $server;
public function initialize(Server $server): void {
$this->server = $server;
$this->server->on('propFind', [$this, 'collectionPreloadNotifier' ], 1);
}
/**
* Uses the server instance to emit a `preloadCollection` event to signal
* to interested plugins that a collection can be preloaded.
*
* NOTE: this can be emitted several times, so ideally every plugin
* should cache what they need and check if a cache exists before
* re-fetching.
*/
public function collectionPreloadNotifier(PropFind $propFind, INode $node): bool {
if (!$this->shouldPreload($propFind, $node)) {
return true;
}
return $this->server->emit('preloadCollection', [$propFind, $node]);
}
private function shouldPreload(
PropFind $propFind,
INode $node,
): bool {
$depth = $propFind->getDepth();
return $node instanceof ICollection
&& ($depth === Server::DEPTH_INFINITY || $depth > 0);
}
}
+127
View File
@@ -7,7 +7,11 @@
*/
namespace OCA\DAV\Connector\Sabre;
use OC\DB\Connection;
use Override;
use Sabre\DAV\Exception;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Version;
use TypeError;
@@ -21,6 +25,15 @@ use TypeError;
class Server extends \Sabre\DAV\Server {
/** @var CachingTree $tree */
/**
* Tracks queries done by plugins.
* @var array<string, array<int, array<string, array{nodes:int,
* queries:int}>>> The keys represent: event name, depth and plugin name
*/
private array $pluginQueries = [];
public bool $debugEnabled = false;
/**
* @see \Sabre\DAV\Server
*/
@@ -30,6 +43,111 @@ class Server extends \Sabre\DAV\Server {
$this->enablePropfindDepthInfinity = true;
}
#[Override]
public function once(
string $eventName,
callable $callBack,
int $priority = 100,
): void {
$this->debugEnabled ? $this->monitorPropfindQueries(
parent::once(...),
...\func_get_args(),
) : parent::once(...\func_get_args());
}
#[Override]
public function on(
string $eventName,
callable $callBack,
int $priority = 100,
): void {
$this->debugEnabled ? $this->monitorPropfindQueries(
parent::on(...),
...\func_get_args(),
) : parent::on(...\func_get_args());
}
/**
* Wraps the handler $callBack into a query-monitoring function and calls
* $parentFn to register it.
*/
private function monitorPropfindQueries(
callable $parentFn,
string $eventName,
callable $callBack,
int $priority = 100,
): void {
$pluginName = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['class'] ?? 'unknown';
// The NotifyPlugin needs to be excluded as it emits the
// `preloadCollection` event, which causes many plugins run queries.
/** @psalm-suppress TypeDoesNotContainType */
if ($pluginName === PropFindPreloadNotifyPlugin::class || ($eventName !== 'propFind'
&& $eventName !== 'preloadCollection')) {
$parentFn($eventName, $callBack, $priority);
return;
}
// The \Sabre\DAVACL\Plugin needs to excluded as it relies on removeListener()
if ($pluginName === \Sabre\DAVACL\Plugin::class) {
$parentFn($eventName, $callBack, $priority);
return;
}
$callback = $this->getMonitoredCallback($callBack, $pluginName, $eventName);
$parentFn($eventName, $callback, $priority);
}
/**
* Returns a callable that wraps $callBack with code that monitors and
* records queries per plugin.
*/
private function getMonitoredCallback(
callable $callBack,
string $pluginName,
string $eventName,
): callable {
return function (PropFind $propFind, INode $node) use (
$callBack,
$pluginName,
$eventName,
): bool {
$connection = \OCP\Server::get(Connection::class);
$queriesBefore = $connection->getStats()['executed'];
$result = $callBack($propFind, $node);
$queriesAfter = $connection->getStats()['executed'];
$this->trackPluginQueries(
$pluginName,
$eventName,
$queriesAfter - $queriesBefore,
$propFind->getDepth()
);
// many callbacks don't care about returning a bool
return $result ?? true;
};
}
/**
* Tracks the queries executed by a specific plugin.
*/
private function trackPluginQueries(
string $pluginName,
string $eventName,
int $queriesExecuted,
int $depth,
): void {
// report only nodes which cause queries to the DB
if ($queriesExecuted === 0) {
return;
}
$this->pluginQueries[$eventName][$depth][$pluginName]['nodes']
= ($this->pluginQueries[$eventName][$depth][$pluginName]['nodes'] ?? 0) + 1;
$this->pluginQueries[$eventName][$depth][$pluginName]['queries']
= ($this->pluginQueries[$eventName][$depth][$pluginName]['queries'] ?? 0) + $queriesExecuted;
}
/**
*
* @return void
@@ -115,4 +233,13 @@ class Server extends \Sabre\DAV\Server {
$this->sapi->sendResponse($this->httpResponse);
}
}
/**
* Returns queries executed by registered plugins.
* @return array<string, array<int, array<string, array{nodes:int,
* queries:int}>>> The keys represent: event name, depth and plugin name
*/
public function getPluginQueries(): array {
return $this->pluginQueries;
}
}
+14 -2
View File
@@ -14,6 +14,7 @@ use OCA\DAV\CalDAV\DefaultCalendarValidator;
use OCA\DAV\CalDAV\Proxy\ProxyMapper;
use OCA\DAV\DAV\CustomPropertiesBackend;
use OCA\DAV\DAV\ViewOnlyPlugin;
use OCA\DAV\Db\PropertyMapper;
use OCA\DAV\Files\BrowserErrorPagePlugin;
use OCA\DAV\Files\Sharing\RootCollection;
use OCA\DAV\Upload\CleanupService;
@@ -27,6 +28,7 @@ use OCP\Files\IFilenameValidator;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IDBConnection;
use OCP\IGroupManager;
use OCP\IL10N;
@@ -68,6 +70,7 @@ class ServerFactory {
Plugin $authPlugin,
callable $viewCallBack,
): Server {
$debugEnabled = $this->config->getSystemValue('debug', false);
// Fire up server
if ($isPublicShare) {
$rootCollection = new SimpleCollection('root');
@@ -89,6 +92,12 @@ class ServerFactory {
));
$server->addPlugin(new AnonymousOptionsPlugin());
$server->addPlugin($authPlugin);
if ($debugEnabled) {
$server->debugEnabled = $debugEnabled;
$server->addPlugin(new PropFindMonitorPlugin());
}
$server->addPlugin(new PropFindPreloadNotifyPlugin());
// FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
$server->addPlugin(new DummyGetResponsePlugin());
$server->addPlugin(new ExceptionLoggerPlugin('webdav', $this->logger));
@@ -100,6 +109,7 @@ class ServerFactory {
$tree,
$this->logger,
$this->eventDispatcher,
\OCP\Server::get(IDateTimeZone::class),
));
// Some WebDAV clients do require Class 2 WebDAV support (locking), since
@@ -117,7 +127,8 @@ class ServerFactory {
}
// wait with registering these until auth is handled and the filesystem is setup
$server->on('beforeMethod:*', function () use ($server, $tree, $viewCallBack, $isPublicShare, $rootCollection): void {
$server->on('beforeMethod:*', function () use ($server, $tree,
$viewCallBack, $isPublicShare, $rootCollection, $debugEnabled): void {
// ensure the skeleton is copied
$userFolder = \OC::$server->getUserFolder();
@@ -181,7 +192,7 @@ class ServerFactory {
\OCP\Server::get(IFilenameValidator::class),
\OCP\Server::get(IAccountManager::class),
false,
!$this->config->getSystemValue('debug', false)
!$debugEnabled
)
);
$server->addPlugin(new QuotaPlugin($view));
@@ -220,6 +231,7 @@ class ServerFactory {
$tree,
$this->databaseConnection,
$this->userSession->getUser(),
\OCP\Server::get(PropertyMapper::class),
\OCP\Server::get(DefaultCalendarValidator::class),
)
)

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