├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── appstore-build-publish.yml │ ├── dependabot-approve-merge.yml │ ├── fixup.yml │ ├── lint-eslint.yml │ ├── lint-php-cs.yml │ ├── lint-php.yml │ ├── litmus.yml │ ├── node-test.yml │ ├── node.yml │ ├── npm-audit-fix.yml │ ├── phpunit-mariadb.yml │ ├── phpunit-mysql.yml │ ├── phpunit-oci.yml │ ├── phpunit-pgsql.yml │ ├── phpunit-sqlite.yml │ ├── playwright.yml │ ├── pr-feedback.yml │ ├── psalm.yml │ ├── reuse.yml │ ├── update-nextcloud-ocp-approve-merge.yml │ └── update-nextcloud-ocp.yml ├── .gitignore ├── .nextcloudignore ├── .php-cs-fixer.dist.php ├── .tx └── config ├── AUTHORS.md ├── CHANGELOG.md ├── LICENSE ├── LICENSES ├── AGPL-3.0-or-later.txt ├── CC0-1.0.txt └── MIT.txt ├── Makefile ├── README.md ├── REUSE.toml ├── appinfo ├── info.xml └── routes.php ├── composer.json ├── composer.lock ├── krankerl.toml ├── l10n ├── .gitkeep ├── af.js ├── af.json ├── ar.js ├── ar.json ├── ast.js ├── ast.json ├── az.js ├── az.json ├── bg.js ├── bg.json ├── br.js ├── br.json ├── bs.js ├── bs.json ├── ca.js ├── ca.json ├── cs.js ├── cs.json ├── da.js ├── da.json ├── de.js ├── de.json ├── de_DE.js ├── de_DE.json ├── el.js ├── el.json ├── en_GB.js ├── en_GB.json ├── eo.js ├── eo.json ├── es.js ├── es.json ├── es_419.js ├── es_419.json ├── es_AR.js ├── es_AR.json ├── es_CL.js ├── es_CL.json ├── es_CO.js ├── es_CO.json ├── es_CR.js ├── es_CR.json ├── es_DO.js ├── es_DO.json ├── es_EC.js ├── es_EC.json ├── es_GT.js ├── es_GT.json ├── es_HN.js ├── es_HN.json ├── es_MX.js ├── es_MX.json ├── es_NI.js ├── es_NI.json ├── es_PA.js ├── es_PA.json ├── es_PE.js ├── es_PE.json ├── es_PR.js ├── es_PR.json ├── es_PY.js ├── es_PY.json ├── es_SV.js ├── es_SV.json ├── es_UY.js ├── es_UY.json ├── et_EE.js ├── et_EE.json ├── eu.js ├── eu.json ├── fa.js ├── fa.json ├── fi.js ├── fi.json ├── fr.js ├── fr.json ├── ga.js ├── ga.json ├── gl.js ├── gl.json ├── he.js ├── he.json ├── hr.js ├── hr.json ├── hu.js ├── hu.json ├── ia.js ├── ia.json ├── id.js ├── id.json ├── is.js ├── is.json ├── it.js ├── it.json ├── ja.js ├── ja.json ├── ka.js ├── ka.json ├── ka_GE.js ├── ka_GE.json ├── ko.js ├── ko.json ├── lb.js ├── lb.json ├── lt_LT.js ├── lt_LT.json ├── lv.js ├── lv.json ├── mk.js ├── mk.json ├── mn.js ├── mn.json ├── nb.js ├── nb.json ├── nl.js ├── nl.json ├── oc.js ├── oc.json ├── pl.js ├── pl.json ├── pt_BR.js ├── pt_BR.json ├── pt_PT.js ├── pt_PT.json ├── ro.js ├── ro.json ├── ru.js ├── ru.json ├── sc.js ├── sc.json ├── si.js ├── si.json ├── sk.js ├── sk.json ├── sl.js ├── sl.json ├── sq.js ├── sq.json ├── sr.js ├── sr.json ├── sr@latin.js ├── sr@latin.json ├── sv.js ├── sv.json ├── th.js ├── th.json ├── tr.js ├── tr.json ├── ug.js ├── ug.json ├── uk.js ├── uk.json ├── vi.js ├── vi.json ├── zh_CN.js ├── zh_CN.json ├── zh_HK.js ├── zh_HK.json ├── zh_TW.js └── zh_TW.json ├── lib ├── AppInfo │ └── Application.php ├── Capability.php ├── Command │ └── Lock.php ├── Controller │ └── LockController.php ├── Cron │ └── Unlock.php ├── DAV │ ├── LockBackend.php │ └── LockPlugin.php ├── Db │ ├── CoreQueryBuilder.php │ ├── CoreRequestBuilder.php │ ├── LocksRequest.php │ └── LocksRequestBuilder.php ├── Exceptions │ ├── LockNotFoundException.php │ ├── NotFileException.php │ ├── SuccessException.php │ └── UnauthorizedUnlockException.php ├── Listeners │ └── LoadAdditionalScripts.php ├── LockProvider.php ├── Migration │ ├── Version0001Date20191105000001.php │ ├── Version1000Date20220201111525.php │ └── Version1000Date20220430180808.php ├── Model │ └── FileLock.php ├── Service │ ├── ConfigService.php │ ├── FileService.php │ └── LockService.php ├── Storage │ └── LockWrapper.php └── Tools │ ├── Db │ ├── ExtendedQueryBuilder.php │ └── IQueryRow.php │ ├── Exceptions │ ├── ArrayNotFoundException.php │ ├── DateTimeException.php │ ├── InvalidItemException.php │ ├── ItemNotFoundException.php │ ├── MalformedArrayException.php │ ├── RowNotFoundException.php │ └── UnknownTypeException.php │ └── Traits │ ├── TArrayTools.php │ ├── TSetup.php │ └── TStringTools.php ├── package-lock.json ├── package.json ├── playwright.config.ts ├── playwright ├── e2e │ └── fileactions.spec.ts ├── start-nextcloud-server.mjs └── support │ ├── fixtures │ └── random-user.ts │ └── setup.ts ├── psalm.xml ├── screenshots ├── 0.7.0.png ├── 0.7.0.png.license ├── cli.png └── cli.png.license ├── src ├── api.ts ├── helper.ts ├── init.ts ├── main.ts ├── styles.css └── types.ts ├── tests ├── Feature │ └── LockFeatureTest.php ├── Unit │ └── .gitkeep ├── bootstrap.php ├── litmus │ └── 0001-Comment-out-collection-locking-tests.patch ├── phpunit.xml ├── psalm-baseline.xml └── stub.phpstub ├── tsconfig.json └── vite.config.ts /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | /appinfo/info.xml @juliusknorr @max-nextcloud 2 | * @juliusknorr @max-nextcloud 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: composer 7 | directory: "/" 8 | schedule: 9 | interval: weekly 10 | day: saturday 11 | time: "03:00" 12 | timezone: Europe/Paris 13 | open-pull-requests-limit: 10 14 | labels: 15 | - "3. to review" 16 | - "dependencies" 17 | 18 | - package-ecosystem: npm 19 | directory: "/" 20 | schedule: 21 | interval: weekly 22 | day: saturday 23 | time: "03:00" 24 | timezone: Europe/Paris 25 | open-pull-requests-limit: 10 26 | labels: 27 | - "3. to review" 28 | - "dependencies" 29 | 30 | # Main stableXX npm 31 | - package-ecosystem: npm 32 | directory: "/" 33 | schedule: 34 | interval: weekly 35 | day: saturday 36 | time: "03:00" 37 | timezone: Europe/Paris 38 | target-branch: stable31 39 | labels: 40 | - "3. to review" 41 | - "dependencies" 42 | ignore: 43 | # ignore all GitHub linguist patch updates 44 | - dependency-name: "*" 45 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 46 | 47 | - package-ecosystem: npm 48 | directory: "/" 49 | schedule: 50 | interval: weekly 51 | day: saturday 52 | time: "03:00" 53 | timezone: Europe/Paris 54 | target-branch: stable30 55 | labels: 56 | - "3. to review" 57 | - "dependencies" 58 | ignore: 59 | # ignore all GitHub linguist patch updates 60 | - dependency-name: "*" 61 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 62 | 63 | - package-ecosystem: npm 64 | directory: "/" 65 | schedule: 66 | interval: weekly 67 | day: saturday 68 | time: "03:00" 69 | timezone: Europe/Paris 70 | target-branch: stable29 71 | labels: 72 | - "3. to review" 73 | - "dependencies" 74 | ignore: 75 | # ignore all GitHub linguist patch updates 76 | - dependency-name: "*" 77 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 78 | 79 | - package-ecosystem: npm 80 | directory: "/" 81 | schedule: 82 | interval: weekly 83 | day: saturday 84 | time: "03:00" 85 | timezone: Europe/Paris 86 | target-branch: stable28 87 | labels: 88 | - "3. to review" 89 | - "dependencies" 90 | ignore: 91 | # ignore all GitHub linguist patch updates 92 | - dependency-name: "*" 93 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 94 | -------------------------------------------------------------------------------- /.github/workflows/dependabot-approve-merge.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Dependabot 10 | 11 | on: 12 | pull_request_target: # zizmor: ignore[dangerous-triggers] 13 | branches: 14 | - main 15 | - master 16 | - stable* 17 | 18 | permissions: 19 | contents: read 20 | 21 | concurrency: 22 | group: dependabot-approve-merge-${{ github.head_ref || github.run_id }} 23 | cancel-in-progress: true 24 | 25 | jobs: 26 | auto-approve-merge: 27 | if: github.event.pull_request.user.login == 'dependabot[bot]' || github.event.pull_request.user.login == 'renovate[bot]' 28 | runs-on: ubuntu-latest-low 29 | permissions: 30 | # for hmarr/auto-approve-action to approve PRs 31 | pull-requests: write 32 | 33 | steps: 34 | - name: Disabled on forks 35 | if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} 36 | run: | 37 | echo 'Can not approve PRs from forks' 38 | exit 1 39 | 40 | # GitHub actions bot approve 41 | - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2 42 | with: 43 | github-token: ${{ secrets.GITHUB_TOKEN }} 44 | 45 | # Nextcloud bot approve and merge request 46 | - uses: ahmadnassri/action-dependabot-auto-merge@45fc124d949b19b6b8bf6645b6c9d55f4f9ac61a # v2 47 | with: 48 | target: minor 49 | github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }} 50 | -------------------------------------------------------------------------------- /.github/workflows/fixup.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Block fixup and squash commits 10 | 11 | on: 12 | pull_request: 13 | types: [opened, ready_for_review, reopened, synchronize] 14 | 15 | permissions: 16 | contents: read 17 | 18 | concurrency: 19 | group: fixup-${{ github.head_ref || github.run_id }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | commit-message-check: 24 | if: github.event.pull_request.draft == false 25 | 26 | permissions: 27 | pull-requests: write 28 | name: Block fixup and squash commits 29 | 30 | runs-on: ubuntu-latest-low 31 | 32 | steps: 33 | - name: Run check 34 | uses: skjnldsv/block-fixup-merge-action@c138ea99e45e186567b64cf065ce90f7158c236a # v2 35 | with: 36 | repo-token: ${{ secrets.GITHUB_TOKEN }} 37 | -------------------------------------------------------------------------------- /.github/workflows/lint-php-cs.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint php-cs 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-php-cs-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | lint: 22 | runs-on: ubuntu-latest 23 | 24 | name: php-cs 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 29 | with: 30 | persist-credentials: false 31 | 32 | - name: Get php version 33 | id: versions 34 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 35 | 36 | - name: Set up php${{ steps.versions.outputs.php-min }} 37 | uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 38 | with: 39 | php-version: ${{ steps.versions.outputs.php-min }} 40 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 41 | coverage: none 42 | ini-file: development 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | 46 | - name: Install dependencies 47 | run: | 48 | composer remove nextcloud/ocp --dev --no-scripts 49 | composer i 50 | 51 | - name: Lint 52 | run: composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 ) 53 | -------------------------------------------------------------------------------- /.github/workflows/lint-php.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint php 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-php-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | matrix: 22 | runs-on: ubuntu-latest-low 23 | outputs: 24 | php-versions: ${{ steps.versions.outputs.php-versions }} 25 | steps: 26 | - name: Checkout app 27 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 28 | with: 29 | persist-credentials: false 30 | 31 | - name: Get version matrix 32 | id: versions 33 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.0.0 34 | 35 | php-lint: 36 | runs-on: ubuntu-latest 37 | needs: matrix 38 | strategy: 39 | matrix: 40 | php-versions: ${{fromJson(needs.matrix.outputs.php-versions)}} 41 | 42 | name: php-lint 43 | 44 | steps: 45 | - name: Checkout 46 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 47 | with: 48 | persist-credentials: false 49 | 50 | - name: Set up php ${{ matrix.php-versions }} 51 | uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 52 | with: 53 | php-version: ${{ matrix.php-versions }} 54 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 55 | coverage: none 56 | ini-file: development 57 | env: 58 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 59 | 60 | - name: Lint 61 | run: composer run lint 62 | 63 | summary: 64 | permissions: 65 | contents: none 66 | runs-on: ubuntu-latest-low 67 | needs: php-lint 68 | 69 | if: always() 70 | 71 | name: php-lint-summary 72 | 73 | steps: 74 | - name: Summary status 75 | run: if ${{ needs.php-lint.result != 'success' && needs.php-lint.result != 'skipped' }}; then exit 1; fi 76 | -------------------------------------------------------------------------------- /.github/workflows/playwright.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: MIT 3 | name: Playwright Tests 4 | on: 5 | pull_request: 6 | branches: [main] 7 | 8 | jobs: 9 | test: 10 | timeout-minutes: 60 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout app 14 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 15 | 16 | - name: Check composer.json 17 | id: check_composer 18 | uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2 19 | with: 20 | files: 'composer.json' 21 | 22 | - name: Install composer dependencies 23 | if: steps.check_composer.outputs.files_exists == 'true' 24 | run: composer install --no-dev 25 | 26 | - name: Read package.json node and npm engines version 27 | uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 28 | id: versions 29 | with: 30 | fallbackNode: '^20' 31 | fallbackNpm: '^10' 32 | 33 | - name: Set up node ${{ steps.versions.outputs.nodeVersion }} 34 | uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 35 | with: 36 | node-version: ${{ steps.versions.outputs.nodeVersion }} 37 | 38 | - name: Set up npm ${{ steps.versions.outputs.npmVersion }} 39 | run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" 40 | 41 | - name: Install node dependencies & build app 42 | run: | 43 | npm ci 44 | TESTING=true npm run build --if-present 45 | 46 | - name: Install Playwright Browsers 47 | run: npx playwright install chromium --only-shell 48 | 49 | - name: Run Playwright tests 50 | run: npx playwright test 51 | 52 | - uses: actions/upload-artifact@v4 53 | if: always() 54 | with: 55 | name: playwright-report 56 | path: playwright-report/ 57 | retention-days: 30 58 | -------------------------------------------------------------------------------- /.github/workflows/psalm.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Static analysis 10 | 11 | on: pull_request 12 | 13 | concurrency: 14 | group: psalm-${{ github.head_ref || github.run_id }} 15 | cancel-in-progress: true 16 | 17 | permissions: 18 | contents: read 19 | 20 | jobs: 21 | static-analysis: 22 | runs-on: ubuntu-latest 23 | 24 | name: static-psalm-analysis 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 28 | with: 29 | persist-credentials: false 30 | 31 | - name: Get php version 32 | id: versions 33 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 34 | 35 | - name: Check enforcement of minimum PHP version ${{ steps.versions.outputs.php-min }} in psalm.xml 36 | run: grep 'phpVersion="${{ steps.versions.outputs.php-min }}' psalm.xml 37 | 38 | - name: Set up php${{ steps.versions.outputs.php-available }} 39 | uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 40 | with: 41 | php-version: ${{ steps.versions.outputs.php-available }} 42 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 43 | coverage: none 44 | ini-file: development 45 | # Temporary workaround for missing pcntl_* in PHP 8.3 46 | ini-values: disable_functions= 47 | env: 48 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 49 | 50 | - name: Install dependencies 51 | run: | 52 | composer remove nextcloud/ocp --dev --no-scripts 53 | composer i 54 | 55 | - name: Install nextcloud/ocp 56 | run: composer require --dev nextcloud/ocp:dev-${{ steps.versions.outputs.branches-max }} --ignore-platform-reqs --with-dependencies 57 | 58 | - name: Run coding standards check 59 | run: composer run psalm -- --threads=1 --monochrome --no-progress --output-format=github 60 | -------------------------------------------------------------------------------- /.github/workflows/reuse.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | 6 | # SPDX-FileCopyrightText: 2022 Free Software Foundation Europe e.V. 7 | # 8 | # SPDX-License-Identifier: CC0-1.0 9 | 10 | name: REUSE Compliance Check 11 | 12 | on: [pull_request] 13 | 14 | permissions: 15 | contents: read 16 | 17 | jobs: 18 | reuse-compliance-check: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: Checkout 22 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 23 | with: 24 | persist-credentials: false 25 | 26 | - name: REUSE Compliance Check 27 | uses: fsfe/reuse-action@bb774aa972c2a89ff34781233d275075cbddf542 # v5.0.0 28 | -------------------------------------------------------------------------------- /.github/workflows/update-nextcloud-ocp-approve-merge.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Auto approve nextcloud/ocp 10 | 11 | on: 12 | pull_request_target: # zizmor: ignore[dangerous-triggers] 13 | branches: 14 | - main 15 | - master 16 | - stable* 17 | 18 | permissions: 19 | contents: read 20 | 21 | concurrency: 22 | group: update-nextcloud-ocp-approve-merge-${{ github.head_ref || github.run_id }} 23 | cancel-in-progress: true 24 | 25 | jobs: 26 | auto-approve-merge: 27 | if: github.actor == 'nextcloud-command' 28 | runs-on: ubuntu-latest-low 29 | permissions: 30 | # for hmarr/auto-approve-action to approve PRs 31 | pull-requests: write 32 | # for alexwilson/enable-github-automerge-action to approve PRs 33 | contents: write 34 | 35 | steps: 36 | - name: Disabled on forks 37 | if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} 38 | run: | 39 | echo 'Can not approve PRs from forks' 40 | exit 1 41 | 42 | - uses: mdecoleman/pr-branch-name@55795d86b4566d300d237883103f052125cc7508 # v3.0.0 43 | id: branchname 44 | with: 45 | repo-token: ${{ secrets.GITHUB_TOKEN }} 46 | 47 | # GitHub actions bot approve 48 | - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2 49 | if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') 50 | with: 51 | github-token: ${{ secrets.GITHUB_TOKEN }} 52 | 53 | # Enable GitHub auto merge 54 | - name: Auto merge 55 | uses: alexwilson/enable-github-automerge-action@56e3117d1ae1540309dc8f7a9f2825bc3c5f06ff # v2.0.0 56 | if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') 57 | with: 58 | github-token: ${{ secrets.GITHUB_TOKEN }} 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 20^19 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | \.idea/ 4 | 5 | /build/ 6 | /css/ 7 | /js/ 8 | /vendor/ 9 | /node_modules/ 10 | /playwright-report/ 11 | 12 | .php-cs-fixer.cache 13 | .phpunit.result.cache 14 | -------------------------------------------------------------------------------- /.nextcloudignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | /_config.yml 4 | /.codecov.yml 5 | /.drone.yml 6 | /.editorconfig 7 | /.eslintignore 8 | /.eslintrc.js 9 | /.eslintrc.yml 10 | /.git 11 | /.github 12 | /.gitignore 13 | /.nextcloudignore 14 | /.php-cs-fixer.dist.php 15 | /.travis.yml 16 | /babel.config.js 17 | /build/ 18 | /composer.json 19 | /composer.lock 20 | /docs/ 21 | /issue_template.md 22 | /krankerl.toml 23 | /Makefile 24 | /mkdocs.yml 25 | /node_modules/ 26 | /package-lock.json 27 | /package.json 28 | /playwright 29 | /playwright.config.ts 30 | /psalm.xml 31 | /run-eslint.sh 32 | /screenshots 33 | /src/ 34 | /tests 35 | /tsconfig.json 36 | /vite.config.ts 37 | /webpack.*.js -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | getFinder() 15 | // ->ignoreVCSIgnored(true) 16 | ->notPath('build') 17 | ->notPath('l10n') 18 | ->notPath('src') 19 | ->notPath('node_modules') 20 | ->notPath('vendor') 21 | ->in(__DIR__); 22 | return $config; 23 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th 4 | 5 | [o:nextcloud:p:nextcloud:r:files_lock] 6 | file_filter = translationfiles//files_lock.po 7 | source_file = translationfiles/templates/files_lock.pot 8 | source_lang = en 9 | type = PO 10 | 11 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | 5 | # Authors 6 | 7 | - Adam Monsen 8 | - Andy Scherzinger 9 | - Arthur Schiwon 10 | - biva 11 | - Carl Schwan 12 | - Côme Chilliet <91878298+come-nc@users.noreply.github.com> 13 | - Daniel 14 | - Daniel Kesselberg 15 | - Ferdinand Thiessen 16 | - Joas Schilling 17 | - John Molakvoæ 18 | - Jonas 19 | - Julius Härtl 20 | - Matthieu Gallien 21 | - Max 22 | - Maxence Lange 23 | - Mohamed Boukhlif 24 | - rakekniven 25 | - Robin Appelman 26 | - Roeland Jago Douma 27 | - Thomas Citharel 28 | - Vincent Petry 29 | -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | app_name=files_lock 4 | 5 | project_dir=$(CURDIR) 6 | build_dir=$(CURDIR)/build/artifacts 7 | appstore_dir=$(build_dir)/appstore 8 | source_dir=$(build_dir)/source 9 | sign_dir=$(build_dir)/sign 10 | package_name=$(app_name) 11 | cert_dir=$(HOME)/.nextcloud/certificates 12 | codecov_token_dir=$(HOME)/.nextcloud/codecov_token 13 | github_account=nextcloud 14 | branch=main 15 | version+=20.1.0 16 | 17 | all: appstore 18 | 19 | release: appstore github-release github-upload 20 | 21 | github-release: 22 | github-release release \ 23 | --user $(github_account) \ 24 | --repo $(app_name) \ 25 | --target $(branch) \ 26 | --tag v$(version) \ 27 | --name "$(app_name) v$(version)" 28 | 29 | github-upload: 30 | github-release upload \ 31 | --user $(github_account) \ 32 | --repo $(app_name) \ 33 | --tag v$(version) \ 34 | --name "$(app_name)-$(version).tar.gz" \ 35 | --file $(build_dir)/$(app_name)-$(version).tar.gz 36 | 37 | create-tag: 38 | git tag -s -a v$(version) -m "Tagging the $(version) release." 39 | git push origin v$(version) 40 | 41 | clean: 42 | rm -rf $(build_dir) 43 | rm -rf node_modules 44 | 45 | test: SHELL:=/bin/bash 46 | test: 47 | phpunit --coverage-clover=coverage.xml --configuration=tests/phpunit.xml tests 48 | @if [ -f $(codecov_token_dir)/$(app_name) ]; then \ 49 | bash <(curl -s https://codecov.io/bash) -t @$(codecov_token_dir)/$(app_name) ; \ 50 | fi 51 | 52 | 53 | appstore: clean 54 | mkdir -p $(sign_dir) 55 | rsync -a \ 56 | --exclude=/build \ 57 | --exclude=/docs \ 58 | --exclude=/translationfiles \ 59 | --exclude=/.tx \ 60 | --exclude=/tests \ 61 | --exclude=.git \ 62 | --exclude=/.github \ 63 | --exclude=/l10n/l10n.pl \ 64 | --exclude=/CONTRIBUTING.md \ 65 | --exclude=/issue_template.md \ 66 | --exclude=/README.md \ 67 | --exclude=/.gitattributes \ 68 | --exclude=.gitignore \ 69 | --exclude=/.scrutinizer.yml \ 70 | --exclude=/.travis.yml \ 71 | --exclude=/Makefile \ 72 | $(project_dir)/ $(sign_dir)/$(app_name) 73 | tar -czf $(build_dir)/$(app_name)-$(version).tar.gz \ 74 | -C $(sign_dir) $(app_name) 75 | @if [ -f $(cert_dir)/$(app_name).key ]; then \ 76 | echo "Signing package…"; \ 77 | openssl dgst -sha512 -sign $(cert_dir)/$(app_name).key $(build_dir)/$(app_name)-$(version).tar.gz | openssl base64; \ 78 | fi 79 | -------------------------------------------------------------------------------- /REUSE.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | version = 1 4 | SPDX-PackageName = "files_lock" 5 | SPDX-PackageSupplier = "Nextcloud " 6 | SPDX-PackageDownloadLocation = "https://github.com/nextcloud/files_lock" 7 | 8 | [[annotations]] 9 | path = [".tx/config", "l10n/**.js", "l10n/**.json"] 10 | precedence = "aggregate" 11 | SPDX-FileCopyrightText = "2020 Nextcloud GmbH and Nextcloud contributors" 12 | SPDX-License-Identifier = "AGPL-3.0-or-later" 13 | 14 | [[annotations]] 15 | path = [".github/CODEOWNERS", "tsconfig.json"] 16 | precedence = "aggregate" 17 | SPDX-FileCopyrightText = "2023 Nextcloud GmbH and Nextcloud contributors" 18 | SPDX-License-Identifier = "AGPL-3.0-or-later" 19 | 20 | [[annotations]] 21 | path = ["composer.json", "composer.lock", "package.json", "package-lock.json"] 22 | precedence = "aggregate" 23 | SPDX-FileCopyrightText = "2019 Nextcloud GmbH and Nextcloud contributors" 24 | SPDX-License-Identifier = "AGPL-3.0-or-later" 25 | 26 | [[annotations]] 27 | path = ["tests/phpunit.xml", "tests/psalm-baseline.xml", "tests/stub.phpstub", "tests/litmus/0001-Comment-out-collection-locking-tests.patch"] 28 | precedence = "aggregate" 29 | SPDX-FileCopyrightText = "2022 Nextcloud GmbH and Nextcloud contributors" 30 | SPDX-License-Identifier = "AGPL-3.0-or-later" 31 | -------------------------------------------------------------------------------- /appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | files_lock 8 | Temporary files lock 9 | Temporary lock your files 10 | 15 | 16 | 32.0.0-dev.0 17 | agpl 18 | Maxence Lange 19 | FilesLock 20 | 21 | 22 | 23 | 24 | 25 | https://github.com/nextcloud/files_lock/blob/main/README.md 26 | 27 | tools 28 | files 29 | 30 | https://github.com/nextcloud/files_lock 31 | https://github.com/nextcloud/files_lock/issues 32 | https://github.com/nextcloud/files_lock.git 33 | https://raw.githubusercontent.com/nextcloud/files_lock/main/screenshots/0.7.0.png 34 | 35 | 36 | 37 | 38 | 39 | 40 | OCA\FilesLock\Cron\Unlock 41 | 42 | 43 | 44 | OCA\FilesLock\Command\Lock 45 | 46 | 47 | 48 | 49 | OCA\FilesLock\DAV\LockPlugin 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /appinfo/routes.php: -------------------------------------------------------------------------------- 1 | [ 12 | ['name' => 'Lock#locking', 'url' => '/lock/{fileId}', 'verb' => 'PUT'], 13 | ['name' => 'Lock#unlocking', 'url' => '/lock/{fileId}', 'verb' => 'DELETE'], 14 | ] 15 | ]; 16 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextcloud/files_lock", 3 | "license": "AGPL", 4 | "require-dev": { 5 | "phpunit/phpunit": "^9.5", 6 | "nextcloud/coding-standard": "^1.2", 7 | "psalm/phar": "^5.25", 8 | "sabre/dav": "^4.6", 9 | "nextcloud/ocp": "dev-master" 10 | }, 11 | "config": { 12 | "platform": { 13 | "php": "8.1" 14 | } 15 | }, 16 | "require": { 17 | "php": "^8.1" 18 | }, 19 | "scripts": { 20 | "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l", 21 | "cs:check": "php-cs-fixer fix --dry-run --diff", 22 | "cs:fix": "php-cs-fixer fix", 23 | "psalm": "psalm.phar", 24 | "test:unit": "phpunit -c tests/phpunit.xml" 25 | }, 26 | "autoload-dev": { 27 | "psr-4": { 28 | "OCP\\": "vendor/nextcloud/ocp/OCP" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /krankerl.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | [package] 4 | before_cmds = [ 5 | "npm ci", 6 | "npm run build" 7 | ] 8 | -------------------------------------------------------------------------------- /l10n/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/files_lock/997f2121bd3b504c1ffd3b7a1a374211d6a2457f/l10n/.gitkeep -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Werkskermkliënt", 5 | "iOS client" : "iOS-kliënt", 6 | "Android client" : "Android-kliënt" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Werkskermkliënt", 3 | "iOS client" : "iOS-kliënt", 4 | "Android client" : "Android-kliënt" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/ar.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "الملف مُقفَلٌ حاليّاً من قِبل %s", 5 | "File is not locked" : "الملف غير مُقفَل", 6 | "File can only be unlocked by providing a valid owner lock token" : "يمكن فك قفل الملف فقط إذا ما تمّ إبراز \"أمارة قفل\" lock token صحيحة من المالك", 7 | "File can only be unlocked by the owner of the lock" : "يُمكن فك قفل الملف فقط من قِبل مالك القفل", 8 | "Desktop client" : "تطبيق سطح المكتب", 9 | "iOS client" : "عميل نظام التشغيل iOS", 10 | "Android client" : "عميل أندرويد", 11 | "Temporary files lock" : "قفل الملفات مؤقتا", 12 | "Temporary lock your files" : "قفل ملفاتك مؤقتا", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "السماح للمستخدمين بإقفال الملفات الخاصة بهم مؤقتا لتجنب حدوث تعارُضات بينما يعملون على ملفات مشتركة. ", 14 | "Manually locked by {user}" : "مقفلة يدويّاً من قِبَل {user}", 15 | "Locked by editing online in {app}" : "مقفلة عن طريق التحرير عبر الإنترنت في {app}", 16 | "Automatically locked by {user}" : "مقفلة آليّاً بواسطة {user}", 17 | "Unlock file" : "فك قفل الملف", 18 | "Lock file" : "قفل الملف", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "هذا الملف تمّ قفله تلقائيًا بواسطة أحد العملاء. قد تؤدي إزالة القفل إلى حدوث تعارض في حفظ الملف.", 20 | "Keep lock" : "الإبقاء على القَفل", 21 | "Force unlock" : "كَسْرُ القَفل" 22 | }, 23 | "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); 24 | -------------------------------------------------------------------------------- /l10n/ar.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "الملف مُقفَلٌ حاليّاً من قِبل %s", 3 | "File is not locked" : "الملف غير مُقفَل", 4 | "File can only be unlocked by providing a valid owner lock token" : "يمكن فك قفل الملف فقط إذا ما تمّ إبراز \"أمارة قفل\" lock token صحيحة من المالك", 5 | "File can only be unlocked by the owner of the lock" : "يُمكن فك قفل الملف فقط من قِبل مالك القفل", 6 | "Desktop client" : "تطبيق سطح المكتب", 7 | "iOS client" : "عميل نظام التشغيل iOS", 8 | "Android client" : "عميل أندرويد", 9 | "Temporary files lock" : "قفل الملفات مؤقتا", 10 | "Temporary lock your files" : "قفل ملفاتك مؤقتا", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "السماح للمستخدمين بإقفال الملفات الخاصة بهم مؤقتا لتجنب حدوث تعارُضات بينما يعملون على ملفات مشتركة. ", 12 | "Manually locked by {user}" : "مقفلة يدويّاً من قِبَل {user}", 13 | "Locked by editing online in {app}" : "مقفلة عن طريق التحرير عبر الإنترنت في {app}", 14 | "Automatically locked by {user}" : "مقفلة آليّاً بواسطة {user}", 15 | "Unlock file" : "فك قفل الملف", 16 | "Lock file" : "قفل الملف", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "هذا الملف تمّ قفله تلقائيًا بواسطة أحد العملاء. قد تؤدي إزالة القفل إلى حدوث تعارض في حفظ الملف.", 18 | "Keep lock" : "الإبقاء على القَفل", 19 | "Force unlock" : "كَسْرُ القَفل" 20 | },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" 21 | } -------------------------------------------------------------------------------- /l10n/ast.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Veceru pa ordenadores", 5 | "iOS client" : "Veceru pa iOS", 6 | "Android client" : "Veceru p'Android", 7 | "Unlock file" : "Desbloquiar el ficheru" 8 | }, 9 | "nplurals=2; plural=(n != 1);"); 10 | -------------------------------------------------------------------------------- /l10n/ast.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Veceru pa ordenadores", 3 | "iOS client" : "Veceru pa iOS", 4 | "Android client" : "Veceru p'Android", 5 | "Unlock file" : "Desbloquiar el ficheru" 6 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 7 | } -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Desktop client" 5 | }, 6 | "nplurals=2; plural=(n != 1);"); 7 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Desktop client" 3 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 4 | } -------------------------------------------------------------------------------- /l10n/bg.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Файлът може да бъде отключен само чрез предоставяне на валиден токен за заключване от собственика", 5 | "File can only be unlocked by the owner of the lock" : "Файлът може да бъде отключен само от собственика на заключването", 6 | "Desktop client" : "Клиент за настолни компютри", 7 | "iOS client" : "iOS клиент", 8 | "Android client" : "Android клиент", 9 | "Temporary files lock" : "Заключване на временните файлове ", 10 | "Temporary lock your files" : "Временно заключване на файлове ви", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Позволете на вашите потребители да заключват временно своите файлове, за да избегнат конфликти, докато работят върху споделени файлове.", 12 | "Unlock file" : "Отключване на файл", 13 | "Lock file" : "Заключване на файл" 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/bg.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Файлът може да бъде отключен само чрез предоставяне на валиден токен за заключване от собственика", 3 | "File can only be unlocked by the owner of the lock" : "Файлът може да бъде отключен само от собственика на заключването", 4 | "Desktop client" : "Клиент за настолни компютри", 5 | "iOS client" : "iOS клиент", 6 | "Android client" : "Android клиент", 7 | "Temporary files lock" : "Заключване на временните файлове ", 8 | "Temporary lock your files" : "Временно заключване на файлове ви", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Позволете на вашите потребители да заключват временно своите файлове, за да избегнат конфликти, докато работят върху споделени файлове.", 10 | "Unlock file" : "Отключване на файл", 11 | "Lock file" : "Заключване на файл" 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/br.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Kliant burev", 5 | "Temporary files lock" : "Restr prennet amzeriel", 6 | "Temporary lock your files" : "Prennan amzeriel o restroù", 7 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Aotreit ho implijourien da brennañ evit ur pennad o restroù evit ampech kudennoù pa labouront war restroù rannet.", 8 | "Unlock file" : "Dibrennan ar restr", 9 | "Lock file" : "Prennan ar restr" 10 | }, 11 | "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); 12 | -------------------------------------------------------------------------------- /l10n/br.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Kliant burev", 3 | "Temporary files lock" : "Restr prennet amzeriel", 4 | "Temporary lock your files" : "Prennan amzeriel o restroù", 5 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Aotreit ho implijourien da brennañ evit ur pennad o restroù evit ampech kudennoù pa labouront war restroù rannet.", 6 | "Unlock file" : "Dibrennan ar restr", 7 | "Lock file" : "Prennan ar restr" 8 | },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" 9 | } -------------------------------------------------------------------------------- /l10n/bs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Desktop klijent" 5 | }, 6 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 7 | -------------------------------------------------------------------------------- /l10n/bs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Desktop klijent" 3 | },"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);" 4 | } -------------------------------------------------------------------------------- /l10n/ca.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Només es pot desblocar el fitxer si es proporciona un testimoni de blocatge del propietari vàlid", 5 | "File can only be unlocked by the owner of the lock" : "Només l'usuari propietari del blocatge pot desblocar el fitxer", 6 | "Desktop client" : "Client d'escriptori", 7 | "iOS client" : "Client iOS", 8 | "Android client" : "Client android", 9 | "Temporary files lock" : "Blocatge temporal dels fitxers", 10 | "Temporary lock your files" : "Bloqueu temporalment els fitxers", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permeteu als usuaris blocar temporalment els fitxers per a evitar conflictes en treballar en fitxers compartits.", 12 | "Unlock file" : "Desbloca el fitxer", 13 | "Lock file" : "Bloca el fitxer" 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/ca.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Només es pot desblocar el fitxer si es proporciona un testimoni de blocatge del propietari vàlid", 3 | "File can only be unlocked by the owner of the lock" : "Només l'usuari propietari del blocatge pot desblocar el fitxer", 4 | "Desktop client" : "Client d'escriptori", 5 | "iOS client" : "Client iOS", 6 | "Android client" : "Client android", 7 | "Temporary files lock" : "Blocatge temporal dels fitxers", 8 | "Temporary lock your files" : "Bloqueu temporalment els fitxers", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permeteu als usuaris blocar temporalment els fitxers per a evitar conflictes en treballar en fitxers compartits.", 10 | "Unlock file" : "Desbloca el fitxer", 11 | "Lock file" : "Bloca el fitxer" 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/cs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Soubor je v tuto chvíli uzamčen uživatelem %s", 5 | "File is not locked" : "Soubor není uzamčen", 6 | "File can only be unlocked by providing a valid owner lock token" : "Soubor je možné odemknout pouze zadáním platného tokenu zámku vlastníka", 7 | "File can only be unlocked by the owner of the lock" : "Soubor může být odemčen pouze vlastníkem zámku", 8 | "Desktop client" : "Klient pro počítač", 9 | "iOS client" : "iOS klient", 10 | "Android client" : "Android klient", 11 | "Temporary files lock" : "Dočasný zámek souborů", 12 | "Temporary lock your files" : "Dočasně zamykejte své soubory", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Umožňuje vašim uživatelům dočasně uzamykat své soubory a vyhýbat se tak konfliktům při práci na sdílených souborech.", 14 | "Manually locked by {user}" : "Ručně uzamkl(a) {user}", 15 | "Locked by editing online in {app}" : "Uzamčeno upravováním online v {app}", 16 | "Automatically locked by {user}" : "Automaticky uzamkl(a) {user}", 17 | "Unlock file" : "Odemknout soubor", 18 | "Lock file" : "Zamknout soubor", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Tento soubor byl automaticky uzamčen klientem. Odebrání zámku může vést ke konfliktu při ukládání souboru.", 20 | "Keep lock" : "Ponechat zámek", 21 | "Force unlock" : "Vynutit odemknutí" 22 | }, 23 | "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); 24 | -------------------------------------------------------------------------------- /l10n/cs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Soubor je v tuto chvíli uzamčen uživatelem %s", 3 | "File is not locked" : "Soubor není uzamčen", 4 | "File can only be unlocked by providing a valid owner lock token" : "Soubor je možné odemknout pouze zadáním platného tokenu zámku vlastníka", 5 | "File can only be unlocked by the owner of the lock" : "Soubor může být odemčen pouze vlastníkem zámku", 6 | "Desktop client" : "Klient pro počítač", 7 | "iOS client" : "iOS klient", 8 | "Android client" : "Android klient", 9 | "Temporary files lock" : "Dočasný zámek souborů", 10 | "Temporary lock your files" : "Dočasně zamykejte své soubory", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Umožňuje vašim uživatelům dočasně uzamykat své soubory a vyhýbat se tak konfliktům při práci na sdílených souborech.", 12 | "Manually locked by {user}" : "Ručně uzamkl(a) {user}", 13 | "Locked by editing online in {app}" : "Uzamčeno upravováním online v {app}", 14 | "Automatically locked by {user}" : "Automaticky uzamkl(a) {user}", 15 | "Unlock file" : "Odemknout soubor", 16 | "Lock file" : "Zamknout soubor", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Tento soubor byl automaticky uzamčen klientem. Odebrání zámku může vést ke konfliktu při ukládání souboru.", 18 | "Keep lock" : "Ponechat zámek", 19 | "Force unlock" : "Vynutit odemknutí" 20 | },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" 21 | } -------------------------------------------------------------------------------- /l10n/da.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Filen kan kun låses op ved at angive et gyldigt ejerlåstoken", 5 | "File can only be unlocked by the owner of the lock" : "Filen kan kun låses op af ejeren af låsen", 6 | "Desktop client" : "Dekstopklient", 7 | "iOS client" : "iOS klient", 8 | "Android client" : "Androidklient", 9 | "Temporary files lock" : "Midlertidig fillås", 10 | "Temporary lock your files" : "Lås dine filer midlertidigt", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Tillad brugere midlertidigt at låse deres filer for at undgå konflikter mens de arbejder på delte filer", 12 | "Unlock file" : "Lås filen", 13 | "Lock file" : "Lås filen op" 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/da.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Filen kan kun låses op ved at angive et gyldigt ejerlåstoken", 3 | "File can only be unlocked by the owner of the lock" : "Filen kan kun låses op af ejeren af låsen", 4 | "Desktop client" : "Dekstopklient", 5 | "iOS client" : "iOS klient", 6 | "Android client" : "Androidklient", 7 | "Temporary files lock" : "Midlertidig fillås", 8 | "Temporary lock your files" : "Lås dine filer midlertidigt", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Tillad brugere midlertidigt at låse deres filer for at undgå konflikter mens de arbejder på delte filer", 10 | "Unlock file" : "Lås filen", 11 | "Lock file" : "Lås filen op" 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/de.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Datei ist derzeit von %s gesperrt.", 5 | "File is not locked" : "Datei ist nicht gesperrt", 6 | "File can only be unlocked by providing a valid owner lock token" : "Die Datei kann nur mit einem gültigen Eigentümer-Sperr-Token entsperrt werden", 7 | "File can only be unlocked by the owner of the lock" : "Datei kann nur vom Besitzer der Sperre entsperrt werden", 8 | "Desktop client" : "Desktop-Client", 9 | "iOS client" : "iOS-Client", 10 | "Android client" : "Android-Client", 11 | "Temporary files lock" : "Dateien temporär sperren", 12 | "Temporary lock your files" : "Deine Dateien temporär sperren", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Erlaubt es Benutzern eine Datei temporär zu sperren um Konflikte während der Arbeit an geteilten Dateien zu vermeiden.", 14 | "Manually locked by {user}" : "Manuell gesperrt durch {user}", 15 | "Locked by editing online in {app}" : "Gesperrt durch Online-Bearbeitung in {app}", 16 | "Automatically locked by {user}" : "Automatisch gesperrt durch {user}", 17 | "Unlock file" : "Datei entsperren", 18 | "Lock file" : "Datei sperren", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Diese Datei wurde automatisch von einem Client gesperrt. Das Entfernen der Sperre kann zu einem Konflikt beim Speichern der Datei führen.", 20 | "Keep lock" : "Sperre behalten", 21 | "Force unlock" : "Entsperren erzwingen" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/de.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Datei ist derzeit von %s gesperrt.", 3 | "File is not locked" : "Datei ist nicht gesperrt", 4 | "File can only be unlocked by providing a valid owner lock token" : "Die Datei kann nur mit einem gültigen Eigentümer-Sperr-Token entsperrt werden", 5 | "File can only be unlocked by the owner of the lock" : "Datei kann nur vom Besitzer der Sperre entsperrt werden", 6 | "Desktop client" : "Desktop-Client", 7 | "iOS client" : "iOS-Client", 8 | "Android client" : "Android-Client", 9 | "Temporary files lock" : "Dateien temporär sperren", 10 | "Temporary lock your files" : "Deine Dateien temporär sperren", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Erlaubt es Benutzern eine Datei temporär zu sperren um Konflikte während der Arbeit an geteilten Dateien zu vermeiden.", 12 | "Manually locked by {user}" : "Manuell gesperrt durch {user}", 13 | "Locked by editing online in {app}" : "Gesperrt durch Online-Bearbeitung in {app}", 14 | "Automatically locked by {user}" : "Automatisch gesperrt durch {user}", 15 | "Unlock file" : "Datei entsperren", 16 | "Lock file" : "Datei sperren", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Diese Datei wurde automatisch von einem Client gesperrt. Das Entfernen der Sperre kann zu einem Konflikt beim Speichern der Datei führen.", 18 | "Keep lock" : "Sperre behalten", 19 | "Force unlock" : "Entsperren erzwingen" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/de_DE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Datei ist derzeit von %s gesperrt.", 5 | "File is not locked" : "Datei ist nicht gesperrt", 6 | "File can only be unlocked by providing a valid owner lock token" : "Die Datei kann nur mit einem gültigen Eigentümer-Sperr-Token entsperrt werden", 7 | "File can only be unlocked by the owner of the lock" : "Datei kann nur vom Besitzer der Sperre entsperrt werden", 8 | "Desktop client" : "Desktop-Client", 9 | "iOS client" : "iOS-Client", 10 | "Android client" : "Android-Client", 11 | "Temporary files lock" : "Dateien temporär sperren", 12 | "Temporary lock your files" : "Ihre Dateien temporär sperren", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Erlaubt es Benutzern eine Datei temporär zu sperren um Konflikte während der Arbeit an geteilten Dateien zu vermeiden.", 14 | "Manually locked by {user}" : "Manuell gesperrt durch {user}", 15 | "Locked by editing online in {app}" : "Gesperrt durch Online-Bearbeitung in {app}", 16 | "Automatically locked by {user}" : "Automatisch gesperrt durch {user}", 17 | "Unlock file" : "Datei entsperren", 18 | "Lock file" : "Datei sperren", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Diese Datei wurde automatisch von einem Client gesperrt. Das Entfernen der Sperre kann zu einem Konflikt beim Speichern der Datei führen.", 20 | "Keep lock" : "Sperre behalten", 21 | "Force unlock" : "Entsperren erzwingen" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/de_DE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Datei ist derzeit von %s gesperrt.", 3 | "File is not locked" : "Datei ist nicht gesperrt", 4 | "File can only be unlocked by providing a valid owner lock token" : "Die Datei kann nur mit einem gültigen Eigentümer-Sperr-Token entsperrt werden", 5 | "File can only be unlocked by the owner of the lock" : "Datei kann nur vom Besitzer der Sperre entsperrt werden", 6 | "Desktop client" : "Desktop-Client", 7 | "iOS client" : "iOS-Client", 8 | "Android client" : "Android-Client", 9 | "Temporary files lock" : "Dateien temporär sperren", 10 | "Temporary lock your files" : "Ihre Dateien temporär sperren", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Erlaubt es Benutzern eine Datei temporär zu sperren um Konflikte während der Arbeit an geteilten Dateien zu vermeiden.", 12 | "Manually locked by {user}" : "Manuell gesperrt durch {user}", 13 | "Locked by editing online in {app}" : "Gesperrt durch Online-Bearbeitung in {app}", 14 | "Automatically locked by {user}" : "Automatisch gesperrt durch {user}", 15 | "Unlock file" : "Datei entsperren", 16 | "Lock file" : "Datei sperren", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Diese Datei wurde automatisch von einem Client gesperrt. Das Entfernen der Sperre kann zu einem Konflikt beim Speichern der Datei führen.", 18 | "Keep lock" : "Sperre behalten", 19 | "Force unlock" : "Entsperren erzwingen" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/el.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by the owner of the lock" : "Το αρχείο μπορεί να ξεκλειδωθεί μόνο από τον κάτοχο του", 5 | "Desktop client" : "Πελάτης σταθερού υπολογιστή", 6 | "iOS client" : "Πελάτης iOS", 7 | "Android client" : "Πελάτης Android", 8 | "Temporary files lock" : "Κλείδωμα προσωρινών αρχείων", 9 | "Temporary lock your files" : "Κλειδώστε προσωρινά τα αρχεία σας", 10 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Επιτρέπει στους χρήστες σας να κλειδώνουν προσωρινά τα αρχεία τους για αποφυγή διενέξεων κατά την εργασία με κοινόχρηστα αρχεία.", 11 | "Unlock file" : "Ξεκλείδωμα αρχείου", 12 | "Lock file" : "Κλείδωμα αρχείου" 13 | }, 14 | "nplurals=2; plural=(n != 1);"); 15 | -------------------------------------------------------------------------------- /l10n/el.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by the owner of the lock" : "Το αρχείο μπορεί να ξεκλειδωθεί μόνο από τον κάτοχο του", 3 | "Desktop client" : "Πελάτης σταθερού υπολογιστή", 4 | "iOS client" : "Πελάτης iOS", 5 | "Android client" : "Πελάτης Android", 6 | "Temporary files lock" : "Κλείδωμα προσωρινών αρχείων", 7 | "Temporary lock your files" : "Κλειδώστε προσωρινά τα αρχεία σας", 8 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Επιτρέπει στους χρήστες σας να κλειδώνουν προσωρινά τα αρχεία τους για αποφυγή διενέξεων κατά την εργασία με κοινόχρηστα αρχεία.", 9 | "Unlock file" : "Ξεκλείδωμα αρχείου", 10 | "Lock file" : "Κλείδωμα αρχείου" 11 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 12 | } -------------------------------------------------------------------------------- /l10n/en_GB.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "File is currently locked by %s", 5 | "File is not locked" : "File is not locked", 6 | "File can only be unlocked by providing a valid owner lock token" : "File can only be unlocked by providing a valid owner lock token", 7 | "File can only be unlocked by the owner of the lock" : "File can only be unlocked by the owner of the lock", 8 | "Desktop client" : "Desktop client", 9 | "iOS client" : "iOS client", 10 | "Android client" : "Android client", 11 | "Temporary files lock" : "Temporary files lock", 12 | "Temporary lock your files" : "Temporary lock your files", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Allow your users to temporary lock their files to avoid conflicts while working on shared files.", 14 | "Manually locked by {user}" : "Manually locked by {user}", 15 | "Locked by editing online in {app}" : "Locked by editing online in {app}", 16 | "Automatically locked by {user}" : "Automatically locked by {user}", 17 | "Unlock file" : "Unlock file", 18 | "Lock file" : "Lock file", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file.", 20 | "Keep lock" : "Keep lock", 21 | "Force unlock" : "Force unlock" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/en_GB.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "File is currently locked by %s", 3 | "File is not locked" : "File is not locked", 4 | "File can only be unlocked by providing a valid owner lock token" : "File can only be unlocked by providing a valid owner lock token", 5 | "File can only be unlocked by the owner of the lock" : "File can only be unlocked by the owner of the lock", 6 | "Desktop client" : "Desktop client", 7 | "iOS client" : "iOS client", 8 | "Android client" : "Android client", 9 | "Temporary files lock" : "Temporary files lock", 10 | "Temporary lock your files" : "Temporary lock your files", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Allow your users to temporary lock their files to avoid conflicts while working on shared files.", 12 | "Manually locked by {user}" : "Manually locked by {user}", 13 | "Locked by editing online in {app}" : "Locked by editing online in {app}", 14 | "Automatically locked by {user}" : "Automatically locked by {user}", 15 | "Unlock file" : "Unlock file", 16 | "Lock file" : "Lock file", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file.", 18 | "Keep lock" : "Keep lock", 19 | "Force unlock" : "Force unlock" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/eo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Labortabla kliento", 5 | "iOS client" : "iOS-a kliento", 6 | "Android client" : "Androida kliento" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/eo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Labortabla kliento", 3 | "iOS client" : "iOS-a kliento", 4 | "Android client" : "Androida kliento" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/es.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "El archivo está actualmente bloqueado por %s", 5 | "File is not locked" : "El archivo no está bloqueado", 6 | "File can only be unlocked by providing a valid owner lock token" : "El archivo solo se puede desbloquear proporcionando un token de bloqueo de propietario válido", 7 | "File can only be unlocked by the owner of the lock" : "El archivo solo puede ser desbloqueado por el propietario del bloqueo", 8 | "Desktop client" : "Cliente de escritorio", 9 | "iOS client" : "Cliente iOS", 10 | "Android client" : "Cliente Android", 11 | "Temporary files lock" : "Bloqueo temporal de archivos", 12 | "Temporary lock your files" : "Bloquea temporalmente tus archivos", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir que tus usuarios bloqueen temporalmente sus archivos para evitar conflictos mientras trabajan con archivos compartidos.", 14 | "Unlock file" : "Desbloquear archivo", 15 | "Lock file" : "Bloquear archivo" 16 | }, 17 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 18 | -------------------------------------------------------------------------------- /l10n/es.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "El archivo está actualmente bloqueado por %s", 3 | "File is not locked" : "El archivo no está bloqueado", 4 | "File can only be unlocked by providing a valid owner lock token" : "El archivo solo se puede desbloquear proporcionando un token de bloqueo de propietario válido", 5 | "File can only be unlocked by the owner of the lock" : "El archivo solo puede ser desbloqueado por el propietario del bloqueo", 6 | "Desktop client" : "Cliente de escritorio", 7 | "iOS client" : "Cliente iOS", 8 | "Android client" : "Cliente Android", 9 | "Temporary files lock" : "Bloqueo temporal de archivos", 10 | "Temporary lock your files" : "Bloquea temporalmente tus archivos", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir que tus usuarios bloqueen temporalmente sus archivos para evitar conflictos mientras trabajan con archivos compartidos.", 12 | "Unlock file" : "Desbloquear archivo", 13 | "Lock file" : "Bloquear archivo" 14 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 15 | } -------------------------------------------------------------------------------- /l10n/es_419.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_419.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_AR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android", 7 | "Unlock file" : "Desbloquear archivo", 8 | "Lock file" : "Bloquear archivo" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_AR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android", 5 | "Unlock file" : "Desbloquear archivo", 6 | "Lock file" : "Bloquear archivo" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_CL.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_CL.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_CO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_CO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_CR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_CR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_DO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_DO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_EC.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "El archivo solo puede desbloquearse proporcionando un token de bloqueo válido del propietario. ", 5 | "File can only be unlocked by the owner of the lock" : "El archivo solo puede desbloquearse por el propietario del bloqueo. ", 6 | "Desktop client" : "Cliente de escritorio", 7 | "iOS client" : "Cliente iOS", 8 | "Android client" : "Cliente Android", 9 | "Temporary files lock" : "Bloqueo temporal de archivos ", 10 | "Temporary lock your files" : "Bloquea temporalmente tus archivos", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite a tus usuarios bloquear temporalmente sus archivos para evitar conflictos mientras trabajan en archivos compartidos.", 12 | "Unlock file" : "Desbloquear archivo", 13 | "Lock file" : "Bloquear archivo" 14 | }, 15 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 16 | -------------------------------------------------------------------------------- /l10n/es_EC.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "El archivo solo puede desbloquearse proporcionando un token de bloqueo válido del propietario. ", 3 | "File can only be unlocked by the owner of the lock" : "El archivo solo puede desbloquearse por el propietario del bloqueo. ", 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android", 7 | "Temporary files lock" : "Bloqueo temporal de archivos ", 8 | "Temporary lock your files" : "Bloquea temporalmente tus archivos", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite a tus usuarios bloquear temporalmente sus archivos para evitar conflictos mientras trabajan en archivos compartidos.", 10 | "Unlock file" : "Desbloquear archivo", 11 | "Lock file" : "Bloquear archivo" 12 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 13 | } -------------------------------------------------------------------------------- /l10n/es_GT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_GT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_HN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_HN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_MX.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "El archivo solo puede ser desbloqueado al proporcionar un token de bloqueo de propietario válido", 5 | "File can only be unlocked by the owner of the lock" : "El archivo solo puede ser desbloqueado por el propietario del bloqueo", 6 | "Desktop client" : "Cliente de escritorio", 7 | "iOS client" : "Cliente iOS", 8 | "Android client" : "Cliente Android", 9 | "Temporary files lock" : "Archivos temporalmente bloqueados", 10 | "Temporary lock your files" : "Bloquea temporalmente tus archivos", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite a sus usuarios bloquear temporalmente sus archivos para evitar conflictos mientras se trabajan con archivos compartidos.", 12 | "Unlock file" : "Archivo desbloqueado", 13 | "Lock file" : "Archivo bloqueado" 14 | }, 15 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 16 | -------------------------------------------------------------------------------- /l10n/es_MX.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "El archivo solo puede ser desbloqueado al proporcionar un token de bloqueo de propietario válido", 3 | "File can only be unlocked by the owner of the lock" : "El archivo solo puede ser desbloqueado por el propietario del bloqueo", 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android", 7 | "Temporary files lock" : "Archivos temporalmente bloqueados", 8 | "Temporary lock your files" : "Bloquea temporalmente tus archivos", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite a sus usuarios bloquear temporalmente sus archivos para evitar conflictos mientras se trabajan con archivos compartidos.", 10 | "Unlock file" : "Archivo desbloqueado", 11 | "Lock file" : "Archivo bloqueado" 12 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 13 | } -------------------------------------------------------------------------------- /l10n/es_NI.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_NI.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_PA.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_PA.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_PE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_PE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_PR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_PR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_PY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_PY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_SV.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_SV.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/es_UY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de escritorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 9 | -------------------------------------------------------------------------------- /l10n/es_UY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de escritorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 6 | } -------------------------------------------------------------------------------- /l10n/et_EE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Faili praeguse lukustuse on lisanud „%s“", 5 | "File is not locked" : "Fail pole lukustatud", 6 | "File can only be unlocked by providing a valid owner lock token" : "Faili lukustust saab eemaldada vaid omaniku korrektse tunnusloa olemasolul", 7 | "File can only be unlocked by the owner of the lock" : "Faili lukustust saab vaid omanik eemaldada", 8 | "Desktop client" : "Töölaua klient", 9 | "iOS client" : "iOS klient", 10 | "Android client" : "Android klient", 11 | "Temporary files lock" : "Ajutine faililukustus", 12 | "Temporary lock your files" : "Lukusta oma faili ajutiselt", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Töötamisel jagatud failidega võimalda kasutajatel oma failid ajutiselt lukustada.", 14 | "Manually locked by {user}" : "Käsitsi lukustatud kasutaja „{user}“ poolt", 15 | "Locked by editing online in {app}" : "Automaatselt lukustatud rakenduse „{app}“ poolt võrgus muutmise tõttu", 16 | "Automatically locked by {user}" : "Automaatselt lukustatud kasutaja „{user}“ poolt", 17 | "Unlock file" : "Eemalda faili lukustus", 18 | "Lock file" : "Lukusta fail", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Faililukustus on automaatselt lisatud klientrakenduse poolt. Kui selle eemaldada, siis võib faili hilisemal salvestamisel tekkida versioonikonflikt.", 20 | "Keep lock" : "Jäta lukustus alles", 21 | "Force unlock" : "Eemalda lukustus sundkorras" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/et_EE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Faili praeguse lukustuse on lisanud „%s“", 3 | "File is not locked" : "Fail pole lukustatud", 4 | "File can only be unlocked by providing a valid owner lock token" : "Faili lukustust saab eemaldada vaid omaniku korrektse tunnusloa olemasolul", 5 | "File can only be unlocked by the owner of the lock" : "Faili lukustust saab vaid omanik eemaldada", 6 | "Desktop client" : "Töölaua klient", 7 | "iOS client" : "iOS klient", 8 | "Android client" : "Android klient", 9 | "Temporary files lock" : "Ajutine faililukustus", 10 | "Temporary lock your files" : "Lukusta oma faili ajutiselt", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Töötamisel jagatud failidega võimalda kasutajatel oma failid ajutiselt lukustada.", 12 | "Manually locked by {user}" : "Käsitsi lukustatud kasutaja „{user}“ poolt", 13 | "Locked by editing online in {app}" : "Automaatselt lukustatud rakenduse „{app}“ poolt võrgus muutmise tõttu", 14 | "Automatically locked by {user}" : "Automaatselt lukustatud kasutaja „{user}“ poolt", 15 | "Unlock file" : "Eemalda faili lukustus", 16 | "Lock file" : "Lukusta fail", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Faililukustus on automaatselt lisatud klientrakenduse poolt. Kui selle eemaldada, siis võib faili hilisemal salvestamisel tekkida versioonikonflikt.", 18 | "Keep lock" : "Jäta lukustus alles", 19 | "Force unlock" : "Eemalda lukustus sundkorras" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/eu.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Fitxategia jabearen blokeo-token baliozko bat emanez soilik desblokea daiteke", 5 | "File can only be unlocked by the owner of the lock" : "Fitxategia blokeoaren jabearengatik desblokeatuta izan daiteke soilik", 6 | "Desktop client" : "Mahaigaineko bezeroa", 7 | "iOS client" : "iOS bezeroa", 8 | "Android client" : "Android bezeroa", 9 | "Temporary files lock" : "Aldi baterako fitxategien blokeoak", 10 | "Temporary lock your files" : "Zure fitxategiak aldi baterako blokeatu", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Eman aukera zure erabiltzaileei aldi baterako haien fitxategiak blokeatzeko partekatutako fitxategiekin lan egiten duten bitartean gatazkak ekiditeko.", 12 | "Unlock file" : "Desblokeatu fitxategia", 13 | "Lock file" : "Fitxategia blokeatu" 14 | }, 15 | "nplurals=2; plural=(n != 1);"); 16 | -------------------------------------------------------------------------------- /l10n/eu.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Fitxategia jabearen blokeo-token baliozko bat emanez soilik desblokea daiteke", 3 | "File can only be unlocked by the owner of the lock" : "Fitxategia blokeoaren jabearengatik desblokeatuta izan daiteke soilik", 4 | "Desktop client" : "Mahaigaineko bezeroa", 5 | "iOS client" : "iOS bezeroa", 6 | "Android client" : "Android bezeroa", 7 | "Temporary files lock" : "Aldi baterako fitxategien blokeoak", 8 | "Temporary lock your files" : "Zure fitxategiak aldi baterako blokeatu", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Eman aukera zure erabiltzaileei aldi baterako haien fitxategiak blokeatzeko partekatutako fitxategiekin lan egiten duten bitartean gatazkak ekiditeko.", 10 | "Unlock file" : "Desblokeatu fitxategia", 11 | "Lock file" : "Fitxategia blokeatu" 12 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 13 | } -------------------------------------------------------------------------------- /l10n/fa.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "File can only be unlocked by providing a valid owner lock token", 5 | "File can only be unlocked by the owner of the lock" : "قفل پرونده فقط توسط صاحب قفل قابل باز شدن است", 6 | "Desktop client" : "دستگاه دسکتاپ", 7 | "iOS client" : "دستگاه های IOS", 8 | "Android client" : "دستگاه های اندروید ", 9 | "Temporary files lock" : "موقتا پرونده‌ها قفل شده اند", 10 | "Temporary lock your files" : "موقتا پرونده‌هایتان را قفل کنید", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "به کاربران خود اجازه دهید پرونده‌ها خود را به طور موقت قفل کنند تا در حین کار بر روی پرونده‌ها به اشتراک گذاشته شده دچار تداخل نشوند.", 12 | "Unlock file" : "باز کردن قفل پرونده", 13 | "Lock file" : "قفل کردن پرونده" 14 | }, 15 | "nplurals=2; plural=(n > 1);"); 16 | -------------------------------------------------------------------------------- /l10n/fa.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "File can only be unlocked by providing a valid owner lock token", 3 | "File can only be unlocked by the owner of the lock" : "قفل پرونده فقط توسط صاحب قفل قابل باز شدن است", 4 | "Desktop client" : "دستگاه دسکتاپ", 5 | "iOS client" : "دستگاه های IOS", 6 | "Android client" : "دستگاه های اندروید ", 7 | "Temporary files lock" : "موقتا پرونده‌ها قفل شده اند", 8 | "Temporary lock your files" : "موقتا پرونده‌هایتان را قفل کنید", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "به کاربران خود اجازه دهید پرونده‌ها خود را به طور موقت قفل کنند تا در حین کار بر روی پرونده‌ها به اشتراک گذاشته شده دچار تداخل نشوند.", 10 | "Unlock file" : "باز کردن قفل پرونده", 11 | "Lock file" : "قفل کردن پرونده" 12 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 13 | } -------------------------------------------------------------------------------- /l10n/fi.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Tiedoston on tällä hetkellä lukinnut %s", 5 | "File is not locked" : "Tiedosto ei ole lukittu", 6 | "File can only be unlocked by providing a valid owner lock token" : "Tiedoston lukituksen avaaminen onnistuu vain antamalla kelvollisen omistajan lukkopoletin", 7 | "File can only be unlocked by the owner of the lock" : "Tiedoston lukituksen voi poistaa vain lukituksen omistaja", 8 | "Desktop client" : "Työpöytäsovellus", 9 | "iOS client" : "iOS-sovellus", 10 | "Android client" : "Android-sovellus", 11 | "Temporary files lock" : "Väliaikainen tiedostojen lukitus", 12 | "Temporary lock your files" : "Lukitse tiedostosi väliaikaisesti", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Salli käyttäjien väliaikaisesti lukita tiedostonsa välttääkseen ristiriitoja jaettujen tiedostojen kanssa työskennellessä.", 14 | "Manually locked by {user}" : "Manuaalisesti lukittu käyttäjän {user} toimesta", 15 | "Automatically locked by {user}" : "Automaattisesti lukittu käyttäjän {user} toimesta", 16 | "Unlock file" : "Vapauta tiedoston lukitus", 17 | "Lock file" : "Lukitse tiedosto", 18 | "Keep lock" : "Säilytä lukitus", 19 | "Force unlock" : "Pakota lukituksen avaus" 20 | }, 21 | "nplurals=2; plural=(n != 1);"); 22 | -------------------------------------------------------------------------------- /l10n/fi.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Tiedoston on tällä hetkellä lukinnut %s", 3 | "File is not locked" : "Tiedosto ei ole lukittu", 4 | "File can only be unlocked by providing a valid owner lock token" : "Tiedoston lukituksen avaaminen onnistuu vain antamalla kelvollisen omistajan lukkopoletin", 5 | "File can only be unlocked by the owner of the lock" : "Tiedoston lukituksen voi poistaa vain lukituksen omistaja", 6 | "Desktop client" : "Työpöytäsovellus", 7 | "iOS client" : "iOS-sovellus", 8 | "Android client" : "Android-sovellus", 9 | "Temporary files lock" : "Väliaikainen tiedostojen lukitus", 10 | "Temporary lock your files" : "Lukitse tiedostosi väliaikaisesti", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Salli käyttäjien väliaikaisesti lukita tiedostonsa välttääkseen ristiriitoja jaettujen tiedostojen kanssa työskennellessä.", 12 | "Manually locked by {user}" : "Manuaalisesti lukittu käyttäjän {user} toimesta", 13 | "Automatically locked by {user}" : "Automaattisesti lukittu käyttäjän {user} toimesta", 14 | "Unlock file" : "Vapauta tiedoston lukitus", 15 | "Lock file" : "Lukitse tiedosto", 16 | "Keep lock" : "Säilytä lukitus", 17 | "Force unlock" : "Pakota lukituksen avaus" 18 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 19 | } -------------------------------------------------------------------------------- /l10n/fr.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Le fichier est actuellement verrouillé par %s", 5 | "File is not locked" : "Le fichier n’est pas verrouillé", 6 | "File can only be unlocked by providing a valid owner lock token" : "Le fichier ne peut être déverrouillé qu'en fournissant un jeton de verrouillage propriétaire valide", 7 | "File can only be unlocked by the owner of the lock" : "Le fichier ne peut être déverrouillé que par le propriétaire du verrouillage", 8 | "Desktop client" : "Client de bureau", 9 | "iOS client" : "Client iOS", 10 | "Android client" : "Client Android", 11 | "Temporary files lock" : "Verrouillage temporaire des fichiers ", 12 | "Temporary lock your files" : "Verrouillez temporairement vos fichiers", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Autoriser vos utilisateurs à verrouiller temporairement leurs fichiers pour éviter des conflits lorsqu'ils travaillent sur des documents partagés.", 14 | "Manually locked by {user}" : "Verrouillé manuellement par {user}", 15 | "Locked by editing online in {app}" : "Verrouillé par l'édition en ligne dans {app}", 16 | "Automatically locked by {user}" : "Verrouillé automatiquement par {user}", 17 | "Unlock file" : "Déverrouiller le fichier", 18 | "Lock file" : "Verrouiller le fichier", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Ce fichier a été verrouillé automatiquement par un client. Supprimer le verrou peut conduire à un entrer en conflit lors de l'enregistrement du fichier.", 20 | "Keep lock" : "Garder le verrouillage", 21 | "Force unlock" : "Forcer le déverrouillage" 22 | }, 23 | "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/fr.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Le fichier est actuellement verrouillé par %s", 3 | "File is not locked" : "Le fichier n’est pas verrouillé", 4 | "File can only be unlocked by providing a valid owner lock token" : "Le fichier ne peut être déverrouillé qu'en fournissant un jeton de verrouillage propriétaire valide", 5 | "File can only be unlocked by the owner of the lock" : "Le fichier ne peut être déverrouillé que par le propriétaire du verrouillage", 6 | "Desktop client" : "Client de bureau", 7 | "iOS client" : "Client iOS", 8 | "Android client" : "Client Android", 9 | "Temporary files lock" : "Verrouillage temporaire des fichiers ", 10 | "Temporary lock your files" : "Verrouillez temporairement vos fichiers", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Autoriser vos utilisateurs à verrouiller temporairement leurs fichiers pour éviter des conflits lorsqu'ils travaillent sur des documents partagés.", 12 | "Manually locked by {user}" : "Verrouillé manuellement par {user}", 13 | "Locked by editing online in {app}" : "Verrouillé par l'édition en ligne dans {app}", 14 | "Automatically locked by {user}" : "Verrouillé automatiquement par {user}", 15 | "Unlock file" : "Déverrouiller le fichier", 16 | "Lock file" : "Verrouiller le fichier", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Ce fichier a été verrouillé automatiquement par un client. Supprimer le verrou peut conduire à un entrer en conflit lors de l'enregistrement du fichier.", 18 | "Keep lock" : "Garder le verrouillage", 19 | "Force unlock" : "Forcer le déverrouillage" 20 | },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/ga.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Tá an comhad faoi ghlas faoi láthair ag %s", 5 | "File is not locked" : "Níl an comhad faoi ghlas", 6 | "File can only be unlocked by providing a valid owner lock token" : "Ní féidir an comhad a dhíghlasáil ach trí chomhartha glas úinéara bailí a sholáthar", 7 | "File can only be unlocked by the owner of the lock" : "Ní féidir ach le húinéir an ghlais an comhad a dhíghlasáil", 8 | "Desktop client" : "Cliant deisce", 9 | "iOS client" : "Cliant iOS", 10 | "Android client" : "Cliant Android", 11 | "Temporary files lock" : "Glasáil comhaid shealadacha", 12 | "Temporary lock your files" : "Glasáil do chuid comhad go sealadach", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Lig do d'úsáideoirí a gcuid comhad a ghlasáil go sealadach chun coinbhleachtaí a sheachaint agus iad ag obair ar chomhaid roinnte.", 14 | "Manually locked by {user}" : "Faoi ghlas de láimh ag {user}", 15 | "Locked by editing online in {app}" : "Faoi ghlas ag eagarthóireacht ar líne i {app}", 16 | "Automatically locked by {user}" : "Go huathoibríoch faoi ghlas ag{user}", 17 | "Unlock file" : "Díghlasáil an comhad", 18 | "Lock file" : "Comhad faoi ghlas", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Tá an comhad seo glasáilte go huathoibríoch ag cliant. D'fhéadfadh coinbhleacht an comhad a shábháil má bhaintear an glas.", 20 | "Keep lock" : "Coinnigh glas", 21 | "Force unlock" : "Díghlasáil bhfeidhm" 22 | }, 23 | "nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"); 24 | -------------------------------------------------------------------------------- /l10n/ga.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Tá an comhad faoi ghlas faoi láthair ag %s", 3 | "File is not locked" : "Níl an comhad faoi ghlas", 4 | "File can only be unlocked by providing a valid owner lock token" : "Ní féidir an comhad a dhíghlasáil ach trí chomhartha glas úinéara bailí a sholáthar", 5 | "File can only be unlocked by the owner of the lock" : "Ní féidir ach le húinéir an ghlais an comhad a dhíghlasáil", 6 | "Desktop client" : "Cliant deisce", 7 | "iOS client" : "Cliant iOS", 8 | "Android client" : "Cliant Android", 9 | "Temporary files lock" : "Glasáil comhaid shealadacha", 10 | "Temporary lock your files" : "Glasáil do chuid comhad go sealadach", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Lig do d'úsáideoirí a gcuid comhad a ghlasáil go sealadach chun coinbhleachtaí a sheachaint agus iad ag obair ar chomhaid roinnte.", 12 | "Manually locked by {user}" : "Faoi ghlas de láimh ag {user}", 13 | "Locked by editing online in {app}" : "Faoi ghlas ag eagarthóireacht ar líne i {app}", 14 | "Automatically locked by {user}" : "Go huathoibríoch faoi ghlas ag{user}", 15 | "Unlock file" : "Díghlasáil an comhad", 16 | "Lock file" : "Comhad faoi ghlas", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Tá an comhad seo glasáilte go huathoibríoch ag cliant. D'fhéadfadh coinbhleacht an comhad a shábháil má bhaintear an glas.", 18 | "Keep lock" : "Coinnigh glas", 19 | "Force unlock" : "Díghlasáil bhfeidhm" 20 | },"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);" 21 | } -------------------------------------------------------------------------------- /l10n/gl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "O ficheiro está bloqueado por %s", 5 | "File is not locked" : "O ficheiro non está bloqueado", 6 | "File can only be unlocked by providing a valid owner lock token" : "Só se pode desbloquear o ficheiro fornecendo un testemuño de bloqueo de propietario válido", 7 | "File can only be unlocked by the owner of the lock" : "O ficheiro só o pode desbloquear o propietario do bloqueo", 8 | "Desktop client" : "Cliente de escritorio", 9 | "iOS client" : "Cliente iOS", 10 | "Android client" : "Cliente Android", 11 | "Temporary files lock" : "Bloqueo temporal de ficheiros", 12 | "Temporary lock your files" : "Bloquear temporalmente os seus ficheiros", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir aos seus usuarios bloquear temporalmente os seus ficheiros para evitar conflitos mentres traballan en ficheiros compartidos.", 14 | "Manually locked by {user}" : "Bloqueado manualmente por {user}", 15 | "Locked by editing online in {app}" : "Bloqueado por edición en liña en {app}", 16 | "Automatically locked by {user}" : "Bloqueado automaticamente por {user}", 17 | "Unlock file" : "Desbloquear ficheiro", 18 | "Lock file" : "Bloquear ficheiro", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Este ficheiro foi bloqueado automaticamente por un cliente. A retirada do bloqueo pode provocar un conflito ao gardar o ficheiro.", 20 | "Keep lock" : "Manter o bloqueo", 21 | "Force unlock" : "Forzar o desbloqueo" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/gl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "O ficheiro está bloqueado por %s", 3 | "File is not locked" : "O ficheiro non está bloqueado", 4 | "File can only be unlocked by providing a valid owner lock token" : "Só se pode desbloquear o ficheiro fornecendo un testemuño de bloqueo de propietario válido", 5 | "File can only be unlocked by the owner of the lock" : "O ficheiro só o pode desbloquear o propietario do bloqueo", 6 | "Desktop client" : "Cliente de escritorio", 7 | "iOS client" : "Cliente iOS", 8 | "Android client" : "Cliente Android", 9 | "Temporary files lock" : "Bloqueo temporal de ficheiros", 10 | "Temporary lock your files" : "Bloquear temporalmente os seus ficheiros", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir aos seus usuarios bloquear temporalmente os seus ficheiros para evitar conflitos mentres traballan en ficheiros compartidos.", 12 | "Manually locked by {user}" : "Bloqueado manualmente por {user}", 13 | "Locked by editing online in {app}" : "Bloqueado por edición en liña en {app}", 14 | "Automatically locked by {user}" : "Bloqueado automaticamente por {user}", 15 | "Unlock file" : "Desbloquear ficheiro", 16 | "Lock file" : "Bloquear ficheiro", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Este ficheiro foi bloqueado automaticamente por un cliente. A retirada do bloqueo pode provocar un conflito ao gardar o ficheiro.", 18 | "Keep lock" : "Manter o bloqueo", 19 | "Force unlock" : "Forzar o desbloqueo" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/he.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by the owner of the lock" : "הנעילה יכולה להיות משוחררת ע\"י הבעלים בלבד", 5 | "Desktop client" : "לקוח לשולחן העבודה", 6 | "iOS client" : "לקוח iOS", 7 | "Android client" : "לקוח Android", 8 | "Temporary files lock" : "נעילת קבצים זמנית", 9 | "Temporary lock your files" : "לנעול את הקבצים שלך באופן זמני", 10 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "מאפשר למשתמשים שלך לנעול את הקבצים שלהם כדי למנוע סתירות בעת עבודה על קבצים משותפים.", 11 | "Unlock file" : "שחרור קובץ", 12 | "Lock file" : "נעילת קובץ" 13 | }, 14 | "nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;"); 15 | -------------------------------------------------------------------------------- /l10n/he.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by the owner of the lock" : "הנעילה יכולה להיות משוחררת ע\"י הבעלים בלבד", 3 | "Desktop client" : "לקוח לשולחן העבודה", 4 | "iOS client" : "לקוח iOS", 5 | "Android client" : "לקוח Android", 6 | "Temporary files lock" : "נעילת קבצים זמנית", 7 | "Temporary lock your files" : "לנעול את הקבצים שלך באופן זמני", 8 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "מאפשר למשתמשים שלך לנעול את הקבצים שלהם כדי למנוע סתירות בעת עבודה על קבצים משותפים.", 9 | "Unlock file" : "שחרור קובץ", 10 | "Lock file" : "נעילת קובץ" 11 | },"pluralForm" :"nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;" 12 | } -------------------------------------------------------------------------------- /l10n/hr.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Klijent za osobna računala", 5 | "iOS client" : "Klijent za iOS", 6 | "Android client" : "Klijent za Android", 7 | "Temporary files lock" : "Privremeno zaključavanje datoteka", 8 | "Temporary lock your files" : "Privremeno zaključajte datoteke", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Omogućite korisnicima da privremeno zaključaju datoteke kako bi izbjegli nepodudaranja tijekom rada s dijeljenim datotekama.", 10 | "Unlock file" : "Otključaj datoteku", 11 | "Lock file" : "Zaključaj datoteku" 12 | }, 13 | "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); 14 | -------------------------------------------------------------------------------- /l10n/hr.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Klijent za osobna računala", 3 | "iOS client" : "Klijent za iOS", 4 | "Android client" : "Klijent za Android", 5 | "Temporary files lock" : "Privremeno zaključavanje datoteka", 6 | "Temporary lock your files" : "Privremeno zaključajte datoteke", 7 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Omogućite korisnicima da privremeno zaključaju datoteke kako bi izbjegli nepodudaranja tijekom rada s dijeljenim datotekama.", 8 | "Unlock file" : "Otključaj datoteku", 9 | "Lock file" : "Zaključaj datoteku" 10 | },"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;" 11 | } -------------------------------------------------------------------------------- /l10n/hu.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "A fájlt jelenleg zárolja %s", 5 | "File is not locked" : "A fájl nincs zárolva", 6 | "File can only be unlocked by providing a valid owner lock token" : "A fájlt csak érvényes zártoken megadásával lehet feloldani", 7 | "File can only be unlocked by the owner of the lock" : "A fájlt csak a zár tulajdonosa oldhatja fel", 8 | "Desktop client" : "Asztali kliens", 9 | "iOS client" : "iOS klens", 10 | "Android client" : "Android kliens", 11 | "Temporary files lock" : "Ideiglenes fájlzárolás", 12 | "Temporary lock your files" : "Fájlok ideiglenes zárolása", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Lehetővé teszi a felhasználóinak, hogy ideiglenesen zárolják a fájljaikat, hogy elkerüljék az ütközéseket, ha megosztott fájlokon dolgoznak.", 14 | "Unlock file" : "Fájl feloldása", 15 | "Lock file" : "Fájl zárolása" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/hu.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "A fájlt jelenleg zárolja %s", 3 | "File is not locked" : "A fájl nincs zárolva", 4 | "File can only be unlocked by providing a valid owner lock token" : "A fájlt csak érvényes zártoken megadásával lehet feloldani", 5 | "File can only be unlocked by the owner of the lock" : "A fájlt csak a zár tulajdonosa oldhatja fel", 6 | "Desktop client" : "Asztali kliens", 7 | "iOS client" : "iOS klens", 8 | "Android client" : "Android kliens", 9 | "Temporary files lock" : "Ideiglenes fájlzárolás", 10 | "Temporary lock your files" : "Fájlok ideiglenes zárolása", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Lehetővé teszi a felhasználóinak, hogy ideiglenesen zárolják a fájljaikat, hogy elkerüljék az ütközéseket, ha megosztott fájlokon dolgoznak.", 12 | "Unlock file" : "Fájl feloldása", 13 | "Lock file" : "Fájl zárolása" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de Scriptorio", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de Scriptorio", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/id.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Klien desktop", 5 | "iOS client" : "Klien iOS", 6 | "Android client" : "Klien Android", 7 | "Unlock file" : "Buka kunci berkas", 8 | "Lock file" : "Kunci berkas" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/id.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Klien desktop", 3 | "iOS client" : "Klien iOS", 4 | "Android client" : "Klien Android", 5 | "Unlock file" : "Buka kunci berkas", 6 | "Lock file" : "Kunci berkas" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/is.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Skjáborðsforrit", 5 | "iOS client" : "iOS-biðlari", 6 | "Android client" : "Android-biðlari", 7 | "Temporary files lock" : "Tímabundin læsing skráa", 8 | "Temporary lock your files" : "Læstu skránum þínum tímabundið", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Gerir notendum kleift að læsta skránum sínum tímabundið til að koma í veg fyrir árekstra þegar unnið er með sameiginlegar skrár.", 10 | "Unlock file" : "Aflæsa skrá", 11 | "Lock file" : "Læsa skrá" 12 | }, 13 | "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); 14 | -------------------------------------------------------------------------------- /l10n/is.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Skjáborðsforrit", 3 | "iOS client" : "iOS-biðlari", 4 | "Android client" : "Android-biðlari", 5 | "Temporary files lock" : "Tímabundin læsing skráa", 6 | "Temporary lock your files" : "Læstu skránum þínum tímabundið", 7 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Gerir notendum kleift að læsta skránum sínum tímabundið til að koma í veg fyrir árekstra þegar unnið er með sameiginlegar skrár.", 8 | "Unlock file" : "Aflæsa skrá", 9 | "Lock file" : "Læsa skrá" 10 | },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" 11 | } -------------------------------------------------------------------------------- /l10n/it.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Il file può essere sbloccato solo fornendo un token di sblocco valido del proprietario", 5 | "File can only be unlocked by the owner of the lock" : "Il file può essere sbloccato solo dal proprietario del blocco", 6 | "Desktop client" : "Client desktop", 7 | "iOS client" : "Client iOS", 8 | "Android client" : "Client Android", 9 | "Temporary files lock" : "Blocco temporaneo dei file", 10 | "Temporary lock your files" : "Blocca temporaneamente i tuoi file", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Consenti ai tuoi utenti di bloccare temporaneamente i loro file per evitare conflitti mentre lavorano su file condivisi.", 12 | "Unlock file" : "Sblocca file", 13 | "Lock file" : "Blocca file" 14 | }, 15 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 16 | -------------------------------------------------------------------------------- /l10n/it.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Il file può essere sbloccato solo fornendo un token di sblocco valido del proprietario", 3 | "File can only be unlocked by the owner of the lock" : "Il file può essere sbloccato solo dal proprietario del blocco", 4 | "Desktop client" : "Client desktop", 5 | "iOS client" : "Client iOS", 6 | "Android client" : "Client Android", 7 | "Temporary files lock" : "Blocco temporaneo dei file", 8 | "Temporary lock your files" : "Blocca temporaneamente i tuoi file", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Consenti ai tuoi utenti di bloccare temporaneamente i loro file per evitare conflitti mentre lavorano su file condivisi.", 10 | "Unlock file" : "Sblocca file", 11 | "Lock file" : "Blocca file" 12 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 13 | } -------------------------------------------------------------------------------- /l10n/ja.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "ファイルは現在 %s によってロックされています", 5 | "File is not locked" : "ファイルはロックされていません", 6 | "File can only be unlocked by providing a valid owner lock token" : "ファイルのロックを解除するには、所有者が持つ正しいロックトークンが必要です", 7 | "File can only be unlocked by the owner of the lock" : "ロックの所有者のみがファイルロックを解除できます", 8 | "Desktop client" : "デスクトップクライアント", 9 | "iOS client" : "iOSクライアント", 10 | "Android client" : "アンドロイドクライアント", 11 | "Temporary files lock" : "一時的なファイルのロック ", 12 | "Temporary lock your files" : "ファイルを一時的にロック", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "ユーザーがファイルを一時的にロックして、共有ファイルで作業中にコンフリクトを避けることができます。", 14 | "Manually locked by {user}" : "{user}が手動でロック", 15 | "Locked by editing online in {app}" : "{app}のオンライン編集でロック", 16 | "Automatically locked by {user}" : "{user}が自動でロック", 17 | "Unlock file" : "ファイルのロックを解除", 18 | "Lock file" : "ファイルをロック", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "このファイルはクライアントによって自動的にロックされています。ロックを解除すると、ファイルの保存が競合する可能性があります。", 20 | "Keep lock" : "ロックを保持する", 21 | "Force unlock" : "強制ロック解除" 22 | }, 23 | "nplurals=1; plural=0;"); 24 | -------------------------------------------------------------------------------- /l10n/ja.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "ファイルは現在 %s によってロックされています", 3 | "File is not locked" : "ファイルはロックされていません", 4 | "File can only be unlocked by providing a valid owner lock token" : "ファイルのロックを解除するには、所有者が持つ正しいロックトークンが必要です", 5 | "File can only be unlocked by the owner of the lock" : "ロックの所有者のみがファイルロックを解除できます", 6 | "Desktop client" : "デスクトップクライアント", 7 | "iOS client" : "iOSクライアント", 8 | "Android client" : "アンドロイドクライアント", 9 | "Temporary files lock" : "一時的なファイルのロック ", 10 | "Temporary lock your files" : "ファイルを一時的にロック", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "ユーザーがファイルを一時的にロックして、共有ファイルで作業中にコンフリクトを避けることができます。", 12 | "Manually locked by {user}" : "{user}が手動でロック", 13 | "Locked by editing online in {app}" : "{app}のオンライン編集でロック", 14 | "Automatically locked by {user}" : "{user}が自動でロック", 15 | "Unlock file" : "ファイルのロックを解除", 16 | "Lock file" : "ファイルをロック", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "このファイルはクライアントによって自動的にロックされています。ロックを解除すると、ファイルの保存が競合する可能性があります。", 18 | "Keep lock" : "ロックを保持する", 19 | "Force unlock" : "強制ロック解除" 20 | },"pluralForm" :"nplurals=1; plural=0;" 21 | } -------------------------------------------------------------------------------- /l10n/ka.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Desktop client", 5 | "iOS client" : "iOS client", 6 | "Android client" : "Android client", 7 | "Unlock file" : "Unlock file", 8 | "Lock file" : "Lock file" 9 | }, 10 | "nplurals=2; plural=(n!=1);"); 11 | -------------------------------------------------------------------------------- /l10n/ka.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Desktop client", 3 | "iOS client" : "iOS client", 4 | "Android client" : "Android client", 5 | "Unlock file" : "Unlock file", 6 | "Lock file" : "Lock file" 7 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 8 | } -------------------------------------------------------------------------------- /l10n/ka_GE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "დესკტოპ კლიენტი", 5 | "iOS client" : "iOS კლიენტი", 6 | "Android client" : "Android კლიენტი" 7 | }, 8 | "nplurals=2; plural=(n!=1);"); 9 | -------------------------------------------------------------------------------- /l10n/ka_GE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "დესკტოპ კლიენტი", 3 | "iOS client" : "iOS კლიენტი", 4 | "Android client" : "Android კლიენტი" 5 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 6 | } -------------------------------------------------------------------------------- /l10n/ko.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "오직 유효한 소유자 잠금 토큰을 통해 파일을 잠금해제 할 수 있습니다", 5 | "File can only be unlocked by the owner of the lock" : "파일을 잠근 사람만 풀 수 있음", 6 | "Desktop client" : "데스크톱 클라이언트", 7 | "iOS client" : "iOS 클라이언트", 8 | "Android client" : "Android 클라이언트", 9 | "Temporary files lock" : "파일 임시 잠금", 10 | "Temporary lock your files" : "내 파일을 임시로 잠그기", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "사용자가 파일을 임시로 잠글 수 있도록 허용하여 공유 파일을 작업하는 동안 충돌하지 않도록 하십시오.", 12 | "Unlock file" : "파일 잠금해제", 13 | "Lock file" : "파일 잠금" 14 | }, 15 | "nplurals=1; plural=0;"); 16 | -------------------------------------------------------------------------------- /l10n/ko.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "오직 유효한 소유자 잠금 토큰을 통해 파일을 잠금해제 할 수 있습니다", 3 | "File can only be unlocked by the owner of the lock" : "파일을 잠근 사람만 풀 수 있음", 4 | "Desktop client" : "데스크톱 클라이언트", 5 | "iOS client" : "iOS 클라이언트", 6 | "Android client" : "Android 클라이언트", 7 | "Temporary files lock" : "파일 임시 잠금", 8 | "Temporary lock your files" : "내 파일을 임시로 잠그기", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "사용자가 파일을 임시로 잠글 수 있도록 허용하여 공유 파일을 작업하는 동안 충돌하지 않도록 하십시오.", 10 | "Unlock file" : "파일 잠금해제", 11 | "Lock file" : "파일 잠금" 12 | },"pluralForm" :"nplurals=1; plural=0;" 13 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Desktop-Programm" 5 | }, 6 | "nplurals=2; plural=(n != 1);"); 7 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Desktop-Programm" 3 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 4 | } -------------------------------------------------------------------------------- /l10n/lt_LT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Šiuo metu failą užrakino %s", 5 | "File is not locked" : "Failas nėra užrakintas", 6 | "File can only be unlocked by the owner of the lock" : "Failą gali atrakinti tik užrakto savininkas", 7 | "Desktop client" : "Darbalaukio klientas", 8 | "iOS client" : "iOS klientas", 9 | "Android client" : "Android klientas", 10 | "Temporary files lock" : "Laikinasis failų užraktas", 11 | "Temporary lock your files" : "Laikinai užrakinti savo failus", 12 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Leidžia naudotojams laikinai blokuoti savo failus, kad išvengti veiklos konfliktų dirbant su bendrinamais failais.", 13 | "Unlock file" : "Atrakinti failą", 14 | "Lock file" : "Užrakinti failą", 15 | "Keep lock" : "Palikti užraktą", 16 | "Force unlock" : "Priverstinai atrakinti" 17 | }, 18 | "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); 19 | -------------------------------------------------------------------------------- /l10n/lt_LT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Šiuo metu failą užrakino %s", 3 | "File is not locked" : "Failas nėra užrakintas", 4 | "File can only be unlocked by the owner of the lock" : "Failą gali atrakinti tik užrakto savininkas", 5 | "Desktop client" : "Darbalaukio klientas", 6 | "iOS client" : "iOS klientas", 7 | "Android client" : "Android klientas", 8 | "Temporary files lock" : "Laikinasis failų užraktas", 9 | "Temporary lock your files" : "Laikinai užrakinti savo failus", 10 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Leidžia naudotojams laikinai blokuoti savo failus, kad išvengti veiklos konfliktų dirbant su bendrinamais failais.", 11 | "Unlock file" : "Atrakinti failą", 12 | "Lock file" : "Užrakinti failą", 13 | "Keep lock" : "Palikti užraktą", 14 | "Force unlock" : "Priverstinai atrakinti" 15 | },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" 16 | } -------------------------------------------------------------------------------- /l10n/lv.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Darbvirsmas klients", 5 | "iOS client" : "iOS klients", 6 | "Android client" : "Android klients" 7 | }, 8 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); 9 | -------------------------------------------------------------------------------- /l10n/lv.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Darbvirsmas klients", 3 | "iOS client" : "iOS klients", 4 | "Android client" : "Android klients" 5 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" 6 | } -------------------------------------------------------------------------------- /l10n/mk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Клиент за компјутер", 5 | "Temporary files lock" : "Привремено заклучени датотеки", 6 | "Temporary lock your files" : "Повремено заклучување на ваши датотеки", 7 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Дозволи им на корисниците да ги заклучуваат своите датотеките за да избегнат конфликт додека работат на споделени датотеки.", 8 | "Unlock file" : "Отклучи датотека", 9 | "Lock file" : "Заклучи датотека" 10 | }, 11 | "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); 12 | -------------------------------------------------------------------------------- /l10n/mk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Клиент за компјутер", 3 | "Temporary files lock" : "Привремено заклучени датотеки", 4 | "Temporary lock your files" : "Повремено заклучување на ваши датотеки", 5 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Дозволи им на корисниците да ги заклучуваат своите датотеките за да избегнат конфликт додека работат на споделени датотеки.", 6 | "Unlock file" : "Отклучи датотека", 7 | "Lock file" : "Заклучи датотека" 8 | },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" 9 | } -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "захиалагчийн дэлгэц", 5 | "iOS client" : "iOS үйлчлүүлэгч", 6 | "Android client" : "Android хэрэглэгч" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "захиалагчийн дэлгэц", 3 | "iOS client" : "iOS үйлчлүүлэгч", 4 | "Android client" : "Android хэрэглэгч" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/nb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Filen er for øyeblikket låst av %s", 5 | "File is not locked" : "Filen er ikke låst", 6 | "File can only be unlocked by providing a valid owner lock token" : "Filen kan bare låses opp ved å oppgi et gyldig låsetoken for eieren", 7 | "File can only be unlocked by the owner of the lock" : "Filen kan bare låses opp av eieren av låsen", 8 | "Desktop client" : "Skrivebordsklient", 9 | "iOS client" : "iOS klient", 10 | "Android client" : "Android klient", 11 | "Temporary files lock" : "Midlertidig fillås", 12 | "Temporary lock your files" : "Lås midlertidig filene dine", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "La brukerne låse filene midlertidig for å unngå konflikter mens de arbeider med delte filer.", 14 | "Unlock file" : "Lås opp fil", 15 | "Lock file" : "Lås fil" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/nb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Filen er for øyeblikket låst av %s", 3 | "File is not locked" : "Filen er ikke låst", 4 | "File can only be unlocked by providing a valid owner lock token" : "Filen kan bare låses opp ved å oppgi et gyldig låsetoken for eieren", 5 | "File can only be unlocked by the owner of the lock" : "Filen kan bare låses opp av eieren av låsen", 6 | "Desktop client" : "Skrivebordsklient", 7 | "iOS client" : "iOS klient", 8 | "Android client" : "Android klient", 9 | "Temporary files lock" : "Midlertidig fillås", 10 | "Temporary lock your files" : "Lås midlertidig filene dine", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "La brukerne låse filene midlertidig for å unngå konflikter mens de arbeider med delte filer.", 12 | "Unlock file" : "Lås opp fil", 13 | "Lock file" : "Lås fil" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/nl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by the owner of the lock" : "Bestand kan alleen ontgrendeld worden door de eigenaar van de vergrendeling", 5 | "Desktop client" : "Desktop client", 6 | "iOS client" : "iOS client", 7 | "Android client" : "Android client", 8 | "Temporary files lock" : "Tijdelijke bestandsvergrendeling", 9 | "Temporary lock your files" : "Tijdelijk je bestanden vergrendelen", 10 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Staat je gebruikers toe om tijdelijk hun bestanden te vergrendelen, om conflicten te vermijden terwijl ze aan gedeelde bestanden werken.", 11 | "Unlock file" : "Ontgrendel bestand", 12 | "Lock file" : "Vergrendel bestand" 13 | }, 14 | "nplurals=2; plural=(n != 1);"); 15 | -------------------------------------------------------------------------------- /l10n/nl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by the owner of the lock" : "Bestand kan alleen ontgrendeld worden door de eigenaar van de vergrendeling", 3 | "Desktop client" : "Desktop client", 4 | "iOS client" : "iOS client", 5 | "Android client" : "Android client", 6 | "Temporary files lock" : "Tijdelijke bestandsvergrendeling", 7 | "Temporary lock your files" : "Tijdelijk je bestanden vergrendelen", 8 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Staat je gebruikers toe om tijdelijk hun bestanden te vergrendelen, om conflicten te vermijden terwijl ze aan gedeelde bestanden werken.", 9 | "Unlock file" : "Ontgrendel bestand", 10 | "Lock file" : "Vergrendel bestand" 11 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 12 | } -------------------------------------------------------------------------------- /l10n/oc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Client de burèu", 5 | "Temporary lock your files" : "Verrolhar temporàriament vòstres fichièrs", 6 | "Unlock file" : "Desverrolhar lo fichièr", 7 | "Lock file" : "Verrolhar lo fichièr" 8 | }, 9 | "nplurals=2; plural=(n > 1);"); 10 | -------------------------------------------------------------------------------- /l10n/oc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Client de burèu", 3 | "Temporary lock your files" : "Verrolhar temporàriament vòstres fichièrs", 4 | "Unlock file" : "Desverrolhar lo fichièr", 5 | "Lock file" : "Verrolhar lo fichièr" 6 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 7 | } -------------------------------------------------------------------------------- /l10n/pl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Plik można odblokować tylko poprzez podanie prawidłowego tokena blokady właściciela", 5 | "File can only be unlocked by the owner of the lock" : "Plik może odblokować tylko właściciel blokady", 6 | "Desktop client" : "Klient na komputer", 7 | "iOS client" : "Klient iOS", 8 | "Android client" : "Klient Android", 9 | "Temporary files lock" : "Tymczasowa blokada plików", 10 | "Temporary lock your files" : "Tymczasowo zablokuj swoje pliki", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Zezwól użytkownikom na tymczasowe blokowanie swoich plików, aby uniknąć konfliktów podczas pracy na udostępnionych plikach.", 12 | "Unlock file" : "Odblokuj plik", 13 | "Lock file" : "Zablokuj plik" 14 | }, 15 | "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); 16 | -------------------------------------------------------------------------------- /l10n/pl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Plik można odblokować tylko poprzez podanie prawidłowego tokena blokady właściciela", 3 | "File can only be unlocked by the owner of the lock" : "Plik może odblokować tylko właściciel blokady", 4 | "Desktop client" : "Klient na komputer", 5 | "iOS client" : "Klient iOS", 6 | "Android client" : "Klient Android", 7 | "Temporary files lock" : "Tymczasowa blokada plików", 8 | "Temporary lock your files" : "Tymczasowo zablokuj swoje pliki", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Zezwól użytkownikom na tymczasowe blokowanie swoich plików, aby uniknąć konfliktów podczas pracy na udostępnionych plikach.", 10 | "Unlock file" : "Odblokuj plik", 11 | "Lock file" : "Zablokuj plik" 12 | },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" 13 | } -------------------------------------------------------------------------------- /l10n/pt_BR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "O arquivo está atualmente bloqueado por %s", 5 | "File is not locked" : "O arquivo não está bloqueado", 6 | "File can only be unlocked by providing a valid owner lock token" : "O arquivo só pode ser desbloqueado fornecendo um token de bloqueio de proprietário válido", 7 | "File can only be unlocked by the owner of the lock" : "O arquivo só pode ser desbloqueado pelo proprietário do bloqueio", 8 | "Desktop client" : "Cliente Desktop", 9 | "iOS client" : "Cliente iOS", 10 | "Android client" : "Cliente Android", 11 | "Temporary files lock" : "Bloquear arquivos temporariamente", 12 | "Temporary lock your files" : "Travar temporariamente seus arquivos ", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir que usuários bloqueiem temporariamente seus arquivos para evitar conflitos enquanto trabalham em arquivos compartilhados.", 14 | "Manually locked by {user}" : "Bloqueado manualmente por {user}", 15 | "Locked by editing online in {app}" : "Bloqueado por edição on-line em {app}", 16 | "Automatically locked by {user}" : "Bloqueado automaticamente por {user}", 17 | "Unlock file" : "Destravar arquivo", 18 | "Lock file" : "Travar arquivo", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Esse arquivo foi bloqueado automaticamente por um cliente. A remoção do bloqueio pode levar a um conflito ao salvar o arquivo.", 20 | "Keep lock" : "Manter o bloqueio", 21 | "Force unlock" : "Forçar o desbloqueio" 22 | }, 23 | "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 24 | -------------------------------------------------------------------------------- /l10n/pt_BR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "O arquivo está atualmente bloqueado por %s", 3 | "File is not locked" : "O arquivo não está bloqueado", 4 | "File can only be unlocked by providing a valid owner lock token" : "O arquivo só pode ser desbloqueado fornecendo um token de bloqueio de proprietário válido", 5 | "File can only be unlocked by the owner of the lock" : "O arquivo só pode ser desbloqueado pelo proprietário do bloqueio", 6 | "Desktop client" : "Cliente Desktop", 7 | "iOS client" : "Cliente iOS", 8 | "Android client" : "Cliente Android", 9 | "Temporary files lock" : "Bloquear arquivos temporariamente", 10 | "Temporary lock your files" : "Travar temporariamente seus arquivos ", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir que usuários bloqueiem temporariamente seus arquivos para evitar conflitos enquanto trabalham em arquivos compartilhados.", 12 | "Manually locked by {user}" : "Bloqueado manualmente por {user}", 13 | "Locked by editing online in {app}" : "Bloqueado por edição on-line em {app}", 14 | "Automatically locked by {user}" : "Bloqueado automaticamente por {user}", 15 | "Unlock file" : "Destravar arquivo", 16 | "Lock file" : "Travar arquivo", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Esse arquivo foi bloqueado automaticamente por um cliente. A remoção do bloqueio pode levar a um conflito ao salvar o arquivo.", 18 | "Keep lock" : "Manter o bloqueio", 19 | "Force unlock" : "Forçar o desbloqueio" 20 | },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 21 | } -------------------------------------------------------------------------------- /l10n/pt_PT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "O ficheiro está atualmente bloqueado por %s", 5 | "File is not locked" : "O ficheiro não está bloqueado", 6 | "File can only be unlocked by providing a valid owner lock token" : "O ficheiros só pode ser desbloqueado fornecendo uma chave de bloqueio de proprietário válido", 7 | "File can only be unlocked by the owner of the lock" : "O ficheiros só pode ser desbloqueado pelo proprietário do bloqueio", 8 | "Desktop client" : "Cliente de PC", 9 | "iOS client" : "Cliente de iOS", 10 | "Android client" : "Cliente de Android", 11 | "Temporary files lock" : "Bloquear ficheiros temporariamente", 12 | "Temporary lock your files" : "Bloquear temporariamente os seus ficheiros ", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir que os utilizadores bloqueiem temporariamente os seus ficheiros para evitar conflitos enquanto trabalham em ficheiros partilhados.", 14 | "Unlock file" : "Desbloquear ficheiro", 15 | "Lock file" : "Bloquear ficheiro " 16 | }, 17 | "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 18 | -------------------------------------------------------------------------------- /l10n/pt_PT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "O ficheiro está atualmente bloqueado por %s", 3 | "File is not locked" : "O ficheiro não está bloqueado", 4 | "File can only be unlocked by providing a valid owner lock token" : "O ficheiros só pode ser desbloqueado fornecendo uma chave de bloqueio de proprietário válido", 5 | "File can only be unlocked by the owner of the lock" : "O ficheiros só pode ser desbloqueado pelo proprietário do bloqueio", 6 | "Desktop client" : "Cliente de PC", 7 | "iOS client" : "Cliente de iOS", 8 | "Android client" : "Cliente de Android", 9 | "Temporary files lock" : "Bloquear ficheiros temporariamente", 10 | "Temporary lock your files" : "Bloquear temporariamente os seus ficheiros ", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permitir que os utilizadores bloqueiem temporariamente os seus ficheiros para evitar conflitos enquanto trabalham em ficheiros partilhados.", 12 | "Unlock file" : "Desbloquear ficheiro", 13 | "Lock file" : "Bloquear ficheiro " 14 | },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 15 | } -------------------------------------------------------------------------------- /l10n/ro.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by providing a valid owner lock token" : "Fișierul poate fi deblocat numai prin furnizarea unui token de blocare a proprietarului valid", 5 | "File can only be unlocked by the owner of the lock" : "Fișierul poate fi deblocat numai de către deținătorul fișierului", 6 | "Desktop client" : "Client desktop", 7 | "Temporary files lock" : "Blocaj temporar de fișiere", 8 | "Temporary lock your files" : "Blochează-ți temporar fișierele", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite utilizatorilor sa își blocheze temporar fișierele pentru a evita conflictele în timp ce lucrezi la fișiere partajate.", 10 | "Unlock file" : "Deblochează fișierul", 11 | "Lock file" : "Blochează fișierul" 12 | }, 13 | "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); 14 | -------------------------------------------------------------------------------- /l10n/ro.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by providing a valid owner lock token" : "Fișierul poate fi deblocat numai prin furnizarea unui token de blocare a proprietarului valid", 3 | "File can only be unlocked by the owner of the lock" : "Fișierul poate fi deblocat numai de către deținătorul fișierului", 4 | "Desktop client" : "Client desktop", 5 | "Temporary files lock" : "Blocaj temporar de fișiere", 6 | "Temporary lock your files" : "Blochează-ți temporar fișierele", 7 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite utilizatorilor sa își blocheze temporar fișierele pentru a evita conflictele în timp ce lucrezi la fișiere partajate.", 8 | "Unlock file" : "Deblochează fișierul", 9 | "Lock file" : "Blochează fișierul" 10 | },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" 11 | } -------------------------------------------------------------------------------- /l10n/ru.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Файл заблокирован %s", 5 | "File is not locked" : "Файл не заблокирован", 6 | "File can only be unlocked by providing a valid owner lock token" : "Файл может быть разблокирован только вводом действительного токена блокировки, подтверждающим владение файлом", 7 | "File can only be unlocked by the owner of the lock" : "Файл может быть разблокирован только тем, кто установил блокировку", 8 | "Desktop client" : "Клиент для ПК", 9 | "iOS client" : "клиент для iOS", 10 | "Android client" : "клиент для Android", 11 | "Temporary files lock" : "Временная блокировка файлов", 12 | "Temporary lock your files" : "Временная блокировка файлов", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Разрешить пользователям временно блокировать файлы во избежание конфликтов при совместной работе с файлами.", 14 | "Unlock file" : "Разблокировать файл", 15 | "Lock file" : "Заблокировать файл", 16 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Этот файл был автоматически заблокирован клиентом. Снятие блокировки может привести к конфликту при сохранении файла.", 17 | "Keep lock" : "Держать заблокированным", 18 | "Force unlock" : "Принудительная разблокировка" 19 | }, 20 | "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); 21 | -------------------------------------------------------------------------------- /l10n/ru.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Файл заблокирован %s", 3 | "File is not locked" : "Файл не заблокирован", 4 | "File can only be unlocked by providing a valid owner lock token" : "Файл может быть разблокирован только вводом действительного токена блокировки, подтверждающим владение файлом", 5 | "File can only be unlocked by the owner of the lock" : "Файл может быть разблокирован только тем, кто установил блокировку", 6 | "Desktop client" : "Клиент для ПК", 7 | "iOS client" : "клиент для iOS", 8 | "Android client" : "клиент для Android", 9 | "Temporary files lock" : "Временная блокировка файлов", 10 | "Temporary lock your files" : "Временная блокировка файлов", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Разрешить пользователям временно блокировать файлы во избежание конфликтов при совместной работе с файлами.", 12 | "Unlock file" : "Разблокировать файл", 13 | "Lock file" : "Заблокировать файл", 14 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Этот файл был автоматически заблокирован клиентом. Снятие блокировки может привести к конфликту при сохранении файла.", 15 | "Keep lock" : "Держать заблокированным", 16 | "Force unlock" : "Принудительная разблокировка" 17 | },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" 18 | } -------------------------------------------------------------------------------- /l10n/sc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Cliente de iscrivania", 5 | "iOS client" : "Cliente iOS", 6 | "Android client" : "Cliente Android", 7 | "Temporary files lock" : "Blocu temporale de is documentos", 8 | "Temporary lock your files" : "Bloca pro immoe is documentos tuos", 9 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite a is utentes de blocare is documentos issoro in manera temporale pro evitare conflitos cando si traballat in documentos cumpartzidos.", 10 | "Unlock file" : "Isbloca su documentu", 11 | "Lock file" : "Bloca su documentu" 12 | }, 13 | "nplurals=2; plural=(n != 1);"); 14 | -------------------------------------------------------------------------------- /l10n/sc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Cliente de iscrivania", 3 | "iOS client" : "Cliente iOS", 4 | "Android client" : "Cliente Android", 5 | "Temporary files lock" : "Blocu temporale de is documentos", 6 | "Temporary lock your files" : "Bloca pro immoe is documentos tuos", 7 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Permite a is utentes de blocare is documentos issoro in manera temporale pro evitare conflitos cando si traballat in documentos cumpartzidos.", 8 | "Unlock file" : "Isbloca su documentu", 9 | "Lock file" : "Bloca su documentu" 10 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 11 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Android client" : "ඇන්ඩ්‍රොයිඩ් අනුග්‍රාහකය" 5 | }, 6 | "nplurals=2; plural=(n != 1);"); 7 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Android client" : "ඇන්ඩ්‍රොයිඩ් අනුග්‍රාහකය" 3 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 4 | } -------------------------------------------------------------------------------- /l10n/sk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Súbor je momentálne zamknutý od %s", 5 | "File is not locked" : "Súbor nie je zamknutý", 6 | "File can only be unlocked by providing a valid owner lock token" : "Súbor môže byť odomknutý iba poskytnutím správneho tokenu vlastníkom zámku", 7 | "File can only be unlocked by the owner of the lock" : "Súbor môže byť odomknutý iba vlastníkom zámku", 8 | "Desktop client" : "Desktopový klient", 9 | "iOS client" : "iOS klient", 10 | "Android client" : "Android klient", 11 | "Temporary files lock" : "Dočasný zámok súborov", 12 | "Temporary lock your files" : "Dočasne zamykajte svoje súbory", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Umožňuje vašim používateľom dočasne zamykať svoje súbory a vyhýbať sa tak konfliktom pri práci na zdieľaných súboroch.", 14 | "Manually locked by {user}" : "Manuálne zamknuté od {user}", 15 | "Locked by editing online in {app}" : "Uzamknuté úpravou online v {app}", 16 | "Automatically locked by {user}" : "Automaticky zamknuté od {user}", 17 | "Unlock file" : "Odomknúť súbor", 18 | "Lock file" : "Zamknúť súbor", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Tento súbor bol automaticky uzamknutý klientom. Odstránenie zámku môže viesť ku konfliktu pri ukladaní súboru.", 20 | "Keep lock" : "Ponechať uzamknuté", 21 | "Force unlock" : "Vynútiť odomknutie" 22 | }, 23 | "nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); 24 | -------------------------------------------------------------------------------- /l10n/sk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Súbor je momentálne zamknutý od %s", 3 | "File is not locked" : "Súbor nie je zamknutý", 4 | "File can only be unlocked by providing a valid owner lock token" : "Súbor môže byť odomknutý iba poskytnutím správneho tokenu vlastníkom zámku", 5 | "File can only be unlocked by the owner of the lock" : "Súbor môže byť odomknutý iba vlastníkom zámku", 6 | "Desktop client" : "Desktopový klient", 7 | "iOS client" : "iOS klient", 8 | "Android client" : "Android klient", 9 | "Temporary files lock" : "Dočasný zámok súborov", 10 | "Temporary lock your files" : "Dočasne zamykajte svoje súbory", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Umožňuje vašim používateľom dočasne zamykať svoje súbory a vyhýbať sa tak konfliktom pri práci na zdieľaných súboroch.", 12 | "Manually locked by {user}" : "Manuálne zamknuté od {user}", 13 | "Locked by editing online in {app}" : "Uzamknuté úpravou online v {app}", 14 | "Automatically locked by {user}" : "Automaticky zamknuté od {user}", 15 | "Unlock file" : "Odomknúť súbor", 16 | "Lock file" : "Zamknúť súbor", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Tento súbor bol automaticky uzamknutý klientom. Odstránenie zámku môže viesť ku konfliktu pri ukladaní súboru.", 18 | "Keep lock" : "Ponechať uzamknuté", 19 | "Force unlock" : "Vynútiť odomknutie" 20 | },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" 21 | } -------------------------------------------------------------------------------- /l10n/sl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File can only be unlocked by the owner of the lock" : "Datoteko lahko odklene le lastnik datoteke", 5 | "Desktop client" : "Odjemalec za namizne računalnike", 6 | "iOS client" : "Odjemalec za iOS", 7 | "Android client" : "Odjemalec za Android", 8 | "Temporary files lock" : "Začasno zaklepanje datotek", 9 | "Temporary lock your files" : "Začasno zaklepanje datotek v uporabi", 10 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Omogoča uporabnikom začasno zaklepanje datotek za preprečevanje sporov pri delu z datotekami v souporabi.", 11 | "Unlock file" : "Odkleni datoteko", 12 | "Lock file" : "Zakleni datoteko" 13 | }, 14 | "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); 15 | -------------------------------------------------------------------------------- /l10n/sl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File can only be unlocked by the owner of the lock" : "Datoteko lahko odklene le lastnik datoteke", 3 | "Desktop client" : "Odjemalec za namizne računalnike", 4 | "iOS client" : "Odjemalec za iOS", 5 | "Android client" : "Odjemalec za Android", 6 | "Temporary files lock" : "Začasno zaklepanje datotek", 7 | "Temporary lock your files" : "Začasno zaklepanje datotek v uporabi", 8 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Omogoča uporabnikom začasno zaklepanje datotek za preprečevanje sporov pri delu z datotekami v souporabi.", 9 | "Unlock file" : "Odkleni datoteko", 10 | "Lock file" : "Zakleni datoteko" 11 | },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" 12 | } -------------------------------------------------------------------------------- /l10n/sq.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Klient Desktop", 5 | "iOS client" : "Klient IOS", 6 | "Android client" : "Klient Android" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/sq.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Klient Desktop", 3 | "iOS client" : "Klient IOS", 4 | "Android client" : "Klient Android" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/sr.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Фајл је тренутно закључао корисник %s", 5 | "File is not locked" : "Фајл је закључан", 6 | "File can only be unlocked by providing a valid owner lock token" : "Фајл може да се откључа само ако се наведе власников важећи жетон катанца", 7 | "File can only be unlocked by the owner of the lock" : "Фајл може да откључа само власник катанца", 8 | "Desktop client" : "Клијент за рачунар", 9 | "iOS client" : "iOS клијент", 10 | "Android client" : "Андроид клијент", 11 | "Temporary files lock" : "Привремено закључавање фајлова", 12 | "Temporary lock your files" : "Закључај фајлове привремено", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Дозволите Вашим корисницима да привремено закључају своје фајлове да избегну конфликте док раде на дељеним фајловима.", 14 | "Manually locked by {user}" : "Ручно је закључао корисник {user}", 15 | "Locked by editing online in {app}" : "Закључано уређивањем на мрежи у {app}", 16 | "Automatically locked by {user}" : "Аутоматски је закључао корисник {user}", 17 | "Unlock file" : "Откључај фајл", 18 | "Lock file" : "Закључај фајл", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Клијент је аутоматски закључао овај фајл. Уклањање катанца може да изазове конфликте приликом чувања фајла.", 20 | "Keep lock" : "Задржи катанац", 21 | "Force unlock" : "Форсирај откључавање" 22 | }, 23 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 24 | -------------------------------------------------------------------------------- /l10n/sr.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Фајл је тренутно закључао корисник %s", 3 | "File is not locked" : "Фајл је закључан", 4 | "File can only be unlocked by providing a valid owner lock token" : "Фајл може да се откључа само ако се наведе власников важећи жетон катанца", 5 | "File can only be unlocked by the owner of the lock" : "Фајл може да откључа само власник катанца", 6 | "Desktop client" : "Клијент за рачунар", 7 | "iOS client" : "iOS клијент", 8 | "Android client" : "Андроид клијент", 9 | "Temporary files lock" : "Привремено закључавање фајлова", 10 | "Temporary lock your files" : "Закључај фајлове привремено", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Дозволите Вашим корисницима да привремено закључају своје фајлове да избегну конфликте док раде на дељеним фајловима.", 12 | "Manually locked by {user}" : "Ручно је закључао корисник {user}", 13 | "Locked by editing online in {app}" : "Закључано уређивањем на мрежи у {app}", 14 | "Automatically locked by {user}" : "Аутоматски је закључао корисник {user}", 15 | "Unlock file" : "Откључај фајл", 16 | "Lock file" : "Закључај фајл", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Клијент је аутоматски закључао овај фајл. Уклањање катанца може да изазове конфликте приликом чувања фајла.", 18 | "Keep lock" : "Задржи катанац", 19 | "Force unlock" : "Форсирај откључавање" 20 | },"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);" 21 | } -------------------------------------------------------------------------------- /l10n/sr@latin.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Unlock file" : "Otključaj fajl" 5 | }, 6 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 7 | -------------------------------------------------------------------------------- /l10n/sr@latin.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Unlock file" : "Otključaj fajl" 3 | },"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);" 4 | } -------------------------------------------------------------------------------- /l10n/sv.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Filen är för tillfället låst av %s", 5 | "File is not locked" : "Filen är inte låst", 6 | "File can only be unlocked by providing a valid owner lock token" : "Filen kan endast låsas upp genom att tillhandahålla en giltig token för ägarlåset.", 7 | "File can only be unlocked by the owner of the lock" : "Fil kan endast låsas upp av låsets ägare", 8 | "Desktop client" : "Desktopklient", 9 | "iOS client" : "iOS-klient", 10 | "Android client" : "Android-klient", 11 | "Temporary files lock" : "Temporär låsning av filer", 12 | "Temporary lock your files" : "Temporär låsning av dina filer", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Låt dina användare tillfälligt låsa sina filer för att undvika konflikter när de arbetar med delade filer.", 14 | "Manually locked by {user}" : "Manuellt låst av {user}", 15 | "Locked by editing online in {app}" : "Låst genom onlineredigering i {app}", 16 | "Automatically locked by {user}" : "Automatiskt låst av {user}", 17 | "Unlock file" : "Lås upp fil", 18 | "Lock file" : "Lås fil", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Den här filen har låsts automatiskt av en klient. Borttagning av låset kan leda till en konflikt när filen sparas.", 20 | "Keep lock" : "Behåll låset", 21 | "Force unlock" : "Tvinga upplåsning" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /l10n/sv.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Filen är för tillfället låst av %s", 3 | "File is not locked" : "Filen är inte låst", 4 | "File can only be unlocked by providing a valid owner lock token" : "Filen kan endast låsas upp genom att tillhandahålla en giltig token för ägarlåset.", 5 | "File can only be unlocked by the owner of the lock" : "Fil kan endast låsas upp av låsets ägare", 6 | "Desktop client" : "Desktopklient", 7 | "iOS client" : "iOS-klient", 8 | "Android client" : "Android-klient", 9 | "Temporary files lock" : "Temporär låsning av filer", 10 | "Temporary lock your files" : "Temporär låsning av dina filer", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Låt dina användare tillfälligt låsa sina filer för att undvika konflikter när de arbetar med delade filer.", 12 | "Manually locked by {user}" : "Manuellt låst av {user}", 13 | "Locked by editing online in {app}" : "Låst genom onlineredigering i {app}", 14 | "Automatically locked by {user}" : "Automatiskt låst av {user}", 15 | "Unlock file" : "Lås upp fil", 16 | "Lock file" : "Lås fil", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Den här filen har låsts automatiskt av en klient. Borttagning av låset kan leda till en konflikt när filen sparas.", 18 | "Keep lock" : "Behåll låset", 19 | "Force unlock" : "Tvinga upplåsning" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /l10n/th.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "ไคลเอ็นต์เดสก์ท็อป" 5 | }, 6 | "nplurals=1; plural=0;"); 7 | -------------------------------------------------------------------------------- /l10n/th.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "ไคลเอ็นต์เดสก์ท็อป" 3 | },"pluralForm" :"nplurals=1; plural=0;" 4 | } -------------------------------------------------------------------------------- /l10n/tr.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Dosya şu anda %s tarafından kilitlenmiş", 5 | "File is not locked" : "Dosya kilitli değil", 6 | "File can only be unlocked by providing a valid owner lock token" : "Dosyanın kilidini yalnızca geçerli bir sahip kilidi kodu ile açabilir", 7 | "File can only be unlocked by the owner of the lock" : "Dosyanın kilidini yalnızca kilitleyen kişi açabilir", 8 | "Desktop client" : "Masaüstü istemcisi", 9 | "iOS client" : "iOS istemcisi", 10 | "Android client" : "Android istemcisi", 11 | "Temporary files lock" : "Geçici dosya kilidi", 12 | "Temporary lock your files" : "Dosyalarınızı geçici olarak kilitleyin", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Kullanıcılar paylaşımlı dosyalar üzerinde çalışırken, çakışmaların engellenmesi için dosyaların geçici olarak kilitlenmesini sağlar.", 14 | "Manually locked by {user}" : "{user} tarafından el ile kilitlenmiş", 15 | "Locked by editing online in {app}" : "{app} içinden çevrim içi düzenlenerek kilitlenmiş", 16 | "Automatically locked by {user}" : "{user} tarafından otomatik olarak kilitlenmiş", 17 | "Unlock file" : "Dosya kilidini aç", 18 | "Lock file" : "Dosyayı kilitle", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Bu dosya bir istemci tarafından otomatik olarak kilitlenmiş. Kilidi kaldırmak dosyayı kaydederken bir çakışmaya yol açabilir.", 20 | "Keep lock" : "Kilitli kalsın", 21 | "Force unlock" : "Kilit zorla açılsın" 22 | }, 23 | "nplurals=2; plural=(n > 1);"); 24 | -------------------------------------------------------------------------------- /l10n/tr.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Dosya şu anda %s tarafından kilitlenmiş", 3 | "File is not locked" : "Dosya kilitli değil", 4 | "File can only be unlocked by providing a valid owner lock token" : "Dosyanın kilidini yalnızca geçerli bir sahip kilidi kodu ile açabilir", 5 | "File can only be unlocked by the owner of the lock" : "Dosyanın kilidini yalnızca kilitleyen kişi açabilir", 6 | "Desktop client" : "Masaüstü istemcisi", 7 | "iOS client" : "iOS istemcisi", 8 | "Android client" : "Android istemcisi", 9 | "Temporary files lock" : "Geçici dosya kilidi", 10 | "Temporary lock your files" : "Dosyalarınızı geçici olarak kilitleyin", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Kullanıcılar paylaşımlı dosyalar üzerinde çalışırken, çakışmaların engellenmesi için dosyaların geçici olarak kilitlenmesini sağlar.", 12 | "Manually locked by {user}" : "{user} tarafından el ile kilitlenmiş", 13 | "Locked by editing online in {app}" : "{app} içinden çevrim içi düzenlenerek kilitlenmiş", 14 | "Automatically locked by {user}" : "{user} tarafından otomatik olarak kilitlenmiş", 15 | "Unlock file" : "Dosya kilidini aç", 16 | "Lock file" : "Dosyayı kilitle", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "Bu dosya bir istemci tarafından otomatik olarak kilitlenmiş. Kilidi kaldırmak dosyayı kaydederken bir çakışmaya yol açabilir.", 18 | "Keep lock" : "Kilitli kalsın", 19 | "Force unlock" : "Kilit zorla açılsın" 20 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 21 | } -------------------------------------------------------------------------------- /l10n/ug.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "ھۆججەت ھازىر% s تەرىپىدىن قۇلۇپلاندى", 5 | "File is not locked" : "ھۆججەت قۇلۇپلانمىدى", 6 | "File can only be unlocked by providing a valid owner lock token" : "ئىناۋەتلىك ئىگىنىڭ قۇلۇپ بەلگىسى بىلەن تەمىنلىگەندىلا ھۆججەتنى ئاچقىلى بولىدۇ", 7 | "File can only be unlocked by the owner of the lock" : "ھۆججەتنى قۇلۇپ ئىگىسىلا ئاچالايدۇ", 8 | "Desktop client" : "ئۈستەل يۈزى خېرىدارى", 9 | "iOS client" : "iOS خېرىدارى", 10 | "Android client" : "ئاندىرويىد خېرىدارى", 11 | "Temporary files lock" : "ۋاقىتلىق ھۆججەتلەر قۇلۇپلىنىدۇ", 12 | "Temporary lock your files" : "ھۆججەتلىرىڭىزنى ۋاقىتلىق قۇلۇپلاڭ", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "ئىشلەتكۈچىلەرنىڭ ئورتاق ھۆججەتلەرنى ئىشلەۋاتقاندا توقۇنۇشتىن ساقلىنىش ئۈچۈن ھۆججەتلىرىنى ۋاقىتلىق قۇلۇپلىشىغا يول قويۇڭ.", 14 | "Unlock file" : "ھۆججەتنى ئېچىش", 15 | "Lock file" : "ھۆججەتنى قۇلۇپلاش" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/ug.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "ھۆججەت ھازىر% s تەرىپىدىن قۇلۇپلاندى", 3 | "File is not locked" : "ھۆججەت قۇلۇپلانمىدى", 4 | "File can only be unlocked by providing a valid owner lock token" : "ئىناۋەتلىك ئىگىنىڭ قۇلۇپ بەلگىسى بىلەن تەمىنلىگەندىلا ھۆججەتنى ئاچقىلى بولىدۇ", 5 | "File can only be unlocked by the owner of the lock" : "ھۆججەتنى قۇلۇپ ئىگىسىلا ئاچالايدۇ", 6 | "Desktop client" : "ئۈستەل يۈزى خېرىدارى", 7 | "iOS client" : "iOS خېرىدارى", 8 | "Android client" : "ئاندىرويىد خېرىدارى", 9 | "Temporary files lock" : "ۋاقىتلىق ھۆججەتلەر قۇلۇپلىنىدۇ", 10 | "Temporary lock your files" : "ھۆججەتلىرىڭىزنى ۋاقىتلىق قۇلۇپلاڭ", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "ئىشلەتكۈچىلەرنىڭ ئورتاق ھۆججەتلەرنى ئىشلەۋاتقاندا توقۇنۇشتىن ساقلىنىش ئۈچۈن ھۆججەتلىرىنى ۋاقىتلىق قۇلۇپلىشىغا يول قويۇڭ.", 12 | "Unlock file" : "ھۆججەتنى ئېچىش", 13 | "Lock file" : "ھۆججەتنى قۇلۇپلاش" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/uk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "Файл заблоковано %s", 5 | "File is not locked" : "Файл не заблоковано", 6 | "File can only be unlocked by providing a valid owner lock token" : "Файл можна розблокувати, якщо надати дійсний токен блокування, що належить власникові", 7 | "File can only be unlocked by the owner of the lock" : "Файл може розблокувати лише власник замка", 8 | "Desktop client" : "Клієнт для ПК", 9 | "iOS client" : "iOS клієнт", 10 | "Android client" : "Клієнт Android", 11 | "Temporary files lock" : "Тимчасове блокування файлів", 12 | "Temporary lock your files" : "Тимчасово заблокувати ваші файли", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Дозвольте своїм користувачам тимчасово блокувати свої файли, щоб уникнути конфліктів під час роботи зі спільними файлами.", 14 | "Unlock file" : "Розблокувати файл", 15 | "Lock file" : "Заблокувати файл" 16 | }, 17 | "nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); 18 | -------------------------------------------------------------------------------- /l10n/uk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "Файл заблоковано %s", 3 | "File is not locked" : "Файл не заблоковано", 4 | "File can only be unlocked by providing a valid owner lock token" : "Файл можна розблокувати, якщо надати дійсний токен блокування, що належить власникові", 5 | "File can only be unlocked by the owner of the lock" : "Файл може розблокувати лише власник замка", 6 | "Desktop client" : "Клієнт для ПК", 7 | "iOS client" : "iOS клієнт", 8 | "Android client" : "Клієнт Android", 9 | "Temporary files lock" : "Тимчасове блокування файлів", 10 | "Temporary lock your files" : "Тимчасово заблокувати ваші файли", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "Дозвольте своїм користувачам тимчасово блокувати свої файли, щоб уникнути конфліктів під час роботи зі спільними файлами.", 12 | "Unlock file" : "Розблокувати файл", 13 | "Lock file" : "Заблокувати файл" 14 | },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" 15 | } -------------------------------------------------------------------------------- /l10n/vi.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "Desktop client" : "Máy khách để bàn", 5 | "Unlock file" : "Mở khoá tập tin", 6 | "Lock file" : "Khoá tập tin" 7 | }, 8 | "nplurals=1; plural=0;"); 9 | -------------------------------------------------------------------------------- /l10n/vi.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Desktop client" : "Máy khách để bàn", 3 | "Unlock file" : "Mở khoá tập tin", 4 | "Lock file" : "Khoá tập tin" 5 | },"pluralForm" :"nplurals=1; plural=0;" 6 | } -------------------------------------------------------------------------------- /l10n/zh_CN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "文件目前已被 %s 锁定", 5 | "File is not locked" : "文件未锁定", 6 | "File can only be unlocked by providing a valid owner lock token" : "文件只能通过提供有效的所有者锁定令牌来解锁", 7 | "File can only be unlocked by the owner of the lock" : "文件只能由锁的所有者解锁", 8 | "Desktop client" : "桌面客户端", 9 | "iOS client" : "iOS 客户端", 10 | "Android client" : "Android 客户端", 11 | "Temporary files lock" : "临时文件锁定", 12 | "Temporary lock your files" : "临时锁定你的文件", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "允许您的用户临时锁定其文件,以避免在处理共享文件时发生冲突。", 14 | "Manually locked by {user}" : "由 {user} 手动锁定", 15 | "Locked by editing online in {app}" : "因在 {app} 中在线编辑而锁定", 16 | "Automatically locked by {user}" : "由 {user} 自动锁定", 17 | "Unlock file" : "解锁文件", 18 | "Lock file" : "锁定文件", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "此文件已被客户端自动锁定。移除锁定可能会导致在保存文件时发生冲突。", 20 | "Keep lock" : "保持锁定", 21 | "Force unlock" : "强制解锁" 22 | }, 23 | "nplurals=1; plural=0;"); 24 | -------------------------------------------------------------------------------- /l10n/zh_CN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "文件目前已被 %s 锁定", 3 | "File is not locked" : "文件未锁定", 4 | "File can only be unlocked by providing a valid owner lock token" : "文件只能通过提供有效的所有者锁定令牌来解锁", 5 | "File can only be unlocked by the owner of the lock" : "文件只能由锁的所有者解锁", 6 | "Desktop client" : "桌面客户端", 7 | "iOS client" : "iOS 客户端", 8 | "Android client" : "Android 客户端", 9 | "Temporary files lock" : "临时文件锁定", 10 | "Temporary lock your files" : "临时锁定你的文件", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "允许您的用户临时锁定其文件,以避免在处理共享文件时发生冲突。", 12 | "Manually locked by {user}" : "由 {user} 手动锁定", 13 | "Locked by editing online in {app}" : "因在 {app} 中在线编辑而锁定", 14 | "Automatically locked by {user}" : "由 {user} 自动锁定", 15 | "Unlock file" : "解锁文件", 16 | "Lock file" : "锁定文件", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "此文件已被客户端自动锁定。移除锁定可能会导致在保存文件时发生冲突。", 18 | "Keep lock" : "保持锁定", 19 | "Force unlock" : "强制解锁" 20 | },"pluralForm" :"nplurals=1; plural=0;" 21 | } -------------------------------------------------------------------------------- /l10n/zh_HK.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "檔案目前已被 %s 鎖定", 5 | "File is not locked" : "檔案未被鎖定", 6 | "File can only be unlocked by providing a valid owner lock token" : "文件只能通過提供有效的所有者鎖定權杖來解鎖", 7 | "File can only be unlocked by the owner of the lock" : "檔案只能由鎖的所有者解鎖", 8 | "Desktop client" : "桌面客戶端", 9 | "iOS client" : "iOS 客戶端", 10 | "Android client" : "Android 客戶端", 11 | "Temporary files lock" : "暫時上鎖檔案", 12 | "Temporary lock your files" : "暫時將您的檔案上鎖", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "允許您的用戶將他們的檔案暫時上鎖,以免在處理分享檔案時出現抵觸。", 14 | "Manually locked by {user}" : "由 {user} 手動鎖定", 15 | "Locked by editing online in {app}" : "因在 {app} 中線上編輯而鎖定", 16 | "Automatically locked by {user}" : "由 {user} 自動鎖定", 17 | "Unlock file" : "解鎖檔案", 18 | "Lock file" : "上鎖檔案", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "此檔案已被客戶端自動鎖定。移除鎖定可能會導致儲存檔案時發生衝突。", 20 | "Keep lock" : "維持鎖定", 21 | "Force unlock" : "強制解鎖" 22 | }, 23 | "nplurals=1; plural=0;"); 24 | -------------------------------------------------------------------------------- /l10n/zh_HK.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "檔案目前已被 %s 鎖定", 3 | "File is not locked" : "檔案未被鎖定", 4 | "File can only be unlocked by providing a valid owner lock token" : "文件只能通過提供有效的所有者鎖定權杖來解鎖", 5 | "File can only be unlocked by the owner of the lock" : "檔案只能由鎖的所有者解鎖", 6 | "Desktop client" : "桌面客戶端", 7 | "iOS client" : "iOS 客戶端", 8 | "Android client" : "Android 客戶端", 9 | "Temporary files lock" : "暫時上鎖檔案", 10 | "Temporary lock your files" : "暫時將您的檔案上鎖", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "允許您的用戶將他們的檔案暫時上鎖,以免在處理分享檔案時出現抵觸。", 12 | "Manually locked by {user}" : "由 {user} 手動鎖定", 13 | "Locked by editing online in {app}" : "因在 {app} 中線上編輯而鎖定", 14 | "Automatically locked by {user}" : "由 {user} 自動鎖定", 15 | "Unlock file" : "解鎖檔案", 16 | "Lock file" : "上鎖檔案", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "此檔案已被客戶端自動鎖定。移除鎖定可能會導致儲存檔案時發生衝突。", 18 | "Keep lock" : "維持鎖定", 19 | "Force unlock" : "強制解鎖" 20 | },"pluralForm" :"nplurals=1; plural=0;" 21 | } -------------------------------------------------------------------------------- /l10n/zh_TW.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "files_lock", 3 | { 4 | "File is currently locked by %s" : "檔案目前已被 %s 鎖定", 5 | "File is not locked" : "檔案未被鎖定", 6 | "File can only be unlocked by providing a valid owner lock token" : "檔案只能透過提供有效的擁有者鎖定權杖來解鎖", 7 | "File can only be unlocked by the owner of the lock" : "檔案僅能由鎖的擁有者解鎖", 8 | "Desktop client" : "桌面用戶端", 9 | "iOS client" : "iOS 客戶端", 10 | "Android client" : "Android 客戶端", 11 | "Temporary files lock" : "暫時上鎖檔案", 12 | "Temporary lock your files" : "暫時將您的檔案上鎖", 13 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "允許您的使用者將他們的檔案暫時上鎖,以免在處理分享檔案時出現衝突。", 14 | "Manually locked by {user}" : "由 {user} 手動鎖定", 15 | "Locked by editing online in {app}" : "因在 {app} 中線上編輯而鎖定", 16 | "Automatically locked by {user}" : "由 {user} 自動鎖定", 17 | "Unlock file" : "解鎖檔案", 18 | "Lock file" : "上鎖檔案", 19 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "此檔案已被客戶端自動鎖定。移除鎖定可能會導致儲存檔案時發生衝突。", 20 | "Keep lock" : "維持鎖定", 21 | "Force unlock" : "強制解鎖" 22 | }, 23 | "nplurals=1; plural=0;"); 24 | -------------------------------------------------------------------------------- /l10n/zh_TW.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "File is currently locked by %s" : "檔案目前已被 %s 鎖定", 3 | "File is not locked" : "檔案未被鎖定", 4 | "File can only be unlocked by providing a valid owner lock token" : "檔案只能透過提供有效的擁有者鎖定權杖來解鎖", 5 | "File can only be unlocked by the owner of the lock" : "檔案僅能由鎖的擁有者解鎖", 6 | "Desktop client" : "桌面用戶端", 7 | "iOS client" : "iOS 客戶端", 8 | "Android client" : "Android 客戶端", 9 | "Temporary files lock" : "暫時上鎖檔案", 10 | "Temporary lock your files" : "暫時將您的檔案上鎖", 11 | "Allow your users to temporary lock their files to avoid conflicts while working on shared files." : "允許您的使用者將他們的檔案暫時上鎖,以免在處理分享檔案時出現衝突。", 12 | "Manually locked by {user}" : "由 {user} 手動鎖定", 13 | "Locked by editing online in {app}" : "因在 {app} 中線上編輯而鎖定", 14 | "Automatically locked by {user}" : "由 {user} 自動鎖定", 15 | "Unlock file" : "解鎖檔案", 16 | "Lock file" : "上鎖檔案", 17 | "This file has been locked automatically by a client. Removing the lock may lead to a conflict saving the file." : "此檔案已被客戶端自動鎖定。移除鎖定可能會導致儲存檔案時發生衝突。", 18 | "Keep lock" : "維持鎖定", 19 | "Force unlock" : "強制解鎖" 20 | },"pluralForm" :"nplurals=1; plural=0;" 21 | } -------------------------------------------------------------------------------- /lib/Capability.php: -------------------------------------------------------------------------------- 1 | [ 15 | 'locking' => '1.0', 16 | 'api-feature-lock-type' => true, 17 | ] 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/Cron/Unlock.php: -------------------------------------------------------------------------------- 1 | lockService = $lockService; 23 | 24 | $this->setInterval(12 * 60); 25 | } 26 | 27 | protected function run($argument): void { 28 | $this->manageTimeoutLock(); 29 | } 30 | 31 | private function manageTimeoutLock(): void { 32 | $this->lockService->removeLocks($this->lockService->getDeprecatedLocks()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Db/CoreQueryBuilder.php: -------------------------------------------------------------------------------- 1 | limitInt('file_id', $fileId); 25 | } 26 | 27 | 28 | /** 29 | * @param array $ids 30 | */ 31 | public function limitToIds(array $ids): void { 32 | $this->limitArray('id', $ids); 33 | } 34 | 35 | public function limitToFileIds(array $ids): void { 36 | $this->limitInIntArray('file_id', $ids); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/Db/CoreRequestBuilder.php: -------------------------------------------------------------------------------- 1 | uninstallAppTables(); 47 | $this->removeFromJobs(); 48 | ; 49 | $this->removeFromMigrations(); 50 | } 51 | 52 | 53 | /** 54 | * 55 | */ 56 | public function uninstallAppTables() { 57 | $dbConn = OC::$server->get(Connection::class); 58 | $schema = new SchemaWrapper($dbConn); 59 | 60 | foreach (array_keys(self::$tables) as $table) { 61 | if ($schema->hasTable($table)) { 62 | $schema->dropTable($table); 63 | } 64 | } 65 | 66 | $schema->performDropTableCalls(); 67 | } 68 | 69 | 70 | /** 71 | * 72 | */ 73 | public function removeFromMigrations() { 74 | $qb = $this->getQueryBuilder(); 75 | $qb->delete('migrations'); 76 | $qb->where($qb->exprLimitToDBField('app', 'files_lock', true, true)); 77 | 78 | $qb->execute(); 79 | } 80 | 81 | /** 82 | * 83 | */ 84 | public function removeFromJobs() { 85 | $qb = $this->getQueryBuilder(); 86 | $qb->delete('jobs'); 87 | $qb->where($qb->exprLimitToDBField('class', 'OCA\FilesLock\Cron\Unlock', true, true)); 88 | $qb->execute(); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /lib/Exceptions/LockNotFoundException.php: -------------------------------------------------------------------------------- 1 | */ 19 | class LoadAdditionalScripts implements IEventListener { 20 | public function handle(Event $event): void { 21 | if (!($event instanceof LoadAdditionalScriptsEvent)) { 22 | return; 23 | } 24 | 25 | Util::addInitScript(Application::APP_ID, 'files_lock-init'); 26 | Util::addScript(Application::APP_ID, 'files_lock-main'); 27 | Util::addStyle(Application::APP_ID, 'files_lock-main'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/LockProvider.php: -------------------------------------------------------------------------------- 1 | lockService = $lockService; 20 | } 21 | 22 | public function getLocks(int $fileId): array { 23 | try { 24 | $lock = $this->lockService->getLockFromFileId($fileId); 25 | $this->lockService->injectMetadata($lock); 26 | } catch (Exceptions\LockNotFoundException $e) { 27 | return []; 28 | } 29 | 30 | if ($lock) { 31 | return [$lock]; 32 | } 33 | return []; 34 | } 35 | 36 | /** 37 | * @inheritdoc 38 | */ 39 | public function lock(LockContext $lockInfo): ILock { 40 | return $this->lockService->lock($lockInfo); 41 | } 42 | 43 | /** 44 | * @inheritdoc 45 | */ 46 | public function unlock(LockContext $lockInfo): void { 47 | try { 48 | $this->lockService->getLockFromFileId($lockInfo->getNode()->getId()); 49 | } catch (Exceptions\LockNotFoundException $e) { 50 | throw new PreConditionNotMetException('No lock found'); 51 | } 52 | 53 | try { 54 | $this->lockService->unlock($lockInfo); 55 | } catch (Exceptions\LockNotFoundException $e) { 56 | throw new PreConditionNotMetException('No lock found for scope'); 57 | } catch (Exceptions\UnauthorizedUnlockException $e) { 58 | throw new PreConditionNotMetException('Unauth unlock'); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/Migration/Version0001Date20191105000001.php: -------------------------------------------------------------------------------- 1 | connection = $connection; 34 | } 35 | 36 | 37 | /** 38 | * @param IOutput $output 39 | * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` 40 | * @param array $options 41 | * 42 | * @return ISchemaWrapper 43 | */ 44 | public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ISchemaWrapper { 45 | /** @var ISchemaWrapper $schema */ 46 | $schema = $schemaClosure(); 47 | 48 | if ($schema->hasTable('files_lock')) { 49 | return $schema; 50 | } 51 | 52 | $table = $schema->createTable('files_lock'); 53 | 54 | $table->addColumn( 55 | 'id', 'integer', 56 | [ 57 | 'autoincrement' => true, 58 | 'unsigned' => true, 59 | 'notnull' => true, 60 | 'length' => 11 61 | ] 62 | ); 63 | $table->addColumn( 64 | 'user_id', 'string', 65 | [ 66 | 'notnull' => true, 67 | 'length' => 255, 68 | ] 69 | ); 70 | $table->addColumn( 71 | 'file_id', 'integer', 72 | [ 73 | 'notnull' => true, 74 | 'unsigned' => true, 75 | 'length' => 11, 76 | ] 77 | ); 78 | $table->addColumn( 79 | 'token', 'string', 80 | [ 81 | 'notnull' => true, 82 | 'length' => 63, 83 | ] 84 | ); 85 | $table->addColumn( 86 | 'creation', 'bigint', 87 | [ 88 | 'notnull' => true, 89 | 'unsigned' => true, 90 | 'length' => 14 91 | ] 92 | ); 93 | 94 | $table->setPrimaryKey(['id']); 95 | $table->addIndex(['file_id']); 96 | $table->addUniqueIndex(['token']); 97 | 98 | return $schema; 99 | } 100 | 101 | 102 | /** 103 | * @param IOutput $output 104 | * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` 105 | * @param array $options 106 | * 107 | * @throws Exception 108 | */ 109 | public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) { 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /lib/Migration/Version1000Date20220201111525.php: -------------------------------------------------------------------------------- 1 | getTable('files_lock'); 24 | 25 | $hasSchemaChanges = false; 26 | if (!$table->hasColumn('type')) { 27 | $table->addColumn( 28 | 'type', Types::SMALLINT, 29 | [ 30 | 'default' => 0, 31 | 'unsigned' => true, 32 | ] 33 | ); 34 | $hasSchemaChanges = true; 35 | } 36 | 37 | if (!$table->hasColumn('scope')) { 38 | $table->addColumn( 39 | 'scope', Types::SMALLINT, 40 | [ 41 | 'default' => 0, 42 | 'unsigned' => true, 43 | ] 44 | ); 45 | $hasSchemaChanges = true; 46 | } 47 | 48 | if (!$table->hasColumn('ttl')) { 49 | $table->addColumn( 50 | 'ttl', Types::INTEGER, 51 | [ 52 | 'default' => 0, 53 | ] 54 | ); 55 | $hasSchemaChanges = true; 56 | } 57 | return $hasSchemaChanges ? $schema : null; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/Migration/Version1000Date20220430180808.php: -------------------------------------------------------------------------------- 1 | getTable('files_lock'); 40 | 41 | $hasSchemaChanges = false; 42 | if (!$table->hasColumn('owner')) { 43 | $table->addColumn( 44 | 'owner', Types::STRING, 45 | [ 46 | 'notnull' => false, 47 | 'length' => 255, 48 | 'default' => '' 49 | ] 50 | ); 51 | $hasSchemaChanges = true; 52 | } 53 | 54 | return $hasSchemaChanges ? $schema : null; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /lib/Service/ConfigService.php: -------------------------------------------------------------------------------- 1 | '0' 21 | ]; 22 | 23 | /** @var string */ 24 | private $appName; 25 | 26 | /** @var IConfig */ 27 | private $config; 28 | 29 | /** @var string */ 30 | private $userId; 31 | 32 | /** @var IRequest */ 33 | private $request; 34 | 35 | 36 | /** 37 | * ConfigService constructor. 38 | * 39 | * @param string $appName 40 | * @param IConfig $config 41 | * @param IRequest $request 42 | * @param string $userId 43 | */ 44 | public function __construct($appName, IConfig $config, IRequest $request, $userId) { 45 | $this->appName = $appName; 46 | $this->config = $config; 47 | $this->request = $request; 48 | $this->userId = $userId; 49 | } 50 | 51 | 52 | /** 53 | * @return int 54 | */ 55 | public function getTimeoutSeconds(): int { 56 | return ((int)$this->getAppValue(ConfigService::LOCK_TIMEOUT)) * 60; 57 | } 58 | 59 | 60 | /** 61 | * Get a value by key 62 | * 63 | * @param string $key 64 | * 65 | * @return string 66 | */ 67 | public function getAppValue($key) { 68 | $defaultValue = null; 69 | 70 | if (array_key_exists($key, $this->defaults)) { 71 | $defaultValue = $this->defaults[$key]; 72 | } 73 | 74 | return $this->config->getAppValue($this->appName, $key, $defaultValue); 75 | } 76 | 77 | 78 | /** 79 | * Set a value by key 80 | * 81 | * @param string $key 82 | * @param string $value 83 | * 84 | * @return void 85 | */ 86 | public function setAppValue($key, $value) { 87 | $this->config->setAppValue($this->appName, $key, $value); 88 | } 89 | 90 | 91 | /** 92 | * remove a key 93 | * 94 | * @param string $key 95 | * 96 | * @return string 97 | */ 98 | public function deleteAppValue($key) { 99 | return $this->config->deleteAppValue($this->appName, $key); 100 | } 101 | 102 | 103 | /** 104 | * 105 | */ 106 | public function unsetAppConfig() { 107 | $this->config->deleteAppValues(Application::APP_ID); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /lib/Tools/Db/IQueryRow.php: -------------------------------------------------------------------------------- 1 | _setup[$key] = $value; 39 | } 40 | 41 | return $this->get($key, $this->_setup, $default); 42 | } 43 | 44 | /** 45 | * @param string $key 46 | * @param string $value 47 | * 48 | * @param string $default 49 | * 50 | * @return string 51 | */ 52 | public function setupArray(string $key, array $value = [], array $default = []): array { 53 | if ($value !== '') { 54 | $this->_setup[$key] = $value; 55 | } 56 | 57 | return $this->getArray($key, $this->_setup, $default); 58 | } 59 | 60 | 61 | /** 62 | * @param string $key 63 | * 64 | * @return string 65 | */ 66 | public function appConfig(string $key): string { 67 | $app = $this->setup('app'); 68 | if ($app === '') { 69 | return ''; 70 | } 71 | 72 | /** @var IConfig $config */ 73 | $config = OC::$server->get(IConfig::class); 74 | 75 | return $config->getAppValue($app, $key, ''); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "files_lock", 3 | "version": "32.0.0-dev.0", 4 | "license": "AGPL-3.0-or-later", 5 | "private": true, 6 | "type": "module", 7 | "scripts": { 8 | "build": "vite --mode production build", 9 | "dev": "vite --mode development build", 10 | "watch": "vite --mode development build --watch", 11 | "lint": "eslint --ext .js,.ts,.vue src", 12 | "lint:fix": "eslint --ext .js,.ts,.vue src --fix", 13 | "stylelint": "stylelint 'src/**/*.vue'", 14 | "stylelint:fix": "stylelint src/**/*.vue --fix", 15 | "start:nextcloud": "node playwright/start-nextcloud-server.mjs" 16 | }, 17 | "dependencies": { 18 | "@mdi/svg": "^7.4.47", 19 | "@nextcloud/auth": "^2.5.1", 20 | "@nextcloud/axios": "^2.5.1", 21 | "@nextcloud/dialogs": "^7.0.0-rc.0", 22 | "@nextcloud/event-bus": "^3.3.2", 23 | "@nextcloud/files": "^3.10.2", 24 | "@nextcloud/l10n": "^3.2.0", 25 | "@nextcloud/router": "^3.0.1", 26 | "@nextcloud/vue": "^9.0.0-rc.1", 27 | "vue": "^3.5.14" 28 | }, 29 | "devDependencies": { 30 | "@nextcloud/browserslist-config": "^3.0.1", 31 | "@nextcloud/e2e-test-server": "^0.2.1", 32 | "@nextcloud/eslint-config": "^8.4.2", 33 | "@nextcloud/stylelint-config": "^3.1.0", 34 | "@nextcloud/vite-config": "^2.3.5", 35 | "@playwright/test": "^1.52.0", 36 | "@vue/tsconfig": "^0.7.0", 37 | "prettier": "^3.5.3", 38 | "stylelint-config-css-modules": "^4.4.0", 39 | "typescript": "^5.8.3", 40 | "typescript-plugin-css-modules": "^5.1.0", 41 | "vite": "^6.3.5" 42 | }, 43 | "prettier": { 44 | "useTabs": true, 45 | "semi": false, 46 | "singleQuote": true, 47 | "bracketSameLine": true, 48 | "tabWidth": 4 49 | }, 50 | "browserslist": [ 51 | "extends @nextcloud/browserslist-config" 52 | ], 53 | "eslintConfig": { 54 | "extends": [ 55 | "@nextcloud/eslint-config/typescript" 56 | ] 57 | }, 58 | "engines": { 59 | "node": "^23", 60 | "npm": "^10" 61 | }, 62 | "optionalDependencies": { 63 | "@rollup/rollup-linux-x64-gnu": "^4.41.1" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { defineConfig, devices } from '@playwright/test' 7 | 8 | /** 9 | * See https://playwright.dev/docs/test-configuration. 10 | */ 11 | export default defineConfig({ 12 | testDir: './playwright', 13 | 14 | /* Run tests in files in parallel */ 15 | fullyParallel: true, 16 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 17 | forbidOnly: !!process.env.CI, 18 | /* Retry on CI only */ 19 | retries: process.env.CI ? 2 : 0, 20 | /* Opt out of parallel tests on CI. */ 21 | workers: process.env.CI ? 1 : undefined, 22 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 23 | reporter: process.env.CI ? 'github' : 'html', 24 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 25 | use: { 26 | /* Base URL to use in actions like `await page.goto('./')`. */ 27 | baseURL: 'http://localhost:8089/index.php/', 28 | 29 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 30 | trace: 'on-first-retry', 31 | }, 32 | 33 | projects: [ 34 | // Our global setup to configure the Nextcloud docker container 35 | { 36 | name: 'setup', 37 | testMatch: /setup\.ts$/, 38 | }, 39 | 40 | { 41 | name: 'chromium', 42 | use: { 43 | ...devices['Desktop Chrome'], 44 | }, 45 | dependencies: ['setup'], 46 | }, 47 | ], 48 | 49 | webServer: [ 50 | { 51 | // Starts the Nextcloud docker container 52 | command: 'npm run start:nextcloud', 53 | reuseExistingServer: !process.env.CI, 54 | url: 'http://127.0.0.1:8089', 55 | stderr: 'pipe', 56 | stdout: 'pipe', 57 | timeout: 5 * 60 * 1000, // max. 5 minutes for creating the container 58 | }, 59 | ], 60 | }) 61 | -------------------------------------------------------------------------------- /playwright/e2e/fileactions.spec.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Ferdinand Thiessen 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { expect } from '@playwright/test' 7 | import { test } from '../support/fixtures/random-user' 8 | 9 | test.beforeEach(async ({ page }) => { 10 | await page.goto('apps/files') 11 | await page.waitForURL(/apps\/files/) 12 | }) 13 | 14 | test('can manually lock a file', async ({ page, user }) => { 15 | await page.getByRole('button', { name: 'Actions' }).click() 16 | await page.getByRole('menuitem', { name: 'Lock file' }).click() 17 | const lockIndicator = page.getByRole('button', { name: 'Manually locked by ' + user.userId }) 18 | await expect(lockIndicator).toBeVisible() 19 | await page.getByRole('button', { name: 'Actions' }).click() 20 | const lockInfo = page.getByRole('menuitem', { name: 'Manually locked by ' + user.userId }) 21 | await expect(lockInfo).toBeVisible() 22 | await page.getByRole('menuitem', { name: 'Unlock' }).click() 23 | await expect(lockIndicator).not.toBeVisible() 24 | }) 25 | 26 | test('it shows the lock menu entry in grid view', async ({ page, user }) => { 27 | await page.getByRole('button', { name: 'Switch to grid view' }).click() 28 | await page.getByRole('button', { name: 'Actions' }).click() 29 | const lockButton = page.getByRole('menuitem', { name: 'Lock file' }) 30 | await expect(lockButton).toBeVisible() 31 | await lockButton.click() 32 | await expect(lockButton).not.toBeVisible() 33 | 34 | await page.getByRole('button', { name: 'Actions' }).click() 35 | 36 | const lockIndicator = page.getByRole('menuitem', { name: 'Manually locked by ' + user.userId }) 37 | await expect(lockIndicator).toBeVisible() 38 | 39 | // Ensure that the inline lock indicator is not visible 40 | const inlineLockIndicator = page.locator('.files-list__row-action-lock_inline') 41 | await expect(inlineLockIndicator).not.toBeVisible() 42 | 43 | const unlockButton = page.getByRole('menuitem', { name: 'Unlock' }) 44 | await expect(unlockButton).toBeVisible() 45 | await unlockButton.click() 46 | await expect(unlockButton).not.toBeVisible() 47 | }) 48 | -------------------------------------------------------------------------------- /playwright/start-nextcloud-server.mjs: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Ferdinand Thiessen 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { startNextcloud, stopNextcloud } from '@nextcloud/e2e-test-server/docker' 7 | import { readFileSync } from 'fs' 8 | 9 | const start = async () => { 10 | return await startNextcloud(getBranch(), true, { 11 | exposePort: 8089, 12 | }) 13 | } 14 | 15 | const getBranch = () => { 16 | try { 17 | const appinfo = readFileSync('appinfo/info.xml').toString() 18 | const maxVersion = appinfo.match( 19 | //, 20 | )?.[1] 21 | return maxVersion ? `stable${maxVersion}` : undefined 22 | } catch (err) { 23 | if (err.code === 'ENOENT') { 24 | console.warn('No appinfo/info.xml found. Using default server banch.') 25 | } 26 | } 27 | } 28 | 29 | // Start the Nextcloud docker container 30 | await start() 31 | // Listen for process to exit (tests done) and shut down the docker container 32 | process.on('beforeExit', (code) => { 33 | stopNextcloud() 34 | }) 35 | 36 | // Idle to wait for shutdown 37 | while (true) { 38 | await new Promise((resolve) => setTimeout(resolve, 5000)) 39 | } 40 | -------------------------------------------------------------------------------- /playwright/support/fixtures/random-user.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Ferdinand Thiessen 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { test as base } from '@playwright/test' 7 | import { createRandomUser, login } from '@nextcloud/e2e-test-server/playwright' 8 | 9 | interface RandomUserFixture { 10 | user: User 11 | } 12 | 13 | /** 14 | * This test fixture ensures a new random user is created and used for the test (current page) 15 | */ 16 | export const test = base.extend({ 17 | user: async ({ }, use) => { 18 | const user = await createRandomUser() 19 | await use(user) 20 | }, 21 | page: async ({ browser, baseURL, user }, use) => { 22 | // Important: make sure we authenticate in a clean environment by unsetting storage state. 23 | const page = await browser.newPage({ 24 | storageState: undefined, 25 | baseURL, 26 | }) 27 | 28 | await login(page.request, user) 29 | 30 | await use(page) 31 | await page.close() 32 | }, 33 | }) 34 | -------------------------------------------------------------------------------- /playwright/support/setup.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Ferdinand Thiessen 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { test as setup } from '@playwright/test' 7 | import { configureNextcloud } from '@nextcloud/e2e-test-server' 8 | 9 | /** 10 | * We use this to ensure Nextcloud is configured correctly before running our tests 11 | * 12 | * This can not be done in the webserver startup process, 13 | * as that only checks for the URL to be accessible which happens already before everything is configured. 14 | */ 15 | setup('Configure Nextcloud', async () => { 16 | const appsToInstall = [ 17 | 'files_lock', 18 | ] 19 | await configureNextcloud(appsToInstall) 20 | }) 21 | -------------------------------------------------------------------------------- /psalm.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /screenshots/0.7.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/files_lock/997f2121bd3b504c1ffd3b7a1a374211d6a2457f/screenshots/0.7.0.png -------------------------------------------------------------------------------- /screenshots/0.7.0.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /screenshots/cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/files_lock/997f2121bd3b504c1ffd3b7a1a374211d6a2457f/screenshots/cli.png -------------------------------------------------------------------------------- /screenshots/cli.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /src/api.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import axios from '@nextcloud/axios' 7 | import { generateOcsUrl } from '@nextcloud/router' 8 | import { type Node } from '@nextcloud/files' 9 | 10 | export const lockFile = async (node: Node) => { 11 | const result = await axios.put( 12 | generateOcsUrl(`/apps/files_lock/lock/${node.fileid}`), 13 | ) 14 | console.debug('lock result', result) 15 | return result?.data?.ocs?.data 16 | } 17 | 18 | export const unlockFile = async (node: Node) => { 19 | const result = await axios.delete( 20 | generateOcsUrl(`/apps/files_lock/lock/${node.fileid}`), 21 | ) 22 | console.debug('lock result', result) 23 | return result?.data?.ocs?.data 24 | } 25 | -------------------------------------------------------------------------------- /src/helper.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { type Node } from '@nextcloud/files' 7 | import { generateUrl } from '@nextcloud/router' 8 | import { type LockState, LockType } from './types' 9 | import { translate as t } from '@nextcloud/l10n' 10 | import { getCurrentUser } from '@nextcloud/auth' 11 | 12 | export const getLockStateFromAttributes = (node: Node): LockState => { 13 | return { 14 | isLocked: !!node.attributes.lock, 15 | lockOwner: node.attributes['lock-owner'], 16 | lockOwnerDisplayName: node.attributes['lock-owner-displayname'], 17 | lockOwnerType: parseInt(node.attributes['lock-owner-type']), 18 | lockOwnerEditor: node.attributes['lock-owner-editor'], 19 | lockTime: parseInt(node.attributes['lock-time']), 20 | } 21 | } 22 | 23 | export const canLock = (node: Node): boolean => { 24 | const state = getLockStateFromAttributes(node) 25 | 26 | if (!state.isLocked) { 27 | return true 28 | } 29 | 30 | return false 31 | } 32 | 33 | export const canUnlock = (node: Node): boolean => { 34 | const state = getLockStateFromAttributes(node) 35 | 36 | if (!state.isLocked) { 37 | return false 38 | } 39 | 40 | if (state.lockOwnerType === LockType.User && state.lockOwner === getCurrentUser()?.uid) { 41 | return true 42 | } 43 | 44 | if (state.lockOwnerType === LockType.Token && state.lockOwner === getCurrentUser()?.uid) { 45 | return true 46 | } 47 | 48 | return false 49 | } 50 | 51 | export const generateAvatarSvg = (userId: string) => { 52 | const avatarUrl = generateUrl('/avatar/{userId}/32', { userId }) 53 | return `` 57 | } 58 | 59 | export const getInfoLabel = (node: Node): string => { 60 | const state = getLockStateFromAttributes(node) 61 | 62 | if (state.lockOwnerType === LockType.User) { 63 | return state.isLocked 64 | ? t('files_lock', 'Manually locked by {user}', { user: state.lockOwnerDisplayName }) 65 | : '' 66 | 67 | } else if (state.lockOwnerType === LockType.App) { 68 | return state.isLocked 69 | ? t('files_lock', 'Locked by editing online in {app}', { app: state.lockOwnerDisplayName }) 70 | : '' 71 | } else { 72 | return state.isLocked 73 | ? t('files_lock', 'Automatically locked by {user}', { user: state.lockOwnerDisplayName }) 74 | : '' 75 | } 76 | 77 | return '' 78 | } 79 | -------------------------------------------------------------------------------- /src/init.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { registerDavProperty } from '@nextcloud/files/dav' 7 | 8 | registerDavProperty('nc:lock', { nc: 'http://nextcloud.org/ns' }) 9 | registerDavProperty('nc:lock-owner', { nc: 'http://nextcloud.org/ns' }) 10 | registerDavProperty('nc:lock-owner-displayname', { nc: 'http://nextcloud.org/ns' }) 11 | registerDavProperty('nc:lock-owner-type', { nc: 'http://nextcloud.org/ns' }) 12 | registerDavProperty('nc:lock-owner-editor', { nc: 'http://nextcloud.org/ns' }) 13 | registerDavProperty('nc:lock-time', { nc: 'http://nextcloud.org/ns' }) 14 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | /* The grid view currently does not properly handle inline actions, we hide them for now */ 7 | .action-item__popper .action.files-list__row-action-lock_inline, 8 | .files-list--grid .action.files-list__row-action-lock_inline { 9 | display: none; 10 | } 11 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | export enum LockType { 7 | User = 0, 8 | App = 1, 9 | Token = 2, 10 | } 11 | 12 | export type LockState = { 13 | isLocked: boolean, 14 | lockOwner: string, 15 | lockOwnerDisplayName: string, 16 | lockOwnerType: LockType, 17 | lockOwnerEditor: string, 18 | lockTime: number, 19 | } 20 | -------------------------------------------------------------------------------- /tests/Unit/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/files_lock/997f2121bd3b504c1ffd3b7a1a374211d6a2457f/tests/Unit/.gitkeep -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | addPsr4('Test\\', OC::$SERVERROOT . '/tests/lib/', true); 17 | \OC::$composerAutoloader->addPsr4('Tests\\', OC::$SERVERROOT . '/tests/', true); 18 | 19 | // load all enabled apps 20 | \OCP\Server::get(\OCP\App\IAppManager::class)->loadApps(); 21 | \OCP\Server::get(\OCP\App\IAppManager::class)->enableApp('files_lock', true); 22 | \OC_App::updateApp('files_lock'); 23 | 24 | set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/share/php'); 25 | -------------------------------------------------------------------------------- /tests/litmus/0001-Comment-out-collection-locking-tests.patch: -------------------------------------------------------------------------------- 1 | From 0f741f9170ea89c4513a7c083e56acab8fcc8709 Mon Sep 17 00:00:00 2001 2 | From: =?UTF-8?q?Julius=20H=C3=A4rtl?= 3 | Date: Mon, 2 May 2022 09:50:09 +0200 4 | Subject: [PATCH] Comment out collection locking tests 5 | MIME-Version: 1.0 6 | Content-Type: text/plain; charset=UTF-8 7 | Content-Transfer-Encoding: 8bit 8 | 9 | Signed-off-by: Julius Härtl 10 | --- 11 | src/locks.c | 10 +++++----- 12 | 1 file changed, 5 insertions(+), 5 deletions(-) 13 | 14 | diff --git a/src/locks.c b/src/locks.c 15 | index 0aea24f..b28a809 100644 16 | --- a/src/locks.c 17 | +++ b/src/locks.c 18 | @@ -616,7 +616,7 @@ ne_test tests[] = { 19 | T(cond_put_with_not), 20 | T(cond_put_corrupt_token), 21 | T(complex_cond_put), 22 | - T(fail_complex_cond_put), 23 | + // T(fail_complex_cond_put), 24 | 25 | T(unlock), 26 | 27 | @@ -628,19 +628,19 @@ ne_test tests[] = { 28 | T(notowner_modify), T(notowner_lock), T(owner_modify), 29 | 30 | /* take out a second shared lock */ 31 | - T(double_sharedlock), 32 | + // T(double_sharedlock), 33 | 34 | /* make sure the main lock is still intact. */ 35 | - T(notowner_modify), T(notowner_lock), 36 | + // T(notowner_modify), T(notowner_lock), 37 | /* finally, unlock the poor abused resource. */ 38 | T(unlock), 39 | 40 | /* collection locking */ 41 | T(prep_collection), 42 | T(lock_collection), 43 | - T(owner_modify), T(notowner_modify), 44 | + T(owner_modify), // T(notowner_modify), 45 | T(refresh), 46 | - T(indirect_refresh), 47 | + // T(indirect_refresh), 48 | T(unlock), 49 | 50 | /* lock on a unmapped url */ 51 | -- 52 | 2.35.1 53 | 54 | -------------------------------------------------------------------------------- /tests/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ./../lib 6 | 7 | 8 | 9 | 10 | Unit 11 | 12 | 13 | Feature 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/stub.phpstub: -------------------------------------------------------------------------------- 1 |