├── .eslintrc.js ├── .gitattributes ├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── appstore-build-publish.yml │ ├── command-compile.yml │ ├── dependabot-approve-merge.yml │ ├── fixup.yml │ ├── lint-eslint.yml │ ├── lint-info-xml.yml │ ├── lint-php-cs.yml │ ├── lint-php.yml │ ├── lint-stylelint.yml │ ├── node.yml │ ├── phpunit-mysql.yml │ ├── phpunit-oci.yml │ ├── phpunit-pgsql.yml │ ├── phpunit-sqlite.yml │ ├── pr-feedback.yml │ ├── psalm.yml │ ├── reuse.yml │ ├── update-nextcloud-ocp-approve-merge.yml │ └── update-nextcloud-ocp.yml ├── .gitignore ├── .l10nignore ├── .nextcloudignore ├── .php-cs-fixer.dist.php ├── .tx └── config ├── AUTHORS.md ├── CHANGELOG.md ├── COPYING ├── LICENSES ├── AGPL-3.0-only.txt ├── AGPL-3.0-or-later.txt ├── Apache-2.0.txt ├── BSD-2-Clause.txt ├── BSD-3-Clause.txt ├── CC0-1.0.txt ├── GPL-3.0-or-later.txt ├── ISC.txt ├── MIT.txt └── MPL-2.0.txt ├── Makefile ├── README.md ├── REUSE.toml ├── appinfo ├── info.xml └── routes.php ├── babel.config.js ├── build-js ├── WebpackSPDXPlugin.js └── npm-post-build.sh ├── composer.json ├── composer.lock ├── img ├── app-alternate.svg ├── app-dark.svg └── app.svg ├── js ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.license ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.map ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.map.license ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.license ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.map ├── user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.map.license ├── user_migration-personal-settings.js ├── user_migration-personal-settings.js.license ├── user_migration-personal-settings.js.map ├── user_migration-personal-settings.js.map.license ├── user_migration-vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs.js ├── user_migration-vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs.js.license ├── user_migration-vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs.js.map ├── user_migration-vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs.js.map.license ├── user_migration-vendors-node_modules_rehype-highlight_index_js.js ├── user_migration-vendors-node_modules_rehype-highlight_index_js.js.license ├── user_migration-vendors-node_modules_rehype-highlight_index_js.js.map └── user_migration-vendors-node_modules_rehype-highlight_index_js.js.map.license ├── krankerl.toml ├── l10n ├── .gitkeep ├── af.js ├── af.json ├── an.js ├── an.json ├── ar.js ├── ar.json ├── ast.js ├── ast.json ├── az.js ├── az.json ├── bg.js ├── bg.json ├── bn_BD.js ├── bn_BD.json ├── br.js ├── br.json ├── bs.js ├── bs.json ├── ca.js ├── ca.json ├── cs.js ├── cs.json ├── cy_GB.js ├── cy_GB.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 ├── gd.js ├── gd.json ├── gl.js ├── gl.json ├── he.js ├── he.json ├── hr.js ├── hr.json ├── hu.js ├── hu.json ├── hy.js ├── hy.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 ├── kab.js ├── kab.json ├── km.js ├── km.json ├── kn.js ├── kn.json ├── ko.js ├── ko.json ├── lb.js ├── lb.json ├── lo.js ├── lo.json ├── lt_LT.js ├── lt_LT.json ├── lv.js ├── lv.json ├── mk.js ├── mk.json ├── mn.js ├── mn.json ├── ms_MY.js ├── ms_MY.json ├── nb.js ├── nb.json ├── nl.js ├── nl.json ├── nn_NO.js ├── nn_NO.json ├── oc.js ├── oc.json ├── pl.js ├── pl.json ├── ps.js ├── ps.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 ├── sw.js ├── sw.json ├── ta.js ├── ta.json ├── th.js ├── th.json ├── tk.js ├── tk.json ├── tr.js ├── tr.json ├── ug.js ├── ug.json ├── uk.js ├── uk.json ├── uz.js ├── uz.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 ├── BackgroundJob │ ├── UserExportJob.php │ └── UserImportJob.php ├── Command │ ├── Export.php │ └── Import.php ├── Controller │ └── ApiController.php ├── Db │ ├── UserExport.php │ ├── UserExportMapper.php │ ├── UserImport.php │ └── UserImportMapper.php ├── ExportDestination.php ├── ImportSource.php ├── Migration │ ├── Version00001Date20220411114609.php │ └── Version00001Date20220412116131.php ├── Migrator │ └── FilesMigrator.php ├── NotExportableException.php ├── Notification │ └── Notifier.php ├── Service │ └── UserMigrationService.php ├── Settings │ └── Personal │ │ ├── Section.php │ │ └── Settings.php ├── UserFolderExportDestination.php └── UserFolderImportSource.php ├── package-lock.json ├── package.json ├── psalm.xml ├── release.sh ├── screenshots ├── export.png ├── export.png.license ├── exporting.png ├── exporting.png.license ├── import.png └── import.png.license ├── src ├── components │ ├── ExportSection.vue │ └── ImportSection.vue ├── personal-settings.js ├── services │ └── migrationService.js ├── shared │ ├── constants.js │ ├── logger.js │ └── utils.js └── views │ └── Personal │ └── Settings.vue ├── stylelint.config.js ├── templates └── settings │ └── personal │ └── settings.php ├── tests ├── Integration │ └── ExampleTest.php ├── Unit │ └── FilesMigratorTest.php ├── bootstrap.php ├── phpunit.integration.xml ├── phpunit.xml ├── psalm-baseline.xml ├── scripts │ └── test_user_migration.sh └── stubs │ └── stub.phpstub ├── vendor-bin ├── cs-fixer │ ├── composer.json │ └── composer.lock ├── phpunit │ ├── composer.json │ └── composer.lock └── psalm │ ├── composer.json │ └── composer.lock └── webpack.config.js /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | module.exports = { 7 | extends: [ 8 | '@nextcloud', 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | /js/* binary 4 | /package-lock.json binary 5 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | # App maintainers 4 | /appinfo/info.xml @come-nc 5 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | version: 2 4 | updates: 5 | - package-ecosystem: composer 6 | directories: 7 | - / 8 | - /vendor-bin/cs-fixer 9 | - /vendor-bin/phpunit 10 | - /vendor-bin/psalm 11 | schedule: 12 | interval: weekly 13 | day: saturday 14 | time: "03:00" 15 | timezone: Europe/Paris 16 | open-pull-requests-limit: 10 17 | labels: 18 | - 3. to review 19 | - dependencies 20 | - package-ecosystem: npm 21 | directory: "/" 22 | schedule: 23 | interval: weekly 24 | day: saturday 25 | time: "03:00" 26 | timezone: Europe/Paris 27 | open-pull-requests-limit: 10 28 | labels: 29 | - 3. to review 30 | - dependencies 31 | 32 | # stable31 33 | - package-ecosystem: composer 34 | target-branch: stable31 35 | directories: 36 | - / 37 | - /vendor-bin/cs-fixer 38 | - /vendor-bin/phpunit 39 | - /vendor-bin/psalm 40 | schedule: 41 | interval: weekly 42 | day: saturday 43 | time: "03:00" 44 | timezone: Europe/Paris 45 | open-pull-requests-limit: 10 46 | labels: 47 | - 3. to review 48 | - dependencies 49 | ignore: 50 | # do not do breaking changes on stable branches 51 | - dependency-name: "*" 52 | update-types: ["version-update:semver-major"] 53 | - package-ecosystem: npm 54 | target-branch: stable31 55 | directory: "/" 56 | schedule: 57 | interval: weekly 58 | day: saturday 59 | time: "03:00" 60 | timezone: Europe/Paris 61 | labels: 62 | - 3. to review 63 | - dependencies 64 | ignore: 65 | # do not do breaking changes on stable branches 66 | - dependency-name: "*" 67 | update-types: ["version-update:semver-major"] 68 | -------------------------------------------------------------------------------- /.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: 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-eslint.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 eslint 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-eslint-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | changes: 22 | runs-on: ubuntu-latest-low 23 | permissions: 24 | contents: read 25 | pull-requests: read 26 | 27 | outputs: 28 | src: ${{ steps.changes.outputs.src}} 29 | 30 | steps: 31 | - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 32 | id: changes 33 | continue-on-error: true 34 | with: 35 | filters: | 36 | src: 37 | - '.github/workflows/**' 38 | - 'src/**' 39 | - 'appinfo/info.xml' 40 | - 'package.json' 41 | - 'package-lock.json' 42 | - 'tsconfig.json' 43 | - '.eslintrc.*' 44 | - '.eslintignore' 45 | - '**.js' 46 | - '**.ts' 47 | - '**.vue' 48 | 49 | lint: 50 | runs-on: ubuntu-latest 51 | 52 | needs: changes 53 | if: needs.changes.outputs.src != 'false' 54 | 55 | name: NPM lint 56 | 57 | steps: 58 | - name: Checkout 59 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 60 | with: 61 | persist-credentials: false 62 | 63 | - name: Read package.json node and npm engines version 64 | uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 65 | id: versions 66 | with: 67 | fallbackNode: '^20' 68 | fallbackNpm: '^10' 69 | 70 | - name: Set up node ${{ steps.versions.outputs.nodeVersion }} 71 | uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 72 | with: 73 | node-version: ${{ steps.versions.outputs.nodeVersion }} 74 | 75 | - name: Set up npm ${{ steps.versions.outputs.npmVersion }} 76 | run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}' 77 | 78 | - name: Install dependencies 79 | env: 80 | CYPRESS_INSTALL_BINARY: 0 81 | PUPPETEER_SKIP_DOWNLOAD: true 82 | run: npm ci 83 | 84 | - name: Lint 85 | run: npm run lint 86 | 87 | summary: 88 | permissions: 89 | contents: none 90 | runs-on: ubuntu-latest-low 91 | needs: [changes, lint] 92 | 93 | if: always() 94 | 95 | # This is the summary, we just avoid to rename it so that branch protection rules still match 96 | name: eslint 97 | 98 | steps: 99 | - name: Summary status 100 | run: if ${{ needs.changes.outputs.src != 'false' && needs.lint.result != 'success' }}; then exit 1; fi 101 | -------------------------------------------------------------------------------- /.github/workflows/lint-info-xml.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 info.xml 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-info-xml-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | xml-linters: 22 | runs-on: ubuntu-latest-low 23 | 24 | name: info.xml lint 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 28 | with: 29 | persist-credentials: false 30 | 31 | - name: Download schema 32 | run: wget https://raw.githubusercontent.com/nextcloud/appstore/master/nextcloudappstore/api/v1/release/info.xsd 33 | 34 | - name: Lint info.xml 35 | uses: ChristophWurst/xmllint-action@36f2a302f84f8c83fceea0b9c59e1eb4a616d3c1 # v1.2 36 | with: 37 | xml-file: ./appinfo/info.xml 38 | xml-schema-file: ./info.xsd 39 | -------------------------------------------------------------------------------- /.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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 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 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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 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/lint-stylelint.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 stylelint 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-stylelint-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | lint: 22 | runs-on: ubuntu-latest 23 | 24 | name: stylelint 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 29 | with: 30 | persist-credentials: false 31 | 32 | - name: Read package.json node and npm engines version 33 | uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 34 | id: versions 35 | with: 36 | fallbackNode: '^20' 37 | fallbackNpm: '^10' 38 | 39 | - name: Set up node ${{ steps.versions.outputs.nodeVersion }} 40 | uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 41 | with: 42 | node-version: ${{ steps.versions.outputs.nodeVersion }} 43 | 44 | - name: Set up npm ${{ steps.versions.outputs.npmVersion }} 45 | run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}' 46 | 47 | - name: Install dependencies 48 | env: 49 | CYPRESS_INSTALL_BINARY: 0 50 | run: npm ci 51 | 52 | - name: Lint 53 | run: npm run stylelint 54 | -------------------------------------------------------------------------------- /.github/workflows/node.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: Node 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: node-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | changes: 22 | runs-on: ubuntu-latest-low 23 | permissions: 24 | contents: read 25 | pull-requests: read 26 | 27 | outputs: 28 | src: ${{ steps.changes.outputs.src}} 29 | 30 | steps: 31 | - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 32 | id: changes 33 | continue-on-error: true 34 | with: 35 | filters: | 36 | src: 37 | - '.github/workflows/**' 38 | - 'src/**' 39 | - 'appinfo/info.xml' 40 | - 'package.json' 41 | - 'package-lock.json' 42 | - 'tsconfig.json' 43 | - '**.js' 44 | - '**.ts' 45 | - '**.vue' 46 | 47 | build: 48 | runs-on: ubuntu-latest 49 | 50 | needs: changes 51 | if: needs.changes.outputs.src != 'false' 52 | 53 | name: NPM build 54 | steps: 55 | - name: Checkout 56 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 57 | with: 58 | persist-credentials: false 59 | 60 | - name: Read package.json node and npm engines version 61 | uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 62 | id: versions 63 | with: 64 | fallbackNode: '^20' 65 | fallbackNpm: '^10' 66 | 67 | - name: Set up node ${{ steps.versions.outputs.nodeVersion }} 68 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 69 | with: 70 | node-version: ${{ steps.versions.outputs.nodeVersion }} 71 | 72 | - name: Set up npm ${{ steps.versions.outputs.npmVersion }} 73 | run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}' 74 | 75 | - name: Install dependencies & build 76 | env: 77 | CYPRESS_INSTALL_BINARY: 0 78 | PUPPETEER_SKIP_DOWNLOAD: true 79 | run: | 80 | npm ci 81 | npm run build --if-present 82 | 83 | - name: Check webpack build changes 84 | run: | 85 | bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" 86 | 87 | - name: Show changes on failure 88 | if: failure() 89 | run: | 90 | git status 91 | git --no-pager diff 92 | exit 1 # make it red to grab attention 93 | 94 | summary: 95 | permissions: 96 | contents: none 97 | runs-on: ubuntu-latest-low 98 | needs: [changes, build] 99 | 100 | if: always() 101 | 102 | # This is the summary, we just avoid to rename it so that branch protection rules still match 103 | name: node 104 | 105 | steps: 106 | - name: Summary status 107 | run: if ${{ needs.changes.outputs.src != 'false' && needs.build.result != 'success' }}; then exit 1; fi 108 | -------------------------------------------------------------------------------- /.github/workflows/pr-feedback.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-FileCopyrightText: 2023 Marcel Klehr 8 | # SPDX-FileCopyrightText: 2023 Joas Schilling <213943+nickvergessen@users.noreply.github.com> 9 | # SPDX-FileCopyrightText: 2023 Daniel Kesselberg 10 | # SPDX-FileCopyrightText: 2023 Florian Steffens 11 | # SPDX-License-Identifier: MIT 12 | 13 | name: 'Ask for feedback on PRs' 14 | on: 15 | schedule: 16 | - cron: '30 1 * * *' 17 | 18 | permissions: 19 | contents: read 20 | pull-requests: write 21 | 22 | jobs: 23 | pr-feedback: 24 | if: ${{ github.repository_owner == 'nextcloud' }} 25 | runs-on: ubuntu-latest 26 | steps: 27 | - name: The get-github-handles-from-website action 28 | uses: marcelklehr/get-github-handles-from-website-action@06b2239db0a48fe1484ba0bfd966a3ab81a08308 # v1.0.1 29 | id: scrape 30 | with: 31 | website: 'https://nextcloud.com/team/' 32 | 33 | - name: Get blocklist 34 | id: blocklist 35 | run: | 36 | blocklist=$(curl https://raw.githubusercontent.com/nextcloud/.github/master/non-community-usernames.txt | paste -s -d, -) 37 | echo "blocklist=$blocklist" >> "$GITHUB_OUTPUT" 38 | 39 | - uses: marcelklehr/pr-feedback-action@1883b38a033fb16f576875e0cf45f98b857655c4 40 | with: 41 | feedback-message: | 42 | Hello there, 43 | Thank you so much for taking the time and effort to create a pull request to our Nextcloud project. 44 | 45 | We hope that the review process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR review process. 46 | 47 | Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6 48 | 49 | Thank you for contributing to Nextcloud and we hope to hear from you soon! 50 | 51 | (If you believe you should not receive this message, you can add yourself to the [blocklist](https://github.com/nextcloud/.github/blob/master/non-community-usernames.txt).) 52 | days-before-feedback: 14 53 | start-date: '2024-04-30' 54 | exempt-authors: '${{ steps.blocklist.outputs.blocklist }},${{ steps.scrape.outputs.users }}' 55 | exempt-bots: true 56 | -------------------------------------------------------------------------------- /.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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 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 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 # main 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: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | .idea 4 | *.iml 5 | vendor/ 6 | /build/ 7 | node_modules/ 8 | /.php_cs.cache 9 | js/*hot-update.* 10 | /.php-cs-fixer.cache 11 | .phpunit.result.cache 12 | -------------------------------------------------------------------------------- /.l10nignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | js/ 4 | vendor/ 5 | -------------------------------------------------------------------------------- /.nextcloudignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | /.eslintrc.js 4 | /.git 5 | /.github 6 | /.gitignore 7 | /.nextcloudignore 8 | /Makefile 9 | /babel.config.js 10 | /composer.json 11 | /composer.lock 12 | /krankerl.toml 13 | /package-lock.json 14 | /package.json 15 | /src/ 16 | /tests 17 | /vendor-bin 18 | /node_modules 19 | /phpunit.xml 20 | /phpunit.integration.xml 21 | /psalm.xml 22 | /screenshots 23 | /stylelint.config.js 24 | /webpack.config.js 25 | /.php-cs-fixer.dist.php 26 | /.gitattributes 27 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | getFinder() 17 | ->notPath('build') 18 | ->notPath('l10n') 19 | ->notPath('src') 20 | ->notPath('vendor') 21 | ->notPath('node_modules') 22 | ->in(__DIR__); 23 | return $config; 24 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk 4 | 5 | [o:nextcloud:p:nextcloud:r:user_migration] 6 | file_filter = translationfiles//user_migration.po 7 | source_file = translationfiles/templates/user_migration.pot 8 | source_lang = en 9 | type = PO 10 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | 5 | # Authors 6 | 7 | - Andy Scherzinger 8 | - Carl Schwan 9 | - Christopher Ng 10 | - Côme Chilliet 11 | - Joas Schilling 12 | - John Molakvoæ 13 | - Louis <6653109+artonge@users.noreply.github.com> 14 | - Pytal <24800714+Pytal@users.noreply.github.com> 15 | - Roeland Jago Douma 16 | - Vincent Petry 17 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 5 | # Changelog 6 | 7 | All notable changes to this project will be documented in this file. 8 | 9 | The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) 10 | and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 11 | 12 | ## [8.0.0-alpha.1] - 2025-01-09 13 | 14 | ### Changes 15 | 16 | * Nextcloud 31 compatibility 17 | * Dependency bumps 18 | 19 | ## [7.0.1] - 2024-08-22 20 | 21 | ### Changes 22 | 23 | * Fix failed release 24 | 25 | ## [7.0.0] - 2024-08-22 26 | 27 | ### Breaking 28 | 29 | * Drop support for Nextcloud 29 30 | 31 | ### Changes 32 | 33 | * Nextcloud 30 compatibility 34 | * Dependency bumps 35 | 36 | ## [6.0.0] - 2024-03-28 37 | 38 | ### Breaking 39 | 40 | * Drop support for Nextcloud 28 41 | 42 | ### Changes 43 | 44 | * Nextcloud 29 compatibility 45 | * Add unit tests https://github.com/nextcloud/user_migration/pull/250 46 | * Avoid crashes in Notifier when user or file is not found https://github.com/nextcloud/user_migration/pull/608 47 | * Fix hidden password confirmation dialog with new global search https://github.com/nextcloud/user_migration/pull/550 48 | * Dependency bumps 49 | 50 | ## [5.0.0] - 2023-12-01 51 | 52 | ### Breaking 53 | 54 | * Drop support for Nextcloud 27 55 | 56 | ### Changes 57 | 58 | * Nextcloud 28 compatibility 59 | * Remove deprecated ${var} syntax https://github.com/nextcloud/user_migration/pull/519 60 | * Fix hidden password confirmation dialog with new global search https://github.com/nextcloud/user_migration/pull/551 61 | * Various dependencies bump 62 | 63 | ## [4.0.1] - 2023-05-17 64 | 65 | ### Breaking 66 | 67 | * Drop support for Nextcloud 25 + 26 68 | 69 | ### Changes 70 | 71 | * Nextcloud 27 compatibility 72 | * Improved 32bit compatibility https://github.com/nextcloud/user_migration/pull/408 73 | * CLI command exports directly to final folder instead of a temporary folder https://github.com/nextcloud/user_migration/pull/402 74 | * Various dependencies bump 75 | 76 | ## [4.0.0] - 2023-05-16 77 | 78 | * Nextcloud 27 compatibility 79 | * Improved 32bit compatibility https://github.com/nextcloud/user_migration/pull/408 80 | * CLI command exports directly to final folder instead of a temporary folder https://github.com/nextcloud/user_migration/pull/402 81 | * Various dependencies bump 82 | 83 | ## [3.0.0] - 2023-03-03 84 | 85 | * Use file picker with filter from dialogs package https://github.com/nextcloud/user_migration/pull/369 86 | * Improve verbose output when an exception happens https://github.com/nextcloud/user_migration/pull/364 87 | * Apply node filter for comments and tags as well https://github.com/nextcloud/user_migration/pull/354 88 | * Fix type error in debug mode when an Exception is thrown https://github.com/nextcloud/user_migration/pull/353 89 | * Disable cancel button while cancelling https://github.com/nextcloud/user_migration/pull/358 90 | * Various dependencies bump 91 | -------------------------------------------------------------------------------- /LICENSES/BSD-2-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | -------------------------------------------------------------------------------- /LICENSES/BSD-3-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) . 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 10 | 11 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 12 | -------------------------------------------------------------------------------- /LICENSES/ISC.txt: -------------------------------------------------------------------------------- 1 | ISC License: 2 | 3 | Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") 4 | Copyright (c) 1995-2003 by Internet Software Consortium 5 | 6 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 9 | -------------------------------------------------------------------------------- /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 6 | associated documentation files (the "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the 9 | following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial 12 | portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 15 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 16 | EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 18 | USE OR OTHER DEALINGS IN THE SOFTWARE. 19 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | app_name=$(notdir $(CURDIR)) 4 | build_tools_directory=$(CURDIR)/build/tools 5 | composer=$(shell which composer 2> /dev/null) 6 | 7 | all: dev-setup lint build-js-production test 8 | 9 | # Dev env management 10 | dev-setup: clean clean-dev composer npm-init 11 | 12 | 13 | # Installs and updates the composer dependencies. If composer is not installed 14 | # a copy is fetched from the web 15 | composer: 16 | ifeq (, $(composer)) 17 | @echo "No composer command available, downloading a copy from the web" 18 | mkdir -p $(build_tools_directory) 19 | curl -sS https://getcomposer.org/installer | php 20 | mv composer.phar $(build_tools_directory) 21 | php $(build_tools_directory)/composer.phar install --prefer-dist 22 | php $(build_tools_directory)/composer.phar update --prefer-dist 23 | else 24 | composer install --prefer-dist 25 | composer update --prefer-dist 26 | endif 27 | 28 | npm-init: 29 | npm ci 30 | 31 | npm-update: 32 | npm update 33 | 34 | # Building 35 | build-js: 36 | npm run dev 37 | 38 | build-js-production: 39 | npm run build 40 | 41 | watch-js: 42 | npm run watch 43 | 44 | serve-js: 45 | npm run serve 46 | 47 | # Linting 48 | lint: 49 | npm run lint 50 | 51 | lint-fix: 52 | npm run lint:fix 53 | 54 | # Style linting 55 | stylelint: 56 | npm run stylelint 57 | 58 | stylelint-fix: 59 | npm run stylelint:fix 60 | 61 | # Cleaning 62 | clean: 63 | rm -rf js/* 64 | 65 | clean-dev: 66 | rm -rf node_modules 67 | 68 | # Tests 69 | test: 70 | ./vendor/phpunit/phpunit/phpunit -c phpunit.xml 71 | ./vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 5 | # Nextcloud User migration 6 | 7 | [![REUSE status](https://api.reuse.software/badge/github.com/nextcloud/user_migration)](https://api.reuse.software/info/github.com/nextcloud/user_migration) 8 | [![PHPUnit GitHub Action](https://github.com/nextcloud/user_migration/workflows/PHPUnit/badge.svg)](https://github.com/nextcloud/user_migration/actions?query=workflow%3APHPUnit) 9 | [![Node GitHub Action](https://github.com/nextcloud/user_migration/workflows/Node/badge.svg)](https://github.com/nextcloud/user_migration/actions?query=workflow%3ANode) 10 | [![Lint GitHub Action](https://github.com/nextcloud/user_migration/workflows/Lint/badge.svg)](https://github.com/nextcloud/user_migration/actions?query=workflow%3ALint) 11 | 12 | **👤➡ User migration app for Nextcloud** 13 | 14 | This app allows users to easily migrate from one instance to another using an export of their account. 15 | 16 | - **🐱 Log in to cat.example.com/nextcloud** 17 | - **⚙ Go into `Personal settings` > `Data migration`** 18 | - **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…) 19 | - **⚙ Start the export** and wait for the server to process it 20 | - **📁 Download the resulting file called `user.nextcloud_export`** 21 | - **🐶 Open an account on dog.example.com/nextcloud** 22 | - **🡅 Upload `user.nextcloud_export` into your files** 23 | - **⚙ Go into `Personal settings` > `Data migration` and start the import** 24 | - **🎉 Enjoy your stay on your new instance** and close you old account 25 | 26 | --- 27 | 28 | ## Screenshots 29 | 30 | ### Select what to export from your old instance 31 | ![Export data selection](screenshots/export.png) 32 | 33 | ### Export in progress 34 | ![Export in progress](screenshots/exporting.png) 35 | 36 | ### Import into your new instance 37 | ![Import file selection](screenshots/import.png) 38 | 39 | --- 40 | 41 | ## occ Commands 42 | 43 | The following [`occ`](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/occ_command.html) commands are available. For a full description of command usage please pass the `--help` flag. 44 | 45 | ### Export 46 | 47 | ``` 48 | occ user:export [options] [--] [ []] 49 | ``` 50 | 51 | ### Import 52 | 53 | ``` 54 | occ user:import [options] [--] 55 | ``` 56 | -------------------------------------------------------------------------------- /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 = "user_migration" 5 | SPDX-PackageSupplier = "Nextcloud " 6 | SPDX-PackageDownloadLocation = "https://github.com/nextcloud/user_migration" 7 | 8 | [[annotations]] 9 | path = ["l10n/**.js", "l10n/**.json"] 10 | precedence = "aggregate" 11 | SPDX-FileCopyrightText = "2022-2024 Nextcloud translators" 12 | SPDX-License-Identifier = "AGPL-3.0-or-later" 13 | 14 | [[annotations]] 15 | path = [".tx/config", "composer.json", "composer.lock", "package-lock.json", "package.json", "tests/psalm-baseline.xml"] 16 | precedence = "aggregate" 17 | SPDX-FileCopyrightText = "2022 Nextcloud GmbH and Nextcloud contributors" 18 | SPDX-License-Identifier = "AGPL-3.0-or-later" 19 | 20 | [[annotations]] 21 | path = ["vendor-bin/cs-fixer/composer.json", "vendor-bin/cs-fixer/composer.lock", "vendor-bin/phpunit/composer.json", "vendor-bin/phpunit/composer.lock", "vendor-bin/psalm/composer.json", "vendor-bin/psalm/composer.lock"] 22 | precedence = "aggregate" 23 | SPDX-FileCopyrightText = "2024 Nextcloud GmbH and Nextcloud contributors" 24 | SPDX-License-Identifier = "AGPL-3.0-or-later" 25 | 26 | [[annotations]] 27 | path = ["img/app.svg", "img/app-alternate.svg", "img/app-dark.svg"] 28 | precedence = "aggregate" 29 | SPDX-FileCopyrightText = "2018-2024 Google LLC" 30 | SPDX-License-Identifier = "Apache-2.0" 31 | -------------------------------------------------------------------------------- /appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 8 | user_migration 9 | User migration 10 | Migrate user data 11 | `Data migration`** 17 | - **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…) 18 | - **⚙ Start the export** and wait for the server to process it 19 | - **📁 Download the resulting file called `user.nextcloud_export`** 20 | - **🐶 Open an account on dog.example.com/nextcloud** 21 | - **🡅 Upload `user.nextcloud_export` into your files** 22 | - **⚙ Go into `Personal settings` > `Data migration` and start the import** 23 | - **🎉 Enjoy your stay on your new instance** and close you old account 24 | ]]> 25 | 9.0.0-dev.0 26 | agpl 27 | Côme Chilliet 28 | Christopher Ng 29 | UserMigration 30 | 31 | 32 | https://docs.nextcloud.com/server/latest/developer_manual/digging_deeper/user_migration.html 33 | 34 | 35 | tools 36 | 37 | https://github.com/nextcloud/user_migration/issues 38 | https://github.com/nextcloud/user_migration.git 39 | 40 | https://raw.githubusercontent.com/nextcloud/user_migration/main/screenshots/export.png 41 | https://raw.githubusercontent.com/nextcloud/user_migration/main/screenshots/exporting.png 42 | https://raw.githubusercontent.com/nextcloud/user_migration/main/screenshots/import.png 43 | 44 | 45 | 46 | 47 | 48 | 49 | OCA\UserMigration\Command\Export 50 | OCA\UserMigration\Command\Import 51 | 52 | 53 | 54 | OCA\UserMigration\Settings\Personal\Settings 55 | OCA\UserMigration\Settings\Personal\Section 56 | 57 | 58 | -------------------------------------------------------------------------------- /appinfo/routes.php: -------------------------------------------------------------------------------- 1 | '1', 12 | ]; 13 | 14 | return [ 15 | 'ocs' => [ 16 | ['name' => 'Api#migrators', 'url' => '/api/v{apiVersion}/migrators', 'verb' => 'GET', 'requirements' => $requirements], 17 | ['name' => 'Api#status', 'url' => '/api/v{apiVersion}/status', 'verb' => 'GET', 'requirements' => $requirements], 18 | ['name' => 'Api#cancel', 'url' => '/api/v{apiVersion}/cancel', 'verb' => 'PUT', 'requirements' => $requirements], 19 | ['name' => 'Api#exportable', 'url' => '/api/v{apiVersion}/export', 'verb' => 'GET', 'requirements' => $requirements], 20 | ['name' => 'Api#export', 'url' => '/api/v{apiVersion}/export', 'verb' => 'POST', 'requirements' => $requirements], 21 | ['name' => 'Api#import', 'url' => '/api/v{apiVersion}/import', 'verb' => 'POST', 'requirements' => $requirements], 22 | ], 23 | ]; 24 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const babelConfig = require('@nextcloud/babel-config') 7 | 8 | module.exports = babelConfig 9 | -------------------------------------------------------------------------------- /build-js/npm-post-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 4 | # SPDX-License-Identifier: AGPL-3.0-or-later 5 | 6 | set -e 7 | 8 | # Add licenses for source maps 9 | if [ -d "js" ]; then 10 | for f in js/*.js; do 11 | # If license file and source map exists copy license for the source map 12 | if [ -f "$f.license" ] && [ -f "$f.map" ]; then 13 | # Remove existing link 14 | [ -e "$f.map.license" ] || [ -L "$f.map.license" ] && rm "$f.map.license" 15 | # Create a new link 16 | ln -s "$(basename "$f.license")" "$f.map.license" 17 | fi 18 | done 19 | echo "Copying licenses for sourcemaps done" 20 | else 21 | echo "This script needs to be executed from the root of the repository" 22 | exit 1 23 | fi 24 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoload-dev": { 3 | "psr-4": { 4 | "OCP\\": "vendor/nextcloud/ocp/OCP", 5 | "OCA\\UserMigration\\": "lib/" 6 | } 7 | }, 8 | "scripts": { 9 | "post-install-cmd": [ 10 | "[ $COMPOSER_DEV_MODE -eq 0 ] || composer bin all install --ansi" 11 | ], 12 | "post-update-cmd": [ 13 | "[ $COMPOSER_DEV_MODE -eq 0 ] || composer bin all update --ansi" 14 | ], 15 | "cs:fix": "php-cs-fixer fix", 16 | "cs:check": "php-cs-fixer fix --dry-run --diff", 17 | "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './build/*' -not -path './node_modules/*' -print0 | xargs -0 -n1 php -l", 18 | "psalm": "psalm", 19 | "psalm:fix": "psalm --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType", 20 | "psalm:update-baseline": "psalm --threads=1 --update-baseline", 21 | "test:unit": "vendor/bin/phpunit -c tests/phpunit.xml", 22 | "test:integration": "vendor/bin/phpunit -c tests/phpunit.integration.xml" 23 | }, 24 | "config": { 25 | "optimize-autoloader": true, 26 | "classmap-authoritative": true, 27 | "platform": { 28 | "php": "8.1" 29 | }, 30 | "allow-plugins": { 31 | "bamarni/composer-bin-plugin": true 32 | } 33 | }, 34 | "require-dev": { 35 | "doctrine/dbal": "^3", 36 | "deepdiver/zipstreamer": "^2.0", 37 | "nextcloud/ocp": "dev-master", 38 | "bamarni/composer-bin-plugin": "^1.8" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /img/app-alternate.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /img/app-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /img/app.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js: -------------------------------------------------------------------------------- 1 | "use strict";(self.webpackChunkuser_migration=self.webpackChunkuser_migration||[]).push([["node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs"],{9279:(t,e,a)=>{a.r(e),a.d(e,{default:()=>b});var i=a(5471),n=a(9097),l=a(1777),s=a(4246),o=(a(7012),a(4219)),r=a(83),u=a(2182),c=a(3095);const m=(0,n.c0)("public").build(),p=(0,i.pM)({name:"PublicAuthPrompt",components:{NcDialog:o.A,NcNoteCard:r.A,NcTextField:u.A},props:{nickname:{type:String,default:""},title:{type:String,default:(0,c.t)("Guest identification")},text:{type:String,default:""},notice:{type:String,default:(0,c.t)("You are currently not identified.")},submitLabel:{type:String,default:(0,c.t)("Submit name")},cancellable:{type:Boolean,default:!1}},setup:()=>({t:c.t}),emits:["close"],data:()=>({name:""}),computed:{dialogButtons(){const t={label:(0,c.t)("Cancel"),variant:"tertiary",callback:()=>this.$emit("close")},e={label:this.submitLabel,type:"submit",variant:"primary"};return this.cancellable?[t,e]:[e]}},watch:{nickname:{handler(){this.name=this.nickname},immediate:!0}},methods:{onSubmit(){const t=this.$refs.input,e=this.name.trim();if(""===e)return t.setCustomValidity((0,c.t)("You cannot leave the name empty.")),t.reportValidity(),void t.focus();if(e.length<2)return t.setCustomValidity((0,c.t)("Please enter a name with at least 2 characters.")),t.reportValidity(),void t.focus();try{(0,l.L$)(e)}catch(e){return(0,s.Qg)((0,c.t)("Failed to set nickname.")),console.error("Failed to set nickname",e),void t.focus()}m.setItem("public-auth-prompt-shown","true"),this.$emit("close",this.name)}}});var d=function(){var t=this,e=t._self._c;return t._self._setupProxy,e("NcDialog",{staticClass:"public-auth-prompt",attrs:{buttons:t.dialogButtons,"data-cy-public-auth-prompt-dialog":"","is-form":"","no-close":"",name:t.title},on:{submit:t.onSubmit}},[t.text?e("p",{staticClass:"public-auth-prompt__text"},[t._v(" "+t._s(t.text)+" ")]):t._e(),e("NcNoteCard",{staticClass:"public-auth-prompt__header",attrs:{text:t.notice,type:"info"}}),e("NcTextField",{ref:"input",staticClass:"public-auth-prompt__input",attrs:{"data-cy-public-auth-prompt-dialog-name":"",label:t.t("Name"),placeholder:t.t("Enter your name"),required:!t.cancellable,minlength:"2",name:"name"},model:{value:t.name,callback:function(e){t.name=e},expression:"name"}})],1)},h=[];const b=(0,c.n)(p,d,h,!1,null,"4158d556").exports},2182:(t,e,a)=>{a.d(e,{A:()=>i.N});var i=a(9890)}}]); 2 | //# sourceMappingURL=user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.map?v=d830115af6b6b8d00ef2 -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-License-Identifier: ISC 3 | SPDX-License-Identifier: GPL-3.0-or-later 4 | SPDX-License-Identifier: AGPL-3.0-or-later 5 | SPDX-License-Identifier: (MPL-2.0 OR Apache-2.0) 6 | SPDX-FileCopyrightText: escape-html developers 7 | SPDX-FileCopyrightText: Varun A P 8 | SPDX-FileCopyrightText: Tobias Koppers @sokra 9 | SPDX-FileCopyrightText: Roman Shtylman 10 | SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors 11 | SPDX-FileCopyrightText: John Molakvoæ (skjnldsv) 12 | SPDX-FileCopyrightText: James Halliday 13 | SPDX-FileCopyrightText: Guillaume Chau 14 | SPDX-FileCopyrightText: GitHub Inc. 15 | SPDX-FileCopyrightText: Evan You 16 | SPDX-FileCopyrightText: Dr.-Ing. Mario Heiderich, Cure53 (https://cure53.de/) 17 | SPDX-FileCopyrightText: David Clark 18 | SPDX-FileCopyrightText: Christoph Wurst 19 | SPDX-FileCopyrightText: Anthony Fu 20 | SPDX-FileCopyrightText: @nextcloud/dialogs developers 21 | 22 | 23 | This file is generated from multiple sources. Included packages: 24 | - @nextcloud/auth 25 | - version: 2.5.1 26 | - license: GPL-3.0-or-later 27 | - @nextcloud/browser-storage 28 | - version: 0.4.0 29 | - license: GPL-3.0-or-later 30 | - @nextcloud/dialogs 31 | - version: 6.3.0 32 | - license: AGPL-3.0-or-later 33 | - semver 34 | - version: 7.7.1 35 | - license: ISC 36 | - @nextcloud/event-bus 37 | - version: 3.3.2 38 | - license: GPL-3.0-or-later 39 | - @nextcloud/l10n 40 | - version: 3.2.0 41 | - license: GPL-3.0-or-later 42 | - @nextcloud/router 43 | - version: 3.0.1 44 | - license: GPL-3.0-or-later 45 | - @nextcloud/vue 46 | - version: 8.26.1 47 | - license: AGPL-3.0-or-later 48 | - @vueuse/core 49 | - version: 11.0.3 50 | - license: MIT 51 | - @vueuse/shared 52 | - version: 11.0.3 53 | - license: MIT 54 | - css-loader 55 | - version: 7.1.2 56 | - license: MIT 57 | - dompurify 58 | - version: 3.2.4 59 | - license: (MPL-2.0 OR Apache-2.0) 60 | - escape-html 61 | - version: 1.0.3 62 | - license: MIT 63 | - floating-vue 64 | - version: 1.0.0-beta.19 65 | - license: MIT 66 | - focus-trap 67 | - version: 7.5.2 68 | - license: MIT 69 | - path-browserify 70 | - version: 1.0.1 71 | - license: MIT 72 | - process 73 | - version: 0.11.10 74 | - license: MIT 75 | - style-loader 76 | - version: 4.0.0 77 | - license: MIT 78 | - tabbable 79 | - version: 6.2.0 80 | - license: MIT 81 | - toastify-js 82 | - version: 1.12.0 83 | - license: MIT 84 | - vue 85 | - version: 2.7.16 86 | - license: MIT 87 | -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.map.license: -------------------------------------------------------------------------------- 1 | user_migration-node_modules_nextcloud_dialogs_dist_chunks_PublicAuthPrompt-D1BKEbm6_mjs.js.license -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js: -------------------------------------------------------------------------------- 1 | "use strict";(self.webpackChunkuser_migration=self.webpackChunkuser_migration||[]).push([["node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs"],{640:(e,s,_)=>{_.d(s,{FilePickerVue:()=>i});const i=(0,_(5471).$V)((()=>_.e("vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs").then(_.bind(_,3158))))}}]); 2 | //# sourceMappingURL=user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.map?v=a1117ab57b1f9e189604 -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | SPDX-FileCopyrightText: Evan You 4 | SPDX-FileCopyrightText: @nextcloud/dialogs developers 5 | 6 | 7 | This file is generated from multiple sources. Included packages: 8 | - @nextcloud/dialogs 9 | - version: 6.3.0 10 | - license: AGPL-3.0-or-later 11 | - vue 12 | - version: 2.7.16 13 | - license: MIT 14 | -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js?v=a1117ab57b1f9e189604","mappings":"uMACA,MAAMA,GAAgB,E,QAAA,KAAqB,IAAM,wG","sources":["webpack:///user_migration/node_modules/@nextcloud/dialogs/dist/chunks/index-BC-7VPxC.mjs"],"sourcesContent":["import { defineAsyncComponent } from \"vue\";\nconst FilePickerVue = defineAsyncComponent(() => import(\"./FilePicker-CsU6FfAP.mjs\"));\nexport {\n FilePickerVue\n};\n//# sourceMappingURL=index-BC-7VPxC.mjs.map\n"],"names":["FilePickerVue"],"sourceRoot":""} -------------------------------------------------------------------------------- /js/user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.map.license: -------------------------------------------------------------------------------- 1 | user_migration-node_modules_nextcloud_dialogs_dist_chunks_index-BC-7VPxC_mjs.js.license -------------------------------------------------------------------------------- /js/user_migration-personal-settings.js.map.license: -------------------------------------------------------------------------------- 1 | user_migration-personal-settings.js.license -------------------------------------------------------------------------------- /js/user_migration-vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs.js.map.license: -------------------------------------------------------------------------------- 1 | user_migration-vendors-node_modules_nextcloud_dialogs_dist_chunks_FilePicker-CsU6FfAP_mjs.js.license -------------------------------------------------------------------------------- /js/user_migration-vendors-node_modules_rehype-highlight_index_js.js.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: MIT 2 | SPDX-License-Identifier: BSD-3-Clause 3 | SPDX-FileCopyrightText: Titus Wormer (https://wooorm.com) 4 | SPDX-FileCopyrightText: Josh Goebel 5 | 6 | 7 | This file is generated from multiple sources. Included packages: 8 | - devlop 9 | - version: 1.1.0 10 | - license: MIT 11 | - hast-util-is-element 12 | - version: 3.0.0 13 | - license: MIT 14 | - hast-util-to-text 15 | - version: 4.0.2 16 | - license: MIT 17 | - highlight.js 18 | - version: 11.11.1 19 | - license: BSD-3-Clause 20 | - lowlight 21 | - version: 3.3.0 22 | - license: MIT 23 | - rehype-highlight 24 | - version: 7.0.2 25 | - license: MIT 26 | - unist-util-find-after 27 | - version: 5.0.0 28 | - license: MIT 29 | - unist-util-is 30 | - version: 6.0.0 31 | - license: MIT 32 | - unist-util-visit-parents 33 | - version: 6.0.1 34 | - license: MIT 35 | - unist-util-visit 36 | - version: 5.0.0 37 | - license: MIT 38 | -------------------------------------------------------------------------------- /js/user_migration-vendors-node_modules_rehype-highlight_index_js.js.map.license: -------------------------------------------------------------------------------- 1 | user_migration-vendors-node_modules_rehype-highlight_index_js.js.license -------------------------------------------------------------------------------- /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/user_migration/89cc6196c0b9506c46f8339bb0c4adb74b2a9bc0/l10n/.gitkeep -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : " Lêers", 5 | "Export" : "Voer uit", 6 | "Cancel" : "Kanselleer", 7 | "Close" : "Sluit", 8 | "Import" : "Voer In" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : " Lêers", 3 | "Export" : "Voer uit", 4 | "Cancel" : "Kanselleer", 5 | "Close" : "Sluit", 6 | "Import" : "Voer In" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/an.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Cancel" : "Cancelar", 6 | "Close" : "Zarrar" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/an.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Cancel" : "Cancelar", 4 | "Close" : "Zarrar" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/ast.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Ficheros", 5 | "%s (missing)" : "%s (falta)", 6 | "Data migration" : "Migración de los datos", 7 | "Export queued" : "La esportación púnxose na cola", 8 | "Export in progress…" : "Esportación en cursu…", 9 | "You will be notified when your export has completed. This may take a while." : "Avisámoste cuando se complete la importación. Esta aición pue tardar un tiempu.", 10 | "This may take a while." : "Esta aición pue tardar un tiempu", 11 | "Please do not use your account while exporting." : "Nun uses la cuenta mentanto s'importa", 12 | "Export" : "Esportar", 13 | "Please select the data you want to export" : "Seleiciona los datos que quies esportar", 14 | "User information and settings" : "Información y configuración d'usuariu", 15 | "Show export status" : "Amosar l'estáu de la importación", 16 | "Show status" : "Amosar l'estáu", 17 | "Cancel" : "Encaboxar", 18 | "Estimated size: {estimatedSizeWithUnits}" : "Tamañu estimáu: {estimatedSizeWithUnits}", 19 | "Close export status" : "Zarrar l'estáu de la importación", 20 | "Close" : "Zarrar", 21 | "Import queued" : "La importación púnxose na cola", 22 | "Import in progress…" : "Importación en cursu…", 23 | "Import completed successfully" : "La importación completóse correutamente", 24 | "Please do not use your account while importing." : "Nun uses la cuenta mentanto s'importa.", 25 | "Import" : "Importar", 26 | "Show import status" : "Amosar l'estáu de la importación", 27 | "Close import status" : "Zarrar l'estáu de la importación" 28 | }, 29 | "nplurals=2; plural=(n != 1);"); 30 | -------------------------------------------------------------------------------- /l10n/ast.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Ficheros", 3 | "%s (missing)" : "%s (falta)", 4 | "Data migration" : "Migración de los datos", 5 | "Export queued" : "La esportación púnxose na cola", 6 | "Export in progress…" : "Esportación en cursu…", 7 | "You will be notified when your export has completed. This may take a while." : "Avisámoste cuando se complete la importación. Esta aición pue tardar un tiempu.", 8 | "This may take a while." : "Esta aición pue tardar un tiempu", 9 | "Please do not use your account while exporting." : "Nun uses la cuenta mentanto s'importa", 10 | "Export" : "Esportar", 11 | "Please select the data you want to export" : "Seleiciona los datos que quies esportar", 12 | "User information and settings" : "Información y configuración d'usuariu", 13 | "Show export status" : "Amosar l'estáu de la importación", 14 | "Show status" : "Amosar l'estáu", 15 | "Cancel" : "Encaboxar", 16 | "Estimated size: {estimatedSizeWithUnits}" : "Tamañu estimáu: {estimatedSizeWithUnits}", 17 | "Close export status" : "Zarrar l'estáu de la importación", 18 | "Close" : "Zarrar", 19 | "Import queued" : "La importación púnxose na cola", 20 | "Import in progress…" : "Importación en cursu…", 21 | "Import completed successfully" : "La importación completóse correutamente", 22 | "Please do not use your account while importing." : "Nun uses la cuenta mentanto s'importa.", 23 | "Import" : "Importar", 24 | "Show import status" : "Amosar l'estáu de la importación", 25 | "Close import status" : "Zarrar l'estáu de la importación" 26 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 27 | } -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fayllar", 5 | "Export" : "Çıxarış", 6 | "Cancel" : "Dayandır", 7 | "Close" : "Bağla", 8 | "Import" : "Əlavə et" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fayllar", 3 | "Export" : "Çıxarış", 4 | "Cancel" : "Dayandır", 5 | "Close" : "Bağla", 6 | "Import" : "Əlavə et" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/bn_BD.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ফাইল", 5 | "Export" : "রপ্তানি", 6 | "Cancel" : "বাতির", 7 | "Close" : "বন্ধ", 8 | "Import" : "আমদানি" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/bn_BD.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ফাইল", 3 | "Export" : "রপ্তানি", 4 | "Cancel" : "বাতির", 5 | "Close" : "বন্ধ", 6 | "Import" : "আমদানি" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/br.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Restroù", 5 | "Cancel" : "Nullañ", 6 | "Close" : "Seriñ", 7 | "Import" : "Emporzhiañ " 8 | }, 9 | "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);"); 10 | -------------------------------------------------------------------------------- /l10n/br.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Restroù", 3 | "Cancel" : "Nullañ", 4 | "Close" : "Seriñ", 5 | "Import" : "Emporzhiañ " 6 | },"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);" 7 | } -------------------------------------------------------------------------------- /l10n/bs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Datoteke", 5 | "Export" : "Izvezi", 6 | "Cancel" : "Otkaži", 7 | "Close" : "Zatvori", 8 | "Import" : "Uvoz" 9 | }, 10 | "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/bs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Datoteke", 3 | "Export" : "Izvezi", 4 | "Cancel" : "Otkaži", 5 | "Close" : "Zatvori", 6 | "Import" : "Uvoz" 7 | },"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);" 8 | } -------------------------------------------------------------------------------- /l10n/ca.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fitxers", 5 | "Data migration" : "Migració de dades", 6 | "Export" : "Exporta", 7 | "Cancel" : "Cancel·la", 8 | "Close" : "Tanca", 9 | "Import" : "Importa" 10 | }, 11 | "nplurals=2; plural=(n != 1);"); 12 | -------------------------------------------------------------------------------- /l10n/ca.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fitxers", 3 | "Data migration" : "Migració de dades", 4 | "Export" : "Exporta", 5 | "Cancel" : "Cancel·la", 6 | "Close" : "Tanca", 7 | "Import" : "Importa" 8 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 9 | } -------------------------------------------------------------------------------- /l10n/cy_GB.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Ffeiliau", 5 | "Export" : "Allforio", 6 | "Cancel" : "Diddymu", 7 | "Close" : "Cau", 8 | "Import" : "Mewnforio" 9 | }, 10 | "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); 11 | -------------------------------------------------------------------------------- /l10n/cy_GB.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Ffeiliau", 3 | "Export" : "Allforio", 4 | "Cancel" : "Diddymu", 5 | "Close" : "Cau", 6 | "Import" : "Mewnforio" 7 | },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" 8 | } -------------------------------------------------------------------------------- /l10n/da.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Filer", 5 | "Export" : "Eksporter", 6 | "Cancel" : "Annuller", 7 | "Close" : "Luk", 8 | "Import" : "Importer" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/da.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Filer", 3 | "Export" : "Eksporter", 4 | "Cancel" : "Annuller", 5 | "Close" : "Luk", 6 | "Import" : "Importer" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/eo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Dosieroj", 5 | "Export" : "Eksporti", 6 | "Cancel" : "Nuligi", 7 | "Close" : "Malfermi", 8 | "Import" : "Importi" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/eo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Dosieroj", 3 | "Export" : "Eksporti", 4 | "Cancel" : "Nuligi", 5 | "Close" : "Malfermi", 6 | "Import" : "Importi" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/es_419.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_419.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_AR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_AR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 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 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_CL.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_CO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_CO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_CR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_CR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_DO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_DO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_GT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_GT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_HN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_HN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_MX.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_MX.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_NI.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_NI.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_PA.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_PA.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_PE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_PE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_PR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_PR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_PY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_PY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_SV.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_SV.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/es_UY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archivos", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Cerrar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/es_UY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archivos", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Cerrar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/et_EE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Failid", 5 | "Export" : "Ekspordi", 6 | "Cancel" : "Loobu", 7 | "Close" : "Sulge", 8 | "Import" : "Impordi" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/et_EE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Failid", 3 | "Export" : "Ekspordi", 4 | "Cancel" : "Loobu", 5 | "Close" : "Sulge", 6 | "Import" : "Impordi" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/eu.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fitxategiak", 5 | "User migration" : "Erabiltzaileen migrazioa", 6 | "User export failed" : "Erabiltzailearen esportazioak huts egin du", 7 | "User export done" : "Erabiltzailea ongi esportatu da", 8 | "User import failed" : "Erabiltzailearen inportazioak huts egin du", 9 | "User import done" : "Erabiltzailea ongi inportatu da", 10 | "%s (missing)" : "%s (faltan)", 11 | "Data migration" : "Datu migrazioa", 12 | "Migrate user data" : "Migratu erabiltzailearen datuak", 13 | "Export queued" : "Esportazioa ilaran jarri da", 14 | "Export in progress…" : "Esportatzen...", 15 | "Export completed successfully" : "Esportazioa ongi bukatu da", 16 | "This may take a while." : "Honek luze jo dezake.", 17 | "Export" : "Esportatu", 18 | "Please select the data you want to export" : "Mesedez hautatu esportatu nahi dituzun datuak", 19 | "User information and settings" : "Erabiltzailearen informazioa eta ezarpenak", 20 | "Show export status" : "Erakutsi esportazioaren egoera", 21 | "Show status" : "Erakutsi egoera", 22 | "Cancel export" : "Utzi esportazioa", 23 | "Cancel" : "Utzi", 24 | "Export your data" : "Esportatu zure datuak", 25 | "Close export status" : "Itxi esportazioaren egoera", 26 | "Close" : "Itxi", 27 | "Choose a file to import" : "Aukeratu inportatzeko fitxategia", 28 | "Import queued" : "Inportatu ilara", 29 | "Import in progress…" : "Inportatzen...", 30 | "Import completed successfully" : "Inportazioa ongi bukatu da", 31 | "Import" : "Inportatu", 32 | "Show import status" : "Erakutsi inportazioaren egoera", 33 | "Cancel import" : "Utzi inportazioa", 34 | "Import your data" : "Inportatu zure datuak", 35 | "Close import status" : "Itxi inportazioaren egoera" 36 | }, 37 | "nplurals=2; plural=(n != 1);"); 38 | -------------------------------------------------------------------------------- /l10n/eu.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fitxategiak", 3 | "User migration" : "Erabiltzaileen migrazioa", 4 | "User export failed" : "Erabiltzailearen esportazioak huts egin du", 5 | "User export done" : "Erabiltzailea ongi esportatu da", 6 | "User import failed" : "Erabiltzailearen inportazioak huts egin du", 7 | "User import done" : "Erabiltzailea ongi inportatu da", 8 | "%s (missing)" : "%s (faltan)", 9 | "Data migration" : "Datu migrazioa", 10 | "Migrate user data" : "Migratu erabiltzailearen datuak", 11 | "Export queued" : "Esportazioa ilaran jarri da", 12 | "Export in progress…" : "Esportatzen...", 13 | "Export completed successfully" : "Esportazioa ongi bukatu da", 14 | "This may take a while." : "Honek luze jo dezake.", 15 | "Export" : "Esportatu", 16 | "Please select the data you want to export" : "Mesedez hautatu esportatu nahi dituzun datuak", 17 | "User information and settings" : "Erabiltzailearen informazioa eta ezarpenak", 18 | "Show export status" : "Erakutsi esportazioaren egoera", 19 | "Show status" : "Erakutsi egoera", 20 | "Cancel export" : "Utzi esportazioa", 21 | "Cancel" : "Utzi", 22 | "Export your data" : "Esportatu zure datuak", 23 | "Close export status" : "Itxi esportazioaren egoera", 24 | "Close" : "Itxi", 25 | "Choose a file to import" : "Aukeratu inportatzeko fitxategia", 26 | "Import queued" : "Inportatu ilara", 27 | "Import in progress…" : "Inportatzen...", 28 | "Import completed successfully" : "Inportazioa ongi bukatu da", 29 | "Import" : "Inportatu", 30 | "Show import status" : "Erakutsi inportazioaren egoera", 31 | "Cancel import" : "Utzi inportazioa", 32 | "Import your data" : "Inportatu zure datuak", 33 | "Close import status" : "Itxi inportazioaren egoera" 34 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 35 | } -------------------------------------------------------------------------------- /l10n/fa.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "پوشه‌ها", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)", 6 | "User migration" : "User migration", 7 | "User export failed" : "User export failed", 8 | "Your export of {user} failed." : "Your export of {user} failed.", 9 | "User export done" : "User export done", 10 | "Your export of {user} has completed: {file}" : "Your export of {user} has completed: {file}", 11 | "User import failed" : "User import failed", 12 | "Your import to {user} failed." : "Your import to {user} failed.", 13 | "User import done" : "User import done", 14 | "Your import of {file} into {user} has completed." : "Your import of {file} into {user} has completed.", 15 | "Data migration" : "Data migration", 16 | "Migrate user data" : "Migrate user data", 17 | "Export queued" : "Export queued", 18 | "Export in progress…" : "Export in progress…", 19 | "Export completed successfully" : "Export completed successfully", 20 | "You will be notified when your export has completed. This may take a while." : "You will be notified when your export has completed. This may take a while.", 21 | "This may take a while." : "This may take a while.", 22 | "Please do not use your account while exporting." : "Please do not use your account while exporting.", 23 | "Export" : "دریافت خروجی", 24 | "Please select the data you want to export" : "Please select the data you want to export", 25 | "User information and settings" : "User information and settings", 26 | "Basic user information including user ID and display name as well as your settings" : "Basic user information including user ID and display name as well as your settings", 27 | "Show export status" : "Show export status", 28 | "Show status" : "Show status", 29 | "Cancel export" : "Cancel export", 30 | "Cancel" : "لغو", 31 | "Export your data" : "Export your data", 32 | "Estimated size: {estimatedSizeWithUnits}" : "Estimated size: {estimatedSizeWithUnits}", 33 | "Close export status" : "Close export status", 34 | "Close" : "بسته", 35 | "Choose a file to import" : "Choose a file to import", 36 | "Import queued" : "Import queued", 37 | "Import in progress…" : "Import in progress…", 38 | "Import completed successfully" : "Import completed successfully", 39 | "You will be notified when your import has completed. This may take a while." : "You will be notified when your import has completed. This may take a while.", 40 | "Please do not use your account while importing." : "Please do not use your account while importing.", 41 | "Import" : "وارد کردن", 42 | "Please note that existing data may be overwritten" : "Please note that existing data may be overwritten", 43 | "Show import status" : "Show import status", 44 | "Cancel import" : "Cancel import", 45 | "Import your data" : "Import your data", 46 | "Close import status" : "Close import status" 47 | }, 48 | "nplurals=2; plural=(n > 1);"); 49 | -------------------------------------------------------------------------------- /l10n/fa.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "پوشه‌ها", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)", 4 | "User migration" : "User migration", 5 | "User export failed" : "User export failed", 6 | "Your export of {user} failed." : "Your export of {user} failed.", 7 | "User export done" : "User export done", 8 | "Your export of {user} has completed: {file}" : "Your export of {user} has completed: {file}", 9 | "User import failed" : "User import failed", 10 | "Your import to {user} failed." : "Your import to {user} failed.", 11 | "User import done" : "User import done", 12 | "Your import of {file} into {user} has completed." : "Your import of {file} into {user} has completed.", 13 | "Data migration" : "Data migration", 14 | "Migrate user data" : "Migrate user data", 15 | "Export queued" : "Export queued", 16 | "Export in progress…" : "Export in progress…", 17 | "Export completed successfully" : "Export completed successfully", 18 | "You will be notified when your export has completed. This may take a while." : "You will be notified when your export has completed. This may take a while.", 19 | "This may take a while." : "This may take a while.", 20 | "Please do not use your account while exporting." : "Please do not use your account while exporting.", 21 | "Export" : "دریافت خروجی", 22 | "Please select the data you want to export" : "Please select the data you want to export", 23 | "User information and settings" : "User information and settings", 24 | "Basic user information including user ID and display name as well as your settings" : "Basic user information including user ID and display name as well as your settings", 25 | "Show export status" : "Show export status", 26 | "Show status" : "Show status", 27 | "Cancel export" : "Cancel export", 28 | "Cancel" : "لغو", 29 | "Export your data" : "Export your data", 30 | "Estimated size: {estimatedSizeWithUnits}" : "Estimated size: {estimatedSizeWithUnits}", 31 | "Close export status" : "Close export status", 32 | "Close" : "بسته", 33 | "Choose a file to import" : "Choose a file to import", 34 | "Import queued" : "Import queued", 35 | "Import in progress…" : "Import in progress…", 36 | "Import completed successfully" : "Import completed successfully", 37 | "You will be notified when your import has completed. This may take a while." : "You will be notified when your import has completed. This may take a while.", 38 | "Please do not use your account while importing." : "Please do not use your account while importing.", 39 | "Import" : "وارد کردن", 40 | "Please note that existing data may be overwritten" : "Please note that existing data may be overwritten", 41 | "Show import status" : "Show import status", 42 | "Cancel import" : "Cancel import", 43 | "Import your data" : "Import your data", 44 | "Close import status" : "Close import status" 45 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 46 | } -------------------------------------------------------------------------------- /l10n/fi.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Tiedostot", 5 | "Data migration" : "Tietojen migraatio", 6 | "Export" : "Vie", 7 | "Cancel" : "Peruuta", 8 | "Close" : "Sulje", 9 | "Import" : "Tuo" 10 | }, 11 | "nplurals=2; plural=(n != 1);"); 12 | -------------------------------------------------------------------------------- /l10n/fi.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Tiedostot", 3 | "Data migration" : "Tietojen migraatio", 4 | "Export" : "Vie", 5 | "Cancel" : "Peruuta", 6 | "Close" : "Sulje", 7 | "Import" : "Tuo" 8 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 9 | } -------------------------------------------------------------------------------- /l10n/gd.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Faidhlichean", 5 | "Cancel" : "Sguir dheth", 6 | "Close" : "Dùin" 7 | }, 8 | "nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"); 9 | -------------------------------------------------------------------------------- /l10n/gd.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Faidhlichean", 3 | "Cancel" : "Sguir dheth", 4 | "Close" : "Dùin" 5 | },"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;" 6 | } -------------------------------------------------------------------------------- /l10n/he.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "קבצים", 5 | "Data migration" : "הגירת נתונים", 6 | "Export" : "ייצוא", 7 | "Cancel" : "ביטול", 8 | "Close" : "סגירה", 9 | "Import" : "ייבוא" 10 | }, 11 | "nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;"); 12 | -------------------------------------------------------------------------------- /l10n/he.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "קבצים", 3 | "Data migration" : "הגירת נתונים", 4 | "Export" : "ייצוא", 5 | "Cancel" : "ביטול", 6 | "Close" : "סגירה", 7 | "Import" : "ייבוא" 8 | },"pluralForm" :"nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;" 9 | } -------------------------------------------------------------------------------- /l10n/hr.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Datoteke", 5 | "Data migration" : "Migracija podataka", 6 | "Export" : "Izvoz", 7 | "Cancel" : "Odustani", 8 | "Close" : "Zatvori", 9 | "Import" : "Uvezi" 10 | }, 11 | "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); 12 | -------------------------------------------------------------------------------- /l10n/hr.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Datoteke", 3 | "Data migration" : "Migracija podataka", 4 | "Export" : "Izvoz", 5 | "Cancel" : "Odustani", 6 | "Close" : "Zatvori", 7 | "Import" : "Uvezi" 8 | },"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;" 9 | } -------------------------------------------------------------------------------- /l10n/hy.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Ֆայլեր", 5 | "Export" : "Արտահանում", 6 | "Cancel" : "ընդհատել", 7 | "Close" : "Փակել", 8 | "Import" : "Ներմուծում" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/hy.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Ֆայլեր", 3 | "Export" : "Արտահանում", 4 | "Cancel" : "ընդհատել", 5 | "Close" : "Փակել", 6 | "Import" : "Ներմուծում" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Files", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancellar", 7 | "Close" : "Clauder", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Files", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancellar", 5 | "Close" : "Clauder", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/id.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Berkas", 5 | "Export" : "Ekspor", 6 | "Cancel" : "Membatalkan", 7 | "Close" : "Tutup", 8 | "Import" : "Impor" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/id.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Berkas", 3 | "Export" : "Ekspor", 4 | "Cancel" : "Membatalkan", 5 | "Close" : "Tutup", 6 | "Import" : "Impor" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/is.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Skrár", 5 | "Export" : "Flytja út", 6 | "Cancel" : "Hætta við", 7 | "Close" : "Loka", 8 | "Import" : "Flytja inn" 9 | }, 10 | "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); 11 | -------------------------------------------------------------------------------- /l10n/is.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Skrár", 3 | "Export" : "Flytja út", 4 | "Cancel" : "Hætta við", 5 | "Close" : "Loka", 6 | "Import" : "Flytja inn" 7 | },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" 8 | } -------------------------------------------------------------------------------- /l10n/it.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "File", 5 | "Data migration" : "Migrazione dei dati", 6 | "Export" : "Esporta", 7 | "Cancel" : "Annulla", 8 | "Close" : "Chiudi", 9 | "Import" : "Importa" 10 | }, 11 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 12 | -------------------------------------------------------------------------------- /l10n/it.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "File", 3 | "Data migration" : "Migrazione dei dati", 4 | "Export" : "Esporta", 5 | "Cancel" : "Annulla", 6 | "Close" : "Chiudi", 7 | "Import" : "Importa" 8 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 9 | } -------------------------------------------------------------------------------- /l10n/ja.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ファイル", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "バージョン履歴を含む所有ファイル、コメント、コラボレーションタグ、お気に入りを含む、(ストレージ容量が少ない場合、エクスポート中にバージョン履歴は失われる可能性があります)", 6 | "User migration" : "ユーザー情報移行", 7 | "User export failed" : "ユーザー情報をエクスポートできませんでした", 8 | "Your export of {user} failed." : "{user} がエクスポートできませんでした", 9 | "User export done" : "ユーザー情報をエクスポートしました", 10 | "Your export of {user} has completed: {file}" : "{user} のエクスポートが完了しました: {file}", 11 | "User import failed" : "ユーザー情報をインポートできませんでした", 12 | "Your import to {user} failed." : "{user} へのインポートできませんでした", 13 | "User import done" : "ユーザー情報をインポートしました", 14 | "Your import of {file} into {user} has completed." : "{user} への {file} のインポートが完了しました", 15 | "Data migration" : "データ移行", 16 | "Migrate user data" : "ユーザー情報を移行", 17 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Nextcloud のユーザー移行アプリ**\n\nこのアプリによりユーザーは自分のアカウントをエクスポートして、あるインスタンスから別のインスタンスに簡単に移行できます。\n\n- **🐱 cat.example.com/nextcloud にログインします**\n- **⚙ `個人設定`>`データ移行`に移動します**\n- **☑ エクスポートするものを選択します** (設定、ファイル、プロフィール情報、プロフィール写真、カレンダー、連絡先…\n- **⚙ エクスポートを開始**し、サーバーがそれを処理するのを待ちます\n- **📁 作成されたアーカイブをダウンロードする**\n- **🐶 dog.example.com/nextcloud へログインする**\n- **🡅 アーカイブをファイルにアップロードする**\n- **⚙ `個人設定` > `データ移行` に移動し、インポートを開始します**\n- **🎉 新しいインスタンスを楽しんでください**、古いアカウントは削除してください。", 18 | "Export queued" : "エクスポートが実行待ち", 19 | "Export in progress…" : "エクスポート中...", 20 | "Export completed successfully" : "エクスポート終了しました", 21 | "You will be notified when your export has completed. This may take a while." : "エクスポートが完了すると通知されます。しばらくお待ちください", 22 | "This may take a while." : "少々お待ちください。", 23 | "Please do not use your account while exporting." : "エクスポート中はアカウントを使用しないでください", 24 | "Export" : "エクスポート", 25 | "Please select the data you want to export" : "エクスポートするデータを選択してください", 26 | "User information and settings" : "ユーザー情報と設定", 27 | "Basic user information including user ID and display name as well as your settings" : "ユーザーID、表示名、設定などの基本的なユーザー情報", 28 | "Show export status" : "エクスポート状況を表示", 29 | "Show status" : "ステータスを表示", 30 | "Cancel export" : "エクスポートをキャンセル", 31 | "Cancel" : "キャンセル", 32 | "Export your data" : "データをエクスポート", 33 | "Estimated size: {estimatedSizeWithUnits}" : "推定サイズ: {estimatedSizeWithUnits}", 34 | "Close export status" : "エクスポート状況を閉じる", 35 | "Close" : "閉じる", 36 | "Choose a file to import" : "インポートするファイルを選択", 37 | "Import queued" : "インポートが実行待ち", 38 | "Import in progress…" : "インポート中...", 39 | "Import completed successfully" : "インポート終了しました", 40 | "You will be notified when your import has completed. This may take a while." : "インポートが完了すると通知されます。しばらくお待ちください", 41 | "Please do not use your account while importing." : "インポート中はアカウントを使用しないでください", 42 | "Import" : "インポート", 43 | "Please note that existing data may be overwritten" : "既存のデータは上書きされる可能性があることに注意してください", 44 | "Show import status" : "インポート状況を表示", 45 | "Cancel import" : "インポートをキャンセル", 46 | "Import your data" : "データをインポート", 47 | "Close import status" : "インポート状況を閉じる" 48 | }, 49 | "nplurals=1; plural=0;"); 50 | -------------------------------------------------------------------------------- /l10n/ja.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ファイル", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "バージョン履歴を含む所有ファイル、コメント、コラボレーションタグ、お気に入りを含む、(ストレージ容量が少ない場合、エクスポート中にバージョン履歴は失われる可能性があります)", 4 | "User migration" : "ユーザー情報移行", 5 | "User export failed" : "ユーザー情報をエクスポートできませんでした", 6 | "Your export of {user} failed." : "{user} がエクスポートできませんでした", 7 | "User export done" : "ユーザー情報をエクスポートしました", 8 | "Your export of {user} has completed: {file}" : "{user} のエクスポートが完了しました: {file}", 9 | "User import failed" : "ユーザー情報をインポートできませんでした", 10 | "Your import to {user} failed." : "{user} へのインポートできませんでした", 11 | "User import done" : "ユーザー情報をインポートしました", 12 | "Your import of {file} into {user} has completed." : "{user} への {file} のインポートが完了しました", 13 | "Data migration" : "データ移行", 14 | "Migrate user data" : "ユーザー情報を移行", 15 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Nextcloud のユーザー移行アプリ**\n\nこのアプリによりユーザーは自分のアカウントをエクスポートして、あるインスタンスから別のインスタンスに簡単に移行できます。\n\n- **🐱 cat.example.com/nextcloud にログインします**\n- **⚙ `個人設定`>`データ移行`に移動します**\n- **☑ エクスポートするものを選択します** (設定、ファイル、プロフィール情報、プロフィール写真、カレンダー、連絡先…\n- **⚙ エクスポートを開始**し、サーバーがそれを処理するのを待ちます\n- **📁 作成されたアーカイブをダウンロードする**\n- **🐶 dog.example.com/nextcloud へログインする**\n- **🡅 アーカイブをファイルにアップロードする**\n- **⚙ `個人設定` > `データ移行` に移動し、インポートを開始します**\n- **🎉 新しいインスタンスを楽しんでください**、古いアカウントは削除してください。", 16 | "Export queued" : "エクスポートが実行待ち", 17 | "Export in progress…" : "エクスポート中...", 18 | "Export completed successfully" : "エクスポート終了しました", 19 | "You will be notified when your export has completed. This may take a while." : "エクスポートが完了すると通知されます。しばらくお待ちください", 20 | "This may take a while." : "少々お待ちください。", 21 | "Please do not use your account while exporting." : "エクスポート中はアカウントを使用しないでください", 22 | "Export" : "エクスポート", 23 | "Please select the data you want to export" : "エクスポートするデータを選択してください", 24 | "User information and settings" : "ユーザー情報と設定", 25 | "Basic user information including user ID and display name as well as your settings" : "ユーザーID、表示名、設定などの基本的なユーザー情報", 26 | "Show export status" : "エクスポート状況を表示", 27 | "Show status" : "ステータスを表示", 28 | "Cancel export" : "エクスポートをキャンセル", 29 | "Cancel" : "キャンセル", 30 | "Export your data" : "データをエクスポート", 31 | "Estimated size: {estimatedSizeWithUnits}" : "推定サイズ: {estimatedSizeWithUnits}", 32 | "Close export status" : "エクスポート状況を閉じる", 33 | "Close" : "閉じる", 34 | "Choose a file to import" : "インポートするファイルを選択", 35 | "Import queued" : "インポートが実行待ち", 36 | "Import in progress…" : "インポート中...", 37 | "Import completed successfully" : "インポート終了しました", 38 | "You will be notified when your import has completed. This may take a while." : "インポートが完了すると通知されます。しばらくお待ちください", 39 | "Please do not use your account while importing." : "インポート中はアカウントを使用しないでください", 40 | "Import" : "インポート", 41 | "Please note that existing data may be overwritten" : "既存のデータは上書きされる可能性があることに注意してください", 42 | "Show import status" : "インポート状況を表示", 43 | "Cancel import" : "インポートをキャンセル", 44 | "Import your data" : "データをインポート", 45 | "Close import status" : "インポート状況を閉じる" 46 | },"pluralForm" :"nplurals=1; plural=0;" 47 | } -------------------------------------------------------------------------------- /l10n/ka.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ფაილები", 5 | "Export" : "Export", 6 | "Cancel" : "Cancel", 7 | "Close" : "Close", 8 | "Import" : "Import" 9 | }, 10 | "nplurals=2; plural=(n!=1);"); 11 | -------------------------------------------------------------------------------- /l10n/ka.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ფაილები", 3 | "Export" : "Export", 4 | "Cancel" : "Cancel", 5 | "Close" : "Close", 6 | "Import" : "Import" 7 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 8 | } -------------------------------------------------------------------------------- /l10n/ka_GE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ფაილები", 5 | "Export" : "ექსპორტი", 6 | "Cancel" : "უარყოფა", 7 | "Close" : "დახურვა", 8 | "Import" : "იმპორტი" 9 | }, 10 | "nplurals=2; plural=(n!=1);"); 11 | -------------------------------------------------------------------------------- /l10n/ka_GE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ფაილები", 3 | "Export" : "ექსპორტი", 4 | "Cancel" : "უარყოფა", 5 | "Close" : "დახურვა", 6 | "Import" : "იმპორტი" 7 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 8 | } -------------------------------------------------------------------------------- /l10n/kab.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Ifuyla", 5 | "Cancel" : "Sefsex", 6 | "Close" : "Mdel" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/kab.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Ifuyla", 3 | "Cancel" : "Sefsex", 4 | "Close" : "Mdel" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/km.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ឯកសារ", 5 | "Export" : "នាំចេញ", 6 | "Cancel" : "បោះបង់", 7 | "Close" : "បិទ", 8 | "Import" : "នាំយកចូល" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/km.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ឯកសារ", 3 | "Export" : "នាំចេញ", 4 | "Cancel" : "បោះបង់", 5 | "Close" : "បិទ", 6 | "Import" : "នាំយកចូល" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/kn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ಕಡತಗಳು", 5 | "Export" : "ರಫ್ತು", 6 | "Cancel" : "ರದ್ದು", 7 | "Close" : "ಮುಚ್ಚು", 8 | "Import" : "ಆಮದು" 9 | }, 10 | "nplurals=2; plural=(n > 1);"); 11 | -------------------------------------------------------------------------------- /l10n/kn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ಕಡತಗಳು", 3 | "Export" : "ರಫ್ತು", 4 | "Cancel" : "ರದ್ದು", 5 | "Close" : "ಮುಚ್ಚು", 6 | "Import" : "ಆಮದು" 7 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 8 | } -------------------------------------------------------------------------------- /l10n/ko.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "파일", 5 | "Export" : "내보내기", 6 | "Cancel" : "취소", 7 | "Close" : "닫기", 8 | "Import" : "가져오기" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/ko.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "파일", 3 | "Export" : "내보내기", 4 | "Cancel" : "취소", 5 | "Close" : "닫기", 6 | "Import" : "가져오기" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fichieren", 5 | "Export" : "Exportéieren", 6 | "Cancel" : "Ofbriechen", 7 | "Close" : "Zoumaachen", 8 | "Import" : "Importéieren" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fichieren", 3 | "Export" : "Exportéieren", 4 | "Cancel" : "Ofbriechen", 5 | "Close" : "Zoumaachen", 6 | "Import" : "Importéieren" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/lo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ຟາຍ", 5 | "Cancel" : "ຍົກເລີກ", 6 | "Close" : "ປິດ" 7 | }, 8 | "nplurals=1; plural=0;"); 9 | -------------------------------------------------------------------------------- /l10n/lo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ຟາຍ", 3 | "Cancel" : "ຍົກເລີກ", 4 | "Close" : "ປິດ" 5 | },"pluralForm" :"nplurals=1; plural=0;" 6 | } -------------------------------------------------------------------------------- /l10n/lt_LT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Failai", 5 | "Data migration" : "Duomenų perkėlimas", 6 | "Export" : "Eksportuoti", 7 | "Cancel" : "Atsisakyti", 8 | "Close" : "Užverti", 9 | "Import" : "Importuoti" 10 | }, 11 | "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);"); 12 | -------------------------------------------------------------------------------- /l10n/lt_LT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Failai", 3 | "Data migration" : "Duomenų perkėlimas", 4 | "Export" : "Eksportuoti", 5 | "Cancel" : "Atsisakyti", 6 | "Close" : "Užverti", 7 | "Import" : "Importuoti" 8 | },"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);" 9 | } -------------------------------------------------------------------------------- /l10n/lv.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Datnes", 5 | "Export" : "Izgūt", 6 | "Basic user information including user ID and display name as well as your settings" : "Pamata lietotāja informācija, tajā skaitā lietotāja Id un attēlojamais vārds, kā arī iestatījumi", 7 | "Cancel" : "Atcelt", 8 | "Close" : "Aizvērt", 9 | "Import" : "Importēt" 10 | }, 11 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); 12 | -------------------------------------------------------------------------------- /l10n/lv.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Datnes", 3 | "Export" : "Izgūt", 4 | "Basic user information including user ID and display name as well as your settings" : "Pamata lietotāja informācija, tajā skaitā lietotāja Id un attēlojamais vārds, kā arī iestatījumi", 5 | "Cancel" : "Atcelt", 6 | "Close" : "Aizvērt", 7 | "Import" : "Importēt" 8 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" 9 | } -------------------------------------------------------------------------------- /l10n/mk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Датотеки", 5 | "Data migration" : "Мигрирање на податоци", 6 | "Export" : "Извези", 7 | "Cancel" : "Откажи", 8 | "Close" : "Затвори", 9 | "Import" : "Увези" 10 | }, 11 | "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); 12 | -------------------------------------------------------------------------------- /l10n/mk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Датотеки", 3 | "Data migration" : "Мигрирање на податоци", 4 | "Export" : "Извези", 5 | "Cancel" : "Откажи", 6 | "Close" : "Затвори", 7 | "Import" : "Увези" 8 | },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" 9 | } -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "файлууд", 5 | "Export" : "Экспорт", 6 | "Cancel" : "болиулах", 7 | "Close" : "Хаах", 8 | "Import" : "Импорт" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "файлууд", 3 | "Export" : "Экспорт", 4 | "Cancel" : "болиулах", 5 | "Close" : "Хаах", 6 | "Import" : "Импорт" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/ms_MY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fail", 5 | "Export" : "Eksport", 6 | "Cancel" : "Batal", 7 | "Close" : "Tutup", 8 | "Import" : "Import" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/ms_MY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fail", 3 | "Export" : "Eksport", 4 | "Cancel" : "Batal", 5 | "Close" : "Tutup", 6 | "Import" : "Import" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/nl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Bestanden", 5 | "Data migration" : "Gegevensmigratie", 6 | "Export" : "Exporteren", 7 | "Cancel" : "Annuleren", 8 | "Close" : "Sluit", 9 | "Import" : "Import" 10 | }, 11 | "nplurals=2; plural=(n != 1);"); 12 | -------------------------------------------------------------------------------- /l10n/nl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Bestanden", 3 | "Data migration" : "Gegevensmigratie", 4 | "Export" : "Exporteren", 5 | "Cancel" : "Annuleren", 6 | "Close" : "Sluit", 7 | "Import" : "Import" 8 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 9 | } -------------------------------------------------------------------------------- /l10n/nn_NO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Filer", 5 | "Export" : "Eksporter", 6 | "Cancel" : "Avbryt", 7 | "Close" : "Lat att", 8 | "Import" : "Importer" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/nn_NO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Filer", 3 | "Export" : "Eksporter", 4 | "Cancel" : "Avbryt", 5 | "Close" : "Lat att", 6 | "Import" : "Importer" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/oc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fichièrs", 5 | "Export" : "Exportar", 6 | "Cancel" : "Anullar", 7 | "Close" : "Tampar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=2; plural=(n > 1);"); 11 | -------------------------------------------------------------------------------- /l10n/oc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fichièrs", 3 | "Export" : "Exportar", 4 | "Cancel" : "Anullar", 5 | "Close" : "Tampar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 8 | } -------------------------------------------------------------------------------- /l10n/pl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Pliki", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Pliki należące do Ciebie, w tym wersje, komentarze, wspólne znaczniki i ulubione (wersje mogą wygasnąć podczas eksportu, jeśli masz mało miejsca na dysku)", 6 | "User migration" : "Migracja użytkownika", 7 | "User export failed" : "Eksport użytkownika nie powiódł się", 8 | "Your export of {user} failed." : "Twój eksport użytkownika {user} nie powiódł się.", 9 | "User export done" : "Eksport użytkownika został zakończony", 10 | "User import failed" : "Import użytkownika nie powiódł się", 11 | "User import done" : "Import użytkownika został zakończony", 12 | "Data migration" : "Migracja danych", 13 | "Export queued" : "Eksport w kolejce", 14 | "Export in progress…" : "Eksport w toku…", 15 | "Export completed successfully" : "Eksport zakończony pomyślnie", 16 | "You will be notified when your export has completed. This may take a while." : "Po zakończeniu eksportu zostaniesz powiadomiony. To może chwilę potrwać.", 17 | "This may take a while." : "To może chwilę potrwać.", 18 | "Please do not use your account while exporting." : "Proszę nie używać swojego konta podczas eksportu.", 19 | "Export" : "Eksportuj", 20 | "Cancel export" : "Anuluj eksport", 21 | "Cancel" : "Anuluj", 22 | "Export your data" : "Eksportuj swoje dane", 23 | "Close export status" : "Zamknij status eksportu", 24 | "Close" : "Zamknij", 25 | "Import completed successfully" : "Importowanie zakończone pomyślnie", 26 | "You will be notified when your import has completed. This may take a while." : "Po zakończeniu importu zostaniesz powiadomiony. To może chwilę potrwać.", 27 | "Please do not use your account while importing." : "Proszę nie korzystać ze swojego konta podczas importowania.", 28 | "Import" : "Importuj" 29 | }, 30 | "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);"); 31 | -------------------------------------------------------------------------------- /l10n/pl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Pliki", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Pliki należące do Ciebie, w tym wersje, komentarze, wspólne znaczniki i ulubione (wersje mogą wygasnąć podczas eksportu, jeśli masz mało miejsca na dysku)", 4 | "User migration" : "Migracja użytkownika", 5 | "User export failed" : "Eksport użytkownika nie powiódł się", 6 | "Your export of {user} failed." : "Twój eksport użytkownika {user} nie powiódł się.", 7 | "User export done" : "Eksport użytkownika został zakończony", 8 | "User import failed" : "Import użytkownika nie powiódł się", 9 | "User import done" : "Import użytkownika został zakończony", 10 | "Data migration" : "Migracja danych", 11 | "Export queued" : "Eksport w kolejce", 12 | "Export in progress…" : "Eksport w toku…", 13 | "Export completed successfully" : "Eksport zakończony pomyślnie", 14 | "You will be notified when your export has completed. This may take a while." : "Po zakończeniu eksportu zostaniesz powiadomiony. To może chwilę potrwać.", 15 | "This may take a while." : "To może chwilę potrwać.", 16 | "Please do not use your account while exporting." : "Proszę nie używać swojego konta podczas eksportu.", 17 | "Export" : "Eksportuj", 18 | "Cancel export" : "Anuluj eksport", 19 | "Cancel" : "Anuluj", 20 | "Export your data" : "Eksportuj swoje dane", 21 | "Close export status" : "Zamknij status eksportu", 22 | "Close" : "Zamknij", 23 | "Import completed successfully" : "Importowanie zakończone pomyślnie", 24 | "You will be notified when your import has completed. This may take a while." : "Po zakończeniu importu zostaniesz powiadomiony. To może chwilę potrwać.", 25 | "Please do not use your account while importing." : "Proszę nie korzystać ze swojego konta podczas importowania.", 26 | "Import" : "Importuj" 27 | },"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);" 28 | } -------------------------------------------------------------------------------- /l10n/ps.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "فایلونه", 5 | "Cancel" : "پرېښول", 6 | "Close" : "بندول" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/ps.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "فایلونه", 3 | "Cancel" : "پرېښول", 4 | "Close" : "بندول" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/pt_PT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Ficheiros", 5 | "Export" : "Exportar", 6 | "Cancel" : "Cancelar", 7 | "Close" : "Fechar", 8 | "Import" : "Importar" 9 | }, 10 | "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 11 | -------------------------------------------------------------------------------- /l10n/pt_PT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Ficheiros", 3 | "Export" : "Exportar", 4 | "Cancel" : "Cancelar", 5 | "Close" : "Fechar", 6 | "Import" : "Importar" 7 | },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 8 | } -------------------------------------------------------------------------------- /l10n/ro.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Fișiere", 5 | "Export" : "Exportă", 6 | "Cancel" : "Anulare", 7 | "Close" : "Închide", 8 | "Import" : "Importă" 9 | }, 10 | "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); 11 | -------------------------------------------------------------------------------- /l10n/ro.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Fișiere", 3 | "Export" : "Exportă", 4 | "Cancel" : "Anulare", 5 | "Close" : "Închide", 6 | "Import" : "Importă" 7 | },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" 8 | } -------------------------------------------------------------------------------- /l10n/ru.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Файлы", 5 | "Data migration" : "Перенос данных", 6 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Приложение для миграции пользователей для Nextcloud**\n\nЭто приложение позволяет пользователям легко мигрировать из одного экземпляра в другой, используя экспорт своей учетной записи.\n\n- **🐱 Войдите в cat.example.com/nextcloud**\n- **⚙ Перейдите в `Персональные настройки` > `Миграция данных`**\n- **☑ Выберите, что вы хотите экспортировать** (настройки, файлы, информацию профиля, изображение профиля, календари, контакты…)\n- **⚙ Запустите экспорт** и дождитесь, пока сервер его обработает\n- **📁 Загрузите полученный файл с именем `user.nextcloud_export`**\n- **🐶 Откройте учетную запись на dog.example.com/nextcloud**\n- **🡅 Загрузите `user.nextcloud_export` в свои файлы**\n- **⚙ Перейдите в `Персональные настройки` > `Миграция данных` и начните импорт**\n- **🎉 Наслаждайтесь пребыванием на новом экземпляре** и закройте старую учетную запись", 7 | "Export" : "Экспорт", 8 | "User information and settings" : "Информация о пользователе и настройки", 9 | "Basic user information including user ID and display name as well as your settings" : "Основная информация о пользователе, включая идентификатор пользователя и отображаемое имя, а также ваши настройки.", 10 | "Cancel" : "Отменить", 11 | "Close" : "Закрыть", 12 | "Import" : "Импортировать" 13 | }, 14 | "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);"); 15 | -------------------------------------------------------------------------------- /l10n/ru.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Файлы", 3 | "Data migration" : "Перенос данных", 4 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Приложение для миграции пользователей для Nextcloud**\n\nЭто приложение позволяет пользователям легко мигрировать из одного экземпляра в другой, используя экспорт своей учетной записи.\n\n- **🐱 Войдите в cat.example.com/nextcloud**\n- **⚙ Перейдите в `Персональные настройки` > `Миграция данных`**\n- **☑ Выберите, что вы хотите экспортировать** (настройки, файлы, информацию профиля, изображение профиля, календари, контакты…)\n- **⚙ Запустите экспорт** и дождитесь, пока сервер его обработает\n- **📁 Загрузите полученный файл с именем `user.nextcloud_export`**\n- **🐶 Откройте учетную запись на dog.example.com/nextcloud**\n- **🡅 Загрузите `user.nextcloud_export` в свои файлы**\n- **⚙ Перейдите в `Персональные настройки` > `Миграция данных` и начните импорт**\n- **🎉 Наслаждайтесь пребыванием на новом экземпляре** и закройте старую учетную запись", 5 | "Export" : "Экспорт", 6 | "User information and settings" : "Информация о пользователе и настройки", 7 | "Basic user information including user ID and display name as well as your settings" : "Основная информация о пользователе, включая идентификатор пользователя и отображаемое имя, а также ваши настройки.", 8 | "Cancel" : "Отменить", 9 | "Close" : "Закрыть", 10 | "Import" : "Импортировать" 11 | },"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);" 12 | } -------------------------------------------------------------------------------- /l10n/sc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Archìvios", 5 | "Data migration" : "Tramudadura de datos", 6 | "Export" : "Esporta", 7 | "Cancel" : "Annulla", 8 | "Close" : "Serra", 9 | "Import" : "Importa" 10 | }, 11 | "nplurals=2; plural=(n != 1);"); 12 | -------------------------------------------------------------------------------- /l10n/sc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Archìvios", 3 | "Data migration" : "Tramudadura de datos", 4 | "Export" : "Esporta", 5 | "Cancel" : "Annulla", 6 | "Close" : "Serra", 7 | "Import" : "Importa" 8 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 9 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ගොනු", 5 | "Data migration" : "දත්ත සංක්‍රමණය", 6 | "Cancel" : "අවලංගු කරන්න", 7 | "Close" : "වසන්න" 8 | }, 9 | "nplurals=2; plural=(n != 1);"); 10 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ගොනු", 3 | "Data migration" : "දත්ත සංක්‍රමණය", 4 | "Cancel" : "අවලංගු කරන්න", 5 | "Close" : "වසන්න" 6 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 7 | } -------------------------------------------------------------------------------- /l10n/sl.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Datoteke", 5 | "Data migration" : "Preselitev podatkov", 6 | "Export" : "Izvozi", 7 | "Cancel" : "Prekliči", 8 | "Close" : "Zapri", 9 | "Choose a file to import" : "Izbor datoteke za uvoz", 10 | "Import completed successfully" : "Uvoz je uspešno končan.", 11 | "You will be notified when your import has completed. This may take a while." : "Obveščeni boste takoj, ko bo uvoz končan. Opravilo je lahko dolgotrajno.", 12 | "Please do not use your account while importing." : "Računa ni priporočljivo uporabljati, dokler poteka uvažanje podatkov.", 13 | "Import" : "Uvozi" 14 | }, 15 | "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); 16 | -------------------------------------------------------------------------------- /l10n/sl.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Datoteke", 3 | "Data migration" : "Preselitev podatkov", 4 | "Export" : "Izvozi", 5 | "Cancel" : "Prekliči", 6 | "Close" : "Zapri", 7 | "Choose a file to import" : "Izbor datoteke za uvoz", 8 | "Import completed successfully" : "Uvoz je uspešno končan.", 9 | "You will be notified when your import has completed. This may take a while." : "Obveščeni boste takoj, ko bo uvoz končan. Opravilo je lahko dolgotrajno.", 10 | "Please do not use your account while importing." : "Računa ni priporočljivo uporabljati, dokler poteka uvažanje podatkov.", 11 | "Import" : "Uvozi" 12 | },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" 13 | } -------------------------------------------------------------------------------- /l10n/sq.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Skedarët", 5 | "Export" : "Eksport", 6 | "Cancel" : "Anullo", 7 | "Close" : "Mbylleni", 8 | "Import" : "Import" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/sq.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Skedarët", 3 | "Export" : "Eksport", 4 | "Cancel" : "Anullo", 5 | "Close" : "Mbylleni", 6 | "Import" : "Import" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/sr@latin.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Фајлови", 5 | "Cancel" : "Otkaži", 6 | "Close" : "Zatvori", 7 | "Import" : "Uvezi" 8 | }, 9 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 10 | -------------------------------------------------------------------------------- /l10n/sr@latin.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Фајлови", 3 | "Cancel" : "Otkaži", 4 | "Close" : "Zatvori", 5 | "Import" : "Uvezi" 6 | },"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);" 7 | } -------------------------------------------------------------------------------- /l10n/sv.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Filer", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Filer som ägs av dig inklusive versioner, kommentarer, samarbetstaggar och favoriter (versioner kan upphöra under export om du har ont om lagringsutrymme)", 6 | "User migration" : "Användarmigrering", 7 | "User export failed" : "Export av användare misslyckades", 8 | "Your export of {user} failed." : "Din export av {user} misslyckades.", 9 | "User export done" : "Export av användare klar", 10 | "Your export of {user} has completed: {file}" : "Din export av {user} har slutförts: {file}", 11 | "User import failed" : "Import av användare misslyckades", 12 | "Your import to {user} failed." : "Din import av {user} misslyckades.", 13 | "User import done" : "Import av användare klar", 14 | "Your import of {file} into {user} has completed." : "Din import av {file} till {user} har slutförts.", 15 | "%s (missing)" : "%s (saknas)", 16 | "Data migration" : "Datamigrering", 17 | "Migrate user data" : "Migrera användardata", 18 | "Export queued" : "Export köas", 19 | "Export in progress…" : "Export pågår...", 20 | "Export completed successfully" : "Exporten slutförd", 21 | "You will be notified when your export has completed. This may take a while." : "Du kommer att få ett meddelande när din export är klar. Det kan ta ett tag.", 22 | "This may take a while." : "Det här kan ta ett tag.", 23 | "Please do not use your account while exporting." : "Använd inte ditt konto när du exporterar.", 24 | "Export" : "Exportera", 25 | "Please select the data you want to export" : "Välj den data du vill exportera", 26 | "User information and settings" : "Användarinformation och inställningar", 27 | "Basic user information including user ID and display name as well as your settings" : "Grundläggande användarinformation inklusive användar-ID och visningsnamn samt dina inställningar", 28 | "Show export status" : "Visa exportstatus", 29 | "Show status" : "Visa status", 30 | "Cancel export" : "Avbryt export", 31 | "Cancel" : "Avbryt", 32 | "Export your data" : "Exportera din data", 33 | "Estimated size: {estimatedSizeWithUnits}" : "Uppskattad storlek: {estimatedSizeWithUnits}", 34 | "Close export status" : "Stäng exportstatus", 35 | "Close" : "Stäng", 36 | "Choose a file to import" : "Välj en fil att importera", 37 | "Import queued" : "Import köas", 38 | "Import in progress…" : "Import pågår...", 39 | "Import completed successfully" : "Importen slutförd", 40 | "You will be notified when your import has completed. This may take a while." : "Du kommer att få ett meddelande när din import är klar. Det kan ta ett tag.", 41 | "Please do not use your account while importing." : "Använd inte ditt konto när du importerar.", 42 | "Import" : "Importera", 43 | "Please note that existing data may be overwritten" : "Observera att befintliga data kan skrivas över", 44 | "Show import status" : "Visa importstatus", 45 | "Cancel import" : "Avbryt import", 46 | "Import your data" : "Importera din data", 47 | "Close import status" : "Stäng importstatus" 48 | }, 49 | "nplurals=2; plural=(n != 1);"); 50 | -------------------------------------------------------------------------------- /l10n/sv.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Filer", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Filer som ägs av dig inklusive versioner, kommentarer, samarbetstaggar och favoriter (versioner kan upphöra under export om du har ont om lagringsutrymme)", 4 | "User migration" : "Användarmigrering", 5 | "User export failed" : "Export av användare misslyckades", 6 | "Your export of {user} failed." : "Din export av {user} misslyckades.", 7 | "User export done" : "Export av användare klar", 8 | "Your export of {user} has completed: {file}" : "Din export av {user} har slutförts: {file}", 9 | "User import failed" : "Import av användare misslyckades", 10 | "Your import to {user} failed." : "Din import av {user} misslyckades.", 11 | "User import done" : "Import av användare klar", 12 | "Your import of {file} into {user} has completed." : "Din import av {file} till {user} har slutförts.", 13 | "%s (missing)" : "%s (saknas)", 14 | "Data migration" : "Datamigrering", 15 | "Migrate user data" : "Migrera användardata", 16 | "Export queued" : "Export köas", 17 | "Export in progress…" : "Export pågår...", 18 | "Export completed successfully" : "Exporten slutförd", 19 | "You will be notified when your export has completed. This may take a while." : "Du kommer att få ett meddelande när din export är klar. Det kan ta ett tag.", 20 | "This may take a while." : "Det här kan ta ett tag.", 21 | "Please do not use your account while exporting." : "Använd inte ditt konto när du exporterar.", 22 | "Export" : "Exportera", 23 | "Please select the data you want to export" : "Välj den data du vill exportera", 24 | "User information and settings" : "Användarinformation och inställningar", 25 | "Basic user information including user ID and display name as well as your settings" : "Grundläggande användarinformation inklusive användar-ID och visningsnamn samt dina inställningar", 26 | "Show export status" : "Visa exportstatus", 27 | "Show status" : "Visa status", 28 | "Cancel export" : "Avbryt export", 29 | "Cancel" : "Avbryt", 30 | "Export your data" : "Exportera din data", 31 | "Estimated size: {estimatedSizeWithUnits}" : "Uppskattad storlek: {estimatedSizeWithUnits}", 32 | "Close export status" : "Stäng exportstatus", 33 | "Close" : "Stäng", 34 | "Choose a file to import" : "Välj en fil att importera", 35 | "Import queued" : "Import köas", 36 | "Import in progress…" : "Import pågår...", 37 | "Import completed successfully" : "Importen slutförd", 38 | "You will be notified when your import has completed. This may take a while." : "Du kommer att få ett meddelande när din import är klar. Det kan ta ett tag.", 39 | "Please do not use your account while importing." : "Använd inte ditt konto när du importerar.", 40 | "Import" : "Importera", 41 | "Please note that existing data may be overwritten" : "Observera att befintliga data kan skrivas över", 42 | "Show import status" : "Visa importstatus", 43 | "Cancel import" : "Avbryt import", 44 | "Import your data" : "Importera din data", 45 | "Close import status" : "Stäng importstatus" 46 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 47 | } -------------------------------------------------------------------------------- /l10n/sw.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Export" : "Safirisha", 5 | "Cancel" : "Cancel", 6 | "Close" : "Funga" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/sw.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Export" : "Safirisha", 3 | "Cancel" : "Cancel", 4 | "Close" : "Funga" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/ta.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "கோப்புகள்", 5 | "Export" : "ஏற்றுமதி", 6 | "Cancel" : "இரத்து செய்க", 7 | "Close" : "மூடுக", 8 | "Import" : "இறக்குமதி" 9 | }, 10 | "nplurals=2; plural=(n != 1);"); 11 | -------------------------------------------------------------------------------- /l10n/ta.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "கோப்புகள்", 3 | "Export" : "ஏற்றுமதி", 4 | "Cancel" : "இரத்து செய்க", 5 | "Close" : "மூடுக", 6 | "Import" : "இறக்குமதி" 7 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 8 | } -------------------------------------------------------------------------------- /l10n/th.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "ไฟล์", 5 | "Export" : "ส่งออก", 6 | "Cancel" : "ยกเลิก", 7 | "Close" : "ปิด", 8 | "Import" : "นำเข้า" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/th.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "ไฟล์", 3 | "Export" : "ส่งออก", 4 | "Cancel" : "ยกเลิก", 5 | "Close" : "ปิด", 6 | "Import" : "นำเข้า" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/tk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Faýllar", 5 | "Cancel" : "ýatyrmak", 6 | "Close" : "Ýap" 7 | }, 8 | "nplurals=2; plural=(n != 1);"); 9 | -------------------------------------------------------------------------------- /l10n/tk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Faýllar", 3 | "Cancel" : "ýatyrmak", 4 | "Close" : "Ýap" 5 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 6 | } -------------------------------------------------------------------------------- /l10n/uk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Файли", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Ваші файли з різними версіями, коментарі, спільні мітки та елементи із зірочкою (термін дії версій може закінчитися під час експорту, якщо у вас замало місця для зберігання даних)", 6 | "User migration" : "Міграція користувачів", 7 | "User export failed" : "Експорт користувача не вдався", 8 | "Your export of {user} failed." : "Не вдалося експортувати {user}.", 9 | "Export" : "Експорт", 10 | "Cancel" : "Скасувати", 11 | "Close" : "Закрити", 12 | "Import" : "Імпорт" 13 | }, 14 | "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/uk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Файли", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "Ваші файли з різними версіями, коментарі, спільні мітки та елементи із зірочкою (термін дії версій може закінчитися під час експорту, якщо у вас замало місця для зберігання даних)", 4 | "User migration" : "Міграція користувачів", 5 | "User export failed" : "Експорт користувача не вдався", 6 | "Your export of {user} failed." : "Не вдалося експортувати {user}.", 7 | "Export" : "Експорт", 8 | "Cancel" : "Скасувати", 9 | "Close" : "Закрити", 10 | "Import" : "Імпорт" 11 | },"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);" 12 | } -------------------------------------------------------------------------------- /l10n/uz.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Files", 5 | "Export" : "Eksport", 6 | "Cancel" : "Cancel", 7 | "Close" : "Close", 8 | "Import" : "Import" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/uz.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Files", 3 | "Export" : "Eksport", 4 | "Cancel" : "Cancel", 5 | "Close" : "Close", 6 | "Import" : "Import" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/vi.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "Tệp", 5 | "Export" : "Xuất ra", 6 | "Cancel" : "Hủy", 7 | "Close" : "Đóng", 8 | "Import" : "Nhập vào" 9 | }, 10 | "nplurals=1; plural=0;"); 11 | -------------------------------------------------------------------------------- /l10n/vi.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "Tệp", 3 | "Export" : "Xuất ra", 4 | "Cancel" : "Hủy", 5 | "Close" : "Đóng", 6 | "Import" : "Nhập vào" 7 | },"pluralForm" :"nplurals=1; plural=0;" 8 | } -------------------------------------------------------------------------------- /l10n/zh_CN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "文件", 5 | "Data migration" : "数据迁移", 6 | "Export completed successfully" : "导出成功", 7 | "This may take a while." : "这可能需要一段时间。", 8 | "Export" : "导出", 9 | "Show status" : "显示状态", 10 | "Cancel export" : "取消导出", 11 | "Cancel" : "取消", 12 | "Close" : "关闭", 13 | "Choose a file to import" : "选择要导入的文件", 14 | "Import in progress…" : "导入中…", 15 | "Import completed successfully" : "导入成功", 16 | "Import" : "导入", 17 | "Show import status" : "显示导入状态", 18 | "Cancel import" : "取消导入", 19 | "Import your data" : "导入你的数据", 20 | "Close import status" : "关闭导入状态" 21 | }, 22 | "nplurals=1; plural=0;"); 23 | -------------------------------------------------------------------------------- /l10n/zh_CN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "文件", 3 | "Data migration" : "数据迁移", 4 | "Export completed successfully" : "导出成功", 5 | "This may take a while." : "这可能需要一段时间。", 6 | "Export" : "导出", 7 | "Show status" : "显示状态", 8 | "Cancel export" : "取消导出", 9 | "Cancel" : "取消", 10 | "Close" : "关闭", 11 | "Choose a file to import" : "选择要导入的文件", 12 | "Import in progress…" : "导入中…", 13 | "Import completed successfully" : "导入成功", 14 | "Import" : "导入", 15 | "Show import status" : "显示导入状态", 16 | "Cancel import" : "取消导入", 17 | "Import your data" : "导入你的数据", 18 | "Close import status" : "关闭导入状态" 19 | },"pluralForm" :"nplurals=1; plural=0;" 20 | } -------------------------------------------------------------------------------- /l10n/zh_HK.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "檔案", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "您擁有的檔案,包括版本、評論、協作標籤和收藏夾(如果您的存儲空間不足,版本可能會在導出期間過期)", 6 | "User migration" : "用戶遷移", 7 | "User export failed" : "用戶導出失敗", 8 | "Your export of {user} failed." : "您的 {user} 導出失敗。", 9 | "User export done" : "用戶導出完成", 10 | "Your export of {user} has completed: {file}" : "您對 {user} 的導出已完成:{file}", 11 | "User import failed" : "用戶導入失敗", 12 | "Your import to {user} failed." : "您的 {user} 導入失敗。", 13 | "User import done" : "用戶導入完成", 14 | "Your import of {file} into {user} has completed." : "您將 {file} 導入 {user} 已完成。", 15 | "%s (missing)" : "%s(缺少)", 16 | "Data migration" : "數據遷移", 17 | "Migrate user data" : "遷移用戶數據", 18 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Nextcloud 的用戶遷移應用程式**\n\n此應用程式讓用戶可以輕鬆地使用其帳戶的匯出功能從一個實例遷移至另一個實例。\n\n- **🐱 登入 cat.example.com/nextcloud**\n- **⚙ 到 `個人設定` > `資料遷移`**\n- **☑ 選取您要匯出的東西**(設定、檔案、個人檔案資訊、個人檔案圖片、行事曆、聯絡人等等)\n- **⚙ 開始匯出**並等待伺服器處理\n- **📁 下載名為 `user.nextcloud_export` 的結果檔案**\n- **🐶 在 dog.example.com/nextcloud 上開啟帳號**\n- **🡅 上傳 `user.nextcloud_export` 到您的檔案中**\n- **⚙ 到 `個人設定` > `資料遷移` 並開始匯入**\n- **🎉 享受您的新實例**並關閉您的舊帳戶", 19 | "Export queued" : "導出排隊", 20 | "Export in progress…" : "導出處理中...", 21 | "Export completed successfully" : "導出成功", 22 | "You will be notified when your export has completed. This may take a while." : "當您的導出完成時,您會收到通知。可能還要等一下。", 23 | "This may take a while." : "可能還要等一下。", 24 | "Please do not use your account while exporting." : "請不要在導出時使用您的帳戶。", 25 | "Export" : "導出", 26 | "Please select the data you want to export" : "請選擇您要導出的數據", 27 | "User information and settings" : "用戶資訊及設定", 28 | "Basic user information including user ID and display name as well as your settings" : "基本用戶信息,包括用戶 ID 和顯示名稱以及您的設置", 29 | "Show export status" : "顯示導出狀態", 30 | "Show status" : "顯示狀態", 31 | "Cancel export" : "取消導出", 32 | "Cancel" : "取消", 33 | "Export your data" : "導出您的數據", 34 | "Estimated size: {estimatedSizeWithUnits}" : "估計大小:{estimatedSizeWithUnits}", 35 | "Close export status" : "關閉導出狀態", 36 | "Close" : "關閉", 37 | "Choose a file to import" : "選取要導入的檔案", 38 | "Import queued" : "導入排隊", 39 | "Import in progress…" : "導入處理中...", 40 | "Import completed successfully" : "導入成功", 41 | "You will be notified when your import has completed. This may take a while." : "當您的導入完成時,您會收到通知。可能還要等一下。", 42 | "Please do not use your account while importing." : "請不要在導入時使用您的帳戶。", 43 | "Import" : "導入", 44 | "Please note that existing data may be overwritten" : "請注意,現有數據可能會被覆蓋", 45 | "Show import status" : "顯示導入狀態", 46 | "Cancel import" : "取消導入", 47 | "Import your data" : "導入您的數據", 48 | "Close import status" : "關閉導入狀態" 49 | }, 50 | "nplurals=1; plural=0;"); 51 | -------------------------------------------------------------------------------- /l10n/zh_HK.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "檔案", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "您擁有的檔案,包括版本、評論、協作標籤和收藏夾(如果您的存儲空間不足,版本可能會在導出期間過期)", 4 | "User migration" : "用戶遷移", 5 | "User export failed" : "用戶導出失敗", 6 | "Your export of {user} failed." : "您的 {user} 導出失敗。", 7 | "User export done" : "用戶導出完成", 8 | "Your export of {user} has completed: {file}" : "您對 {user} 的導出已完成:{file}", 9 | "User import failed" : "用戶導入失敗", 10 | "Your import to {user} failed." : "您的 {user} 導入失敗。", 11 | "User import done" : "用戶導入完成", 12 | "Your import of {file} into {user} has completed." : "您將 {file} 導入 {user} 已完成。", 13 | "%s (missing)" : "%s(缺少)", 14 | "Data migration" : "數據遷移", 15 | "Migrate user data" : "遷移用戶數據", 16 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Nextcloud 的用戶遷移應用程式**\n\n此應用程式讓用戶可以輕鬆地使用其帳戶的匯出功能從一個實例遷移至另一個實例。\n\n- **🐱 登入 cat.example.com/nextcloud**\n- **⚙ 到 `個人設定` > `資料遷移`**\n- **☑ 選取您要匯出的東西**(設定、檔案、個人檔案資訊、個人檔案圖片、行事曆、聯絡人等等)\n- **⚙ 開始匯出**並等待伺服器處理\n- **📁 下載名為 `user.nextcloud_export` 的結果檔案**\n- **🐶 在 dog.example.com/nextcloud 上開啟帳號**\n- **🡅 上傳 `user.nextcloud_export` 到您的檔案中**\n- **⚙ 到 `個人設定` > `資料遷移` 並開始匯入**\n- **🎉 享受您的新實例**並關閉您的舊帳戶", 17 | "Export queued" : "導出排隊", 18 | "Export in progress…" : "導出處理中...", 19 | "Export completed successfully" : "導出成功", 20 | "You will be notified when your export has completed. This may take a while." : "當您的導出完成時,您會收到通知。可能還要等一下。", 21 | "This may take a while." : "可能還要等一下。", 22 | "Please do not use your account while exporting." : "請不要在導出時使用您的帳戶。", 23 | "Export" : "導出", 24 | "Please select the data you want to export" : "請選擇您要導出的數據", 25 | "User information and settings" : "用戶資訊及設定", 26 | "Basic user information including user ID and display name as well as your settings" : "基本用戶信息,包括用戶 ID 和顯示名稱以及您的設置", 27 | "Show export status" : "顯示導出狀態", 28 | "Show status" : "顯示狀態", 29 | "Cancel export" : "取消導出", 30 | "Cancel" : "取消", 31 | "Export your data" : "導出您的數據", 32 | "Estimated size: {estimatedSizeWithUnits}" : "估計大小:{estimatedSizeWithUnits}", 33 | "Close export status" : "關閉導出狀態", 34 | "Close" : "關閉", 35 | "Choose a file to import" : "選取要導入的檔案", 36 | "Import queued" : "導入排隊", 37 | "Import in progress…" : "導入處理中...", 38 | "Import completed successfully" : "導入成功", 39 | "You will be notified when your import has completed. This may take a while." : "當您的導入完成時,您會收到通知。可能還要等一下。", 40 | "Please do not use your account while importing." : "請不要在導入時使用您的帳戶。", 41 | "Import" : "導入", 42 | "Please note that existing data may be overwritten" : "請注意,現有數據可能會被覆蓋", 43 | "Show import status" : "顯示導入狀態", 44 | "Cancel import" : "取消導入", 45 | "Import your data" : "導入您的數據", 46 | "Close import status" : "關閉導入狀態" 47 | },"pluralForm" :"nplurals=1; plural=0;" 48 | } -------------------------------------------------------------------------------- /l10n/zh_TW.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "user_migration", 3 | { 4 | "Files" : "檔案", 5 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "您所擁有的檔案,包含版本、留言、協作標籤與最愛(若您的儲存空間不足,版本可能會在您匯出期間過期)", 6 | "User migration" : "使用者遷移", 7 | "User export failed" : "使用者匯出失敗", 8 | "Your export of {user} failed." : "您的 {user} 匯出失敗。", 9 | "User export done" : "使用者匯出完成", 10 | "Your export of {user} has completed: {file}" : "您對 {user} 的匯出已完成:{file}", 11 | "User import failed" : "使用者匯入失敗", 12 | "Your import to {user} failed." : "您對 {user} 匯入失敗。", 13 | "User import done" : "使用者匯入完成", 14 | "Your import of {file} into {user} has completed." : "您將 {file} 匯入 {user} 已完成。", 15 | "%s (missing)" : "%s(缺少)", 16 | "Data migration" : "資料遷移", 17 | "Migrate user data" : "遷移使用者資料", 18 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Nextcloud 的使用者遷移應用程式**\n\n此應用程式讓使用者可以輕鬆地使用其帳號的匯出功能從一個站台遷移至另一個站台。\n\n- **🐱 登入 cat.example.com/nextcloud**\n- **⚙ 到 `個人設定` > `資料遷移`**\n- **☑ 選取您要匯出的東西**(設定、檔案、個人檔案資訊、個人檔案圖片、行事曆、聯絡人等等)\n- **⚙ 開始匯出**並等待伺服器處理\n- **📁 下載名為 `user.nextcloud_export` 的結果檔案**\n- **🐶 在 dog.example.com/nextcloud 上開啟帳號**\n- **🡅 上傳 `user.nextcloud_export` 到您的檔案中**\n- **⚙ 到 `個人設定` > `資料遷移` 並開始匯入**\n- **🎉 享受您的新站台**並關閉您的舊帳號", 19 | "Export queued" : "匯出已排入佇列", 20 | "Export in progress…" : "正在匯出……", 21 | "Export completed successfully" : "匯出成功", 22 | "You will be notified when your export has completed. This may take a while." : "當您的匯出完成時,您將會收到通知。可能需要稍候。", 23 | "This may take a while." : "可能需要稍候。", 24 | "Please do not use your account while exporting." : "請不要在匯出時使用您的帳號。", 25 | "Export" : "匯出", 26 | "Please select the data you want to export" : "請選取您要匯出的資料", 27 | "User information and settings" : "使用者資訊與設定", 28 | "Basic user information including user ID and display name as well as your settings" : "基礎使用者資訊,包含使用者 ID 與顯示名稱,以及您的設定", 29 | "Show export status" : "顯示匯出狀態", 30 | "Show status" : "顯示狀態", 31 | "Cancel export" : "取消匯出", 32 | "Cancel" : "取消", 33 | "Export your data" : "匯出您的資料", 34 | "Estimated size: {estimatedSizeWithUnits}" : "預計大小:{estimatedSizeWithUnits}", 35 | "Close export status" : "關閉匯出狀態", 36 | "Close" : "關閉", 37 | "Choose a file to import" : "選擇要匯入的檔案", 38 | "Import queued" : "匯入已排入佇列", 39 | "Import in progress…" : "正在匯入……", 40 | "Import completed successfully" : "匯入成功", 41 | "You will be notified when your import has completed. This may take a while." : "當您的匯入完成時,您將會收到通知。可能需要稍候。", 42 | "Please do not use your account while importing." : "請不要在匯入時使用您的帳號。", 43 | "Import" : "匯入", 44 | "Please note that existing data may be overwritten" : "請注意,現有資料可能會被覆寫", 45 | "Show import status" : "顯示匯入狀態", 46 | "Cancel import" : "取消匯入", 47 | "Import your data" : "匯入您的資料", 48 | "Close import status" : "關閉匯入狀態" 49 | }, 50 | "nplurals=1; plural=0;"); 51 | -------------------------------------------------------------------------------- /l10n/zh_TW.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Files" : "檔案", 3 | "Files owned by you including versions, comments, collaborative tags, and favorites (versions may expire during export if you are low on storage space)" : "您所擁有的檔案,包含版本、留言、協作標籤與最愛(若您的儲存空間不足,版本可能會在您匯出期間過期)", 4 | "User migration" : "使用者遷移", 5 | "User export failed" : "使用者匯出失敗", 6 | "Your export of {user} failed." : "您的 {user} 匯出失敗。", 7 | "User export done" : "使用者匯出完成", 8 | "Your export of {user} has completed: {file}" : "您對 {user} 的匯出已完成:{file}", 9 | "User import failed" : "使用者匯入失敗", 10 | "Your import to {user} failed." : "您對 {user} 匯入失敗。", 11 | "User import done" : "使用者匯入完成", 12 | "Your import of {file} into {user} has completed." : "您將 {file} 匯入 {user} 已完成。", 13 | "%s (missing)" : "%s(缺少)", 14 | "Data migration" : "資料遷移", 15 | "Migrate user data" : "遷移使用者資料", 16 | "**👤➡ User migration app for Nextcloud**\n\nThis app allows users to easily migrate from one instance to another using an export of their account.\n\n- **🐱 Log in to cat.example.com/nextcloud**\n- **⚙ Go into `Personal settings` > `Data migration`**\n- **☑ Select what you want to export** (settings, files, profile information, profile picture, calendars, contacts…)\n- **⚙ Start the export** and wait for the server to process it\n- **📁 Download the resulting file called `user.nextcloud_export`**\n- **🐶 Open an account on dog.example.com/nextcloud**\n- **🡅 Upload `user.nextcloud_export` into your files**\n- **⚙ Go into `Personal settings` > `Data migration` and start the import**\n- **🎉 Enjoy your stay on your new instance** and close you old account" : "**👤➡ Nextcloud 的使用者遷移應用程式**\n\n此應用程式讓使用者可以輕鬆地使用其帳號的匯出功能從一個站台遷移至另一個站台。\n\n- **🐱 登入 cat.example.com/nextcloud**\n- **⚙ 到 `個人設定` > `資料遷移`**\n- **☑ 選取您要匯出的東西**(設定、檔案、個人檔案資訊、個人檔案圖片、行事曆、聯絡人等等)\n- **⚙ 開始匯出**並等待伺服器處理\n- **📁 下載名為 `user.nextcloud_export` 的結果檔案**\n- **🐶 在 dog.example.com/nextcloud 上開啟帳號**\n- **🡅 上傳 `user.nextcloud_export` 到您的檔案中**\n- **⚙ 到 `個人設定` > `資料遷移` 並開始匯入**\n- **🎉 享受您的新站台**並關閉您的舊帳號", 17 | "Export queued" : "匯出已排入佇列", 18 | "Export in progress…" : "正在匯出……", 19 | "Export completed successfully" : "匯出成功", 20 | "You will be notified when your export has completed. This may take a while." : "當您的匯出完成時,您將會收到通知。可能需要稍候。", 21 | "This may take a while." : "可能需要稍候。", 22 | "Please do not use your account while exporting." : "請不要在匯出時使用您的帳號。", 23 | "Export" : "匯出", 24 | "Please select the data you want to export" : "請選取您要匯出的資料", 25 | "User information and settings" : "使用者資訊與設定", 26 | "Basic user information including user ID and display name as well as your settings" : "基礎使用者資訊,包含使用者 ID 與顯示名稱,以及您的設定", 27 | "Show export status" : "顯示匯出狀態", 28 | "Show status" : "顯示狀態", 29 | "Cancel export" : "取消匯出", 30 | "Cancel" : "取消", 31 | "Export your data" : "匯出您的資料", 32 | "Estimated size: {estimatedSizeWithUnits}" : "預計大小:{estimatedSizeWithUnits}", 33 | "Close export status" : "關閉匯出狀態", 34 | "Close" : "關閉", 35 | "Choose a file to import" : "選擇要匯入的檔案", 36 | "Import queued" : "匯入已排入佇列", 37 | "Import in progress…" : "正在匯入……", 38 | "Import completed successfully" : "匯入成功", 39 | "You will be notified when your import has completed. This may take a while." : "當您的匯入完成時,您將會收到通知。可能需要稍候。", 40 | "Please do not use your account while importing." : "請不要在匯入時使用您的帳號。", 41 | "Import" : "匯入", 42 | "Please note that existing data may be overwritten" : "請注意,現有資料可能會被覆寫", 43 | "Show import status" : "顯示匯入狀態", 44 | "Cancel import" : "取消匯入", 45 | "Import your data" : "匯入您的資料", 46 | "Close import status" : "關閉匯入狀態" 47 | },"pluralForm" :"nplurals=1; plural=0;" 48 | } -------------------------------------------------------------------------------- /lib/AppInfo/Application.php: -------------------------------------------------------------------------------- 1 | registerUserMigrator(FilesMigrator::class); 31 | $context->registerNotifierService(Notifier::class); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/BackgroundJob/UserExportJob.php: -------------------------------------------------------------------------------- 1 | userManager = $userManager; 44 | $this->migrationService = $migrationService; 45 | $this->logger = $logger; 46 | $this->notificationManager = $notificationManager; 47 | $this->mapper = $mapper; 48 | $this->root = $root; 49 | } 50 | 51 | public function run($argument): void { 52 | $id = $argument['id']; 53 | 54 | $export = $this->mapper->getById($id); 55 | $user = $export->getSourceUser(); 56 | $migrators = $export->getMigratorsArray(); 57 | 58 | $userObject = $this->userManager->get($user); 59 | 60 | if (!$userObject instanceof IUser) { 61 | $this->logger->error('Could not export: Unknown user ' . $user); 62 | $this->failedNotication($export); 63 | $this->mapper->delete($export); 64 | return; 65 | } 66 | 67 | try { 68 | $export->setStatus(UserExport::STATUS_STARTED); 69 | $this->mapper->update($export); 70 | $userFolder = $this->root->getUserFolder($user); 71 | $exportDestination = new UserFolderExportDestination($userFolder); 72 | 73 | $this->migrationService->export($exportDestination, $userObject, $migrators); 74 | $this->successNotification($export); 75 | } catch (\Throwable $e) { 76 | $this->logger->error($e->getMessage(), ['exception' => $e]); 77 | $this->failedNotication($export); 78 | } finally { 79 | $this->mapper->delete($export); 80 | } 81 | } 82 | 83 | private function failedNotication(UserExport $export): void { 84 | // Send notification to user 85 | $notification = $this->notificationManager->createNotification(); 86 | $notification->setUser($export->getSourceUser()) 87 | ->setApp(Application::APP_ID) 88 | ->setDateTime($this->time->getDateTime()) 89 | ->setSubject('exportFailed', [ 90 | 'sourceUser' => $export->getSourceUser(), 91 | ]) 92 | ->setObject('export', (string)$export->getId()); 93 | $this->notificationManager->notify($notification); 94 | } 95 | 96 | private function successNotification(UserExport $export): void { 97 | // Send notification to user 98 | $notification = $this->notificationManager->createNotification(); 99 | $notification->setUser($export->getSourceUser()) 100 | ->setApp(Application::APP_ID) 101 | ->setDateTime($this->time->getDateTime()) 102 | ->setSubject('exportDone', [ 103 | 'sourceUser' => $export->getSourceUser(), 104 | ]) 105 | ->setObject('export', (string)$export->getId()); 106 | $this->notificationManager->notify($notification); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /lib/Command/Import.php: -------------------------------------------------------------------------------- 1 | setName('user:import') 33 | ->setDescription('Import a user.') 34 | ->addOption( 35 | 'user', 36 | null, 37 | InputOption::VALUE_REQUIRED, 38 | 'uid of user to overwrite with the imported data' 39 | ) 40 | ->addArgument( 41 | 'archive', 42 | InputArgument::REQUIRED, 43 | 'local path of the export archive to import' 44 | ); 45 | } 46 | 47 | protected function execute(InputInterface $input, OutputInterface $output): int { 48 | $io = new SymfonyStyle($input, $output); 49 | 50 | try { 51 | $path = $input->getArgument('archive'); 52 | if (!file_exists($path)) { 53 | $io->error("File {$path} could not be found"); 54 | $io->writeln('aborted.'); 55 | return self::FAILURE; 56 | } 57 | $uid = $input->getOption('user'); 58 | if (!empty($uid)) { 59 | $user = $this->userManager->get($uid); 60 | if ($user === null) { 61 | $io->error("User <$uid> does not exist"); 62 | return 1; 63 | } else { 64 | $io->warning('A user with this uid already exists!'); 65 | if (!$io->confirm('Do you really want to overwrite this user with the imported data?', false)) { 66 | $io->writeln('aborted.'); 67 | return 1; 68 | } 69 | } 70 | } else { 71 | $user = null; 72 | } 73 | $io->writeln("Importing from {$path}…"); 74 | $importSource = new ImportSource($path); 75 | $this->migrationService->import($importSource, $user, $io); 76 | $io->writeln("Successfully imported from {$path}"); 77 | } catch (\Exception $e) { 78 | if ($io->isDebug()) { 79 | $io->error("$e"); 80 | } else { 81 | $io->error($e->getMessage()); 82 | } 83 | return $e->getCode() !== 0 ? (int)$e->getCode() : 1; 84 | } 85 | 86 | return 0; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /lib/Db/UserExport.php: -------------------------------------------------------------------------------- 1 | addType('sourceUser', Types::STRING); 36 | $this->addType('migrators', Types::STRING); 37 | $this->addType('status', Types::INTEGER); 38 | } 39 | 40 | /** 41 | * Returns the migrators in an array 42 | * @return ?string[] 43 | */ 44 | public function getMigratorsArray(): ?array { 45 | return json_decode($this->migrators, true); 46 | } 47 | 48 | /** 49 | * Set the migrators 50 | * @param ?string[] $migrators 51 | */ 52 | public function setMigratorsArray(?array $migrators): void { 53 | $this->setMigrators(json_encode($migrators)); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/Db/UserExportMapper.php: -------------------------------------------------------------------------------- 1 | 17 | */ 18 | class UserExportMapper extends QBMapper { 19 | public const TABLE_NAME = 'user_export_jobs'; 20 | 21 | public function __construct(IDBConnection $db) { 22 | parent::__construct($db, static::TABLE_NAME, UserExport::class); 23 | } 24 | 25 | public function getById(int $id): UserExport { 26 | $qb = $this->db->getQueryBuilder(); 27 | 28 | $qb->select('*') 29 | ->from($this->getTableName()) 30 | ->where( 31 | $qb->expr()->eq('id', $qb->createNamedParameter($id)) 32 | ); 33 | 34 | return $this->findEntity($qb); 35 | } 36 | 37 | public function getBySourceUser(string $userId): UserExport { 38 | $qb = $this->db->getQueryBuilder(); 39 | 40 | $qb->select('*') 41 | ->from($this->getTableName()) 42 | ->where( 43 | $qb->expr()->eq('source_user', $qb->createNamedParameter($userId)) 44 | ); 45 | 46 | return $this->findEntity($qb); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lib/Db/UserImport.php: -------------------------------------------------------------------------------- 1 | addType('author', Types::STRING); 44 | $this->addType('targetUser', Types::STRING); 45 | $this->addType('path', Types::STRING); 46 | $this->addType('migrators', Types::STRING); 47 | $this->addType('status', Types::INTEGER); 48 | } 49 | 50 | /** 51 | * Returns the migrators in an array 52 | * @return ?string[] 53 | */ 54 | public function getMigratorsArray(): ?array { 55 | return json_decode($this->migrators, true); 56 | } 57 | 58 | /** 59 | * Set the migrators 60 | * @param ?string[] $migrators 61 | */ 62 | public function setMigratorsArray(?array $migrators): void { 63 | $this->setMigrators(json_encode($migrators)); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /lib/Db/UserImportMapper.php: -------------------------------------------------------------------------------- 1 | 17 | */ 18 | class UserImportMapper extends QBMapper { 19 | public const TABLE_NAME = 'user_import_jobs'; 20 | 21 | public function __construct(IDBConnection $db) { 22 | parent::__construct($db, static::TABLE_NAME, UserImport::class); 23 | } 24 | 25 | public function getById(int $id): UserImport { 26 | $qb = $this->db->getQueryBuilder(); 27 | 28 | $qb->select('*') 29 | ->from($this->getTableName()) 30 | ->where( 31 | $qb->expr()->eq('id', $qb->createNamedParameter($id)) 32 | ); 33 | 34 | return $this->findEntity($qb); 35 | } 36 | 37 | public function getByAuthor(string $userId): UserImport { 38 | $qb = $this->db->getQueryBuilder(); 39 | 40 | $qb->select('*') 41 | ->from($this->getTableName()) 42 | ->where( 43 | $qb->expr()->eq('author', $qb->createNamedParameter($userId)) 44 | ); 45 | 46 | return $this->findEntity($qb); 47 | } 48 | 49 | public function getByTargetUser(string $userId): UserImport { 50 | $qb = $this->db->getQueryBuilder(); 51 | 52 | $qb->select('*') 53 | ->from($this->getTableName()) 54 | ->where( 55 | $qb->expr()->eq('target_user', $qb->createNamedParameter($userId)) 56 | ); 57 | 58 | return $this->findEntity($qb); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/Migration/Version00001Date20220411114609.php: -------------------------------------------------------------------------------- 1 | createTable(UserExportMapper::TABLE_NAME); 30 | $table->addColumn('id', Types::BIGINT, [ 31 | 'autoincrement' => true, 32 | 'notnull' => true, 33 | 'length' => 20, 34 | 'unsigned' => true, 35 | ]); 36 | $table->addColumn('source_user', Types::STRING, [ 37 | 'notnull' => true, 38 | 'length' => 64, 39 | ]); 40 | $table->addColumn('migrators', Types::STRING, [ 41 | 'notnull' => false, 42 | 'length' => 4000, 43 | ]); 44 | $table->addColumn('status', Types::SMALLINT, [ 45 | 'notnull' => true, 46 | ]); 47 | $table->setPrimaryKey(['id']); 48 | 49 | return $schema; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/Migration/Version00001Date20220412116131.php: -------------------------------------------------------------------------------- 1 | createTable(UserImportMapper::TABLE_NAME); 31 | $table->addColumn('id', Types::BIGINT, [ 32 | 'autoincrement' => true, 33 | 'notnull' => true, 34 | 'length' => 20, 35 | 'unsigned' => true, 36 | ]); 37 | $table->addColumn('author', Types::STRING, [ 38 | 'notnull' => true, 39 | 'length' => 64, 40 | ]); 41 | $table->addColumn('target_user', Types::STRING, [ 42 | 'notnull' => true, 43 | 'length' => 64, 44 | ]); 45 | $table->addColumn('path', Types::STRING, [ 46 | 'notnull' => true, 47 | 'length' => 4000, 48 | ]); 49 | $table->addColumn('migrators', Types::STRING, [ 50 | 'notnull' => false, 51 | 'length' => 4000, 52 | ]); 53 | $table->addColumn('status', Types::SMALLINT, [ 54 | 'notnull' => true, 55 | ]); 56 | $table->setPrimaryKey(['id']); 57 | 58 | return $schema; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/NotExportableException.php: -------------------------------------------------------------------------------- 1 | urlGenerator->imagePath(Application::APP_ID, 'app-dark.svg'); 27 | } 28 | 29 | public function getID(): string { 30 | return 'migration'; 31 | } 32 | 33 | public function getName(): string { 34 | return $this->l10n->t('Data migration'); 35 | } 36 | 37 | public function getPriority(): int { 38 | return 100; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Settings/Personal/Settings.php: -------------------------------------------------------------------------------- 1 | get($path); 29 | if (!$file instanceof File) { 30 | $file->delete(); 31 | $file = $userFolder->newFile($path); 32 | } 33 | } catch (NotFoundException $e) { 34 | $file = $userFolder->newFile($path); 35 | } 36 | $this->file = $file; 37 | $this->resource = $file->fopen('w'); 38 | parent::__construct($this->resource, $path); 39 | } 40 | 41 | public function close(): void { 42 | // FIXME: $file->fopen() is not triggering the "postWrite" hook on fclose 43 | 44 | // workaround to force refresh the size/mtime: 45 | parent::close(); 46 | if (is_resource($this->resource)) { 47 | fclose($this->resource); 48 | } 49 | $this->file->touch(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/UserFolderImportSource.php: -------------------------------------------------------------------------------- 1 | get($path); 23 | if (!$file instanceof File) { 24 | throw new UserMigrationException("$path is not a valid file"); 25 | } 26 | $this->file = $file; 27 | } catch (NotFoundException $e) { 28 | throw new UserMigrationException("$path not found", 0, $e); 29 | } 30 | $localPath = $this->file->getStorage()->getLocalFile($this->file->getInternalPath()); 31 | parent::__construct($localPath); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "user_migration", 3 | "private": true, 4 | "license": "AGPL-3.0-or-later", 5 | "scripts": { 6 | "build": "webpack --node-env production --progress", 7 | "postbuild": "build-js/npm-post-build.sh", 8 | "dev": "webpack --node-env development --progress", 9 | "watch": "webpack --node-env development --progress --watch", 10 | "serve": "webpack --node-env development serve --progress", 11 | "lint": "eslint --ext .js,.vue src", 12 | "lint:fix": "eslint --ext .js,.vue src --fix", 13 | "stylelint": "stylelint css/*.css css/*.scss src/**/*.scss src/**/*.vue", 14 | "stylelint:fix": "stylelint css/*.css css/*.scss src/**/*.scss src/**/*.vue --fix" 15 | }, 16 | "dependencies": { 17 | "@nextcloud/auth": "^2.5.1", 18 | "@nextcloud/axios": "^2.5.1", 19 | "@nextcloud/capabilities": "^1.2.0", 20 | "@nextcloud/dialogs": "^6.3.0", 21 | "@nextcloud/l10n": "^3.1.0", 22 | "@nextcloud/logger": "^3.0.2", 23 | "@nextcloud/password-confirmation": "^5.3.1", 24 | "@nextcloud/router": "^3.0.1", 25 | "@nextcloud/vue": "^8.26.1", 26 | "vue": "^2.7.16", 27 | "vue-material-design-icons": "^5.3.1" 28 | }, 29 | "devDependencies": { 30 | "@nextcloud/babel-config": "^1.2.0", 31 | "@nextcloud/browserslist-config": "^3.0.1", 32 | "@nextcloud/eslint-config": "^8.4.2", 33 | "@nextcloud/stylelint-config": "^3.1.0", 34 | "@nextcloud/webpack-vue-config": "^6.3.0", 35 | "vue-template-compiler": "^2.7.16" 36 | }, 37 | "browserslist": [ 38 | "extends @nextcloud/browserslist-config" 39 | ], 40 | "homepage": "https://github.com/nextcloud/user_migration", 41 | "repository": { 42 | "url": "https://github.com/nextcloud/user_migration", 43 | "type": "git" 44 | }, 45 | "bugs": { 46 | "url": "https://github.com/nextcloud/user_migration/issues" 47 | }, 48 | "engines": { 49 | "node": "^20.0.0", 50 | "npm": "^10.0.0" 51 | }, 52 | "version": "9.0.0-dev.0" 53 | } 54 | -------------------------------------------------------------------------------- /psalm.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 4 | # SPDX-License-Identifier: AGPL-3.0-or-later 5 | # 6 | # Stop at first error 7 | set -e 8 | 9 | if ! command -v gh > /dev/null; then 10 | echo "Could not find the GitHub CLI, please install it from https://github.com/cli/cli" 11 | exit 1 12 | fi 13 | 14 | # Use version from changelog 15 | version=$(grep '^## \[' CHANGELOG.md|head -n1|cut -d'[' -f2|cut -d']' -f1); 16 | # version=$1 17 | # The target branch, defaults to the current branch 18 | target=${2:-$(git branch --show-current)} 19 | # The tag 20 | tag=v$version 21 | 22 | if ! [[ $version =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-z]+\.[0-9]+)?$ ]]; then 23 | echo "Invalid version, please enter a valid semantic version" 24 | exit 1 25 | fi 26 | 27 | if [[ $(git branch --show-current) != $target ]]; then 28 | if ! git switch $target > /dev/null; then 29 | echo "Target branch does not exist, please enter a valid branch name" 30 | exit 1 31 | fi 32 | fi 33 | 34 | echo "Releasing version $version on branch $target"; 35 | 36 | # Ask for confirmation 37 | read -r -p "Are you sure? [y/N] " input 38 | 39 | case $input in 40 | [yY][eE][sS]|[yY]) 41 | echo "You say Yes" 42 | ;; 43 | [nN][oO]|[nN]) 44 | echo "You say No" 45 | exit 1 46 | ;; 47 | *) 48 | echo "Invalid input..." 49 | exit 1 50 | ;; 51 | esac 52 | 53 | # Ask for confirmation 54 | read -r -p "Create commit and tag? [y/N] " input 55 | 56 | case $input in 57 | [yY][eE][sS]|[yY]) 58 | echo "You say Yes" 59 | 60 | # Bump version in info.xml 61 | sed -i -E "s|^\t.+|\t$version|" appinfo/info.xml 62 | 63 | # Add changed files to git 64 | git add CHANGELOG.md 65 | git add appinfo/info.xml 66 | 67 | # Create commit 68 | git commit --signoff --message $tag 69 | 70 | # Create tag 71 | git tag $tag 72 | 73 | # Show the result 74 | git log -1 -p 75 | ;; 76 | *) 77 | echo "You say No" 78 | ;; 79 | esac 80 | 81 | # Ask for confirmation 82 | read -r -p "Push and draft releases? [y/N] " input 83 | 84 | case $input in 85 | [yY][eE][sS]|[yY]) 86 | echo "You say Yes" 87 | 88 | # Push commit 89 | git push git@github.com:nextcloud/user_migration.git 90 | 91 | # Push tag 92 | git push git@github.com:nextcloud/user_migration.git $tag 93 | git push git@github.com:nextcloud-releases/user_migration.git $tag 94 | 95 | # Draft GitHub releases 96 | gh release create --repo nextcloud/user_migration --draft --generate-notes --target $target --title $tag --verify-tag $tag 97 | gh release create --repo nextcloud-releases/user_migration --draft --generate-notes --title $tag --verify-tag $tag 98 | ;; 99 | *) 100 | echo "You say No" 101 | ;; 102 | esac 103 | 104 | echo "Check and publish the drafted release on https://github.com/nextcloud/user_migration/releases" 105 | echo "Check and publish the drafted release on https://github.com/nextcloud-releases/user_migration/releases" 106 | -------------------------------------------------------------------------------- /screenshots/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/user_migration/89cc6196c0b9506c46f8339bb0c4adb74b2a9bc0/screenshots/export.png -------------------------------------------------------------------------------- /screenshots/export.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /screenshots/exporting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/user_migration/89cc6196c0b9506c46f8339bb0c4adb74b2a9bc0/screenshots/exporting.png -------------------------------------------------------------------------------- /screenshots/exporting.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /screenshots/import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/user_migration/89cc6196c0b9506c46f8339bb0c4adb74b2a9bc0/screenshots/import.png -------------------------------------------------------------------------------- /screenshots/import.png.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /src/personal-settings.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import Vue from 'vue' 7 | import { getRequestToken } from '@nextcloud/auth' 8 | import { translate as t, translatePlural as n } from '@nextcloud/l10n' 9 | 10 | import logger from './shared/logger.js' 11 | import PersonalSettings from './views/Personal/Settings.vue' 12 | 13 | // eslint-disable-next-line camelcase, no-undef 14 | __webpack_nonce__ = btoa(getRequestToken()) 15 | 16 | Vue.prototype.t = t 17 | Vue.prototype.n = n 18 | Vue.prototype.logger = logger 19 | 20 | export default new Vue({ 21 | el: '#personal-settings', 22 | render: h => h(PersonalSettings), 23 | }) 24 | -------------------------------------------------------------------------------- /src/services/migrationService.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import axios from '@nextcloud/axios' 7 | import { confirmPassword } from '@nextcloud/password-confirmation' 8 | import '@nextcloud/password-confirmation/dist/style.css' 9 | import { generateOcsUrl } from '@nextcloud/router' 10 | 11 | import { APP_ID, API_VERSION } from '../shared/constants.js' 12 | import { formatQueryParamArray } from '../shared/utils.js' 13 | 14 | /** 15 | * @return {object} 16 | */ 17 | export const getMigrators = async () => { 18 | const url = generateOcsUrl('/apps/{appId}/api/v{apiVersion}/migrators', { appId: APP_ID, apiVersion: API_VERSION }) 19 | const response = await axios.get(url) 20 | 21 | return response.data.ocs?.data 22 | } 23 | 24 | /** 25 | * @return {object} 26 | */ 27 | export const getStatus = async () => { 28 | const url = generateOcsUrl('/apps/{appId}/api/v{apiVersion}/status', { appId: APP_ID, apiVersion: API_VERSION }) 29 | const response = await axios.get(url) 30 | 31 | return response.data.ocs?.data 32 | } 33 | 34 | /** 35 | * @return {object} 36 | */ 37 | export const cancelJob = async () => { 38 | const url = generateOcsUrl('/apps/{appId}/api/v{apiVersion}/cancel', { appId: APP_ID, apiVersion: API_VERSION }) 39 | 40 | await confirmPassword() 41 | 42 | const response = await axios.put(url) 43 | 44 | return response.data.ocs?.data 45 | } 46 | 47 | /** 48 | * @param {string[]} migrators Array of migrators 49 | * 50 | * @return {object} 51 | */ 52 | export const checkExportability = async (migrators) => { 53 | const url = generateOcsUrl('/apps/{appId}/api/v{apiVersion}/export', { appId: APP_ID, apiVersion: API_VERSION }) + formatQueryParamArray('migrators', migrators) 54 | const response = await axios.get(url) 55 | 56 | return response.data.ocs?.data 57 | } 58 | 59 | /** 60 | * @param {string[]} migrators Array of migrators 61 | * 62 | * @return {object} 63 | */ 64 | export const queueExportJob = async (migrators) => { 65 | const url = generateOcsUrl('/apps/{appId}/api/v{apiVersion}/export', { appId: APP_ID, apiVersion: API_VERSION }) 66 | 67 | await confirmPassword() 68 | 69 | const response = await axios.post(url, { 70 | migrators, 71 | }) 72 | 73 | return response.data.ocs?.data 74 | } 75 | 76 | /** 77 | * @param {string} path Path to file 78 | * 79 | * @return {object} 80 | */ 81 | export const queueImportJob = async (path) => { 82 | const url = generateOcsUrl('/apps/{appId}/api/v{apiVersion}/import', { appId: APP_ID, apiVersion: API_VERSION }) 83 | 84 | await confirmPassword() 85 | 86 | const response = await axios.post(url, { 87 | path, 88 | }) 89 | 90 | return response.data.ocs?.data 91 | } 92 | -------------------------------------------------------------------------------- /src/shared/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | export const APP_ID = 'user_migration' 7 | export const API_VERSION = '1' 8 | -------------------------------------------------------------------------------- /src/shared/logger.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { getLoggerBuilder } from '@nextcloud/logger' 7 | 8 | import { APP_ID } from './constants.js' 9 | 10 | export default getLoggerBuilder() 11 | .setApp(APP_ID) 12 | .detectUser() 13 | .build() 14 | -------------------------------------------------------------------------------- /src/shared/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { showWarning, showError } from '@nextcloud/dialogs' 7 | 8 | import logger from './logger.js' 9 | 10 | /** 11 | * @param {AxiosError|string} error Error or message 12 | * 13 | * @return {string} 14 | */ 15 | const parseMessage = (error) => { 16 | if (typeof error === 'string') { 17 | return error || 'Unknown error' 18 | } 19 | return error.response.data.ocs?.meta?.message || 'Unknown error' 20 | } 21 | 22 | /** 23 | * @param {AxiosError|string} error Error or message 24 | * @param {import('@nextcloud/dialogs/dist/toast').ToastOptions} toastOptions Toast options 25 | * 26 | * @return {void} 27 | */ 28 | export const handleWarning = (error, toastOptions = {}) => { 29 | const message = parseMessage(error) 30 | logger.warn(message, { error }) 31 | showWarning(message, toastOptions) 32 | } 33 | 34 | /** 35 | * @param {AxiosError|string} error Error or message 36 | * @param {import('@nextcloud/dialogs/dist/toast').ToastOptions} toastOptions Toast options 37 | * 38 | * @return {void} 39 | */ 40 | export const handleError = (error, toastOptions = {}) => { 41 | const message = parseMessage(error) 42 | logger.error(message, { error }) 43 | showError(message, toastOptions) 44 | } 45 | 46 | /** 47 | * @param {string} name Name of the query parameter 48 | * @param {string[]} values Array of values 49 | * 50 | * @return {string} 51 | */ 52 | export const formatQueryParamArray = (name, values) => { 53 | if (values.length === 0) { 54 | return `?${name}[]=` 55 | } 56 | 57 | return `?${values.map(value => `${name}[]=${value}`).join('&')}` 58 | } 59 | -------------------------------------------------------------------------------- /src/views/Personal/Settings.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 19 | 20 | 85 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const stylelintConfig = require('@nextcloud/stylelint-config') 7 | 8 | module.exports = stylelintConfig 9 | -------------------------------------------------------------------------------- /templates/settings/personal/settings.php: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /tests/Integration/ExampleTest.php: -------------------------------------------------------------------------------- 1 | assertEquals(true, true); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | ./Integration 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | ./Unit 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/psalm-baseline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/scripts/test_user_migration.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | # 3 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 4 | # SPDX-License-Identifier: AGPL-3.0-or-later 5 | # 6 | # This script exports a user, deletes it and imports it again, and searches for missing data 7 | # It is designed to work with docker setup from https://github.com/juliushaertl/nextcloud-docker-dev 8 | 9 | # Stop at first error 10 | set -e 11 | 12 | user=$1 13 | occ="docker exec /nextcloud_nextcloud_1 occ" 14 | mysqldump="mysqldump --skip-opt -h $(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nextcloud_database-mysql_1) -P 3306 -u nextcloud -pnextcloud" 15 | 16 | # Save state of user and database before migration 17 | 18 | echo "Before Migration" > /tmp/beforeMigration 19 | 20 | echo $occ user:setting $user >> /tmp/beforeMigration 21 | $occ user:setting $user >> /tmp/beforeMigration 22 | 23 | echo $occ user:info $user >> /tmp/beforeMigration 24 | $occ user:info $user >> /tmp/beforeMigration 25 | 26 | echo $occ user:lastseen $user >> /tmp/beforeMigration 27 | $occ user:lastseen $user >> /tmp/beforeMigration 28 | 29 | $mysqldump nextcloud > /tmp/beforeMigration.sql 30 | 31 | # Export user to /tmp and store export path 32 | 33 | export_out=$($occ user:export $user /tmp) 34 | echo "$export_out" 35 | path=$(echo "$export_out"| grep "Moved the export to " | cut -d " " -f5) 36 | 37 | # Delete user 38 | 39 | #~ $occ user:delete $user # occ user:delete is broken so we use OCS api instead 40 | curl -H "OCS-APIRequest: true" -X DELETE http://admin:admin@$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nextcloud_nextcloud_1)/ocs/v1.php/cloud/users/$user 41 | 42 | # Import the user again 43 | 44 | $occ user:import $path 45 | 46 | # Save state of user and database after migration 47 | 48 | echo "After Migration" > /tmp/afterMigration 49 | 50 | echo $occ user:setting $user >> /tmp/afterMigration 51 | $occ user:setting $user >> /tmp/afterMigration 52 | 53 | echo $occ user:info $user >> /tmp/afterMigration 54 | $occ user:info $user >> /tmp/afterMigration 55 | 56 | echo $occ user:lastseen $user >> /tmp/afterMigration 57 | $occ user:lastseen $user >> /tmp/afterMigration 58 | 59 | $mysqldump nextcloud > /tmp/afterMigration.sql 60 | 61 | # Show the differences (hopefully not much) 62 | 63 | diff --side-by-side /tmp/beforeMigration /tmp/afterMigration || true 64 | 65 | # Summary of sql differences ignoring ids 66 | 67 | awk 'NR==FNR{a[$0]=1;next}!a[$0]' /tmp/afterMigration.sql /tmp/beforeMigration.sql | sed -e "s/VALUES ([0-9]*,/VALUES (/"|sort|sed -e 's/,/,\n\t/g' > /tmp/before.sql 68 | awk 'NR==FNR{a[$0]=1;next}!a[$0]' /tmp/beforeMigration.sql /tmp/afterMigration.sql | sed -e "s/VALUES ([0-9]*,/VALUES (/"|sort|sed -e 's/,/,\n\t/g' > /tmp/after.sql 69 | 70 | echo "You can compare /tmp/beforeMigration.sql and /tmp/afterMigration.sql to see raw database changes" 71 | -------------------------------------------------------------------------------- /vendor-bin/cs-fixer/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "nextcloud/coding-standard": "^1.3" 4 | }, 5 | "config": { 6 | "platform": { 7 | "php": "8.1.17" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vendor-bin/phpunit/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "phpunit/phpunit": "^10.5" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /vendor-bin/psalm/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "vimeo/psalm": "^6" 4 | }, 5 | "config": { 6 | "platform": { 7 | "php": "8.1.17" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const path = require('path') 7 | const webpackConfig = require('@nextcloud/webpack-vue-config') 8 | 9 | const buildMode = process.env.NODE_ENV 10 | const isDev = buildMode === 'development' 11 | 12 | // Let webpack determine automatically where it's located 13 | webpackConfig.output.publicPath = 'auto' 14 | 15 | webpackConfig.entry = { 16 | 'personal-settings': path.join(__dirname, 'src', 'personal-settings.js'), 17 | } 18 | 19 | // Generate reuse license files if not in development mode 20 | if (!isDev) { 21 | const WebpackSPDXPlugin = require('./build-js/WebpackSPDXPlugin.js') 22 | webpackConfig.plugins.push(new WebpackSPDXPlugin({ 23 | override: { 24 | select2: 'MIT', 25 | }, 26 | })) 27 | 28 | webpackConfig.optimization.minimizer = [{ 29 | apply: (compiler) => { 30 | // Lazy load the Terser plugin 31 | const TerserPlugin = require('terser-webpack-plugin') 32 | new TerserPlugin({ 33 | extractComments: false, 34 | terserOptions: { 35 | format: { 36 | comments: false, 37 | }, 38 | compress: { 39 | passes: 2, 40 | }, 41 | }, 42 | }).apply(compiler) 43 | }, 44 | }] 45 | } 46 | 47 | module.exports = webpackConfig 48 | --------------------------------------------------------------------------------