Compare commits

...

95 Commits

Author SHA1 Message Date
Git'Fellow 049be105f4 fix(files_versions): Return if version entity is not found
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2025-09-11 12:26:59 +02:00
Nextcloud bot 7b85dacfd5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-11 00:13:48 +00:00
Ferdinand Thiessen 8a1471d176 Merge pull request #55013 from nextcloud/fix/dynamic-js-during-2fa
fix(auth): allow access to dynamic js files during 2FA
2025-09-10 23:48:26 +02:00
Ferdinand Thiessen d1314bf4b4 Merge pull request #55014 from nextcloud/feat/always-use-parent-name
feat(ZipFolderPlugin): always use the parent folder name as archive name
2025-09-10 23:08:44 +02:00
Nextcloud bot a464c332ac fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-10 19:34:37 +00:00
Ferdinand Thiessen 6dede68baa feat(ZipFolderPlugin): always use the parent folder name as archive name
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-09-10 21:10:01 +02:00
Andy Scherzinger 508da59c61 Merge pull request #55015 from nextcloud/fix/icon-size
fix(user-status): adjust user status icon size
2025-09-10 19:52:56 +02:00
Andy Scherzinger 1ecd73c0ea Merge pull request #55016 from nextcloud/bug/noid/update-transifex-link
fix: update transifex link
2025-09-10 19:44:49 +02:00
nextcloud-command ed8dfb1e2c chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-09-10 17:12:08 +00:00
Ferdinand Thiessen c44534e4f3 fix(user-status): adjust user status icon size
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-09-10 18:59:48 +02:00
Ferdinand Thiessen 6cdf098378 Merge pull request #54316 from nextcloud/feat/add-encryption-integration-tests
feat(encryption): Add integration tests for occ commands and fix them
2025-09-10 18:08:37 +02:00
Andy Scherzinger 36f7939c0b Merge pull request #54981 from nextcloud/dependabot/npm_and_yarn/vite-6.3.6
build(deps): bump vite from 6.3.5 to 6.3.6
2025-09-10 17:52:58 +02:00
Daniel Kesselberg 2ca848f017 fix: update transifex link
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2025-09-10 17:45:40 +02:00
Christoph Wurst 1c8be525f0 fix(auth): allow access to dynamic js files during 2FA
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2025-09-10 15:12:35 +02:00
Ferdinand Thiessen 62cbd20298 Merge pull request #54962 from nextcloud/chore/update-master-dbal
chore(deps): update `doctrine/dbal` to v3.10.2
2025-09-10 12:04:09 +02:00
Ferdinand Thiessen 5003a35a37 chore(deps): update doctrine/dbal to v3.10.2
* [ ] https://github.com/nextcloud/3rdparty/pull/2134
* Fixes the problem with MariaDB 11 and `vector` keyword, see https://github.com/nextcloud/recognize/issues/1352

