Compare commits

..

65 Commits

Author SHA1 Message Date
Josh 7ab2238b6a chore: lint
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 150c225933 chore: fixup for lint
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh c260003b50 chore: add stub for getLegacyCipher to EncryptionTest
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh d71c91a00c test(encryption): add stub for needDetailedAccessList to UpdateTest
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh f1fd8bbba6 test: add missing stubs to EncryptionTest
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 34c91a2767 chore: add formerly misssing getOwner from EncryptionTest
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 0727930103 chore: add proper cast
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 1dab94d577 chore: fixup typo
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh edf96ce418 test(encryption): fix for typing + make testUser1/testUser2 realistic
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh c3768ac232 refactor(encryption): differentiate blockId from $this->position
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 04dec46ba9 chore: swap position for blockId in Encryption module implementation
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 0f6e5c565b refactor(encryption): Distinguish blockId from position
One is always an int but the other is a string and often more than than the raw position, but an id marker (e.g. `5end`). 

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh fa4575836b chore: permit nullable $uid in IEncryptionModule.php...
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 8a3c617cb5 chore: fixup to make $uid nullable for now
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 8adf7b73f5 chore: Update psalm-baseline.xml
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh dff3fee9f2 chore: drop implementation specific throws from interface
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 1c6d28f034 chore: document implementation specific throws
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh c9c9ea77a9 chore: add docblocks to non-interface helper/utility functions
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 1fd167e6f4 chore: drop duplicated API docblocks from Encryption implementation
They're now all well defined in the interface (and mostly already were). The rare implementation specific bits retained.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh f1fcd03cc5 chore: add simple docblock to interface IEncryptionModule
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh ca0be4eb80 chore: add exceptions to IEncryptionModule contract docs
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh 6901bfbeb7 chore: correct $position typing in IEncryptionModule
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh eef028e632 chore: add type hints throughout IEncryptionModule implementation
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Josh e7b2d26d2f chore: add typing to IEncryptionModule
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-04 15:00:20 -05:00
Robin Appelman 2a690fd154 Merge pull request #57910 from nextcloud/setup-root-path-children
fix: still setup for user when setting up root path with children
2026-02-04 19:40:40 +01:00
Andy Scherzinger 5f54a06994 Merge pull request #57930 from nextcloud/artonge/fix/share_resolution
fix(files_sharing): stop ignoring shares without a usergroup entry when filtering by path
2026-02-04 19:15:26 +01:00
Robin Appelman 134fa6779b chore: update psalm baseline
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-04 18:23:35 +01:00
Robin Appelman bea82ac656 test: adjust tests to updated getById
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-04 18:23:35 +01:00
Robin Appelman 72150d6deb fix: getById: don't setup for all users with access by default
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-04 18:23:34 +01:00
Robin Appelman be2c26a75b test: adjust tests to new getById
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-04 18:23:33 +01:00
Robin Appelman b51d332719 fix: make sure all mounts are setup in getById
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-04 18:23:33 +01:00
Robin Appelman 82d33b7727 fix: still setup for user when setting up root path with children
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-04 18:23:32 +01:00
Robin Appelman aa47e85c25 Merge pull request #58023 from nextcloud/ext-partial-mount-provider-slash
fix: fix partial external storage provider not finding root mount
2026-02-04 18:23:00 +01:00
Louis Chmn 79c07d38aa fix(files_sharing): Move path filtering to group share resolution
Previously, this was preventing users without a specific USERGROUP entry to see GROUP shares.

Signed-off-by: Louis Chmn <louis@chmn.me>
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-04 16:53:10 +01:00
Benjamin Gaussorgues 687261fc8c Merge pull request #57921 from nextcloud/fix/snowflake_lock_dir
fix(snowflakes): create file lock files into lock directory
2026-02-04 11:12:23 +01:00
Joas Schilling 2d0a24f042 Merge pull request #58050 from nextcloud/test/noid/greener-ci
test(settings): Fix CI after parallel merges
2026-02-04 11:04:09 +01:00
Joas Schilling 6112526fbc Merge pull request #58043 from nextcloud/bugfix/noid/limit-comments-report
fix(comments): Put a limit to the limit
2026-02-04 10:01:27 +01:00
Joas Schilling ba88bf4727 test(settings): Fix CI after parallel merges
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-04 09:50:24 +01:00
Joas Schilling 0478825fac test(Updater): Harden flaky test
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-04 09:44:56 +01:00
Joas Schilling af33953078 fix(comments): Put a limit to the limit
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-04 08:44:18 +01:00
Nextcloud bot 7a0093c163 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-04 00:20:54 +00:00
Andy Scherzinger d09b8c99de Merge pull request #57934 from nextcloud/dependabot/npm_and_yarn/stylelint-17.1.0
build(deps-dev): bump stylelint from 17.0.0 to 17.1.0
2026-02-03 21:29:26 +01:00
Andy Scherzinger 65b985efde Merge pull request #57932 from nextcloud/dependabot/npm_and_yarn/zip.js/zip.js-2.8.16
build(deps-dev): bump @zip.js/zip.js from 2.8.15 to 2.8.16
2026-02-03 21:28:32 +01:00
Andy Scherzinger 5ada35c153 Merge pull request #57933 from nextcloud/dependabot/npm_and_yarn/nextcloud/eslint-config-9.0.0-rc.8
build(deps-dev): bump @nextcloud/eslint-config from 9.0.0-rc.7 to 9.0.0-rc.8
2026-02-03 21:27:03 +01:00
Andy Scherzinger 227371c0de Merge pull request #57909 from nextcloud/dependabot/composer/vendor-bin/behat/phpunit/phpunit-11.5.50
build(deps-dev): bump phpunit/phpunit from 11.5.44 to 11.5.50 in /vendor-bin/behat
2026-02-03 21:21:20 +01:00
Julius Knorr 8372533cff Merge pull request #57555 from nextcloud/feat/office-switcher
feat: Add office switcher with feature comparison
2026-02-03 20:40:01 +01:00
Joas Schilling 45750b3f29 Merge pull request #57974 from nextcloud/dependabot/github_actions/github-actions-276f5d5cec
build(deps): bump the github-actions group with 5 updates
2026-02-03 20:22:18 +01:00
nextcloud-command 9561ce24f5 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-03 19:12:22 +01:00
Julius Knorr edeba296b3 feat: Add office switcher with feature comparison
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2026-02-03 19:12:22 +01:00
Andy Scherzinger 3310ec30c4 Merge pull request #58020 from nextcloud/artonge/fix/getById
fix: Migrate `getById` to `getFirstNodeById`
2026-02-03 18:04:45 +01:00
Benjamin Gaussorgues e15b429aea chore(snowflakes): don't remove file lock directory during tests
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-02-03 17:01:28 +01:00
Benjamin Gaussorgues 65c9e346da fix(snowflakes): create file lock files into lock directory
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-02-03 17:01:28 +01:00
Robin Appelman 720e588727 test: add tests for getMountsForUserAndPath
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-03 16:50:58 +01:00
Robin Appelman 522663b9f0 fix: partial external storage config matching non-child mounts
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-03 16:50:57 +01:00
Robin Appelman b79af98a31 fix: fix partial external storage provider not finding root mount
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-03 16:16:22 +01:00
Andy Scherzinger 1bdc27202a Merge pull request #57924 from nextcloud/carl/fix-external-partialmountprovider
fix(external-storage): Rtrim trailing slash at the end
2026-02-03 15:57:27 +01:00
Andy Scherzinger f46eea1eac Merge pull request #57978 from karaolidis/declarative-salt-secret
feat: declarative password salt, secret config
2026-02-03 15:44:24 +01:00
Louis Chmn 315241fb44 fix: Migrate getById to getFirstNodeById
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-02-03 15:28:37 +01:00
Nikolaos Karaolidis d73d5a25cb feat: declarative password salt, secret config
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
2026-02-03 13:21:38 +01:00
dependabot[bot] b1fbfc693d build(deps-dev): bump @nextcloud/eslint-config
Bumps [@nextcloud/eslint-config](https://github.com/nextcloud-libraries/eslint-config) from 9.0.0-rc.7 to 9.0.0-rc.8.
- [Release notes](https://github.com/nextcloud-libraries/eslint-config/releases)
- [Changelog](https://github.com/nextcloud-libraries/eslint-config/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/eslint-config/compare/v9.0.0-rc.7...v9.0.0-rc.8)

---
updated-dependencies:
- dependency-name: "@nextcloud/eslint-config"
  dependency-version: 9.0.0-rc.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 13:35:57 +01:00
dependabot[bot] 418f9598c3 build(deps-dev): bump @zip.js/zip.js from 2.8.15 to 2.8.16
Bumps [@zip.js/zip.js](https://github.com/gildas-lormeau/zip.js) from 2.8.15 to 2.8.16.
- [Release notes](https://github.com/gildas-lormeau/zip.js/releases)
- [Commits](https://github.com/gildas-lormeau/zip.js/compare/v2.8.15...v2.8.16)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 10:00:49 +01:00
dependabot[bot] e76cc5a7d0 build(deps): bump the github-actions group with 5 updates
Bumps the github-actions group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `5.0.0` | `6.0.2` |
| [shivammathur/setup-php](https://github.com/shivammathur/setup-php) | `2.35.4` | `2.36.0` |
| [github/codeql-action](https://github.com/github/codeql-action) | `4.31.10` | `4.32.0` |
| [cypress-io/github-action](https://github.com/cypress-io/github-action) | `7.0.0` | `7.1.1` |
| [LizardByte/actions](https://github.com/lizardbyte/actions) | `2026.116.208` | `2026.129.194351` |


Updates `actions/checkout` from 5.0.0 to 6.0.2
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...de0fac2e4500dabe0009e67214ff5f5447ce83dd)

Updates `shivammathur/setup-php` from 2.35.4 to 2.36.0
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.35.4...44454db4f0199b8b9685a5d763dc37cbf79108e1)

Updates `github/codeql-action` from 4.31.10 to 4.32.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/cdefb33c0f6224e58673d9004f47f7cb3e328b89...b20883b0cd1f46c72ae0ba6d1090936928f9fa30)

Updates `cypress-io/github-action` from 7.0.0 to 7.1.1
- [Release notes](https://github.com/cypress-io/github-action/releases)
- [Changelog](https://github.com/cypress-io/github-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/github-action/compare/dca986193e4336cb32820819b07e9ecacacaaaf6...0f330ebf0d60f87608ed72f1d6232e5644aa3171)

Updates `LizardByte/actions` from 2026.116.208 to 2026.129.194351
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/e6bc045033a5614035b66daafc38ff86faecb23a...09a6e10dc8175f2933c20bdf35fde0a193a9c00e)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: shivammathur/setup-php
  dependency-version: 2.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action
  dependency-version: 4.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: cypress-io/github-action
  dependency-version: 7.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: LizardByte/actions
  dependency-version: 2026.129.194351
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-31 23:15:54 +00:00
dependabot[bot] 2386328401 build(deps-dev): bump phpunit/phpunit in /vendor-bin/behat
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 11.5.44 to 11.5.50.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/11.5.50/ChangeLog-11.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/11.5.44...11.5.50)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-version: 11.5.50
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-31 13:22:07 +01:00
dependabot[bot] 11d0f8b6d7 build(deps-dev): bump stylelint from 17.0.0 to 17.1.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 17.0.0 to 17.1.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.0.0...17.1.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 17.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-31 02:08:48 +00:00
Carl Schwan 761a6979a7 fix(external-storage): Rtrim trailing slash at the end
Otherwise we don't have any matches when $forChildren is false

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-01-30 15:50:19 +01:00
242 changed files with 1570 additions and 833 deletions
+2 -2
View File
@@ -52,7 +52,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -82,7 +82,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -31,7 +31,7 @@ jobs:
- 'version.php'
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
@@ -27,7 +27,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+3 -3
View File
@@ -32,18 +32,18 @@ jobs:
build-mode: none
steps:
- name: Checkout repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
uses: github/codeql-action/init@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
config-file: ./.github/codeql-config.yml
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
uses: github/codeql-action/analyze@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
with:
category: "/language:${{matrix.language}}"
+1 -1
View File
@@ -103,7 +103,7 @@ jobs:
key: git-repo
- name: Checkout ${{ needs.init.outputs.head_ref }}
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# Needed to allow force push later
persist-credentials: true
+1 -1
View File
@@ -38,7 +38,7 @@ jobs:
id: comment-branch
- name: Checkout ${{ steps.comment-branch.outputs.head_ref }}
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
fetch-depth: 0
+2 -2
View File
@@ -48,7 +48,7 @@ jobs:
exit 1
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
# We need to checkout submodules for 3rdparty
@@ -171,7 +171,7 @@ jobs:
run: ./node_modules/cypress/bin/cypress install
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
uses: cypress-io/github-action@dca986193e4336cb32820819b07e9ecacacaaaf6 # v7.0.0
uses: cypress-io/github-action@0f330ebf0d60f87608ed72f1d6232e5644aa3171 # v7.1.1
with:
# We already installed the dependencies in the init job
install: false
+1 -1
View File
@@ -65,7 +65,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+2 -2
View File
@@ -74,7 +74,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -163,7 +163,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -65,7 +65,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -56,13 +56,13 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
- name: Checkout user_saml
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
repository: nextcloud/user_saml
+1 -1
View File
@@ -75,7 +75,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -70,7 +70,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -64,7 +64,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -24,14 +24,14 @@ jobs:
require: write
- name: Checkout github_helper
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
repository: nextcloud/github_helper
path: github_helper
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
path: server
+2 -2
View File
@@ -53,7 +53,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -71,7 +71,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python
uses: LizardByte/actions/actions/setup_python@e6bc045033a5614035b66daafc38ff86faecb23a # v2026.116.208
uses: LizardByte/actions/actions/setup_python@09a6e10dc8175f2933c20bdf35fde0a193a9c00e # v2026.129.194351
with:
python-version: '2.7'
+1 -1
View File
@@ -52,7 +52,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -76,7 +76,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+3 -3
View File
@@ -97,14 +97,14 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
- name: Checkout Talk app
if: ${{ matrix.test-suite == 'videoverification_features' }}
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
repository: nextcloud/spreed
@@ -113,7 +113,7 @@ jobs:
- name: Checkout Activity app
if: ${{ matrix.test-suite == 'sharing_features' }}
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
repository: nextcloud/activity
+1 -1
View File
@@ -56,7 +56,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -48,7 +48,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -53,7 +53,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -59,7 +59,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -58,7 +58,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -56,7 +56,7 @@ jobs:
name: NPM build
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
steps:
- name: Checkout
id: checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
ref: ${{ matrix.branches }}
+1 -1
View File
@@ -79,7 +79,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -80,7 +80,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -77,7 +77,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
exit 1
- name: Checkout server before PR
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -92,7 +92,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -72,7 +72,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -121,7 +121,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -92,7 +92,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -75,7 +75,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
@@ -72,7 +72,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -99,7 +99,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -92,7 +92,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -75,7 +75,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest-low
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+7 -7
View File
@@ -28,7 +28,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
submodules: true
@@ -63,7 +63,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
submodules: true
@@ -88,7 +88,7 @@ jobs:
- name: Upload Security Analysis results to GitHub
if: always()
uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v3
uses: github/codeql-action/upload-sarif@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v3
with:
sarif_file: results.sarif
@@ -99,7 +99,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
submodules: true
@@ -131,7 +131,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
submodules: true
@@ -159,13 +159,13 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
submodules: true
- name: Set up php
uses: shivammathur/setup-php@ec406be512d7077f68eed36e63f4d91bc006edc4 #v2.35.4
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
with:
php-version: '8.2'
extensions: ctype,curl,dom,fileinfo,gd,imagick,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
+1 -1
View File
@@ -22,7 +22,7 @@ jobs:
name: update-ca-certificate-bundle-${{ matrix.branches }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
ref: ${{ matrix.branches }}
@@ -22,7 +22,7 @@ jobs:
name: update-code-signing-crl-${{ matrix.branches }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
ref: ${{ matrix.branches }}
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest-low
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
+38
View File
@@ -73,7 +73,19 @@ OC.L10N.register(
"Where: %s" : "Où : %s",
"%1$s via %2$s" : "%1$s via %2$s",
"In the past on %1$s for the entire day" : "Dans le passé toute la journée du %1$s ",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Dans une minute le %1$s pour la journée entière","Dans %n minutes le %1$s pour la journée entière","Dans %n minutes le %1$s pour la journée entière"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Dans une heure le %1$s pour la journée entière","Dans %n heures le %1$s pour la journée entière","Dans %n heures le %1$s pour la journée entière"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Dans un jour le %1$s pour la journée entière","Dans %n jours le %1$s pour la journée entière","Dans %n jours le %1$s pour la journée entière"],
"_In %n 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 %n 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 %n 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 et %3$s",
"_In %n 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 %n 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 %n 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 %n 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"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Dans un mois le %1$s entre %2$s et %3$s","Dans %n mois le %1$s entre %2$s et %3$s","Dans %n mois le %1$s entre %2$s et %3$s"],
"_In %n 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 la journée entière jusqu'au %1$s",
@@ -111,8 +123,26 @@ OC.L10N.register(
"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é en %1$s",
"_In %n 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 %n hour on %1$s_::_In %n hours on %1$s_" : ["Dans %n heure le %1$s","Dans %n heures le %1$s","Dans %n le %1$s"],
"_In %n 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 %n 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 %n 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"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["L'an prochain le %1$s","Dans %n ans le %1$s","Dans %n ans le %1$s"],
"In the past on %1$s then on %2$s" : "Dans le passé le %1$s puis le %2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Dans une minute le %1$s puis le %2$s","Dans %n minutes le %1$s puis le %2$s","Dans %n minutes le %1$s puis le %2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Dans une heure le %1$s puis le %2$s","Dans %n heures le %1$s puis le %2$s","Dans %n heures le %1$s puis le %2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Demain le %1$s puis le %2$s","Dans %n jours le %1$s puis le %2$s","Dans %n jours le %1$s puis le %2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["La semaine prochaine le %1$s puis le %2$s","Dans %n semaines le %1$s puis le %2$s","Dans %n semaines le %1$s puis le %2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Le mois prochain le %1$s puis le %2$s","Dans %n mois le %1$s puis le %2$s","Dans %n mois le %1$s puis le %2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["L'an prochain le %1$s puis le %2$s","Dans %n ans le %1$s puis le %2$s","Dans %n ans le %1$s puis le %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "Dans le passé le %1$s puis le %2$s et %3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Dans une minute le %1$s puis le %2$s et le %3$s","Dans %n minutes le %1$s puis le %2$s et le %3$s","Dans %n minutes le %1$s puis le %2$s et le %3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Dans une heure le %1$s puis le %2$s et le %3$s","Dans %n heures le %1$s puis le %2$s et le %3$s","Dans %n heures le %1$s puis le %2$s et le %3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Demain le %1$s puis le %2$s et le %3$s","Dans %n jours le %1$s puis le %2$s et le %3$s","Dans %n jours le %1$s puis le %2$s et le %3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["La semaine prochaine le %1$s puis le %2$s et le %3$s","Dans %n semaines le %1$s puis le %2$s et le %3$s","Dans %n semaines le %1$s puis le %2$s et le%3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Dans un mois le %1$s puis le %2$s et le %3$s","Dans %n mois le %1$s puis le %2$s et le %3$s","Dans %n mois le %1$s puis le %2$s et le %3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Dans un an sur %1$spuis le %2$s et le %3$s","Dans %n années sur %1$s puis le %2$s et le %3$s","Dans %n années sur %1$s puis le %2$s et le %3$s"],
"Could not generate next recurrence statement" : "Impossible de déterminer la prochaine récurrence",
"Cancelled: %1$s" : "Annulé : %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" a été annulé(e)",
@@ -190,6 +220,8 @@ OC.L10N.register(
"{actor} updated contact {card} in address book {addressbook}" : "{actor} a mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Vous avez mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Un <strong>contact</strong> ou <strong>carnet d'adresses</strong> a été modifié",
"System address book disabled" : "Le carnet d'adresses du système est désactivé",
"The system contacts address book has been automatically disabled during upgrade. This means that the address book will no longer be available to users in the contacts app or other clients. The system contacts address book was disabled because the amount of contacts in the address book exceeded the maximum recommended number of contacts. This limit is set to prevent performance issues. You can re-enable the system address book with the following command {command}" : "Le carnet d'adresses système a été automatiquement désactivé lors de la mise à jour. Cela signifie que le carnet d'adresses ne sera plus disponible pour les utilisateurs dans l'application Contacts ou d'autres clients. Le carnet d'adresses du système a été désactivé car le nombre de contacts dans le carnet dépassait le nombre maximum recommandé de contacts. Cette limite est fixée afin d'éviter des problèmes de performance. Vous pouvez réactiver le carnet d'adresses système avec la commande suivante : {command}",
"Accounts" : "Comptes",
"System address book which holds all accounts" : "Carnet d'adresses système qui regroupe tous les comptes",
"File is not updatable: %1$s" : "Ce fichier ne peut pas être mis à jour : %1$s",
@@ -202,6 +234,8 @@ OC.L10N.register(
"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" : "Impossible de vérifier la taille du fichier : %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Impossible d'ouvrir le fichier : %1$s (%2$d), le fichier semble exister",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Impossible d'ouvrir le fichier : %1$s (%2$d), 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",
@@ -226,6 +260,10 @@ OC.L10N.register(
"DAV system address book" : "Carnet d'adresses système DAV",
"No outstanding DAV system address book sync." : "Pas de synchronisation DAV en cours du carnet d'adresses système.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "La synchronisation du carnet d'adresses système DAV n'a pas encore été effectuée car votre instance a plus de 1 000 utilisateurs ou parce qu'une erreur est survenue. Merci de l'exécuter manuellement en tapant la commande \"occ dav:sync-system-addressbook\".",
"DAV system address book size" : "Taille du carnet d'adresses système",
"The system address book is disabled" : "Le carnet d'adresses système est désactivé",
"The system address book is enabled, but contains more than the configured limit of %d contacts" : "Le carnet d'adresses système est activé, mais il contient plus de contacts que la limite fixée à %d ",
"The system address book is enabled and contains less than the configured limit of %d contacts" : "Le carnet d'adresses système est activé est contient moins de contacts que la limite fixée à %d ",
"WebDAV endpoint" : "Point de terminaison WebDAV",
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossible de vérifier si votre serveur web est correctement configuré pour permettre la synchronisation de fichiers via WebDAV. Veuillez vérifier manuellement.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Votre serveur web nest pas encore correctement configuré pour la synchronisation de fichiers parce que linterface WebDAV semble ne pas fonctionner.",
+38
View File
@@ -71,7 +71,19 @@
"Where: %s" : "Où : %s",
"%1$s via %2$s" : "%1$s via %2$s",
"In the past on %1$s for the entire day" : "Dans le passé toute la journée du %1$s ",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Dans une minute le %1$s pour la journée entière","Dans %n minutes le %1$s pour la journée entière","Dans %n minutes le %1$s pour la journée entière"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Dans une heure le %1$s pour la journée entière","Dans %n heures le %1$s pour la journée entière","Dans %n heures le %1$s pour la journée entière"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Dans un jour le %1$s pour la journée entière","Dans %n jours le %1$s pour la journée entière","Dans %n jours le %1$s pour la journée entière"],
"_In %n 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 %n 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 %n 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 et %3$s",
"_In %n 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 %n 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 %n 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 %n 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"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Dans un mois le %1$s entre %2$s et %3$s","Dans %n mois le %1$s entre %2$s et %3$s","Dans %n mois le %1$s entre %2$s et %3$s"],
"_In %n 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 la journée entière jusqu'au %1$s",
@@ -109,8 +121,26 @@
"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é en %1$s",
"_In %n 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 %n hour on %1$s_::_In %n hours on %1$s_" : ["Dans %n heure le %1$s","Dans %n heures le %1$s","Dans %n le %1$s"],
"_In %n 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 %n 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 %n 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"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["L'an prochain le %1$s","Dans %n ans le %1$s","Dans %n ans le %1$s"],
"In the past on %1$s then on %2$s" : "Dans le passé le %1$s puis le %2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Dans une minute le %1$s puis le %2$s","Dans %n minutes le %1$s puis le %2$s","Dans %n minutes le %1$s puis le %2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Dans une heure le %1$s puis le %2$s","Dans %n heures le %1$s puis le %2$s","Dans %n heures le %1$s puis le %2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Demain le %1$s puis le %2$s","Dans %n jours le %1$s puis le %2$s","Dans %n jours le %1$s puis le %2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["La semaine prochaine le %1$s puis le %2$s","Dans %n semaines le %1$s puis le %2$s","Dans %n semaines le %1$s puis le %2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Le mois prochain le %1$s puis le %2$s","Dans %n mois le %1$s puis le %2$s","Dans %n mois le %1$s puis le %2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["L'an prochain le %1$s puis le %2$s","Dans %n ans le %1$s puis le %2$s","Dans %n ans le %1$s puis le %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "Dans le passé le %1$s puis le %2$s et %3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Dans une minute le %1$s puis le %2$s et le %3$s","Dans %n minutes le %1$s puis le %2$s et le %3$s","Dans %n minutes le %1$s puis le %2$s et le %3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Dans une heure le %1$s puis le %2$s et le %3$s","Dans %n heures le %1$s puis le %2$s et le %3$s","Dans %n heures le %1$s puis le %2$s et le %3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Demain le %1$s puis le %2$s et le %3$s","Dans %n jours le %1$s puis le %2$s et le %3$s","Dans %n jours le %1$s puis le %2$s et le %3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["La semaine prochaine le %1$s puis le %2$s et le %3$s","Dans %n semaines le %1$s puis le %2$s et le %3$s","Dans %n semaines le %1$s puis le %2$s et le%3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Dans un mois le %1$s puis le %2$s et le %3$s","Dans %n mois le %1$s puis le %2$s et le %3$s","Dans %n mois le %1$s puis le %2$s et le %3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Dans un an sur %1$spuis le %2$s et le %3$s","Dans %n années sur %1$s puis le %2$s et le %3$s","Dans %n années sur %1$s puis le %2$s et le %3$s"],
"Could not generate next recurrence statement" : "Impossible de déterminer la prochaine récurrence",
"Cancelled: %1$s" : "Annulé : %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" a été annulé(e)",
@@ -188,6 +218,8 @@
"{actor} updated contact {card} in address book {addressbook}" : "{actor} a mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Vous avez mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Un <strong>contact</strong> ou <strong>carnet d'adresses</strong> a été modifié",
"System address book disabled" : "Le carnet d'adresses du système est désactivé",
"The system contacts address book has been automatically disabled during upgrade. This means that the address book will no longer be available to users in the contacts app or other clients. The system contacts address book was disabled because the amount of contacts in the address book exceeded the maximum recommended number of contacts. This limit is set to prevent performance issues. You can re-enable the system address book with the following command {command}" : "Le carnet d'adresses système a été automatiquement désactivé lors de la mise à jour. Cela signifie que le carnet d'adresses ne sera plus disponible pour les utilisateurs dans l'application Contacts ou d'autres clients. Le carnet d'adresses du système a été désactivé car le nombre de contacts dans le carnet dépassait le nombre maximum recommandé de contacts. Cette limite est fixée afin d'éviter des problèmes de performance. Vous pouvez réactiver le carnet d'adresses système avec la commande suivante : {command}",
"Accounts" : "Comptes",
"System address book which holds all accounts" : "Carnet d'adresses système qui regroupe tous les comptes",
"File is not updatable: %1$s" : "Ce fichier ne peut pas être mis à jour : %1$s",
@@ -200,6 +232,8 @@
"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" : "Impossible de vérifier la taille du fichier : %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Impossible d'ouvrir le fichier : %1$s (%2$d), le fichier semble exister",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Impossible d'ouvrir le fichier : %1$s (%2$d), 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",
@@ -224,6 +258,10 @@
"DAV system address book" : "Carnet d'adresses système DAV",
"No outstanding DAV system address book sync." : "Pas de synchronisation DAV en cours du carnet d'adresses système.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "La synchronisation du carnet d'adresses système DAV n'a pas encore été effectuée car votre instance a plus de 1 000 utilisateurs ou parce qu'une erreur est survenue. Merci de l'exécuter manuellement en tapant la commande \"occ dav:sync-system-addressbook\".",
"DAV system address book size" : "Taille du carnet d'adresses système",
"The system address book is disabled" : "Le carnet d'adresses système est désactivé",
"The system address book is enabled, but contains more than the configured limit of %d contacts" : "Le carnet d'adresses système est activé, mais il contient plus de contacts que la limite fixée à %d ",
"The system address book is enabled and contains less than the configured limit of %d contacts" : "Le carnet d'adresses système est activé est contient moins de contacts que la limite fixée à %d ",
"WebDAV endpoint" : "Point de terminaison WebDAV",
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossible de vérifier si votre serveur web est correctement configuré pour permettre la synchronisation de fichiers via WebDAV. Veuillez vérifier manuellement.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Votre serveur web nest pas encore correctement configuré pour la synchronisation de fichiers parce que linterface WebDAV semble ne pas fonctionner.",
+1
View File
@@ -157,6 +157,7 @@ class CommentsPlugin extends ServerPlugin {
if (!is_null($args['datetime'])) {
$args['datetime'] = new \DateTime((string)$args['datetime']);
}
$args['limit'] = min(max(1, $args['limit']), 100);
$results = $node->findChildren($args['limit'], $args['offset'], $args['datetime']);
+20 -1
View File
@@ -27,26 +27,44 @@ OC.L10N.register(
"Bad Signature" : "Nevažeći potpis",
"Missing Signature" : "Nedostaje potpis",
"one-time password for server-side-encryption" : "jednokratna zaporka za šifriranje na poslužitelju",
"Encryption password" : "Zaporka za šifriranje",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Administracija je omogućila šifriranje na strani poslužitelja. Vaše datoteke šifrirane su pomoću zaporke <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Administracija je omogućila šifriranje na strani poslužitelja. Vaše datoteke šifrirane su pomoću zaporke „%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." : "Prijavite se u web-sučelje, otvorite odjeljak „Sigurnost” u osobnim postavkama i ažurirajte zaporku za šifriranje tako da ovu zaporku unesete u polje „Stara zaporka za prijavu”, a zatim unesete svoju trenutačnu zaporku za prijavu.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće dešifrirati, vjerojatno je riječ o dijeljenoj datoteci. Zatražite od vlasnika datoteke da je ponovo podijeli s vama.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće čitati, vjerojatno je riječ o dijeljenoj datoteci. Zatražite od vlasnika datoteke da je ponovo podijeli s vama.",
"Default Encryption Module" : "Zadani modul šifriranja",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Zadani modul šifriranja za Nextcloudovo šifriranje na strani poslužitelja (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Ova aplikacija pruža (zadanu) kriptografsku implementaciju za Nextcloudovu značajku šifriranja na strani poslužitelja (SSE).\n\n\t\t\t**Detalji šifriranja**\n\t\t\t* **Način šifre:** AES-256-CTR (zadano)\n\t\t\t* **Autentikacija:** HMAC-SHA256\n\n\t\t\t**Važna upozorenja**\n\t\t\t* **OPASNOST:** Nemojte onemogućiti ovu aplikaciju dok sve datoteke ne budu dešifrirane (`occ encryption:decrypt-all`).\n\t\t\t* **UPOZORENJE**: Povratak na nešifriranu pohranu datoteka nakon aktivacije zahtijeva pristup naredbenom retku. Ova je radnja trajna putem web-sučelja.\n\n\t\t\t**Napomene za postojeće datoteke**\n\t\t\t* Prema zadanim postavkama, omogućavanje SSE-a ne šifrira postojeće datoteke; šifriraju se samo nove datoteke.\n\t\t\t* Za šifriranje svih postojećih datoteka upotrijebite naredbu `occ encryption:encrypt-all`.\n\n\t\t\t**Prije nego što započnete**\n\t\t\t***Pročitajte dokumentaciju:** Prije omogućavanja SSE-a, šifriranja postojećih datoteka ili onemogućavanja SSE-a,\n\t\t\t\tobavezno pročitajte dokumentaciju kako biste razumjeli posljedice i ispravne postupke te izbjegli gubitak podataka.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Omogućavanjem ove opcije šifriraju se sve datoteke smještene u glavnoj pohrani, a u protivnom se šifriraju samo datoteke u vanjskoj pohrani",
"Encrypt the home storage" : "Šifrirajte kućnu pohranu",
"Disable recovery key" : "Onemogući ključ za oporavak",
"Enable recovery key" : "Omogući ključ za oporavak",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Ključ za oporavak dodatni je ključ za šifriranje koji se koristi za šifriranje datoteka. Služi za oporavak datoteka s računa ako se zaporka zaboravi.",
"Recovery key password" : "Zaporka ključa za oporavak",
"Passwords fields do not match" : "Polja zaporki se ne podudaraju",
"Repeat recovery key password" : "Ponovite zaporku ključa za oporavak",
"An error occurred while updating the recovery key settings. Please try again." : "Došlo je do pogreške prilikom ažuriranja postavki ključa za oporavak. Pokušajte ponovno.",
"Change recovery key password" : "Promijenite zaporku ključa za oporavak",
"Old recovery key password" : "Stara zaporka ključa za oporavak",
"New recovery key password" : "Nova zaporka ključa za oporavak",
"Repeat new recovery key password" : "Ponovite novu zaporku ključa za oporavak",
"An error occurred while changing the recovery key password. Please try again." : "Došlo je do pogreške prilikom promjene zaporke ključa za oporavak. Pokušajte ponovno.",
"Update private key password" : "Ažurirajte zaporku privatnog ključa",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Zaporka vašeg privatnog ključa više se ne podudara s vašom zaporkom za prijavu. Postavite staru zaporku privatnog ključa na svoju trenutačnu zaporku za prijavu.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Ako se ne sjećate stare zaporke, možete zatražiti od administratora da oporavi vaše datoteke.",
"Old log-in password" : "Stara zaporka za prijavu",
"Current log-in password" : "Aktualna zaporka za prijavu",
"Update" : "Ažuriraj",
"Updating recovery keys. This can take some time…" : "Ažuriranje ključeva za oporavak. Ovo može potrajati…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "U slučaju gubitka zaporke, aktiviranje ove mogućnosti ponovno će vam pribaviti pristup vašim šifriranim datotekama",
"Enable password recovery" : "Omogući oporavak zaporke",
"Default encryption module" : "Zadani modul za šifriranje",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija za šifriranje je omogućena, ali se ključevi nisu inicijalizirali, odjavite se i ponovno se prijavite",
"Basic encryption module" : "Osnovni modul za šifriranje",
"Missing parameters" : "Nedostaju parametri",
"Default encryption module for server-side encryption" : "Zadani modul za šifriranje na poslužitelju",
"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." : "Kako biste mogli koristiti ovaj modul šifriranja, morate omogućiti šifriranje na strani poslužitelja u administratorskim postavkama. Nakon omogućavanja, ovaj će modul transparentno šifrirati sve vaše datoteke. Šifriranje se temelji na AES 256 ključevima.\nModul neće dirati postojeće datoteke, već će se šifrirati samo nove datoteke nakon što se omogući šifriranje na strani poslužitelja. Također nije moguće ponovno onemogućiti šifriranje i vratiti se na nešifrirani sustav.\nPrije nego što odlučite omogućiti šifriranje na strani poslužitelja, obavezno pročitajte dokumentaciju kako biste razumjeli sve posljedice.",
"Change recovery key password:" : "Promijenite zaporku ključa za oporavak:",
"Change Password" : "Promijeni zaporku",
"Your private key password no longer matches your log-in password." : "Zaporka vašeg privatnog ključa više se ne podudara s vašom zaporkom za prijavu.",
@@ -54,6 +72,7 @@ OC.L10N.register(
"Update Private Key Password" : "Ažuriraj zaporku privatnog ključa",
"Enable password recovery:" : "Omogući oporavak zaporke:",
"Enabled" : "Omogućeno",
"Disabled" : "Onemogućeno"
"Disabled" : "Onemogućeno",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Ova aplikacija pruža (zadanu) kriptografsku implementaciju za Nextcloudovu značajku šifriranja na strani poslužitelja (SSE).\n\n\t\t\t**Detalji šifriranja**\n\t\t\t* **Način šifre:** AES-256-CTR (zadano)\n\t\t\t* **Autentikacija:** HMAC-SHA256\n\n\t\t\t**Važna upozorenja**\n\t\t\t* **OPASNOST:** Nemojte onemogućiti ovu aplikaciju dok sve datoteke ne budu dešifrirane (`occ encryption:decrypt-all`).\n\t\t\t* **UPOZORENJE:** Povratak na nešifriranu pohranu datoteka nakon aktivacije zahtijeva pristup naredbenom retku. Ova je radnja trajna putem web-sučelja.\"\n\n\t\t\t**Napomene za postojeće datoteke**\n\t\t\t* Prema zadanim postavkama, omogućavanje SSE-a ne šifrira postojeće datoteke; šifriraju se samo nove datoteke.\n\t\t\t* Za šifriranje svih postojećih datoteka upotrijebite naredbu `occ encryption:encrypt-all`.\n\n\t\t\t**Prije nego što započnete**\n\t\t\t* **Pročitajte dokumentaciju:** Prije omogućavanja SSE-a, šifriranja postojećih datoteka ili onemogućavanja SSE-a,\n\t\t\t\tobavezno pročitajte dokumentaciju kako biste razumjeli posljedice i odgovarajuće postupke kako biste izbjegli gubitak podataka."
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
+20 -1
View File
@@ -25,26 +25,44 @@
"Bad Signature" : "Nevažeći potpis",
"Missing Signature" : "Nedostaje potpis",
"one-time password for server-side-encryption" : "jednokratna zaporka za šifriranje na poslužitelju",
"Encryption password" : "Zaporka za šifriranje",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Administracija je omogućila šifriranje na strani poslužitelja. Vaše datoteke šifrirane su pomoću zaporke <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Administracija je omogućila šifriranje na strani poslužitelja. Vaše datoteke šifrirane su pomoću zaporke „%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." : "Prijavite se u web-sučelje, otvorite odjeljak „Sigurnost” u osobnim postavkama i ažurirajte zaporku za šifriranje tako da ovu zaporku unesete u polje „Stara zaporka za prijavu”, a zatim unesete svoju trenutačnu zaporku za prijavu.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće dešifrirati, vjerojatno je riječ o dijeljenoj datoteci. Zatražite od vlasnika datoteke da je ponovo podijeli s vama.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće čitati, vjerojatno je riječ o dijeljenoj datoteci. Zatražite od vlasnika datoteke da je ponovo podijeli s vama.",
"Default Encryption Module" : "Zadani modul šifriranja",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Zadani modul šifriranja za Nextcloudovo šifriranje na strani poslužitelja (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Ova aplikacija pruža (zadanu) kriptografsku implementaciju za Nextcloudovu značajku šifriranja na strani poslužitelja (SSE).\n\n\t\t\t**Detalji šifriranja**\n\t\t\t* **Način šifre:** AES-256-CTR (zadano)\n\t\t\t* **Autentikacija:** HMAC-SHA256\n\n\t\t\t**Važna upozorenja**\n\t\t\t* **OPASNOST:** Nemojte onemogućiti ovu aplikaciju dok sve datoteke ne budu dešifrirane (`occ encryption:decrypt-all`).\n\t\t\t* **UPOZORENJE**: Povratak na nešifriranu pohranu datoteka nakon aktivacije zahtijeva pristup naredbenom retku. Ova je radnja trajna putem web-sučelja.\n\n\t\t\t**Napomene za postojeće datoteke**\n\t\t\t* Prema zadanim postavkama, omogućavanje SSE-a ne šifrira postojeće datoteke; šifriraju se samo nove datoteke.\n\t\t\t* Za šifriranje svih postojećih datoteka upotrijebite naredbu `occ encryption:encrypt-all`.\n\n\t\t\t**Prije nego što započnete**\n\t\t\t***Pročitajte dokumentaciju:** Prije omogućavanja SSE-a, šifriranja postojećih datoteka ili onemogućavanja SSE-a,\n\t\t\t\tobavezno pročitajte dokumentaciju kako biste razumjeli posljedice i ispravne postupke te izbjegli gubitak podataka.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Omogućavanjem ove opcije šifriraju se sve datoteke smještene u glavnoj pohrani, a u protivnom se šifriraju samo datoteke u vanjskoj pohrani",
"Encrypt the home storage" : "Šifrirajte kućnu pohranu",
"Disable recovery key" : "Onemogući ključ za oporavak",
"Enable recovery key" : "Omogući ključ za oporavak",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Ključ za oporavak dodatni je ključ za šifriranje koji se koristi za šifriranje datoteka. Služi za oporavak datoteka s računa ako se zaporka zaboravi.",
"Recovery key password" : "Zaporka ključa za oporavak",
"Passwords fields do not match" : "Polja zaporki se ne podudaraju",
"Repeat recovery key password" : "Ponovite zaporku ključa za oporavak",
"An error occurred while updating the recovery key settings. Please try again." : "Došlo je do pogreške prilikom ažuriranja postavki ključa za oporavak. Pokušajte ponovno.",
"Change recovery key password" : "Promijenite zaporku ključa za oporavak",
"Old recovery key password" : "Stara zaporka ključa za oporavak",
"New recovery key password" : "Nova zaporka ključa za oporavak",
"Repeat new recovery key password" : "Ponovite novu zaporku ključa za oporavak",
"An error occurred while changing the recovery key password. Please try again." : "Došlo je do pogreške prilikom promjene zaporke ključa za oporavak. Pokušajte ponovno.",
"Update private key password" : "Ažurirajte zaporku privatnog ključa",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Zaporka vašeg privatnog ključa više se ne podudara s vašom zaporkom za prijavu. Postavite staru zaporku privatnog ključa na svoju trenutačnu zaporku za prijavu.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Ako se ne sjećate stare zaporke, možete zatražiti od administratora da oporavi vaše datoteke.",
"Old log-in password" : "Stara zaporka za prijavu",
"Current log-in password" : "Aktualna zaporka za prijavu",
"Update" : "Ažuriraj",
"Updating recovery keys. This can take some time…" : "Ažuriranje ključeva za oporavak. Ovo može potrajati…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "U slučaju gubitka zaporke, aktiviranje ove mogućnosti ponovno će vam pribaviti pristup vašim šifriranim datotekama",
"Enable password recovery" : "Omogući oporavak zaporke",
"Default encryption module" : "Zadani modul za šifriranje",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija za šifriranje je omogućena, ali se ključevi nisu inicijalizirali, odjavite se i ponovno se prijavite",
"Basic encryption module" : "Osnovni modul za šifriranje",
"Missing parameters" : "Nedostaju parametri",
"Default encryption module for server-side encryption" : "Zadani modul za šifriranje na poslužitelju",
"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." : "Kako biste mogli koristiti ovaj modul šifriranja, morate omogućiti šifriranje na strani poslužitelja u administratorskim postavkama. Nakon omogućavanja, ovaj će modul transparentno šifrirati sve vaše datoteke. Šifriranje se temelji na AES 256 ključevima.\nModul neće dirati postojeće datoteke, već će se šifrirati samo nove datoteke nakon što se omogući šifriranje na strani poslužitelja. Također nije moguće ponovno onemogućiti šifriranje i vratiti se na nešifrirani sustav.\nPrije nego što odlučite omogućiti šifriranje na strani poslužitelja, obavezno pročitajte dokumentaciju kako biste razumjeli sve posljedice.",
"Change recovery key password:" : "Promijenite zaporku ključa za oporavak:",
"Change Password" : "Promijeni zaporku",
"Your private key password no longer matches your log-in password." : "Zaporka vašeg privatnog ključa više se ne podudara s vašom zaporkom za prijavu.",
@@ -52,6 +70,7 @@
"Update Private Key Password" : "Ažuriraj zaporku privatnog ključa",
"Enable password recovery:" : "Omogući oporavak zaporke:",
"Enabled" : "Omogućeno",
"Disabled" : "Onemogućeno"
"Disabled" : "Onemogućeno",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Ova aplikacija pruža (zadanu) kriptografsku implementaciju za Nextcloudovu značajku šifriranja na strani poslužitelja (SSE).\n\n\t\t\t**Detalji šifriranja**\n\t\t\t* **Način šifre:** AES-256-CTR (zadano)\n\t\t\t* **Autentikacija:** HMAC-SHA256\n\n\t\t\t**Važna upozorenja**\n\t\t\t* **OPASNOST:** Nemojte onemogućiti ovu aplikaciju dok sve datoteke ne budu dešifrirane (`occ encryption:decrypt-all`).\n\t\t\t* **UPOZORENJE:** Povratak na nešifriranu pohranu datoteka nakon aktivacije zahtijeva pristup naredbenom retku. Ova je radnja trajna putem web-sučelja.\"\n\n\t\t\t**Napomene za postojeće datoteke**\n\t\t\t* Prema zadanim postavkama, omogućavanje SSE-a ne šifrira postojeće datoteke; šifriraju se samo nove datoteke.\n\t\t\t* Za šifriranje svih postojećih datoteka upotrijebite naredbu `occ encryption:encrypt-all`.\n\n\t\t\t**Prije nego što započnete**\n\t\t\t* **Pročitajte dokumentaciju:** Prije omogućavanja SSE-a, šifriranja postojećih datoteka ili onemogućavanja SSE-a,\n\t\t\t\tobavezno pročitajte dokumentaciju kako biste razumjeli posljedice i odgovarajuće postupke kako biste izbjegli gubitak podataka."
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}
+80 -182
View File
@@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
@@ -21,42 +23,32 @@ use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Default file content encryption module.
*
* Implements block-based encryption, decryption, key management,
* and access control for user data storage.
*
* @see \OCP\Encryption\IEncryptionModule for detailed method documentation and contract.
*/
class Encryption implements IEncryptionModule {
public const ID = 'OC_DEFAULT_MODULE';
public const DISPLAY_NAME = 'Default encryption module';
/** @var string */
private $cipher;
/** @var string */
private $path;
/** @var string */
private $user;
private string $cipher;
private string $path;
private ?string $user;
private array $owner;
/** @var string */
private $fileKey;
/** @var string */
private $writeCache;
/** @var array */
private $accessList;
/** @var boolean */
private $isWriteOperation;
private string $fileKey;
private string $writeCache;
private array $accessList;
private bool $isWriteOperation;
private bool $useMasterPassword;
private bool $useLegacyBase64Encoding = false;
/** @var int Current version of the file */
// Current version of the file
private int $version = 0;
/** @var array remember encryption signature version */
private static $rememberVersion = [];
// Remember encryption signature version
private static array $rememberVersion = [];
public function __construct(
private Crypt $crypt,
@@ -72,38 +64,15 @@ class Encryption implements IEncryptionModule {
$this->useMasterPassword = $this->util->isMasterKeyEnabled();
}
/**
* @return string defining the technical unique id
*/
public function getId() {
public function getId(): string {
return self::ID;
}
/**
* In comparison to getKey() this function returns a human readable (maybe translated) name
*
* @return string
*/
public function getDisplayName() {
public function getDisplayName(): string {
return self::DISPLAY_NAME;
}
/**
* start receiving chunks from a file. This is the place where you can
* perform some initial step before starting encrypting/decrypting the
* chunks
*
* @param string $path to the file
* @param string $user who read/write the file
* @param string $mode php stream open mode
* @param array $header contains the header data read from the file
* @param array $accessList who has access to the file contains the key 'users' and 'public'
*
* @return array $header contain data as key-value pairs which should be
* written to the header, in case of a write operation
* or if no additional data is needed return a empty array
*/
public function begin($path, $user, $mode, array $header, array $accessList) {
public function begin(string $path, ?string $user, string $mode, array $header, array $accessList): array {
$this->path = $this->getPathToRealFile($path);
$this->accessList = $accessList;
$this->user = $user;
@@ -111,7 +80,6 @@ class Encryption implements IEncryptionModule {
$this->writeCache = '';
$this->useLegacyBase64Encoding = true;
if (isset($header['encoding'])) {
$this->useLegacyBase64Encoding = $header['encoding'] !== Crypt::BINARY_ENCODING_FORMAT;
}
@@ -124,7 +92,7 @@ class Encryption implements IEncryptionModule {
}
}
/* If useLegacyFileKey is not specified in header, auto-detect, to be safe */
// 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, $useLegacyFileKey, $this->session->decryptAllModeActivated());
@@ -178,19 +146,10 @@ class Encryption implements IEncryptionModule {
}
/**
* last chunk received. This is the place where you can perform some final
* operation and return some remaining data if something is left in your
* buffer.
*
* @param string $path to the file
* @param string $position
* @return string remained data which should be written to the file in case
* of a write operation
* @throws PublicKeyMissingException
* @throws \Exception
* @throws MultiKeyEncryptException
*/
public function end($path, $position = '0') {
public function end(string $path, string $blockId = '0'): string {
$result = '';
if ($this->isWriteOperation) {
// in case of a part file we remember the new signature versions
@@ -201,7 +160,7 @@ class Encryption implements IEncryptionModule {
self::$rememberVersion[$this->stripPartFileExtension($path)] = $this->version + 1;
}
if (!empty($this->writeCache)) {
$result = $this->crypt->symmetricEncryptFileContent($this->writeCache, $this->fileKey, $this->version + 1, $position);
$result = $this->crypt->symmetricEncryptFileContent($this->writeCache, $this->fileKey, $this->version + 1, $blockId);
$this->writeCache = '';
}
$publicKeys = [];
@@ -239,22 +198,12 @@ class Encryption implements IEncryptionModule {
return $result ?: '';
}
/**
* encrypt data
*
* @param string $data you want to encrypt
* @param int $position
* @return string encrypted data
*/
public function encrypt($data, $position = 0) {
public function encrypt(string $data, string $blockId = '0'): string {
// If extra data is left over from the last round, make sure it
// is integrated into the next block
if ($this->writeCache) {
// Concat writeCache to start of $data
$data = $this->writeCache . $data;
// Clear the write cache, ready for reuse - it has been
// flushed and its old contents processed
$this->writeCache = '';
@@ -286,7 +235,12 @@ class Encryption implements IEncryptionModule {
// Read the chunk from the start of $data
$chunk = substr($data, 0, $this->getUnencryptedBlockSize(true));
$encrypted .= $this->crypt->symmetricEncryptFileContent($chunk, $this->fileKey, $this->version + 1, (string)$position);
$encrypted .= $this->crypt->symmetricEncryptFileContent(
$chunk,
$this->fileKey,
$this->version + 1,
$blockId
);
// Remove the chunk we just processed from
// $data, leaving only unprocessed data in $data
@@ -298,15 +252,7 @@ class Encryption implements IEncryptionModule {
return $encrypted;
}
/**
* decrypt data
*
* @param string $data you want to decrypt
* @param int|string $position
* @return string decrypted data
* @throws DecryptionFailedException
*/
public function decrypt($data, $position = 0) {
public function decrypt(string $data, string $blockId = '0'): string {
if (empty($this->fileKey)) {
$msg = 'Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.';
$hint = $this->l->t('Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.');
@@ -315,18 +261,17 @@ class Encryption implements IEncryptionModule {
throw new DecryptionFailedException($msg, $hint);
}
return $this->crypt->symmetricDecryptFileContent($data, $this->fileKey, $this->cipher, $this->version, $position, !$this->useLegacyBase64Encoding);
return $this->crypt->symmetricDecryptFileContent(
$data,
$this->fileKey,
$this->cipher,
$this->version,
$blockId,
!$this->useLegacyBase64Encoding
);
}
/**
* 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 ignored
* @param array $accessList who has access to the file contains the key 'users' and 'public'
* @return bool
*/
public function update($path, $uid, array $accessList) {
public function update(string $path, ?string $uid, array $accessList): bool {
if (empty($accessList)) {
if (isset(self::$rememberVersion[$path])) {
$this->keyManager->setVersion($path, self::$rememberVersion[$path], new View());
@@ -370,13 +315,7 @@ class Encryption implements IEncryptionModule {
return true;
}
/**
* should the file be encrypted or not
*
* @param string $path
* @return boolean
*/
public function shouldEncrypt($path) {
public function shouldEncrypt(string $path): bool {
if ($this->util->shouldEncryptHomeStorage() === false) {
$storage = $this->util->getStorage($path);
if ($storage && $storage->instanceOfStorage('\OCP\Files\IHomeStorage')) {
@@ -402,25 +341,20 @@ class Encryption implements IEncryptionModule {
}
/**
* get size of the unencrypted payload per block.
* Nextcloud read/write files with a block size of 8192 byte
* Get size of the unencrypted payload per block.
* Nextcloud reads/writes files with a block size of 8192 byte.
*
* Encrypted blocks have a 22-byte IV and 2 bytes of padding, encrypted and
* Encrypted blocks have a 22-byte IV and 2 bytes of padding; encrypted and
* signed blocks have also a 71-byte signature and 1 more byte of padding,
* resulting respectively in:
*
* 8192 - 22 - 2 = 8168 bytes in each unsigned unencrypted block
* 8192 - 22 - 2 - 71 - 1 = 8096 bytes in each signed unencrypted block
* 8192 - 22 - 2 = 8168 bytes (in each unsigned unencrypted block
* 8192 - 22 - 2 - 71 - 1 = 8096 bytes (in each signed unencrypted block)
*
* Legacy base64 encoding then reduces the available size by a 3/4 factor:
*
* 8168 * (3/4) = 6126 bytes in each base64-encoded unsigned unencrypted block
* 8096 * (3/4) = 6072 bytes in each base64-encoded signed unencrypted block
*
* @param bool $signed
* @return int
* 8168 * (3/4) = 6126 bytes (in each base64-encoded unsigned unencrypted block)
* 8096 * (3/4) = 6072 bytes (in each base64-encoded signed unencrypted block)
*/
public function getUnencryptedBlockSize($signed = false) {
public function getUnencryptedBlockSize(bool $signed = false): int {
if ($this->useLegacyBase64Encoding) {
return $signed ? 6072 : 6126;
} else {
@@ -428,16 +362,7 @@ class Encryption implements IEncryptionModule {
}
}
/**
* check if the encryption module is able to read the file,
* e.g. if all encryption keys exists
*
* @param string $path
* @param string $uid user for whom we want to check if they can read the file
* @return bool
* @throws DecryptionFailedException
*/
public function isReadable($path, $uid) {
public function isReadable(string $path, ?string $uid): bool {
$fileKey = $this->keyManager->getFileKey($path, null);
if (empty($fileKey)) {
$owner = $this->util->getOwner($path);
@@ -458,37 +383,36 @@ class Encryption implements IEncryptionModule {
return true;
}
/**
* Initial encryption of all files
*
* @param InputInterface $input
* @param OutputInterface $output write some status information to the terminal during encryption
*/
public function encryptAll(InputInterface $input, OutputInterface $output) {
public function encryptAll(InputInterface $input, OutputInterface $output): void {
$this->encryptAll->encryptAll($input, $output);
}
/**
* prepare module to perform decrypt all operation
*
* @param InputInterface $input
* @param OutputInterface $output
* @param string $user
* @return bool
*/
public function prepareDecryptAll(InputInterface $input, OutputInterface $output, $user = '') {
public function prepareDecryptAll(InputInterface $input, OutputInterface $output, string $user = ''): bool {
return $this->decryptAll->prepare($input, $output, $user);
}
public function isReadyForUser(string $user): bool {
if ($this->util->isMasterKeyEnabled()) {
return true;
}
return $this->keyManager->userHasKeys($user);
}
public function needDetailedAccessList(): bool {
return !$this->util->isMasterKeyEnabled();
}
/**
* @param string $path
* @return string
* Converts a versions file path to its canonical user file path.
*
* @param string $path File path (may be a versions path)
* @return string Canonical file path
*/
protected function getPathToRealFile($path) {
protected function getPathToRealFile(string $path): string {
$realPath = $path;
$parts = explode('/', $path);
if ($parts[2] === 'files_versions') {
// e.g., "/user/files_versions/document.txt.v1234567890" --> "/user/files/document.txt"
$realPath = '/' . $parts[1] . '/files/' . implode('/', array_slice($parts, 3));
$length = strrpos($realPath, '.');
$realPath = substr($realPath, 0, $length);
@@ -498,13 +422,13 @@ class Encryption implements IEncryptionModule {
}
/**
* remove .part file extension and the ocTransferId from the file to get the
* original file name
* Removes the .part extension and ocTransferId from a part file path,
* returning the original file name.
*
* @param string $path
* @return string
* @param string $path File path, possibly with .part extension and ocTransferId
* @return string Original file path without temporary upload markers
*/
protected function stripPartFileExtension($path) {
protected function stripPartFileExtension(string $path): string {
if (pathinfo($path, PATHINFO_EXTENSION) === 'part') {
$pos = strrpos($path, '.', -6);
$path = substr($path, 0, $pos);
@@ -514,41 +438,15 @@ class Encryption implements IEncryptionModule {
}
/**
* get owner of a file
* Returns and caches the storage owner for a given file path.
*
* @param string $path
* @return string
* @param string $path File path
* @return string User id of file owner
*/
protected function getOwner($path) {
protected function getOwner(string $path): string {
if (!isset($this->owner[$path])) {
$this->owner[$path] = $this->util->getOwner($path);
}
return $this->owner[$path];
}
/**
* Check if the module is ready to be used by that specific user.
* In case a module is not ready - because e.g. key pairs have not been generated
* upon login this method can return false before any operation starts and might
* cause issues during operations.
*
* @param string $user
* @return boolean
* @since 9.1.0
*/
public function isReadyForUser($user) {
if ($this->util->isMasterKeyEnabled()) {
return true;
}
return $this->keyManager->userHasKeys($user);
}
/**
* We only need a detailed access list if the master key is not enabled
*
* @return bool
*/
public function needDetailedAccessList() {
return !$this->util->isMasterKeyEnabled();
}
}
+93 -23
View File
@@ -95,8 +95,48 @@ class EncryptionTest extends TestCase {
->method('decryptAllModeActivated')
->willReturn(false);
// Mocks for methods needed before begin()
$this->keyManagerMock->expects($this->any())
->method('getFileKey')
->willReturn('fileKey');
$this->cryptMock->expects($this->any())
->method('getCipher')
->willReturn('AES-256-CTR');
$this->cryptMock->expects($this->any())
->method('getLegacyCipher')
->willReturn('AES-128-CFB');
$this->cryptMock->expects($this->any())
->method('useLegacyBase64Encoding')
->willReturn(false);
$this->cryptMock->expects($this->any())
->method('generateFileKey')
->willReturn('fileKey');
// Prepare the post-begin mocks for end() phase
$this->keyManagerMock->expects($this->any())
->method('getPublicKey')
->willReturnCallback([$this, 'getPublicKeyCallback']);
$this->keyManagerMock->expects($this->any())
->method('addSystemKeys')
->willReturnCallback([$this, 'addSystemKeysCallback']);
$this->cryptMock->expects($this->any())
->method('multiKeyEncrypt')
->willReturn([
'user1' => 'encForUser1',
'user3' => 'encForUser3',
]);
$this->utilMock->expects($this->any())
->method('getOwner')
->willReturn('user1');
// Begin the encryption process as user1, with user2 missing their public key
$this->instance->begin('/foo/bar', 'user1', 'r', [], ['users' => ['user1', 'user2', 'user3']]);
$this->endTest();
// Set internal state to simulate write and call end()
self::invokePrivate($this->instance, 'isWriteOperation', [true]);
self::invokePrivate($this->instance, 'writeCache', ['']);
$this->instance->end('/foo/bar');
}
/**
@@ -108,36 +148,43 @@ class EncryptionTest extends TestCase {
->method('decryptAllModeActivated')
->willReturn(false);
$this->expectException(PublicKeyMissingException::class);
$this->instance->begin('/foo/bar', 'user2', 'r', [], ['users' => ['user1', 'user2', 'user3']]);
$this->endTest();
}
/**
* common part of testEndUser1 and testEndUser2
*
* @throws PublicKeyMissingException
*/
public function endTest() {
// prepare internal variables
self::invokePrivate($this->instance, 'isWriteOperation', [true]);
self::invokePrivate($this->instance, 'writeCache', ['']);
// Mocks for methods needed before begin()
$this->keyManagerMock->expects($this->any())
->method('getFileKey')
->willReturn('fileKey');
$this->cryptMock->expects($this->any())
->method('getCipher')
->willReturn('AES-256-CTR');
$this->cryptMock->expects($this->any())
->method('getLegacyCipher')
->willReturn('AES-128-CFB');
$this->cryptMock->expects($this->any())
->method('useLegacyBase64Encoding')
->willReturn(false);
$this->cryptMock->expects($this->any())
->method('generateFileKey')
->willReturn('fileKey');
// Prepare the post-begin mocks for end() phase
$this->keyManagerMock->expects($this->any())
->method('getPublicKey')
->willReturnCallback([$this, 'getPublicKeyCallback']);
$this->keyManagerMock->expects($this->any())
->method('addSystemKeys')
->willReturnCallback([$this, 'addSystemKeysCallback']);
$this->cryptMock->expects($this->any())
->method('multiKeyEncrypt')
->willReturn([]);
$this->cryptMock->expects($this->never())
->method('multiKeyEncrypt');
$this->expectException(PublicKeyMissingException::class);
$this->instance->begin('/foo/bar', 'user2', 'r', [], ['users' => ['user1', 'user2', 'user3']]);
// Set internal state to simulate write and call end()
self::invokePrivate($this->instance, 'isWriteOperation', [true]);
self::invokePrivate($this->instance, 'writeCache', ['']);
$this->instance->end('/foo/bar');
}
public function getPublicKeyCallback($uid) {
if ($uid === 'user2') {
throw new PublicKeyMissingException($uid);
@@ -235,6 +282,13 @@ class EncryptionTest extends TestCase {
->with($path, null, true)
->willReturn($fileKey);
$this->cryptMock->expects($this->any())
->method('getCipher')
->willReturn('AES-256-CTR');
$this->cryptMock->expects($this->any())
->method('getLegacyCipher')
->willReturn('AES-128-CFB');
$this->instance->begin($path, 'user', 'r', [], []);
$this->assertSame($fileKey,
@@ -252,10 +306,18 @@ class EncryptionTest extends TestCase {
->method('decryptAllModeActivated')
->willReturn(false);
$this->sessionMock->expects($this->once())->method('isReady')->willReturn(false);
$this->utilMock->expects($this->once())->method('isMasterKeyEnabled')
$this->sessionMock->expects($this->once())
->method('isReady')
->willReturn(false);
$this->utilMock->expects($this->once())
->method('isMasterKeyEnabled')
->willReturn(true);
$this->keyManagerMock->expects($this->once())->method('init')->with('', '');
$this->keyManagerMock->expects($this->once())
->method('init')
->with('', '');
$this->cryptMock->expects($this->any())
->method('getLegacyCipher')
->willReturn('anyWillDo');
$this->instance->begin('/user/files/welcome.txt', 'user', 'r', [], []);
}
@@ -282,6 +344,10 @@ class EncryptionTest extends TestCase {
$this->keyManagerMock->expects($this->never())->method('getVersion');
$this->keyManagerMock->expects($this->never())->method('setVersion');
$this->utilMock->expects($this->any())
->method('getOwner')
->willReturn('user1');
$this->assertSame($expected,
$this->instance->update('path', 'user1', ['users' => ['user1']])
);
@@ -342,6 +408,10 @@ class EncryptionTest extends TestCase {
$this->keyManagerMock->expects($this->never())->method('getVersion');
$this->keyManagerMock->expects($this->never())->method('setVersion');
$this->utilMock->expects($this->any())
->method('getOwner')
->willReturn('user1');
$this->assertTrue(
$this->instance->update('path', 'user1', ['users' => ['user1']])
);
+1 -1
View File
@@ -165,7 +165,7 @@ OC.L10N.register(
"Click to recheck the configuration" : "Клацніть для повторної перевірки налаштувань",
"Saving …" : "Збереження …",
"Failed to save global credentials" : "Не вдалося зберегти глобальні облікові дані",
"Failed to save global credentials: {message}" : "Не вдалося зберегти глобальні облікові дані: {повідомлення}",
"Failed to save global credentials: {message}" : "Не вдалося зберегти глобальні облікові дані: {message}",
"No external storage configured or you don't have the permission to configure them" : "Зовнішнє сховище не налаштовано або ви не маєте дозволу на їх налаштування",
"Open documentation" : "Відкрити документацію",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow people to mount their own external storage services." : "Зовнішнє сховище дає змогу підключати зовнішні сервіси та пристрої для зберігання даних як вторинні пристрої Nextcloud. Ви також можете дозволити користувачам монтувати власні зовнішні сховища.",
+1 -1
View File
@@ -163,7 +163,7 @@
"Click to recheck the configuration" : "Клацніть для повторної перевірки налаштувань",
"Saving …" : "Збереження …",
"Failed to save global credentials" : "Не вдалося зберегти глобальні облікові дані",
"Failed to save global credentials: {message}" : "Не вдалося зберегти глобальні облікові дані: {повідомлення}",
"Failed to save global credentials: {message}" : "Не вдалося зберегти глобальні облікові дані: {message}",
"No external storage configured or you don't have the permission to configure them" : "Зовнішнє сховище не налаштовано або ви не маєте дозволу на їх налаштування",
"Open documentation" : "Відкрити документацію",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow people to mount their own external storage services." : "Зовнішнє сховище дає змогу підключати зовнішні сервіси та пристрої для зберігання даних як вторинні пристрої Nextcloud. Ви також можете дозволити користувачам монтувати власні зовнішні сховища.",
@@ -120,25 +120,32 @@ class DBConfigService {
*/
public function getMountsForUserAndPath(string $userId, array $groupIds, string $path, bool $forChildren): array {
$path = str_replace('/' . $userId . '/files', '', $path);
$path = rtrim($path, '/');
if ($path === '') {
$nonChildPath = '/';
} else {
$nonChildPath = $path;
}
$builder = $this->getSelectQueryBuilder();
$pathFilter = $forChildren
? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '/_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($nonChildPath, IQueryBuilder::PARAM_STR));
$builder->where($builder->expr()->orX(
$builder->expr()->andX( // global mounts
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GLOBAL, IQueryBuilder::PARAM_INT)),
$builder->expr()->isNull('a.value'),
$forChildren ? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($path, IQueryBuilder::PARAM_STR)),
$pathFilter,
),
$builder->expr()->andX( // mounts for user
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_USER, IQueryBuilder::PARAM_INT)),
$builder->expr()->eq('a.value', $builder->createNamedParameter($userId)),
$forChildren ? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($path, IQueryBuilder::PARAM_STR)),
$pathFilter,
),
$builder->expr()->andX( // mounts for group
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GROUP, IQueryBuilder::PARAM_INT)),
$builder->expr()->in('a.value', $builder->createNamedParameter($groupIds, IQueryBuilder::PARAM_STR_ARRAY)),
$forChildren ? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($path, IQueryBuilder::PARAM_STR)),
$pathFilter,
),
));
@@ -156,7 +163,7 @@ class DBConfigService {
->where($builder->expr()->andX( // global mounts
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GLOBAL, IQueryBuilder::PARAM_INT)),
$builder->expr()->isNull('a.value'),
), );
));
return $this->getMountsFromQuery($query);
}
@@ -214,7 +214,7 @@ class ConfigAdapterTest extends TestCase {
public function testPartialMountpointExact(): void {
$mountFileInfo = $this->createMock(ICachedMountFileInfo::class);
$mountFileInfo->method('getUser')->willReturn($this->user);
$mountFileInfo->method('getMountPoint')->willReturn('/user1/files/subfolder/subfolder');
$mountFileInfo->method('getMountPoint')->willReturn('/user1/files/subfolder/subfolder/');
$cacheEntry = $this->createMock(ICacheEntry::class);
$result = $this->adapter->getMountsForPath('/user1/files/subfolder/subfolder', true, [
@@ -12,6 +12,7 @@ use OCA\Files_External\Service\DBConfigService;
use OCP\IDBConnection;
use OCP\Security\ICrypto;
use OCP\Server;
use PHPUnit\Framework\Attributes\DataProvider;
use Test\TestCase;
#[\PHPUnit\Framework\Attributes\Group(name: 'DB')]
@@ -271,4 +272,32 @@ class DBConfigServiceTest extends TestCase {
$this->assertEquals($id1, $mounts[0]['mount_id']);
$this->assertEquals($id2, $mounts[1]['mount_id']);
}
public static function mountsForPathProvider(): array {
return [
['/test/files/test/', false, ['/test']],
['/test/files/test/', true, ['/test/more']],
['/test/files/', false, ['/']],
['/test/files/', true, ['/test', '/test/more', '/test2']],
];
}
#[DataProvider('mountsForPathProvider')]
public function testGetMountsForUserAndPath(string $path, bool $forChildren, array $expectedMountPoints): void {
sort($expectedMountPoints);
$id1 = $this->addMount('/test', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN);
$this->dbConfig->addApplicable($id1, DBConfigService::APPLICABLE_TYPE_GLOBAL, null);
$id2 = $this->addMount('/test2', 'foo2', 'bar2', 100, DBConfigService::MOUNT_TYPE_PERSONAL);
$this->dbConfig->addApplicable($id2, DBConfigService::APPLICABLE_TYPE_GLOBAL, null);
$id3 = $this->addMount('/test/more', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN);
$this->dbConfig->addApplicable($id3, DBConfigService::APPLICABLE_TYPE_GLOBAL, null);
$id4 = $this->addMount('/', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN);
$this->dbConfig->addApplicable($id4, DBConfigService::APPLICABLE_TYPE_GLOBAL, null);
$mounts = $this->dbConfig->getMountsForUserAndPath('test', [], $path, $forChildren);
$mountPoints = array_map(fn (array $mountInfo) => $mountInfo['mount_point'], $mounts);
sort($mountPoints);
$this->assertEquals($expectedMountPoints, $mountPoints);
}
}
+1 -1
View File
@@ -399,6 +399,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "هذا التطبيق مدعوم من خلال اشتراكك الحالي في نكست كلود.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "تم تطوير التطبيقات المميزة من قبل المجتمع وداخله. و هي توفر وظائف مركزية وجاهزة للعمل في بيئة العمل الفعلية.",
"Community rating: {score}/5" : "تقييم المجتمع: {score}/5",
"Learn more" : "تعلم المزيد",
"Disable all" : "تعطيل الكل",
"Download and enable all" : "تنزيل و تمكين الكل",
"All apps are up-to-date." : "كل التطبيقات محدثة لآخر إصدار",
@@ -441,7 +442,6 @@ OC.L10N.register(
"Advanced deploy options" : "خيارات النشر المتقدمة",
"Edit ExApp deploy options before installation" : "قُم بتعديل خيارات نشر التطبيقات الخارجية ExAPP قبل التثبيت",
"Configured ExApp deploy options. Can be set only during installation" : "الخيارات المُهيَّأة لنشر التطبيقات الخارجية ExAPP، يمكن تعيينها فقط أثناء التثبيت",
"Learn more" : "تعلم المزيد",
"Environment variables" : "متغيرات البيئة",
"ExApp container environment variables" : "متغيرات بيئة حاوية التطبيقات الخارجية ExApp",
"No environment variables defined" : "لم يتم تعريف أي متغيرات بيئية",
+1 -1
View File
@@ -397,6 +397,7 @@
"This app is supported via your current Nextcloud subscription." : "هذا التطبيق مدعوم من خلال اشتراكك الحالي في نكست كلود.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "تم تطوير التطبيقات المميزة من قبل المجتمع وداخله. و هي توفر وظائف مركزية وجاهزة للعمل في بيئة العمل الفعلية.",
"Community rating: {score}/5" : "تقييم المجتمع: {score}/5",
"Learn more" : "تعلم المزيد",
"Disable all" : "تعطيل الكل",
"Download and enable all" : "تنزيل و تمكين الكل",
"All apps are up-to-date." : "كل التطبيقات محدثة لآخر إصدار",
@@ -439,7 +440,6 @@
"Advanced deploy options" : "خيارات النشر المتقدمة",
"Edit ExApp deploy options before installation" : "قُم بتعديل خيارات نشر التطبيقات الخارجية ExAPP قبل التثبيت",
"Configured ExApp deploy options. Can be set only during installation" : "الخيارات المُهيَّأة لنشر التطبيقات الخارجية ExAPP، يمكن تعيينها فقط أثناء التثبيت",
"Learn more" : "تعلم المزيد",
"Environment variables" : "متغيرات البيئة",
"ExApp container environment variables" : "متغيرات بيئة حاوية التطبيقات الخارجية ExApp",
"No environment variables defined" : "لم يتم تعريف أي متغيرات بيئية",
+1 -1
View File
@@ -207,6 +207,7 @@ OC.L10N.register(
"Default" : "Por defeutu",
"Remove" : "Quitar",
"Featured" : "Destacada",
"Learn more" : "Deprendi más",
"Disable all" : "Desactivar too",
"All apps are up-to-date." : "Toles aplicaciones tán anovaes",
"Icon" : "Iconu",
@@ -234,7 +235,6 @@ OC.L10N.register(
"Daemon" : "Degorriu",
"Type" : "Tipu",
"Display Name" : "Nome visible",
"Learn more" : "Deprendi más",
"Confirm" : "Confirmar",
"Cancel" : "Encaboxar",
"Description" : "Descripción",
+1 -1
View File
@@ -205,6 +205,7 @@
"Default" : "Por defeutu",
"Remove" : "Quitar",
"Featured" : "Destacada",
"Learn more" : "Deprendi más",
"Disable all" : "Desactivar too",
"All apps are up-to-date." : "Toles aplicaciones tán anovaes",
"Icon" : "Iconu",
@@ -232,7 +233,6 @@
"Daemon" : "Degorriu",
"Type" : "Tipu",
"Display Name" : "Nome visible",
"Learn more" : "Deprendi más",
"Confirm" : "Confirmar",
"Cancel" : "Encaboxar",
"Description" : "Descripción",
+1 -1
View File
@@ -131,6 +131,7 @@ OC.L10N.register(
"Default" : "Прадвызначаныя",
"Update to {update}" : "Абнавіць да {update}",
"Remove" : "Выдаліць",
"Learn more" : "Больш падрабязна",
"Disable all" : "Адключыць усе",
"Download and enable all" : "Спампаваць і уключыць усе",
"All apps are up-to-date." : "Усе праграмы абноўлены.",
@@ -159,7 +160,6 @@ OC.L10N.register(
"{index} of {total}" : "{index} з {total}",
"Type" : "Тып",
"Display Name" : "Імя для паказу",
"Learn more" : "Больш падрабязна",
"Environment variables" : "Пераменныя асяроддзя",
"Confirm" : "Пацвердзіць",
"Cancel" : "Скасаваць",
+1 -1
View File
@@ -129,6 +129,7 @@
"Default" : "Прадвызначаныя",
"Update to {update}" : "Абнавіць да {update}",
"Remove" : "Выдаліць",
"Learn more" : "Больш падрабязна",
"Disable all" : "Адключыць усе",
"Download and enable all" : "Спампаваць і уключыць усе",
"All apps are up-to-date." : "Усе праграмы абноўлены.",
@@ -157,7 +158,6 @@
"{index} of {total}" : "{index} з {total}",
"Type" : "Тып",
"Display Name" : "Імя для паказу",
"Learn more" : "Больш падрабязна",
"Environment variables" : "Пераменныя асяроддзя",
"Confirm" : "Пацвердзіць",
"Cancel" : "Скасаваць",
+1 -1
View File
@@ -428,6 +428,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Това приложение се поддържа чрез текущия ви абонамент за Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Представените приложения са разработени от и в рамките на общността. Те предлагат централна функционалност и са готови за производствена употреба.",
"Community rating: {score}/5" : "Оценка на общността: {score} /5",
"Learn more" : "Научете повече",
"Disable all" : "Изключи всички",
"Download and enable all" : "Изтеглете и активирайте всички",
"All apps are up-to-date." : "Всички приложения са актуални.",
@@ -470,7 +471,6 @@ OC.L10N.register(
"Advanced deploy options" : "Разширени опции за внедряване",
"Edit ExApp deploy options before installation" : "Редактиране на опциите за внедряване на ExApp преди инсталиране",
"Configured ExApp deploy options. Can be set only during installation" : "Конфигурирани опции за внедряване на ExApp. Могат да се зададат само по време на инсталацията.",
"Learn more" : "Научете повече",
"Environment variables" : "Променливи на средата",
"ExApp container environment variables" : "Променливи на средата на ExApp",
"No environment variables defined" : "Няма дефинирани променливи на средата",
+1 -1
View File
@@ -426,6 +426,7 @@
"This app is supported via your current Nextcloud subscription." : "Това приложение се поддържа чрез текущия ви абонамент за Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Представените приложения са разработени от и в рамките на общността. Те предлагат централна функционалност и са готови за производствена употреба.",
"Community rating: {score}/5" : "Оценка на общността: {score} /5",
"Learn more" : "Научете повече",
"Disable all" : "Изключи всички",
"Download and enable all" : "Изтеглете и активирайте всички",
"All apps are up-to-date." : "Всички приложения са актуални.",
@@ -468,7 +469,6 @@
"Advanced deploy options" : "Разширени опции за внедряване",
"Edit ExApp deploy options before installation" : "Редактиране на опциите за внедряване на ExApp преди инсталиране",
"Configured ExApp deploy options. Can be set only during installation" : "Конфигурирани опции за внедряване на ExApp. Могат да се зададат само по време на инсталацията.",
"Learn more" : "Научете повече",
"Environment variables" : "Променливи на средата",
"ExApp container environment variables" : "Променливи на средата на ExApp",
"No environment variables defined" : "Няма дефинирани променливи на средата",
+1 -1
View File
@@ -123,6 +123,7 @@ OC.L10N.register(
"Featured" : "Perzhiet",
"This app is supported via your current Nextcloud subscription." : "Ar meziant-mañ a vez douget dre ho kommanant Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Meziantoù perzhiet a vez digeliet gant ha e-vbarzh ar gummuniezh. Perzhioù penna a vez roet gante ha prest int da krouiñ reoù all.",
"Learn more" : "Deskiñ muioc'h",
"Disable all" : "Difenn pep tra",
"Icon" : "Skeudennig",
"Name" : "Anv",
@@ -134,7 +135,6 @@ OC.L10N.register(
"Groups" : "Strolladoù",
"Loading" : "Kargañ",
"Type" : "Seurt",
"Learn more" : "Deskiñ muioc'h",
"Confirm" : "Kadarnañ",
"Cancel" : "Nullañ",
"Description" : "Deskrivadur",
+1 -1
View File
@@ -121,6 +121,7 @@
"Featured" : "Perzhiet",
"This app is supported via your current Nextcloud subscription." : "Ar meziant-mañ a vez douget dre ho kommanant Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Meziantoù perzhiet a vez digeliet gant ha e-vbarzh ar gummuniezh. Perzhioù penna a vez roet gante ha prest int da krouiñ reoù all.",
"Learn more" : "Deskiñ muioc'h",
"Disable all" : "Difenn pep tra",
"Icon" : "Skeudennig",
"Name" : "Anv",
@@ -132,7 +133,6 @@
"Groups" : "Strolladoù",
"Loading" : "Kargañ",
"Type" : "Seurt",
"Learn more" : "Deskiñ muioc'h",
"Confirm" : "Kadarnañ",
"Cancel" : "Nullañ",
"Description" : "Deskrivadur",
+1 -1
View File
@@ -397,6 +397,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Aquesta aplicació és compatible amb la vostra subscripció actual a Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Les aplicacions destacades es desenvolupen per i dins de la comunitat. Ofereixen funcionalitats centrals i estan preparades per ser emprades en producció.",
"Community rating: {score}/5" : "Valoració de la comunitat: {score}/5",
"Learn more" : "Més informació",
"Disable all" : "Inhabilita tot",
"Download and enable all" : "Baixada i activació de tot",
"All apps are up-to-date." : "Totes les aplicacions estan actualitzades.",
@@ -436,7 +437,6 @@ OC.L10N.register(
"Advanced deploy options" : "Opcions de desplegament avançades",
"Edit ExApp deploy options before installation" : "Editeu les opcions de desplegament d'ExApp abans de la instal·lació",
"Configured ExApp deploy options. Can be set only during installation" : "Opcions de desplegament d'ExApp configurades. Només es pot configurar durant la instal·lació",
"Learn more" : "Més informació",
"Environment variables" : "Variables d'entorn",
"ExApp container environment variables" : "Variables d'entorn del contenidor ExApp",
"No environment variables defined" : "No s'han definit variables d'entorn",
+1 -1
View File
@@ -395,6 +395,7 @@
"This app is supported via your current Nextcloud subscription." : "Aquesta aplicació és compatible amb la vostra subscripció actual a Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Les aplicacions destacades es desenvolupen per i dins de la comunitat. Ofereixen funcionalitats centrals i estan preparades per ser emprades en producció.",
"Community rating: {score}/5" : "Valoració de la comunitat: {score}/5",
"Learn more" : "Més informació",
"Disable all" : "Inhabilita tot",
"Download and enable all" : "Baixada i activació de tot",
"All apps are up-to-date." : "Totes les aplicacions estan actualitzades.",
@@ -434,7 +435,6 @@
"Advanced deploy options" : "Opcions de desplegament avançades",
"Edit ExApp deploy options before installation" : "Editeu les opcions de desplegament d'ExApp abans de la instal·lació",
"Configured ExApp deploy options. Can be set only during installation" : "Opcions de desplegament d'ExApp configurades. Només es pot configurar durant la instal·lació",
"Learn more" : "Més informació",
"Environment variables" : "Variables d'entorn",
"ExApp container environment variables" : "Variables d'entorn del contenidor ExApp",
"No environment variables defined" : "No s'han definit variables d'entorn",
+1 -1
View File
@@ -438,6 +438,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Tato aplikace je podporována prostřednictvím vašeho stávajícího předplatného podpory Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Doporučované aplikace jsou vyvíjeny komunitou. Jsou propojeny se zbytkem Nextcloud a připraveny na produkční nasazení.",
"Community rating: {score}/5" : "Hodnocení komunitou: {score}/5",
"Learn more" : "Zjistit více",
"Disable all" : "Zakázat vše",
"Download and enable all" : "Stáhnout a zapnout vše",
"All apps are up-to-date." : "Všechny aplikace jsou aktuální",
@@ -480,7 +481,6 @@ OC.L10N.register(
"Advanced deploy options" : "Pokročilé předvolby pro nasazení",
"Edit ExApp deploy options before installation" : "Předvolby nasazení ExApp před instalací",
"Configured ExApp deploy options. Can be set only during installation" : "Nastavené předvolby nasazení ExAPP. Je možné nastavovat pouze při instalaci",
"Learn more" : "Zjistit více",
"Environment variables" : "Proměnné prostředí",
"ExApp container environment variables" : "Proměnné prostředí pro kontejner s ExApp",
"No environment variables defined" : "Nedefinovány žádné proměnné prostředí",
+1 -1
View File
@@ -436,6 +436,7 @@
"This app is supported via your current Nextcloud subscription." : "Tato aplikace je podporována prostřednictvím vašeho stávajícího předplatného podpory Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Doporučované aplikace jsou vyvíjeny komunitou. Jsou propojeny se zbytkem Nextcloud a připraveny na produkční nasazení.",
"Community rating: {score}/5" : "Hodnocení komunitou: {score}/5",
"Learn more" : "Zjistit více",
"Disable all" : "Zakázat vše",
"Download and enable all" : "Stáhnout a zapnout vše",
"All apps are up-to-date." : "Všechny aplikace jsou aktuální",
@@ -478,7 +479,6 @@
"Advanced deploy options" : "Pokročilé předvolby pro nasazení",
"Edit ExApp deploy options before installation" : "Předvolby nasazení ExApp před instalací",
"Configured ExApp deploy options. Can be set only during installation" : "Nastavené předvolby nasazení ExAPP. Je možné nastavovat pouze při instalaci",
"Learn more" : "Zjistit více",
"Environment variables" : "Proměnné prostředí",
"ExApp container environment variables" : "Proměnné prostředí pro kontejner s ExApp",
"No environment variables defined" : "Nedefinovány žádné proměnné prostředí",
+1 -1
View File
@@ -421,6 +421,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Denne app understøttes via dit nuværende Nextcloud-abonnement.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Udvalgte apps er udviklet af og inden for fællesskabet. De tilbyder central funktionalitet og er klar til produktionsbrug.",
"Community rating: {score}/5" : "Fællesskabsbedømmelse: {score}/5",
"Learn more" : "Lær mere",
"Disable all" : "Deaktiver alt",
"Download and enable all" : "Download og aktiver alle",
"All apps are up-to-date." : "Alle apps er opdateret",
@@ -463,7 +464,6 @@ OC.L10N.register(
"Advanced deploy options" : "Avancerede udrulningsindstillinger",
"Edit ExApp deploy options before installation" : "Redigér ExApp udrulningsindstillinger før installation",
"Configured ExApp deploy options. Can be set only during installation" : "Konfigurerede ExApp udrulningsindstillinger. Kan kun indstilles under installationen",
"Learn more" : "Lær mere",
"Environment variables" : "Miljøvariabler",
"ExApp container environment variables" : "ExApp container miljøvariabler",
"No environment variables defined" : "Ingen miljøvariabler defineret",
+1 -1
View File
@@ -419,6 +419,7 @@
"This app is supported via your current Nextcloud subscription." : "Denne app understøttes via dit nuværende Nextcloud-abonnement.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Udvalgte apps er udviklet af og inden for fællesskabet. De tilbyder central funktionalitet og er klar til produktionsbrug.",
"Community rating: {score}/5" : "Fællesskabsbedømmelse: {score}/5",
"Learn more" : "Lær mere",
"Disable all" : "Deaktiver alt",
"Download and enable all" : "Download og aktiver alle",
"All apps are up-to-date." : "Alle apps er opdateret",
@@ -461,7 +462,6 @@
"Advanced deploy options" : "Avancerede udrulningsindstillinger",
"Edit ExApp deploy options before installation" : "Redigér ExApp udrulningsindstillinger før installation",
"Configured ExApp deploy options. Can be set only during installation" : "Konfigurerede ExApp udrulningsindstillinger. Kan kun indstilles under installationen",
"Learn more" : "Lær mere",
"Environment variables" : "Miljøvariabler",
"ExApp container environment variables" : "ExApp container miljøvariabler",
"No environment variables defined" : "Ingen miljøvariabler defineret",
+1 -1
View File
@@ -438,6 +438,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Diese App wird von dem aktuellen Nextcloud-Abonnement unterstützt.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Vorgestellte Apps werden von und innerhalb der Nextcloud-Community entwickelt. Sie stellen zentrale Funktionen bereit und sind für den produktiven Einsatz geeignet.",
"Community rating: {score}/5" : "Community-Bewertung: {score}/5",
"Learn more" : "Mehr erfahren",
"Disable all" : "Alle deaktivieren",
"Download and enable all" : "Alle herunterladen und aktivieren",
"All apps are up-to-date." : "Alle Apps sind aktuell.",
@@ -480,7 +481,6 @@ OC.L10N.register(
"Advanced deploy options" : "Erweiterte Bereitstellungsoptionen",
"Edit ExApp deploy options before installation" : "Bereitstellungsoptionen von ExApp vor der Installation bearbeiten",
"Configured ExApp deploy options. Can be set only during installation" : "Eingestellte ExApp-Bereitstellungsoptionen. Kann nur während der Installation festgelegt werden",
"Learn more" : "Mehr erfahren",
"Environment variables" : "Umgebungsvariablen",
"ExApp container environment variables" : "Umgebungsvariablen für ExApp-Container",
"No environment variables defined" : "Keine Umgebungsvariablen definiert",
+1 -1
View File
@@ -436,6 +436,7 @@
"This app is supported via your current Nextcloud subscription." : "Diese App wird von dem aktuellen Nextcloud-Abonnement unterstützt.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Vorgestellte Apps werden von und innerhalb der Nextcloud-Community entwickelt. Sie stellen zentrale Funktionen bereit und sind für den produktiven Einsatz geeignet.",
"Community rating: {score}/5" : "Community-Bewertung: {score}/5",
"Learn more" : "Mehr erfahren",
"Disable all" : "Alle deaktivieren",
"Download and enable all" : "Alle herunterladen und aktivieren",
"All apps are up-to-date." : "Alle Apps sind aktuell.",
@@ -478,7 +479,6 @@
"Advanced deploy options" : "Erweiterte Bereitstellungsoptionen",
"Edit ExApp deploy options before installation" : "Bereitstellungsoptionen von ExApp vor der Installation bearbeiten",
"Configured ExApp deploy options. Can be set only during installation" : "Eingestellte ExApp-Bereitstellungsoptionen. Kann nur während der Installation festgelegt werden",
"Learn more" : "Mehr erfahren",
"Environment variables" : "Umgebungsvariablen",
"ExApp container environment variables" : "Umgebungsvariablen für ExApp-Container",
"No environment variables defined" : "Keine Umgebungsvariablen definiert",
+1 -1
View File
@@ -438,6 +438,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Diese App wird von Ihrem aktuellen Nextcloud-Abonnement unterstützt.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Vorgestellte Apps werden von und innerhalb der Nextcloud-Community entwickelt. Sie stellen zentrale Funktionen bereit und sind für den produktiven Einsatz geeignet.",
"Community rating: {score}/5" : "Community-Bewertung: {score}/5",
"Learn more" : "Mehr erfahren",
"Disable all" : "Alle deaktivieren",
"Download and enable all" : "Alle herunterladen und aktivieren",
"All apps are up-to-date." : "Alle Apps sind aktuell.",
@@ -480,7 +481,6 @@ OC.L10N.register(
"Advanced deploy options" : "Erweiterte Bereitstellungsoptionen",
"Edit ExApp deploy options before installation" : "Bereitstellungsoptionen von ExApp vor der Installation bearbeiten",
"Configured ExApp deploy options. Can be set only during installation" : "Festgelegte ExApp-Bereitstellungsoptionen. Kann nur während der Installation festgelegt werden",
"Learn more" : "Mehr erfahren",
"Environment variables" : "Umgebungsvariablen",
"ExApp container environment variables" : "Umgebungsvariablen für ExApp-Container",
"No environment variables defined" : "Keine Umgebungsvariablen definiert",
+1 -1
View File
@@ -436,6 +436,7 @@
"This app is supported via your current Nextcloud subscription." : "Diese App wird von Ihrem aktuellen Nextcloud-Abonnement unterstützt.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Vorgestellte Apps werden von und innerhalb der Nextcloud-Community entwickelt. Sie stellen zentrale Funktionen bereit und sind für den produktiven Einsatz geeignet.",
"Community rating: {score}/5" : "Community-Bewertung: {score}/5",
"Learn more" : "Mehr erfahren",
"Disable all" : "Alle deaktivieren",
"Download and enable all" : "Alle herunterladen und aktivieren",
"All apps are up-to-date." : "Alle Apps sind aktuell.",
@@ -478,7 +479,6 @@
"Advanced deploy options" : "Erweiterte Bereitstellungsoptionen",
"Edit ExApp deploy options before installation" : "Bereitstellungsoptionen von ExApp vor der Installation bearbeiten",
"Configured ExApp deploy options. Can be set only during installation" : "Festgelegte ExApp-Bereitstellungsoptionen. Kann nur während der Installation festgelegt werden",
"Learn more" : "Mehr erfahren",
"Environment variables" : "Umgebungsvariablen",
"ExApp container environment variables" : "Umgebungsvariablen für ExApp-Container",
"No environment variables defined" : "Keine Umgebungsvariablen definiert",
+1 -1
View File
@@ -413,6 +413,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Αυτή η εφαρμογή υποστηρίζεται μέσω της τρέχουσας συνδρομής σας στο Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Οι προτεινόμενες εφαρμογές αναπτύσσονται από και εντός της κοινότητας. Προσφέρουν κεντρική λειτουργικότητα και είναι έτοιμες για χρήση.",
"Community rating: {score}/5" : "Βαθμολογία κοινότητας: {score}/5",
"Learn more" : "Μάθετε περισσότερα",
"Disable all" : "Απενεργοποίηση όλων",
"Download and enable all" : "Λήψη και ενεργοποίηση όλων",
"All apps are up-to-date." : "Όλες οι εφαρμογές είναι ενημερωμένες.",
@@ -455,7 +456,6 @@ OC.L10N.register(
"Advanced deploy options" : "Προηγμένες επιλογές ανάπτυξης",
"Edit ExApp deploy options before installation" : "Επεξεργασία επιλογών ανάπτυξης ExApp πριν την εγκατάσταση",
"Configured ExApp deploy options. Can be set only during installation" : "Ρυθμισμένες επιλογές ανάπτυξης ExApp. Μπορούν να ρυθμιστούν μόνο κατά την εγκατάσταση",
"Learn more" : "Μάθετε περισσότερα",
"Environment variables" : "Μεταβλητές περιβάλλοντος",
"ExApp container environment variables" : "Μεταβλητές περιβάλλοντος ExApp container",
"No environment variables defined" : "Δεν έχουν οριστεί μεταβλητές περιβάλλοντος",
+1 -1
View File
@@ -411,6 +411,7 @@
"This app is supported via your current Nextcloud subscription." : "Αυτή η εφαρμογή υποστηρίζεται μέσω της τρέχουσας συνδρομής σας στο Nextcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Οι προτεινόμενες εφαρμογές αναπτύσσονται από και εντός της κοινότητας. Προσφέρουν κεντρική λειτουργικότητα και είναι έτοιμες για χρήση.",
"Community rating: {score}/5" : "Βαθμολογία κοινότητας: {score}/5",
"Learn more" : "Μάθετε περισσότερα",
"Disable all" : "Απενεργοποίηση όλων",
"Download and enable all" : "Λήψη και ενεργοποίηση όλων",
"All apps are up-to-date." : "Όλες οι εφαρμογές είναι ενημερωμένες.",
@@ -453,7 +454,6 @@
"Advanced deploy options" : "Προηγμένες επιλογές ανάπτυξης",
"Edit ExApp deploy options before installation" : "Επεξεργασία επιλογών ανάπτυξης ExApp πριν την εγκατάσταση",
"Configured ExApp deploy options. Can be set only during installation" : "Ρυθμισμένες επιλογές ανάπτυξης ExApp. Μπορούν να ρυθμιστούν μόνο κατά την εγκατάσταση",
"Learn more" : "Μάθετε περισσότερα",
"Environment variables" : "Μεταβλητές περιβάλλοντος",
"ExApp container environment variables" : "Μεταβλητές περιβάλλοντος ExApp container",
"No environment variables defined" : "Δεν έχουν οριστεί μεταβλητές περιβάλλοντος",
+1 -1
View File
@@ -438,6 +438,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "This app is supported via your current Nextcloud subscription.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Featured apps are developed by and within the community. They offer central functionality and are ready for production use.",
"Community rating: {score}/5" : "Community rating: {score}/5",
"Learn more" : "Learn more",
"Disable all" : "Disable all",
"Download and enable all" : "Download and enable all",
"All apps are up-to-date." : "All apps are up-to-date.",
@@ -480,7 +481,6 @@ OC.L10N.register(
"Advanced deploy options" : "Advanced deploy options",
"Edit ExApp deploy options before installation" : "Edit ExApp deploy options before installation",
"Configured ExApp deploy options. Can be set only during installation" : "Configured ExApp deploy options. Can be set only during installation",
"Learn more" : "Learn more",
"Environment variables" : "Environment variables",
"ExApp container environment variables" : "ExApp container environment variables",
"No environment variables defined" : "No environment variables defined",
+1 -1
View File
@@ -436,6 +436,7 @@
"This app is supported via your current Nextcloud subscription." : "This app is supported via your current Nextcloud subscription.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Featured apps are developed by and within the community. They offer central functionality and are ready for production use.",
"Community rating: {score}/5" : "Community rating: {score}/5",
"Learn more" : "Learn more",
"Disable all" : "Disable all",
"Download and enable all" : "Download and enable all",
"All apps are up-to-date." : "All apps are up-to-date.",
@@ -478,7 +479,6 @@
"Advanced deploy options" : "Advanced deploy options",
"Edit ExApp deploy options before installation" : "Edit ExApp deploy options before installation",
"Configured ExApp deploy options. Can be set only during installation" : "Configured ExApp deploy options. Can be set only during installation",
"Learn more" : "Learn more",
"Environment variables" : "Environment variables",
"ExApp container environment variables" : "ExApp container environment variables",
"No environment variables defined" : "No environment variables defined",
+1 -1
View File
@@ -118,6 +118,7 @@ OC.L10N.register(
"Featured" : "Elstaraj",
"This app is supported via your current Nextcloud subscription." : "Tiu aplikaĵo estas subtenita per via nuna Nextcloud-abono.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Elstaraj aplikaĵoj estas programataj de kaj ene de la komunumo. Ili alportas kernajn trajtojn kaj ili povas tuj uziĝi.",
"Learn more" : "Scii pli",
"Disable all" : "Malŝalti ĉiujn",
"Icon" : "Piktogramo",
"Name" : "Nomo",
@@ -130,7 +131,6 @@ OC.L10N.register(
"Group name" : "Gruponomo",
"Loading" : "Ŝargado",
"Type" : "Tipo",
"Learn more" : "Scii pli",
"Confirm" : "Konfirmi",
"Cancel" : "Nuligi",
"Description" : "Priskribo",
+1 -1
View File
@@ -116,6 +116,7 @@
"Featured" : "Elstaraj",
"This app is supported via your current Nextcloud subscription." : "Tiu aplikaĵo estas subtenita per via nuna Nextcloud-abono.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Elstaraj aplikaĵoj estas programataj de kaj ene de la komunumo. Ili alportas kernajn trajtojn kaj ili povas tuj uziĝi.",
"Learn more" : "Scii pli",
"Disable all" : "Malŝalti ĉiujn",
"Icon" : "Piktogramo",
"Name" : "Nomo",
@@ -128,7 +129,6 @@
"Group name" : "Gruponomo",
"Loading" : "Ŝargado",
"Type" : "Tipo",
"Learn more" : "Scii pli",
"Confirm" : "Konfirmi",
"Cancel" : "Nuligi",
"Description" : "Priskribo",
+1 -1
View File
@@ -438,6 +438,7 @@ OC.L10N.register(
"This app is supported via your current Nextcloud subscription." : "Esta App está soportada a través de su suscripción actual de Nexcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Las apps destacadas están desarrolladas por y dentro de la comunidad. Ofrecen una funcionalidad central y están listas para usarlas en producción.",
"Community rating: {score}/5" : "Calificación de la comunidad: {score}/5",
"Learn more" : "Aprender más",
"Disable all" : "Deshabilitar todos",
"Download and enable all" : "Descargar y habilitar todo",
"All apps are up-to-date." : "Todas las apps están actualizadas.",
@@ -480,7 +481,6 @@ OC.L10N.register(
"Advanced deploy options" : "Opciones avanzadas del despliegue",
"Edit ExApp deploy options before installation" : "Editar las opciones de despliegue de ExApp antes de la instalación",
"Configured ExApp deploy options. Can be set only during installation" : "Opciones de despliegue de ExApp configuradas. Sólo pueden configurarse durante la instalación",
"Learn more" : "Aprender más",
"Environment variables" : "Variables de entorno",
"ExApp container environment variables" : "Variables de entorno del contenedor ExApp ",
"No environment variables defined" : "No hay variables de entorno definidas",
+1 -1
View File
@@ -436,6 +436,7 @@
"This app is supported via your current Nextcloud subscription." : "Esta App está soportada a través de su suscripción actual de Nexcloud.",
"Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Las apps destacadas están desarrolladas por y dentro de la comunidad. Ofrecen una funcionalidad central y están listas para usarlas en producción.",
"Community rating: {score}/5" : "Calificación de la comunidad: {score}/5",
"Learn more" : "Aprender más",
"Disable all" : "Deshabilitar todos",
"Download and enable all" : "Descargar y habilitar todo",
"All apps are up-to-date." : "Todas las apps están actualizadas.",
@@ -478,7 +479,6 @@
"Advanced deploy options" : "Opciones avanzadas del despliegue",
"Edit ExApp deploy options before installation" : "Editar las opciones de despliegue de ExApp antes de la instalación",
"Configured ExApp deploy options. Can be set only during installation" : "Opciones de despliegue de ExApp configuradas. Sólo pueden configurarse durante la instalación",
"Learn more" : "Aprender más",
"Environment variables" : "Variables de entorno",
"ExApp container environment variables" : "Variables de entorno del contenedor ExApp ",
"No environment variables defined" : "No hay variables de entorno definidas",
+1 -1
View File
@@ -86,6 +86,7 @@ OC.L10N.register(
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -96,7 +97,6 @@ OC.L10N.register(
"Group name" : "Nombre del grupo",
"Type" : "Tipo",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -84,6 +84,7 @@
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -94,7 +95,6 @@
"Group name" : "Nombre del grupo",
"Type" : "Tipo",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -252,6 +252,7 @@ OC.L10N.register(
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conozca más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -267,7 +268,6 @@ OC.L10N.register(
"Loading" : "Cargando",
"Type" : "Escribir",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conozca más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -250,6 +250,7 @@
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conozca más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -265,7 +266,6 @@
"Loading" : "Cargando",
"Type" : "Escribir",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conozca más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -88,6 +88,7 @@ OC.L10N.register(
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -100,7 +101,6 @@ OC.L10N.register(
"Daemon" : "Demonio",
"Type" : "Tipo",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -86,6 +86,7 @@
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -98,7 +99,6 @@
"Daemon" : "Demonio",
"Type" : "Tipo",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -88,6 +88,7 @@ OC.L10N.register(
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -99,7 +100,6 @@ OC.L10N.register(
"Daemon" : "Demonio",
"Type" : "Tipo",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -86,6 +86,7 @@
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -97,7 +98,6 @@
"Daemon" : "Demonio",
"Type" : "Tipo",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -87,6 +87,7 @@ OC.L10N.register(
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -98,7 +99,6 @@ OC.L10N.register(
"Loading" : "Cargando",
"Daemon" : "Demonio",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -85,6 +85,7 @@
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -96,7 +97,6 @@
"Loading" : "Cargando",
"Daemon" : "Demonio",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -87,6 +87,7 @@ OC.L10N.register(
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -97,7 +98,6 @@ OC.L10N.register(
"Group name" : "Nombre del grupo",
"Daemon" : "Demonio",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",
+1 -1
View File
@@ -85,6 +85,7 @@
"Save changes" : "Guardar cambios",
"Remove" : "Eliminar",
"Featured" : "Destacado",
"Learn more" : "Conoce más",
"Icon" : "Ícono",
"Name" : "Nombre",
"Version" : "Versión",
@@ -95,7 +96,6 @@
"Group name" : "Nombre del grupo",
"Daemon" : "Demonio",
"Display Name" : "Nombre a desplegar",
"Learn more" : "Conoce más",
"Confirm" : "Confirmar",
"Cancel" : "Cancelar",
"Description" : "Descripción",

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