| Production Changes | From  | To      | Compare                                                        |
|--------------------|-------|---------|----------------------------------------------------------------|
| doctrine/cache     | 2.2.0 | REMOVED |                                                                |
| doctrine/dbal      | 3.9.4 | 3.10.2  | [...](https://github.com/doctrine/dbal/compare/3.9.4...3.10.2) |

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-09-10 11:11:19 +02:00
Andy Scherzinger 3fdc7a9470 Merge pull request #54992 from nextcloud/automated/noid/master-update-ca-cert-bundle
[master] fix(security): Update CA certificate bundle
2025-09-10 09:13:48 +02:00
Kate da73cc8950 Merge pull request #54919 from nextcloud/info-file-size-warning-false 2025-09-10 07:50:43 +02:00
nextcloud-command 5de9502b55 fix(security): Update CA certificate bundle
Signed-off-by: GitHub <noreply@github.com>
2025-09-10 02:32:22 +00:00
dependabot[bot] 35a3e0857c build(deps): bump vite from 6.3.5 to 6.3.6
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.5 to 6.3.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 02:10:19 +00:00
Nextcloud bot 655602c9fa fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-10 00:13:54 +00:00
Ferdinand Thiessen 016f2ffe6c Merge pull request #48197 from nextcloud/chore/remove-ijob-execute
chore: Remove deprecated `IJob::execute` method
2025-09-09 16:37:35 +02:00
Benjamin Gaussorgues 49a0259cce Merge pull request #54968 from nextcloud/feat/avoid_array_merge 2025-09-09 16:33:13 +02:00
Côme Chilliet ac2c4ecb52 Merge pull request #54653 from nextcloud/fix/fix-internal-error-on-wrong-account-mail-verify
fix: Avoid internal error when logging in with the wrong account to verify email address
2025-09-09 15:48:35 +02:00
Kate c0dc179c8e Merge pull request #54950 from nextcloud/fix/files_trashbin/size-propagation 2025-09-09 15:36:32 +02:00
Kate 6848dcc2ae Merge pull request #54869 from nextcloud/carl/profiler-link-occ 2025-09-09 14:55:06 +02:00
provokateurin b36af651fd fix(files_trashbin): Fix size propagation when moving file to trash
Signed-off-by: provokateurin <kate@provokateurin.de>
2025-09-09 13:39:08 +02:00
Côme Chilliet 8330f149b0 chore(encryption): Remove unused attribute $uid in KeyManager::getFileKey
It’s a private API in the application, no need to keep an unused
 attribute.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:28 +02:00
Côme Chilliet bfcb2690f4 chore: Improve wording of logged error in apps/encryption/lib/KeyManager.php
Co-authored-by: Louis <louis@chmn.me>
Signed-off-by: Côme Chilliet <91878298+come-nc@users.noreply.github.com>
2025-09-09 11:46:19 +02:00
Côme Chilliet bc5e29f9f2 fix(tests): Fix type issues and other problems with encryption tests
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:18 +02:00
Côme Chilliet 14d6945054 fix(encryption): Take encryption enabled status into account
shouldEncrypt now returns false for all paths if encryption is disabled.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:18 +02:00
Côme Chilliet 12532bb535 fix(encryption): Correctly set encrypted to 0 when copying
If encryption got disabled, copying should set encrypted to 0 for the
 new unencrypted copy. For instance when using encryption:decrypt-all

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:18 +02:00
Côme Chilliet 94254db001 chore(encryption): Cleanup typing in EncryptAll/DecryptAll
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:18 +02:00
Côme Chilliet 7ac0856f9f chore(tests): Adapt encryption tests to code changes
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:18 +02:00
Côme Chilliet b74c7538ac fix(encryption): Do not depend upon user in session unless really necessary
Should fix a bunch of stuff when encryption listener is triggered by events from occ commands or background jobs

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:17 +02:00
Côme Chilliet 55ad42ad95 feat(encryption): Add integration tests for occ commands
Add tests for encrypt-all and decrypt-all.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-09 11:46:10 +02:00
Kate 966b880986 Merge pull request #54822 from nextcloud/jtr/refactor-conf-sample 2025-09-09 11:23:04 +02:00
Benjamin Gaussorgues 855152110f perf(mounts): avoid array_merge in mounts loop
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2025-09-09 10:51:37 +02:00
dependabot[bot] b3200be621 Merge pull request #54897 from nextcloud/dependabot/npm_and_yarn/libphonenumber-js-1.12.15 2025-09-09 07:30:41 +00:00
nextcloud-command 4638b51eae chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-09-09 07:11:11 +00:00
dependabot[bot] cf9386a3ce build(deps): bump libphonenumber-js from 1.12.13 to 1.12.15
Bumps [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) from 1.12.13 to 1.12.15.
- [Changelog](https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/libphonenumber-js/compare/v1.12.13...v1.12.15)

---
updated-dependencies:
- dependency-name: libphonenumber-js
  dependency-version: 1.12.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-09 09:01:43 +02:00
dependabot[bot] de5acb0b99 Merge pull request #54927 from nextcloud/dependabot/composer/vendor-bin/rector/rector/rector-2.1.6 2025-09-09 06:06:06 +00:00
dependabot[bot] 42a14dac4f Merge pull request #54924 from nextcloud/dependabot/npm_and_yarn/puppeteer-24.19.0 2025-09-09 06:01:34 +00:00
Kate d32b54dc17 Merge pull request #54957 from nextcloud/fix/remove-removed-script 2025-09-09 07:49:59 +02:00
Kate 6d9828dec0 Merge pull request #54954 from nextcloud/refactor/md5 2025-09-09 07:44:50 +02:00
Nextcloud bot 266a349d0c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-09 00:15:27 +00:00
nextcloud-command 3844927f8f chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-09-08 21:35:06 +00:00
dependabot[bot] ef9f69f308 chore(deps-dev): bump puppeteer from 24.17.0 to 24.19.0
Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 24.17.0 to 24.19.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.17.0...puppeteer-v24.19.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 21:18:06 +00:00
dependabot[bot] 2ce11fcb7c Merge pull request #54925 from nextcloud/dependabot/npm_and_yarn/msw-2.11.1 2025-09-08 21:06:10 +00:00
dependabot[bot] 51b9eaae1d Merge pull request #54926 from nextcloud/dependabot/npm_and_yarn/zip.js/zip.js-2.7.73 2025-09-08 20:55:00 +00:00
Andy Scherzinger 5013efd75e Merge pull request #54922 from nextcloud/info-file-object-instance
feat: show object store instance in info:file
2025-09-08 22:45:29 +02:00
Ferdinand Thiessen 9618b402ce fix: remove loading removed script
* ref: https://github.com/nextcloud/server/pull/54656

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-09-08 21:44:54 +02:00
Ferdinand Thiessen 23c2df0d50 Merge pull request #54951 from nextcloud/fix/node-limit-mib
fix: calculate node limit using MiB instead of MB
2025-09-08 17:58:38 +02:00
Ferdinand Thiessen b613bb26bd refactor: remove global md5 and replace other use cases with common depenency
1. By replacing `blueimp-md5` with `crypto-browserify` we reduce the
   dependencies because the latter one is already used by `@nextcloud/upload`.
2. Drop the global `md5` as the changed implementation would need a wrapper,
   but its also not used anymore and deprecated since Nextcloud 20.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-09-08 17:48:53 +02:00
Louis c8eeade151 Merge pull request #52825 from nextcloud/artonge/feat/files_trashbin_parallel_expire_job 2025-09-08 15:53:49 +02:00
Kate af172b3ec3 Merge pull request #54920 from nextcloud/object-store-unique-buckets-names 2025-09-08 15:23:39 +02:00
Richard Steinmetz 05613984bb fix: calculate node limit using MiB instead of MB
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-09-08 15:11:05 +02:00
Louis Chemineau 9b5d11845a feat(files_trashbin): Refactor expire background job to support parallel run
- Follow-up of #51600

The original PR introduced the possibility to continue an `ExpireTrash` job by saving the offset. This was to prevent having to start over the whole user list when the job crashed or was killed.

But on big instances, one process is not enough to go through all the users in a timely manner. Supporting parallel run allows covering more ground faster.

This PR introduced this possibility. We are now storing the offset right away to allow another parallel job to pick up the task at that point. We are arbitrarily cutting the user list in chunk of 10 to not drastically overflow the 30 minutes time limit.

Signed-off-by: Louis Chemineau <louis@chmn.me>
2025-09-08 12:33:25 +02:00
Louis 491c64de57 Merge pull request #54565 from nextcloud/artonge/feat/support_template_in_public_shares 2025-09-08 12:23:34 +02:00
Côme Chilliet e0e093fcde fix: Use HintException instead of InvalidArgumentException
To carry translated error messages intended for the end user,
 HintException is the correct class.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-08 11:44:25 +02:00
Côme Chilliet 6d72ca74f7 fix: Avoid internal error when logging in with the wrong account to verify email address
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-09-08 11:44:25 +02:00
Louis bfb5db8f21 Merge pull request #54918 from invario/fix-preview-sparse-file 2025-09-08 11:21:56 +02:00
Côme Chilliet f2ee9ec294 Merge pull request #54941 from nextcloud/fix/redis-unix-socket-port-zero
fix(cache): Set default Redis port to `0` for UNIX sockets
2025-09-08 11:11:42 +02:00
Nextcloud bot eda72da5ae fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-08 00:13:34 +00:00
Josh 3a8b2b843e fix(cache): Set default Redis port to 0 for UNIX sockets
When using phpredis with a UNIX socket, the port should either not be specified at all or be `<1`. 

https://github.com/phpredis/phpredis?tab=readme-ov-file#connect-open

https://github.com/phpredis/phpredis/blob/d0b0c5cfdde9d49a265ca4bf7184e3998863aed0/library.c#L3332-L3334

Fixes #54813

Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-09-07 14:30:34 -04:00
Nextcloud bot e7aec5820e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-07 00:14:40 +00:00
dependabot[bot] 809626ec50 chore(deps-dev): bump rector/rector in /vendor-bin/rector
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.1.4 to 2.1.6.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.1.4...2.1.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 01:12:15 +00:00
dependabot[bot] a99101f1a2 chore(deps-dev): bump @zip.js/zip.js from 2.7.72 to 2.7.73
Bumps [@zip.js/zip.js](https://github.com/gildas-lormeau/zip.js) from 2.7.72 to 2.7.73.
- [Release notes](https://github.com/gildas-lormeau/zip.js/releases)
- [Commits](https://github.com/gildas-lormeau/zip.js/compare/v2.7.72...v2.7.73)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 01:03:30 +00:00
dependabot[bot] 982c4b7aec chore(deps-dev): bump msw from 2.10.5 to 2.11.1
Bumps [msw](https://github.com/mswjs/msw) from 2.10.5 to 2.11.1.
- [Release notes](https://github.com/mswjs/msw/releases)
- [Changelog](https://github.com/mswjs/msw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mswjs/msw/compare/v2.10.5...v2.11.1)

---
updated-dependencies:
- dependency-name: msw
  dependency-version: 2.11.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 01:03:11 +00:00
Nextcloud bot 2d63296046 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-06 00:13:33 +00:00
Robin Appelman 0c1d5e8c54 fix: ensure all object store configuration have distict bucket names
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-09-05 18:45:32 +02:00
Robin Appelman 29cb19da80 feat: show object store instance in info:file
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-09-05 18:39:38 +02:00
Robin Appelman 7e01665f93 fix: don't show object size warning if we can't determine the object size
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-09-05 18:01:43 +02:00
invario ba51caf5f4 Fix(previews): prevent infinite loop in case of bad video file
Signed-off-by: invario <67800603+invario@users.noreply.github.com>
2025-09-05 09:32:37 -04:00
Kate acb26a4507 Merge pull request #54914 from nextcloud/test/binary-finder/portability 2025-09-05 15:09:24 +02:00
Louis Chemineau 1d91e40fe8 feat: Support limit argument in getSeenUsers
Signed-off-by: Louis Chemineau <louis@chmn.me>
2025-09-05 12:45:38 +02:00
Julien Veyssier 2908f7602a Merge pull request #54848 from nextcloud/enh/noid/taskprocessing-get-task-type-ids
Add task processing manager method to get the list of available task type IDs
2025-09-05 12:10:30 +02:00
Julien Veyssier 1775c94e4a feat(taskprocessing): add tests for getAvailableTaskTypeIds
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-09-05 11:37:35 +02:00
Julien Veyssier 8c447eaba6 feat(taskprocessing): add manager method to get the list of available task type IDs
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-09-05 11:37:34 +02:00
Louis 05b4403354 Merge pull request #53952 from invario/preview-sparse-file 2025-09-05 11:05:54 +02:00
invario 97a0dde160 feat(previews): previews and tests for large remote videos w/o full download
Co-authored-by: Kate <26026535+provokateurin@users.noreply.github.com>
Co-authored-by: Côme Chilliet <91878298+come-nc@users.noreply.github.com>
Signed-off-by: invario <67800603+invario@users.noreply.github.com>
2025-09-05 10:08:19 +02:00
provokateurin e391e50446 test(BinaryFinder): Make sure the test is portable between systems
Signed-off-by: provokateurin <kate@provokateurin.de>
2025-09-05 09:47:47 +02:00
Nextcloud bot 39dc1dfd41 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-05 00:13:47 +00:00
Ferdinand Thiessen 6a0d4f33a8 Merge pull request #54534 from nextcloud/fix/dispatcher/catch-type-errors-bad-request
fix(Dispatcher): Catch TypeErrors and turn them into bad request responses
2025-09-05 01:24:54 +02:00
Andy Scherzinger 3f5c2cdd88 Merge pull request #54645 from nextcloud/carl/modernize-custom-property-backend
refactor(CustomPropertiesBackend): Modernize class
2025-09-05 01:06:21 +02:00
provokateurin 9473f47c0d fix(Dispatcher): Catch TypeErrors and turn them into bad request responses
Signed-off-by: provokateurin <kate@provokateurin.de>
2025-09-05 00:49:23 +02:00
Daniel b3f29e1039 Merge pull request #54907 from nextcloud/haze-2.1.2
chore(flake): update haze to 2.1.2
2025-09-04 21:02:58 +02:00
Robin Appelman b611fd9e35 chore(flake): update haze to 2.1.2
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-09-04 18:06:49 +02:00
Ferdinand Thiessen 89896b1d89 chore: Remove deprecated IJob::execute method
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-09-04 17:48:26 +02:00
nextcloud-command 10d0d0fcbc chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-09-04 12:20:01 +00:00
Louis Chemineau 6d672c4cba fix(encryption): Correctly set encrypted to 0 when copying
If encryption got disabled, copying should set encrypted to 0 for the
 new unencrypted copy. For instance when using encryption:decrypt-all

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
Signed-off-by: Louis Chemineau <louis@chmn.me>
2025-09-04 12:13:45 +00:00
Carl Schwan 41fe5d4e29 feat(occ): Add profiler link after occ output
Enable easy access to the profile when the profiler app is enabled.

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-09-04 11:34:50 +02:00
Carl Schwan b303185126 refactor(CustomPropertiesBackend): Modernize class
- Use query builder
- Add chunking
- Add type hinting where we can
- Use match expression

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-09-03 14:28:26 +02:00
Josh 98676f3e61 chore': drop config/ exclude .php-cs-fixer.dist.php
Signed-off-by: Josh <josh.t.richards@gmail.com>
2025-09-02 15:21:01 -04:00
Josh Richards 76fddf76f3 chore(config.sample.php): apply Nc coding standard
Signed-off-by: Josh Richards <josh.t.richards@gmail.com>
2025-09-02 10:21:33 -04:00
524 changed files with 8434 additions and 4746 deletions
+8 -5
View File
@@ -14,11 +14,14 @@ $config = new Config();
$config
->setParallelConfig(ParallelConfigFactory::detect())
->getFinder()
->exclude('config')
->exclude('3rdparty')
->exclude('build/stubs')
->exclude('composer')
->in(__DIR__);
->in(__DIR__)
->exclude([
'3rdparty',
'build/stubs',
'composer',
])
;
$ignoredEntries = shell_exec('git status --porcelain --ignored ' . escapeshellarg(__DIR__));
$ignoredEntries = explode("\n", $ignoredEntries);
+1 -1
View File
@@ -250,7 +250,7 @@ SPDX-FileCopyrightText = "2023 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
[[annotations]]
path = "apps/dav/lib/ExampleContentFiles/exampleContact.vcf"
path = ["apps/dav/lib/ExampleContentFiles/exampleContact.vcf", "tests/data/testvideo-remote-file.mp4"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2025 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
+2 -2
View File
@@ -1,7 +1,7 @@
OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "حسابرسی / ورود به سیستم",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیت‌های ثبت‌نام را برای نکست‌کلود فراهم می‌کند، مانند ثبت دسترسی به فایل‌ها یا اقدامات حساس دیگر."
"Auditing / Logging" : "حسابرسی / گزارش‌گیری",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیت‌های گزارش‌گیری مانند ثبت گزارش دسترسی به پرونده‌ها یا اقدامات حساس دیگر را برای نکست‌کلود فراهم می‌کند."
},
"nplurals=2; plural=(n > 1);");
+2 -2
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "حسابرسی / ورود به سیستم",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیت‌های ثبت‌نام را برای نکست‌کلود فراهم می‌کند، مانند ثبت دسترسی به فایل‌ها یا اقدامات حساس دیگر."
"Auditing / Logging" : "حسابرسی / گزارش‌گیری",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیت‌های گزارش‌گیری مانند ثبت گزارش دسترسی به پرونده‌ها یا اقدامات حساس دیگر را برای نکست‌کلود فراهم می‌کند."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}
+2 -2
View File
@@ -13,9 +13,9 @@ OC.L10N.register(
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Du blev nævnt på \"{file}\", i en kommentar af en konto, som siden er blevet slettet",
"{user} mentioned you in a comment on \"{file}\"" : "{user} nævnte dig i en kommentar til \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin til at tilføje kommentarer til filer",
"Edit comment" : "Rediger kommentar",
"Edit comment" : "Redigér kommentar",
"Delete comment" : "Slet kommentar",
"Cancel edit" : "Annuller redigering",
"Cancel edit" : "Annullér redigering",
"New comment" : "Ny kommentar",
"Write a comment …" : "Skriv kommentar…",
"Post comment" : "Skriv kommentar",
+2 -2
View File
@@ -11,9 +11,9 @@
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Du blev nævnt på \"{file}\", i en kommentar af en konto, som siden er blevet slettet",
"{user} mentioned you in a comment on \"{file}\"" : "{user} nævnte dig i en kommentar til \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin til at tilføje kommentarer til filer",
"Edit comment" : "Rediger kommentar",
"Edit comment" : "Redigér kommentar",
"Delete comment" : "Slet kommentar",
"Cancel edit" : "Annuller redigering",
"Cancel edit" : "Annullér redigering",
"New comment" : "Ny kommentar",
"Write a comment …" : "Skriv kommentar…",
"Post comment" : "Skriv kommentar",
+4 -4
View File
@@ -10,7 +10,7 @@ OC.L10N.register(
"{author} commented on {file}" : "{author} a commenté sur {file}",
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> sur les fichiers",
"Files" : "Fichiers",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné·e dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
"{user} mentioned you in a comment on \"{file}\"" : "{user} vous a mentionné dans un commentaire sur « {file} »",
"Files app plugin to add comments to files" : "Plugin Fichiers app pour ajouter des commentaires aux fichiers",
"Edit comment" : "Modifier le commentaire",
@@ -28,9 +28,9 @@ OC.L10N.register(
"Retry" : "Réessayer",
"_1 new comment_::_{unread} new comments_" : ["1 nouveau commentaire","{unread} nouveaux commentaires","{unread} nouveaux commentaires"],
"Comment" : "Commenter",
"An error occurred while trying to edit the comment" : "Une erreur s'est produite lors de la tentative de modification du commentaire",
"An error occurred while trying to edit the comment" : "Une erreur est survenue lors de la tentative de modification du commentaire",
"Comment deleted" : "Commentaire supprimé",
"An error occurred while trying to delete the comment" : "Une erreur s'est produite lors de la tentative de suppression du commentaire",
"An error occurred while trying to create the comment" : "Une erreur s'est produite lors de la tentative de création du commentaire"
"An error occurred while trying to delete the comment" : "Une erreur est survenue lors de la tentative de suppression du commentaire",
"An error occurred while trying to create the comment" : "Une erreur est survenue lors de la tentative de création du commentaire"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+4 -4
View File
@@ -8,7 +8,7 @@
"{author} commented on {file}" : "{author} a commenté sur {file}",
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> sur les fichiers",
"Files" : "Fichiers",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné·e dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
"{user} mentioned you in a comment on \"{file}\"" : "{user} vous a mentionné dans un commentaire sur « {file} »",
"Files app plugin to add comments to files" : "Plugin Fichiers app pour ajouter des commentaires aux fichiers",
"Edit comment" : "Modifier le commentaire",
@@ -26,9 +26,9 @@
"Retry" : "Réessayer",
"_1 new comment_::_{unread} new comments_" : ["1 nouveau commentaire","{unread} nouveaux commentaires","{unread} nouveaux commentaires"],
"Comment" : "Commenter",
"An error occurred while trying to edit the comment" : "Une erreur s'est produite lors de la tentative de modification du commentaire",
"An error occurred while trying to edit the comment" : "Une erreur est survenue lors de la tentative de modification du commentaire",
"Comment deleted" : "Commentaire supprimé",
"An error occurred while trying to delete the comment" : "Une erreur s'est produite lors de la tentative de suppression du commentaire",
"An error occurred while trying to create the comment" : "Une erreur s'est produite lors de la tentative de création du commentaire"
"An error occurred while trying to delete the comment" : "Une erreur est survenue lors de la tentative de suppression du commentaire",
"An error occurred while trying to create the comment" : "Une erreur est survenue lors de la tentative de création du commentaire"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+1 -1
View File
@@ -4,7 +4,7 @@ OC.L10N.register(
"Dashboard" : "Панэль кіравання",
"Dashboard app" : "Праграма Панэль кіравання",
"Weather" : "Надвор'е",
"Status" : "Стан",
"Status" : "Статус",
"Good morning" : "Добрай раніцы",
"Good morning, {name}" : "Добрай раніцы, {name}",
"Good afternoon" : "Добры дзень",
+1 -1
View File
@@ -2,7 +2,7 @@
"Dashboard" : "Панэль кіравання",
"Dashboard app" : "Праграма Панэль кіравання",
"Weather" : "Надвор'е",
"Status" : "Стан",
"Status" : "Статус",
"Good morning" : "Добрай раніцы",
"Good morning, {name}" : "Добрай раніцы, {name}",
"Good afternoon" : "Добры дзень",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Widgets bearbeiten",
"Get more widgets from the App Store" : "Hole dir weitere Widgets aus dem App-Store",
"Weather service" : "Wetterdienst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu deinem Datenschutz werden die Wetterdaten von deinem {productName}-Server für dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
"Weather data from Met.no" : "Wetterdaten von Met.no",
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Widgets bearbeiten",
"Get more widgets from the App Store" : "Hole dir weitere Widgets aus dem App-Store",
"Weather service" : "Wetterdienst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu deinem Datenschutz werden die Wetterdaten von deinem {productName}-Server für dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
"Weather data from Met.no" : "Wetterdaten von Met.no",
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Widgets bearbeiten",
"Get more widgets from the App Store" : "Holen Sie sich weitere Widgets aus dem App-Store",
"Weather service" : "Wetterdienst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu Ihrem Datenschutz werden die Wetterdaten von Ihrem {productName}-Server für Sie angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
"Weather data from Met.no" : "Wetterdaten von Met.no",
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Widgets bearbeiten",
"Get more widgets from the App Store" : "Holen Sie sich weitere Widgets aus dem App-Store",
"Weather service" : "Wetterdienst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu Ihrem Datenschutz werden die Wetterdaten von Ihrem {productName}-Server für Sie angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
"Weather data from Met.no" : "Wetterdaten von Met.no",
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Edit widgets",
"Get more widgets from the App Store" : "Get more widgets from the App Store",
"Weather service" : "Weather service",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information.",
"Weather data from Met.no" : "Weather data from Met.no",
"geocoding with Nominatim" : "geocoding with Nominatim",
"elevation data from OpenTopoData" : "elevation data from OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Edit widgets",
"Get more widgets from the App Store" : "Get more widgets from the App Store",
"Weather service" : "Weather service",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information.",
"Weather data from Met.no" : "Weather data from Met.no",
"geocoding with Nominatim" : "geocoding with Nominatim",
"elevation data from OpenTopoData" : "elevation data from OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Editar widgets",
"Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps",
"Weather service" : "Servicio meteorológico",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para su privacidad, los datos meteorológicos son solicitados por su servidor {productName} en su nombre, de tal forma que el servicio no reciba información personal.",
"Weather data from Met.no" : "Datos meteorológicos de Met.no",
"geocoding with Nominatim" : "geocoding con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Editar widgets",
"Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps",
"Weather service" : "Servicio meteorológico",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para su privacidad, los datos meteorológicos son solicitados por su servidor {productName} en su nombre, de tal forma que el servicio no reciba información personal.",
"Weather data from Met.no" : "Datos meteorológicos de Met.no",
"geocoding with Nominatim" : "geocoding con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Muuda vidinaid",
"Get more widgets from the App Store" : "Rakenduste Poest leiad veel vidinaid",
"Weather service" : "Ilmateenus",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Sinu privaatsuse huvides küsib su nimel ilmaandmeid {productName}i server, nii et ilmateenistus ei saa sinu kohta isiklikku teavet.",
"Weather data from Met.no" : "Met.no ilmaennustus",
"geocoding with Nominatim" : "geoprogrammeerimine Nominatimiga",
"elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Muuda vidinaid",
"Get more widgets from the App Store" : "Rakenduste Poest leiad veel vidinaid",
"Weather service" : "Ilmateenus",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Sinu privaatsuse huvides küsib su nimel ilmaandmeid {productName}i server, nii et ilmateenistus ei saa sinu kohta isiklikku teavet.",
"Weather data from Met.no" : "Met.no ilmaennustus",
"geocoding with Nominatim" : "geoprogrammeerimine Nominatimiga",
"elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Editatu trepetak",
"Get more widgets from the App Store" : "Lortu trepeta (widget) gehiago Aplikazioen Dendatik",
"Weather service" : "Eguraldi zerbitzua",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zure pribatutasunerako, eguraldiaren datuak zure {productName}zerbitzariak eskatzen ditu zure izenean, beraz, meteorologia zerbitzuak ez du informazio pertsonalik jasotzen.",
"Weather data from Met.no" : "Met.no-ko eguraldiaren datuak",
"geocoding with Nominatim" : "geokodetzea Nominatim-ekin",
"elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Editatu trepetak",
"Get more widgets from the App Store" : "Lortu trepeta (widget) gehiago Aplikazioen Dendatik",
"Weather service" : "Eguraldi zerbitzua",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zure pribatutasunerako, eguraldiaren datuak zure {productName}zerbitzariak eskatzen ditu zure izenean, beraz, meteorologia zerbitzuak ez du informazio pertsonalik jasotzen.",
"Weather data from Met.no" : "Met.no-ko eguraldiaren datuak",
"geocoding with Nominatim" : "geokodetzea Nominatim-ekin",
"elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Modifier les widgets",
"Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin dapplications",
"Weather service" : "Service météo",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Afin de protéger votre vie privée, les données météorologiques sont demandées par votre serveur {productName} à votre place afin que le service météo ne reçoive aucune information personnelle.",
"Weather data from Met.no" : "Données météo fournies par Met.no",
"geocoding with Nominatim" : "Géocodage avec Nominatim",
"elevation data from OpenTopoData" : "Données daltitude provenant dOpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Modifier les widgets",
"Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin dapplications",
"Weather service" : "Service météo",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Afin de protéger votre vie privée, les données météorologiques sont demandées par votre serveur {productName} à votre place afin que le service météo ne reçoive aucune information personnelle.",
"Weather data from Met.no" : "Données météo fournies par Met.no",
"geocoding with Nominatim" : "Géocodage avec Nominatim",
"elevation data from OpenTopoData" : "Données daltitude provenant dOpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Cuir giuirléidí in eagar",
"Get more widgets from the App Store" : "Faigh tuilleadh giuirléidí ón Siopa Aip",
"Weather service" : "Seirbhís aimsire",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ar mhaithe le do phríobháideacht, iarrann do fhreastalaí {productName} na sonraí aimsire ar do shon agus mar sin ní fhaigheann an tseirbhís aimsire aon fhaisnéis phearsanta.",
"Weather data from Met.no" : "Sonraí aimsire ó Met.no",
"geocoding with Nominatim" : "geochódú le Nominatim",
"elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Cuir giuirléidí in eagar",
"Get more widgets from the App Store" : "Faigh tuilleadh giuirléidí ón Siopa Aip",
"Weather service" : "Seirbhís aimsire",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ar mhaithe le do phríobháideacht, iarrann do fhreastalaí {productName} na sonraí aimsire ar do shon agus mar sin ní fhaigheann an tseirbhís aimsire aon fhaisnéis phearsanta.",
"Weather data from Met.no" : "Sonraí aimsire ó Met.no",
"geocoding with Nominatim" : "geochódú le Nominatim",
"elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Editar trebellos",
"Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións",
"Weather service" : "Servizo meteorolóxico",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de {productName} solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
"Weather data from Met.no" : "Datos meteorolóxicos de Met.no",
"geocoding with Nominatim" : "xeocodificación con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Editar trebellos",
"Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións",
"Weather service" : "Servizo meteorolóxico",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de {productName} solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
"Weather data from Met.no" : "Datos meteorolóxicos de Met.no",
"geocoding with Nominatim" : "xeocodificación con Nominatim",
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Edytuj widżety",
"Get more widgets from the App Store" : "Pobierz więcej widżetów z Nextcloud App Store",
"Weather service" : "Serwis pogodowy",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Dla ochrony Twojej prywatności dane pogodowe są pobierane w Twoim imieniu przez serwer {productName}, dzięki czemu usługa pogodowa nie otrzymuje żadnych danych osobowych.",
"Weather data from Met.no" : "Dane pogodowe z Met.no",
"geocoding with Nominatim" : "geokodowanie z Nominatim",
"elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Edytuj widżety",
"Get more widgets from the App Store" : "Pobierz więcej widżetów z Nextcloud App Store",
"Weather service" : "Serwis pogodowy",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Dla ochrony Twojej prywatności dane pogodowe są pobierane w Twoim imieniu przez serwer {productName}, dzięki czemu usługa pogodowa nie otrzymuje żadnych danych osobowych.",
"Weather data from Met.no" : "Dane pogodowe z Met.no",
"geocoding with Nominatim" : "geokodowanie z Nominatim",
"elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Editar widgets",
"Get more widgets from the App Store" : "Obtenha mais widgets na Loja de Aplicativos",
"Weather service" : "Serviço de Clima",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para sua privacidade, os dados meteorológicos são solicitados pelo seu servidor {productName} em seu nome, para que o serviço meteorológico não receba nenhuma informação pessoal.",
"Weather data from Met.no" : "Dados de Tempo do Met.no",
"geocoding with Nominatim" : "geocodificado com Nominatim",
"elevation data from OpenTopoData" : "dados topográficos de OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Editar widgets",
"Get more widgets from the App Store" : "Obtenha mais widgets na Loja de Aplicativos",
"Weather service" : "Serviço de Clima",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para sua privacidade, os dados meteorológicos são solicitados pelo seu servidor {productName} em seu nome, para que o serviço meteorológico não receba nenhuma informação pessoal.",
"Weather data from Met.no" : "Dados de Tempo do Met.no",
"geocoding with Nominatim" : "geocodificado com Nominatim",
"elevation data from OpenTopoData" : "dados topográficos de OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Уређивање виџета",
"Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација",
"Weather service" : "Метео сервис",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева {productName} сервер, тако да се метеоролошком сервису не шаљу лични подаци.",
"Weather data from Met.no" : "Метеоролошки подаци са Met.no",
"geocoding with Nominatim" : "геокодирање са Nominatim",
"elevation data from OpenTopoData" : "висински подаци са OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Уређивање виџета",
"Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација",
"Weather service" : "Метео сервис",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева {productName} сервер, тако да се метеоролошком сервису не шаљу лични подаци.",
"Weather data from Met.no" : "Метеоролошки подаци са Met.no",
"geocoding with Nominatim" : "геокодирање са Nominatim",
"elevation data from OpenTopoData" : "висински подаци са OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Ändra widgetar",
"Get more widgets from the App Store" : "Hämta fler widgetar från Appstore",
"Weather service" : "Vädertjänst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "För din integritet begär din {productName}-server väderdata å dina vägnar, så vädertjänsten får ingen personlig information.",
"Weather data from Met.no" : "Väderdata från Met.no",
"geocoding with Nominatim" : "geokodning med Nominatim",
"elevation data from OpenTopoData" : "höjddata från OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Ändra widgetar",
"Get more widgets from the App Store" : "Hämta fler widgetar från Appstore",
"Weather service" : "Vädertjänst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "För din integritet begär din {productName}-server väderdata å dina vägnar, så vädertjänsten får ingen personlig information.",
"Weather data from Met.no" : "Väderdata från Met.no",
"geocoding with Nominatim" : "geokodning med Nominatim",
"elevation data from OpenTopoData" : "höjddata från OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Hariri wijeti",
"Get more widgets from the App Store" : "Pata wijeti zaidi kutoka kwenye hifadhi ya Programu",
"Weather service" : "Huduma ya hali ya hewa",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kwa faragha yako, data ya hali ya hewa inaombwa na seva yako ya {productName} kwa niaba yako ili huduma ya hali ya hewa isipokee taarifa za kibinafsi.",
"Weather data from Met.no" : "Data za hali ya hewa kutoka Met.no",
"geocoding with Nominatim" : "geocoding na Nominatim",
"elevation data from OpenTopoData" : "data ya mwinuko kutoka OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Hariri wijeti",
"Get more widgets from the App Store" : "Pata wijeti zaidi kutoka kwenye hifadhi ya Programu",
"Weather service" : "Huduma ya hali ya hewa",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kwa faragha yako, data ya hali ya hewa inaombwa na seva yako ya {productName} kwa niaba yako ili huduma ya hali ya hewa isipokee taarifa za kibinafsi.",
"Weather data from Met.no" : "Data za hali ya hewa kutoka Met.no",
"geocoding with Nominatim" : "geocoding na Nominatim",
"elevation data from OpenTopoData" : "data ya mwinuko kutoka OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "Pano bileşenlerini düzenle",
"Get more widgets from the App Store" : "Uygulama mağazasından başka pano bileşenleri alın",
"Weather service" : "Hava durumu",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kişisel gizliliğinizi korumak için {productName} sunucunuz hava durumu verilerini sizin adınıza ister. Böylece hava durumu hizmetine hiçbir kişisel bilgi aktarılmaz.",
"Weather data from Met.no" : "Hava durumu verileri Met.no tarafından sağlanıyor",
"geocoding with Nominatim" : "Nominatim ile coğrafi kodlama",
"elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "Pano bileşenlerini düzenle",
"Get more widgets from the App Store" : "Uygulama mağazasından başka pano bileşenleri alın",
"Weather service" : "Hava durumu",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kişisel gizliliğinizi korumak için {productName} sunucunuz hava durumu verilerini sizin adınıza ister. Böylece hava durumu hizmetine hiçbir kişisel bilgi aktarılmaz.",
"Weather data from Met.no" : "Hava durumu verileri Met.no tarafından sağlanıyor",
"geocoding with Nominatim" : "Nominatim ile coğrafi kodlama",
"elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "编辑小部件",
"Get more widgets from the App Store" : "从应用商店获取更多小部件",
"Weather service" : "天气服务",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "为了保护您的隐私,您的 {productName} 服务器会代表您请求天气数据,因此天气服务不会收到任何个人信息。",
"Weather data from Met.no" : "天气数据来自 Met.no",
"geocoding with Nominatim" : "使用 Nominatim 地理编码",
"elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "编辑小部件",
"Get more widgets from the App Store" : "从应用商店获取更多小部件",
"Weather service" : "天气服务",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "为了保护您的隐私,您的 {productName} 服务器会代表您请求天气数据,因此天气服务不会收到任何个人信息。",
"Weather data from Met.no" : "天气数据来自 Met.no",
"geocoding with Nominatim" : "使用 Nominatim 地理编码",
"elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "編輯小工具",
"Get more widgets from the App Store" : "從 App Store 取得更多小工具",
"Weather service" : "天氣服務",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
"Weather data from Met.no" : "氣象資訊來自 Met.no",
"geocoding with Nominatim" : "使用 Nominatim 來進行地理編碼",
"elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "編輯小工具",
"Get more widgets from the App Store" : "從 App Store 取得更多小工具",
"Weather service" : "天氣服務",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
"Weather data from Met.no" : "氣象資訊來自 Met.no",
"geocoding with Nominatim" : "使用 Nominatim 來進行地理編碼",
"elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料",
+1
View File
@@ -20,6 +20,7 @@ OC.L10N.register(
"Edit widgets" : "編輯小工具",
"Get more widgets from the App Store" : "從應用程式商店取得更多小工具",
"Weather service" : "天氣服務",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 伺服器會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
"Weather data from Met.no" : "氣象資訊來自 Met.no",
"geocoding with Nominatim" : "地理編碼使用 Nominatim",
"elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData",
+1
View File
@@ -18,6 +18,7 @@
"Edit widgets" : "編輯小工具",
"Get more widgets from the App Store" : "從應用程式商店取得更多小工具",
"Weather service" : "天氣服務",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 伺服器會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
"Weather data from Met.no" : "氣象資訊來自 Met.no",
"geocoding with Nominatim" : "地理編碼使用 Nominatim",
"elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData",
+16 -16
View File
@@ -75,17 +75,17 @@ OC.L10N.register(
"In the past on %1$s for the entire day" : "Tidligere den %1$s for hele dagen",
"_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Om et minut på %1$s for hele dagen","Om %n minutter den %1$s for hele dagen"],
"_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Om en time på %1$s for hele dagen","Om %n timer den %1$s for hele dagen"],
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["I en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["I en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["I en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["I et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Om en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Om en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Om en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Om et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
"In the past on %1$s between %2$s - %3$s" : "Tidligere den %1$s mellem %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_" : ["I et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %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_" : ["I en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %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_" : ["I en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %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_" : ["I en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %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_" : ["I en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["I et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %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_" : ["Om et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %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_" : ["Om en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %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_" : ["Om en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %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_" : ["Om en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %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_" : ["Om en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Om et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %2$s - %3$s"],
"Could not generate when statement" : "Kunne ikke generere when sætning",
"Every Day for the entire day" : "Hver dag hele dagen",
"Every Day for the entire day until %1$s" : "Hver dag hele dagen indtil %1$s",
@@ -123,14 +123,14 @@ OC.L10N.register(
"On specific dates for the entire day until %1$s" : "På specifikke datoer for hele dagen indtil %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "På specifikke datoer mellem %1$s - %2$s indtil %3$s",
"In the past on %1$s" : "Tidligere den %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["I et minut på %1$s","Om %n minutter den %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["I en time på %1$s","Om %n timer den %1$s"],
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Om et minut på %1$s","Om %n minutter den %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Om en time på %1$s","Om %n timer den %1$s"],
"_In a day on %1$s_::_In %n days on %1$s_" : ["I en dag på %1$s","Om %n dage den %1$s"],
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["I en uge på %1$s","Om %n uger den %1$s"],
"_In a month on %1$s_::_In %n months on %1$s_" : ["I en måned på %1$s","Om %n måneder den %1$s"],
"_In a year on %1$s_::_In %n years on %1$s_" : ["I et år på %1$s","Om %n år den %1$s"],
"In the past on %1$s then on %2$s" : "Tidligere på %1$s derefter den %2$s",
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["I et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Om et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["I en time på %1$s så på %2$s","Om %n timer den %1$s derefter den %2$s"],
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["I en dag på %1$s så på %2$s","Om %n dage den %1$s derefter den %2$s"],
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["I en uge på %1$s så på %2$s","Om %n uger den %1$s derefter den %2$s"],
@@ -251,7 +251,7 @@ OC.L10N.register(
"Due on %s by %s" : "Forfalder på %s til %s",
"Due on %s" : "Forfalder på %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Velkommen til Nextcloud kalendr!\n\nDette er en eksempelbegivenhed - undersøg fleksibiliteten i planlægningen med Nextcloud kalender ved at redigere i det du ønsker!\n\nMed Nextcloud kalender kan du:\n- Oprette, redigere, og styre begivenheder uden besvær.\n- Oprette multiple kalendere og dele dem med teammedlemmer, venner eller familie.\n- Kontrollere ledige tider og vise dine optagede tider til andre.\n- Uden besvær integrere med apps og apparater via CalDAV.\n- Brugerdefinere din oplevelse: planlægge gentagende begivenheder, justere notifikationer og andre indstillinger.",
"Example event - open me!" : "Eksempel begivnhed - åben mig!",
"Example event - open me!" : "Eksempel begivnhed - åbn mig!",
"System Address Book" : "System adressebog",
"The system address book contains contact information for all users in your instance." : "System adressebogen indeholder kontaktoplysninger for alle brugere i din instans.",
"Enable System Address Book" : "Aktivér System adressebog",
@@ -301,13 +301,13 @@ OC.L10N.register(
"Import contact" : "Importér kontakt",
"Reset to default" : "Nulstil",
"Import contacts" : "Importér kontakter",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf-fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
"Failed to save example event creation setting" : "Kunne ikke gemme eksempelbegivenhed oprettelsesindstilling",
"Failed to upload the example event" : "Kunne ikke uploade eksempelbegivenheden",
"Custom example event was saved successfully" : "Brugerdefineret eksempelbegivenhed blev gemt",
"Failed to delete the custom example event" : "Kunne ikke slette den brugerdefinerede eksempelbegivenhed",
"Custom example event was deleted successfully" : "Brugerdefineret eksempelbegivenhed blev slettet",
"Import calendar event" : "Importer kalenderbegivenhed",
"Import calendar event" : "Importér kalenderbegivenhed",
"Uploading a new event will overwrite the existing one." : "Upload af en ny begivenhed vil overskrive den eksisterende.",
"Upload event" : "Upload begivenhed",
"Availability" : "tilgængelighed",
+16 -16
View File
@@ -73,17 +73,17 @@
"In the past on %1$s for the entire day" : "Tidligere den %1$s for hele dagen",
"_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Om et minut på %1$s for hele dagen","Om %n minutter den %1$s for hele dagen"],
"_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Om en time på %1$s for hele dagen","Om %n timer den %1$s for hele dagen"],
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["I en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["I en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["I en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["I et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Om en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Om en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Om en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Om et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
"In the past on %1$s between %2$s - %3$s" : "Tidligere den %1$s mellem %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_" : ["I et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %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_" : ["I en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %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_" : ["I en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %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_" : ["I en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %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_" : ["I en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["I et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %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_" : ["Om et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %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_" : ["Om en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %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_" : ["Om en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %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_" : ["Om en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %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_" : ["Om en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Om et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %2$s - %3$s"],
"Could not generate when statement" : "Kunne ikke generere when sætning",
"Every Day for the entire day" : "Hver dag hele dagen",
"Every Day for the entire day until %1$s" : "Hver dag hele dagen indtil %1$s",
@@ -121,14 +121,14 @@
"On specific dates for the entire day until %1$s" : "På specifikke datoer for hele dagen indtil %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "På specifikke datoer mellem %1$s - %2$s indtil %3$s",
"In the past on %1$s" : "Tidligere den %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["I et minut på %1$s","Om %n minutter den %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["I en time på %1$s","Om %n timer den %1$s"],
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Om et minut på %1$s","Om %n minutter den %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Om en time på %1$s","Om %n timer den %1$s"],
"_In a day on %1$s_::_In %n days on %1$s_" : ["I en dag på %1$s","Om %n dage den %1$s"],
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["I en uge på %1$s","Om %n uger den %1$s"],
"_In a month on %1$s_::_In %n months on %1$s_" : ["I en måned på %1$s","Om %n måneder den %1$s"],
"_In a year on %1$s_::_In %n years on %1$s_" : ["I et år på %1$s","Om %n år den %1$s"],
"In the past on %1$s then on %2$s" : "Tidligere på %1$s derefter den %2$s",
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["I et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Om et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["I en time på %1$s så på %2$s","Om %n timer den %1$s derefter den %2$s"],
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["I en dag på %1$s så på %2$s","Om %n dage den %1$s derefter den %2$s"],
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["I en uge på %1$s så på %2$s","Om %n uger den %1$s derefter den %2$s"],
@@ -249,7 +249,7 @@
"Due on %s by %s" : "Forfalder på %s til %s",
"Due on %s" : "Forfalder på %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Velkommen til Nextcloud kalendr!\n\nDette er en eksempelbegivenhed - undersøg fleksibiliteten i planlægningen med Nextcloud kalender ved at redigere i det du ønsker!\n\nMed Nextcloud kalender kan du:\n- Oprette, redigere, og styre begivenheder uden besvær.\n- Oprette multiple kalendere og dele dem med teammedlemmer, venner eller familie.\n- Kontrollere ledige tider og vise dine optagede tider til andre.\n- Uden besvær integrere med apps og apparater via CalDAV.\n- Brugerdefinere din oplevelse: planlægge gentagende begivenheder, justere notifikationer og andre indstillinger.",
"Example event - open me!" : "Eksempel begivnhed - åben mig!",
"Example event - open me!" : "Eksempel begivnhed - åbn mig!",
"System Address Book" : "System adressebog",
"The system address book contains contact information for all users in your instance." : "System adressebogen indeholder kontaktoplysninger for alle brugere i din instans.",
"Enable System Address Book" : "Aktivér System adressebog",
@@ -299,13 +299,13 @@
"Import contact" : "Importér kontakt",
"Reset to default" : "Nulstil",
"Import contacts" : "Importér kontakter",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf-fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
"Failed to save example event creation setting" : "Kunne ikke gemme eksempelbegivenhed oprettelsesindstilling",
"Failed to upload the example event" : "Kunne ikke uploade eksempelbegivenheden",
"Custom example event was saved successfully" : "Brugerdefineret eksempelbegivenhed blev gemt",
"Failed to delete the custom example event" : "Kunne ikke slette den brugerdefinerede eksempelbegivenhed",
"Custom example event was deleted successfully" : "Brugerdefineret eksempelbegivenhed blev slettet",
"Import calendar event" : "Importer kalenderbegivenhed",
"Import calendar event" : "Importér kalenderbegivenhed",
"Uploading a new event will overwrite the existing one." : "Upload af en ny begivenhed vil overskrive den eksisterende.",
"Upload event" : "Upload begivenhed",
"Availability" : "tilgængelighed",
+35 -35
View File
@@ -38,17 +38,17 @@ OC.L10N.register(
"You restored event {event} of calendar {calendar}" : "Vous avez restauré l’événement {event} dans lagenda {calendar}",
"Busy" : "Occupé",
"{actor} created to-do {todo} in list {calendar}" : "{actor} a créé la tâche {todo} dans la liste {calendar}",
"You created to-do {todo} in list {calendar}" : "Vous avez créé un pense-bête {todo} dans la liste {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé un pense-bête {todo} de la liste {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé le pense-bête {todo} de la liste {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour le pense-bête {todo} dans la liste {calendar}",
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour le pense-bête {todo} dans la liste {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a résolu le pense-bête {todo} dans la liste {calendar}",
"You solved to-do {todo} in list {calendar}" : "Vous avez résolu le pense-bête {todo} dans la liste {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert le pense-bête {todo} dans la liste {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert le pense-bête {todo} dans la liste {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"You created to-do {todo} in list {calendar}" : "Vous avez créé la tâche {todo} dans la liste {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé la tâche {todo} de la liste {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé la tâche {todo} de la liste {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour la tâche {todo} dans la liste {calendar}",
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour la tâche {todo} dans la liste {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a terminé la tâche {todo} dans la liste {calendar}",
"You solved to-do {todo} in list {calendar}" : "Vous avez terminé la tâche {todo} dans la liste {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert la tâche {todo} dans la liste {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert la tâche {todo} dans la liste {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"Calendar, contacts and tasks" : "Agenda, contacts et tâches",
"A <strong>calendar</strong> was modified" : "Un <strong>agenda</strong> a été modifié",
"A calendar <strong>event</strong> was modified" : "Un <strong>événement</strong> de lagenda a été modifié",
@@ -79,8 +79,8 @@ OC.L10N.register(
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Dans une semaine le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Dans un mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Dans un an toute la journée du %1$s","Dans %n années toute la journée du %1$s","Dans %n années toute la journée du %1$s"],
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %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_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s"],
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %2$s et %3$s",
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s et %3$s"],
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Dans une heure le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s"],
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Demain le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s"],
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["La semaine prochaine le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s"],
@@ -88,14 +88,14 @@ OC.L10N.register(
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["L'an prochain le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s"],
"Could not generate when statement" : "Impossible de déterminer quand",
"Every Day for the entire day" : "Chaque jour pour toute la journée",
"Every Day for the entire day until %1$s" : "Chaque jour pour toute la journée jusqu'au %1$s",
"Every Day for the entire day until %1$s" : "Chaque jour pour la journée entière jusqu'au %1$s",
"Every Day between %1$s - %2$s" : "Chaque jour entre %1$s et %2$s",
"Every Day between %1$s - %2$s until %3$s" : "Chaque jour entre %1$s et %2$s jusqu'au %3$s",
"Every %1$d Days for the entire day" : "Tous les %1$d jours pour la journée entière",
"Every %1$d Days for the entire day until %2$s" : "Tous les %1$d jours pour la journée entière jusqu'au %2$s",
"Every %1$d Days between %2$s - %3$s" : "Tous les %1$d jours entre %2$s et %3$s",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Tous les %1$d jours entre %2$s et %3$s jusqu'au %4$s",
"Could not generate event recurrence statement" : "Impossible de générer la phrase de récurrence de l'événement",
"Could not generate event recurrence statement" : "Impossible de générer la récurrence de l'événement",
"Every Week on %1$s for the entire day" : "Chaque semaine le %1$s pour la journée entière",
"Every Week on %1$s for the entire day until %2$s" : "Chaque semaine le %1$s pour la journée entière jusqu'au%2$s",
"Every Week on %1$s between %2$s - %3$s" : "Chaque semaine le %1$s entre %2$s et %3$s",
@@ -122,9 +122,9 @@ OC.L10N.register(
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Tous les %1$d ans en %2$s le %3$s entre %4$s - %5$s jusqu'au %6$s",
"On specific dates for the entire day until %1$s" : "À une date spécifique pour la journée entière jusqu'au %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "À des dates spécifiques entre %1$s et %2$s jusqu'au %3$s",
"In the past on %1$s" : "Dans le passé sur %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute sur %1$s","Dans %n minutes sur %1$s","Dans %n minutes sur %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure sur %1$s","Dans %n heures sur %1$s","Dans %n sur %1$s"],
"In the past on %1$s" : "Dans le passé en %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute en %1$s","Dans %n minutes en %1$s","Dans %n minutes en %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure en %1$s","Dans %n heures en %1$s","Dans %n en %1$s"],
"_In a day on %1$s_::_In %n days on %1$s_" : ["Demain le %1$s","Dans %n jours le %1$s","Dans %n jours le %1$s"],
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["La semaine prochaine le %1$s","Dans %n semaines le %1$s","Dans %n semaines le %1$s"],
"_In a month on %1$s_::_In %n months on %1$s_" : ["Le mois prochain le %1$s","Dans %n mois le %1$s","Dans %n mois le %1$s"],
@@ -230,16 +230,16 @@ OC.L10N.register(
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Erreur en copiant le fichier à destination (copié : %1$s, taille du fichier attendue : %2$s)",
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Taille du fichier attendue : %1$s mais taille du fichier lue (depuis le client Nextcloud) et écrit (dans le stockage Nextcloud) : %2$s. Cela peut être un problème de réseau au niveau du client ou un problème de stockage au niveau du serveur.",
"Could not rename part file to final file, canceled by hook" : "Impossible de renommer le fichier partiel en fichier final, annulé par le hook",
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif.",
"Failed to check file size: %1$s" : "Échec à la vérification de la taille du fichier : %1$s",
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif",
"Failed to check file size: %1$s" : "Impossible de vérifier la taille du fichier : %1$s",
"Could not open file: %1$s, file does seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier semble présent.",
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas présent.",
"Encryption not ready: %1$s" : "Encryption pas prête : %1$s",
"Failed to open file: %1$s" : "Échec à l'ouverture du fichier : %1$s",
"Failed to unlink: %1$s" : "Échec à la suppression :%1$s",
"Failed to write file contents: %1$s" : "Échec à l'écriture du contenu du fichier : %1$s",
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas exister.",
"Encryption not ready: %1$s" : "Chiffrement pas prêt : %1$s",
"Failed to open file: %1$s" : "Impossible d'ouvrir le fichier : %1$s",
"Failed to unlink: %1$s" : "Impossible de supprimer le lien :%1$s",
"Failed to write file contents: %1$s" : "Impossible d'écrire le contenu du fichier : %1$s",
"File not found: %1$s" : "Fichier non trouvé : %1$s",
"Invalid target path" : "Chemin daccès invalide",
"Invalid target path" : "Chemin cible non valide",
"System is in maintenance mode." : "Le système est en mode maintenance.",
"Upgrade needed" : "Mise à jour requise",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Votre %s a besoin d'être configuré pour utiliser le HTTPS dans le but d'utiliser CalDAV et CardDAV avec iOS/macOS.",
@@ -275,7 +275,7 @@ OC.L10N.register(
"Out of office replacement (optional)" : "Remplaçant pendant l'absence (optionnel)",
"Name of the replacement" : "Nom du remplaçant",
"No results." : "Pas de résultat.",
"Start typing." : "Commencez à taper.",
"Start typing." : "Commencez à écrire.",
"Short absence status" : "Résumé du message dabsence",
"Long absence Message" : "Message dabsence complet",
"Save" : "Enregistrer",
@@ -292,20 +292,20 @@ OC.L10N.register(
"Pick a end time for {dayName}" : "Choisissez une heure de fin pour {dayName}",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut « Ne pas déranger » en dehors des heures de disponibilités pour désactiver toutes les notifications.",
"Cancel" : "Annuler",
"Import" : "Importation",
"Import" : "Importer",
"Error while saving settings" : "Erreur lors de l'enregistrement des paramètres",
"Contact reset successfully" : "Contact réinitialisé avec succès",
"Error while resetting contact" : "Erreur lors de la remise à zéro du contact",
"Error while resetting contact" : "Erreur lors de la réinitialisation du contact",
"Contact imported successfully" : "Contact importé avec succès",
"Error while importing contact" : "Erreur lors de l'importation du contact",
"Error while importing contact" : "Erreur lors de l'import du contact",
"Import contact" : "Importer un contact",
"Reset to default" : "Restaurer les valeurs par défaut",
"Import contacts" : "Importer des contacts",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importer un nouveau fichier .vcf supprimera le contact par défaut existant et le remplacera. Voulez-vous continuer ?",
"Failed to save example event creation setting" : "Échec de la sauvegarde du paramètre de l'exemple de création d'événement",
"Failed to upload the example event" : "Échec du téléversement de l'exemple d'événement",
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a bien été enregistré",
"Failed to delete the custom example event" : "Échec de la suppression de l'exemple d'événement personnalisé ",
"Failed to save example event creation setting" : "Impossible de sauvegarder le paramètre d'exemple de création d'événement",
"Failed to upload the example event" : "Impossible de téléverser l'exemple d'événement",
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a été enregistré avec succès",
"Failed to delete the custom example event" : "Impossible de supprimer l'exemple d'événement personnalisé ",
"Custom example event was deleted successfully" : "L'exemple de contenu personnalisé a bien été supprimé",
"Import calendar event" : "Importer l'événement du calendrier",
"Uploading a new event will overwrite the existing one." : "Charger un nouvel événement qui va remplacer l'actuel.",
@@ -328,7 +328,7 @@ OC.L10N.register(
"Enable notifications for events via push" : "Activer les notifications push pour les évènements",
"Example content" : "Exemple de contenu",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Les exemples de contenu servent à présenter les fonctionnalités de Nextcloud. Le contenu par défaut est fourni avec Nextcloud et peut être remplacé par du contenu personnalisé.",
"There was an error updating your attendance status." : "Une erreur s'est produite lors de la mise à jour de votre statut de présence.",
"There was an error updating your attendance status." : "Une erreur est survenue lors de la mise à jour de votre statut de présence.",
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
"Tentative" : "Provisoire",
+35 -35
View File
@@ -36,17 +36,17 @@
"You restored event {event} of calendar {calendar}" : "Vous avez restauré l’événement {event} dans lagenda {calendar}",
"Busy" : "Occupé",
"{actor} created to-do {todo} in list {calendar}" : "{actor} a créé la tâche {todo} dans la liste {calendar}",
"You created to-do {todo} in list {calendar}" : "Vous avez créé un pense-bête {todo} dans la liste {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé un pense-bête {todo} de la liste {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé le pense-bête {todo} de la liste {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour le pense-bête {todo} dans la liste {calendar}",
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour le pense-bête {todo} dans la liste {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a résolu le pense-bête {todo} dans la liste {calendar}",
"You solved to-do {todo} in list {calendar}" : "Vous avez résolu le pense-bête {todo} dans la liste {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert le pense-bête {todo} dans la liste {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert le pense-bête {todo} dans la liste {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"You created to-do {todo} in list {calendar}" : "Vous avez créé la tâche {todo} dans la liste {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé la tâche {todo} de la liste {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé la tâche {todo} de la liste {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour la tâche {todo} dans la liste {calendar}",
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour la tâche {todo} dans la liste {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a terminé la tâche {todo} dans la liste {calendar}",
"You solved to-do {todo} in list {calendar}" : "Vous avez terminé la tâche {todo} dans la liste {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert la tâche {todo} dans la liste {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert la tâche {todo} dans la liste {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
"Calendar, contacts and tasks" : "Agenda, contacts et tâches",
"A <strong>calendar</strong> was modified" : "Un <strong>agenda</strong> a été modifié",
"A calendar <strong>event</strong> was modified" : "Un <strong>événement</strong> de lagenda a été modifié",
@@ -77,8 +77,8 @@
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Dans une semaine le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Dans un mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Dans un an toute la journée du %1$s","Dans %n années toute la journée du %1$s","Dans %n années toute la journée du %1$s"],
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %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_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s"],
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %2$s et %3$s",
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s et %3$s"],
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Dans une heure le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s"],
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Demain le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s"],
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["La semaine prochaine le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s"],
@@ -86,14 +86,14 @@
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["L'an prochain le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s"],
"Could not generate when statement" : "Impossible de déterminer quand",
"Every Day for the entire day" : "Chaque jour pour toute la journée",
"Every Day for the entire day until %1$s" : "Chaque jour pour toute la journée jusqu'au %1$s",
"Every Day for the entire day until %1$s" : "Chaque jour pour la journée entière jusqu'au %1$s",
"Every Day between %1$s - %2$s" : "Chaque jour entre %1$s et %2$s",
"Every Day between %1$s - %2$s until %3$s" : "Chaque jour entre %1$s et %2$s jusqu'au %3$s",
"Every %1$d Days for the entire day" : "Tous les %1$d jours pour la journée entière",
"Every %1$d Days for the entire day until %2$s" : "Tous les %1$d jours pour la journée entière jusqu'au %2$s",
"Every %1$d Days between %2$s - %3$s" : "Tous les %1$d jours entre %2$s et %3$s",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Tous les %1$d jours entre %2$s et %3$s jusqu'au %4$s",
"Could not generate event recurrence statement" : "Impossible de générer la phrase de récurrence de l'événement",
"Could not generate event recurrence statement" : "Impossible de générer la récurrence de l'événement",
"Every Week on %1$s for the entire day" : "Chaque semaine le %1$s pour la journée entière",
"Every Week on %1$s for the entire day until %2$s" : "Chaque semaine le %1$s pour la journée entière jusqu'au%2$s",
"Every Week on %1$s between %2$s - %3$s" : "Chaque semaine le %1$s entre %2$s et %3$s",
@@ -120,9 +120,9 @@
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Tous les %1$d ans en %2$s le %3$s entre %4$s - %5$s jusqu'au %6$s",
"On specific dates for the entire day until %1$s" : "À une date spécifique pour la journée entière jusqu'au %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "À des dates spécifiques entre %1$s et %2$s jusqu'au %3$s",
"In the past on %1$s" : "Dans le passé sur %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute sur %1$s","Dans %n minutes sur %1$s","Dans %n minutes sur %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure sur %1$s","Dans %n heures sur %1$s","Dans %n sur %1$s"],
"In the past on %1$s" : "Dans le passé en %1$s",
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute en %1$s","Dans %n minutes en %1$s","Dans %n minutes en %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure en %1$s","Dans %n heures en %1$s","Dans %n en %1$s"],
"_In a day on %1$s_::_In %n days on %1$s_" : ["Demain le %1$s","Dans %n jours le %1$s","Dans %n jours le %1$s"],
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["La semaine prochaine le %1$s","Dans %n semaines le %1$s","Dans %n semaines le %1$s"],
"_In a month on %1$s_::_In %n months on %1$s_" : ["Le mois prochain le %1$s","Dans %n mois le %1$s","Dans %n mois le %1$s"],
@@ -228,16 +228,16 @@
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Erreur en copiant le fichier à destination (copié : %1$s, taille du fichier attendue : %2$s)",
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Taille du fichier attendue : %1$s mais taille du fichier lue (depuis le client Nextcloud) et écrit (dans le stockage Nextcloud) : %2$s. Cela peut être un problème de réseau au niveau du client ou un problème de stockage au niveau du serveur.",
"Could not rename part file to final file, canceled by hook" : "Impossible de renommer le fichier partiel en fichier final, annulé par le hook",
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif.",
"Failed to check file size: %1$s" : "Échec à la vérification de la taille du fichier : %1$s",
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif",
"Failed to check file size: %1$s" : "Impossible de vérifier la taille du fichier : %1$s",
"Could not open file: %1$s, file does seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier semble présent.",
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas présent.",
"Encryption not ready: %1$s" : "Encryption pas prête : %1$s",
"Failed to open file: %1$s" : "Échec à l'ouverture du fichier : %1$s",
"Failed to unlink: %1$s" : "Échec à la suppression :%1$s",
"Failed to write file contents: %1$s" : "Échec à l'écriture du contenu du fichier : %1$s",
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas exister.",
"Encryption not ready: %1$s" : "Chiffrement pas prêt : %1$s",
"Failed to open file: %1$s" : "Impossible d'ouvrir le fichier : %1$s",
"Failed to unlink: %1$s" : "Impossible de supprimer le lien :%1$s",
"Failed to write file contents: %1$s" : "Impossible d'écrire le contenu du fichier : %1$s",
"File not found: %1$s" : "Fichier non trouvé : %1$s",
"Invalid target path" : "Chemin daccès invalide",
"Invalid target path" : "Chemin cible non valide",
"System is in maintenance mode." : "Le système est en mode maintenance.",
"Upgrade needed" : "Mise à jour requise",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Votre %s a besoin d'être configuré pour utiliser le HTTPS dans le but d'utiliser CalDAV et CardDAV avec iOS/macOS.",
@@ -273,7 +273,7 @@
"Out of office replacement (optional)" : "Remplaçant pendant l'absence (optionnel)",
"Name of the replacement" : "Nom du remplaçant",
"No results." : "Pas de résultat.",
"Start typing." : "Commencez à taper.",
"Start typing." : "Commencez à écrire.",
"Short absence status" : "Résumé du message dabsence",
"Long absence Message" : "Message dabsence complet",
"Save" : "Enregistrer",
@@ -290,20 +290,20 @@
"Pick a end time for {dayName}" : "Choisissez une heure de fin pour {dayName}",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut « Ne pas déranger » en dehors des heures de disponibilités pour désactiver toutes les notifications.",
"Cancel" : "Annuler",
"Import" : "Importation",
"Import" : "Importer",
"Error while saving settings" : "Erreur lors de l'enregistrement des paramètres",
"Contact reset successfully" : "Contact réinitialisé avec succès",
"Error while resetting contact" : "Erreur lors de la remise à zéro du contact",
"Error while resetting contact" : "Erreur lors de la réinitialisation du contact",
"Contact imported successfully" : "Contact importé avec succès",
"Error while importing contact" : "Erreur lors de l'importation du contact",
"Error while importing contact" : "Erreur lors de l'import du contact",
"Import contact" : "Importer un contact",
"Reset to default" : "Restaurer les valeurs par défaut",
"Import contacts" : "Importer des contacts",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importer un nouveau fichier .vcf supprimera le contact par défaut existant et le remplacera. Voulez-vous continuer ?",
"Failed to save example event creation setting" : "Échec de la sauvegarde du paramètre de l'exemple de création d'événement",
"Failed to upload the example event" : "Échec du téléversement de l'exemple d'événement",
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a bien été enregistré",
"Failed to delete the custom example event" : "Échec de la suppression de l'exemple d'événement personnalisé ",
"Failed to save example event creation setting" : "Impossible de sauvegarder le paramètre d'exemple de création d'événement",
"Failed to upload the example event" : "Impossible de téléverser l'exemple d'événement",
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a été enregistré avec succès",
"Failed to delete the custom example event" : "Impossible de supprimer l'exemple d'événement personnalisé ",
"Custom example event was deleted successfully" : "L'exemple de contenu personnalisé a bien été supprimé",
"Import calendar event" : "Importer l'événement du calendrier",
"Uploading a new event will overwrite the existing one." : "Charger un nouvel événement qui va remplacer l'actuel.",
@@ -326,7 +326,7 @@
"Enable notifications for events via push" : "Activer les notifications push pour les évènements",
"Example content" : "Exemple de contenu",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Les exemples de contenu servent à présenter les fonctionnalités de Nextcloud. Le contenu par défaut est fourni avec Nextcloud et peut être remplacé par du contenu personnalisé.",
"There was an error updating your attendance status." : "Une erreur s'est produite lors de la mise à jour de votre statut de présence.",
"There was an error updating your attendance status." : "Une erreur est survenue lors de la mise à jour de votre statut de présence.",
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
"Tentative" : "Provisoire",
+22
View File
@@ -250,6 +250,11 @@ OC.L10N.register(
"Completed on %s" : "Rematado o %s",
"Due on %s by %s" : "Caduca o %s por %s",
"Due on %s" : "Caduca o %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Dámoslle a benvida ao Calendario de Nextcloud!\n\nEste é un evento de mostra: examina a flexibilidade da planificación co calendario de Nextcloud facendo os cambios que queiras!\n\nCo calendario de Nextcloud, podes:\n Crear, editar e xestionar eventos sen esforzo.\n Crear varios calendarios e compartilos con compañeiros de equipo, amigos ou familiares.\n Comprobar a dispoñibilidade e amosar a ocupación das túas horas a outras persoas.\n Integración perfecta con aplicacións e dispositivos a través de CalDAV.\n Personalizar a súa experiencia: planificar eventos recorrentes, axustar as notificacións e outros axustes.",
"Example event - open me!" : "Exemplo de evento: Ábreme!",
"System Address Book" : "Caderno de enderezos do sistema",
"The system address book contains contact information for all users in your instance." : "O caderno de enderezos do sistema contén a información de contacto de todos os usuarios da súa instancia.",
"Enable System Address Book" : "Activar o caderno de enderezos do sistema",
"DAV system address book" : "Caderno de enderezos do sistema DAV",
"No outstanding DAV system address book sync." : "Non hai sincronización pendente do caderno de enderezos do sistema DAV.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "A sincronización do caderno de enderezos do sistema DAV aínda non foi executada aínda porque a súa instancia ten máis de 1000 usuarios ou porque se produciu un erro. Execútea manualmente con occ dav:sync-system-addressbook.",
@@ -289,7 +294,22 @@ OC.L10N.register(
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Produciuse un erro ao gardar os axustes",
"Contact reset successfully" : "Contacto restabelecido correctamente",
"Error while resetting contact" : "Produciuse un erro ao restabelecer o contacto",
"Contact imported successfully" : "Contacto importado correctamente",
"Error while importing contact" : "Produciuse un erro ao importar o contacto",
"Import contact" : "Importar o contacto",
"Reset to default" : "Restabelecer os valores predeterminados",
"Import contacts" : "Importar contactos",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Ao importar un novo ficheiro .vcf eliminarase o contacto predeterminado existente e substituirao polo novo. Quere continuar?",
"Failed to save example event creation setting" : "Produciuse un fallo ao gardar a configuración de creación de eventos de exemplo",
"Failed to upload the example event" : "Produciuse un fallo ao enviar o exemplo de evento",
"Custom example event was saved successfully" : "O evento de exemplo personalizado gardouse correctamente",
"Failed to delete the custom example event" : "Produciuse un fallo ao eliminar o evento de exemplo personalizado",
"Custom example event was deleted successfully" : "O evento de exemplo personalizado foi eliminado correctamente",
"Import calendar event" : "Importar un evento do calendario",
"Uploading a new event will overwrite the existing one." : "Ao enviar un novo evento sobrescribirá o existente.",
"Upload event" : "Enviar o evento",
"Availability" : "Dispoñibilidade",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outras persoas verán cando está fóra da oficina cando reserven unha xuntanza.",
"Absence" : "Ausencia",
@@ -306,6 +326,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións emerxentes para eventos",
"Example content" : "Contido de exemplo",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "O contido de exemplo serve para amosar as funcionalidades de Nextcloud. O contido predeterminado envíase con Nextcloud e pode ser substituído por contido personalizado.",
"There was an error updating your attendance status." : "Produciuse un erro ao actualizar o seu estado de asistencia.",
"Please contact the organizer directly." : "Contacte directamente co organizador.",
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
+22
View File
@@ -248,6 +248,11 @@
"Completed on %s" : "Rematado o %s",
"Due on %s by %s" : "Caduca o %s por %s",
"Due on %s" : "Caduca o %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Dámoslle a benvida ao Calendario de Nextcloud!\n\nEste é un evento de mostra: examina a flexibilidade da planificación co calendario de Nextcloud facendo os cambios que queiras!\n\nCo calendario de Nextcloud, podes:\n Crear, editar e xestionar eventos sen esforzo.\n Crear varios calendarios e compartilos con compañeiros de equipo, amigos ou familiares.\n Comprobar a dispoñibilidade e amosar a ocupación das túas horas a outras persoas.\n Integración perfecta con aplicacións e dispositivos a través de CalDAV.\n Personalizar a súa experiencia: planificar eventos recorrentes, axustar as notificacións e outros axustes.",
"Example event - open me!" : "Exemplo de evento: Ábreme!",
"System Address Book" : "Caderno de enderezos do sistema",
"The system address book contains contact information for all users in your instance." : "O caderno de enderezos do sistema contén a información de contacto de todos os usuarios da súa instancia.",
"Enable System Address Book" : "Activar o caderno de enderezos do sistema",
"DAV system address book" : "Caderno de enderezos do sistema DAV",
"No outstanding DAV system address book sync." : "Non hai sincronización pendente do caderno de enderezos do sistema DAV.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "A sincronización do caderno de enderezos do sistema DAV aínda non foi executada aínda porque a súa instancia ten máis de 1000 usuarios ou porque se produciu un erro. Execútea manualmente con occ dav:sync-system-addressbook.",
@@ -287,7 +292,22 @@
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Produciuse un erro ao gardar os axustes",
"Contact reset successfully" : "Contacto restabelecido correctamente",
"Error while resetting contact" : "Produciuse un erro ao restabelecer o contacto",
"Contact imported successfully" : "Contacto importado correctamente",
"Error while importing contact" : "Produciuse un erro ao importar o contacto",
"Import contact" : "Importar o contacto",
"Reset to default" : "Restabelecer os valores predeterminados",
"Import contacts" : "Importar contactos",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Ao importar un novo ficheiro .vcf eliminarase o contacto predeterminado existente e substituirao polo novo. Quere continuar?",
"Failed to save example event creation setting" : "Produciuse un fallo ao gardar a configuración de creación de eventos de exemplo",
"Failed to upload the example event" : "Produciuse un fallo ao enviar o exemplo de evento",
"Custom example event was saved successfully" : "O evento de exemplo personalizado gardouse correctamente",
"Failed to delete the custom example event" : "Produciuse un fallo ao eliminar o evento de exemplo personalizado",
"Custom example event was deleted successfully" : "O evento de exemplo personalizado foi eliminado correctamente",
"Import calendar event" : "Importar un evento do calendario",
"Uploading a new event will overwrite the existing one." : "Ao enviar un novo evento sobrescribirá o existente.",
"Upload event" : "Enviar o evento",
"Availability" : "Dispoñibilidade",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outras persoas verán cando está fóra da oficina cando reserven unha xuntanza.",
"Absence" : "Ausencia",
@@ -304,6 +324,8 @@
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións emerxentes para eventos",
"Example content" : "Contido de exemplo",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "O contido de exemplo serve para amosar as funcionalidades de Nextcloud. O contido predeterminado envíase con Nextcloud e pode ser substituído por contido personalizado.",
"There was an error updating your attendance status." : "Produciuse un erro ao actualizar o seu estado de asistencia.",
"Please contact the organizer directly." : "Contacte directamente co organizador.",
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
+4 -4
View File
@@ -60,11 +60,11 @@ OC.L10N.register(
"Date:" : "Датум:",
"Where:" : "Каде: ",
"Description:" : "Опис:",
"_%n year_::_%n years_" : ["една година","%n години"],
"_%n year_::_%n years_" : ["%n година","%n години"],
"_%n month_::_%n months_" : ["%n месец","%n месеци"],
"_%n day_::_%n days_" : ["еден ден","%n дена"],
"_%n hour_::_%n hours_" : ["еден час","%n часа"],
"_%n minute_::_%n minutes_" : ["една минута","%n минути"],
"_%n day_::_%n days_" : ["%n ден","%n дена"],
"_%n hour_::_%n hours_" : ["%n час","%n часа"],
"_%n minute_::_%n minutes_" : ["%n минута","%n минути"],
"%s (in %s)" : "%s (во %s)",
"%s (%s ago)" : "%s (пред %s)",
"Calendar: %s" : "Календар: %s",
+4 -4
View File
@@ -58,11 +58,11 @@
"Date:" : "Датум:",
"Where:" : "Каде: ",
"Description:" : "Опис:",
"_%n year_::_%n years_" : ["една година","%n години"],
"_%n year_::_%n years_" : ["%n година","%n години"],
"_%n month_::_%n months_" : ["%n месец","%n месеци"],
"_%n day_::_%n days_" : ["еден ден","%n дена"],
"_%n hour_::_%n hours_" : ["еден час","%n часа"],
"_%n minute_::_%n minutes_" : ["една минута","%n минути"],
"_%n day_::_%n days_" : ["%n ден","%n дена"],
"_%n hour_::_%n hours_" : ["%n час","%n часа"],
"_%n minute_::_%n minutes_" : ["%n минута","%n минути"],
"%s (in %s)" : "%s (во %s)",
"%s (%s ago)" : "%s (пред %s)",
"Calendar: %s" : "Календар: %s",
@@ -157,14 +157,18 @@ class ZipFolderPlugin extends ServerPlugin {
$content[] = $child->getNode();
}
$archiveName = 'download';
$archiveName = $folder->getName();
if (count(explode('/', trim($folder->getPath(), '/'), 3)) === 2) {
// this is a download of the root folder
$archiveName = 'download';
}
$rootPath = $folder->getPath();
if (empty($files)) {
// We download the full folder so keep it in the tree
$rootPath = dirname($folder->getPath());
// Full folder is loaded to rename the archive to the folder name
$archiveName = $folder->getName();
}
$streamer = new Streamer($tarRequest, -1, count($content), $this->timezoneFactory);
$streamer->sendHeaders($archiveName);
// For full folder downloads we also add the folder itself to the archive
+65 -75
View File
@@ -22,6 +22,7 @@ use OCA\DAV\Db\PropertyMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IUser;
use Override;
use Sabre\CalDAV\Schedule\Inbox;
use Sabre\DAV\Exception as DavException;
use Sabre\DAV\PropertyStorage\Backend\BackendInterface;
@@ -98,6 +99,7 @@ class CustomPropertiesBackend implements BackendInterface {
/**
* Map of custom XML elements to parse when trying to deserialize an instance of
* \Sabre\DAV\Xml\Property\Complex to find a more specialized PROPERTY_TYPE_*
* @var array<string, class-string>
*/
private const COMPLEX_XML_ELEMENT_MAP = [
'{urn:ietf:params:xml:ns:caldav}schedule-default-calendar-URL' => Href::class,
@@ -105,6 +107,7 @@ class CustomPropertiesBackend implements BackendInterface {
/**
* Map of well-known property names to default values
* @var array<string, string>
*/
private const PROPERTY_DEFAULT_VALUES = [
'{http://owncloud.org/ns}calendar-enabled' => '1',
@@ -118,17 +121,15 @@ class CustomPropertiesBackend implements BackendInterface {
private XmlService $xmlService;
/**
* @param Tree $tree node tree
* @param IDBConnection $connection database connection
* @param IUser $user owner of the tree and properties
*/
public function __construct(
private Server $server,
private Tree $tree,
private IDBConnection $connection,
private IUser $user,
private PropertyMapper $propertyMapper,
private DefaultCalendarValidator $defaultCalendarValidator,
private readonly Server $server,
private readonly Tree $tree,
private readonly IDBConnection $connection,
private readonly IUser $user,
private readonly PropertyMapper $propertyMapper,
private readonly DefaultCalendarValidator $defaultCalendarValidator,
) {
$this->xmlService = new XmlService();
$this->xmlService->elementMap = array_merge(
@@ -142,9 +143,9 @@ class CustomPropertiesBackend implements BackendInterface {
*
* @param string $path
* @param PropFind $propFind
* @return void
*/
public function propFind($path, PropFind $propFind) {
#[Override]
public function propFind($path, PropFind $propFind): void {
$requestedProps = $propFind->get404Properties();
$requestedProps = array_filter(
@@ -257,12 +258,10 @@ class CustomPropertiesBackend implements BackendInterface {
* Updates properties for a path
*
* @param string $path
* @param PropPatch $propPatch
*
* @return void
*/
public function propPatch($path, PropPatch $propPatch) {
$propPatch->handleRemaining(function ($changedProps) use ($path) {
#[Override]
public function propPatch($path, PropPatch $propPatch): void {
$propPatch->handleRemaining(function (array $changedProps) use ($path) {
return $this->updateProperties($path, $changedProps);
});
}
@@ -272,13 +271,13 @@ class CustomPropertiesBackend implements BackendInterface {
*
* @param string $path path of node for which to delete properties
*/
public function delete($path) {
$statement = $this->connection->prepare(
'DELETE FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?'
);
$statement->execute([$this->user->getUID(), $this->formatPath($path)]);
$statement->closeCursor();
#[Override]
public function delete($path): void {
$qb = $this->connection->getQueryBuilder();
$qb->delete('properties')
->where($qb->expr()->eq('userid', $qb->createNamedParameter($this->user->getUID())))
->andWhere($qb->expr()->eq('propertypath', $qb->createNamedParameter($this->formatPath($path))));
$qb->executeStatement();
unset($this->userCache[$path]);
}
@@ -287,16 +286,15 @@ class CustomPropertiesBackend implements BackendInterface {
*
* @param string $source
* @param string $destination
*
* @return void
*/
public function move($source, $destination) {
$statement = $this->connection->prepare(
'UPDATE `*PREFIX*properties` SET `propertypath` = ?'
. ' WHERE `userid` = ? AND `propertypath` = ?'
);
$statement->execute([$this->formatPath($destination), $this->user->getUID(), $this->formatPath($source)]);
$statement->closeCursor();
#[Override]
public function move($source, $destination): void {
$qb = $this->connection->getQueryBuilder();
$qb->update('properties')
->set('propertypath', $qb->createNamedParameter($this->formatPath($destination)))
->where($qb->expr()->eq('userid', $qb->createNamedParameter($this->user->getUID())))
->andWhere($qb->expr()->eq('propertypath', $qb->createNamedParameter($this->formatPath($source))));
$qb->executeStatement();
}
/**
@@ -325,10 +323,10 @@ class CustomPropertiesBackend implements BackendInterface {
}
/**
* @param string $path
* @param string[] $requestedProperties
*
* @return array
* @return array<string, mixed|Complex|Href|string>
* @throws \OCP\DB\Exception
*/
private function getPublishedProperties(string $path, array $requestedProperties): array {
$allowedProps = array_intersect(self::PUBLISHED_READ_ONLY_PROPERTIES, $requestedProperties);
@@ -356,7 +354,7 @@ class CustomPropertiesBackend implements BackendInterface {
}
/**
* prefetch all user properties in a directory
* Prefetch all user properties in a directory
*/
private function cacheDirectory(string $path, Directory $node): void {
$prefix = ltrim($path . '/', '/');
@@ -449,45 +447,44 @@ class CustomPropertiesBackend implements BackendInterface {
/**
* Returns a list of properties for the given path and current user
*
* @param string $path
* @param array $requestedProperties requested properties or empty array for "all"
* @return array
* @return array<string, mixed>
* @note The properties list is a list of propertynames the client
* requested, encoded as xmlnamespace#tagName, for example:
* http://www.example.org/namespace#author If the array is empty, all
* properties should be returned
*/
private function getUserProperties(string $path, array $requestedProperties) {
private function getUserProperties(string $path, array $requestedProperties): array {
if (isset($this->userCache[$path])) {
return $this->userCache[$path];
}
// TODO: chunking if more than 1000 properties
$sql = 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?';
$props = [];
$whereValues = [$this->user->getUID(), $this->formatPath($path)];
$whereTypes = [null, null];
$qb = $this->connection->getQueryBuilder();
$qb->select('*')
->from('properties')
->where($qb->expr()->eq('userid', $qb->createNamedParameter($this->user->getUID(), IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('propertypath', $qb->createNamedParameter($this->formatPath($path), IQueryBuilder::PARAM_STR)));
if (!empty($requestedProperties)) {
// request only a subset
$sql .= ' AND `propertyname` in (?)';
$whereValues[] = $requestedProperties;
$whereTypes[] = IQueryBuilder::PARAM_STR_ARRAY;
$qb->andWhere($qb->expr()->in('propertyname', $qb->createParameter('requestedProperties')));
$chunks = array_chunk($requestedProperties, 1000);
foreach ($chunks as $chunk) {
$qb->setParameter('requestedProperties', $chunk, IQueryBuilder::PARAM_STR_ARRAY);
$result = $qb->executeQuery();
while ($row = $result->fetch()) {
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
}
}
} else {
$result = $qb->executeQuery();
while ($row = $result->fetch()) {
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
}
}
$result = $this->connection->executeQuery(
$sql,
$whereValues,
$whereTypes
);
$props = [];
while ($row = $result->fetch()) {
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
}
$result->closeCursor();
$this->userCache[$path] = $props;
return $props;
}
@@ -501,6 +498,7 @@ class CustomPropertiesBackend implements BackendInterface {
}
/**
* @param array<string, string> $properties
* @throws Exception
*/
private function updateProperties(string $path, array $properties): bool {
@@ -558,10 +556,7 @@ class CustomPropertiesBackend implements BackendInterface {
}
/**
* long paths are hashed to ensure they fit in the database
*
* @param string $path
* @return string
* Long paths are hashed to ensure they fit in the database
*/
private function formatPath(string $path): string {
if (strlen($path) > 250) {
@@ -616,20 +611,15 @@ class CustomPropertiesBackend implements BackendInterface {
/**
* @return mixed|Complex|string
*/
private function decodeValueFromDatabase(string $value, int $valueType) {
switch ($valueType) {
case self::PROPERTY_TYPE_XML:
return new Complex($value);
case self::PROPERTY_TYPE_HREF:
return new Href($value);
case self::PROPERTY_TYPE_OBJECT:
// some databases can not handel null characters, these are custom encoded during serialization
// this custom encoding needs to be first reversed before unserializing
return unserialize(str_replace('\x00', chr(0), $value));
case self::PROPERTY_TYPE_STRING:
default:
return $value;
}
private function decodeValueFromDatabase(string $value, int $valueType): mixed {
return match ($valueType) {
self::PROPERTY_TYPE_XML => new Complex($value),
self::PROPERTY_TYPE_HREF => new Href($value),
// some databases can not handel null characters, these are custom encoded during serialization
// this custom encoding needs to be first reversed before unserializing
self::PROPERTY_TYPE_OBJECT => unserialize(str_replace('\x00', chr(0), $value)),
default => $value,
};
}
private function encodeDefaultCalendarUrl(Href $value): Href {
@@ -1,11 +1,13 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\DAV\Tests\unit\Connector\Sabre\RequestTest;
use OCP\AppFramework\Http;
@@ -67,7 +67,7 @@ class CustomPropertiesBackendTest extends TestCase {
protected function tearDown(): void {
$query = $this->dbConnection->getQueryBuilder();
$query->delete('properties');
$query->execute();
$query->executeStatement();
parent::tearDown();
}
@@ -102,7 +102,7 @@ class CustomPropertiesBackendTest extends TestCase {
'propertyvalue' => $query->createNamedParameter($value),
'valuetype' => $query->createNamedParameter($type, IQueryBuilder::PARAM_INT)
]);
$query->execute();
$query->executeStatement();
}
protected function getProps(string $user, string $path): array {
@@ -112,7 +112,7 @@ class CustomPropertiesBackendTest extends TestCase {
->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
->andWhere($query->expr()->eq('propertypath', $query->createNamedParameter($this->formatPath($path))));
$result = $query->execute();
$result = $query->executeQuery();
$data = [];
while ($row = $result->fetch()) {
$value = $row['propertyvalue'];
+8 -8
View File
@@ -13,7 +13,7 @@ OC.L10N.register(
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
"Password successfully changed." : "Mot de passe modifié avec succès.",
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Could not change the password. Maybe the old password was not correct." : "Impossible de changer le mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Recovery Key disabled" : "Clé de récupération désactivée",
"Recovery Key enabled" : "Clé de récupération activée",
"Could not enable the recovery key, please try again or contact your administrator" : "Impossible d'activer la clé de récupération. Veuillez essayer à nouveau ou contacter votre administrateur",
@@ -21,23 +21,23 @@ OC.L10N.register(
"The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.",
"The current log-in password was not correct, please try again." : "Le mot de passe de connexion actuel n'est pas correct, veuillez réessayer.",
"Private key password successfully updated." : "Mot de passe de la clé privée mis à jour avec succès.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clé privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Veuillez activer le chiffrement côté serveur dans les paramètres d'administration pour utiliser le module de chiffrement.",
"Encryption app is enabled and ready" : "L'application de chiffrement est activée et prête",
"Bad Signature" : "Mauvaise signature",
"Missing Signature" : "Signature manquante",
"one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur",
"Encryption password" : "Mot de passe de chiffrement",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Connectez-vous depuis l'interface web, allez dans la section « Sécurité » de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ « Ancien mot de passe de connexion » et dans votre mot de passe de connexion actuel.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Default encryption module" : "Module de chiffrement par défaut",
"Default encryption module for server-side encryption" : "Module de chiffrement par défaut pour le chiffrement côté serveur",
"In order to use this encryption module you need to enable server-side encryption in the admin settings. Once enabled this module will encrypt all your files transparently. The encryption is based on AES 256 keys.\nThe module will not touch existing files, only new files will be encrypted after server-side encryption was enabled. It is also not possible to disable the encryption again and switch back to an unencrypted system.\nPlease read the documentation to know all implications before you decide to enable server-side encryption." : "Pour utiliser ce module de chiffrement, vous devez activer le chiffrement côté serveur dans les paramètres d'administration. Une fois activé, ce module chiffrera tous vos fichiers de manière transparente. Le chiffrement est basé sur des clés AES 256 bits.\nLe module ne touchera pas les fichiers existants, seuls les nouveaux fichiers seront chiffrés après activation du chiffrement côté serveur. Une fois le chiffrement côté serveur activé, il est impossible de désactiver le chiffrement et de revenir à un système non chiffré.\nVeuillez lire la documentation pour connaître toutes les implications avant de décider d'activer le chiffrement côté serveur.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
"Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'activation de cette option chiffre tous les fichiers du stockage principal, sinon seuls les espaces de stockage externes seront chiffrés",
"Enable recovery key" : "Activer la clé de récupération",
+8 -8
View File
@@ -11,7 +11,7 @@
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
"Password successfully changed." : "Mot de passe modifié avec succès.",
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Could not change the password. Maybe the old password was not correct." : "Impossible de changer le mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Recovery Key disabled" : "Clé de récupération désactivée",
"Recovery Key enabled" : "Clé de récupération activée",
"Could not enable the recovery key, please try again or contact your administrator" : "Impossible d'activer la clé de récupération. Veuillez essayer à nouveau ou contacter votre administrateur",
@@ -19,23 +19,23 @@
"The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.",
"The current log-in password was not correct, please try again." : "Le mot de passe de connexion actuel n'est pas correct, veuillez réessayer.",
"Private key password successfully updated." : "Mot de passe de la clé privée mis à jour avec succès.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clé privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Veuillez activer le chiffrement côté serveur dans les paramètres d'administration pour utiliser le module de chiffrement.",
"Encryption app is enabled and ready" : "L'application de chiffrement est activée et prête",
"Bad Signature" : "Mauvaise signature",
"Missing Signature" : "Signature manquante",
"one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur",
"Encryption password" : "Mot de passe de chiffrement",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Connectez-vous depuis l'interface web, allez dans la section « Sécurité » de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ « Ancien mot de passe de connexion » et dans votre mot de passe de connexion actuel.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Default encryption module" : "Module de chiffrement par défaut",
"Default encryption module for server-side encryption" : "Module de chiffrement par défaut pour le chiffrement côté serveur",
"In order to use this encryption module you need to enable server-side encryption in the admin settings. Once enabled this module will encrypt all your files transparently. The encryption is based on AES 256 keys.\nThe module will not touch existing files, only new files will be encrypted after server-side encryption was enabled. It is also not possible to disable the encryption again and switch back to an unencrypted system.\nPlease read the documentation to know all implications before you decide to enable server-side encryption." : "Pour utiliser ce module de chiffrement, vous devez activer le chiffrement côté serveur dans les paramètres d'administration. Une fois activé, ce module chiffrera tous vos fichiers de manière transparente. Le chiffrement est basé sur des clés AES 256 bits.\nLe module ne touchera pas les fichiers existants, seuls les nouveaux fichiers seront chiffrés après activation du chiffrement côté serveur. Une fois le chiffrement côté serveur activé, il est impossible de désactiver le chiffrement et de revenir à un système non chiffré.\nVeuillez lire la documentation pour connaître toutes les implications avant de décider d'activer le chiffrement côté serveur.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
"Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'activation de cette option chiffre tous les fichiers du stockage principal, sinon seuls les espaces de stockage externes seront chiffrés",
"Enable recovery key" : "Activer la clé de récupération",
@@ -85,7 +85,7 @@ class DropLegacyFileKey extends Command {
$output->writeln('<error>' . $path . ' does not have a proper header</error>');
} else {
try {
$legacyFileKey = $this->keyManager->getFileKey($path, null, true);
$legacyFileKey = $this->keyManager->getFileKey($path, true);
if ($legacyFileKey === '') {
$output->writeln('Got an empty legacy filekey for ' . $path . ', continuing', OutputInterface::VERBOSITY_VERBOSE);
continue;
+1 -2
View File
@@ -342,9 +342,8 @@ class Crypt {
* @param string $privateKey
* @param string $password
* @param string $uid for regular users, empty for system keys
* @return false|string
*/
public function decryptPrivateKey($privateKey, $password = '', $uid = '') {
public function decryptPrivateKey($privateKey, $password = '', $uid = '') : string|false {
$header = $this->parseHeader($privateKey);
if (isset($header['cipher'])) {
+7 -20
View File
@@ -1,10 +1,13 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Encryption\Crypto;
use OCA\Encryption\Exceptions\PrivateKeyMissingException;
@@ -18,14 +21,6 @@ use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
class DecryptAll {
/**
* @param Util $util
* @param KeyManager $keyManager
* @param Crypt $crypt
* @param Session $session
* @param QuestionHelper $questionHelper
*/
public function __construct(
protected Util $util,
protected KeyManager $keyManager,
@@ -37,13 +32,8 @@ class DecryptAll {
/**
* prepare encryption module to decrypt all files
*
* @param InputInterface $input
* @param OutputInterface $output
* @param $user
* @return bool
*/
public function prepare(InputInterface $input, OutputInterface $output, $user) {
public function prepare(InputInterface $input, OutputInterface $output, ?string $user): bool {
$question = new Question('Please enter the recovery key password: ');
if ($this->util->isMasterKeyEnabled()) {
@@ -52,7 +42,7 @@ class DecryptAll {
$password = $this->keyManager->getMasterKeyPassword();
} else {
$recoveryKeyId = $this->keyManager->getRecoveryKeyId();
if (!empty($user)) {
if ($user !== null && $user !== '') {
$output->writeln('You can only decrypt the users files if you know');
$output->writeln('the users password or if they activated the recovery key.');
$output->writeln('');
@@ -96,12 +86,9 @@ class DecryptAll {
/**
* get the private key which will be used to decrypt all files
*
* @param string $user
* @param string $password
* @return bool|string
* @throws PrivateKeyMissingException
*/
protected function getPrivateKey($user, $password) {
protected function getPrivateKey(string $user, string $password): string|false {
$recoveryKeyId = $this->keyManager->getRecoveryKeyId();
$masterKeyId = $this->keyManager->getMasterKeyId();
if ($user === $recoveryKeyId) {
@@ -118,7 +105,7 @@ class DecryptAll {
return $privateKey;
}
protected function updateSession($user, $privateKey) {
protected function updateSession(string $user, string $privateKey): void {
$this->session->prepareDecryptAll($user, $privateKey);
}
}
+13 -24
View File
@@ -1,10 +1,13 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Encryption\Crypto;
use OC\Encryption\Exceptions\DecryptionFailedException;
@@ -60,11 +63,8 @@ class EncryptAll {
/**
* start to encrypt all files
*
* @param InputInterface $input
* @param OutputInterface $output
*/
public function encryptAll(InputInterface $input, OutputInterface $output) {
public function encryptAll(InputInterface $input, OutputInterface $output): void {
$this->input = $input;
$this->output = $output;
@@ -111,7 +111,7 @@ class EncryptAll {
/**
* create key-pair for every user
*/
protected function createKeyPairs() {
protected function createKeyPairs(): void {
$this->output->writeln("\n");
$progress = new ProgressBar($this->output);
$progress->setFormat(" %message% \n [%bar%]");
@@ -146,7 +146,7 @@ class EncryptAll {
/**
* iterate over all user and encrypt their files
*/
protected function encryptAllUsersFiles() {
protected function encryptAllUsersFiles(): void {
$this->output->writeln("\n");
$progress = new ProgressBar($this->output);
$progress->setFormat(" %message% \n [%bar%]");
@@ -168,10 +168,8 @@ class EncryptAll {
/**
* encrypt all user files with the master key
*
* @param ProgressBar $progress
*/
protected function encryptAllUserFilesWithMasterKey(ProgressBar $progress) {
protected function encryptAllUserFilesWithMasterKey(ProgressBar $progress): void {
$userNo = 1;
foreach ($this->userManager->getBackends() as $backend) {
$limit = 500;
@@ -190,12 +188,8 @@ class EncryptAll {
/**
* encrypt files from the given user
*
* @param string $uid
* @param ProgressBar $progress
* @param string $userCount
*/
protected function encryptUsersFiles($uid, ProgressBar $progress, $userCount) {
protected function encryptUsersFiles(string $uid, ProgressBar $progress, string $userCount): void {
$this->setupUserFS($uid);
$directories = [];
$directories[] = '/' . $uid . '/files';
@@ -268,7 +262,7 @@ class EncryptAll {
/**
* output one-time encryption passwords
*/
protected function outputPasswords() {
protected function outputPasswords(): void {
$table = new Table($this->output);
$table->setHeaders(['Username', 'Private key password']);
@@ -309,10 +303,8 @@ class EncryptAll {
/**
* write one-time encryption passwords to a csv file
*
* @param array $passwords
*/
protected function writePasswordsToFile(array $passwords) {
protected function writePasswordsToFile(array $passwords): void {
$fp = $this->rootView->fopen('oneTimeEncryptionPasswords.csv', 'w');
foreach ($passwords as $pwd) {
fputcsv($fp, $pwd);
@@ -330,10 +322,8 @@ class EncryptAll {
/**
* setup user file system
*
* @param string $uid
*/
protected function setupUserFS($uid) {
protected function setupUserFS(string $uid): void {
\OC_Util::tearDownFS();
\OC_Util::setupFS($uid);
}
@@ -341,10 +331,9 @@ class EncryptAll {
/**
* generate one time password for the user and store it in a array
*
* @param string $uid
* @return string password
*/
protected function generateOneTimePassword($uid) {
protected function generateOneTimePassword(string $uid): string {
$password = $this->secureRandom->generate(16, ISecureRandom::CHAR_HUMAN_READABLE);
$this->userPasswords[$uid] = $password;
return $password;
@@ -353,7 +342,7 @@ class EncryptAll {
/**
* send encryption key passwords to the users by mail
*/
protected function sendPasswordsByMail() {
protected function sendPasswordsByMail(): void {
$noMail = [];
$this->output->writeln('');
+4 -4
View File
@@ -127,7 +127,7 @@ class Encryption implements IEncryptionModule {
/* If useLegacyFileKey is not specified in header, auto-detect, to be safe */
$useLegacyFileKey = (($header['useLegacyFileKey'] ?? '') == 'false' ? false : null);
$this->fileKey = $this->keyManager->getFileKey($this->path, $this->user, $useLegacyFileKey, $this->session->decryptAllModeActivated());
$this->fileKey = $this->keyManager->getFileKey($this->path, $useLegacyFileKey, $this->session->decryptAllModeActivated());
// always use the version from the original file, also part files
// need to have a correct version number if they get moved over to the
@@ -322,7 +322,7 @@ class Encryption implements IEncryptionModule {
* update encrypted file, e.g. give additional users access to the file
*
* @param string $path path to the file which should be updated
* @param string $uid of the user who performs the operation
* @param string $uid ignored
* @param array $accessList who has access to the file contains the key 'users' and 'public'
* @return bool
*/
@@ -335,7 +335,7 @@ class Encryption implements IEncryptionModule {
return false;
}
$fileKey = $this->keyManager->getFileKey($path, $uid, null);
$fileKey = $this->keyManager->getFileKey($path, null);
if (!empty($fileKey)) {
$publicKeys = [];
@@ -438,7 +438,7 @@ class Encryption implements IEncryptionModule {
* @throws DecryptionFailedException
*/
public function isReadable($path, $uid) {
$fileKey = $this->keyManager->getFileKey($path, $uid, null);
$fileKey = $this->keyManager->getFileKey($path, null);
if (empty($fileKey)) {
$owner = $this->util->getOwner($path);
if ($owner !== $uid) {
+10 -8
View File
@@ -23,7 +23,7 @@ class KeyManager {
private string $recoveryKeyId;
private string $publicShareKeyId;
private string $masterKeyId;
private string $keyId;
private ?string $keyUid;
private string $publicKeyId = 'publicKey';
private string $privateKeyId = 'privateKey';
private string $shareKeyId = 'shareKey';
@@ -62,7 +62,7 @@ class KeyManager {
$this->config->setAppValue('encryption', 'masterKeyId', $this->masterKeyId);
}
$this->keyId = $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : false;
$this->keyUid = $userSession->isLoggedIn() ? $userSession->getUser()?->getUID() : null;
}
/**
@@ -136,7 +136,11 @@ class KeyManager {
if (!$this->session->isPrivateKeySet()) {
$masterKey = $this->getSystemPrivateKey($this->masterKeyId);
$decryptedMasterKey = $this->crypt->decryptPrivateKey($masterKey, $this->getMasterKeyPassword(), $this->masterKeyId);
$this->session->setPrivateKey($decryptedMasterKey);
if ($decryptedMasterKey === false) {
$this->logger->error('A public master key is available but decrypting it failed. This should never happen.');
} else {
$this->session->setPrivateKey($decryptedMasterKey);
}
}
// after the encryption key is available we are ready to go
@@ -347,11 +351,8 @@ class KeyManager {
/**
* @param ?bool $useLegacyFileKey null means try both
*/
public function getFileKey(string $path, ?string $uid, ?bool $useLegacyFileKey, bool $useDecryptAll = false): string {
if ($uid === '') {
$uid = null;
}
$publicAccess = is_null($uid);
public function getFileKey(string $path, ?bool $useLegacyFileKey, bool $useDecryptAll = false): string {
$publicAccess = ($this->keyUid === null);
$encryptedFileKey = '';
if ($useLegacyFileKey ?? true) {
$encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId, Encryption::ID);
@@ -380,6 +381,7 @@ class KeyManager {
$privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.' . $this->privateKeyId, Encryption::ID);
$privateKey = $this->crypt->decryptPrivateKey($privateKey);
} else {
$uid = $this->keyUid;
$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->session->getPrivateKey();
}
+3 -7
View File
@@ -67,12 +67,8 @@ class Recovery {
/**
* change recovery key id
*
* @param string $newPassword
* @param string $oldPassword
* @return bool
*/
public function changeRecoveryKeyPassword($newPassword, $oldPassword) {
public function changeRecoveryKeyPassword(string $newPassword, string $oldPassword): bool {
$recoveryKey = $this->keyManager->getSystemPrivateKey($this->keyManager->getRecoveryKeyId());
$decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey, $oldPassword);
if ($decryptedRecoveryKey === false) {
@@ -80,7 +76,7 @@ class Recovery {
}
$encryptedRecoveryKey = $this->crypt->encryptPrivateKey($decryptedRecoveryKey, $newPassword);
$header = $this->crypt->generateHeader();
if ($encryptedRecoveryKey) {
if ($encryptedRecoveryKey !== false) {
$this->keyManager->setSystemPrivateKey($this->keyManager->getRecoveryKeyId(), $header . $encryptedRecoveryKey);
return true;
}
@@ -163,7 +159,7 @@ class Recovery {
if ($item['type'] === 'dir') {
$this->addRecoveryKeys($filePath . '/');
} else {
$fileKey = $this->keyManager->getFileKey($filePath, $this->user->getUID(), null);
$fileKey = $this->keyManager->getFileKey($filePath, null);
if (!empty($fileKey)) {
$accessList = $this->file->getAccessList($filePath);
$publicKeys = [];
+14 -26
View File
@@ -1,24 +1,23 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Encryption;
use OCA\Encryption\Exceptions\PrivateKeyMissingException;
use OCP\ISession;
class Session {
public const NOT_INITIALIZED = '0';
public const INIT_EXECUTED = '1';
public const INIT_SUCCESSFUL = '2';
/**
* @param ISession $session
*/
public function __construct(
protected ISession $session,
) {
@@ -29,7 +28,7 @@ class Session {
*
* @param string $status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
*/
public function setStatus($status) {
public function setStatus(string $status): void {
$this->session->set('encryptionInitialized', $status);
}
@@ -38,7 +37,7 @@ class Session {
*
* @return string init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
*/
public function getStatus() {
public function getStatus(): string {
$status = $this->session->get('encryptionInitialized');
if (is_null($status)) {
$status = self::NOT_INITIALIZED;
@@ -49,10 +48,8 @@ class Session {
/**
* check if encryption was initialized successfully
*
* @return bool
*/
public function isReady() {
public function isReady(): bool {
$status = $this->getStatus();
return $status === self::INIT_SUCCESSFUL;
}
@@ -63,7 +60,7 @@ class Session {
* @return string $privateKey The user's plaintext private key
* @throws Exceptions\PrivateKeyMissingException
*/
public function getPrivateKey() {
public function getPrivateKey(): string {
$key = $this->session->get('privateKey');
if (is_null($key)) {
throw new PrivateKeyMissingException('please try to log-out and log-in again');
@@ -73,10 +70,8 @@ class Session {
/**
* check if private key is set
*
* @return boolean
*/
public function isPrivateKeySet() {
public function isPrivateKeySet(): bool {
$key = $this->session->get('privateKey');
if (is_null($key)) {
return false;
@@ -92,17 +87,14 @@ class Session {
*
* @note this should only be set on login
*/
public function setPrivateKey($key) {
public function setPrivateKey(string $key): void {
$this->session->set('privateKey', $key);
}
/**
* store data needed for the decrypt all operation in the session
*
* @param string $user
* @param string $key
*/
public function prepareDecryptAll($user, $key) {
public function prepareDecryptAll(string $user, string $key): void {
$this->session->set('decryptAll', true);
$this->session->set('decryptAllKey', $key);
$this->session->set('decryptAllUid', $user);
@@ -110,10 +102,8 @@ class Session {
/**
* check if we are in decrypt all mode
*
* @return bool
*/
public function decryptAllModeActivated() {
public function decryptAllModeActivated(): bool {
$decryptAll = $this->session->get('decryptAll');
return ($decryptAll === true);
}
@@ -121,10 +111,9 @@ class Session {
/**
* get uid used for decrypt all operation
*
* @return string
* @throws \Exception
*/
public function getDecryptAllUid() {
public function getDecryptAllUid(): string {
$uid = $this->session->get('decryptAllUid');
if (is_null($uid) && $this->decryptAllModeActivated()) {
throw new \Exception('No uid found while in decrypt all mode');
@@ -138,10 +127,9 @@ class Session {
/**
* get private key for decrypt all operation
*
* @return string
* @throws PrivateKeyMissingException
*/
public function getDecryptAllKey() {
public function getDecryptAllKey(): string {
$privateKey = $this->session->get('decryptAllKey');
if (is_null($privateKey) && $this->decryptAllModeActivated()) {
throw new PrivateKeyMissingException('No private key found while in decrypt all mode');
@@ -155,7 +143,7 @@ class Session {
/**
* remove keys from session
*/
public function clear() {
public function clear(): void {
$this->session->remove('publicSharePrivateKey');
$this->session->remove('privateKey');
$this->session->remove('encryptionInitialized');
@@ -85,7 +85,7 @@ class RecoveryControllerTest extends TestCase {
->method('changeRecoveryKeyPassword')
->with($password, $oldPassword)
->willReturnMap([
['test', 'oldTestFail', false],
['test', 'oldtestFail', false],
['test', 'oldtest', true]
]);
@@ -232,7 +232,7 @@ class EncryptionTest extends TestCase {
->willReturn(true);
$this->keyManagerMock->expects($this->once())
->method('getFileKey')
->with($path, 'user', null, true)
->with($path, null, true)
->willReturn($fileKey);
$this->instance->begin($path, 'user', 'r', [], []);
+11 -17
View File
@@ -335,32 +335,25 @@ class KeyManagerTest extends TestCase {
return [
['user1', false, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
['user1', false, 'privateKey', '', 'multiKeyDecryptResult'],
['user1', false, false, 'legacyKey', ''],
['user1', false, false, '', ''],
['user1', false, '', 'legacyKey', ''],
['user1', false, '', '', ''],
['user1', true, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
['user1', true, 'privateKey', '', 'multiKeyDecryptResult'],
['user1', true, false, 'legacyKey', ''],
['user1', true, false, '', ''],
['user1', true, '', 'legacyKey', ''],
['user1', true, '', '', ''],
[null, false, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
[null, false, 'privateKey', '', 'multiKeyDecryptResult'],
[null, false, false, 'legacyKey', ''],
[null, false, false, '', ''],
[null, false, '', 'legacyKey', ''],
[null, false, '', '', ''],
[null, true, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
[null, true, 'privateKey', '', 'multiKeyDecryptResult'],
[null, true, false, 'legacyKey', ''],
[null, true, false, '', ''],
[null, true, '', 'legacyKey', ''],
[null, true, '', '', ''],
];
}
/**
*
* @param $uid
* @param $isMasterKeyEnabled
* @param $privateKey
* @param $expected
*/
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestGetFileKey')]
public function testGetFileKey($uid, $isMasterKeyEnabled, $privateKey, $encryptedFileKey, $expected): void {
public function testGetFileKey(?string $uid, bool $isMasterKeyEnabled, string $privateKey, string $encryptedFileKey, string $expected): void {
$path = '/foo.txt';
if ($isMasterKeyEnabled) {
@@ -374,6 +367,7 @@ class KeyManagerTest extends TestCase {
}
$this->invokePrivate($this->instance, 'masterKeyId', ['masterKeyId']);
$this->invokePrivate($this->instance, 'keyUid', [$uid]);
$this->keyStorageMock->expects($this->exactly(2))
->method('getFileKey')
@@ -423,7 +417,7 @@ class KeyManagerTest extends TestCase {
}
$this->assertSame($expected,
$this->instance->getFileKey($path, $uid, null)
$this->instance->getFileKey($path, null)
);
}
+20 -39
View File
@@ -7,6 +7,7 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Encryption\Tests;
use OC\Files\View;
@@ -22,38 +23,16 @@ use Test\TestCase;
class RecoveryTest extends TestCase {
private static $tempStorage = [];
/**
* @var IFile|\PHPUnit\Framework\MockObject\MockObject
*/
private $fileMock;
/**
* @var View|\PHPUnit\Framework\MockObject\MockObject
*/
private $viewMock;
/**
* @var IUserSession|\PHPUnit\Framework\MockObject\MockObject
*/
private $userSessionMock;
/**
* @var MockObject|IUser
*/
private $user;
/**
* @var KeyManager|\PHPUnit\Framework\MockObject\MockObject
*/
private $keyManagerMock;
/**
* @var IConfig|\PHPUnit\Framework\MockObject\MockObject
*/
private $configMock;
/**
* @var Crypt|\PHPUnit\Framework\MockObject\MockObject
*/
private $cryptMock;
/**
* @var Recovery
*/
private $instance;
private IFile&MockObject $fileMock;
private View&MockObject $viewMock;
private IUserSession&MockObject $userSessionMock;
private IUser&MockObject $user;
private KeyManager&MockObject $keyManagerMock;
private IConfig&MockObject $configMock;
private Crypt&MockObject $cryptMock;
private Recovery $instance;
public function testEnableAdminRecoverySuccessful(): void {
$this->keyManagerMock->expects($this->exactly(2))
@@ -122,21 +101,23 @@ class RecoveryTest extends TestCase {
}
public function testChangeRecoveryKeyPasswordSuccessful(): void {
$this->assertFalse($this->instance->changeRecoveryKeyPassword('password',
'passwordOld'));
$this->assertFalse($this->instance->changeRecoveryKeyPassword('password', 'passwordOld'));
$this->keyManagerMock->expects($this->once())
->method('getSystemPrivateKey');
->method('getSystemPrivateKey')
->willReturn('privateKey');
$this->cryptMock->expects($this->once())
->method('decryptPrivateKey');
->method('decryptPrivateKey')
->with('privateKey', 'passwordOld')
->willReturn('decryptedPrivateKey');
$this->cryptMock->expects($this->once())
->method('encryptPrivateKey')
->willReturn(true);
->with('decryptedPrivateKey', 'password')
->willReturn('privateKey');
$this->assertTrue($this->instance->changeRecoveryKeyPassword('password',
'passwordOld'));
$this->assertTrue($this->instance->changeRecoveryKeyPassword('password', 'passwordOld'));
}
public function testChangeRecoveryKeyPasswordCouldNotDecryptPrivateRecoveryKey(): void {
+2 -2
View File
@@ -76,7 +76,7 @@ class SessionTest extends TestCase {
public function testGetDecryptAllUidException2(): void {
$this->expectException(\Exception::class);
$this->instance->prepareDecryptAll(null, 'key');
$this->instance->prepareDecryptAll('', 'key');
$this->instance->getDecryptAllUid();
}
@@ -95,7 +95,7 @@ class SessionTest extends TestCase {
public function testGetDecryptAllKeyException2(): void {
$this->expectException(PrivateKeyMissingException::class);
$this->instance->prepareDecryptAll('user', null);
$this->instance->prepareDecryptAll('user', '');
$this->instance->getDecryptAllKey();
}
+3 -3
View File
@@ -24,13 +24,13 @@ OC.L10N.register(
"Federated file sharing" : "Sammenkoblet fildeling",
"Provide federated file sharing across servers" : "Lever sammenkoblet fildeling på tværs af servere",
"Confirm data upload to lookup server" : "Bekræft dataoverførsel til opslagsserver",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, vil alle kontoegenskaber (f.eks. mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, vil alle kontoegenskaber (f.eks. e-mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
"Disable upload" : "Deaktivér upload",
"Enable data upload" : "Aktivér data upload",
"Confirm querying lookup server" : "Bekræft forespørgsel til opslagsserver",
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Når det er aktiveret, vil søgeinputtet, når der oprettes delinger, blive sendt til et eksternt system, der leverer en offentlig og global adressebog.",
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Dette bruges til at hente det fødererede cloud ID for at gøre fødereret deling nemmere.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan mailadresser på brugere blive sendt til dette system for at verificere dem.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan e-mailadresser på brugere blive sendt til dette system for at verificere dem.",
"Disable querying" : "Deaktivér forespørgsler",
"Enable querying" : "Aktivér forespørgsler",
"Unable to update federated files sharing config" : "Kan ikke opdatere sammenkoblet fildelingskonfiguration",
@@ -39,7 +39,7 @@ OC.L10N.register(
"Allow people on this server to receive shares from other servers" : "Tillad brugere på denne server at modtage delinger fra andre servere",
"Allow people on this server to send shares to groups on other servers" : "Tillad brugere på denne server at sende delinger til grupper på andre servere",
"Allow people on this server to receive group shares from other servers" : "Tillad brugere på denne server at modtage gruppedelinger fra andre servere",
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for global skala.",
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for globalt omfang.",
"Search global and public address book for people" : "Søg global og offentlig adressebog efter personer",
"Allow people to publish their data to a global and public address book" : "Tillad brugere at udgive deres data til en global og offentlig adressebog",
"Trusted federation" : "Betroet sammenkobling",
+3 -3
View File
@@ -22,13 +22,13 @@
"Federated file sharing" : "Sammenkoblet fildeling",
"Provide federated file sharing across servers" : "Lever sammenkoblet fildeling på tværs af servere",
"Confirm data upload to lookup server" : "Bekræft dataoverførsel til opslagsserver",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, vil alle kontoegenskaber (f.eks. mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, vil alle kontoegenskaber (f.eks. e-mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
"Disable upload" : "Deaktivér upload",
"Enable data upload" : "Aktivér data upload",
"Confirm querying lookup server" : "Bekræft forespørgsel til opslagsserver",
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Når det er aktiveret, vil søgeinputtet, når der oprettes delinger, blive sendt til et eksternt system, der leverer en offentlig og global adressebog.",
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Dette bruges til at hente det fødererede cloud ID for at gøre fødereret deling nemmere.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan mailadresser på brugere blive sendt til dette system for at verificere dem.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan e-mailadresser på brugere blive sendt til dette system for at verificere dem.",
"Disable querying" : "Deaktivér forespørgsler",
"Enable querying" : "Aktivér forespørgsler",
"Unable to update federated files sharing config" : "Kan ikke opdatere sammenkoblet fildelingskonfiguration",
@@ -37,7 +37,7 @@
"Allow people on this server to receive shares from other servers" : "Tillad brugere på denne server at modtage delinger fra andre servere",
"Allow people on this server to send shares to groups on other servers" : "Tillad brugere på denne server at sende delinger til grupper på andre servere",
"Allow people on this server to receive group shares from other servers" : "Tillad brugere på denne server at modtage gruppedelinger fra andre servere",
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for global skala.",
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for globalt omfang.",
"Search global and public address book for people" : "Søg global og offentlig adressebog efter personer",
"Allow people to publish their data to a global and public address book" : "Tillad brugere at udgive deres data til en global og offentlig adressebog",
"Trusted federation" : "Betroet sammenkobling",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
"Copied!" : "Kopiert!",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Gebe einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
"Your Federated Cloud ID" : "Deine Federated-Cloud-ID",
"Share it so your friends can share files with you:" : "Teile es, damit deine Freunde Dateien mit dir teilen können:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Zu deiner Webseite hinzufügen",
"Share with me via {productName}" : "Mit mir über {productName} teilen",
"HTML Code:" : "HTML-Code:",
"Cancel" : "Abbrechen",
"Add remote share" : "Externe Freigabe hinzufügen",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
"Copied!" : "Kopiert!",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Gebe einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
"Your Federated Cloud ID" : "Deine Federated-Cloud-ID",
"Share it so your friends can share files with you:" : "Teile es, damit deine Freunde Dateien mit dir teilen können:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Zu deiner Webseite hinzufügen",
"Share with me via {productName}" : "Mit mir über {productName} teilen",
"HTML Code:" : "HTML-Code:",
"Cancel" : "Abbrechen",
"Add remote share" : "Externe Freigabe hinzufügen",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
"Copied!" : "Kopiert!",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Geben Sie einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
"Your Federated Cloud ID" : "Ihre Federated-Cloud-ID",
"Share it so your friends can share files with you:" : "Teilen Sie es, damit Ihre Freunde Dateien mit Ihnen teilen können:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Zu Ihrer Webseite hinzufügen",
"Share with me via {productName}" : "Mit mir über {productName} teilen",
"HTML Code:" : "HTML-Code:",
"Cancel" : "Abbrechen",
"Add remote share" : "Externe Freigabe hinzufügen",
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
"Copied!" : "Kopiert!",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Geben Sie einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
"Your Federated Cloud ID" : "Ihre Federated-Cloud-ID",
"Share it so your friends can share files with you:" : "Teilen Sie es, damit Ihre Freunde Dateien mit Ihnen teilen können:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Zu Ihrer Webseite hinzufügen",
"Share with me via {productName}" : "Mit mir über {productName} teilen",
"HTML Code:" : "HTML-Code:",
"Cancel" : "Abbrechen",
"Add remote share" : "Externe Freigabe hinzufügen",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Clipboard not available. Please copy the cloud ID manually.",
"Copied!" : "Copied!",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",
"Your Federated Cloud ID" : "Your Federated Cloud ID",
"Share it so your friends can share files with you:" : "Share it so your friends can share files with you:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Add to your website",
"Share with me via {productName}" : "Share with me via {productName}",
"HTML Code:" : "HTML Code:",
"Cancel" : "Cancel",
"Add remote share" : "Add remote share",
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Clipboard not available. Please copy the cloud ID manually.",
"Copied!" : "Copied!",
"Federated Cloud" : "Federated Cloud",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",
"Your Federated Cloud ID" : "Your Federated Cloud ID",
"Share it so your friends can share files with you:" : "Share it so your friends can share files with you:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Add to your website",
"Share with me via {productName}" : "Share with me via {productName}",
"HTML Code:" : "HTML Code:",
"Cancel" : "Cancel",
"Add remote share" : "Add remote share",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Portapapeles no disponible. Por favor, copia el ID de nube manualmente.",
"Copied!" : "¡Copiado!",
"Federated Cloud" : "Nube Federada",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquier persona que use un servidor {productName} u otros servicios compatibles con Open Cloud Mesh (OCM)!. Solo coloque el ID de Nube Federada de esta(s) persona(s) en el diálogo de compartir. Se verán así: persona@nube.ejemplo.com",
"Your Federated Cloud ID" : "Tu ID de Nube Federada",
"Share it so your friends can share files with you:" : "Compártelo para que tus amigos puedan compartir archivos contigo:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Añadir a su sitio web",
"Share with me via {productName}" : "Compartir conmigo a través de {productName}",
"HTML Code:" : "Código HTML:",
"Cancel" : "Cancelar",
"Add remote share" : "Añadir recurso compartido remoto",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Portapapeles no disponible. Por favor, copia el ID de nube manualmente.",
"Copied!" : "¡Copiado!",
"Federated Cloud" : "Nube Federada",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquier persona que use un servidor {productName} u otros servicios compatibles con Open Cloud Mesh (OCM)!. Solo coloque el ID de Nube Federada de esta(s) persona(s) en el diálogo de compartir. Se verán así: persona@nube.ejemplo.com",
"Your Federated Cloud ID" : "Tu ID de Nube Federada",
"Share it so your friends can share files with you:" : "Compártelo para que tus amigos puedan compartir archivos contigo:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Añadir a su sitio web",
"Share with me via {productName}" : "Compartir conmigo a través de {productName}",
"HTML Code:" : "Código HTML:",
"Cancel" : "Cancelar",
"Add remote share" : "Añadir recurso compartido remoto",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
"Copied!" : "Kopeeritud!",
"Federated Cloud" : "Liitpilv",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad {productName}i serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta jagamise vaates nende kasutajatunnus liitpilves. See näeb välja nagu kasutajanimi@pilv.toreserver.com",
"Your Federated Cloud ID" : "Sinu kasutajatunnus liitpilves",
"Share it so your friends can share files with you:" : "Jaga seda, et su sõbrad saaksid sinuga faile jagada:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Lisa oma veebisaidile",
"Share with me via {productName}" : "Jaga minuga {productName}i vahendusel",
"HTML Code:" : "HTML kood:",
"Cancel" : "Tühista",
"Add remote share" : "Lisa kaugjagamine",
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
"Copied!" : "Kopeeritud!",
"Federated Cloud" : "Liitpilv",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad {productName}i serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta jagamise vaates nende kasutajatunnus liitpilves. See näeb välja nagu kasutajanimi@pilv.toreserver.com",
"Your Federated Cloud ID" : "Sinu kasutajatunnus liitpilves",
"Share it so your friends can share files with you:" : "Jaga seda, et su sõbrad saaksid sinuga faile jagada:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Lisa oma veebisaidile",
"Share with me via {productName}" : "Jaga minuga {productName}i vahendusel",
"HTML Code:" : "HTML kood:",
"Cancel" : "Tühista",
"Add remote share" : "Lisa kaugjagamine",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Arbela ez dago eskuragarri, mesedez kopiatu hodei IDa eskuz.",
"Copied!" : "Kopiatuta!",
"Federated Cloud" : "Hodei Federatua",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "{productName} zerbitzari bat edo Open Cloud Mesh (OCM) zerbitzari eta zerbitzu bateragarriak erabiltzen dituen edonorekin parteka dezakezu! Jarri Hodei Federatuaren identifikazioa elkarrizketa partekatuan. Horrelako itxura du: pertsona@cloud.example.com",
"Your Federated Cloud ID" : "Zure federatutako hodei IDa",
"Share it so your friends can share files with you:" : "Bidali lagunei, zurekin fitxategiak parteka ditzaten:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Gehitu zure webgunera",
"Share with me via {productName}" : "Partekatu nirekin {productName}zerbitzariaren bidez",
"HTML Code:" : "HTML kodea:",
"Cancel" : "Ezeztatu",
"Add remote share" : "Gehitu urruneko partekatzea",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Arbela ez dago eskuragarri, mesedez kopiatu hodei IDa eskuz.",
"Copied!" : "Kopiatuta!",
"Federated Cloud" : "Hodei Federatua",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "{productName} zerbitzari bat edo Open Cloud Mesh (OCM) zerbitzari eta zerbitzu bateragarriak erabiltzen dituen edonorekin parteka dezakezu! Jarri Hodei Federatuaren identifikazioa elkarrizketa partekatuan. Horrelako itxura du: pertsona@cloud.example.com",
"Your Federated Cloud ID" : "Zure federatutako hodei IDa",
"Share it so your friends can share files with you:" : "Bidali lagunei, zurekin fitxategiak parteka ditzaten:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Gehitu zure webgunera",
"Share with me via {productName}" : "Partekatu nirekin {productName}zerbitzariaren bidez",
"HTML Code:" : "HTML kodea:",
"Cancel" : "Ezeztatu",
"Add remote share" : "Gehitu urruneko partekatzea",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Presse-papiers non disponible. Veuillez copier l'ID cloud manuellement.",
"Copied!" : "Copié !",
"Federated Cloud" : "Cloud Fédéré",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec quiconque utilise un serveur {productName} ou un serveur ou service compatible Open Cloud Mesh (OCM). Renseignez simplement son ID de Cloud Fédéré sur une instance fédérée dans la boîte de dialogue de partage. Cela ressemble à utilisateur@cloud.exemple.com.",
"Your Federated Cloud ID" : "Votre ID de cloud fédéré",
"Share it so your friends can share files with you:" : "Partagez-le afin que vos amis puissent partager des fichiers avec vous :",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Ajouter à votre site web",
"Share with me via {productName}" : "Partager avec moi via {productName}",
"HTML Code:" : "Code HTML :",
"Cancel" : "Annuler",
"Add remote share" : "Ajouter un partage distant",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Presse-papiers non disponible. Veuillez copier l'ID cloud manuellement.",
"Copied!" : "Copié !",
"Federated Cloud" : "Cloud Fédéré",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec quiconque utilise un serveur {productName} ou un serveur ou service compatible Open Cloud Mesh (OCM). Renseignez simplement son ID de Cloud Fédéré sur une instance fédérée dans la boîte de dialogue de partage. Cela ressemble à utilisateur@cloud.exemple.com.",
"Your Federated Cloud ID" : "Votre ID de cloud fédéré",
"Share it so your friends can share files with you:" : "Partagez-le afin que vos amis puissent partager des fichiers avec vous :",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Ajouter à votre site web",
"Share with me via {productName}" : "Partager avec moi via {productName}",
"HTML Code:" : "Code HTML :",
"Cancel" : "Annuler",
"Add remote share" : "Ajouter un partage distant",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Níl an gearrthaisce ar fáil. Cóipeáil an t-aitheantas néil de láimh.",
"Copied!" : "Cóipeáladh!",
"Federated Cloud" : "Scamall Cónaidhme",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Is féidir leat comhroinnt le duine ar bith a úsáideann freastalaí {productName} nó freastalaithe agus seirbhísí eile atá comhoiriúnach le Open Cloud Mesh (OCM)! Cuir a n-ID Cónaidhme Cloud sa dialóg comhroinnte. Tá cuma person@cloud.example.com air.",
"Your Federated Cloud ID" : "D'Aitheantas Néal Cónaidhmeach",
"Share it so your friends can share files with you:" : "Roinn é ionas gur féidir le do chairde comhaid a roinnt leat:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Cuir le do láithreán gréasáin",
"Share with me via {productName}" : "Roinn liom trí {productName}",
"HTML Code:" : "Cód HTML:",
"Cancel" : "Cealaigh",
"Add remote share" : "Cuir cianroinnte leis",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Níl an gearrthaisce ar fáil. Cóipeáil an t-aitheantas néil de láimh.",
"Copied!" : "Cóipeáladh!",
"Federated Cloud" : "Scamall Cónaidhme",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Is féidir leat comhroinnt le duine ar bith a úsáideann freastalaí {productName} nó freastalaithe agus seirbhísí eile atá comhoiriúnach le Open Cloud Mesh (OCM)! Cuir a n-ID Cónaidhme Cloud sa dialóg comhroinnte. Tá cuma person@cloud.example.com air.",
"Your Federated Cloud ID" : "D'Aitheantas Néal Cónaidhmeach",
"Share it so your friends can share files with you:" : "Roinn é ionas gur féidir le do chairde comhaid a roinnt leat:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Cuir le do láithreán gréasáin",
"Share with me via {productName}" : "Roinn liom trí {productName}",
"HTML Code:" : "Cód HTML:",
"Cancel" : "Cealaigh",
"Add remote share" : "Cuir cianroinnte leis",
+16 -1
View File
@@ -23,30 +23,45 @@ OC.L10N.register(
"Sharing" : "Compartindo",
"Federated file sharing" : "Compartición federada de ficheiros",
"Provide federated file sharing across servers" : "Fornece a compartición federada de ficheiros entre servidores",
"Confirm data upload to lookup server" : "Confirmar o envío de datos ao servidor de busca",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Cando está activado, todas as propiedades da conta (p. ex., o enderezo de correo-e) co ámbito de visibilidade definido en «publicado», sincronizaranse automaticamente e transmitiranse a un sistema externo e estarán dispoñíbeis nun caderno de enderezos público e global.",
"Disable upload" : "Desactivar o envío",
"Enable data upload" : "Activar o envío de datos",
"Confirm querying lookup server" : "Confirmar a consulta ao servidor de buscas",
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Cando está activada, a entrada de busca ao crear comparticións enviarase a un sistema externo que fornece un caderno de enderezos público e global.",
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Isto utilízase para recuperar o ID de nube federado para facilitar a compartición federada.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Ademais, poderánse enviar os enderezos de correo-e dos usuarios a ese sistema para verificalos.",
"Disable querying" : "Desactivar a consulta",
"Enable querying" : "Activar a consulta",
"Unable to update federated files sharing config" : "Non é posíbel actualizar a configuración de uso compartido de ficheiros federados",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Axuste a forma como a xente pode compartir entre servidores. Isto inclúe tamén as comparticións entre persoas deste servidor se están a usaren a compartición federada.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Permitirlle á xente deste servidor enviar comparticións a outros servidores (esta opción tamén permite o acceso de WebDAV a comparticións públicas)",
"Allow people on this server to receive shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións doutros servidores",
"Allow people on this server to send shares to groups on other servers" : "Permitirlle á xente deste servidor enviar comparticións a grupos noutros servidores",
"Allow people on this server to receive group shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións de grupos desde outros servidores",
"The lookup server is only available for global scale." : "O servidor de buscas só está dispoñíbel a escala global.",
"Search global and public address book for people" : "Buscar persoas nos cadernos de enderezos globais e públicos",
"Allow people to publish their data to a global and public address book" : "Permitirlle á xente publicar os seus datos nun caderno de enderezos global e público",
"Trusted federation" : "Federación de confianza",
"Automatically accept shares from trusted federated accounts and groups by default" : "Aceptar automaticamente os recursos compartidos de contas e grupos federados de confianza de xeito predeterminado",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud, vexa {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud",
"Share with me via Nextcloud" : "Comparte comigo a través de Nextcloud",
"Share with me via Nextcloud" : "Comparta comigo a través de Nextcloud",
"Cloud ID copied" : "Copiado o ID da nube",
"Copy" : "Copiar",
"Clipboard not available. Please copy the cloud ID manually." : "O portapapeis non está dispoñíbel. Copie o ID da nube manualmente.",
"Copied!" : "Copiado!",
"Federated Cloud" : "Nube federada",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode compartir con calquera persoa que empregue servidores {productName}, ou outro servidor ou servizo compatíbel co Open Cloud Mesh (OCM)! Simplemente, introduza o seu ID de nube federada no diálogo de compartir. É algo como persona@cloud.example.com",
"Your Federated Cloud ID" : "ID da súa nube federada",
"Share it so your friends can share files with you:" : "Compártao para que as súas amizades poidan compartir ficheiros con Vde.:",
"Facebook" : "Facebook",
"X (formerly Twitter)" : "X (anteriormente Twitter).",
"formerly Twitter" : "anteriormente Twitter",
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Engadir ao seu sitio web",
"Share with me via {productName}" : "Comparta comigo a través de {productName}",
"HTML Code:" : "Código HTML:",
"Cancel" : "Cancelar",
"Add remote share" : "Engadir unha compartición remota",
+16 -1
View File
@@ -21,30 +21,45 @@
"Sharing" : "Compartindo",
"Federated file sharing" : "Compartición federada de ficheiros",
"Provide federated file sharing across servers" : "Fornece a compartición federada de ficheiros entre servidores",
"Confirm data upload to lookup server" : "Confirmar o envío de datos ao servidor de busca",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Cando está activado, todas as propiedades da conta (p. ex., o enderezo de correo-e) co ámbito de visibilidade definido en «publicado», sincronizaranse automaticamente e transmitiranse a un sistema externo e estarán dispoñíbeis nun caderno de enderezos público e global.",
"Disable upload" : "Desactivar o envío",
"Enable data upload" : "Activar o envío de datos",
"Confirm querying lookup server" : "Confirmar a consulta ao servidor de buscas",
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Cando está activada, a entrada de busca ao crear comparticións enviarase a un sistema externo que fornece un caderno de enderezos público e global.",
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Isto utilízase para recuperar o ID de nube federado para facilitar a compartición federada.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Ademais, poderánse enviar os enderezos de correo-e dos usuarios a ese sistema para verificalos.",
"Disable querying" : "Desactivar a consulta",
"Enable querying" : "Activar a consulta",
"Unable to update federated files sharing config" : "Non é posíbel actualizar a configuración de uso compartido de ficheiros federados",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Axuste a forma como a xente pode compartir entre servidores. Isto inclúe tamén as comparticións entre persoas deste servidor se están a usaren a compartición federada.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Permitirlle á xente deste servidor enviar comparticións a outros servidores (esta opción tamén permite o acceso de WebDAV a comparticións públicas)",
"Allow people on this server to receive shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións doutros servidores",
"Allow people on this server to send shares to groups on other servers" : "Permitirlle á xente deste servidor enviar comparticións a grupos noutros servidores",
"Allow people on this server to receive group shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións de grupos desde outros servidores",
"The lookup server is only available for global scale." : "O servidor de buscas só está dispoñíbel a escala global.",
"Search global and public address book for people" : "Buscar persoas nos cadernos de enderezos globais e públicos",
"Allow people to publish their data to a global and public address book" : "Permitirlle á xente publicar os seus datos nun caderno de enderezos global e público",
"Trusted federation" : "Federación de confianza",
"Automatically accept shares from trusted federated accounts and groups by default" : "Aceptar automaticamente os recursos compartidos de contas e grupos federados de confianza de xeito predeterminado",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud, vexa {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud",
"Share with me via Nextcloud" : "Comparte comigo a través de Nextcloud",
"Share with me via Nextcloud" : "Comparta comigo a través de Nextcloud",
"Cloud ID copied" : "Copiado o ID da nube",
"Copy" : "Copiar",
"Clipboard not available. Please copy the cloud ID manually." : "O portapapeis non está dispoñíbel. Copie o ID da nube manualmente.",
"Copied!" : "Copiado!",
"Federated Cloud" : "Nube federada",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode compartir con calquera persoa que empregue servidores {productName}, ou outro servidor ou servizo compatíbel co Open Cloud Mesh (OCM)! Simplemente, introduza o seu ID de nube federada no diálogo de compartir. É algo como persona@cloud.example.com",
"Your Federated Cloud ID" : "ID da súa nube federada",
"Share it so your friends can share files with you:" : "Compártao para que as súas amizades poidan compartir ficheiros con Vde.:",
"Facebook" : "Facebook",
"X (formerly Twitter)" : "X (anteriormente Twitter).",
"formerly Twitter" : "anteriormente Twitter",
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Engadir ao seu sitio web",
"Share with me via {productName}" : "Comparta comigo a través de {productName}",
"HTML Code:" : "Código HTML:",
"Cancel" : "Cancelar",
"Add remote share" : "Engadir unha compartición remota",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Schowek niedostępny. Skopiuj identyfikator chmury ręcznie.",
"Copied!" : "Skopiowano!",
"Federated Cloud" : "Chmura Federacyjna",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Możesz udostępniać każdemu, kto korzysta z serwera {productName} lub innych serwerów i usług kompatybilnych z Open Cloud Mesh (OCM)! Wystarczy wpisać ich Federated Cloud ID w oknie dialogowym udostępniania. Wygląda to tak: person@cloud.example.com",
"Your Federated Cloud ID" : "Twój Federowany identyfikator chmury",
"Share it so your friends can share files with you:" : "Udostępnij, aby Twoi znajomi mogli udostępniać Tobie pliki:",
"Facebook" : "Facebook",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Dodaj do swojej strony",
"Share with me via {productName}" : "Udostępnij mi przez {productName}",
"HTML Code:" : "Kod HTML:",
"Cancel" : "Anuluj",
"Add remote share" : "Dodaj zdalne udostępnienie",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Schowek niedostępny. Skopiuj identyfikator chmury ręcznie.",
"Copied!" : "Skopiowano!",
"Federated Cloud" : "Chmura Federacyjna",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Możesz udostępniać każdemu, kto korzysta z serwera {productName} lub innych serwerów i usług kompatybilnych z Open Cloud Mesh (OCM)! Wystarczy wpisać ich Federated Cloud ID w oknie dialogowym udostępniania. Wygląda to tak: person@cloud.example.com",
"Your Federated Cloud ID" : "Twój Federowany identyfikator chmury",
"Share it so your friends can share files with you:" : "Udostępnij, aby Twoi znajomi mogli udostępniać Tobie pliki:",
"Facebook" : "Facebook",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Dodaj do swojej strony",
"Share with me via {productName}" : "Udostępnij mi przez {productName}",
"HTML Code:" : "Kod HTML:",
"Cancel" : "Anuluj",
"Add remote share" : "Dodaj zdalne udostępnienie",
+1
View File
@@ -60,6 +60,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Adicione ao seu website",
"Share with me via {productName}" : "Compartilhar comigo via {productName}",
"HTML Code:" : "Código HTML:",
"Cancel" : "Cancelar",
"Add remote share" : "Adicionar compartilhamento remoto",
@@ -58,6 +58,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Adicione ao seu website",
"Share with me via {productName}" : "Compartilhar comigo via {productName}",
"HTML Code:" : "Código HTML:",
"Cancel" : "Cancelar",
"Add remote share" : "Adicionar compartilhamento remoto",
+2
View File
@@ -52,6 +52,7 @@ OC.L10N.register(
"Clipboard not available. Please copy the cloud ID manually." : "Клипборд није доступан. Молимо вас да ручно копирате ID облака.",
"Copied!" : "Копирано!",
"Federated Cloud" : "Здружени облак",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете делите ствари са било ким ко користи {productName} сервер или неки други Open Cloud Mesh (OCM) компатибилни сервер и сервисе! Само унесите ИД из њиховог Здруженог Облака у дијалог за дељење. Тај ИД изгледа нешто попут person@cloud.example.com",
"Your Federated Cloud ID" : "Ваш ИД Здруженог облака",
"Share it so your friends can share files with you:" : "Поделите да би Ваши пријатељи могли да деле са Вама:",
"Facebook" : "Фејсбук",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Додај на свој веб сајт",
"Share with me via {productName}" : "Дели са мном преко {productName}",
"HTML Code:" : "ХТМЛ кôд:",
"Cancel" : "Одустани",
"Add remote share" : "Додај удаљено дељење",
+2
View File
@@ -50,6 +50,7 @@
"Clipboard not available. Please copy the cloud ID manually." : "Клипборд није доступан. Молимо вас да ручно копирате ID облака.",
"Copied!" : "Копирано!",
"Federated Cloud" : "Здружени облак",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете делите ствари са било ким ко користи {productName} сервер или неки други Open Cloud Mesh (OCM) компатибилни сервер и сервисе! Само унесите ИД из њиховог Здруженог Облака у дијалог за дељење. Тај ИД изгледа нешто попут person@cloud.example.com",
"Your Federated Cloud ID" : "Ваш ИД Здруженог облака",
"Share it so your friends can share files with you:" : "Поделите да би Ваши пријатељи могли да деле са Вама:",
"Facebook" : "Фејсбук",
@@ -58,6 +59,7 @@
"Mastodon" : "Mastodon",
"Bluesky" : "Bluesky",
"Add to your website" : "Додај на свој веб сајт",
"Share with me via {productName}" : "Дели са мном преко {productName}",
"HTML Code:" : "ХТМЛ кôд:",
"Cancel" : "Одустани",
"Add remote share" : "Додај удаљено дељење",

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