diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9563be6125..79126fd658 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,8 +5,7 @@ "immich-server", "redis", "database", - "immich-machine-learning", - "init" + "immich-machine-learning" ], "dockerComposeFile": [ "../docker/docker-compose.dev.yml", diff --git a/.devcontainer/mobile/container-compose-overrides.yml b/.devcontainer/mobile/container-compose-overrides.yml index c0655e50e7..d6cd95018f 100644 --- a/.devcontainer/mobile/container-compose-overrides.yml +++ b/.devcontainer/mobile/container-compose-overrides.yml @@ -12,7 +12,6 @@ services: - server_node_modules:/workspaces/immich/server/node_modules - web_node_modules:/workspaces/immich/web/node_modules - ${UPLOAD_LOCATION}/photos:/data - - ${UPLOAD_LOCATION}/photos/upload:/data/upload - /etc/localtime:/etc/localtime:ro database: diff --git a/.devcontainer/server/container-compose-overrides.yml b/.devcontainer/server/container-compose-overrides.yml index 539caa0dd1..3be5cd8f3f 100644 --- a/.devcontainer/server/container-compose-overrides.yml +++ b/.devcontainer/server/container-compose-overrides.yml @@ -8,8 +8,7 @@ services: - IMMICH_SERVER_URL=http://127.0.0.1:2283/ volumes: !override - ..:/workspaces/immich - - ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data - - ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/data/upload + - ${UPLOAD_LOCATION:-upload-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data - /etc/localtime:/etc/localtime:ro - pnpm-store:/usr/src/app/.pnpm-store - server-node_modules:/usr/src/app/server/node_modules @@ -24,9 +23,6 @@ services: - coverage:/usr/src/app/web/coverage immich-web: env_file: !reset [] - init: - env_file: !reset [] - command: sh -c 'for path in /data /data/upload /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/server/dist /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-1000}:${GID:-1000} "$$path" || true; done' immich-machine-learning: env_file: !reset [] database: @@ -42,7 +38,5 @@ services: redis: env_file: !reset [] volumes: - # Node modules for each service to avoid conflicts and ensure consistent dependencies - upload1-devcontainer-volume: - upload2-devcontainer-volume: + upload-devcontainer-volume: postgres-devcontainer-volume: diff --git a/.devcontainer/server/container-start-backend.sh b/.devcontainer/server/container-start-backend.sh index d0176a7d66..35fa60f89b 100755 --- a/.devcontainer/server/container-start-backend.sh +++ b/.devcontainer/server/container-start-backend.sh @@ -11,7 +11,7 @@ run_cmd pnpm --filter immich install log "Starting Nest API Server" log "" cd "${IMMICH_WORKSPACE}/server" || ( - log "Immich workspace not found"jj + log "Immich workspace not found" exit 1 ) diff --git a/.github/.nvmrc b/.github/.nvmrc index 91d5f6ff8e..442c7587a9 100644 --- a/.github/.nvmrc +++ b/.github/.nvmrc @@ -1 +1 @@ -22.18.0 +22.20.0 diff --git a/.github/labeler.yml b/.github/labeler.yml index c0c52f1d7e..d8923a3035 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -6,7 +6,6 @@ cli: documentation: - changed-files: - any-glob-to-any-file: - - docs/blob/** - docs/docs/** - docs/src/** - docs/static/** diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index aa756a7d08..0bd3b30814 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -34,3 +34,7 @@ The `/api/something` endpoint is now `/api/something-else` - [ ] I have followed naming conventions/patterns in the surrounding code - [ ] All code in `src/services/` uses repositories implementations for database calls, filesystem operations, etc. - [ ] All code in `src/repositories/` is pretty basic/simple and does not have any immich specific logic (that belongs in `src/services/`) + +## Please describe to which degree, if any, an LLM was used in creating this pull request. + +... diff --git a/.github/workflows/build-mobile.yml b/.github/workflows/build-mobile.yml index 71fa358942..0996c8eccb 100644 --- a/.github/workflows/build-mobile.yml +++ b/.github/workflows/build-mobile.yml @@ -32,24 +32,18 @@ jobs: permissions: contents: read outputs: - should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }} + should_run: ${{ steps.check.outputs.should_run }} steps: - - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - - id: found_paths - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - name: Check what should run + id: check + uses: immich-app/devtools/actions/pre-job@5f91b52dfbb92b8d96ca411ab59c896cd59714ca # pre-job-action-v1.1.0 with: filters: | mobile: - 'mobile/**' - workflow: - - '.github/workflows/build-mobile.yml' - - name: Check if we should force jobs to run - id: should_force - run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT" + force-filters: | + - '.github/workflows/build-mobile.yml' + force-events: 'workflow_call,workflow_dispatch' build-sign-android: name: Build and sign Android @@ -57,7 +51,7 @@ jobs: permissions: contents: read # Skip when PR from a fork - if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }} + if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && fromJSON(needs.pre-job.outputs.should_run).mobile == true }} runs-on: mich steps: @@ -79,7 +73,7 @@ jobs: - name: Restore Gradle Cache id: cache-gradle-restore - uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4 + uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: | ~/.gradle/caches @@ -136,7 +130,7 @@ jobs: - name: Save Gradle Cache id: cache-gradle-save - uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4 + uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 if: github.ref == 'refs/heads/main' with: path: | diff --git a/.github/workflows/close-duplicates.yml b/.github/workflows/close-duplicates.yml index 1cc646961b..8470e0e18c 100644 --- a/.github/workflows/close-duplicates.yml +++ b/.github/workflows/close-duplicates.yml @@ -8,8 +8,18 @@ name: Close likely duplicates permissions: {} jobs: + should_run: + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.should_run.outputs.run }} + steps: + - id: should_run + run: echo "run=${{ github.event_name == 'issues' || github.event.discussion.category.name == 'Feature Request' }}" >> $GITHUB_OUTPUT + get_body: runs-on: ubuntu-latest + needs: should_run + if: ${{ needs.should_run.outputs.should_run == 'true' }} env: EVENT: ${{ toJSON(github.event) }} outputs: @@ -22,23 +32,24 @@ jobs: get_checkbox_json: runs-on: ubuntu-latest - needs: get_body + needs: [get_body, should_run] + if: ${{ needs.should_run.outputs.should_run == 'true' }} container: - image: yshavit/mdq:0.8.0@sha256:c69224d34224a0043d9a3ee46679ba4a2a25afaac445f293d92afe13cd47fcea + image: ghcr.io/immich-app/mdq:main@sha256:d8ae47cf2e6cf4e2559bd57a60b73674fe44f897cba2c2bddff2987a05be10a4 outputs: - json: ${{ steps.get_checkbox.outputs.json }} + checked: ${{ steps.get_checkbox.outputs.checked }} steps: - id: get_checkbox env: BODY: ${{ needs.get_body.outputs.body }} run: | - JSON=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes') - echo "json=$JSON" >> $GITHUB_OUTPUT + CHECKED=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes' | jq '.items[0].list[0].checked // false') + echo "checked=$CHECKED" >> $GITHUB_OUTPUT close_and_comment: runs-on: ubuntu-latest - needs: get_checkbox_json - if: ${{ !fromJSON(needs.get_checkbox_json.outputs.json).items[0].list[0].checked }} + needs: [get_checkbox_json, should_run] + if: ${{ needs.should_run.outputs.should_run == 'true' && needs.get_checkbox_json.outputs.checked != 'true' }} permissions: issues: write discussions: write diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index fac8afd8ae..503dd30d9a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -50,7 +50,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,7 +63,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/autobuild@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -76,6 +76,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6e2bcdb84d..09528346fc 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -20,15 +20,11 @@ jobs: permissions: contents: read outputs: - should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }} + should_run: ${{ steps.check.outputs.should_run }} steps: - - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - id: found_paths - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - name: Check what should run + id: check + uses: immich-app/devtools/actions/pre-job@5f91b52dfbb92b8d96ca411ab59c896cd59714ca # pre-job-action-v1.1.0 with: filters: | server: @@ -38,14 +34,11 @@ jobs: - 'i18n/**' machine-learning: - 'machine-learning/**' - workflow: - - '.github/workflows/docker.yml' - - '.github/workflows/multi-runner-build.yml' - - '.github/actions/image-build' - - - name: Check if we should force jobs to run - id: should_force - run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT" + force-filters: | + - '.github/workflows/docker.yml' + - '.github/workflows/multi-runner-build.yml' + - '.github/actions/image-build' + force-events: 'workflow_dispatch,release' retag_ml: name: Re-Tag ML @@ -53,7 +46,7 @@ jobs: permissions: contents: read packages: write - if: ${{ needs.pre-job.outputs.should_run_ml == 'false' && !github.event.pull_request.head.repo.fork }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == false && !github.event.pull_request.head.repo.fork }} runs-on: ubuntu-latest strategy: matrix: @@ -82,7 +75,7 @@ jobs: permissions: contents: read packages: write - if: ${{ needs.pre-job.outputs.should_run_server == 'false' && !github.event.pull_request.head.repo.fork }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == false && !github.event.pull_request.head.repo.fork }} runs-on: ubuntu-latest strategy: matrix: @@ -108,7 +101,7 @@ jobs: machine-learning: name: Build and Push ML needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }} strategy: fail-fast: false matrix: @@ -153,7 +146,7 @@ jobs: server: name: Build and Push Server needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_server == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }} uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1 permissions: contents: read diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 2514ee8639..0879c30386 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -18,32 +18,28 @@ jobs: permissions: contents: read outputs: - should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.found_paths.outputs.open-api == 'true' || steps.should_force.outputs.should_force == 'true' }} + should_run: ${{ steps.check.outputs.should_run }} steps: - - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - id: found_paths - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - name: Check what should run + id: check + uses: immich-app/devtools/actions/pre-job@5f91b52dfbb92b8d96ca411ab59c896cd59714ca # pre-job-action-v1.1.0 with: filters: | docs: - 'docs/**' - workflow: - - '.github/workflows/docs-build.yml' open-api: - 'open-api/immich-openapi-specs.json' - - name: Check if we should force jobs to run - id: should_force - run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT" + force-filters: | + - '.github/workflows/docs-build.yml' + force-events: 'release' + force-branches: 'main' build: name: Docs Build needs: pre-job permissions: contents: read - if: ${{ needs.pre-job.outputs.should_run == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).docs == true }} runs-on: ubuntu-latest defaults: run: diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index c05121ad70..b504b811e3 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -20,7 +20,7 @@ jobs: run: echo 'The triggering workflow did not succeed' && exit 1 - name: Get artifact id: get-artifact - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 with: script: | let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ @@ -38,7 +38,7 @@ jobs: return { found: true, id: matchArtifact.id }; - name: Determine deploy parameters id: parameters - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 env: HEAD_SHA: ${{ github.event.workflow_run.head_sha }} with: @@ -114,7 +114,7 @@ jobs: - name: Load parameters id: parameters - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 env: PARAM_JSON: ${{ needs.checks.outputs.parameters }} with: @@ -125,7 +125,7 @@ jobs: core.setOutput("shouldDeploy", parameters.shouldDeploy); - name: Download artifact - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 env: ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }} with: diff --git a/.github/workflows/fix-format.yml b/.github/workflows/fix-format.yml index 4c7c57e4f0..849de79a47 100644 --- a/.github/workflows/fix-format.yml +++ b/.github/workflows/fix-format.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1 + uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -28,6 +28,9 @@ jobs: token: ${{ steps.generate-token.outputs.token }} persist-credentials: true + - name: Setup pnpm + uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 + - name: Setup Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: @@ -45,7 +48,7 @@ jobs: message: 'chore: fix formatting' - name: Remove label - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 if: always() with: script: | diff --git a/.github/workflows/merge-translations.yml b/.github/workflows/merge-translations.yml new file mode 100644 index 0000000000..d494460320 --- /dev/null +++ b/.github/workflows/merge-translations.yml @@ -0,0 +1,128 @@ +name: Merge translations + +on: + workflow_dispatch: + workflow_call: + secrets: + PUSH_O_MATIC_APP_ID: + required: true + PUSH_O_MATIC_APP_KEY: + required: true + WEBLATE_TOKEN: + required: true + inputs: + skip: + description: 'Skip translations' + required: false + type: boolean + +permissions: {} + +env: + WEBLATE_HOST: 'https://hosted.weblate.org' + WEBLATE_COMPONENT: 'immich/immich' + +jobs: + merge: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Find translation PR + id: find_pr + if: ${{ inputs.skip != true }} + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + + PR=$(gh pr list --repo $GITHUB_REPOSITORY --author weblate --json number,mergeable) + echo "$PR" + + PR_NUMBER=$(echo "$PR" | jq ' + if length == 1 then + .[0].number + else + error("Expected exactly 1 entry, got \(length)") + end + ' 2>&1) || exit 1 + + echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT + echo "Selected PR $PR_NUMBER" + + if ! echo "$PR" | jq -e '.[0].mergeable == "MERGEABLE"'; then + echo "PR is not mergeable" + exit 1 + fi + + - name: Generate a token + id: generate_token + if: ${{ inputs.skip != true }} + uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 + with: + app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} + private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} + + - name: Lock weblate + if: ${{ inputs.skip != true }} + env: + WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }} + run: | + curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/lock/" -d lock=true + + - name: Commit translations + if: ${{ inputs.skip != true }} + env: + WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }} + run: | + curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/repository/" -d operation=commit + curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/repository/" -d operation=push + + - name: Merge PR + id: merge_pr + if: ${{ inputs.skip != true }} + env: + GH_TOKEN: ${{ steps.generate_token.outputs.token }} + PR_NUMBER: ${{ steps.find_pr.outputs.PR_NUMBER }} + run: | + set -euo pipefail + + REVIEW_ID=$(gh api -X POST "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews" --field event='APPROVE' --field body='Automatically merging translations PR' \ + | jq '.id') + echo "REVIEW_ID=$REVIEW_ID" >> $GITHUB_OUTPUT + gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --auto --squash + + - name: Wait for PR to merge + if: ${{ inputs.skip != true }} + env: + GH_TOKEN: ${{ steps.generate_token.outputs.token }} + PR_NUMBER: ${{ steps.find_pr.outputs.PR_NUMBER }} + REVIEW_ID: ${{ steps.merge_pr.outputs.REVIEW_ID }} + run: | + # So we clean up no matter what + set +e + + for i in {1..100}; do + if gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json state | jq -e '.state == "MERGED"'; then + echo "PR merged" + exit 0 + else + echo "PR not merged yet, waiting..." + sleep 6 + fi + done + echo "PR did not merge in time" + gh api -X PUT "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews/$REVIEW_ID/dismissals" --field message='Merge attempt timed out' --field event='DISMISS' + gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --disable-auto + exit 1 + + - name: Unlock weblate + if: ${{ inputs.skip != true }} + env: + WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }} + run: | + curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/lock/" -d lock=false + + - name: Report success + run: | + echo "Workflow completed successfully (or was skipped)" diff --git a/.github/workflows/org-checks.yml b/.github/workflows/org-checks.yml deleted file mode 100644 index 9781dc3b83..0000000000 --- a/.github/workflows/org-checks.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Org Checks - -on: - pull_request_review: - pull_request: - -jobs: - check-approvals: - name: Check for Team/Admin Review - uses: immich-app/devtools/.github/workflows/required-approval.yml@main - permissions: - pull-requests: read - contents: read diff --git a/.github/workflows/org-pr-require-conventional-commit.yml b/.github/workflows/org-pr-require-conventional-commit.yml new file mode 100644 index 0000000000..5e5f84ef39 --- /dev/null +++ b/.github/workflows/org-pr-require-conventional-commit.yml @@ -0,0 +1,12 @@ +name: PR Conventional Commit + +on: + pull_request: + types: [opened, synchronize, reopened, edited] + +jobs: + validate-pr-title: + name: Validate PR Title (conventional commit) + uses: immich-app/devtools/.github/workflows/shared-pr-require-conventional-commit.yml@main + permissions: + pull-requests: write diff --git a/.github/workflows/org-zizmor.yml b/.github/workflows/org-zizmor.yml new file mode 100644 index 0000000000..8510fd85b4 --- /dev/null +++ b/.github/workflows/org-zizmor.yml @@ -0,0 +1,15 @@ +name: Zizmor + +on: + pull_request: + push: + branches: [main] + +jobs: + zizmor: + name: Zizmor + uses: immich-app/devtools/.github/workflows/shared-zizmor.yml@main + permissions: + actions: read + contents: read + security-events: write diff --git a/.github/workflows/pr-require-conventional-commit.yml b/.github/workflows/pr-require-conventional-commit.yml deleted file mode 100644 index 78ba77495c..0000000000 --- a/.github/workflows/pr-require-conventional-commit.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: PR Conventional Commit Validation - -on: - pull_request: - types: [opened, synchronize, reopened, edited] - -permissions: {} - -jobs: - validate-pr-title: - runs-on: ubuntu-latest - permissions: - pull-requests: write - steps: - - name: PR Conventional Commit Validation - uses: ytanikin/PRConventionalCommits@b628c5a234cc32513014b7bfdd1e47b532124d98 # 1.3.0 - with: - task_types: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' - add_label: 'false' diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 70882ea201..8b6dc0af1c 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -10,12 +10,17 @@ on: type: choice options: - 'false' + - major - minor - patch mobileBump: description: 'Bump mobile build number' required: false type: boolean + skipTranslations: + description: 'Skip translations' + required: false + type: boolean concurrency: group: ${{ github.workflow }}-${{ github.ref }}-root @@ -24,15 +29,27 @@ concurrency: permissions: {} jobs: + merge_translations: + uses: ./.github/workflows/merge-translations.yml + with: + skip: ${{ inputs.skipTranslations }} + permissions: + pull-requests: write + secrets: + PUSH_O_MATIC_APP_ID: ${{ secrets.PUSH_O_MATIC_APP_ID }} + PUSH_O_MATIC_APP_KEY: ${{ secrets.PUSH_O_MATIC_APP_KEY }} + WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }} + bump_version: runs-on: ubuntu-latest + needs: [merge_translations] outputs: ref: ${{ steps.push-tag.outputs.commit_long_sha }} permissions: {} # No job-level permissions are needed because it uses the app-token steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1 + uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -42,6 +59,7 @@ jobs: with: token: ${{ steps.generate-token.outputs.token }} persist-credentials: true + ref: main - name: Install uv uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 @@ -93,7 +111,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1 + uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -110,7 +128,7 @@ jobs: name: release-apk-signed - name: Create draft release - uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2 + uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836 # v2.3.3 with: draft: true tag_name: ${{ env.IMMICH_VERSION }} diff --git a/.github/workflows/preview-label.yaml b/.github/workflows/preview-label.yaml index 3ab9fd267f..1d9a0060ad 100644 --- a/.github/workflows/preview-label.yaml +++ b/.github/workflows/preview-label.yaml @@ -24,7 +24,7 @@ jobs: permissions: pull-requests: write steps: - - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 with: script: | github.rest.issues.removeLabel({ diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index d9b8c1fc0d..d30f95422c 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -17,28 +17,23 @@ jobs: permissions: contents: read outputs: - should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }} + should_run: ${{ steps.check.outputs.should_run }} steps: - - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - id: found_paths - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - name: Check what should run + id: check + uses: immich-app/devtools/actions/pre-job@5f91b52dfbb92b8d96ca411ab59c896cd59714ca # pre-job-action-v1.1.0 with: filters: | mobile: - 'mobile/**' - workflow: - - '.github/workflows/static_analysis.yml' - - name: Check if we should force jobs to run - id: should_force - run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT" + force-filters: | + - '.github/workflows/static_analysis.yml' + force-events: 'workflow_dispatch,release' mobile-dart-analyze: name: Run Dart Code Analysis needs: pre-job - if: ${{ needs.pre-job.outputs.should_run == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }} runs-on: ubuntu-latest permissions: contents: read @@ -100,36 +95,10 @@ jobs: - name: Run dart format run: make format - - name: Run dart custom_lint - run: dart run custom_lint + # TODO: Re-enable after upgrading custom_lint + # - name: Run dart custom_lint + # run: dart run custom_lint # TODO: Use https://github.com/CQLabs/dcm-action - name: Run DCM run: dcm analyze lib --fatal-style --fatal-warnings - - zizmor: - name: zizmor - runs-on: ubuntu-latest - permissions: - security-events: write - contents: read - actions: read - steps: - - name: Checkout repository - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - - name: Install the latest version of uv - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 - - - name: Run zizmor 🌈 - run: uvx zizmor --format=sarif . > results.sarif - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 - with: - sarif_file: results.sarif - category: zizmor diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 39b4b12b1a..ffc5b41f73 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,23 +14,11 @@ jobs: permissions: contents: read outputs: - should_run_i18n: ${{ steps.found_paths.outputs.i18n == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_web: ${{ steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_cli: ${{ steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_e2e: ${{ steps.found_paths.outputs.e2e == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_mobile: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }} - should_run_.github: ${{ steps.found_paths.outputs['.github'] == 'true' || steps.should_force.outputs.should_force == 'true' }} # redundant to have should_force but if someone changes the trigger then this won't have to be changed + should_run: ${{ steps.check.outputs.should_run }} steps: - - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - id: found_paths - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - name: Check what should run + id: check + uses: immich-app/devtools/actions/pre-job@5f91b52dfbb92b8d96ca411ab59c896cd59714ca # pre-job-action-v1.1.0 with: filters: | i18n: @@ -50,17 +38,16 @@ jobs: - 'mobile/**' machine-learning: - 'machine-learning/**' - workflow: - - '.github/workflows/test.yml' .github: - '.github/**' - - name: Check if we should force jobs to run - id: should_force - run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT" + force-filters: | + - '.github/workflows/test.yml' + force-events: 'workflow_dispatch' + server-unit-tests: name: Test & Lint Server needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_server == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }} runs-on: ubuntu-latest permissions: contents: read @@ -97,7 +84,7 @@ jobs: cli-unit-tests: name: Unit Test CLI needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }} runs-on: ubuntu-latest permissions: contents: read @@ -137,7 +124,7 @@ jobs: cli-unit-tests-win: name: Unit Test CLI (Windows) needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }} runs-on: windows-latest permissions: contents: read @@ -172,7 +159,7 @@ jobs: web-lint: name: Lint Web needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_web == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }} runs-on: mich permissions: contents: read @@ -209,7 +196,7 @@ jobs: web-unit-tests: name: Test Web needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_web == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }} runs-on: ubuntu-latest permissions: contents: read @@ -243,7 +230,7 @@ jobs: i18n-tests: name: Test i18n needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_i18n == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }} runs-on: ubuntu-latest permissions: contents: read @@ -281,7 +268,7 @@ jobs: e2e-tests-lint: name: End-to-End Lint needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_e2e == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true }} runs-on: ubuntu-latest permissions: contents: read @@ -320,7 +307,7 @@ jobs: server-medium-tests: name: Medium Tests (Server) needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_server == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }} runs-on: ubuntu-latest permissions: contents: read @@ -348,7 +335,7 @@ jobs: e2e-tests-server-cli: name: End-to-End Tests (Server & CLI) needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).server == true || fromJSON(needs.pre-job.outputs.should_run).cli == true }} runs-on: ${{ matrix.runner }} permissions: contents: read @@ -396,7 +383,7 @@ jobs: e2e-tests-web: name: End-to-End Tests (Web) needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).web == true }} runs-on: ${{ matrix.runner }} permissions: contents: read @@ -449,7 +436,7 @@ jobs: mobile-unit-tests: name: Unit Test Mobile needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }} runs-on: ubuntu-latest permissions: contents: read @@ -471,7 +458,7 @@ jobs: ml-unit-tests: name: Unit Test ML needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }} runs-on: ubuntu-latest permissions: contents: read @@ -507,7 +494,7 @@ jobs: github-files-formatting: name: .github Files Formatting needs: pre-job - if: ${{ needs.pre-job.outputs['should_run_.github'] == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run)['.github'] == true }} runs-on: ubuntu-latest permissions: contents: read @@ -569,7 +556,8 @@ jobs: - name: Build the app run: pnpm --filter immich build - name: Run API generation - run: make open-api + run: ./bin/generate-open-api.sh + working-directory: open-api - name: Find file changes uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4 id: verify-changed-files @@ -593,7 +581,7 @@ jobs: contents: read services: postgres: - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:ec713143dca1a426eba2e03707c319e2ec3cc9d304ef767f777f8e297dee820c + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:da52bbead5d818adaa8077c8dcdaad0aaf93038c31ad8348b51f9f0ec1310a4d env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres diff --git a/.github/workflows/weblate-lock.yml b/.github/workflows/weblate-lock.yml index f732fe2a49..d7deb244f9 100644 --- a/.github/workflows/weblate-lock.yml +++ b/.github/workflows/weblate-lock.yml @@ -3,48 +3,52 @@ name: Weblate checks on: pull_request: branches: [main] + types: + - opened + - synchronize + - ready_for_review + - auto_merge_enabled + - auto_merge_disabled permissions: {} +env: + BOT_NAME: immich-push-o-matic + jobs: pre-job: runs-on: ubuntu-latest permissions: contents: read outputs: - should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}} + should_run: ${{ steps.check.outputs.should_run }} steps: - - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - id: found_paths - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - name: Check what should run + id: check + uses: immich-app/devtools/actions/pre-job@5f91b52dfbb92b8d96ca411ab59c896cd59714ca # pre-job-action-v1.1.0 with: filters: | i18n: - 'i18n/!(en)**\.json' + exclude-branches: 'chore/translations' + skip-force-logic: 'true' enforce-lock: name: Check Weblate Lock needs: [pre-job] runs-on: ubuntu-latest permissions: {} - if: ${{ needs.pre-job.outputs.should_run == 'true' }} + if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }} steps: - - name: Check weblate lock + - name: Bot review status + env: + PR_NUMBER: ${{ github.event.pull_request.number || github.event.pull_request_review.pull_request.number }} + GH_TOKEN: ${{ github.token }} run: | - if [[ "false" = $(curl https://hosted.weblate.org/api/components/immich/immich/lock/ | jq .locked) ]]; then - exit 1 - fi - - name: Find Pull Request - uses: juliangruber/find-pull-request-action@952b3bb1ddb2dcc0aa3479e98bb1c2d1a922f096 # v1.10.0 - id: find-pr - with: - branch: chore/translations - - name: Fail if existing weblate PR - if: ${{ steps.find-pr.outputs.number }} - run: exit 1 + # Then check for APPROVED by the bot, if absent fail + gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json reviews | jq -e '.reviews | map(select(.author.login == env.BOT_NAME and .state == "APPROVED")) | length > 0' \ + || (echo "The push-o-matic bot has not approved this PR yet" && exit 1) + success-check-lock: name: Weblate Lock Check Success needs: [enforce-lock] diff --git a/.gitignore b/.gitignore index af85d96c02..3220701cc6 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ mobile/libisar.dylib mobile/openapi/test mobile/openapi/doc mobile/openapi/.openapi-generator/FILES +mobile/ios/build open-api/typescript-sdk/build mobile/android/fastlane/report.xml @@ -25,3 +26,5 @@ mobile/ios/fastlane/report.xml vite.config.js.timestamp-* .pnpm-store +.devcontainer/library +.devcontainer/.env* diff --git a/CODEOWNERS b/CODEOWNERS index cd61814ff8..8759cf2357 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,5 +1,7 @@ /.github/ @bo0tzz /docker/ @bo0tzz /server/ @danieldietzler +/web/ @danieldietzler /machine-learning/ @mertalev /e2e/ @danieldietzler +/mobile/ @shenlong-tanwen diff --git a/Makefile b/Makefile index 31a00ee6be..34fb408c41 100644 --- a/Makefile +++ b/Makefile @@ -1,29 +1,29 @@ -dev: prepare-volumes +dev: @trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --remove-orphans dev-down: docker compose -f ./docker/docker-compose.dev.yml down --remove-orphans -dev-update: prepare-volumes +dev-update: @trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans -dev-scale: prepare-volumes +dev-scale: @trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans -dev-docs: prepare-volumes +dev-docs: npm --prefix docs run start .PHONY: e2e -e2e: prepare-volumes +e2e: @trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --remove-orphans -e2e-update: prepare-volumes +e2e-update: @trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans e2e-down: docker compose -f ./e2e/docker-compose.yml down --remove-orphans -prod: +prod: @trap 'make prod-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.prod.yml up --build -V --remove-orphans prod-down: @@ -33,16 +33,16 @@ prod-scale: @trap 'make prod-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.prod.yml up --build -V --scale immich-server=3 --scale immich-microservices=3 --remove-orphans .PHONY: open-api -open-api: prepare-volumes +open-api: cd ./open-api && bash ./bin/generate-open-api.sh -open-api-dart: prepare-volumes +open-api-dart: cd ./open-api && bash ./bin/generate-open-api.sh dart -open-api-typescript: prepare-volumes +open-api-typescript: cd ./open-api && bash ./bin/generate-open-api.sh typescript -sql: prepare-volumes +sql: pnpm --filter immich run sync:sql attach-server: @@ -60,20 +60,13 @@ VOLUME_DIRS = \ ./e2e/node_modules \ ./docs/node_modules \ ./server/node_modules \ - ./server/dist \ ./open-api/typescript-sdk/node_modules \ ./.github/node_modules \ ./node_modules \ ./cli/node_modules -# create empty directories and chown to current user -prepare-volumes: - @for dir in $(VOLUME_DIRS); do \ - mkdir -p $$dir; \ - done - @if [ -n "$(VOLUME_DIRS)" ]; then \ - chown -R $$(id -u):$$(id -g) $(VOLUME_DIRS); \ - fi +# Include .env file if it exists +-include docker/.env MODULES = e2e server web cli sdk docs .github @@ -150,8 +143,9 @@ clean: find . -name ".svelte-kit" -type d -prune -exec rm -rf '{}' + find . -name "coverage" -type d -prune -exec rm -rf '{}' + find . -name ".pnpm-store" -type d -prune -exec rm -rf '{}' + - command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml rm -v -f || true - command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml rm -v -f || true + command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml down -v --remove-orphans || true + command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml down -v --remove-orphans || true + setup-server-dev: install-server setup-web-dev: install-sdk build-sdk install-web diff --git a/README.md b/README.md index 459cda481c..0b9b008bca 100644 --- a/README.md +++ b/README.md @@ -38,26 +38,25 @@ ภาษาไทย
-## Disclaimer -- ⚠️ The project is under **very active** development. -- ⚠️ Expect bugs and breaking changes. -- ⚠️ **Do not use the app as the only way to store your photos and videos.** -- ⚠️ Always follow [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) backup plan for your precious photos and videos! +> [!WARNING] +> ⚠️ Always follow [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) backup plan for your precious photos and videos! +> + > [!NOTE] > You can find the main documentation, including installation guides, at https://immich.app/. ## Links -- [Documentation](https://immich.app/docs) -- [About](https://immich.app/docs/overview/introduction) -- [Installation](https://immich.app/docs/install/requirements) +- [Documentation](https://docs.immich.app/) +- [About](https://docs.immich.app/overview/introduction) +- [Installation](https://docs.immich.app/install/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Features](#features) -- [Translations](https://immich.app/docs/developer/translations) -- [Contributing](https://immich.app/docs/overview/support-the-project) +- [Translations](https://docs.immich.app/developer/translations) +- [Contributing](https://docs.immich.app/overview/support-the-project) ## Demo @@ -106,7 +105,7 @@ Access the demo [here](https://demo.immich.app). For the mobile app, you can use ## Translations -Read more about translations [here](https://immich.app/docs/developer/translations). +Read more about translations [here](https://docs.immich.app/developer/translations).
-
-## OAuth Integration 🎉
-
-I want to borrow this chance to express my gratitude to [@EnricoBilla](https://github.com/EnricoBilla), who has been the trailblazer for this feature since the beginning days of Immich. His PR has sparked ideas, suggestions, and discussion among the team member on how to integrate this feature successfully into the app. Thank you so much for your work and your time.
-
-OAuth is now integrated into the system. Please follow the guide [here](https://immich.app/docs/usage/oauth) to set up your OAuth integration
-
-After setting up the correct environment variables in the `.env` file, as shown below
-
-| Key | Type | Default | Description |
-| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
-| OAUTH_ENABLED | boolean | false | Enable/disable OAuth2 |
-| OAUTH_ISSUER_URL | URL | (required) | Required. Self-discovery URL for client |
-| OAUTH_CLIENT_ID | string | (required) | Required. Client ID |
-| OAUTH_CLIENT_SECRET | string | (required) | Required. Client Secret |
-| OAUTH_SCOPE | string | openid email profile | Full list of scopes to send with the request (space delimited) |
-| OAUTH_AUTO_REGISTER | boolean | true | When true, will automatically register a user the first time they sign in |
-| OAUTH_BUTTON_TEXT | string | Login with OAuth | Text for the OAuth button on the web |
-
-```bash title="Authentik Example"
-OAUTH_ENABLED=true
-OAUTH_ISSUER_URL=http://10.1.15.216:9000/application/o/immich-test/
-OAUTH_CLIENT_ID=30596v8f78a4b6a97d5985c3076b6b4c4d12ddc33
-OAUTH_CLIENT_SECRET=50f1eafdec353b95b1c638db390db4ab67ef035a51212dbec2f56175e2eb272b5d572c099176e6fe116ecf47ffdd544bgdb9e2edc588307ee0339d25eeccd88
-OAUTH_BUTTON_TEXT=Login with Authentik
-```
-
-The web will have the option to sign in with OAuth.
-
-
-
-The mobile app will check if the server has OAuth enabled before displaying the OAuth
-sign-in button.
-
-
-
-## Support
-
-
-
-If you find the project helpful and it helps you in some ways, you can support the project [one time](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) or [monthly](https://github.com/sponsors/alextran1502) from GitHub Sponsor
-
-It is a great way to let me know that you want me to continue developing and working on this project for years to come.
-
-## Details
-
-For more details, please check out the [release note](https://github.com/immich-app/immich/releases/tag/v1.36.0_55-dev)
diff --git a/docs/blog/2023/06-24/update.mdx b/docs/blog/2023/06-24/update.mdx
deleted file mode 100644
index 464d3e44d9..0000000000
--- a/docs/blog/2023/06-24/update.mdx
+++ /dev/null
@@ -1,103 +0,0 @@
----
-title: Immich Update - June 2023
-authors: [alextran]
-tags: [update]
----
-
-Hello everybody, Alex here!
-
-I am back with another update on Immich. It has been only a month since my last update (May 18th, 2023), but it seems forever. I think the rapid releases of Immich and the amount of work make the perspective of time change in Immich’s world. We have some exciting updates that I think you will like.
-
-Before going into detail, on behalf of the core team, I would like to thank all of you for loving Immich and contributing to the project. Thank you for helping me make Immich an enjoyable alternative solution to Google Photos so that you have complete control of your data and privacy. I know we are still young and have a lot of work to do, but I am confident we will get there with help from the community. I appreciate all of you from the bottom of my heart!
-
-
-
-And now, to the exciting part, what is new in Immich’s world?
-
-- Initial support for existing gallery.
-- Memory feature.
-- Support XMP sidecar.
-- Support more raw formats.
-- Justified layout for web timeline and blurred thumbnail hash.
-- Mechanism to host machine learning on a completely different machine.
-
-## Support for existing gallery
-
-I know this is the most controversial feature when it comes to Immich’s way of ingesting photos and videos. For many users, having to upload photos and videos to Immich is simply not working. We listen, discuss, and digest this feature internally more than you imagine because it is not a simple feature to tackle while keeping the performance and the user experience at the top level, which is Immich’s primary goal.
-
-Thankfully, we have many great contributors and developers that want to make this come true. So we came up with an initial implementation of this feature in the form of a supporting read-only gallery.
-
-To be concise, Immich can now read in the gallery files, register the path into the database, and then generate necessary files and put them through Immich’s machine learning pipeline so you can use all the goodness of Immich without the need to upload them. Since this is the initial implementation, some actions/behavior are not yet supported, and we aim to build toward them in future releases, namely:
-
-- Assets are not automatically synced and must instead be manually synced with the CLI tool.
-- Only new files that are added to the gallery will be detected.
-- Deleted and moved files will not be detected.
-
-## Memory feature
-
-This is considered a fun feature that the team and I wanted to build for so long, but we had to put it off because of the refactoring of the code base. The code base is now in a good enough form to circle back and add more exciting features.
-
-This memory feature is very much similar to GPhotos' implementation of “x years since…”. We are aiming to add more categories of memories in the future, such as “Spotlight of the day” or “Day of the Week highlights”
-
-
-
-This feature is now available on the web and will be ported to the mobile app in the near future.
-
-## Support XMP Sidecar
-
-Immich can now import/upload XMP sidecars from the CLI and use the information as the metadata of assets.
-
-## Support more raw formats.
-
-With the recent updates on the dependencies of Immich, we are now extending and hardening support for multiple raw formats. So users with DSLR or mirrorless cameras can now upload their original files to Immich and have them displayed in high-quality thumbnails on the web and mobile view.
-
-## Justified layout for web timeline and blurred thumbnail hash
-
-This is an aesthetic improvement in user experience when browsing the timeline. Photos and videos are now displayed correctly with perspective orientation, making the browsing experience more pleasurable.
-
-To further improve the browsing experience, we now added a blur hash to the thumbnail, so the transition is more natural with a dreamy fade in effect, similar to how our brain goes from faded to vivid memory
-
-
-
-## Hosting machine learning container on a different machine
-
-With more capabilities Immich is building toward, machine learning will get more powerful and therefore require more resources to run effectively. However, we understand that users might not have the best server resources where they host the Immich instance. Therefore, we changed how machine learning interacts and receives the photos and videos to run through its inference pipeline.
-
-The machine learning container is now a headless system that can run on any machine. As long as your Immich instance can communicate with the system running the machine learning container, it can send the files and receive the required information to make Immich powerful in terms of searching and intelligence. This helps you to utilize a more powerful machine in your home/infrastructure to perform the CPU-intensive tasks while letting Immich only handle the I/O operations for a pleasant and smooth experience.
-
----
-
-So, those are the highlights for the team and the community after a busy month. There are a lot more changes and improvements. I encourage you to read some release notes, starting from version [v1.57.0](https://github.com/immich-app/immich/releases/tag/v1.57.0) to now.
-
-Thank you, and I am asking for your support for the project. I hope to be a full-time maintainer of Immich one day to dedicate myself to the project as my life works for the community and my family. You can find the support channels below:
-
-- Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
-- One-time donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
-- [Liberapay](https://liberapay.com/alex.tran1502/)
-- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
-- Bitcoin: 3QVAb9dCHutquVejeNXitPqZX26Yg5kxb7
-- Give a project a star - the contributors love gazing at the stars and seeing their creations shining in the sky.
-
-Join our friendly [Discord](https://discord.immich.app) to talk and discuss Immich, tech, or anything
-
-Cheer!
-
-Until next time!
-
-Alex
diff --git a/docs/blog/2023/07-29/images/web-shortcuts-panel.png b/docs/blog/2023/07-29/images/web-shortcuts-panel.png
deleted file mode 100644
index 5a16c9f289..0000000000
Binary files a/docs/blog/2023/07-29/images/web-shortcuts-panel.png and /dev/null differ
diff --git a/docs/blog/2023/07-29/update.mdx b/docs/blog/2023/07-29/update.mdx
deleted file mode 100644
index 6d50ddfdc0..0000000000
--- a/docs/blog/2023/07-29/update.mdx
+++ /dev/null
@@ -1,151 +0,0 @@
----
-title: Immich Update - July 2023
-authors: [alextran]
-tags: [update, v1.64.0-v1.71.0]
----
-
-Hello, Immich fans, another month, another milestone. We hope you are staying cool and safe in this scorching hot summer across the globe.
-
-Immich recently got some good recognition when getting to the front page of HackerNews, which helped to let more people know about the project's existence. The project will help more and more people find a solution to control the privacy of their most precious moments. And with the gain in popularity and recognition, we have gotten new users and more questions from the community than ever.
-
-I want to express my gratitude to all the contributors and the community who have been tremendously helpful to new users' questions and provided technical support.
-
-Below are the highlights of new features we added to the application over the past month, along with countless bug fixes and improvements across the board, from developer experience to resource optimization and UI/UX improvement. I hope you find these topics as exciting as I am.
-
-## Highlights
-
-- Memories feature.
-- Facial recognition improvements.
-- Improvements on multi selection behavior on the web.
-- Shortcuts for common actions on the web.
-- Support viewer for 360-panorama photos.
-
-
-
----
-
-### Memories feature
-
-We've added the memory feature on the mobile app, so you can reminisce about your past memories.
-
-
-
-### Facial recognition improvements
-
-Over the past few releases, we have added many UI improvements to the facial recognition feature to help you manage the recognized people better. Some of the highlights:
-
-#### Choose a new feature photo for a person.
-
-
-
-#### Hide and show faces.
-
-You can now select irrelevant faces to hide them. The hidden faces won’t be displayed in search results and the people section in the info panel.
-
-#### Merge faces.
-
-This is useful when you have multiple faces of the same person in your photos, and you want to merge them into one.
-
-
-
-We also added a nifty mechanism that when naming a face, similar names will prompt you a merge face option for the convenience.
-
-
-
-### Improvements on multi selection behavior on the web
-
-We have added a new multi selection behavior on the web to help you select multiple items easier. You can now select a range of photos and videos by holding the `Shift` key.
-
-
-
-### Shortcuts for common actions on the web.
-
-Some of us only navigate the world and the web with a keyboard (looking at you, Vim and Emacs users). So it would take away the sacred weapon of choice to require many clicks to perform repetitive actions. So we added quick shortcuts for the following action on the web.
-
-
-
-### Support viewer for 360-panorama photos.
-
-Photos with the EXIF property of `ProjectionType` will now have a special viewer on the web to view all the angles of the panorama.
-
-The thumbnail of the 360 degrees panoramas will have a special icon on the top right of the thumbnail
-
-
-
-
:::note
-Some jobs ([External Libraries](/docs/features/libraries) scanning, Database Dump) are configured in their own sections in System Settings.
+Some jobs ([External Libraries](/features/libraries) scanning, Database Dump) are configured in their own sections in System Settings.
:::
diff --git a/docs/docs/administration/oauth.md b/docs/docs/administration/oauth.md
index 55a0ce9469..47f4a96c6a 100644
--- a/docs/docs/administration/oauth.md
+++ b/docs/docs/administration/oauth.md
@@ -28,7 +28,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured
2. Configure Redirect URIs/Origins
The **Sign-in redirect URIs** should include:
- - `app.immich:///oauth-callback` - for logging in with OAuth from the [Mobile App](/docs/features/mobile-app.mdx)
+ - `app.immich:///oauth-callback` - for logging in with OAuth from the [Mobile App](/features/mobile-app.mdx)
- `http://DOMAIN:PORT/auth/login` - for logging in with OAuth from the Web Client
- `http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client
@@ -98,7 +98,7 @@ The redirect URI for the mobile app is `app.immich:///oauth-callback`, which is
2. Whitelist the new endpoint as a valid redirect URI with your provider.
3. Specify the new endpoint as the `Mobile Redirect URI Override`, in the OAuth settings.
-With these steps in place, you should be able to use OAuth from the [Mobile App](/docs/features/mobile-app.mdx) without a custom scheme redirect URI.
+With these steps in place, you should be able to use OAuth from the [Mobile App](/features/mobile-app.mdx) without a custom scheme redirect URI.
:::info
Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:///oauth-callback`, and can be used for step 1.
diff --git a/docs/docs/administration/server-commands.md b/docs/docs/administration/server-commands.md
index a25673abf2..3838635c24 100644
--- a/docs/docs/administration/server-commands.md
+++ b/docs/docs/administration/server-commands.md
@@ -16,7 +16,7 @@ The `immich-server` docker image comes preinstalled with an administrative CLI (
## How to run a command
-To run a command, [connect](/docs/guides/docker-help.md#attach-to-a-container) to the `immich_server` container and then execute the command via `immich-admin
diff --git a/docs/docs/features/sharing.md b/docs/docs/features/sharing.md
index ff0a03beea..9ba7470407 100644
--- a/docs/docs/features/sharing.md
+++ b/docs/docs/features/sharing.md
@@ -24,7 +24,7 @@ After creating an album, you can access the sharing options by clicking on the s
Partner sharing allows you to share your _entire_ library with other users of your choice. They can then view your library and download the assets.
-You can read this guide to learn more about [partner sharing](/docs/features/partner-sharing).
+You can read this guide to learn more about [partner sharing](/features/partner-sharing).
## Public sharing
diff --git a/docs/docs/features/tags.md b/docs/docs/features/tags.md
index ca663e9edd..79a9696d9a 100644
--- a/docs/docs/features/tags.md
+++ b/docs/docs/features/tags.md
@@ -1,6 +1,6 @@
# Tags
-Immich supports hierarchical tags, with the ability to read existing tags from the `TagList` and `Keywords` EXIF properties. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
+Immich supports hierarchical tags, with the ability to read existing tags from the XMP `TagsList` field and IPTC `Keywords` field. Any changes to tags made through Immich are also written back to a [sidecar](/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
## Enable tags feature
diff --git a/docs/docs/features/user-settings.md b/docs/docs/features/user-settings.md
index a2d0308541..402105cd43 100644
--- a/docs/docs/features/user-settings.md
+++ b/docs/docs/features/user-settings.md
@@ -15,9 +15,9 @@ You can access the [user settings](https://my.immich.app/user-settings) by click
---
:::tip Reset Password
-The admin can reset a user password through the [User Management](/docs/administration/user-management.mdx) screen.
+The admin can reset a user password through the [User Management](/administration/user-management.mdx) screen.
:::
:::tip Reset Admin Password
-The admin password can be reset using a [Server Command](/docs/administration/server-commands.md)
+The admin password can be reset using a [Server Command](/administration/server-commands.md)
:::
diff --git a/docs/docs/features/xmp-sidecars.md b/docs/docs/features/xmp-sidecars.md
index 98ce8782e6..3536777d8a 100644
--- a/docs/docs/features/xmp-sidecars.md
+++ b/docs/docs/features/xmp-sidecars.md
@@ -1,13 +1,68 @@
# XMP Sidecars
-Immich can ingest XMP sidecars on file upload (via the CLI) as well as detect new sidecars that are placed in the filesystem for existing images.
+Immich supports XMP sidecar files — external `.xmp` files that store metadata for an image or video in XML format. During the metadata extraction job Immich will read & import metadata from `.xmp` files, and during the Sidecar Write job it will _write_ metadata back to `.xmp`.
-
+:::tip
+Tools like Lightroom, Darktable, digiKam and other applications can also be configured to write changes to `.xmp` files, in order to avoid modifying the original file.
+:::
-XMP sidecars are external XML files that contain metadata related to media files. Many applications read and write these files either exclusively or in addition to the metadata written to image files. They can be a powerful tool for editing and storing metadata of a media file without modifying the media file itself. When Immich receives or detects an XMP sidecar for a media file, it will attempt to extract the metadata from both the sidecar as well as the media file. It will prioritize the metadata for fields in the sidecar but will fall back and use the metadata in the media file if necessary.
+## Metadata Fields
-When importing files via the CLI bulk uploader or parsing photo metadata for external libraries, Immich will automatically detect XMP sidecar files as files that exist next to the original media file. Immich will look files that have the same name as the photo, but with the `.xmp` file extension. The same name can either include the photo's file extension or without the photo's file extension. For example, for a photo named `PXL_20230401_203352928.MP.jpg`, Immich will look for an XMP file named either `PXL_20230401_203352928.MP.jpg.xmp` or `PXL_20230401_203352928.MP.xmp`. If both `PXL_20230401_203352928.MP.jpg.xmp` and `PXL_20230401_203352928.MP.xmp` are present, Immich will prefer `PXL_20230401_203352928.MP.jpg.xmp`.
+Immich does not support _all_ metadata fields. Below is a table showing what fields Immich can _read_ and _write_. It's important to note that writes do not replace the entire file contents, but are merged together with any existing fields.
-There are 2 administrator jobs associated with sidecar files: `SYNC` and `DISCOVER`. The sync job will re-scan all media with existing sidecar files and queue them for a metadata refresh. This is a great use case when third-party applications are used to modify the metadata of media. The discover job will attempt to scan the filesystem for new sidecar files for all media that does not currently have a sidecar file associated with it.
+:::info
+Immich automatically queues a Sidecar Write job after editing the description, rating, or updating tags.
+:::
-
+| Metadata | Immich writes to XMP | Immich reads from XMP |
+| --------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Description** | `dc:description`, `tiff:ImageDescription` | `dc:description`, `tiff:ImageDescription` |
+| **Rating** | `xmp:Rating` | `xmp:Rating` |
+| **DateTime** | `exif:DateTimeOriginal`, `photoshop:DateCreated` | In prioritized order:
-
-## Welcome!
-
-Hello, I am glad you are here.
-
-My name is Alex. I am an Electrical Engineer by schooling, then turned into a Software Engineer by trade and the pure love of problem solving.
-
-We were lying in bed with our newborn, and my wife said, "We are starting to accumulate a lot of photos and videos of our baby, and I don't want to pay for **_App-Which-Must-Not-Be-Named_** anymore. You always want to build something for me, so why don't you build me an app which can do that?"
-
-That was how the idea started to grow in my head. After that, I began to find existing solutions in the self-hosting space with similar backup functionality and the performance level of the **_App-Which-Must-Not-Be-Named_**. I found that the current solutions mainly focus on the gallery-type application. However, I want a simple-to-use backup tool with a native mobile app that can view photos and videos efficiently. So I set sail on this journey as a hungry engineer on the hunt.
-
-Another motivation that pushed me to deliver my execution of the **_App-Which-Must-Not-Be-Named_** alternative or replacement is for contributing back to the open source community that I have greatly benefited from over the years.
-
-I'm proud to share this creation with you, which values privacy, memories, and the joy of looking back at those moments in an easy-to-use and friendly interface.
-
-If you like the application or it helps you in some way, please consider [supporting](./support-the-project.md) the project. It will help me to continue to develop and maintain the application.
diff --git a/docs/docs/partials/_server-backup.md b/docs/docs/partials/_server-backup.md
index b9479600aa..34e09670e9 100644
--- a/docs/docs/partials/_server-backup.md
+++ b/docs/docs/partials/_server-backup.md
@@ -1,7 +1,6 @@
Now that you have imported some pictures, you should setup server backups to preserve your memories.
-You can do so by following our [backup guide](/docs/administration/backup-and-restore.md).
+You can do so by following our [backup guide](/administration/backup-and-restore.md).
-:::danger
-Immich is still under heavy development _and_ handles very important data.
-It is essential that you set up good backups, and test them.
+:::info
+A 3-2-1 backup strategy is still crucial. The team has the responsibility to ensure that the application doesn’t cause loss of your precious memories; however, we cannot guarantee that hard drives will not fail, or an electrical event causes unexpected shutdown of your server/system, leading to data loss. Therefore, we still encourage users to follow best practices when safeguarding their data. Keep multiple copies of your most precious data: at least two local copies and one copy offsite in cold storage.
:::
diff --git a/docs/docs/partials/_storage-template.md b/docs/docs/partials/_storage-template.md
index 20e9caac43..84236e0ac1 100644
--- a/docs/docs/partials/_storage-template.md
+++ b/docs/docs/partials/_storage-template.md
@@ -1,7 +1,7 @@
-Immich allows the admin user to set the uploaded filename pattern at the directory and filename level as well as the [storage label for a user](/docs/administration/user-management/#set-storage-label-for-user).
+Immich allows the admin user to set the uploaded filename pattern at the directory and filename level as well as the [storage label for a user](/administration/user-management/#set-storage-label-for-user).
:::tip
-You can read more about the differences between storage template engine on and off [here](/docs/administration/backup-and-restore#asset-types-and-storage-locations)
+You can read more about the differences between storage template engine on and off [here](/administration/backup-and-restore#asset-types-and-storage-locations)
:::
The admin user can set the template by using the template builder in the `Administration -> Settings -> Storage Template`. Immich provides a set of variables that you can use in constructing the template, along with additional custom text. If the template produces [multiple files with the same filename, they won't be overwritten](https://github.com/immich-app/immich/discussions/3324) as a sequence number is appended to the filename.
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
index d612dda253..70e0189a00 100644
--- a/docs/docusaurus.config.js
+++ b/docs/docusaurus.config.js
@@ -7,7 +7,7 @@ const prism = require('prism-react-renderer');
const config = {
title: 'Immich',
tagline: 'High performance self-hosted photo and video backup solution directly from your mobile phone',
- url: 'https://immich.app',
+ url: 'https://docs.immich.app',
baseUrl: '/',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
@@ -42,26 +42,19 @@ const config = {
],
presets: [
[
- 'docusaurus-preset-openapi',
- /** @type {import('docusaurus-preset-openapi').Options} */
+ 'classic',
+ /** @type {import('@docusaurus/preset-classic').Options} */
({
docs: {
showLastUpdateAuthor: true,
showLastUpdateTime: true,
+ routeBasePath: '/',
sidebarPath: require.resolve('./sidebars.js'),
// Please change this to your repo.
// Remove this to remove the "edit this page" links.
editUrl: 'https://github.com/immich-app/immich/tree/main/docs/',
},
- api: {
- path: '../open-api/immich-openapi-specs.json',
- routeBasePath: '/docs/api',
- },
- // blog: {
- // showReadingTime: true,
- // editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
- // },
theme: {
customCss: require.resolve('./src/css/custom.css'),
},
@@ -72,11 +65,6 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
- announcementBar: {
- id: 'site_announcement_immich',
- content: `⚠️ The project is under very active development. Expect bugs and changes. Do not use it as the only way to store your photos and videos!`,
- isCloseable: false,
- },
docs: {
sidebar: {
autoCollapseCategories: false,
@@ -95,17 +83,17 @@ const config = {
position: 'right',
},
{
- to: '/docs/overview/welcome',
+ to: '/overview/quick-start',
position: 'right',
label: 'Docs',
},
{
- to: '/roadmap',
+ href: 'https://immich.app/roadmap',
position: 'right',
label: 'Roadmap',
},
{
- to: '/docs/api',
+ href: 'https://api.immich.app/',
position: 'right',
label: 'API',
},
@@ -139,16 +127,16 @@ const config = {
title: 'Overview',
items: [
{
- label: 'Welcome',
- to: '/docs/overview/welcome',
+ label: 'Quick start',
+ to: '/overview/quick-start',
},
{
label: 'Installation',
- to: '/docs/install/requirements',
+ to: '/install/requirements',
},
{
label: 'Contributing',
- to: '/docs/overview/support-the-project',
+ to: '/overview/support-the-project',
},
{
label: 'Privacy Policy',
@@ -161,15 +149,15 @@ const config = {
items: [
{
label: 'Roadmap',
- to: '/roadmap',
+ href: 'https://immich.app/roadmap',
},
{
label: 'API',
- to: '/docs/api',
+ href: 'https://api.immich.app/',
},
{
label: 'Cursed Knowledge',
- to: '/cursed-knowledge',
+ href: 'https://immich.app/cursed-knowledge',
},
],
},
diff --git a/docs/package.json b/docs/package.json
index 7fbcbada5a..d984427622 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -24,10 +24,7 @@
"@mdi/react": "^1.6.1",
"@mdx-js/react": "^3.0.0",
"autoprefixer": "^10.4.17",
- "classnames": "^2.3.2",
- "clsx": "^2.0.0",
"docusaurus-lunr-search": "^3.3.2",
- "docusaurus-preset-openapi": "^0.7.5",
"lunr": "^2.3.9",
"postcss": "^8.4.25",
"prism-react-renderer": "^2.3.1",
@@ -60,6 +57,6 @@
"node": ">=20"
},
"volta": {
- "node": "22.18.0"
+ "node": "22.20.0"
}
}
diff --git a/docs/src/components/community-guides.tsx b/docs/src/components/community-guides.tsx
index 49ba7a8a08..08c8e096d9 100644
--- a/docs/src/components/community-guides.tsx
+++ b/docs/src/components/community-guides.tsx
@@ -28,6 +28,12 @@ const guides: CommunityGuidesProps[] = [
description: `synchronize folders in imported library with albums having the folders name.`,
url: 'https://github.com/immich-app/immich/discussions/3382',
},
+ {
+ title: 'Immich Podman Quadlets Handbook',
+ description:
+ 'A rewrite of the original Immich Docker Compose file using Podman Quadlets, with a set of extra guides in the repository’s wiki.',
+ url: 'https://github.com/linux-universe/immich-podman-quadlets/blob/main/README.md',
+ },
{
title: 'Podman/Quadlets Install',
description: 'Documentation for simple podman setup using quadlets.',
diff --git a/docs/src/components/community-projects.tsx b/docs/src/components/community-projects.tsx
index 46e28b3b76..efce831df0 100644
--- a/docs/src/components/community-projects.tsx
+++ b/docs/src/components/community-projects.tsx
@@ -105,6 +105,21 @@ const projects: CommunityProjectProps[] = [
description: 'Speed up your machine learning by load balancing your requests to multiple computers',
url: 'https://github.com/apetersson/immich_ml_balancer',
},
+ {
+ title: 'Immich Drop Uploader',
+ description: 'A tiny, zero-login web app for collecting photos/videos from anyone into your Immich server.',
+ url: 'https://github.com/Nasogaa/immich-drop',
+ },
+ {
+ title: 'Immich Birthday Sync',
+ description: 'Bulk-upload and -download birthdays, with CardDAV sync support',
+ url: 'https://github.com/sid3windr/immich-birthday',
+ },
+ {
+ title: 'Immich Stack',
+ description: 'Auto-stack photos with identical filenames and differing extensions (i.e. JPG+RAW)',
+ url: 'https://github.com/sid3windr/immich-stack',
+ },
];
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {
diff --git a/docs/src/components/version-switcher.tsx b/docs/src/components/version-switcher.tsx
index 5cb23891aa..739d7bd001 100644
--- a/docs/src/components/version-switcher.tsx
+++ b/docs/src/components/version-switcher.tsx
@@ -11,7 +11,7 @@ export default function VersionSwitcher(): JSX.Element {
useEffect(() => {
async function getVersions() {
try {
- let baseUrl = 'https://immich.app';
+ let baseUrl = 'https://docs.immich.app';
if (window.location.origin === 'http://localhost:3005') {
baseUrl = window.location.origin;
}
@@ -21,12 +21,13 @@ export default function VersionSwitcher(): JSX.Element {
const archiveVersions = await response.json();
const allVersions = [
- { label: 'Next', url: 'https://main.preview.immich.app' },
- { label: 'Latest', url: 'https://immich.app' },
+ { label: 'Next', url: 'https://docs.main.preview.immich.app' },
+ { label: 'Latest', url: 'https://docs.immich.app' },
...archiveVersions,
- ].map(({ label, url }) => ({
+ ].map(({ label, url, rootPath }) => ({
label,
url: new URL(url),
+ rootPath,
}));
setVersions(allVersions);
@@ -50,12 +51,18 @@ export default function VersionSwitcher(): JSX.Element {
className="version-switcher-34ab39"
label={activeLabel}
mobile={windowSize === 'mobile'}
- items={versions.map(({ label, url }) => ({
- label,
- to: new URL(location.pathname + location.search + location.hash, url).href,
- target: '_self',
- className: label === activeLabel ? 'dropdown__link--active menu__link--active' : '', // workaround because React Router `- Cursed knowledge we have learned as a result of building Immich that we wish we never knew. -
-- Self-hosted{' '} - - photo and - video management{' '} - - solution -
- -- Easily back up, organize, and manage your photos on your own server. Immich helps you - browse, search and organize your photos and videos with ease, without - sacrificing your privacy. -
-Download the mobile app
-- Download the Immich app and start backing up your photos and videos securely to your own server -
-This project is available under GNU AGPL v3 license.
-Privacy should not be a luxury
-{description}
-{label} è l'etichetta di archiviazione dell'utente",
"system_settings": "Impostazioni di sistema",
@@ -283,7 +291,7 @@
"template_email_invite_album": "Modello di invito all'album",
"template_email_preview": "Anteprima",
"template_email_settings": "Template Email",
- "template_email_update_album": "Modello di aggiornamento dell'album",
+ "template_email_update_album": "Aggiorna template dell'album",
"template_email_welcome": "Modello di email di benvenuto",
"template_settings": "Templates Notifiche",
"template_settings_description": "Gestisci i modelli personalizzati per le notifiche",
@@ -387,15 +395,15 @@
"admin_password": "Password Amministratore",
"administration": "Amministrazione",
"advanced": "Avanzate",
- "advanced_settings_beta_timeline_subtitle": "Prova la nuova esperienza dell'app",
- "advanced_settings_beta_timeline_title": "Timeline beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Usa questa opzione per filtrare i contenuti multimediali durante la sincronizzazione in base a criteri alternativi. Prova questa opzione solo se riscontri problemi con il rilevamento di tutti gli album da parte dell'app.",
"advanced_settings_enable_alternate_media_filter_title": "[SPERIMENTALE] Usa un filtro alternativo per la sincronizzazione degli album del dispositivo",
"advanced_settings_log_level_title": "Livello log: {level}",
- "advanced_settings_prefer_remote_subtitle": "Alcuni dispositivi sono molto lenti a caricare le anteprime delle immagini locali. Attivare questa impostazione per caricare invece le immagini remote.",
+ "advanced_settings_prefer_remote_subtitle": "Alcuni dispositivi sono estremamente lenti a caricare le miniature da risorse locali. Attiva questa impostazione per caricare invece le immagini remote.",
"advanced_settings_prefer_remote_title": "Preferisci immagini remote",
"advanced_settings_proxy_headers_subtitle": "Definisci gli header per i proxy che Immich dovrebbe inviare con ogni richiesta di rete",
"advanced_settings_proxy_headers_title": "Header Proxy",
+ "advanced_settings_readonly_mode_subtitle": "Abilita la modalità di sola lettura in cui le foto possono essere solo visualizzate, mentre funzioni come la selezione di più immagini, la condivisione, la trasmissione e l'eliminazione sono tutte disabilitate. Abilita/Disabilita la sola lettura tramite l'avatar dell'utente dalla schermata principale",
+ "advanced_settings_readonly_mode_title": "Modalità di sola lettura",
"advanced_settings_self_signed_ssl_subtitle": "Salta la verifica dei certificati SSL del server. Richiesto con l'uso di certificati self-signed.",
"advanced_settings_self_signed_ssl_title": "Consenti certificati SSL self-signed",
"advanced_settings_sync_remote_deletions_subtitle": "Rimuovi o ripristina automaticamente un elemento su questo dispositivo quando l'azione è stata fatta via web",
@@ -423,6 +431,7 @@
"album_remove_user_confirmation": "Sicuro di voler rimuovere l'utente {user}?",
"album_search_not_found": "Nessun album trovato corrispondente alla tua ricerca",
"album_share_no_users": "Sembra che tu abbia condiviso questo album con tutti gli utenti oppure non hai nessun utente con cui condividere.",
+ "album_summary": "Sommario Album",
"album_updated": "Album aggiornato",
"album_updated_setting_description": "Ricevi una notifica email quando un album condiviso ha nuovi media",
"album_user_left": "{album} abbandonato",
@@ -461,6 +470,7 @@
"app_bar_signout_dialog_title": "Disconnetti",
"app_settings": "Impostazioni Applicazione",
"appears_in": "Compare in",
+ "apply_count": "Applica ({count, number})",
"archive": "Archivio",
"archive_action_prompt": "Aggiunti {count} elementi all'Archivio",
"archive_or_unarchive_photo": "Archivia o ripristina foto",
@@ -493,6 +503,8 @@
"asset_restored_successfully": "Elemento ripristinato con successo",
"asset_skipped": "Saltato",
"asset_skipped_in_trash": "Nel cestino",
+ "asset_trashed": "Asset cestinato",
+ "asset_troubleshoot": "Risoluzione dei problemi dell'asset",
"asset_uploaded": "Caricato",
"asset_uploading": "Caricamento…",
"asset_viewer_settings_subtitle": "Gestisci le impostazioni del visualizzatore della galleria",
@@ -502,6 +514,7 @@
"assets_added_to_album_count": "{count, plural, one {# asset aggiunto} other {# asset aggiunti}} all'album",
"assets_added_to_albums_count": "Aggiunto {assetTotal, plural, one {# elemento} other {# elementi}} a {albumTotal, plural, one {# album} other {# album}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {L'elemento} other {Gli elementi}} non possono essere aggiunti all'album",
+ "assets_cannot_be_added_to_albums": "Non é stato possibile aggiungere {count, plural, one {l'elemento} other {gli elementi}} a nessun album",
"assets_count": "{count, plural, one {# elemento} other {# elementi}}",
"assets_deleted_permanently": "{count} elementi cancellati definitivamente",
"assets_deleted_permanently_from_server": "{count} elementi cancellati definitivamente dal server Immich",
@@ -518,14 +531,17 @@
"assets_trashed_count": "{count, plural, one {Spostato # asset} other {Spostati # assets}} nel cestino",
"assets_trashed_from_server": "{count} elementi cestinati dal server Immich",
"assets_were_part_of_album_count": "{count, plural, one {L'asset era} other {Gli asset erano}} già parte dell'album",
+ "assets_were_part_of_albums_count": "{count, plural, one {L'elemento fa} other {Gli elementi fanno}} già parte degli album",
"authorized_devices": "Dispositivi autorizzati",
"automatic_endpoint_switching_subtitle": "Connetti localmente alla rete Wi-Fi specificata, se disponibile; altrimenti utilizza connessioni alternative",
"automatic_endpoint_switching_title": "Cambio automatico di URL",
"autoplay_slideshow": "Avvio automatico presentazione",
"back": "Indietro",
"back_close_deselect": "Indietro, chiudi o deseleziona",
+ "background_backup_running_error": "Il backup in background è attualmente in esecuzione, impossibile avviare il backup manuale",
"background_location_permission": "Permesso di localizzazione in background",
"background_location_permission_content": "Per fare in modo che sia possibile cambiare rete quando è in esecuzione in background, Immich deve *sempre* avere accesso alla tua posizione precisa in modo da poter leggere il nome della rete Wi-Fi",
+ "background_options": "Opzioni sfondo",
"backup": "Backup",
"backup_album_selection_page_albums_device": "Album sul dispositivo ({count})",
"backup_album_selection_page_albums_tap": "Tap per includere, doppio tap per escludere",
@@ -533,6 +549,7 @@
"backup_album_selection_page_select_albums": "Seleziona gli album",
"backup_album_selection_page_selection_info": "Informazioni sulla selezione",
"backup_album_selection_page_total_assets": "Numero totale delle risorse",
+ "backup_albums_sync": "Sincronizzazione album di backup",
"backup_all": "Tutti",
"backup_background_service_backup_failed_message": "È stato impossibile fare il backup dei contenuti. Riprovo…",
"backup_background_service_connection_failed_message": "Impossibile connettersi al server. Riprovo…",
@@ -592,8 +609,6 @@
"backup_setting_subtitle": "Gestisci le impostazioni di upload in primo piano e in background",
"backup_settings_subtitle": "Gestisci le impostazioni di caricamento",
"backward": "Indietro",
- "beta_sync": "Status sincronizzazione beta",
- "beta_sync_subtitle": "Gestisci il nuovo sistema di sincronizzazione",
"biometric_auth_enabled": "Autenticazione biometrica attivata",
"biometric_locked_out": "Sei stato bloccato dall'autenticazione biometrica",
"biometric_no_options": "Nessuna opzione biometrica disponibile",
@@ -603,7 +618,7 @@
"blurred_background": "Sfondo sfocato",
"bugs_and_feature_requests": "Bug & Richieste di nuove funzionalità",
"build": "Compilazione",
- "build_image": "Compila Immagine",
+ "build_image": "Immagine Compilata",
"bulk_delete_duplicates_confirmation": "Sei sicuro di voler cancellare {count, plural, one {# asset duplicato} other {# assets duplicati}}? Questa operazione manterrà l'asset più pesante di ogni gruppo e cancellerà permanentemente tutti gli altri duplicati. Non puoi annullare questa operazione!",
"bulk_keep_duplicates_confirmation": "Sei sicuro di voler tenere {count, plural, one {# asset duplicato} other {# assets duplicati}}? Questa operazione risolverà tutti i gruppi duplicati senza cancellare nulla.",
"bulk_trash_duplicates_confirmation": "Sei davvero sicuro di voler cancellare {count, plural, one {# asset duplicato} other {# assets duplicati}}? Questa operazione manterrà l'asset più pesante di ogni gruppo e cancellerà permanentemente tutti gli altri duplicati.",
@@ -651,6 +666,8 @@
"change_pin_code": "Cambia il codice PIN",
"change_your_password": "Modifica la tua password",
"changed_visibility_successfully": "Visibilità modificata con successo",
+ "charging": "In carica",
+ "charging_requirement_mobile_backup": "Il backup in background richiede che il dispositivo sia in carica",
"check_corrupt_asset_backup": "Verifica la presenza di backup di asset corrotti",
"check_corrupt_asset_backup_button": "Effettua controllo",
"check_corrupt_asset_backup_description": "Effettua questo controllo solo sotto rete Wi-Fi e quando tutti gli asset sono stati sottoposti a backup. La procedura potrebbe impiegare qualche minuto.",
@@ -682,7 +699,7 @@
"comments_and_likes": "Commenti & mi piace",
"comments_are_disabled": "I commenti sono disabilitati",
"common_create_new_album": "Crea nuovo Album",
- "common_server_error": "Si prega di controllare la connessione network, che il server sia raggiungibile e che le versione del server e app sono gli stessi.",
+ "common_server_error": "Verifica la connessione di rete, assicurati che il server sia raggiungibile e che le versioni dell’app e del server siano compatibili.",
"completed": "Completato",
"confirm": "Conferma",
"confirm_admin_password": "Conferma password dell'amministratore",
@@ -717,7 +734,7 @@
"copy_to_clipboard": "Copia negli appunti",
"country": "Nazione",
"cover": "Riempi la finestra",
- "covers": "Copre",
+ "covers": "Copertine",
"create": "Crea",
"create_album": "Crea album",
"create_album_page_untitled": "Senza titolo",
@@ -733,10 +750,11 @@
"create_shared_album_page_share_select_photos": "Seleziona foto",
"create_shared_link": "Crea link condiviso",
"create_tag": "Crea tag",
- "create_tag_description": "Crea un nuovo tag. Per i tag annidati, si prega di inserire il percorso completo del tag tra cui barre oblique.",
+ "create_tag_description": "Crea un nuovo tag. Per i tag nidificati, inserisci il percorso completo del tag includendo le barre oblique (/).",
"create_user": "Crea utente",
"created": "Creato",
"created_at": "Creato il",
+ "creating_linked_albums": "Creazione di album collegati...",
"crop": "Ritaglia",
"curated_object_page_title": "Oggetti",
"current_device": "Dispositivo attuale",
@@ -749,9 +767,9 @@
"daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Scuro",
"dark_theme": "Imposta tema scuro",
- "date_after": "Data dopo",
+ "date_after": "Dopo la data",
"date_and_time": "Data e ora",
- "date_before": "Data prima",
+ "date_before": "Prima della data",
"date_format": "E, d LLL, y • hh:mm",
"date_of_birth_saved": "Data di nascita salvata con successo",
"date_range": "Intervallo di date",
@@ -886,7 +904,9 @@
"error": "Errore",
"error_change_sort_album": "Errore nel cambiare l'ordine di degli album",
"error_delete_face": "Errore nel cancellare la faccia dalla foto",
+ "error_getting_places": "Errore durante il recupero dei luoghi",
"error_loading_image": "Errore nel caricamento dell'immagine",
+ "error_loading_partners": "Errore durante il caricamento dei partner: {error}",
"error_saving_image": "Errore: {error}",
"error_tag_face_bounding_box": "Errore durante il tag del volto - impossibile ricavare le coordinate del riquadro",
"error_title": "Errore - Qualcosa è andato storto",
@@ -1051,6 +1071,7 @@
"favorites_page_no_favorites": "Nessun preferito",
"feature_photo_updated": "Foto in evidenza aggiornata",
"features": "Funzionalità",
+ "features_in_development": "Funzionalità in fase di sviluppo",
"features_setting_description": "Gestisci le funzionalità dell'app",
"file_name": "Nome file",
"file_name_or_extension": "Nome file o estensione",
@@ -1060,6 +1081,7 @@
"filter_people": "Filtra persone",
"filter_places": "Filtra luoghi",
"find_them_fast": "Trovale velocemente con la ricerca",
+ "first": "Primo",
"fix_incorrect_match": "Correggi corrispondenza errata",
"folder": "Cartella",
"folder_not_found": "Cartella non trovata",
@@ -1070,12 +1092,15 @@
"gcast_enabled": "Google Cast Abilitato",
"gcast_enabled_description": "Questa funzione carica risorse esterne da Google per poter funzionare.",
"general": "Generale",
+ "geolocation_instruction_location": "Fai clic su una risorsa con coordinate GPS per utilizzare la sua posizione oppure seleziona una posizione direttamente dalla mappa",
"get_help": "Chiedi Aiuto",
"get_wifiname_error": "Non sono riuscito a recuperare il nome della rete Wi-Fi. Accertati di aver concesso i permessi necessari e di essere connesso ad una rete Wi-Fi",
"getting_started": "Iniziamo",
"go_back": "Torna indietro",
"go_to_folder": "Vai alla cartella",
"go_to_search": "Vai alla ricerca",
+ "gps": "GPS",
+ "gps_missing": "No GPS",
"grant_permission": "Concedi permesso",
"group_albums_by": "Raggruppa album in base a...",
"group_country": "Raggruppa per paese",
@@ -1148,7 +1173,7 @@
"in_archive": "In archivio",
"include_archived": "Includi Archiviati",
"include_shared_albums": "Includi album condivisi",
- "include_shared_partner_assets": "Includi asset condivisi del compagno",
+ "include_shared_partner_assets": "Includi elementi condivisi dai compagni",
"individual_share": "Condivisione individuale",
"individual_shares": "Condivisioni individuali",
"info": "Info",
@@ -1178,9 +1203,10 @@
"language": "Lingua",
"language_no_results_subtitle": "Prova a cambiare i tuoi termini di ricerca",
"language_no_results_title": "Linguaggi non trovati",
- "language_search_hint": "Cerca linguaggi...",
+ "language_search_hint": "Cerca una lingua...",
"language_setting_description": "Seleziona la tua lingua predefinita",
"large_files": "File pesanti",
+ "last": "Ultimo",
"last_seen": "Ultimo accesso",
"latest_version": "Ultima Versione",
"latitude": "Latitudine",
@@ -1210,6 +1236,7 @@
"local": "Locale",
"local_asset_cast_failed": "Impossibile trasmettere una risorsa che non è caricata sul server",
"local_assets": "Risorsa locale",
+ "local_media_summary": "Riepilogo dei Media Locali",
"local_network": "Rete locale",
"local_network_sheet_info": "L'app si collegherà al server tramite questo URL quando è in uso la rete Wi-Fi specificata",
"location_permission": "Permesso di localizzazione",
@@ -1221,6 +1248,7 @@
"location_picker_longitude_hint": "Inserisci la longitudine qui",
"lock": "Rendi privato",
"locked_folder": "Cartella Privata",
+ "log_detail_title": "Dettaglio dei Log",
"log_out": "Esci",
"log_out_all_devices": "Disconnetti tutti i dispositivi",
"logged_in_as": "Effettuato l'accesso come {user}",
@@ -1251,6 +1279,7 @@
"login_password_changed_success": "Password aggiornata con successo",
"logout_all_device_confirmation": "Sei sicuro di volerti disconnettere da tutti i dispositivi?",
"logout_this_device_confirmation": "Sei sicuro di volerti disconnettere da questo dispositivo?",
+ "logs": "Logs",
"longitude": "Longitudine",
"look": "Guarda",
"loop_videos": "Riproduci video in loop",
@@ -1258,6 +1287,7 @@
"main_branch_warning": "Stai utilizzando una versione di sviluppo. Ti consigliamo vivamente di utilizzare una versione di rilascio!",
"main_menu": "Menu Principale",
"make": "Produttore",
+ "manage_geolocation": "Gestisci posizione",
"manage_shared_links": "Gestisci link condivisi",
"manage_sharing_with_partners": "Gestisci la condivisione con i compagni",
"manage_the_app_settings": "Gestisci le impostazioni dell'applicazione",
@@ -1292,6 +1322,7 @@
"mark_as_read": "Segna come letto",
"marked_all_as_read": "Segnato tutto come letto",
"matches": "Corrispondenze",
+ "matching_assets": "Assets Corrispondenti",
"media_type": "Tipo Media",
"memories": "Ricordi",
"memories_all_caught_up": "Tutto a posto",
@@ -1330,8 +1361,9 @@
"my_albums": "I miei album",
"name": "Nome",
"name_or_nickname": "Nome o soprannome",
- "network_requirement_photos_upload": "Utilizzare i dati del cellulare per il backup delle foto",
- "network_requirement_videos_upload": "Utilizzare i dati del cellulare per il backup dei video",
+ "network_requirement_photos_upload": "Utilizza la connessione dati per il backup delle foto",
+ "network_requirement_videos_upload": "Utilizza la connessione dati per il backup dei video",
+ "network_requirements": "Requisiti di rete",
"network_requirements_updated": "Requisiti di rete modificati, coda di backup reimpostata",
"networking_settings": "Rete",
"networking_subtitle": "Gestisci le impostazioni riguardanti gli endpoint del server",
@@ -1342,6 +1374,7 @@
"new_person": "Nuova persona",
"new_pin_code": "Nuovo codice PIN",
"new_pin_code_subtitle": "Questa è la prima volta che accedi alla cartella privata. Crea un codice PIN per accedere in modo sicuro a questa pagina",
+ "new_timeline": "Nuova Timeline",
"new_user_created": "Nuovo utente creato",
"new_version_available": "NUOVA VERSIONE DISPONIBILE",
"newest_first": "Prima recenti",
@@ -1355,20 +1388,25 @@
"no_assets_message": "CLICCA PER CARICARE LA TUA PRIMA FOTO",
"no_assets_to_show": "Nessuna risorsa da mostrare",
"no_cast_devices_found": "Nessun dispositivo di trasmissione trovato",
+ "no_checksum_local": "Nessun checksum disponibile: impossibile recuperare gli assets locali",
+ "no_checksum_remote": "Nessun checksum disponibile: impossibile recuperare l'asset remoto",
"no_duplicates_found": "Nessun duplicato trovato.",
"no_exif_info_available": "Nessuna informazione exif disponibile",
"no_explore_results_message": "Carica più foto per esplorare la tua collezione.",
"no_favorites_message": "Aggiungi preferiti per trovare facilmente le tue migliori foto e video",
"no_libraries_message": "Crea una libreria esterna per vedere le tue foto e i tuoi video",
+ "no_local_assets_found": "Nessun asset locale trovato con questo checksum",
"no_locked_photos_message": "Le foto e i video nella cartella privata sono nascosti e non vengono visualizzati mentre navighi o cerchi nella tua libreria.",
"no_name": "Nessun nome",
"no_notifications": "Nessuna notifica",
"no_people_found": "Nessuna persona trovata",
"no_places": "Nessun posto",
+ "no_remote_assets_found": "Nessun asset remoto trovato con questo checksum",
"no_results": "Nessun risultato",
"no_results_description": "Prova ad usare un sinonimo oppure una parola chiave più generica",
"no_shared_albums_message": "Crea un album per condividere foto e video con le persone nella tua rete",
"no_uploads_in_progress": "Nessun upload in corso",
+ "not_available": "N/A",
"not_in_any_album": "In nessun album",
"not_selected": "Non selezionato",
"note_apply_storage_label_to_previously_uploaded assets": "Nota: Per aggiungere l'etichetta dell'archiviazione agli asset caricati in precedenza, esegui",
@@ -1403,6 +1441,8 @@
"open_the_search_filters": "Apri filtri di ricerca",
"options": "Opzioni",
"or": "o",
+ "organize_into_albums": "Organizza all'interno degli albums",
+ "organize_into_albums_description": "Inserisci le foto esistenti all'interno degli albums utilizzando le attuale impostazioni di sincronizzazione",
"organize_your_library": "Organizza la tua libreria",
"original": "originale",
"other": "Altro",
@@ -1488,6 +1528,7 @@
"port": "Porta",
"preferences_settings_subtitle": "Gestisci le preferenze dell'app",
"preferences_settings_title": "Preferenze",
+ "preparing": "Preparando",
"preset": "Preimpostazione",
"preview": "Anteprima",
"previous": "Precedente",
@@ -1504,6 +1545,7 @@
"profile_drawer_client_out_of_date_minor": "L'applicazione non è aggiornata. Aggiorna all'ultima versione minore.",
"profile_drawer_client_server_up_to_date": "Client e server sono aggiornati",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "Modalità di sola lettura abilitata. Tieni premuto sull'avatar dell'utente per disabilitarla.",
"profile_drawer_server_out_of_date_major": "Il server non è aggiornato. Aggiorna all'ultima versione principale.",
"profile_drawer_server_out_of_date_minor": "Il server non è aggiornato. Aggiorna all'ultima versione minore.",
"profile_image_of_user": "Immagine profilo di {user}",
@@ -1542,6 +1584,7 @@
"purchase_server_description_2": "Stato di Contributore",
"purchase_server_title": "Server",
"purchase_settings_server_activated": "La chiave del prodotto del server è gestita dall'amministratore",
+ "query_asset_id": "Esegui una query sull'ID dell'asset",
"queue_status": "Messi in coda {count}/{total}",
"rating": "Valutazione a stelle",
"rating_clear": "Crea valutazione",
@@ -1549,6 +1592,9 @@
"rating_description": "Visualizza la valutazione EXIF nel pannello informazioni",
"reaction_options": "Impostazioni Reazioni",
"read_changelog": "Leggi Riepilogo Modifiche",
+ "readonly_mode_disabled": "Modalità di sola lettura disabilitata",
+ "readonly_mode_enabled": "Modalità di sola lettura abilitata",
+ "ready_for_upload": "Pronto per il caricamento",
"reassign": "Riassegna",
"reassigned_assets_to_existing_person": "{count, plural, one {Riassegnato # asset} other {Riassegnati # assets}} {name, select, null {ad una persona esistente} other {a {name}}}",
"reassigned_assets_to_new_person": "{count, plural, one {Riassegnato # asset} other {Riassegnati # assets}} ad una nuova persona",
@@ -1560,7 +1606,7 @@
"recently_added_page_title": "Aggiunti di recente",
"recently_taken": "Scattate di recente",
"recently_taken_page_title": "Scattate di Recente",
- "refresh": "Aggiorna",
+ "refresh": "Ricarica",
"refresh_encoded_videos": "Ricarica video codificati",
"refresh_faces": "Aggiorna volti",
"refresh_metadata": "Ricarica metadati",
@@ -1573,6 +1619,7 @@
"regenerating_thumbnails": "Rigenerando le anteprime",
"remote": "Remoto",
"remote_assets": "Risorse remote",
+ "remote_media_summary": "Riepilogo dei Media Remoti",
"remove": "Rimuovi",
"remove_assets_album_confirmation": "Sei sicuro di voler rimuovere {count, plural, one {# asset} other {# asset}} dall'album?",
"remove_assets_shared_link_confirmation": "Sei sicuro di voler rimuovere {count, plural, one {# asset} other {# asset}} da questo link condiviso?",
@@ -1625,6 +1672,7 @@
"restore_user": "Ripristina utente",
"restored_asset": "Asset ripristinato",
"resume": "Riprendi",
+ "resume_paused_jobs": "Riprendi {count, plural, one {# processo in pausa} other {# i processi in pausa}}",
"retry_upload": "Riprova caricamento",
"review_duplicates": "Esamina duplicati",
"review_large_files": "Revisiona file pesanti",
@@ -1673,11 +1721,11 @@
"search_no_people": "Nessuna persona",
"search_no_people_named": "Nessuna persona chiamate \"{name}\"",
"search_no_result": "Nessun risultato trovato, prova con un termine o combinazione diversi",
- "search_options": "Opzioni Ricerca",
+ "search_options": "Opzioni di ricerca",
"search_page_categories": "Categoria",
"search_page_motion_photos": "Foto in movimento",
- "search_page_no_objects": "Nessuna informazione relativa all'oggetto disponibile",
- "search_page_no_places": "Nessun informazione sul luogo disponibile",
+ "search_page_no_objects": "Nessuna informazione sugli oggetti disponibile",
+ "search_page_no_places": "Nessuna informazione sui luoghi disponibile",
"search_page_screenshots": "Screenshot",
"search_page_search_photos_videos": "Ricerca le tue foto e i tuoi video",
"search_page_selfies": "Selfie",
@@ -1718,6 +1766,7 @@
"select_user_for_sharing_page_err_album": "Impossibile nel creare l'album",
"selected": "Selezionato",
"selected_count": "{count, plural, one {# selezionato} other {# selezionati}}",
+ "selected_gps_coordinates": "Coordinate GPS selezionate",
"send_message": "Manda messaggio",
"send_welcome_email": "Invia email di benvenuto",
"server_endpoint": "Server endpoint",
@@ -1846,6 +1895,7 @@
"show_slideshow_transition": "Mostra la transizione della presentazione",
"show_supporter_badge": "Medaglia di Contributore",
"show_supporter_badge_description": "Mostra la medaglia di contributore",
+ "show_text_search_menu": "Mostra il menu di ricerca del testo",
"shuffle": "Casuale",
"sidebar": "Barra laterale",
"sidebar_display_description": "Visualizzare un link alla vista nella barra laterale",
@@ -1871,11 +1921,12 @@
"stack_action_prompt": "{count} elementi raggruppati",
"stack_duplicates": "Raggruppa i duplicati",
"stack_select_one_photo": "Seleziona una foto principale per il gruppo",
- "stack_selected_photos": "Impila foto selezionate",
+ "stack_selected_photos": "Raggruppa foto selezionate",
"stacked_assets_count": "{count, plural, one {Raggruppato # asset} other {Raggruppati # asset}}",
"stacktrace": "Traccia dell'errore",
"start": "Avvia",
"start_date": "Data di inizio",
+ "start_date_before_end_date": "La data di inizio deve essere precedente alla data di fine",
"state": "Provincia",
"status": "Stato",
"stop_casting": "Interrompi trasmissione",
@@ -1900,6 +1951,8 @@
"sync_albums_manual_subtitle": "Sincronizza tutti i video e le foto caricati con gli album di backup selezionati",
"sync_local": "Sincronizza gli elementi locali",
"sync_remote": "Sincronizza gli elementi remoti",
+ "sync_status": "Stato di Sincronizzazione",
+ "sync_status_subtitle": "Visualizza e gestisci il sistema di sincronizzazione",
"sync_upload_album_setting_subtitle": "Crea e carica le tue foto e video sull'album selezionato in Immich",
"tag": "Tag",
"tag_assets": "Tagga risorse",
@@ -1937,7 +1990,9 @@
"to_change_password": "Modifica password",
"to_favorite": "Preferito",
"to_login": "Accedi",
+ "to_multi_select": "per selezione multipla",
"to_parent": "Sali di un livello",
+ "to_select": "per selezionare",
"to_trash": "Cancella",
"toggle_settings": "Attiva/disattiva impostazioni",
"total": "Totale",
@@ -1957,6 +2012,7 @@
"trash_page_select_assets_btn": "Seleziona elemento",
"trash_page_title": "Cestino ({count})",
"trashed_items_will_be_permanently_deleted_after": "Gli elementi cestinati saranno eliminati definitivamente dopo {days, plural, one {# giorno} other {# giorni}}.",
+ "troubleshoot": "Risoluzione dei problemi",
"type": "Tipo",
"unable_to_change_pin_code": "Impossibile cambiare il codice PIN",
"unable_to_setup_pin_code": "Impossibile configurare il codice PIN",
@@ -1982,11 +2038,12 @@
"unselect_all": "Deseleziona tutto",
"unselect_all_duplicates": "Deseleziona tutti i duplicati",
"unselect_all_in": "Deseleziona tutto in {group}",
- "unstack": "Rimuovi dal gruppo",
+ "unstack": "Separa dal gruppo",
"unstack_action_prompt": "{count} separati",
"unstacked_assets_count": "{count, plural, one {Separato # asset} other {Separati # asset}}",
"untagged": "Senza tag",
"up_next": "Prossimo",
+ "update_location_action_prompt": "Aggiorna la posizione di {count} risorse selezionate con:",
"updated_at": "Aggiornato il",
"updated_password": "Password aggiornata",
"upload": "Carica",
@@ -2053,11 +2110,12 @@
"view_next_asset": "Visualizza risorsa successiva",
"view_previous_asset": "Visualizza risorsa precedente",
"view_qr_code": "Visualizza Codice QR",
+ "view_similar_photos": "Visualizza le foto simili",
"view_stack": "Visualizza Raggruppamento",
"view_user": "Visualizza Utente",
- "viewer_remove_from_stack": "Rimuovi dalla pila",
+ "viewer_remove_from_stack": "Rimuovi dal gruppo",
"viewer_stack_use_as_main_asset": "Usa come risorsa principale",
- "viewer_unstack": "Rimuovi dal gruppo",
+ "viewer_unstack": "Separa dal gruppo",
"visibility_changed": "Visibilità modificata per {count, plural, one {# persona} other {# persone}}",
"waiting": "In Attesa",
"warning": "Attenzione",
@@ -2068,8 +2126,9 @@
"wrong_pin_code": "Codice PIN errato",
"year": "Anno",
"years_ago": "{years, plural, one {# anno} other {# anni}} fa",
- "yes": "Si",
- "you_dont_have_any_shared_links": "Non è presente alcun link condiviso",
+ "yes": "Sì",
+ "you_dont_have_any_shared_links": "Non hai nessun link condiviso",
"your_wifi_name": "Nome della tua rete Wi-Fi",
- "zoom_image": "Ingrandisci immagine"
+ "zoom_image": "Ingrandisci immagine",
+ "zoom_to_bounds": "Ingrandisci fino ai bordi"
}
diff --git a/i18n/ja.json b/i18n/ja.json
index f48da982cd..b03614d65c 100644
--- a/i18n/ja.json
+++ b/i18n/ja.json
@@ -28,6 +28,9 @@
"add_to_album": "アルバムに追加",
"add_to_album_bottom_sheet_added": "{album}に追加",
"add_to_album_bottom_sheet_already_exists": "{album}に追加済み",
+ "add_to_album_toggle": "{album}の選択を切り替え",
+ "add_to_albums": "アルバムに追加",
+ "add_to_albums_count": "{count}つのアルバムへ追加",
"add_to_shared_album": "共有アルバムに追加",
"add_url": "URLを追加",
"added_to_archive": "アーカイブにしました",
@@ -120,6 +123,13 @@
"logging_enable_description": "ログの有効化",
"logging_level_description": "有効な場合に使用されるログ レベル。",
"logging_settings": "ログ",
+ "machine_learning_availability_checks": "可用性の確認",
+ "machine_learning_availability_checks_description": "利用可能な機械学習のサーバーを自動で検知し優先的に使用します",
+ "machine_learning_availability_checks_enabled": "可用性チェックを有効にする",
+ "machine_learning_availability_checks_interval": "チェックの間隔",
+ "machine_learning_availability_checks_interval_description": "可用性チェックの間隔(ミリ秒単位)",
+ "machine_learning_availability_checks_timeout": "リクエストタイムアウト",
+ "machine_learning_availability_checks_timeout_description": "可用性チェックのタイムアウト時間(ミリ秒単位)",
"machine_learning_clip_model": "Clipモデル",
"machine_learning_clip_model_description": "CLIP モデルの名前はここにリストされています。モデルを変更した場合は、すべてのイメージに対して「スマート検索」ジョブを再実行する必要があります。",
"machine_learning_duplicate_detection": "重複検出",
@@ -218,6 +228,7 @@
"oauth_mobile_redirect_uri": "モバイル用リダイレクトURI",
"oauth_mobile_redirect_uri_override": "モバイル用リダイレクトURI(上書き)",
"oauth_mobile_redirect_uri_override_description": "''{callback}''など、モバイルURIがOAuthプロバイダーによって許可されていない場合に有効にしてください",
+ "oauth_role_claim": "役職を主張する",
"oauth_role_claim_description": "管理者になると申し立てが行われた場合、自動的に管理者アクセスがその人に付与されるようにします。",
"oauth_settings": "OAuth",
"oauth_settings_description": "OAuthログイン設定を管理します",
@@ -383,15 +394,15 @@
"admin_password": "管理者パスワード",
"administration": "管理",
"advanced": "詳細設定",
- "advanced_settings_beta_timeline_subtitle": "新しいアプリを体験してみましょう",
- "advanced_settings_beta_timeline_title": "試験運用のタイムライン",
"advanced_settings_enable_alternate_media_filter_subtitle": "別の基準に従ってメディアファイルにフィルターをかけて、同期を行います。アプリがすべてのアルバムを読み込んでくれない場合にのみ、この機能を試してください。",
"advanced_settings_enable_alternate_media_filter_title": "[試験運用] 別のデバイスのアルバム同期フィルターを使用する",
"advanced_settings_log_level_title": "ログレベル: {level}",
- "advanced_settings_prefer_remote_subtitle": "デバイスによっては、デバイス上にあるサムネイルのロードに非常に時間がかかることがあります。このオプションをに有効にする事により、サーバーから直接画像をロードすることが可能です。",
+ "advanced_settings_prefer_remote_subtitle": "デバイスによっては、デバイス上にあるサムネイルのロードに非常に時間がかかることがあります。このオプションを有効にする事により、サーバーから直接画像をロードすることが可能です。",
"advanced_settings_prefer_remote_title": "リモートを優先する",
"advanced_settings_proxy_headers_subtitle": "プロキシヘッダを設定する",
"advanced_settings_proxy_headers_title": "プロキシヘッダ",
+ "advanced_settings_readonly_mode_subtitle": "読み取り専用モードを有効にすると、写真の複数選択や、共有、削除、キャスト機能が無効になります。メインスクリーンのユーザーアバターから有効/無効を切り替えられます",
+ "advanced_settings_readonly_mode_title": "読み取り専用モード",
"advanced_settings_self_signed_ssl_subtitle": "SSLのチェックをスキップする。自己署名証明書が必要です。",
"advanced_settings_self_signed_ssl_title": "自己署名証明書を許可する",
"advanced_settings_sync_remote_deletions_subtitle": "Webでこの操作を行った際に、自動的にこのデバイス上から当該アセットを削除または復元する",
@@ -419,6 +430,7 @@
"album_remove_user_confirmation": "本当に{user}を削除しますか?",
"album_search_not_found": "検索に一致するアルバムがありません",
"album_share_no_users": "このアルバムを全てのユーザーと共有したか、共有するユーザーがいないようです。",
+ "album_summary": "アルバムのまとめ",
"album_updated": "アルバム更新",
"album_updated_setting_description": "共有アルバムに新しいアセットが追加されたとき通知を受け取る",
"album_user_left": "{album} を去りました",
@@ -457,6 +469,7 @@
"app_bar_signout_dialog_title": "サインアウト",
"app_settings": "アプリ設定",
"appears_in": "これらに含まれます",
+ "apply_count": "適用 ({count, number})",
"archive": "アーカイブ",
"archive_action_prompt": "アーカイブに{count}項目追加しました",
"archive_or_unarchive_photo": "写真をアーカイブまたはアーカイブ解除",
@@ -489,6 +502,8 @@
"asset_restored_successfully": "復元できました",
"asset_skipped": "スキップ済",
"asset_skipped_in_trash": "ゴミ箱の中",
+ "asset_trashed": "項目が削除されました",
+ "asset_troubleshoot": "項目をトラブルシューㇳ",
"asset_uploaded": "アップロード済",
"asset_uploading": "アップロード中…",
"asset_viewer_settings_subtitle": "ギャラリービューアーに関する設定",
@@ -496,7 +511,9 @@
"assets": "アセット",
"assets_added_count": "{count, plural, one {#個} other {#個}}のアセットを追加しました",
"assets_added_to_album_count": "{count, plural, one {#個} other {#個}}のアセットをアルバムに追加しました",
+ "assets_added_to_albums_count": "{assetTotal, plural, one {# 項目} other {# 項目}}を{albumTotal, plural, one {# つのアルバム} other {# つのアルバム}}に追加しました",
"assets_cannot_be_added_to_album_count": "{count, plural, one {アセット} other {アセット}} はアルバムに追加できません",
+ "assets_cannot_be_added_to_albums": "{count, plural, one {項目} other {項目}} をどのアルバムにも追加できませんでした",
"assets_count": "{count, plural, one {#個} other {#個}}のアセット",
"assets_deleted_permanently": "{count}項目を完全に削除しました",
"assets_deleted_permanently_from_server": "サーバー上の{count}項目を完全に削除しました",
@@ -513,14 +530,17 @@
"assets_trashed_count": "{count, plural, one {#個} other {#個}}のアセットをごみ箱に移動しました",
"assets_trashed_from_server": "サーバー上の{count}項目をゴミ箱に移動しました",
"assets_were_part_of_album_count": "{count, plural, one {個} other {個}}のアセットは既にアルバムの一部です",
+ "assets_were_part_of_albums_count": "{count, plural, one {項目は} other {項目は}}すでにアルバムに追加されているものでした",
"authorized_devices": "認可済みデバイス",
"automatic_endpoint_switching_subtitle": "指定されたWi-Fiに接続時のみローカル接続を行い、他のネットワーク下では通常通りの接続を行います",
"automatic_endpoint_switching_title": "自動URL切り替え",
"autoplay_slideshow": "スライドショーを自動再生",
"back": "戻る",
"back_close_deselect": "戻る、閉じる、選択解除",
+ "background_backup_running_error": "バックグラウンドのバックアップがすでに行われている最中です。そのため、マニュアルでのバックアップを開始することはできません。",
"background_location_permission": "バックグラウンド位置情報アクセス",
"background_location_permission_content": "正常にWi-Fiの名前(SSID)を獲得するにはアプリが常に詳細な位置情報にアクセスできる必要があります",
+ "background_options": "バックグラウンドの動作オプション",
"backup": "バックアップ",
"backup_album_selection_page_albums_device": "デバイス上のアルバム({count})",
"backup_album_selection_page_albums_tap": "タップで選択、ダブルタップで除外",
@@ -528,6 +548,7 @@
"backup_album_selection_page_select_albums": "アルバムを選択",
"backup_album_selection_page_selection_info": "選択・除外中のアルバム",
"backup_album_selection_page_total_assets": "選択されたアルバムの写真と動画の数",
+ "backup_albums_sync": "アルバム同期状態をバックアップ",
"backup_all": "すべて",
"backup_background_service_backup_failed_message": "アップロードに失敗しました。リトライ中…",
"backup_background_service_connection_failed_message": "サーバーに接続できません。リトライ中…",
@@ -587,8 +608,6 @@
"backup_setting_subtitle": "アップロードに関する設定",
"backup_settings_subtitle": "アップロード設定を管理",
"backward": "新しい方へ",
- "beta_sync": "同期の状態",
- "beta_sync_subtitle": "同期の仕組みを管理",
"biometric_auth_enabled": "生体認証を有効化しました",
"biometric_locked_out": "生体認証により、アクセスできません",
"biometric_no_options": "生体認証を利用できません",
@@ -646,6 +665,8 @@
"change_pin_code": "PINコードを変更",
"change_your_password": "パスワードを変更します",
"changed_visibility_successfully": "非表示設定を正常に変更しました",
+ "charging": "充電中",
+ "charging_requirement_mobile_backup": "バックグラウンドでのバックアップを行うためには、デバイスが充電中である必要があります",
"check_corrupt_asset_backup": "破損されている項目を探す",
"check_corrupt_asset_backup_button": "チェックを行う",
"check_corrupt_asset_backup_description": "写真や動画などが全てアップロードし終えてからWi-Fiに接続時のみチェックを行なってください。作業が完了するには数分かかる場合があります",
@@ -699,7 +720,7 @@
"control_bottom_app_bar_edit_location": "位置情報を編集",
"control_bottom_app_bar_edit_time": "撮影日時を編集",
"control_bottom_app_bar_share_link": "共有リンク",
- "control_bottom_app_bar_share_to": "次のユーザーに共有: ",
+ "control_bottom_app_bar_share_to": "次のユーザーに共有:",
"control_bottom_app_bar_trash_from_immich": "ゴミ箱に入れる",
"copied_image_to_clipboard": "画像をクリップボードにコピーしました。",
"copied_to_clipboard": "クリップボードにコピーしました!",
@@ -732,6 +753,7 @@
"create_user": "ユーザーを作成",
"created": "作成",
"created_at": "作成:",
+ "creating_linked_albums": "リンクされたアルバムを作成中・・・",
"crop": "クロップ",
"curated_object_page_title": "被写体",
"current_device": "現在のデバイス",
@@ -881,7 +903,9 @@
"error": "エラー",
"error_change_sort_album": "アルバムの表示順の変更に失敗しました",
"error_delete_face": "アセットから顔の削除ができませんでした",
+ "error_getting_places": "場所の取得に失敗しました",
"error_loading_image": "画像の読み込みエラー",
+ "error_loading_partners": "パートナーの読み込みに失敗しました: {error}",
"error_saving_image": "エラー: {error}",
"error_tag_face_bounding_box": "顔の登録に失敗しました - 顔を囲む四角形の座標取得に失敗",
"error_title": "エラー - 問題が発生しました",
@@ -1046,6 +1070,7 @@
"favorites_page_no_favorites": "お気に入り登録された項目がありません",
"feature_photo_updated": "人物画像が更新されました",
"features": "機能",
+ "features_in_development": "開発中の機能",
"features_setting_description": "アプリの機能を管理する",
"file_name": "ファイル名",
"file_name_or_extension": "ファイル名または拡張子",
@@ -1055,6 +1080,7 @@
"filter_people": "人物を絞り込み",
"filter_places": "場所をフィルター",
"find_them_fast": "名前で検索して素早く発見",
+ "first": "はじめ",
"fix_incorrect_match": "間違った一致を修正",
"folder": "フォルダー",
"folder_not_found": "フォルダーが見つかりませんでした",
@@ -1065,12 +1091,15 @@
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "この機能は動作のためにGoogleのリソースを読み込みます。",
"general": "一般",
+ "geolocation_instruction_location": "位置情報付きの項目をクリックして、その位置情報を利用します。あるいは、地図上の地点を直接選ぶことも可能です",
"get_help": "助けを求める",
"get_wifiname_error": "Wi-Fiの名前(SSID)が入手できませんでした。Wi-Fiに繋がってるのと必要な権限を許可したか確認してください",
"getting_started": "はじめる",
"go_back": "戻る",
"go_to_folder": "フォルダへ",
"go_to_search": "検索へ",
+ "gps": "GPS",
+ "gps_missing": "GPS無",
"grant_permission": "許可する",
"group_albums_by": "これでアルバムをグループ化…",
"group_country": "国でグループ化",
@@ -1176,6 +1205,7 @@
"language_search_hint": "言語を検索",
"language_setting_description": "優先言語を選択してください",
"large_files": "大きいサイズのファイル",
+ "last": "最後",
"last_seen": "最新の活動",
"latest_version": "最新バージョン",
"latitude": "緯度",
@@ -1205,6 +1235,7 @@
"local": "ローカル",
"local_asset_cast_failed": "サーバーにアップロードされていない項目はキャストできません",
"local_assets": "ローカルの項目",
+ "local_media_summary": "ローカルメディアのまとめ",
"local_network": "ローカルネットワーク",
"local_network_sheet_info": "アプリは指定されたWi-Fiに繋がっている時サーバーへの接続を下記のURLで行います",
"location_permission": "位置情報権限",
@@ -1216,6 +1247,7 @@
"location_picker_longitude_hint": "経度を入力",
"lock": "ロック",
"locked_folder": "鍵付きフォルダー",
+ "log_detail_title": "ログの詳細",
"log_out": "ログアウト",
"log_out_all_devices": "全てのデバイスからログアウト",
"logged_in_as": "{user}としてログイン中",
@@ -1246,6 +1278,7 @@
"login_password_changed_success": "パスワードの変更に成功",
"logout_all_device_confirmation": "本当に全てのデバイスからログアウトしますか?",
"logout_this_device_confirmation": "本当にこのデバイスからログアウトしますか?",
+ "logs": "ログ",
"longitude": "経度",
"look": "見た目",
"loop_videos": "動画をループ",
@@ -1253,6 +1286,7 @@
"main_branch_warning": "開発版を使っているようです。リリース版の使用を強く推奨します!",
"main_menu": "メインメニュー",
"make": "メーカー",
+ "manage_geolocation": "位置情報を編集",
"manage_shared_links": "共有済みのリンクを管理",
"manage_sharing_with_partners": "パートナーとの共有を管理します",
"manage_the_app_settings": "アプリの設定を管理します",
@@ -1287,6 +1321,7 @@
"mark_as_read": "既読にする",
"marked_all_as_read": "すべて既読にしました",
"matches": "マッチ",
+ "matching_assets": "一致する項目",
"media_type": "メディアタイプ",
"memories": "メモリー",
"memories_all_caught_up": "これで全部です",
@@ -1327,6 +1362,7 @@
"name_or_nickname": "名前またはニックネーム",
"network_requirement_photos_upload": "モバイル通信を使用して写真のバックアップを行う",
"network_requirement_videos_upload": "モバイル通信を使用して動画のバックアップを行う",
+ "network_requirements": "ネットワークの要件",
"network_requirements_updated": "ネットワークの条件が変更されたため、バックアップの順番待ちをリセットします",
"networking_settings": "ネットワーク",
"networking_subtitle": "サーバーエンドポイントに関する設定",
@@ -1337,6 +1373,7 @@
"new_person": "新しい人物",
"new_pin_code": "新しいPINコード",
"new_pin_code_subtitle": "鍵付きフォルダーを利用するのが初めてのようです。PINコードを作成してください",
+ "new_timeline": "新たなタイムライン",
"new_user_created": "新しいユーザーが作成されました",
"new_version_available": "新しいバージョンが利用可能",
"newest_first": "最新順",
@@ -1350,20 +1387,25 @@
"no_assets_message": "クリックして最初の写真をアップロード",
"no_assets_to_show": "表示する項目がありません",
"no_cast_devices_found": "キャスト先のデバイスが見つかりません",
+ "no_checksum_local": "チェックサムが見つかりません - デバイス上の項目を取得できないようです",
+ "no_checksum_remote": "チェックサムが見つかりません - サーバー上の項目を取得できないようです",
"no_duplicates_found": "重複は見つかりませんでした。",
"no_exif_info_available": "exif情報が利用できません",
"no_explore_results_message": "コレクションを探索するにはさらに写真をアップロードしてください。",
"no_favorites_message": "お気に入り登録すると好きな写真や動画をすぐに見つけられます",
"no_libraries_message": "あなたの写真や動画を表示するための外部ライブラリを作成しましょう",
+ "no_local_assets_found": "このチェックサムの項目はデバイス上に存在しません",
"no_locked_photos_message": "鍵付きフォルダー内の写真や動画は通常のライブラリに表示されなくなります。",
"no_name": "名前なし",
"no_notifications": "通知なし",
"no_people_found": "一致する人物が見つかりません",
"no_places": "場所なし",
+ "no_remote_assets_found": "このチェックサムの項目はサーバー上に存在しません",
"no_results": "結果がありません",
"no_results_description": "同義語やより一般的なキーワードを試してください",
"no_shared_albums_message": "アルバムを作成して写真や動画を共有しましょう",
"no_uploads_in_progress": "アップロードは行われていません",
+ "not_available": "適用なし",
"not_in_any_album": "どのアルバムにも入っていない",
"not_selected": "選択なし",
"note_apply_storage_label_to_previously_uploaded assets": "注意: 以前にアップロードしたアセットにストレージラベルを適用するには以下を実行してください",
@@ -1398,6 +1440,8 @@
"open_the_search_filters": "検索フィルタを開く",
"options": "オプション",
"or": "または",
+ "organize_into_albums": "アルバムに追加して整理する",
+ "organize_into_albums_description": "既存の写真を、現在の同期設定に基づきアルバムに追加する",
"organize_your_library": "ライブラリを整理",
"original": "オリジナル",
"other": "その他",
@@ -1416,7 +1460,7 @@
"partner_page_no_more_users": "追加できるユーザーがもういません",
"partner_page_partner_add_failed": "パートナーの追加に失敗",
"partner_page_select_partner": "パートナーを選択",
- "partner_page_shared_to_title": "次のユーザーと共有します: ",
+ "partner_page_shared_to_title": "次のユーザーと共有します:",
"partner_page_stop_sharing_content": "{partner}は今後あなたの写真へアクセスできなくなります",
"partner_sharing": "パートナとの共有",
"partners": "パートナー",
@@ -1457,9 +1501,9 @@
"permission_onboarding_permission_limited": "写真へのアクセスが制限されています。Immichが写真のバックアップと管理を行うには、システム設定から写真と動画のアクセス権限を変更してください。",
"permission_onboarding_request": "Immichは写真へのアクセス許可が必要です",
"person": "人物",
- "person_age_months": "{months, plural, one {# ヶ月} other {# ヶ月}} 前",
- "person_age_year_months": "1 年, {months, plural, one {# ヶ月} other {# ヶ月}} 前",
- "person_age_years": "{years, plural, other {# 年}}前",
+ "person_age_months": "生後 {months, plural, one {# ヶ月} other {# ヶ月}}",
+ "person_age_year_months": "1 歳と, {months, plural, one {# ヶ月} other {# ヶ月}}",
+ "person_age_years": "{years, plural, other {# 歳}}",
"person_birthdate": "{date}生まれ",
"person_hidden": "{name}{hidden, select, true { (非表示)} other {}}",
"photo_shared_all_users": "写真をすべてのユーザーと共有したか、共有するユーザーがいないようです。",
@@ -1483,6 +1527,7 @@
"port": "ポートレート",
"preferences_settings_subtitle": "アプリに関する設定",
"preferences_settings_title": "設定",
+ "preparing": "準備中",
"preset": "プリセット",
"preview": "プレビュー",
"previous": "前",
@@ -1499,6 +1544,7 @@
"profile_drawer_client_out_of_date_minor": "アプリが更新されてません。最新のバージョンに更新してください",
"profile_drawer_client_server_up_to_date": "すべて最新版です",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "読み取り専用モードが有効です。ユーザーのアイコンを長押しして読み取り専用モードを解除してください。",
"profile_drawer_server_out_of_date_major": "サーバーが更新されてません。最新のバージョンに更新してください",
"profile_drawer_server_out_of_date_minor": "サーバーが更新されてません。最新のバージョンに更新してください",
"profile_image_of_user": "{user} のプロフィール画像",
@@ -1537,6 +1583,7 @@
"purchase_server_description_2": "サポーターの状態",
"purchase_server_title": "サーバー",
"purchase_settings_server_activated": "サーバーのプロダクトキーは管理者に管理されています",
+ "query_asset_id": "順番待ちの項目ID",
"queue_status": "順番待ち中 {count}/{total}",
"rating": "星での評価",
"rating_clear": "評価を取り消す",
@@ -1544,6 +1591,9 @@
"rating_description": "情報欄にEXIFの評価を表示",
"reaction_options": "リアクションの選択",
"read_changelog": "変更履歴を読む",
+ "readonly_mode_disabled": "読み取り専用モード無効",
+ "readonly_mode_enabled": "読み取り専用モード有効",
+ "ready_for_upload": "アップロード準備完了",
"reassign": "再割り当て",
"reassigned_assets_to_existing_person": "{count, plural, one {#個} other {#個}}のアセットを{name, select, null {既存の人物} other {{name}}}に再割り当てしました",
"reassigned_assets_to_new_person": "{count, plural, one {#個} other {#個}}のアセットを新しい人物に割り当てました",
@@ -1568,6 +1618,7 @@
"regenerating_thumbnails": "サムネイルを再生成中",
"remote": "リモート",
"remote_assets": "リモートの項目",
+ "remote_media_summary": "サーバー上のメディアまとめ",
"remove": "削除",
"remove_assets_album_confirmation": "本当に{count, plural, one {#個} other {#個}}のアセットをアルバムから削除しますか?",
"remove_assets_shared_link_confirmation": "本当にこの共有リンクから{count, plural, one {#個} other {#個}}のアセットを削除しますか?",
@@ -1620,6 +1671,7 @@
"restore_user": "ユーザーを復元",
"restored_asset": "項目を復元しました",
"resume": "再開",
+ "resume_paused_jobs": "再開: {count, plural, one {# paused job} other {# paused jobs}}",
"retry_upload": "アップロードを再試行",
"review_duplicates": "重複を調査",
"review_large_files": "サイズの大きなファイルを見る",
@@ -1713,11 +1765,12 @@
"select_user_for_sharing_page_err_album": "アルバム作成に失敗",
"selected": "選択済み",
"selected_count": "{count, plural, other {#個選択済み}}",
+ "selected_gps_coordinates": "選択された位置情報",
"send_message": "メッセージを送信",
"send_welcome_email": "ウェルカムメールを送信",
"server_endpoint": "サーバーエンドポイント",
"server_info_box_app_version": "アプリのバージョン",
- "server_info_box_server_url": " サーバーのURL",
+ "server_info_box_server_url": "サーバーのURL",
"server_offline": "サーバーがオフラインです",
"server_online": "サーバーがオンラインです",
"server_privacy": "サーバープライバシー",
@@ -1841,6 +1894,7 @@
"show_slideshow_transition": "スライドショーのトランジションを表示",
"show_supporter_badge": "サポーターバッジ",
"show_supporter_badge_description": "サポーターバッジを表示",
+ "show_text_search_menu": "テキスト検索メニューを表示",
"shuffle": "ランダム",
"sidebar": "サイドバー",
"sidebar_display_description": "サイドバーにビューへのリンクを表示",
@@ -1871,6 +1925,7 @@
"stacktrace": "スタックトレース",
"start": "開始",
"start_date": "開始日",
+ "start_date_before_end_date": "開始日は終了日より前でなければなりません",
"state": "都道府県",
"status": "ステータス",
"stop_casting": "キャストを停止",
@@ -1895,6 +1950,8 @@
"sync_albums_manual_subtitle": "アップロード済みの全ての写真や動画を選択されたバックアップアルバムに同期する",
"sync_local": "ローカルを同期",
"sync_remote": "リモートを同期",
+ "sync_status": "同期の状態",
+ "sync_status_subtitle": "同期システムを確認・管理",
"sync_upload_album_setting_subtitle": "サーバー上のアルバムの内容を端末上のアルバムと同期します (サーバーにアルバムが無い場合自動で作成されます。また、アップロードされていない写真や動画は同期されません)",
"tag": "タグ付けする",
"tag_assets": "アセットにタグ付けする",
@@ -1932,7 +1989,9 @@
"to_change_password": "パスワードを変更",
"to_favorite": "お気に入り",
"to_login": "ログイン",
+ "to_multi_select": "複数選択",
"to_parent": "上位の階層へ",
+ "to_select": "選択",
"to_trash": "ゴミ箱",
"toggle_settings": "設定をトグル",
"total": "合計",
@@ -1952,6 +2011,7 @@
"trash_page_select_assets_btn": "項目を選択",
"trash_page_title": "ゴミ箱 ({count})",
"trashed_items_will_be_permanently_deleted_after": "ゴミ箱に入れられたアイテムは{days, plural, one {#日} other {#日}}後に完全に削除されます。",
+ "troubleshoot": "トラブルシューティング",
"type": "タイプ",
"unable_to_change_pin_code": "PINコードを変更できませんでした",
"unable_to_setup_pin_code": "PINコードをセットアップできませんでした",
@@ -1982,6 +2042,7 @@
"unstacked_assets_count": "{count, plural, one {#個のアセット} other {#個のアセット}}をスタックから解除しました",
"untagged": "タグを解除",
"up_next": "次へ",
+ "update_location_action_prompt": "{count}項目を右記の位置情報にアップデートします:",
"updated_at": "更新",
"updated_password": "パスワードを更新しました",
"upload": "アップロード",
@@ -2000,7 +2061,7 @@
"upload_success": "アップロード成功、新しくアップロードされたアセットを見るにはページを更新してください。",
"upload_to_immich": "Immichにアップロード ({count})",
"uploading": "アップロード中",
- "uploading_media": "メディアをアップロード",
+ "uploading_media": "メディアをアップロード中",
"url": "URL",
"usage": "使用容量",
"use_biometric": "生体認証をご利用ください",
@@ -2048,6 +2109,7 @@
"view_next_asset": "次のアセットを見る",
"view_previous_asset": "前のアセットを見る",
"view_qr_code": "QRコードを見る",
+ "view_similar_photos": "類似する写真を見る",
"view_stack": "ビュースタック",
"view_user": "ユーザーを見る",
"viewer_remove_from_stack": "スタックから外す",
@@ -2066,5 +2128,6 @@
"yes": "はい",
"you_dont_have_any_shared_links": "共有リンクはありません",
"your_wifi_name": "Wi-Fiの名前(SSID)",
- "zoom_image": "画像を拡大"
+ "zoom_image": "画像を拡大",
+ "zoom_to_bounds": "画面端までズーム"
}
diff --git a/i18n/kk.json b/i18n/kk.json
index 5dabe59a13..7025ae0d22 100644
--- a/i18n/kk.json
+++ b/i18n/kk.json
@@ -1,11 +1,21 @@
{
"about": "Туралы",
"account": "Тіркелгі",
+ "add": "қосу",
+ "add_a_description": "сипаттаманы қосу",
+ "add_a_location": "суретті түсірген жерді қосы",
+ "add_a_name": "Атын қосу",
+ "add_birthday": "Туған күнін қосу",
+ "add_location": "жерді қосу",
+ "add_more_users": "қосымша адамдарды тіркеу",
+ "add_partner": "жолдасты қосу",
"add_photos": "суреттерді қосу",
+ "add_tag": "тегті қосу",
"add_to": "қосу…",
"add_to_album": "альбомға қосу",
"add_to_album_bottom_sheet_added": "{album}'ға қосылған",
"add_to_album_bottom_sheet_already_exists": "Онсыз да {album} болған",
+ "add_to_albums": "альбомдарға қосу",
"add_to_shared_album": "бөліскен альбомға қосу",
"add_url": "URL таңдау",
"added_to_archive": "Архивке жіберілген",
diff --git a/i18n/ko.json b/i18n/ko.json
index 44acba3590..3707501ec8 100644
--- a/i18n/ko.json
+++ b/i18n/ko.json
@@ -28,6 +28,7 @@
"add_to_album": "앨범에 추가",
"add_to_album_bottom_sheet_added": "{album}에 추가됨",
"add_to_album_bottom_sheet_already_exists": "이미 {album}에 있음",
+ "add_to_album_bottom_sheet_some_local_assets": "몇 개의 로컬 항목이 앨범에 추가되지 않았습니다",
"add_to_album_toggle": "{album} 선택/해제",
"add_to_albums": "여러 앨범에 추가",
"add_to_albums_count": "여러 앨범에 추가 ({count})",
@@ -48,12 +49,12 @@
"backup_database": "데이터베이스 덤프 생성",
"backup_database_enable_description": "데이터베이스 덤프 활성화",
"backup_keep_last_amount": "보관할 이전 덤프 수",
- "backup_onboarding_1_description": "클라우드나 다른 물리적 위치에 보관하는 외부 백업본",
- "backup_onboarding_2_description": "서로 다른 장치에 저장된 로컬 사본. 여기에는 원본 파일과 해당 파일의 로컬 백업이 포함됩니다.",
- "backup_onboarding_3_description": "원본 파일을 포함해 데이터의 총 사본은 3개입니다. 이 중 하나는 외부 백업이고 2개는 로컬 백업입니다.",
- "backup_onboarding_description": "데이터를 보호하기 위해 {label}",
"system_settings": "시스템 설정",
"tag_cleanup_job": "태그 정리",
@@ -318,7 +326,7 @@
"transcoding_encoding_options": "인코딩 옵션",
"transcoding_encoding_options_description": "코덱, 해상도, 품질 및 기타 인코딩 옵션을 설정합니다.",
"transcoding_hardware_acceleration": "하드웨어 가속",
- "transcoding_hardware_acceleration_description": "(실험적) 트랜스코딩 속도는 빨라지지만 동일 비트레이트에서 품질이 상대적으로 저하될 수 있습니다.",
+ "transcoding_hardware_acceleration_description": "(실험적) 트랜스코딩 속도가 빨라지지만 동일 비트레이트에서 품질이 상대적으로 저하될 수 있습니다.",
"transcoding_hardware_decoding": "하드웨어 디코딩",
"transcoding_hardware_decoding_setting_description": "종단간 가속으로 디코딩부터 인코딩까지 전체 과정을 가속합니다. 일부 동영상에서는 작동하지 않을 수 있습니다.",
"transcoding_max_b_frames": "최대 B-프레임",
@@ -337,7 +345,7 @@
"transcoding_reference_frames": "참조 프레임 수",
"transcoding_reference_frames_description": "특정 프레임을 압축할 때 참조할 프레임 수를 설정합니다. 값을 높이면 압축 효율이 향상되지만 인코딩 속도가 느려집니다. 0을 입력하면 자동으로 설정합니다.",
"transcoding_required_description": "허용 포맷이 아닌 동영상만 트랜스코딩",
- "transcoding_settings": "동영상 트랜스코딩 설정",
+ "transcoding_settings": "트랜스코딩 설정",
"transcoding_settings_description": "트랜스코딩할 동영상 및 처리 방법을 관리합니다.",
"transcoding_target_resolution": "목표 해상도",
"transcoding_target_resolution_description": "해상도를 높이면 세부 정보가 더 많이 보존되지만, 인코딩 시간이 늘어나고 파일 크기가 커져 앱 반응 속도가 느려질 수 있습니다.",
@@ -348,16 +356,16 @@
"transcoding_tone_mapping": "톤 매핑",
"transcoding_tone_mapping_description": "HDR 영상을 SDR로 변환할 때 사용할 톤 매핑 알고리즘을 설정합니다. Hable은 디테일, Mobius는 색상, Reinhard는 밝기에 중점을 두며 '비활성화'는 톤 매핑을 사용하지 않습니다.",
"transcoding_transcode_policy": "트랜스코드 기준",
- "transcoding_transcode_policy_description": "동영상을 트랜스코딩할 기준을 설정합니다. HDR 영상은 트랜스코딩이 비활성화된 경우를 제외하면 항상 트랜스코딩됩니다.",
+ "transcoding_transcode_policy_description": "동영상을 트랜스코딩할 기준을 설정합니다. HDR 동영상은 항상 트랜스코딩됩니다. (트랜스코딩이 비활성화된 경우 제외)",
"transcoding_two_pass_encoding": "2패스 인코딩",
"transcoding_two_pass_encoding_setting_description": "2패스 인코딩을 사용해 인코딩 품질을 높입니다. H.264 및 HEVC의 경우 CRF를 무시하고 최대 비트레이트 기반의 비트레이트 범위를 사용합니다. VP9의 경우 최대 비트레이트를 비활성화하면 CRF를 사용할 수 있습니다.",
"transcoding_video_codec": "동영상 코덱",
- "transcoding_video_codec_description": "VP9는 효율적이고 웹 호환성이 높으나 트랜스코딩이 오래 걸립니다. HEVC 역시 비슷하나 웹 호환성이 낮습니다. H.264는 호환성이 가장 높지만 처리된 파일의 크기가 크고, AV1은 가장 효율적이지만 오래된 기기와의 호환성이 낮습니다.",
+ "transcoding_video_codec_description": "VP9는 효율적이고 웹 호환성이 높으나 트랜스코딩이 오래 걸립니다. HEVC는 VP9와 비슷하지만 웹 호환성이 낮습니다. H.264는 호환성이 가장 높으나 처리된 파일의 크기가 크고, AV1은 가장 효율적이지만 오래된 기기와의 호환성이 낮습니다.",
"trash_enabled_description": "휴지통 기능 활성화",
"trash_number_of_days": "휴지통 보관 기간",
"trash_number_of_days_description": "항목을 영구적으로 삭제하기 전까지 휴지통에 보관할 기간(일)",
"trash_settings": "휴지통 설정",
- "trash_settings_description": "휴지통 기능 설정을 관리합니다.",
+ "trash_settings_description": "휴지통 기능을 설정합니다.",
"unlink_all_oauth_accounts": "모든 OAuth 계정 연결 해제",
"unlink_all_oauth_accounts_description": "새 공급자로 이전하려면 먼저 모든 OAuth 계정의 연결을 해제해야 합니다.",
"unlink_all_oauth_accounts_prompt": "모든 OAuth 계정 연결을 해제하시겠습니까? 각 사용자의 OAuth ID를 초기화하며 되돌릴 수 없습니다.",
@@ -379,7 +387,7 @@
"version_check_enabled_description": "버전 확인 활성화",
"version_check_implications": "주기적으로 Github에 요청을 보내 새 버전을 확인합니다.",
"version_check_settings": "버전 확인",
- "version_check_settings_description": "새 버전 알림 기능을 관리합니다.",
+ "version_check_settings_description": "새 버전 확인 및 알림 기능을 관리합니다.",
"video_conversion_job": "동영상 트랜스코드",
"video_conversion_job_description": "다양한 브라우저 및 기기와의 호환성을 위한 동영상 트랜스코드"
},
@@ -387,8 +395,6 @@
"admin_password": "관리자 비밀번호",
"administration": "관리",
"advanced": "고급",
- "advanced_settings_beta_timeline_subtitle": "새로운 앱 경험 사용해보기",
- "advanced_settings_beta_timeline_title": "베타 타임라인",
"advanced_settings_enable_alternate_media_filter_subtitle": "이 옵션을 사용하면 동기화 중 미디어를 대체 기준으로 필터링할 수 있습니다. 앱이 모든 앨범을 제대로 감지하지 못할 때만 사용하세요.",
"advanced_settings_enable_alternate_media_filter_title": "대체 기기 앨범 동기화 필터 사용 (실험적)",
"advanced_settings_log_level_title": "로그 레벨: {level}",
@@ -396,6 +402,8 @@
"advanced_settings_prefer_remote_title": "서버 이미지 선호",
"advanced_settings_proxy_headers_subtitle": "Immich가 네트워크 요청 시 사용할 프록시 헤더를 정의합니다.",
"advanced_settings_proxy_headers_title": "프록시 헤더",
+ "advanced_settings_readonly_mode_subtitle": "읽기 전용 모드를 활성화하면 여러 이미지 선택, 공유, 캐스트, 삭제 동작이 모두 비활성화됩니다. 메인 화면에서 사용자 프로필을 통해 읽기 전용 모드의 활성 상태를 전환하세요",
+ "advanced_settings_readonly_mode_title": "읽기 전용 모드",
"advanced_settings_self_signed_ssl_subtitle": "서버 엔드포인트의 SSL 인증서 검증을 건너뜁니다. 자체 서명 인증서를 사용하는 경우 활성화하세요.",
"advanced_settings_self_signed_ssl_title": "자체 서명된 SSL 인증서 허용",
"advanced_settings_sync_remote_deletions_subtitle": "웹에서 삭제하거나 복원한 항목을 이 기기에서도 자동으로 처리하도록 설정",
@@ -423,6 +431,7 @@
"album_remove_user_confirmation": "{user}님을 앨범에서 제거하시겠습니까?",
"album_search_not_found": "검색 결과에 해당하는 앨범이 없습니다.",
"album_share_no_users": "이미 모든 사용자와 앨범을 공유했거나 공유할 사용자가 없습니다.",
+ "album_summary": "앨범 요약",
"album_updated": "항목 추가 알림",
"album_updated_setting_description": "공유 앨범에 항목이 추가된 경우 이메일 알림 받기",
"album_user_left": "{album} 앨범에서 나옴",
@@ -439,8 +448,8 @@
"albums": "앨범",
"albums_count": "앨범 {count, plural, one {{count, number}개} other {{count, number}개}}",
"albums_default_sort_order": "기본 앨범 정렬 순서",
- "albums_default_sort_order_description": "새 앨범을 생성할 때 기본적으로 항목을 정렬할 순서.",
- "albums_feature_description": "다른 사용자와 공유할 수 있는 항목 모음.",
+ "albums_default_sort_order_description": "새 앨범 생성 시 적용되는 기본 정렬을 설정합니다.",
+ "albums_feature_description": "여러 사진과 동영상을 한곳에 모아 둘 수 있습니다.",
"albums_on_device_count": "기기의 앨범 ({count}개)",
"all": "모두",
"all_albums": "모든 앨범",
@@ -461,13 +470,14 @@
"app_bar_signout_dialog_title": "로그아웃",
"app_settings": "앱 설정",
"appears_in": "다음 앨범에 포함됨",
+ "apply_count": "적용 ({count, number})",
"archive": "보관함",
"archive_action_prompt": "보관함으로 항목 {count}개 이동됨",
"archive_or_unarchive_photo": "보관 처리 또는 해제",
"archive_page_no_archived_assets": "보관된 항목 없음",
"archive_page_title": "보관함 ({count})",
"archive_size": "압축 파일 크기",
- "archive_size_description": "다운로드할 압축 파일의 크기 구성 (GiB 단위)",
+ "archive_size_description": "지정한 크기를 초과하면 여러 개의 파일로 분할됩니다. (GiB 단위)",
"archived": "보관함",
"archived_count": "보관함으로 항목 {count, plural, other {#개}} 이동됨",
"are_these_the_same_person": "동일한 인물인가요?",
@@ -493,6 +503,8 @@
"asset_restored_successfully": "항목이 복원되었습니다.",
"asset_skipped": "건너뜀",
"asset_skipped_in_trash": "휴지통의 항목",
+ "asset_trashed": "항목 삭제됨",
+ "asset_troubleshoot": "항목 트러블슈팅",
"asset_uploaded": "업로드 완료",
"asset_uploading": "업로드 중…",
"asset_viewer_settings_subtitle": "갤러리 보기 설정을 관리합니다.",
@@ -500,7 +512,7 @@
"assets": "항목",
"assets_added_count": "항목 {count, plural, one {#개} other {#개}} 추가됨",
"assets_added_to_album_count": "앨범에 항목 {count, plural, one {#개} other {#개}} 추가됨",
- "assets_added_to_albums_count": "{assetTotal, plural, one {항목 #개} other {항목 #개}}가 앨범 {albumTotal}개에 추가됨",
+ "assets_added_to_albums_count": "{albumTotal, plural, one {앨범에} other {앨범 #개에}} {assetTotal, plural, one {항목이} other {항목 #개가}} 추가됨",
"assets_cannot_be_added_to_album_count": "{count, plural, one {앨범에 항목을} other {일부 항목을 앨범에}} 추가할 수 없습니다.",
"assets_cannot_be_added_to_albums": "{count, plural, one {항목을} other {항목들을}} 어느 앨범에도 추가할 수 없습니다.",
"assets_count": "{count, plural, one {#개} other {#개}} 항목",
@@ -520,14 +532,16 @@
"assets_trashed_from_server": "서버 항목 {count}개 휴지통으로 이동됨",
"assets_were_part_of_album_count": "앨범에 이미 포함된 {count, plural, one {항목} other {항목}}입니다.",
"assets_were_part_of_albums_count": "이미 앨범에 포함된 {count, plural, one {항목} other {항목}}입니다.",
- "authorized_devices": "인증된 기기",
+ "authorized_devices": "내 기기",
"automatic_endpoint_switching_subtitle": "지정된 Wi-Fi가 사용 가능한 경우 내부망으로 연결하고, 그 외의 경우 다른 연결 방식을 사용합니다.",
"automatic_endpoint_switching_title": "자동 URL 전환",
"autoplay_slideshow": "슬라이드 쇼 자동 재생",
"back": "뒤로",
- "back_close_deselect": "뒤로, 닫기, 선택 취소",
+ "back_close_deselect": "뒤로, 닫기 또는 선택 해제",
+ "background_backup_running_error": "백그라운드 백업이 현재 진행 중이므로 수동 백업을 시작할 수 없습니다",
"background_location_permission": "백그라운드 위치 권한",
"background_location_permission_content": "Immich가 백그라운드에서 실행 중일 때 네트워크를 전환하려면 Wi-Fi 네트워크 이름을 확인해야 하며, 이를 위해 '정확한 위치' 권한을 항상 허용해야 합니다.",
+ "background_options": "백그라운드 옵션",
"backup": "백업",
"backup_album_selection_page_albums_device": "기기의 앨범 ({count})",
"backup_album_selection_page_albums_tap": "탭하여 포함, 두 번 탭하여 제외",
@@ -535,6 +549,7 @@
"backup_album_selection_page_select_albums": "앨범 선택",
"backup_album_selection_page_selection_info": "선택한 앨범",
"backup_album_selection_page_total_assets": "전체 항목",
+ "backup_albums_sync": "앨범 동기화 백업",
"backup_all": "모두",
"backup_background_service_backup_failed_message": "항목 백업에 실패했습니다. 다시 시도하는 중…",
"backup_background_service_connection_failed_message": "서버 연결에 실패했습니다. 다시 시도하는 중…",
@@ -594,8 +609,6 @@
"backup_setting_subtitle": "백그라운드 및 포그라운드 백업 설정을 관리합니다.",
"backup_settings_subtitle": "업로드 설정을 관리합니다.",
"backward": "뒤로",
- "beta_sync": "동기화 (베타) 상태",
- "beta_sync_subtitle": "새 동기화 시스템의 설정을 관리합니다.",
"biometric_auth_enabled": "생체 인증이 활성화되었습니다.",
"biometric_locked_out": "생체 인증이 일시적으로 비활성화되었습니다.",
"biometric_no_options": "사용 가능한 생체 인증 옵션 없음",
@@ -653,6 +666,8 @@
"change_pin_code": "PIN 코드 변경",
"change_your_password": "사용자 계정의 비밀번호를 변경합니다.",
"changed_visibility_successfully": "숨김 여부가 변경되었습니다.",
+ "charging": "충전 중",
+ "charging_requirement_mobile_backup": "백그라운드 백업은 기기 충전 상태에서 가능합니다",
"check_corrupt_asset_backup": "백업된 항목의 손상 여부 확인",
"check_corrupt_asset_backup_button": "확인 수행",
"check_corrupt_asset_backup_description": "이 검사는 모든 항목이 백업된 후 Wi-Fi가 연결된 상태에서만 실행하세요. 이 작업은 몇 분 정도 소요될 수 있습니다.",
@@ -723,14 +738,14 @@
"create": "생성",
"create_album": "앨범 생성",
"create_album_page_untitled": "제목 없음",
- "create_library": "라이브러리 생성",
+ "create_library": "새 라이브러리",
"create_link": "링크 생성",
"create_link_to_share": "공유 링크 생성",
"create_link_to_share_description": "링크가 있는 경우 누구나 선택한 사진을 볼 수 있습니다.",
"create_new": "새로 만들기",
"create_new_person": "인물 생성",
"create_new_person_hint": "선택한 항목의 인물을 새 인물로 변경",
- "create_new_user": "사용자 계정 생성",
+ "create_new_user": "새 사용자 생성",
"create_shared_album_page_share_add_assets": "항목 추가",
"create_shared_album_page_share_select_photos": "사진 선택",
"create_shared_link": "공유 링크 생성",
@@ -739,6 +754,7 @@
"create_user": "사용자 계정 생성",
"created": "생성됨",
"created_at": "생성됨",
+ "creating_linked_albums": "링크 연결된 앨범 생성 중...",
"crop": "자르기",
"curated_object_page_title": "사물",
"current_device": "현재 기기",
@@ -811,7 +827,7 @@
"display_options": "표시 옵션",
"display_order": "표시 순서",
"display_original_photos": "원본 사진 표시",
- "display_original_photos_setting_description": "원본 사진이 웹과 호환되는 경우 섬네일이 아닌 원본을 표시합니다. 사진이 표시되는 속도가 느려질 수 있습니다.",
+ "display_original_photos_setting_description": "항목을 표시할 때 웹과 호환되는 경우 원본을 표시합니다. 사진 표시 속도가 느려질 수 있습니다.",
"do_not_show_again": "이 메시지를 다시 표시하지 않음",
"documentation": "문서",
"done": "완료",
@@ -823,12 +839,12 @@
"download_error": "다운로드 오류",
"download_failed": "다운로드 실패",
"download_finished": "다운로드가 완료되었습니다.",
- "download_include_embedded_motion_videos": "내장된 동영상",
- "download_include_embedded_motion_videos_description": "모션 포토에 내장된 동영상을 개별 파일로 포함",
+ "download_include_embedded_motion_videos": "모션 포토 영상",
+ "download_include_embedded_motion_videos_description": "모션 포토에 포함된 동영상을 별도의 파일로 분리해 저장합니다.",
"download_notfound": "다운로드할 수 없음",
"download_paused": "다운로드 일시 중지됨",
"download_settings": "다운로드",
- "download_settings_description": "파일 다운로드 방식 및 관련 설정을 관리합니다.",
+ "download_settings_description": "파일 다운로드 설정을 관리합니다.",
"download_started": "다운로드가 시작되었습니다.",
"download_sucess": "다운로드가 완료되었습니다.",
"download_sucess_android": "항목이 DCIM/Immich 폴더에 다운로드되었습니다.",
@@ -888,7 +904,9 @@
"error": "오류",
"error_change_sort_album": "앨범 표시 순서 변경 실패",
"error_delete_face": "항목에서 얼굴 삭제 중 오류 발생",
+ "error_getting_places": "장소 정보 입력 실패",
"error_loading_image": "이미지를 불러오는 중 오류 발생",
+ "error_loading_partners": "파트너 불러오기 실패: {error}",
"error_saving_image": "오류: {error}",
"error_tag_face_bounding_box": "얼굴 태그 실패 - 얼굴의 위치를 가져올 수 없습니다.",
"error_title": "오류 - 문제가 발생했습니다",
@@ -1053,6 +1071,7 @@
"favorites_page_no_favorites": "즐겨찾기된 항목 없음",
"feature_photo_updated": "대표 사진 업데이트됨",
"features": "기능",
+ "features_in_development": "개발 중인 기능",
"features_setting_description": "사진 및 동영상 관리 기능을 설정합니다.",
"file_name": "파일 이름",
"file_name_or_extension": "파일명 또는 확장자",
@@ -1060,14 +1079,14 @@
"filetype": "파일 형식",
"filter": "필터",
"filter_people": "인물 필터",
- "filter_places": "장소 필터링",
+ "filter_places": "장소 필터",
"find_them_fast": "이름으로 검색하여 빠르게 찾기",
"first": "첫 번째",
"fix_incorrect_match": "잘못된 분류 수정",
"folder": "폴더",
"folder_not_found": "폴더를 찾을 수 없음",
"folders": "폴더",
- "folders_feature_description": "파일 시스템에 있는 사진과 동영상을 폴더 뷰로 탐색",
+ "folders_feature_description": "파일 시스템의 사진과 동영상을 폴더 보기로 탐색합니다.",
"forgot_pin_code_question": "PIN 번호를 잊어버렸나요?",
"forward": "앞으로",
"gcast_enabled": "구글 캐스트",
@@ -1079,6 +1098,8 @@
"go_back": "뒤로",
"go_to_folder": "폴더로 이동",
"go_to_search": "검색으로 이동",
+ "gps": "GPS",
+ "gps_missing": "GPS 없음",
"grant_permission": "권한 부여",
"group_albums_by": "다음으로 앨범 그룹화...",
"group_country": "국가별로 그룹화",
@@ -1182,7 +1203,7 @@
"language_no_results_subtitle": "다른 검색어를 사용해 보세요.",
"language_no_results_title": "결과 없음",
"language_search_hint": "언어 검색...",
- "language_setting_description": "선호하는 언어 선택",
+ "language_setting_description": "사용할 언어를 선택하세요.",
"large_files": "큰 파일",
"last": "마지막",
"last_seen": "최근 활동",
@@ -1214,6 +1235,7 @@
"local": "로컬",
"local_asset_cast_failed": "서버에 업로드되지 않은 항목을 캐스팅할 수 없음",
"local_assets": "로컬 항목",
+ "local_media_summary": "로컬 미디어 요약",
"local_network": "로컬 네트워크",
"local_network_sheet_info": "지정된 Wi-Fi를 사용할 때 앱이 아래 URL로 서버에 연결합니다.",
"location_permission": "위치 권한",
@@ -1225,6 +1247,7 @@
"location_picker_longitude_hint": "여기에 경도를 입력하세요",
"lock": "잠금",
"locked_folder": "잠금 폴더",
+ "log_detail_title": "상세 로그",
"log_out": "로그아웃",
"log_out_all_devices": "모든 기기에서 로그아웃",
"logged_in_as": "{user}로 로그인됨",
@@ -1255,18 +1278,20 @@
"login_password_changed_success": "비밀번호가 변경되었습니다.",
"logout_all_device_confirmation": "모든 기기에서 로그아웃하시겠습니까?",
"logout_this_device_confirmation": "이 기기에서 로그아웃하시겠습니까?",
+ "logs": "로그",
"longitude": "경도",
"look": "보기",
"loop_videos": "동영상 반복",
- "loop_videos_description": "상세 보기에서 자동으로 동영상을 반복 재생합니다.",
+ "loop_videos_description": "상세 보기에서 영상을 반복 재생합니다.",
"main_branch_warning": "개발 버전을 사용 중입니다. 정식 릴리스 버전 사용을 권장합니다!",
"main_menu": "메인 메뉴",
"make": "제조사",
+ "manage_geolocation": "위치 정보 관리",
"manage_shared_links": "공유 링크 관리",
"manage_sharing_with_partners": "공유할 파트너를 초대하거나 제거합니다.",
"manage_the_app_settings": "앱 동작 및 표시 환경을 사용자 정의합니다.",
"manage_your_account": "사용자의 계정 정보를 확인하고 변경합니다.",
- "manage_your_api_keys": "API 키를 생성, 수정 또는 삭제하거나 권한을 관리합니다.",
+ "manage_your_api_keys": "API 키를 생성, 삭제하거나 권한을 관리합니다.",
"manage_your_devices": "현재 로그인한 기기를 확인하고 로그아웃할 수 있습니다.",
"manage_your_oauth_connection": "OAuth 연결을 관리합니다.",
"map": "지도",
@@ -1296,6 +1321,7 @@
"mark_as_read": "읽음으로 표시",
"marked_all_as_read": "모두 읽음으로 표시했습니다.",
"matches": "일치",
+ "matching_assets": "일치하는 항목",
"media_type": "미디어 종류",
"memories": "추억",
"memories_all_caught_up": "모두 확인함",
@@ -1336,6 +1362,7 @@
"name_or_nickname": "이름 또는 닉네임",
"network_requirement_photos_upload": "사진 백업에 모바일 데이터 사용",
"network_requirement_videos_upload": "동영상 백업에 모바일 데이터 사용",
+ "network_requirements": "네트워크 요구사항",
"network_requirements_updated": "네트워크 상태가 변경되었습니다. 백업 대기열을 초기화합니다.",
"networking_settings": "연결",
"networking_subtitle": "서버 엔드포인트 설정을 관리합니다.",
@@ -1346,6 +1373,7 @@
"new_person": "새 인물 생성",
"new_pin_code": "새 PIN 코드",
"new_pin_code_subtitle": "잠금 폴더에 처음 접근하셨습니다. 이곳에 안전하게 접근하기 위한 PIN 코드를 설정하세요.",
+ "new_timeline": "새 타임라인",
"new_user_created": "사용자 계정이 생성되었습니다.",
"new_version_available": "새 버전 사용 가능",
"newest_first": "최신순",
@@ -1448,8 +1476,8 @@
"people_edits_count": "인물 {count, plural, one {#명} other {#명}}이 수정되었습니다.",
"people_feature_description": "사진과 동영상을 인물 그룹별로 탐색",
"people_sidebar_description": "사이드바에 인물 링크 표시",
- "permanent_deletion_warning": "영구적으로 삭제 전 경고",
- "permanent_deletion_warning_setting_description": "항목을 영구적으로 삭제할 때 경고 메시지 표시",
+ "permanent_deletion_warning": "영구 삭제 경고",
+ "permanent_deletion_warning_setting_description": "항목을 완전히 삭제하기 전 경고 메시지를 표시합니다.",
"permanently_delete": "영구 삭제",
"permanently_delete_assets_count": "{count, plural, one {항목} other {항목}} 영구 삭제",
"permanently_delete_assets_prompt": "{count, plural, one {이 항목을} other {항목 #개를}} 영구적으로 삭제하시겠습니까? {count, plural, one {항목이} other {항목이}} 앨범에 포함된 경우 앨범에서 제거됩니다.",
@@ -1492,14 +1520,15 @@
"port": "포트",
"preferences_settings_subtitle": "앱 개인 설정을 관리합니다.",
"preferences_settings_title": "개인 설정",
+ "preparing": "준비 중",
"preset": "프리셋",
"preview": "미리 보기",
"previous": "이전",
"previous_memory": "이전 추억",
- "previous_or_next_day": "다음/이전 날",
- "previous_or_next_month": "다음/이전 달",
- "previous_or_next_photo": "이전/다음 사진",
- "previous_or_next_year": "다음/이전 해",
+ "previous_or_next_day": "이전/다음 날로",
+ "previous_or_next_month": "이전/다음 달로",
+ "previous_or_next_photo": "이전/다음 사진으로",
+ "previous_or_next_year": "이전/다음 연도로",
"primary": "기본",
"privacy": "개인정보",
"profile": "프로필",
@@ -1508,6 +1537,7 @@
"profile_drawer_client_out_of_date_minor": "모바일 앱이 최신 버전이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_client_server_up_to_date": "클라이언트와 서버가 최신 상태입니다.",
"profile_drawer_github": "Github",
+ "profile_drawer_readonly_mode": "읽기 전용 모드 활성화. 유저 아바타 아이콘을 길게 눌러 해제할 수 있습니다.",
"profile_drawer_server_out_of_date_major": "서버 버전이 최신이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_drawer_server_out_of_date_minor": "서버 버전이 최신이 아닙니다. 최신 버전으로 업데이트하세요.",
"profile_image_of_user": "{user}님의 프로필 이미지",
@@ -1553,6 +1583,9 @@
"rating_description": "상세 정보 패널에 EXIF 등급 태그 표시",
"reaction_options": "반응 옵션",
"read_changelog": "변경 내역 보기",
+ "readonly_mode_disabled": "읽기 전용 모드 비활성화",
+ "readonly_mode_enabled": "읽기 전용 모드 활성화",
+ "ready_for_upload": "업로드 준비 완료",
"reassign": "다시 할당",
"reassigned_assets_to_existing_person": "{count, plural, one {항목 #개} other {항목 #개}}를 {name, select, null {기존 인물} other {기존 인물 {name}}}에게 재지정했습니다.",
"reassigned_assets_to_new_person": "{count, plural, one {항목 #개} other {항목 #개}}를 새 인물에게 재지정했습니다.",
@@ -1577,6 +1610,7 @@
"regenerating_thumbnails": "섬네일을 다시 생성하는 중...",
"remote": "원격",
"remote_assets": "원격 항목",
+ "remote_media_summary": "원격 미디어 요약",
"remove": "제거",
"remove_assets_album_confirmation": "앨범에서 항목 {count, plural, one {#개} other {#개}}를 제거하시겠습니까?",
"remove_assets_shared_link_confirmation": "공유 링크에서 항목 {count, plural, one {#개} other {#개}}를 제거하시겠습니까?",
@@ -1760,7 +1794,7 @@
"setting_notifications_total_progress_subtitle": "전체 업로드 진행률 (완료/총 항목)",
"setting_notifications_total_progress_title": "백그라운드 백업 전체 진행률 표시",
"setting_video_viewer_looping_title": "반복",
- "setting_video_viewer_original_video_subtitle": "서버에서 동영상을 스트리밍할 때, 트랜스코딩된 버전이 있더라도 원본을 재생합니다. 이로 인해 버퍼링이 발생할 수 있습니다. 기기에 있는 동영상은 이 설정과 관계없이 항상 원본 화질로 재생됩니다.",
+ "setting_video_viewer_original_video_subtitle": "동영상 스트리밍 시 트랜스코딩된 파일 대신 원본을 재생합니다. 재생 시 버퍼링이 발생할 수 있습니다. 로컬에 있는 영상은 항상 원본 화질로 재생됩니다.",
"setting_video_viewer_original_video_title": "원본 동영상 강제 사용",
"settings": "설정",
"settings_require_restart": "설정을 적용하려면 Immich를 다시 시작해야 합니다.",
@@ -1841,7 +1875,7 @@
"show_in_timeline_setting_description": "타임라인에 이 사용자의 사진과 동영상을 표시",
"show_keyboard_shortcuts": "키보드 단축키 표시",
"show_metadata": "메타데이터 표시",
- "show_or_hide_info": "정보 표시/숨기기",
+ "show_or_hide_info": "정보 표시 또는 숨기기",
"show_password": "비밀번호 표시",
"show_person_options": "인물 옵션 표시",
"show_progress_bar": "진행 표시줄 표시",
@@ -1850,6 +1884,7 @@
"show_slideshow_transition": "슬라이드 전환 표시",
"show_supporter_badge": "서포터 배지",
"show_supporter_badge_description": "서포터 배지 표시",
+ "show_text_search_menu": "텍스트 검색 메뉴 표시",
"shuffle": "셔플",
"sidebar": "사이드바",
"sidebar_display_description": "보기 링크를 사이드바에 표시",
@@ -1880,6 +1915,7 @@
"stacktrace": "스택 추적",
"start": "시작",
"start_date": "시작일",
+ "start_date_before_end_date": "시작일은 종료일보다 이전이어야 합니다",
"state": "지역",
"status": "상태",
"stop_casting": "캐스팅 중단",
@@ -1904,6 +1940,8 @@
"sync_albums_manual_subtitle": "업로드한 모든 동영상과 사진을 선택한 백업 앨범에 동기화",
"sync_local": "로컬 동기화",
"sync_remote": "원격 동기화",
+ "sync_status": "동기화 상태",
+ "sync_status_subtitle": "동기화 시스템 확인 및 관리",
"sync_upload_album_setting_subtitle": "선택한 앨범을 Immich에 생성하고 사진 및 동영상 업로드",
"tag": "태그",
"tag_assets": "항목 태그",
@@ -1917,8 +1955,8 @@
"tap_to_run_job": "탭하여 작업 실행",
"template": "템플릿",
"theme": "테마",
- "theme_selection": "테마 설정",
- "theme_selection_description": "브라우저의 시스템 설정에 따라 자동으로 라이트/다크 테마 설정",
+ "theme_selection": "테마 선택",
+ "theme_selection_description": "시스템의 다크 모드 설정에 따라 테마를 자동으로 적용합니다.",
"theme_setting_asset_list_storage_indicator_title": "타일에 서버 동기화 상태 표시",
"theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 항목 수 ({count})",
"theme_setting_colorful_interface_subtitle": "기본 색상을 배경에 적용",
@@ -1941,7 +1979,9 @@
"to_change_password": "비밀번호 변경",
"to_favorite": "즐겨찾기",
"to_login": "로그인",
+ "to_multi_select": "다중 선택",
"to_parent": "상위 항목으로",
+ "to_select": "선택",
"to_trash": "삭제",
"toggle_settings": "설정 변경",
"total": "전체",
@@ -1954,13 +1994,14 @@
"trash_emptied": "휴지통을 비웠습니다.",
"trash_no_results_message": "삭제된 사진과 동영상이 여기에 표시됩니다.",
"trash_page_delete_all": "모두 삭제",
- "trash_page_empty_trash_dialog_content": "휴지통을 비우시겠습니까? 휴지통의 모든 항목이 Immich에서 영구적으로 제거됩니다.",
+ "trash_page_empty_trash_dialog_content": "휴지통을 비우시겠습니까? 휴지통의 모든 항목이 Immich에서 영구적으로 삭제됩니다.",
"trash_page_info": "휴지통으로 이동된 항목은 {days}일 후 영구적으로 삭제됩니다.",
"trash_page_no_assets": "휴지통이 비어 있음",
"trash_page_restore_all": "모두 복원",
"trash_page_select_assets_btn": "항목 선택",
"trash_page_title": "휴지통 ({count})",
"trashed_items_will_be_permanently_deleted_after": "휴지통으로 이동된 항목은 {days, plural, one {#일} other {#일}} 후 영구적으로 삭제됩니다.",
+ "troubleshoot": "트러블슈팅",
"type": "형식",
"unable_to_change_pin_code": "PIN 코드를 변경할 수 없음",
"unable_to_setup_pin_code": "PIN 코드를 설정할 수 없음",
@@ -1991,6 +2032,7 @@
"unstacked_assets_count": "항목 {count, plural, one {#개} other {#개}}의 스택을 풀었습니다.",
"untagged": "태그 해제됨",
"up_next": "다음",
+ "update_location_action_prompt": "선택한 {count}개 항목 위치 업데이트:",
"updated_at": "업데이트됨",
"updated_password": "비밀번호가 변경되었습니다.",
"upload": "업로드",
@@ -2023,11 +2065,11 @@
"user_pin_code_settings_description": "PIN 코드를 변경하거나 잊어버린 경우 초기화합니다.",
"user_privacy": "개인정보",
"user_purchase_settings": "구매",
- "user_purchase_settings_description": "구매 설정을 관리하고 제품 키를 등록 또는 제거합니다.",
+ "user_purchase_settings_description": "구매 설정을 관리하고 키를 등록 및 제거합니다.",
"user_role_set": "{user}에게 {role} 역할 지정",
"user_usage_detail": "사용자 사용량 상세",
- "user_usage_stats": "계정 사용량 통계",
- "user_usage_stats_description": "사진 및 동영상의 총 개수와 범주별 현황을 확인합니다.",
+ "user_usage_stats": "사용량 통계",
+ "user_usage_stats_description": "계정의 전체 및 범주별 사용량을 확인합니다.",
"username": "계정명",
"users": "사용자",
"users_added_to_album_count": "사용자 {count, plural, one {#명} other {#명}}을 앨범에 추가했습니다.",
@@ -2041,8 +2083,8 @@
"version_history": "버전 기록",
"version_history_item": "{date} {version} 설치",
"video": "동영상",
- "video_hover_setting": "마우스 오버로 영상 미리보기",
- "video_hover_setting_description": "영상 섬네일 위에 마우스를 올리면 미리보기가 재생됩니다. 비활성화해도 재생 아이콘에 마우스를 올려 미리볼 수 있습니다.",
+ "video_hover_setting": "섬네일 영상 미리보기",
+ "video_hover_setting_description": "섬네일 위에 마우스를 올리면 미리보기를 재생합니다. 비활성화해도 재생 아이콘에 마우스를 올려 미리볼 수 있습니다.",
"videos": "동영상",
"videos_count": "동영상 {count, plural, one {#개} other {#개}}",
"view": "보기",
@@ -2057,6 +2099,7 @@
"view_next_asset": "다음 항목 보기",
"view_previous_asset": "이전 항목 보기",
"view_qr_code": "QR 코드 보기",
+ "view_similar_photos": "비슷한 사진 보기",
"view_stack": "스택 보기",
"view_user": "사용자 보기",
"viewer_remove_from_stack": "스택에서 제거",
@@ -2075,5 +2118,6 @@
"yes": "네",
"you_dont_have_any_shared_links": "공유 링크가 없습니다.",
"your_wifi_name": "Wi-Fi 네트워크 이름",
- "zoom_image": "이미지 확대"
+ "zoom_image": "이미지 확대",
+ "zoom_to_bounds": "화면에 맞춰 확대"
}
diff --git a/i18n/lt.json b/i18n/lt.json
index a35ddfa775..b849d335a4 100644
--- a/i18n/lt.json
+++ b/i18n/lt.json
@@ -28,13 +28,16 @@
"add_to_album": "Pridėti į albumą",
"add_to_album_bottom_sheet_added": "Pridėta į {album}",
"add_to_album_bottom_sheet_already_exists": "Jau yra albume {album}",
+ "add_to_album_toggle": "Perjungti pažymėjimus albumui {album}",
+ "add_to_albums": "Pridėti į albumus",
+ "add_to_albums_count": "Pridėti į albumus ({count})",
"add_to_shared_album": "Pridėti į bendrinamą albumą",
"add_url": "Pridėti URL",
"added_to_archive": "Pridėta į archyvą",
"added_to_favorites": "Pridėta prie mėgstamiausių",
"added_to_favorites_count": "{count, plural, one {# pridėtas} few {# pridėti} other {# pridėta}} prie mėgstamiausių",
"admin": {
- "add_exclusion_pattern_description": "Pridėti išimčių taisyklęs. Plaikomi simboliai *,**, ir ?. Ignoruoti bet kokius failus bet kuriame aplanke užvadintame \"Raw\", naudokite \"**/RAW/**\". Ignoravimui failų su plėtiniu \".tif\", naudokite \"**/*.tiff\". Aplanko kelio nustatymams, naudokite \"/aplanko/kelias/ignoruoti/**\"",
+ "add_exclusion_pattern_description": "Pridėti išimčių taisykles. Palaikomi simboliai *,**, ir ?. Ignoruoti bet kokius failus bet kuriame aplanke pavadintame \"Raw\", naudokite \"**/RAW/**\". Ignoravimui failų su plėtiniu \".tif\", naudokite \"**/*.tiff\". Aplanko kelio nustatymams, naudokite \"/aplanko/kelias/ignoruoti/**\".",
"admin_user": "Administratorius",
"asset_offline_description": "Šis išorinės bibliotekos elementas nebepasiekiamas diske ir buvo perkeltas į šiukšliadėžę. Jei failas buvo perkeltas toje pačioje bibliotekoje, laiko skalėje rasite naują atitinkamą elementą. Jei norite šį elementą atkurti, įsitikinkite, kad Immich gali pasiekti failą žemiau nurodytu adresu, ir suvykdykite bibliotekos skenavimą.",
"authentication_settings": "Autentifikavimo nustatymai",
@@ -45,6 +48,10 @@
"backup_database": "Sukurti duomenų bazės išklotinę",
"backup_database_enable_description": "Įgalinti duomenų bazės išklotinės",
"backup_keep_last_amount": "Išsaugomų ankstesnių duomenų bazės išklotinių skaičius",
+ "backup_onboarding_1_description": "išorinė kopija debesyje arba kitoje fizinėje lokacijoje.",
+ "backup_onboarding_2_description": "vietinės kopijos kituose prietaisuose. Tai apima pagrindinius failus ir jų vietines kopijas.",
+ "backup_onboarding_3_description": "viso jūsų duomenų kopijų, įskaitant originalius failus. Tai apima 1 išorinę ir 2 vietines kopijas.",
+ "backup_onboarding_description": "Jūsų duomenų apsaugojimui rekomenduojama {label} este eticheta de stocare a utilizatorului",
"system_settings": "Setǎri de Sistem",
@@ -285,9 +297,9 @@
"template_settings_description": "Gestionați șabloanele personalizate pentru notificări",
"theme_custom_css_settings": "CSS personalizat",
"theme_custom_css_settings_description": "Foile de stil în cascadă (CSS) permit personalizarea designului Immich.",
- "theme_settings": "Setări Temă",
+ "theme_settings": "Setări temă",
"theme_settings_description": "Gestionează personalizarea interfeței web Immich",
- "thumbnail_generation_job": "Generare Miniaturi",
+ "thumbnail_generation_job": "Generare miniaturi",
"thumbnail_generation_job_description": "Generează miniaturi mari, mici și estompate pentru fiecare resursă, precum și miniaturi pentru fiecare persoană",
"transcoding_acceleration_api": "API de accelerare",
"transcoding_acceleration_api_description": "API-ul care va interacționa cu dispozitivul tău pentru a accelera transcodarea. Această setare este 'cel mai bun efort': va reveni la transcodarea software în caz de eșec. VP9 poate funcționa sau nu, în funcție de hardware-ul tău.",
@@ -313,7 +325,7 @@
"transcoding_disabled_description": "Nu transcodifică niciun videoclip; acest lucru poate afecta redarea pe anumite dispozitive",
"transcoding_encoding_options": "Opțiuni codificare",
"transcoding_encoding_options_description": "Setează codecuri , calitatea, rezoluția și alte opțiuni pentru videoclipuri codificare",
- "transcoding_hardware_acceleration": "Accelerare Hardware",
+ "transcoding_hardware_acceleration": "Accelerare hardware",
"transcoding_hardware_acceleration_description": "Experimental: transcodare mai rapidă, dar poate reduce calitatea la aceeași rată de biți",
"transcoding_hardware_decoding": "Decodare hardware",
"transcoding_hardware_decoding_setting_description": "Se aplică doar pentru NVENC, QSV și RKMPP. Activează accelerarea completă în loc de doar accelerarea codificării. S-ar putea să nu funcționeze pentru toate videoclipurile.",
@@ -333,7 +345,7 @@
"transcoding_reference_frames": "Cadre de referință",
"transcoding_reference_frames_description": "Numărul de cadre de referință atunci când se comprimă un cadru dat. Valorile mai mari îmbunătățesc eficiența compresiei, dar încetinesc codarea. 0 setează această valoare automat.",
"transcoding_required_description": "Numai videoclipuri care nu sunt într-un format acceptat",
- "transcoding_settings": "Setări de Transcodare Video",
+ "transcoding_settings": "Setări de transcodare video",
"transcoding_settings_description": "Gestionează care videoclipuri să transcodam și cum să le procesam",
"transcoding_target_resolution": "Rezoluția țintă",
"transcoding_target_resolution_description": "Rezoluțiile mai mari pot păstra mai multe detalii, dar necesită mai mult timp pentru codare, au dimensiuni mai mari ale fișierelor și pot reduce răspunsul aplicației.",
@@ -354,6 +366,9 @@
"trash_number_of_days_description": "Numǎr de zile pentru pǎstrarea fișierelor în coșul de gunoi pânǎ la ștergerea permanentǎ",
"trash_settings": "Setǎri Coș de Gunoi",
"trash_settings_description": "Gestioneazǎ setǎrile coșului de gunoi",
+ "unlink_all_oauth_accounts": "Deconectează toate conturile OAuth",
+ "unlink_all_oauth_accounts_description": "Nu uita să deconectezi toate conturile OAuth înainte de a migra la un nou furnizor.",
+ "unlink_all_oauth_accounts_prompt": "Ești sigur că vrei să deconectezi toate conturile OAuth? Aceasta va reseta ID-ul OAuth pentru fiecare utilizator și nu poate fi anulată.",
"user_cleanup_job": "Curățare utilizator",
"user_delete_delay": "Contul și resursele utilizatorului {user} vor fi programate pentru ștergere permanentă în {delay, plural, one {# zi} other {# zile}}.",
"user_delete_delay_settings": "Întârziere la ștergere",
@@ -361,27 +376,25 @@
"user_delete_immediately": "Contul și resursele utilizatorului {user} vor fi puse în coadă pentru ștergere permanentă imediat.",
"user_delete_immediately_checkbox": "Pune utilizatorul și resursele în coadă pentru ștergere imediată",
"user_details": "Detalii utilizator",
- "user_management": "Gestionarea Utilizatorilor",
+ "user_management": "Gestionarea utilizatorilor",
"user_password_has_been_reset": "Parola utilizatorului a fost resetată:",
"user_password_reset_description": "Vă rugăm să furnizați utilizatorului parola temporară și să îi informați că va trebui să o schimbe la următoarea autentificare.",
"user_restore_description": "Contul utilizatorului {user} va fi restaurat.",
"user_restore_scheduled_removal": "Restaurare utilizator - ștergere programată pe {date, date, long}",
- "user_settings": "Setǎri Utilizator",
+ "user_settings": "Setǎri utilizator",
"user_settings_description": "Gestioneazǎ setǎrile utilizatorului",
"user_successfully_removed": "Utilizatorul {email} a fost eliminat cu succes.",
"version_check_enabled_description": "Activează verificarea versiunii",
"version_check_implications": "Funcția de verificare a versiunii se bazează pe comunicarea periodică cu github.com",
- "version_check_settings": "Verificare Versiune",
+ "version_check_settings": "Verificare versiune",
"version_check_settings_description": "Activeazǎ/dezactiveazǎ notificarea unei noi versiuni",
"video_conversion_job": "Transcodați videoclipuri",
"video_conversion_job_description": "Transcodați videoclipurile pentru o compatibilitate mai mare cu browserele și dispozitivele"
},
- "admin_email": "E-mail Administrator",
- "admin_password": "Parolă Administrator",
+ "admin_email": "E-mail administrator",
+ "admin_password": "Parolă administrator",
"administration": "Administrare",
"advanced": "Avansat",
- "advanced_settings_beta_timeline_subtitle": "Încearcă noua experiență în aplicație",
- "advanced_settings_beta_timeline_title": "Cronologie beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Utilizați această opțiune pentru a filtra conținutul media în timpul sincronizării pe baza unor criterii alternative. Încercați numai dacă întâmpinați probleme cu aplicația la detectarea tuturor albumelor.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Utilizați filtrul alternativ de sincronizare a albumelor de pe dispozitiv",
"advanced_settings_log_level_title": "Nivel log: {level}",
@@ -389,6 +402,8 @@
"advanced_settings_prefer_remote_title": "Preferă fotografii la distanță",
"advanced_settings_proxy_headers_subtitle": "Definește antetele proxy pe care Immich ar trebui să le trimită cu fiecare solicitare de rețea",
"advanced_settings_proxy_headers_title": "Antete Proxy",
+ "advanced_settings_readonly_mode_subtitle": "Activează modul doar-citire, în care fotografiile pot fi doar vizualizate, iar acțiuni precum selectarea mai multor imagini, partajarea, redarea pe alt dispozitiv sau ștergerea sunt dezactivate. Activează/Dezactivează modul doar-citire din avatarul utilizatorului de pe ecranul principal",
+ "advanced_settings_readonly_mode_title": "Mod doar-citire",
"advanced_settings_self_signed_ssl_subtitle": "Omite verificare certificate SSL pentru distinația server-ului, necesar pentru certificate auto-semnate.",
"advanced_settings_self_signed_ssl_title": "Permite certificate SSL auto-semnate",
"advanced_settings_sync_remote_deletions_subtitle": "Ștergeți sau restaurați automat un element de pe acest dispozitiv atunci când acțiunea este efectuată pe web",
@@ -416,6 +431,7 @@
"album_remove_user_confirmation": "Ești sigur că dorești eliminarea {user}?",
"album_search_not_found": "Nu s-au găsit albume care să corespundă căutării dumneavoastră",
"album_share_no_users": "Se pare că ai partajat acest album cu toți utilizatorii sau nu ai niciun utilizator cu care să-l partajezi.",
+ "album_summary": "Rezumat album",
"album_updated": "Album actualizat",
"album_updated_setting_description": "Primiți o notificare prin e-mail când un album partajat are elemente noi",
"album_user_left": "A părăsit {album}",
@@ -454,6 +470,7 @@
"app_bar_signout_dialog_title": "Deconectare",
"app_settings": "Setări Aplicație",
"appears_in": "Apare în",
+ "apply_count": "Aplică ({count, number})",
"archive": "Arhivă",
"archive_action_prompt": "{count} adăugate la Arhivă",
"archive_or_unarchive_photo": "Arhiveazǎ sau dezarhiveazǎ fotografia",
@@ -472,7 +489,7 @@
"asset_description_updated": "Descrierea resursei a fost actualizată",
"asset_filename_is_offline": "Resursa {filename} este offline",
"asset_has_unassigned_faces": "Resursa are fețe neatribuite",
- "asset_hashing": "Calculare amprentă digitală",
+ "asset_hashing": "Calculare amprentă digitală…",
"asset_list_group_by_sub_title": "Grupare după",
"asset_list_layout_settings_dynamic_layout_title": "Aspect dinamic",
"asset_list_layout_settings_group_automatically": "Automat",
@@ -486,6 +503,8 @@
"asset_restored_successfully": "Date restaurate cu succes",
"asset_skipped": "Sărit",
"asset_skipped_in_trash": "În coșul de gunoi",
+ "asset_trashed": "Resursă ștearsă",
+ "asset_troubleshoot": "Depanare resursă",
"asset_uploaded": "Încărcat",
"asset_uploading": "Se incarcă…",
"asset_viewer_settings_subtitle": "Gestionați setările de vizualizare a galeriei",
@@ -493,7 +512,9 @@
"assets": "Resurse",
"assets_added_count": "Adăugat {count, plural, one {# resursă} other {# resurse}}",
"assets_added_to_album_count": "Am adăugat {count, plural, one {# resursă} other {# resurse}} în album",
+ "assets_added_to_albums_count": "Au fost adăugate {assetTotal, plural, one {# element} other {# elemente}} la {albumTotal, plural, one {# album} other {# albume}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} nu pot fi adăugate în album",
+ "assets_cannot_be_added_to_albums": "{count, plural, one {Elementul} other {Elementele}} nu poate fi adăugat la niciunul dintre albume",
"assets_count": "{count, plural, one {# resursă} other {# resurse}}",
"assets_deleted_permanently": "{count} poză/poze ștearsă/șterse permanent",
"assets_deleted_permanently_from_server": "{count} poză/poze ștearsă/șterse permanent din serverul Immich",
@@ -510,14 +531,17 @@
"assets_trashed_count": "Mutat în coșul de gunoi {count, plural, one {# resursă} other {# resurse}}",
"assets_trashed_from_server": "{count} resursă(e) eliminate de pe serverul Immich",
"assets_were_part_of_album_count": "{count, plural, one {Resursa era} other {Resursele erau}} deja parte din album",
+ "assets_were_part_of_albums_count": "{count, plural, one {Asset was} other {Assets were}} deja parte din albume",
"authorized_devices": "Dispozitive Autorizate",
"automatic_endpoint_switching_subtitle": "Conectează-te local prin rețeaua Wi‐Fi configurată când este valabilă și prin rețele alternative în caz contrar",
"automatic_endpoint_switching_title": "Alternare URL automată",
"autoplay_slideshow": "Derulare slideshow automat",
"back": "Înapoi",
"back_close_deselect": "Înapoi, închidere sau deselectare",
+ "background_backup_running_error": "Procesul de backup în fundal este activ, nu se poate porni backup manual",
"background_location_permission": "Permisiune locație în fundal",
"background_location_permission_content": "Pentru a putea schimba rețeaua activă în fundal, Immich are nevoie de acces *permanent* la locația precisă pentru a citi numele rețelei Wi-Fi",
+ "background_options": "Opțiuni de fundal",
"backup": "Backup",
"backup_album_selection_page_albums_device": "Albume în dispozitiv ({count})",
"backup_album_selection_page_albums_tap": "Apasă odata pentru a include, de două ori pentru a exclude",
@@ -525,6 +549,7 @@
"backup_album_selection_page_select_albums": "Selectează albume",
"backup_album_selection_page_selection_info": "Informații selecție",
"backup_album_selection_page_total_assets": "Total resurse unice",
+ "backup_albums_sync": "Sincronizarea albumelor de backup",
"backup_all": "Toate",
"backup_background_service_backup_failed_message": "Eșuare backup resurse. Reîncercare…",
"backup_background_service_connection_failed_message": "Conectare la server eșuată. Reîncercare…",
@@ -564,7 +589,7 @@
"backup_controller_page_remainder": "Rămas(e)",
"backup_controller_page_remainder_sub": "Fotografii și videoclipuri din selecție rămase pentru backup",
"backup_controller_page_server_storage": "Stocare server",
- "backup_controller_page_start_backup": "Începe backup",
+ "backup_controller_page_start_backup": "Începe copia de rezervă",
"backup_controller_page_status_off": "Backup-ul automat în prim-plan este oprit",
"backup_controller_page_status_on": "Backup-ul automat în prim-plan este pornit",
"backup_controller_page_storage_format": "{used} din {total} folosit",
@@ -579,12 +604,11 @@
"backup_manual_in_progress": "Încărcarea este deja în curs. Încearcă din nou mai târziu",
"backup_manual_success": "Succes",
"backup_manual_title": "Status încărcare",
- "backup_options_page_title": "Opțiuni Backup",
+ "backup_options": "Opțiuni copie de rezervă",
+ "backup_options_page_title": "Opțiuni copie de rezervă",
"backup_setting_subtitle": "Schimbă opțiuni pentru backup în prim-plan și în fundal",
"backup_settings_subtitle": "Gestionați setările de încărcare",
"backward": "În sens invers",
- "beta_sync": "Starea sincronizării Beta",
- "beta_sync_subtitle": "Gestionați noul sistem de sincronizare",
"biometric_auth_enabled": "Autentificare biometrică activată",
"biometric_locked_out": "Sunteți blocați de la autentificare biometrică",
"biometric_no_options": "Nu sunt disponibile opțiuni biometrice",
@@ -592,7 +616,7 @@
"birthdate_saved": "Data nașterii salvată cu succes",
"birthdate_set_description": "Data nașterii este utilizată pentru a calcula vârsta acestei persoane la momentul realizării fotografiei.",
"blurred_background": "Fundal neclar",
- "bugs_and_feature_requests": "Erori și Solicitări de Caracteristici",
+ "bugs_and_feature_requests": "Erori și solicitări de caracteristici",
"build": "Versiunea",
"build_image": "Versiune Imagine",
"bulk_delete_duplicates_confirmation": "Ești sigur că vrei să ștergi în masă {count, plural, one {# resursă duplicată} other {# resurse duplicate}}? Aceasta va păstra cea mai mare resursă din fiecare grup și va șterge permanent toate celelalte duplicate. Nu poți anula această acțiune!",
@@ -642,6 +666,8 @@
"change_pin_code": "Schimbă codul PIN",
"change_your_password": "Schimbă-ți parola",
"changed_visibility_successfully": "Schimbare vizibilitate cu succes",
+ "charging": "Încărcare",
+ "charging_requirement_mobile_backup": "Pentru copia de rezervă în fundal, dispozitivul trebuie să fie în curs de încărcare",
"check_corrupt_asset_backup": "Verifică copii de rezervă a resurselor corupte",
"check_corrupt_asset_backup_button": "Efectuează verificarea",
"check_corrupt_asset_backup_description": "Rulează această verificare doar prin Wi-Fi și doar după ce toate resursele au fost salvate în copia de rezerva. Procedura poate dura câteva minute.",
@@ -693,7 +719,7 @@
"control_bottom_app_bar_delete_from_immich": "Șterge din Immich",
"control_bottom_app_bar_delete_from_local": "Șterge din dispozitiv",
"control_bottom_app_bar_edit_location": "Editează locație",
- "control_bottom_app_bar_edit_time": "Editează Data și Ora",
+ "control_bottom_app_bar_edit_time": "Editează data și ora",
"control_bottom_app_bar_share_link": "Partajează linkul",
"control_bottom_app_bar_share_to": "Distribuire către",
"control_bottom_app_bar_trash_from_immich": "Mută în coș",
@@ -728,6 +754,7 @@
"create_user": "Creează utilizator",
"created": "Creat",
"created_at": "Creat",
+ "creating_linked_albums": "Crearea albumelor cu link...",
"crop": "Decupează",
"curated_object_page_title": "Obiecte",
"current_device": "Dispozitiv curent",
@@ -747,6 +774,7 @@
"date_of_birth_saved": "Data nașterii salvată cu succes",
"date_range": "Interval de date",
"day": "Zi",
+ "days": "Zile",
"deduplicate_all": "Deduplicați Toate",
"deduplication_criteria_1": "Marimea imagini în octeți",
"deduplication_criteria_2": "Numărul de date EXIF",
@@ -831,10 +859,12 @@
"edit": "Editare",
"edit_album": "Editare album",
"edit_avatar": "Editare avatar",
- "edit_birthday": "Editează ziua de naștere",
+ "edit_birthday": "Modifică ziua de naștere",
"edit_date": "Editare dată",
"edit_date_and_time": "Editare dată și oră",
"edit_date_and_time_action_prompt": "{count} data și ora modificării",
+ "edit_date_and_time_by_offset": "Schimbă data prin decalaj",
+ "edit_date_and_time_by_offset_interval": "Noul interval de date: {from} - {to}",
"edit_description": "Editează descrierea",
"edit_description_prompt": "Vă rugăm să selectați o descriere nouă:",
"edit_exclusion_pattern": "Editarea modelului de excludere",
@@ -844,7 +874,7 @@
"edit_key": "Tastă de editare",
"edit_link": "Editare link",
"edit_location": "Editare locație",
- "edit_location_action_prompt": "{count} locație(i) editată(e)",
+ "edit_location_action_prompt": "{count} locație(i) modificată(e)",
"edit_location_dialog_title": "Locație",
"edit_name": "Editare nume",
"edit_people": "Editare persoane",
@@ -874,7 +904,9 @@
"error": "Eroare",
"error_change_sort_album": "Nu s-a putut modifica ordinea de sortare a albumului",
"error_delete_face": "Eroare la ștergerea feței din activ",
+ "error_getting_places": "Eroare la obținerea locațiilor",
"error_loading_image": "Eroare la încărcarea imaginii",
+ "error_loading_partners": "Eroare la încărcarea partenerilor: {error}",
"error_saving_image": "Eroare: {error}",
"error_tag_face_bounding_box": "Eroare la etichetarea feței - nu se pot obține coordonatele casetei de delimitare",
"error_title": "Eroare - ceva nu a mers",
@@ -907,6 +939,7 @@
"failed_to_load_notifications": "Nu s-au putut încărca notificările",
"failed_to_load_people": "Eșec la încărcarea persoanelor",
"failed_to_remove_product_key": "Eșec la eliminarea cheii de produs",
+ "failed_to_reset_pin_code": "Nu s-a reușit resetarea codului PIN",
"failed_to_stack_assets": "Eșec la combinarea resurselor",
"failed_to_unstack_assets": "Eșec la desfășurarea resurselor",
"failed_to_update_notification_status": "Nu s-a putut actualiza starea notificării",
@@ -915,6 +948,7 @@
"paths_validation_failed": "{paths, plural, one {# cale} other {# căi}} nu a trecut validarea",
"profile_picture_transparent_pixels": "Pozele de profil nu pot avea pixeli transparenți. Te rugăm să mărești imaginea și/sau să o muți.",
"quota_higher_than_disk_size": "Ați stabilit o valoare a spațiului de stocare mai mare decât dimensiunea discului",
+ "something_went_wrong": "Ceva nu a mers bine",
"unable_to_add_album_users": "Imposibil de adăugat utilizatori în album",
"unable_to_add_assets_to_shared_link": "Imposibil de adăugat resurse la link-ul partajat",
"unable_to_add_comment": "Imposibil de adăugat comentariu",
@@ -1022,7 +1056,7 @@
"export_database_description": "Exportați baza de date SQLite",
"extension": "Extensie",
"external": "Extern",
- "external_libraries": "Biblioteci Externe",
+ "external_libraries": "Biblioteci externe",
"external_network": "Rețea externă",
"external_network_sheet_info": "Când nu se află în rețeaua Wi-Fi preferată, aplicația se va conecta la server prin prima dintre adresele URL de mai jos pe care o poate accesa, începând de sus în jos",
"face_unassigned": "Nealocat",
@@ -1037,6 +1071,7 @@
"favorites_page_no_favorites": "Nu au fost găsite resurse favorite",
"feature_photo_updated": "Fotografie caracteristică actualizată",
"features": "Caracteristici",
+ "features_in_development": "Funcții în dezvoltare",
"features_setting_description": "Gestionați funcțiile aplicației",
"file_name": "Nume de fișier",
"file_name_or_extension": "Numele sau extensia fișierului",
@@ -1046,21 +1081,26 @@
"filter_people": "Filtrați persoanele",
"filter_places": "Filtrează locurile",
"find_them_fast": "Găsiți-le rapid prin căutare după nume",
+ "first": "Primul",
"fix_incorrect_match": "Remediați potrivirea incorectă",
"folder": "Dosar",
"folder_not_found": "Dosar negăsit",
"folders": "Foldere",
"folders_feature_description": "Răsfoire în conținutul folderului pentru fotografiile și videoclipurile din sistemul de fișiere",
+ "forgot_pin_code_question": "Ai uitat codul PIN?",
"forward": "Redirecționare",
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "Această funcție încarcă resurse externe de la Google pentru a funcționa.",
"general": "General",
+ "geolocation_instruction_location": "Apasă pe o resursă cu coordonate GPS pentru a folosi locația sa, sau selectează direct o locație de pe hartă",
"get_help": "Obțineți Ajutor",
"get_wifiname_error": "Nu s-a putut obține numele rețelei Wi-Fi. Asigurați-vă că ați acordat permisiunile necesare și că sunteți conectat la o rețea Wi-Fi",
"getting_started": "Noțiuni de Bază",
"go_back": "Întoarcere",
"go_to_folder": "Accesați folderul",
"go_to_search": "Spre căutare",
+ "gps": "GPS",
+ "gps_missing": "Fără GPS",
"grant_permission": "Acordați permisiunea",
"group_albums_by": "Grupați albume de...",
"group_country": "Grupare după țară",
@@ -1071,6 +1111,9 @@
"haptic_feedback_switch": "Activează feedback-ul haptic",
"haptic_feedback_title": "Feedback haptic",
"has_quota": "Are spațiu de stocare",
+ "hash_asset": "Hash-ul resursei",
+ "hashed_assets": "Resurse hashed",
+ "hashing": "Generare hash",
"header_settings_add_header_tip": "Adăugați antet",
"header_settings_field_validator_msg": "Valoarea nu poate fi goală",
"header_settings_header_name_input": "Numele antetului",
@@ -1097,11 +1140,12 @@
"home_page_favorite_err_partner": "Momentan nu se pot adăuga fișierele partenerului la favorite, omitere",
"home_page_first_time_notice": "Dacă este prima dată când utilizezi aplicația, te rugăm să te asiguri că alegi unul sau mai multe albume de backup, astfel încât cronologia să poată fi populată cu fotografiile și videoclipurile din aceste albume",
"home_page_locked_error_local": "Nu se pot muta resursele locale în folderul blocat, se omit",
- "home_page_locked_error_partner": "Nu se pot muta materialele partenerului în folderul blocat, se omit.",
+ "home_page_locked_error_partner": "Nu se pot muta resursele partenerului în folderul blocat, se omit.",
"home_page_share_err_local": "Nu se pot distribui fișiere locale prin link, omitere",
"home_page_upload_err_limit": "Se pot încărca maxim 30 de resurse odată, omitere",
"host": "Gazdă",
"hour": "Oră",
+ "hours": "Ore",
"id": "ID",
"idle": "Inactiv",
"ignore_icloud_photos": "Ignoră fotografiile din iCloud",
@@ -1161,10 +1205,13 @@
"language_no_results_title": "Nu au fost găsite limbi",
"language_search_hint": "Căutați limbi...",
"language_setting_description": "Selectați limba preferată",
+ "large_files": "Fișiere mari",
+ "last": "Ultimul",
"last_seen": "Văzut ultima dată",
"latest_version": "Ultima Versiune",
"latitude": "Latitudine",
"leave": "Părăsiți",
+ "leave_album": "Părăsește albumul",
"lens_model": "Model obiectiv",
"let_others_respond": "Permite altora să răspundă",
"level": "Nivel",
@@ -1178,6 +1225,7 @@
"library_page_sort_title": "Titlu album",
"licenses": "Licențe",
"light": "Lumină",
+ "like": "Îmi place",
"like_deleted": "Preferat șters",
"link_motion_video": "Link video în mișcare",
"link_to_oauth": "Link către OAuth",
@@ -1188,6 +1236,7 @@
"local": "Local",
"local_asset_cast_failed": "Nu se poate converti un element care nu este încărcat pe server",
"local_assets": "Asset-uri locale",
+ "local_media_summary": "Rezumatul fișierelor media locale",
"local_network": "Rețea locală",
"local_network_sheet_info": "Aplicația se va conecta la server prin intermediul acestei adrese URL atunci când utilizează rețeaua Wi-Fi specificată",
"location_permission": "Permisiunea de locație",
@@ -1199,6 +1248,7 @@
"location_picker_longitude_hint": "Introdu longitudinea aici",
"lock": "Blocare",
"locked_folder": "Dosar blocat",
+ "log_detail_title": "Detalii jurnal",
"log_out": "Deconectare",
"log_out_all_devices": "Deconectați-vă de la toate dispozitivele",
"logged_in_as": "Conectat ca {user}",
@@ -1229,6 +1279,7 @@
"login_password_changed_success": "Parola a fost actualizată cu succes",
"logout_all_device_confirmation": "Sigur doriți să deconectați toate dispozitivele?",
"logout_this_device_confirmation": "Sigur doriți să deconectați acest dispozitiv?",
+ "logs": "Jurnale",
"longitude": "Longitudine",
"look": "Examinare",
"loop_videos": "Buclă videoclipuri",
@@ -1236,6 +1287,7 @@
"main_branch_warning": "Utilizați o versiune de dezvoltare; vă recomandăm insistent să utilizați o versiune de lansare!",
"main_menu": "Meniu principal",
"make": "Face",
+ "manage_geolocation": "Gestionați locația",
"manage_shared_links": "Administrați link-urile distribuite",
"manage_sharing_with_partners": "Gestionați partajarea cu partenerii",
"manage_the_app_settings": "Gestionați setările aplicației",
@@ -1244,7 +1296,7 @@
"manage_your_devices": "Gestionați-vă dispozitivele conectate",
"manage_your_oauth_connection": "Gestionați-vă conexiunea OAuth",
"map": "Hartă",
- "map_assets_in_bounds": "{count, plural, one {# poză} other {# poze}}",
+ "map_assets_in_bounds": "{count, plural, =0 {Nu există fotografii în această zonă} one {# fotografie} other {# fotografii}}",
"map_cannot_get_user_location": "Nu se poate obține locația utilizatorului",
"map_location_dialog_yes": "Da",
"map_location_picker_page_use_location": "Folosește această locație",
@@ -1270,6 +1322,7 @@
"mark_as_read": "Marchează ca citit",
"marked_all_as_read": "Marcate toate ca citite",
"matches": "Corespunde",
+ "matching_assets": "Resurse similare",
"media_type": "Tip media",
"memories": "Amintiri",
"memories_all_caught_up": "Sunteți la zi",
@@ -1287,7 +1340,8 @@
"merge_people_successfully": "Persoane îmbinate cu succes",
"merged_people_count": "Imbinate {count, plural, one {# persoană} other {# persoane}}",
"minimize": "Minimizare",
- "minute": "Minute",
+ "minute": "Minut",
+ "minutes": "Minute",
"missing": "Lipsă",
"model": "Model",
"month": "Lună",
@@ -1307,6 +1361,10 @@
"my_albums": "Albumele mele",
"name": "Nume",
"name_or_nickname": "Nume sau poreclǎ",
+ "network_requirement_photos_upload": "Utilizați datele mobile pentru a face copii de rezervă ale fotografiilor",
+ "network_requirement_videos_upload": "Utilizați datele mobile pentru a face copii de rezervă ale videoclipurilor",
+ "network_requirements": "Cerințe privind rețeaua",
+ "network_requirements_updated": "Cerințele rețelei s-au modificat, resetarea cozii copiei de rezervă",
"networking_settings": "Rețele",
"networking_subtitle": "Gestionați setările endpoint-ului serverului",
"never": "Niciodată",
@@ -1316,6 +1374,7 @@
"new_person": "Persoanǎ nouǎ",
"new_pin_code": "Cod PIN nou",
"new_pin_code_subtitle": "Aceasta este prima dată când accesați folderul blocat. Creați un cod PIN pentru a accesa în siguranță această pagină",
+ "new_timeline": "Noua cronologie",
"new_user_created": "Utilizator nou creat",
"new_version_available": "VERSIUNE NOUĂ DISPONIBILĂ",
"newest_first": "Cel mai nou primul",
@@ -1329,20 +1388,25 @@
"no_assets_message": "CLICK PENTRU A ÎNCĂRCA PRIMA TA FOTOGRAFIE",
"no_assets_to_show": "Nicio resursă de afișat",
"no_cast_devices_found": "Nu s-au găsit dispozitive de difuzare",
+ "no_checksum_local": "Nu există checksum – nu se pot prelua resursele locale",
+ "no_checksum_remote": "Nu există checksum – nu se pot prelua resursele la distanță",
"no_duplicates_found": "Nu au fost găsite duplicate.",
"no_exif_info_available": "Nu există informații exif disponibile",
"no_explore_results_message": "Încarcați mai multe fotografii pentru a vă explora colecția.",
"no_favorites_message": "Adăugați favorite pentru a găsi rapid cele mai bune fotografii și videoclipuri",
"no_libraries_message": "Creați o bibliotecă externă pentru a vă vizualiza fotografiile și videoclipurile",
+ "no_local_assets_found": "Nicio resursă locală găsită cu acest checksum",
"no_locked_photos_message": "Fotografiile și videoclipurile din folderul blocat sunt ascunse și nu vor apărea atunci când răsfoiți sau căutați în bibliotecă.",
"no_name": "Fără Nume",
"no_notifications": "Nicio notificare",
"no_people_found": "Nu au fost găsite persoane potrivite căutării",
"no_places": "Nu există locuri",
+ "no_remote_assets_found": "Nicio resursă de la distanță găsită cu acest checksum",
"no_results": "Fără rezultate",
"no_results_description": "Încercați un sinonim sau un cuvânt cheie mai general",
"no_shared_albums_message": "Creați un album pentru a partaja fotografii și videoclipuri cu persoanele din rețeaua dvs",
"no_uploads_in_progress": "Nicio încărcare în curs",
+ "not_available": "N/A",
"not_in_any_album": "Nu există în niciun album",
"not_selected": "Neselectat",
"note_apply_storage_label_to_previously_uploaded assets": "Notă: Pentru a aplica eticheta de stocare la resursele încărcate anterior, rulați",
@@ -1358,6 +1422,7 @@
"oauth": "OAuth",
"official_immich_resources": "Resurse Oficiale Immich",
"offline": "Offline",
+ "offset": "Decalaj",
"ok": "Bine",
"oldest_first": "Cel mai vechi mai întâi",
"on_this_device": "Pe acest dispozitiv",
@@ -1376,6 +1441,8 @@
"open_the_search_filters": "Deschideți filtrele de căutare",
"options": "Opțiuni",
"or": "sau",
+ "organize_into_albums": "Organizați în albume",
+ "organize_into_albums_description": "Pune fotografiile existente în albume folosind setările curente de sincronizare",
"organize_your_library": "Organizează-ți biblioteca",
"original": "original",
"other": "Alte",
@@ -1435,6 +1502,9 @@
"permission_onboarding_permission_limited": "Permisiune limitată. Pentru a permite Immich să facă copii de siguranță și să gestioneze întreaga colecție de galerii, acordă permisiuni pentru fotografii și videoclipuri în Setări.",
"permission_onboarding_request": "Immich necesită permisiunea de a vizualiza fotografiile și videoclipurile tale.",
"person": "Persoanǎ",
+ "person_age_months": "{months, plural, one {# month} other {# months}} vechime",
+ "person_age_year_months": "1 year, {months, plural, one {# month} other {# months}} vechime",
+ "person_age_years": "{years, plural, other {# years}} vechime",
"person_birthdate": "Născut pe {date}",
"person_hidden": "{name}{hidden, select, true { (ascuns)} other {}}",
"photo_shared_all_users": "Se pare că ți-ai partajat fotografiile tuturor utilizatorilor sau că nu ai niciun utilizator căruia să le distribui.",
@@ -1458,6 +1528,7 @@
"port": "Port",
"preferences_settings_subtitle": "Gestionați preferințele aplicației",
"preferences_settings_title": "Preferințe",
+ "preparing": "Se prepară",
"preset": "Presetat",
"preview": "Previzualizare",
"previous": "Anterior",
@@ -1474,6 +1545,7 @@
"profile_drawer_client_out_of_date_minor": "Aplicația nu folosește ultima versiune. Te rugăm să actualizezi la ultima versiune minoră.",
"profile_drawer_client_server_up_to_date": "Aplicația client și server-ul sunt actualizate",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "Mod doar citire activat. Ține apăsat pe pictograma avatarului utilizatorului pentru a ieși.",
"profile_drawer_server_out_of_date_major": "Server-ul nu folosește ultima versiune. Te rugăm să actualizezi la ultima versiune majoră.",
"profile_drawer_server_out_of_date_minor": "Server-ul nu folosește ultima versiune. Te rugăm să actulizezi la ultima versiune minoră.",
"profile_image_of_user": "Imagine de profil a lui {user}",
@@ -1512,6 +1584,7 @@
"purchase_server_description_2": "Statutul de suporter",
"purchase_server_title": "Server",
"purchase_settings_server_activated": "Cheia de produs a serverului este gestionată de administrator",
+ "query_asset_id": "Interoghează ID-ul resursei",
"queue_status": "Se pun în coadă {count}/{total}",
"rating": "Evaluare cu stele",
"rating_clear": "Anulați evaluarea",
@@ -1519,6 +1592,9 @@
"rating_description": "Afișați evaluarea EXIF în panoul de informații",
"reaction_options": "Opțiuni de reacție",
"read_changelog": "Citiți Jurnalul de Modificări",
+ "readonly_mode_disabled": "Modul doar citire dezactivat",
+ "readonly_mode_enabled": "Modul doar citire activat",
+ "ready_for_upload": "Pregătit pentru încărcare",
"reassign": "Reatribuiți",
"reassigned_assets_to_existing_person": "Re-alocat {count, plural, one {# resursă} other {# resurse}} to {name, select, null {unei persoane existente} other {{name}}}",
"reassigned_assets_to_new_person": "Re-alocat {count, plural, one {# resursă} other {# resurse}} unei noi persoane",
@@ -1543,6 +1619,7 @@
"regenerating_thumbnails": "Se regenerează miniaturile",
"remote": "De la distanță",
"remote_assets": "Elemente la distanță",
+ "remote_media_summary": "Rezumat media de la distanță",
"remove": "Eliminați",
"remove_assets_album_confirmation": "Sigur doriți să eliminați {count, plural, one {# resursă} other {# resurse}} din album?",
"remove_assets_shared_link_confirmation": "Sigur doriți să eliminați {count, plural, one {# resursă} other {# resurse}} din acest link comun?",
@@ -1580,6 +1657,9 @@
"reset_password": "Resetare parolă",
"reset_people_visibility": "Resetați vizibilitatea persoanelor",
"reset_pin_code": "Resetare cod PIN",
+ "reset_pin_code_description": "Dacă ți-ai uitat codul PIN, poți contacta administratorul serverului pentru a-l reseta",
+ "reset_pin_code_success": "Codul PIN a fost resetat cu succes",
+ "reset_pin_code_with_password": "Puteți reseta oricând codul PIN cu ajutorul parolei",
"reset_sqlite": "Resetare bază de date SQLite",
"reset_sqlite_confirmation": "Sigur doriți să resetați baza de date SQLite? Va trebui să vă deconectați și să vă conectați din nou pentru a resincroniza datele",
"reset_sqlite_success": "Resetarea cu succes a bazei de date SQLite",
@@ -1592,8 +1672,10 @@
"restore_user": "Restabiliți utilizatorul",
"restored_asset": "Resursă restaurată",
"resume": "Reluare",
+ "resume_paused_jobs": "Reluați {count, plural, one {# paused job} other {# paused jobs}}",
"retry_upload": "Reîncercați încărcarea",
"review_duplicates": "Examinați duplicatele",
+ "review_large_files": "Revizuirea fișierelor mari",
"role": "Rol",
"role_editor": "Editor",
"role_viewer": "Vizualizator",
@@ -1605,7 +1687,7 @@
"saved_settings": "Setări salvate",
"say_something": "Spuneți ceva",
"scaffold_body_error_occurred": "A apărut o eroare",
- "scan_all_libraries": "Scanați Toate Bibliotecile",
+ "scan_all_libraries": "Scanați toate bibliotecile",
"scan_library": "Scanare",
"scan_settings": "Setări Scanare",
"scanning_for_album": "Se scanează după album...",
@@ -1684,6 +1766,7 @@
"select_user_for_sharing_page_err_album": "Creare album eșuată",
"selected": "Selectat",
"selected_count": "{count, plural, other {# selectat}}",
+ "selected_gps_coordinates": "Coordonate GPS selectate",
"send_message": "Trimiteți mesaj",
"send_welcome_email": "Trimiteți email de bun venit",
"server_endpoint": "Endpoint server",
@@ -1692,7 +1775,7 @@
"server_offline": "Serverul este offline",
"server_online": "Server online",
"server_privacy": "Confidențialitatea serverului",
- "server_stats": "Statistici Server",
+ "server_stats": "Statistici server",
"server_version": "Versiune Server",
"set": "Setați",
"set_as_album_cover": "Setați ca și copertă a albumului",
@@ -1751,6 +1834,7 @@
"shared_link_clipboard_copied_massage": "Copiat în clipboard",
"shared_link_clipboard_text": "Link: {link}\nParolă: {password}",
"shared_link_create_error": "Eroare în timpul creării linkului de distribuire",
+ "shared_link_custom_url_description": "Accesează acest link partajat cu un URL personalizat",
"shared_link_edit_description_hint": "Introdu descrierea distribuirii",
"shared_link_edit_expire_after_option_day": "1 zi",
"shared_link_edit_expire_after_option_days": "{count} zile",
@@ -1776,6 +1860,7 @@
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Administrează link-urile distribuite",
"shared_link_options": "Opțiuni de link partajat",
+ "shared_link_password_description": "Solicită o parolă pentru a accesa acest link partajat",
"shared_links": "Link-uri distribuite",
"shared_links_description": "Partajare imagini și clipuri printr-un link",
"shared_photos_and_videos_count": "{assetCount, plural, other {# fotografii și videoclipuri partajate.}}",
@@ -1810,6 +1895,7 @@
"show_slideshow_transition": "Afișați tranziția de prezentare",
"show_supporter_badge": "Insigna suporterului",
"show_supporter_badge_description": "Arată o insignă de suporter",
+ "show_text_search_menu": "Afișează meniul de căutare text",
"shuffle": "Amestecați",
"sidebar": "Bara laterală",
"sidebar_display_description": "Afișați un link către vizualizare în bara laterală",
@@ -1825,6 +1911,7 @@
"sort_created": "Data creării",
"sort_items": "Numărul de articole",
"sort_modified": "Data modificării",
+ "sort_newest": "Cea mai nouă fotografie",
"sort_oldest": "Cea mai veche fotografie",
"sort_people_by_similarity": "Sortează oameni după asemanare",
"sort_recent": "Cea mai recentă fotografie",
@@ -1839,6 +1926,7 @@
"stacktrace": "Urmă stivă",
"start": "Început",
"start_date": "Data de începere",
+ "start_date_before_end_date": "Data de început trebuie să fie înainte de data de sfârșit",
"state": "Situaţie",
"status": "Stare",
"stop_casting": "Opriți difuzarea",
@@ -1863,6 +1951,8 @@
"sync_albums_manual_subtitle": "Sincronizează toate videoclipurile și fotografiile încărcate cu albumele de rezervă selectate",
"sync_local": "Sincronizare locală",
"sync_remote": "Sincronizare la distanță",
+ "sync_status": "Status-ul sincronizării",
+ "sync_status_subtitle": "Vizualizează și gestionează sistemul de sincronizare",
"sync_upload_album_setting_subtitle": "Creează și încarcă fotografiile și videoclipurile tale în albumele selectate de pe Immich",
"tag": "Etichetă",
"tag_assets": "Eticheta resurselor",
@@ -1900,7 +1990,9 @@
"to_change_password": "Schimbaţi parola",
"to_favorite": "Favorit",
"to_login": "Conectare",
+ "to_multi_select": "pentru selecție multiplă",
"to_parent": "Du-te la părinte",
+ "to_select": "a selecta",
"to_trash": "Coș de gunoi",
"toggle_settings": "Activați setările",
"total": "Total",
@@ -1920,6 +2012,7 @@
"trash_page_select_assets_btn": "Selectează resurse",
"trash_page_title": "Coș ({count})",
"trashed_items_will_be_permanently_deleted_after": "Elementele din coșul de gunoi vor fi șterse definitiv după {days, plural, one {# zi} other {# zile}}.",
+ "troubleshoot": "Depanați",
"type": "Tip",
"unable_to_change_pin_code": "Nu se poate schimba codul PIN",
"unable_to_setup_pin_code": "Nu se poate configura codul PIN",
@@ -1946,10 +2039,11 @@
"unselect_all_duplicates": "Deselectați toate duplicatele",
"unselect_all_in": "Deselectați toate din {group}",
"unstack": "Dezasamblați",
- "unstack_action_prompt": "{count} unstacked",
+ "unstack_action_prompt": "{count} neîmpachetate",
"unstacked_assets_count": "Nestivuit {count, plural, one {# resursă} other {# resurse}}",
"untagged": "Neetichetat",
"up_next": "Mai departe",
+ "update_location_action_prompt": "Actualizează locația pentru {count} resurse selectate cu:",
"updated_at": "Actualizat",
"updated_password": "Parolă actualizată",
"upload": "Încărcați",
@@ -2016,13 +2110,14 @@
"view_next_asset": "Vizualizați următoarea resursă",
"view_previous_asset": "Vizualizați resursa anterioară",
"view_qr_code": "Vezi cod QR",
+ "view_similar_photos": "Vizualizați poze similare",
"view_stack": "Vizualizați Stiva",
"view_user": "Vizualizare utilizator",
"viewer_remove_from_stack": "Șterge din grup",
"viewer_stack_use_as_main_asset": "Folosește ca resursă principală",
"viewer_unstack": "Anulează grup",
"visibility_changed": "Vizibilitatea schimbată pentru {count, plural, one {# persoană} other {# persoane}}",
- "waiting": "Așteptați",
+ "waiting": "În așteptare",
"warning": "Avertisment",
"week": "Sǎptǎmânǎ",
"welcome": "Bun venit",
@@ -2034,5 +2129,6 @@
"yes": "Da",
"you_dont_have_any_shared_links": "Nu aveți linkuri partajate",
"your_wifi_name": "Numele rețelei tale WiFi",
- "zoom_image": "Măriți Imaginea"
+ "zoom_image": "Măriți Imaginea",
+ "zoom_to_bounds": "Mărește la margini"
}
diff --git a/i18n/ru.json b/i18n/ru.json
index 4e3fdcf3ec..f17b5ce364 100644
--- a/i18n/ru.json
+++ b/i18n/ru.json
@@ -7,7 +7,7 @@
"action_common_update": "Обновить",
"actions": "Действия",
"active": "Выполняется",
- "activity": "Активность",
+ "activity": "Действия",
"activity_changed": "Активность {enabled, select, true {включена} other {отключена}}",
"add": "Добавить",
"add_a_description": "Добавить описание",
@@ -26,8 +26,9 @@
"add_tag": "Добавить тег",
"add_to": "Добавить в…",
"add_to_album": "Добавить в альбом",
- "add_to_album_bottom_sheet_added": "Добавлено в {album}",
- "add_to_album_bottom_sheet_already_exists": "Уже в {album}",
+ "add_to_album_bottom_sheet_added": "Добавлено в альбом {album}",
+ "add_to_album_bottom_sheet_already_exists": "Уже в альбоме {album}",
+ "add_to_album_bottom_sheet_some_local_assets": "Некоторые объекты не добавлены в альбом, поскольку еще не загружены на сервер",
"add_to_album_toggle": "Переключить выделение для альбома {album}",
"add_to_albums": "Добавить в альбомы",
"add_to_albums_count": "Добавить в альбомы ({count})",
@@ -35,11 +36,11 @@
"add_url": "Добавить URL",
"added_to_archive": "Добавлено в архив",
"added_to_favorites": "Добавлено в избранное",
- "added_to_favorites_count": "Добавлено{count, number} в избранное",
+ "added_to_favorites_count": "{count, plural, one {# объект добавлен} many {# объектов добавлено} other {# объекта добавлено}} в избранное",
"admin": {
"add_exclusion_pattern_description": "Добавьте шаблоны исключений. Поддерживаются символы подстановки *, ** и ?. Чтобы игнорировать все файлы в любом каталоге с именем \"Raw\", укажите \"**/Raw/**\". Чтобы игнорировать все файлы, заканчивающиеся на \".tif\", используйте \"**/*.tif\". Чтобы игнорировать путь целиком, укажите \"/path/to/ignore/**\".",
"admin_user": "Администратор",
- "asset_offline_description": "Этот файл внешней библиотеки не был найден на диске и был перемещён в корзину. Если файл был перемещён внутри библиотеки, проверьте временную шкалу, чтобы найти новый соответствующий ресурс. Чтобы восстановить файл, убедитесь, что путь ниже доступен для Immich и выполните сканирование библиотеки.",
+ "asset_offline_description": "Этот объект из внешней библиотеки не был обнаружен на диске и поэтому перемещён в корзину. Если файл объекта был перемещён внутри библиотеки, проверьте временную шкалу, чтобы найти новый соответствующий объект. Чтобы восстановить файл, убедитесь, что следующий путь доступен для Immich, и выполните сканирование библиотеки.",
"authentication_settings": "Настройки аутентификации",
"authentication_settings_description": "Управление паролями, OAuth и другими настройками аутентификации",
"authentication_settings_disable_all": "Вы уверены, что хотите отключить все методы входа? Вход будет полностью отключен.",
@@ -65,9 +66,9 @@
"confirm_reprocess_all_faces": "Вы уверены, что хотите повторно определить все лица? Будут также удалены имена со всех лиц.",
"confirm_user_password_reset": "Вы действительно хотите сбросить пароль пользователя {user}?",
"confirm_user_pin_code_reset": "Вы действительно хотите сбросить PIN-код пользователя {user}?",
- "create_job": "Создать задание",
+ "create_job": "Создать задачу",
"cron_expression": "Расписание (выражение планировщика cron)",
- "cron_expression_description": "Частота и время выполнения задания в формате планировщика cron. Воспользуйтесь при необходимости визуальным редактором Crontab Guru",
+ "cron_expression_description": "Частота и время выполнения задачи в формате планировщика cron. Воспользуйтесь при необходимости визуальным редактором Crontab Guru",
"cron_expression_presets": "Расписание (предустановленные варианты)",
"disable_login": "Отключить вход",
"duplicate_detection_job_description": "Запускает определение похожих изображений при помощи машинного зрения (зависит от умного поиска)",
@@ -77,7 +78,7 @@
"face_detection_description": "Обнаруживает лица на объектах с использованием машинного обучения. Для видео анализируется только миниатюра. Кнопка \"Обновить\" запускает повторную обработку всех объектов. \"Сброс\" — дополнительно удаляет все имеющиеся данные о лицах. \"Отсутствующие\" — ставит в очередь объекты, которые ещё не были обработаны. Обнаруженные лица помещаются в очередь для задачи Распознавание лиц и последующей их привязки к существующим или новым людям.",
"facial_recognition_job_description": "Группирует и назначает обнаруженные лица людям. Выполняется после завершения задачи Обнаружение лиц. Кнопка \"Сброс\" (пере)назначает все лица. \"Отсутствующие\" — добавляет в очередь обработки лица, не привязанные к человеку.",
"failed_job_command": "Команда {command} не выполнена для задачи: {job}",
- "force_delete_user_warning": "ПРЕДУПРЕЖДЕНИЕ: Это приведет к немедленному удалению пользователя и его ресурсов. Это действие невозможно отменить, и файлы не могут быть восстановлены.",
+ "force_delete_user_warning": "ПРЕДУПРЕЖДЕНИЕ: Это приведет к немедленному удалению пользователя и всех его объектов. Это действие невозможно отменить, файлы не смогут быть восстановлены.",
"image_format": "Формат",
"image_format_description": "WebP создает файлы меньшего размера, чем JPEG, но кодирует медленнее.",
"image_fullsize_description": "Полноразмерное изображение без метаданных, используется при увеличении",
@@ -100,11 +101,11 @@
"image_thumbnail_description": "Маленькая миниатюра с удаленными метаданными, используемая при просмотре групп фотографий, таких как основная временная шкала",
"image_thumbnail_quality_description": "Качество миниатюр от 1 до 100. Чем выше качество, тем лучше, но при этом создаются файлы большего размера и может снизиться скорость отклика приложения.",
"image_thumbnail_title": "Настройки миниатюр",
- "job_concurrency": "Параллельная обработка задания - {job}",
- "job_created": "Задание создано",
+ "job_concurrency": "Число параллельных потоков задачи {job}",
+ "job_created": "Задача создана",
"job_not_concurrency_safe": "Эта задача не обеспечивает безопасность параллельности выполнения.",
- "job_settings": "Настройки заданий",
- "job_settings_description": "Управление параллельной обработкой заданий",
+ "job_settings": "Настройки задач",
+ "job_settings_description": "Управление параллельностью выполнения задач",
"job_status": "Состояние выполнения задач",
"jobs_delayed": "{jobCount, plural, one {# отложена} other {# отложено}}",
"jobs_failed": "{jobCount, plural, other {# не удалось выполнить}}",
@@ -123,20 +124,27 @@
"logging_enable_description": "Включить ведение журнала",
"logging_level_description": "Если включено, выберите желаемый уровень журналирования.",
"logging_settings": "Ведение журнала",
+ "machine_learning_availability_checks": "Проверка доступности",
+ "machine_learning_availability_checks_description": "Автоматически определять и использовать доступные серверы машинного обучения",
+ "machine_learning_availability_checks_enabled": "Включить проверку доступности",
+ "machine_learning_availability_checks_interval": "Интервал проверки",
+ "machine_learning_availability_checks_interval_description": "Интервал в миллисекундах между проверками",
+ "machine_learning_availability_checks_timeout": "Тайм-аут запроса",
+ "machine_learning_availability_checks_timeout_description": "Время ожидания ответа сервера в миллисекундах для определения доступности",
"machine_learning_clip_model": "CLIP модель",
- "machine_learning_clip_model_description": "Названия моделей CLIP размещены здесь. Обратите внимание, что при изменении модели необходимо заново запустить задачу «Интеллектуальный поиск» для всех изображений.",
+ "machine_learning_clip_model_description": "Названия доступных CLIP моделей размещены здесь.\nПри изменении модели необходимо заново запустить задачу «Интеллектуальный поиск» для всех объектов.",
"machine_learning_duplicate_detection": "Поиск дубликатов",
"machine_learning_duplicate_detection_enabled": "Включить обнаружение дубликатов",
- "machine_learning_duplicate_detection_enabled_description": "Если этот параметр отключен, абсолютно идентичные файлы всё равно будут удалены из дубликатов.",
- "machine_learning_duplicate_detection_setting_description": "Используйте встраивания CLIP для поиска вероятных дубликатов",
- "machine_learning_enabled": "Включите машинное обучение",
- "machine_learning_enabled_description": "При отключении, все функции ML будут отключены независимо от следующих параметров.",
+ "machine_learning_duplicate_detection_enabled_description": "Если этот параметр отключён, абсолютно идентичные файлы всё равно не будут загружаться.",
+ "machine_learning_duplicate_detection_setting_description": "Использование CLIP моделей для выявления возможных дубликатов",
+ "machine_learning_enabled": "Включить машинное обучение",
+ "machine_learning_enabled_description": "При выключении будут отключены все функции ML независимо от следующих параметров.",
"machine_learning_facial_recognition": "Распознавание лиц",
"machine_learning_facial_recognition_description": "Обнаруживать, распознавать и группировать лица на изображениях",
"machine_learning_facial_recognition_model": "Модель для распознавания лиц",
- "machine_learning_facial_recognition_model_description": "Модели перечислены в порядке убывания размера. Большие модели работают медленнее и используют больше памяти, но дают лучшие результаты. Обратите внимание, что при смене модели необходимо повторно запустить задание распознавания лиц для всех изображений.",
+ "machine_learning_facial_recognition_model_description": "Модели перечислены в порядке убывания их размера. Большие модели работают медленнее и используют больше памяти, но дают лучшие результаты. При смене модели необходимо повторно запустить задачу распознавания лиц для всех изображений.",
"machine_learning_facial_recognition_setting": "Включить функцию распознавания лиц",
- "machine_learning_facial_recognition_setting_description": "Если отключить эту функцию, изображения не будут кодироваться для распознавания лиц и не будут заполнять раздел Люди на обзорной странице.",
+ "machine_learning_facial_recognition_setting_description": "При отключении этой функции изображения не будут кодироваться для распознавания лиц, и не будет заполняться раздел Люди.",
"machine_learning_max_detection_distance": "Максимальное различие изображений",
"machine_learning_max_detection_distance_description": "Максимальное различие между двумя изображениями, чтобы считать их дубликатами, в диапазоне 0,001-0,1. Более высокие значения позволяют обнаружить больше дубликатов, но могут привести к ложным срабатываниям.",
"machine_learning_max_recognition_distance": "Порог распознавания",
@@ -146,13 +154,13 @@
"machine_learning_min_recognized_faces": "Минимум распознанных лиц",
"machine_learning_min_recognized_faces_description": "Минимальное количество распознанных лиц для создания человека. Увеличение этого параметра делает распознавание лиц более точным, но при этом увеличивается вероятность того, что лицо не будет присвоено человеку.",
"machine_learning_settings": "Настройки машинного обучения",
- "machine_learning_settings_description": "Управление функциями и настройками машинного обучения",
+ "machine_learning_settings_description": "Управление функциями и настройками машинного обучения (ML)",
"machine_learning_smart_search": "Интеллектуальный поиск",
- "machine_learning_smart_search_description": "Семантический поиск изображений с использованием вложений CLIP",
+ "machine_learning_smart_search_description": "Семантический (контекстный) поиск объектов с использованием CLIP моделей",
"machine_learning_smart_search_enabled": "Включить интеллектуальный поиск",
- "machine_learning_smart_search_enabled_description": "Если этот параметр отключен, изображения не будут кодироваться для интеллектуального поиска.",
+ "machine_learning_smart_search_enabled_description": "При отключении этой функции изображения не будут кодироваться для интеллектуального поиска.",
"machine_learning_url_description": "URL-адрес сервера машинного обучения. Если указано несколько, запросы будут отправляться по очереди на каждый, пока от одного из них не будет получен успешный ответ. Серверы, которые не отвечают, будут временно игнорироваться до тех пор, пока не станут снова доступны.",
- "manage_concurrency": "Управление параллельностью заданий",
+ "manage_concurrency": "Управление параллельностью",
"manage_log_settings": "Управление настройками журнала",
"map_dark_style": "Тёмный стиль",
"map_enable_description": "Включить функции карты",
@@ -170,9 +178,9 @@
"memory_cleanup_job": "Очистка воспоминаний",
"memory_generate_job": "Создание воспоминаний",
"metadata_extraction_job": "Извлечение метаданных",
- "metadata_extraction_job_description": "Извлекает метаданные из каждого файла, такие как местоположение, лица и разрешение",
+ "metadata_extraction_job_description": "Извлечение метаданных из файлов, таких как местоположение, лица и разрешение",
"metadata_faces_import_setting": "Включить импорт лиц",
- "metadata_faces_import_setting_description": "Импорт лиц из изображений EXIF-данных и файлов sidecar",
+ "metadata_faces_import_setting_description": "Импорт лиц из EXIF-данных и файлов sidecar",
"metadata_settings": "Настройки метаданных",
"metadata_settings_description": "Управление настройками метаданных",
"migration_job": "Миграция",
@@ -247,7 +255,7 @@
"reset_settings_to_default": "Сброс настроек до значений по умолчанию",
"reset_settings_to_recent_saved": "Не сохранённые изменения сброшены к последним сохраненным значениям",
"scanning_library": "Сканирование библиотеки",
- "search_jobs": "Поиск заданий…",
+ "search_jobs": "Поиск задач…",
"send_welcome_email": "Отправить приветственное письмо",
"server_external_domain_settings": "Внешний домен",
"server_external_domain_settings_description": "Домен для публичных ссылок, включая http(s)://",
@@ -268,8 +276,8 @@
"storage_template_hash_verification_enabled_description": "Включает проверку хеша, не отключайте её, если не уверены в последствиях",
"storage_template_migration": "Применение шаблона хранилища",
"storage_template_migration_description": "Применяет текущий {template} к ранее загруженным объектам",
- "storage_template_migration_info": "Расширения файлов всегда будут сохраняться в нижнем регистре. Изменения в шаблоне будут применяться только к новым ресурсам. Чтобы применить шаблон к ранее загруженным ресурсам, запустите {job}.",
- "storage_template_migration_job": "Задание по применению шаблона хранилища",
+ "storage_template_migration_info": "Расширения файлов всегда будут сохраняться в нижнем регистре. Изменения в шаблоне будут применяться только к новым объектам. Чтобы применить шаблон к ранее загруженным объектам, запустите {job}.",
+ "storage_template_migration_job": "Задача по применению шаблона хранилища",
"storage_template_more_details": "Для получения дополнительной информации об этой функции обратитесь к разделам документации {label} kullanıcını dosyaları için kullanılan alt klasördür",
"system_settings": "Sistem Ayarları",
"tag_cleanup_job": "Etiket temizleme",
@@ -286,14 +296,14 @@
"template_settings_description": "Bildirim şablonlarını yönet",
"theme_custom_css_settings": "Özel CSS",
"theme_custom_css_settings_description": "CSS (Cascading Style Sheets) kullanılarak Immich'in tasarımı değiştirilebilir.",
- "theme_settings": "Tema ayarları",
+ "theme_settings": "Tema Ayarları",
"theme_settings_description": "Immich web arayüzünün özelleştirilmesi ayarlarını yönet",
"thumbnail_generation_job": "Önizlemeleri oluştur",
- "thumbnail_generation_job_description": "Her kişi ve obje için büyük, küçük ve bulanık thumbnail (küçük resim) oluştur",
+ "thumbnail_generation_job_description": "Her bir öğe için büyük, küçük ve bulanık küçük resimler ile her kişi için küçük resimler oluşturun",
"transcoding_acceleration_api": "Hızlandırma API",
"transcoding_acceleration_api_description": "Video formatı çevriminde kullanılacak API. Bu ayara 'mümkün olduğunca' uyulmaktadır; seçilen API'da sorun çıkarsa yazılım tabanlı çevirime dönülür. VP9 donanımınıza bağlı olarak çalışmayabilir.",
"transcoding_acceleration_nvenc": "NVENC (NVIDIA GPU gerektirir)",
- "transcoding_acceleration_qsv": "Quick Sync (7. nesil veya daha yeni bir Intel CPU gerektirir)",
+ "transcoding_acceleration_qsv": "Hızlı Eşzamanlama (7. nesil veya daha yeni bir Intel CPU gerektirir)",
"transcoding_acceleration_rkmpp": "RKMPP (Sadece Rockchip SOC'ler)",
"transcoding_acceleration_vaapi": "VAAPI",
"transcoding_accepted_audio_codecs": "Kabul edilen ses kodekleri",
@@ -352,15 +362,18 @@
"transcoding_video_codec_description": "VP9 yüksek verimliliğe ve web uyumluluğuna sahiptir, ancak kod dönüştürme işlemi daha uzun sürer. HEVC benzer performans gösterir ancak web uyumluluğu daha düşüktür. H.264 geniş çapta uyumludur ve kod dönüştürmesi hızlıdır, ancak çok daha büyük dosyalar üretir. AV1 en verimli codec'tir ancak eski cihazlarda desteği yoktur.",
"trash_enabled_description": "Çöp özelliklerini etkinleştir",
"trash_number_of_days": "Gün sayısı",
- "trash_number_of_days_description": "Varlıkların kalıcı olarak silinmeden önce çöpte kaç gün tutulacağı",
- "trash_settings": "Çöp ayarları",
- "trash_settings_description": "Çöp ayarlarını yönet",
+ "trash_number_of_days_description": "Öğeleri kalıcı olarak silmeden önce çöp kutusunda tutma süresi (gün)",
+ "trash_settings": "Çöp Kutusu Ayarları",
+ "trash_settings_description": "Çöp kutusu ayarlarını yönet",
+ "unlink_all_oauth_accounts": "Tüm OAuth hesaplarının bağlantısını kaldır",
+ "unlink_all_oauth_accounts_description": "Yeni bir sağlayıcıya geçmeden önce tüm OAuth hesaplarını kaldırılmayı unutmayın.",
+ "unlink_all_oauth_accounts_prompt": "Tüm OAuth hesaplarını kaldırmak istediğinizden emin misiniz? Bu, her kullanıcı için OAuth kimliğini sıfırlar ve geri alınamaz.",
"user_cleanup_job": "Kullanıcı temizleme",
- "user_delete_delay": "{user} hesabı ve varlıkları {delay, plural, one {# day} other {# days}} gün içinde kalıcı olarak silinmek için planlandı.",
+ "user_delete_delay": "{user} hesabı ve öğeleri {delay, plural, one {# day} other {# days}} gün içinde kalıcı olarak silinecektir.",
"user_delete_delay_settings": "Silme gecikmesi",
- "user_delete_delay_settings_description": "Bir kullanıcının hesabını ve varlıklarını kalıcı olarak silmek için kaldırıldıktan sonra gereken gün sayısı. Kullanıcı silme işi, silinmeye hazır kullanıcıları kontrol etmek için gece yarısı çalışır. Bu ayardaki değişiklikler bir sonraki yürütmede değerlendirilecektir.",
- "user_delete_immediately": "{user}'in hesabı ve varlıkları hemen kalıcı olarak silinmek üzere sıraya alınacak.",
- "user_delete_immediately_checkbox": "Kullanıcı ve varlıkları hemen silinmek üzere sıraya al",
+ "user_delete_delay_settings_description": "Bir kullanıcının hesabını ve öğelerini kalıcı olarak silmek için kaldırıldıktan sonra gereken gün sayısı. Kullanıcı silme işi, silinmeye hazır kullanıcıları kontrol etmek için gece yarısı çalışır. Bu ayardaki değişiklikler bir sonraki yürütmede değerlendirilecektir.",
+ "user_delete_immediately": "{user}'in hesabı ve öğeleri hemen kalıcı olarak silinmek üzere sıraya alınacak.",
+ "user_delete_immediately_checkbox": "Kullanıcı ve öğeleri hemen silmek için sıraya alın",
"user_details": "Kullanıcı Ayrıntıları",
"user_management": "Kullanıcı Yönetimi",
"user_password_has_been_reset": "Kullanıcının şifresi sıfırlandı:",
@@ -368,32 +381,32 @@
"user_restore_description": "{user} kullanıcısı geri yüklenecek.",
"user_restore_scheduled_removal": "Kullanıcıyı geri yükle - {date, date, long} tarihinde planlanan kaldırma",
"user_settings": "Kullanıcı Ayarları",
- "user_settings_description": "Kullanıcı Ayarlarını Yönet",
+ "user_settings_description": "Kullanıcı ayarlarını yönet",
"user_successfully_removed": "Kullanıcı {email} başarıyla kaldırıldı.",
"version_check_enabled_description": "Sürüm kontrolü etkin",
"version_check_implications": "Sürüm kontrol özelliği, github.com ile periyodik iletişime dayanır",
- "version_check_settings": "Versiyon kontrolü",
+ "version_check_settings": "Sürüm Kontrolü",
"version_check_settings_description": "Yeni sürüm bildirimini etkinleştir/devre dışı bırak",
"video_conversion_job": "Videoları dönüştür",
"video_conversion_job_description": "Tarayıcılar ve cihazlarla daha geniş uyumluluk için videoları dönüştür"
},
- "admin_email": "Yönetici Emaili",
+ "admin_email": "Yönetici E-postası",
"admin_password": "Yönetici Şifresi",
"administration": "Yönetim",
"advanced": "Gelişmiş",
- "advanced_settings_beta_timeline_subtitle": "Yeni uygulama deneyimini deneyin",
- "advanced_settings_beta_timeline_title": "Beta Zaman Çizelgesi",
- "advanced_settings_enable_alternate_media_filter_subtitle": "Eşleme sırasında medyayı alternatif ölçütlere göre süzgeçten geçirmek için bu seçeneği kullanın. Uygulamanın tüm albümleri algılamasında sorun yaşıyorsanız yalnızca bu durumda deneyin.",
- "advanced_settings_enable_alternate_media_filter_title": "[DENEYSEL] Alternatif cihaz albüm eşleme süzgeci kullanın",
+ "advanced_settings_enable_alternate_media_filter_subtitle": "Eşzamanlama sırasında medyayı alternatif ölçütlere göre süzgeçten geçirmek için bu seçeneği kullanın. Uygulamanın tüm albümleri algılamasında sorun yaşıyorsanız yalnızca bu durumda deneyin.",
+ "advanced_settings_enable_alternate_media_filter_title": "[DENEYSEL] Alternatif cihaz albüm eşzamanlama süzgeci kullanın",
"advanced_settings_log_level_title": "Günlük düzeyi: {level}",
- "advanced_settings_prefer_remote_subtitle": "Bazı cihazlar yerel varlıklardan küçük resimleri yüklerken çok yavaş çalışır. Bu ayarı etkinleştirerek uzak görüntüleri yükleyin.",
+ "advanced_settings_prefer_remote_subtitle": "Bazı cihazlar yerel öğelerden küçük resimleri yüklerken çok yavaş çalışır. Bunun yerine uzak görüntüleri yüklemek için bu ayarı etkinleştirin.",
"advanced_settings_prefer_remote_title": "Uzak görüntüleri tercih et",
"advanced_settings_proxy_headers_subtitle": "Immich'in her ağ isteğiyle birlikte göndermesi gereken proxy header'ları tanımlayın",
"advanced_settings_proxy_headers_title": "Proxy Header'lar",
+ "advanced_settings_readonly_mode_subtitle": "Fotoğrafların yalnızca görüntülenebildiği salt okunur modu etkinleştirir; birden fazla görüntü seçme, paylaşma, aktarma, silme gibi işlemler devre dışı bırakılır. Ana ekrandan kullanıcı avatarı aracılığıyla salt okunur modu Etkinleştirin/Devre dışı bırakın",
+ "advanced_settings_readonly_mode_title": "Salt okunur Mod",
"advanced_settings_self_signed_ssl_subtitle": "Sunucu uç noktası için SSL sertifika doğrulamasını atlar. Kendinden imzalı sertifikalar için gereklidir.",
"advanced_settings_self_signed_ssl_title": "Kendi kendine imzalanmış SSL sertifikalarına izin ver",
- "advanced_settings_sync_remote_deletions_subtitle": "Web üzerinde işlem yapıldığında, bu aygıttaki varlığı otomatik olarak sil veya geri yükle",
- "advanced_settings_sync_remote_deletions_title": "Uzaktan silinmeleri eşle [DENEYSEL]",
+ "advanced_settings_sync_remote_deletions_subtitle": "Web üzerinde işlem yapıldığında, bu aygıttaki öğeyi otomatik olarak sil veya geri yükle",
+ "advanced_settings_sync_remote_deletions_title": "Uzaktan silmeleri eşzamanla [DENEYSEL]",
"advanced_settings_tile_subtitle": "Gelişmiş kullanıcı ayarları",
"advanced_settings_troubleshooting_subtitle": "Sorun giderme için ek özellikleri etkinleştirin",
"advanced_settings_troubleshooting_title": "Sorun Giderme",
@@ -417,14 +430,15 @@
"album_remove_user_confirmation": "{user} kullanıcısını kaldırmak istediğinize emin misiniz?",
"album_search_not_found": "Aramanızla eşleşen albüm bulunamadı",
"album_share_no_users": "Görünüşe göre bu albümü tüm kullanıcılarla paylaştınız veya paylaşacak herhangi bir başka kullanıcınız yok.",
+ "album_summary": "Albüm özeti",
"album_updated": "Albüm güncellendi",
- "album_updated_setting_description": "Paylaşılan bir albüme yeni bir varlık eklendiğinde email bildirimi alın",
+ "album_updated_setting_description": "Paylaşılan bir albüme yeni bir öğe eklendiğinde e-posta bildirimi alın",
"album_user_left": "{album}den ayrıldınız",
"album_user_removed": "{user} kaldırıldı",
"album_viewer_appbar_delete_confirm": "Bu albümü hesabınızdan silmek istediğinizden emin misiniz?",
"album_viewer_appbar_share_err_delete": "Albüm silinemedi",
"album_viewer_appbar_share_err_leave": "Albümden çıkılamadı",
- "album_viewer_appbar_share_err_remove": "Albümden öğeleri kaldırmada sorunlar var",
+ "album_viewer_appbar_share_err_remove": "Albümden öğeler kaldırırken sorunlar yaşanıyor",
"album_viewer_appbar_share_err_title": "Albüm başlığı değiştirilemedi",
"album_viewer_appbar_share_leave": "Albümden çık",
"album_viewer_appbar_share_to": "Paylaşma",
@@ -433,8 +447,8 @@
"albums": "Albümler",
"albums_count": "{count, plural, one {{count, number} Albüm} other {{count, number} Albüm}}",
"albums_default_sort_order": "Varsayılan albüm sıralama düzeni",
- "albums_default_sort_order_description": "Yeni albüm oluştururken kullanılacak başlangıç varlık sıralama düzeni.",
- "albums_feature_description": "Diğer kullanıcılarla paylaşılabilen varlık koleksiyonları.",
+ "albums_default_sort_order_description": "Yeni albüm oluştururken kullanılacak başlangıç öğe sıralama düzeni.",
+ "albums_feature_description": "Diğer kullanıcılarla paylaşılabilen öğe koleksiyonları.",
"albums_on_device_count": "Cihazdaki albümler ({count})",
"all": "Tümü",
"all_albums": "Tüm Albümler",
@@ -455,6 +469,7 @@
"app_bar_signout_dialog_title": "Çıkış",
"app_settings": "Uygulama Ayarları",
"appears_in": "Şurada görünür",
+ "apply_count": "Uygula ({count, number})",
"archive": "Arşiv",
"archive_action_prompt": "{count} arşive eklendi",
"archive_or_unarchive_photo": "Fotoğrafı arşivle/arşivden çıkar",
@@ -470,9 +485,9 @@
"asset_action_share_err_offline": "Çevrimdışı öğeler alınamıyor, atlanıyor",
"asset_added_to_album": "Albüme eklendi",
"asset_adding_to_album": "Albüme ekleniyor…",
- "asset_description_updated": "Varlık açıklaması güncellendi",
- "asset_filename_is_offline": "Varlık {filename} çevrimdışı",
- "asset_has_unassigned_faces": "Varlık, atanmamış yüzler içeriyor",
+ "asset_description_updated": "Öğe açıklaması güncellendi",
+ "asset_filename_is_offline": "Öğe {filename} çevrimdışı",
+ "asset_has_unassigned_faces": "Öğe, atanmamış yüzler içeriyor",
"asset_hashing": "Karma (hashleme) oluşturuluyor…",
"asset_list_group_by_sub_title": "Grupla",
"asset_list_layout_settings_dynamic_layout_title": "Dinamik düzen",
@@ -482,50 +497,58 @@
"asset_list_layout_sub_title": "Düzen",
"asset_list_settings_subtitle": "Fotoğraf ızgara düzeni ayarları",
"asset_list_settings_title": "Fotoğraf Izgarası",
- "asset_offline": "Varlık Çevrim Dışı",
- "asset_offline_description": "Bu harici varlık artık diskte bulunmuyor. Yardım için lütfen Immich yöneticinizle iletişime geçin.",
+ "asset_offline": "Öğe Çevrim Dışı",
+ "asset_offline_description": "Bu harici öğe artık diskte bulunmuyor. Yardım için lütfen Immich yöneticinizle iletişime geçin.",
"asset_restored_successfully": "Öğe başarıyla geri yüklendi",
"asset_skipped": "Atlandı",
"asset_skipped_in_trash": "Çöpte",
+ "asset_trashed": "Öğe çöpe atıldı",
+ "asset_troubleshoot": "Öğe Sorun Giderme",
"asset_uploaded": "Yüklendi",
"asset_uploading": "Yükleniyor…",
"asset_viewer_settings_subtitle": "Galeri görüntüleyici ayarlarını düzenle",
"asset_viewer_settings_title": "İçerik Görüntüleyici",
- "assets": "Varlıklar",
- "assets_added_count": "{count, plural, one {# varlık eklendi} other {# varlık eklendi}}",
- "assets_added_to_album_count": "{count, plural, one {# varlık} other {# varlık}} albüme eklendi",
- "assets_cannot_be_added_to_album_count": "{count, plural, one {Varlık} other {Varlıklar}} albüme eklenemiyor",
- "assets_count": "{count, plural, one {# varlık} other {# varlıklar}}",
+ "assets": "Öğeler",
+ "assets_added_count": "Eklendi {count, plural, one {# asset} other {# assets}}",
+ "assets_added_to_album_count": "Albüme {count, plural, one {# asset} other {# assets}} eklendi",
+ "assets_added_to_albums_count": "Eklendi {assetTotal, plural, one {# asset} other {# assets}} buraya {albumTotal, plural, one {# album} other {# albums}}",
+ "assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} albüme eklenemiyor",
+ "assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} hiçbir albüme eklenemez",
+ "assets_count": "{count, plural, one {# öğe} other {# öğeler}}",
"assets_deleted_permanently": "{count} öğe kalıcı olarak silindi",
"assets_deleted_permanently_from_server": "{count} öğe kalıcı olarak Immich sunucusundan silindi",
- "assets_downloaded_failed": "{count, plural, one {# dosya indirildi – {error} dosya indirilemedi} other {# dosya indirildi – {error} dosya indirilemedi}}",
+ "assets_downloaded_failed": "{count, plural, one {İndirilen # dosya - {error} dosya başarısız} other {İndirilen # dosyalar - {error} dosyalar başarısız oldu}}",
"assets_downloaded_successfully": "{count, plural, one {# dosya başarıyla indirildi} other {# dosya başarıyla indirildi}}",
- "assets_moved_to_trash_count": "{count, plural, one {# varlık} other {# varlık}} çöpe taşındı",
- "assets_permanently_deleted_count": "Kalıcı olarak silindi {count, plural, one {# varlık} other {# varlıklar}}",
- "assets_removed_count": "Kaldırıldı {count, plural, one {# varlık} other {# varlıklar}}",
+ "assets_moved_to_trash_count": "{count, plural, one {# öğe} other {# öğeler}} çöpe taşındı",
+ "assets_permanently_deleted_count": "Kalıcı olarak silindi {count, plural, one {# öğe} other {# öğeler}}",
+ "assets_removed_count": "Kaldırıldı {count, plural, one {# öğe} other {# öğeler}}",
"assets_removed_permanently_from_device": "{count} öğe cihazınızdan kalıcı olarak silindi",
- "assets_restore_confirmation": "Tüm çöp kutusundaki varlıklarınızı geri yüklemek istediğinizden emin misiniz? Bu işlemi geri alamazsınız! Ayrıca, çevrim dışı olan varlıkların bu şekilde geri yüklenemeyeceğini unutmayın.",
- "assets_restored_count": "{count, plural, one {# varlık} other {# varlıklar}} geri yüklendi",
- "assets_restored_successfully": "{count} öğe geri yüklendi",
+ "assets_restore_confirmation": "Tüm çöp kutusundaki öğeleri geri yüklemek istediğinizden emin misiniz? Bu işlemi geri alamazsınız! Ayrıca, çevrim dışı olan öğelerin bu şekilde geri yüklenemeyeceğini unutmayın.",
+ "assets_restored_count": "{count, plural, one {# öğe} other {# öğeler}} geri yüklendi",
+ "assets_restored_successfully": "{count} öğe başarıyla geri yüklendi",
"assets_trashed": "{count} öğe çöpe atıldı",
- "assets_trashed_count": "{count, plural, one {# varlık} other {# varlıklar}} çöp kutusuna taşındı",
- "assets_trashed_from_server": "{count} öğe Immich sunucusunda çöpe atıldı",
- "assets_were_part_of_album_count": "{count, plural, one {Varlık zaten} other {Varlıklar zaten}} albümün parçasıydı",
+ "assets_trashed_count": "{count, plural, one {# öğe} other {# öğeler}} çöp kutusuna taşındı",
+ "assets_trashed_from_server": "{count} öğe Immich sunucusundan çöpe atıldı",
+ "assets_were_part_of_album_count": "{count, plural, one {Öğe zaten} other {Öğeler zaten}} albümün parçasıydı",
+ "assets_were_part_of_albums_count": "{count, plural, one {Öğe zaten} other {Öğeler zaten}} albümlerin bir parçasıydı",
"authorized_devices": "Yetki Verilmiş Cihazlar",
"automatic_endpoint_switching_subtitle": "Belirlenmiş Wi-Fi ağına bağlıyken yerel olarak bağlanıp başka yerlerde alternatif bağlantıyı kullan",
"automatic_endpoint_switching_title": "Otomatik URL değiştirme",
"autoplay_slideshow": "Otomatik slayt gösterisi",
"back": "Geri",
"back_close_deselect": "Geri, kapat veya seçimi kaldır",
+ "background_backup_running_error": "Arka plan yedekleme şu anda çalışıyor, manuel yedekleme başlatılamıyor",
"background_location_permission": "Arka plan konum izni",
"background_location_permission_content": "Arka planda çalışırken ağ değiştirmek için Immich'in *her zaman* tam konum erişimine sahip olması gerekir, böylece uygulama Wi-Fi ağının adını okuyabilir",
+ "background_options": "Arka Plan Seçenekleri",
"backup": "Yedekle",
"backup_album_selection_page_albums_device": "Cihazdaki albümler ({count})",
"backup_album_selection_page_albums_tap": "Seçmek için dokunun, hariç tutmak için çift dokunun",
- "backup_album_selection_page_assets_scatter": "Varlıklar birden fazla albüme dağılabilir. Bu nedenle, yedekleme işlemi sırasında albümler dahil edilebilir veya hariç tutulabilir.",
+ "backup_album_selection_page_assets_scatter": "Öğeler birden fazla albüme dağılabilir. Bu nedenle, yedekleme işlemi sırasında albümler dahil edilebilir veya hariç tutulabilir.",
"backup_album_selection_page_select_albums": "Albüm seç",
"backup_album_selection_page_selection_info": "Seçim Bilgileri",
"backup_album_selection_page_total_assets": "Toplam eşsiz öğeler",
+ "backup_albums_sync": "Yedekleme albümlerinin senkronizasyonu",
"backup_all": "Tümü",
"backup_background_service_backup_failed_message": "Yedekleme başarısız. Tekrar deneniyor…",
"backup_background_service_connection_failed_message": "Sunucuya bağlanılamadı. Tekrar deneniyor…",
@@ -580,11 +603,11 @@
"backup_manual_in_progress": "Yükleme halihazırda devam ediyor. Bir süre sonra deneyin",
"backup_manual_success": "Başarılı",
"backup_manual_title": "Yükleme durumu",
+ "backup_options": "Yedekleme Seçenekleri",
"backup_options_page_title": "Yedekleme seçenekleri",
"backup_setting_subtitle": "Arka planda ve ön planda yükleme ayarlarını düzenle",
+ "backup_settings_subtitle": "Yükleme ayarlarını yönet",
"backward": "Geriye doğru",
- "beta_sync": "Beta Senkronizasyon Durumu",
- "beta_sync_subtitle": "Yeni senkronizasyon sistemini yönetin",
"biometric_auth_enabled": "Biyometrik kimlik doğrulama etkin",
"biometric_locked_out": "Biyometrik kimlik doğrulaması kilitli",
"biometric_no_options": "Biyometrik seçenek yok",
@@ -633,31 +656,34 @@
"change_name": "İsim değiştir",
"change_name_successfully": "Adı başarıyla değiştirildi",
"change_password": "Şifre Değiştir",
- "change_password_description": "Bu ya sistemdeki ilk oturum açışınız ya da şifre değişikliği için bir talepte bulunuldu. Lütfen yeni şifreyi aşağıya yazınız.",
- "change_password_form_confirm_password": "Parola Onayı",
- "change_password_form_description": "Merhaba {name},\n\nBu sisteme ilk kez giriş yaptınız veya parolanızı değiştirmeniz için bir talepte bulunuldu. Lütfen aşağıya yeni parolanızı girin.",
- "change_password_form_new_password": "Yeni Parola",
- "change_password_form_password_mismatch": "Parolalar eşleşmiyor",
- "change_password_form_reenter_new_password": "Tekrar Yeni Parola",
+ "change_password_description": "Bu sisteme ilk kez giriş yapıyorsunuz veya şifrenizi değiştirmek için bir istekte bulunuldu. Lütfen aşağıya yeni şifrenizi girin.",
+ "change_password_form_confirm_password": "Şifreyi Onayla",
+ "change_password_form_description": "Merhaba {name},\n\nBu sisteme ilk kez giriş yapıyorsunuz veya şifrenizi değiştirmek için bir istekte bulunuldu. Lütfen aşağıya yeni şifrenizi girin.",
+ "change_password_form_new_password": "Yeni Şifre",
+ "change_password_form_password_mismatch": "Şifreler eşleşmiyor",
+ "change_password_form_reenter_new_password": "Yeni Şifreyi Tekrar Giriniz",
"change_pin_code": "PIN kodunu değiştirin",
"change_your_password": "Şifreni değiştir",
"changed_visibility_successfully": "Görünürlük başarıyla değiştirildi",
- "check_corrupt_asset_backup": "Bozuk yedek dosyalarını kontrol et",
+ "charging": "Şarj oluyor",
+ "charging_requirement_mobile_backup": "Arka plan yedekleme için cihazın şarjda olması gerekir",
+ "check_corrupt_asset_backup": "Bozuk öğe yedeklemelerini kontrol et",
"check_corrupt_asset_backup_button": "Kontrol et",
- "check_corrupt_asset_backup_description": "Bu kontrolü yalnızca Wi-Fi üzerinden ve tüm dosyalar yedeklendikten sonra çalıştırın. İşlem birkaç dakika sürebilir.",
+ "check_corrupt_asset_backup_description": "Bu kontrolü yalnızca Wi-Fi üzerinden ve tüm öğeler yedeklendikten sonra çalıştırın. İşlem birkaç dakika sürebilir.",
"check_logs": "Günlükleri Kontrol Et",
"choose_matching_people_to_merge": "Birleştirmek için eşleşen kişileri seçiniz",
"city": "Şehir",
- "clear": "Temiz",
+ "clear": "Temizle",
"clear_all": "Hepsini temizle",
"clear_all_recent_searches": "Son aramaların hepsini temizle",
- "clear_message": "Mesajı Temizle",
- "clear_value": "Değeri Temizle",
+ "clear_file_cache": "Dosya Önbelleği Temizle",
+ "clear_message": "Mesajı temizle",
+ "clear_value": "Değeri temizle",
"client_cert_dialog_msg_confirm": "Tamam",
- "client_cert_enter_password": "Parola Gir",
+ "client_cert_enter_password": "Şifreyi Girin",
"client_cert_import": "İçe Aktar",
"client_cert_import_success_msg": "İstemci sertifikası içe aktarıldı",
- "client_cert_invalid_msg": "Geçersiz sertifika dosyası veya yanlış parola",
+ "client_cert_invalid_msg": "Geçersiz sertifika dosyası veya yanlış şifre",
"client_cert_remove_msg": "İstemci sertifikası kaldırıldı",
"client_cert_subtitle": "Yalnızca PKCS12 (.p12, .pfx) biçimini destekler. Sertifika İçe Aktarma/Kaldırma yalnızca oturum açmadan önce kullanılabilir",
"client_cert_title": "SSL İstemci Sertifikası",
@@ -676,9 +702,9 @@
"completed": "Tamamlandı",
"confirm": "Onayla",
"confirm_admin_password": "Yönetici Şifresini Onayla",
- "confirm_delete_face": "Varlıktan {name} yüzünü silmek istediğinizden emin misiniz?",
+ "confirm_delete_face": "Öğeden {name} yüzünü silmek istediğinizden emin misiniz?",
"confirm_delete_shared_link": "Bu paylaşılan bağlantıyı silmek istediğinizden emin misiniz?",
- "confirm_keep_this_delete_others": "Yığındaki diğer tüm öğeler bu varlık haricinde silinecektir. Devam etmek istediğinizden emin misiniz?",
+ "confirm_keep_this_delete_others": "Bu öğe hariç, yığındaki diğer tüm öğeler silinecektir. Devam etmek istediğinizden emin misiniz?",
"confirm_new_pin_code": "Yeni PIN kodunu onaylayın",
"confirm_password": "Şifreyi onayla",
"confirm_tag_face": "Bu yüzü {name} olarak etiketlemek ister misiniz?",
@@ -703,7 +729,7 @@
"copy_image": "Resmi Kopyala",
"copy_link": "Bağlantıyı kopyala",
"copy_link_to_clipboard": "Bağlantıyı panoya kopyala",
- "copy_password": "Parolayı kopyala",
+ "copy_password": "Şifreyi kopyala",
"copy_to_clipboard": "Panoya Kopyala",
"country": "Ülke",
"cover": "Kapla",
@@ -717,15 +743,17 @@
"create_link_to_share_description": "Bağlantıya sahip olan herkesin seçilen fotoğrafları görmesine izin ver",
"create_new": "YENİ OLUŞTUR",
"create_new_person": "Yeni kişi oluştur",
- "create_new_person_hint": "Seçili varlıkları yeni bir kişiye atayın",
+ "create_new_person_hint": "Seçili öğeleri yeni bir kişiye atayın",
"create_new_user": "Yeni kullanıcı oluştur",
- "create_shared_album_page_share_add_assets": "İÇERİK EKLE",
+ "create_shared_album_page_share_add_assets": "ÖĞELER EKLE",
"create_shared_album_page_share_select_photos": "Fotoğrafları Seç",
+ "create_shared_link": "Paylaşılan bağlantı oluştur",
"create_tag": "Etiket oluştur",
"create_tag_description": "Yeni bir etiket oluşturun. İç içe geçmiş etiketler için, etiketi tam yolu ve eğik çizgileri de dahil ederek giriniz.",
"create_user": "Kullanıcı oluştur",
"created": "Oluşturuldu",
"created_at": "Oluşturuldu",
+ "creating_linked_albums": "Bağlantılı albümler oluşturuluyor...",
"crop": "Kes",
"curated_object_page_title": "Nesneler",
"current_device": "Mevcut cihaz",
@@ -745,15 +773,16 @@
"date_of_birth_saved": "Doğum günü başarı ile kaydedildi",
"date_range": "Tarih aralığı",
"day": "Gün",
+ "days": "Günler",
"deduplicate_all": "Tüm kopyaları kaldır",
"deduplication_criteria_1": "Resim boyutu (bayt olarak)",
"deduplication_criteria_2": "EXIF veri sayısı",
"deduplication_info": "Tekilleştirme Bilgileri",
- "deduplication_info_description": "Varlıkları otomatik olarak önceden seçmek ve yinelenenleri toplu olarak kaldırmak için şunlara bakıyoruz:",
+ "deduplication_info_description": "Öğeleri otomatik olarak önceden seçmek ve yinelenenleri toplu olarak kaldırmak için şunlara bakıyoruz:",
"default_locale": "Varsayılan Yerel Ayar",
"default_locale_description": "Tarihleri ve sayıları tarayıcınızın yerel ayarına göre biçimlendirin",
"delete": "Sil",
- "delete_action_confirmation_message": "Bu varlığı silmek istediğinizden emin misiniz? Bu işlem, varlığı sunucunun çöp kutusuna taşıyacak ve yerel olarak silmek isteyip istemediğinizi soracaktır",
+ "delete_action_confirmation_message": "Bu öğeyi silmek istediğinizden emin misiniz? Bu işlem, öğeyi sunucunun çöp kutusuna taşıyacak ve yerel olarak silmek isteyip istemediğinizi soracaktır",
"delete_action_prompt": "{count} silindi",
"delete_album": "Albümü sil",
"delete_api_key_prompt": "Bu API anahtarını silmek istediğinizden emin misiniz?",
@@ -774,13 +803,13 @@
"delete_others": "Diğerlerini sil",
"delete_permanently": "Kalıcı olarak sil",
"delete_permanently_action_prompt": "{count} kalıcı olarak silindi",
- "delete_shared_link": "Paylaşılmış linki sil",
- "delete_shared_link_dialog_title": "Paylaşılan Bağlantı Sil",
+ "delete_shared_link": "Paylaşılan bağlantıyı sil",
+ "delete_shared_link_dialog_title": "Paylaşılan Bağlantıyı Sil",
"delete_tag": "Etiketi sil",
"delete_tag_confirmation_prompt": "{tagName} etiketini silmek istediğinizden emin misiniz?",
"delete_user": "Kullanıcıyı sil",
"deleted_shared_link": "Paylaşılan bağlantı silindi",
- "deletes_missing_assets": "Diskte eksik olan varlıkları siler",
+ "deletes_missing_assets": "Diskte eksik olan öğeleri siler",
"description": "Açıklama",
"description_input_hint_text": "Açıklama ekle...",
"description_input_submit_error": "Açıklama güncellenirken hata oluştu, daha fazla ayrıntı için günlüğü kontrol edin",
@@ -797,12 +826,12 @@
"display_options": "Görüntüleme seçenekleri",
"display_order": "Gösterim sıralaması",
"display_original_photos": "Orijinal fotoğrafları göster",
- "display_original_photos_setting_description": "Orijinal varlık web uyumlu olduğunda, bir varlığı görüntülerken küçük resimler yerine orijinal fotoğrafı görüntülemeyi tercih edin. Bu, fotoğraf görüntüleme hızlarının yavaşlamasına neden olabilir.",
+ "display_original_photos_setting_description": "Orijinal öğe web uyumlu olduğunda, bir öğeyi görüntülerken küçük resimler yerine orijinal fotoğrafı görüntülemeyi tercih edin. Bu, fotoğraf görüntüleme hızlarının yavaşlamasına neden olabilir.",
"do_not_show_again": "Bu mesajı bir daha gösterme",
"documentation": "Dokümantasyon",
"done": "Bitti",
"download": "İndir",
- "download_action_prompt": "{count} varlık indiriliyor",
+ "download_action_prompt": "{count} öğe indiriliyor",
"download_canceled": "İndirme iptal edildi",
"download_complete": "İndirme tamamlandı",
"download_enqueue": "İndirme sıraya alındı",
@@ -814,13 +843,13 @@
"download_notfound": "İndirme bulunamadı",
"download_paused": "İndirme duraklatıldı",
"download_settings": "İndir",
- "download_settings_description": "Varlık indirme ile ilgili ayarları yönetin",
+ "download_settings_description": "Öğe indirme ile ilgili ayarları yönetin",
"download_started": "İndirme başladı",
"download_sucess": "İndirme başarılı",
"download_sucess_android": "Medya DCIM/Immich klasörüne indirildi",
"download_waiting_to_retry": "Yeniden denemek için bekleniyor",
"downloading": "İndiriliyor",
- "downloading_asset_filename": "Varlık indiriliyor {filename}",
+ "downloading_asset_filename": "Öğe indiriliyor {filename}",
"downloading_media": "Medya indiriliyor",
"drop_files_to_upload": "Dosyaları yüklemek için herhangi bir yere bırakın",
"duplicates": "Kopyalar",
@@ -829,9 +858,12 @@
"edit": "Düzenle",
"edit_album": "Albümü düzenle",
"edit_avatar": "Avatarı Düzenle",
- "edit_birthday": "Doğum Günü Düzenle",
+ "edit_birthday": "Doğum gününü düzenle",
"edit_date": "Tarihi Düzenle",
"edit_date_and_time": "Tarih ve zamanı düzenleyin",
+ "edit_date_and_time_action_prompt": "{count} tarih ve zaman düzenlendi",
+ "edit_date_and_time_by_offset": "Tarihi ofset ile değiştir",
+ "edit_date_and_time_by_offset_interval": "Yeni tarih aralığı: {from}'dan {to}'a kadar",
"edit_description": "Açıklamayı düzenle",
"edit_description_prompt": "Lütfen yeni bir açıklama seçin:",
"edit_exclusion_pattern": "Hariç tutma desenini düzenle",
@@ -858,7 +890,7 @@
"email_notifications": "E-posta bildirimleri",
"empty_folder": "Bu klasör boş",
"empty_trash": "Çöpü boşalt",
- "empty_trash_confirmation": "Çöp kutusunu boşaltmak istediğinizden emin misiniz? Bu işlem, Immich'teki çöp kutusundaki tüm varlıkları kalıcı olarak silecektir.\nBu işlemi geri alamazsınız!",
+ "empty_trash_confirmation": "Çöp kutusunu boşaltmak istediğinizden emin misiniz? Bu işlem, çöp kutusundaki tüm varlıkları Immich'ten kalıcı olarak silecektir.\nBu işlemi geri alamazsınız!",
"enable": "Etkinleştir",
"enable_backup": "Yedeklemeyi Etkinleştir",
"enable_biometric_auth_description": "Biyometrik kimlik doğrulamasını etkinleştirmek için PIN kodu girin",
@@ -866,54 +898,58 @@
"end_date": "Bitiş tarihi",
"enqueued": "Kuyruğa alındı",
"enter_wifi_name": "Wi-Fi adını girin",
- "enter_your_pin_code": "Pin kodu girin",
+ "enter_your_pin_code": "PIN kodunuzu girin",
"enter_your_pin_code_subtitle": "Kilitli klasöre erişmek için PIN kodunuzu girin",
"error": "Hata",
"error_change_sort_album": "Albüm sıralama düzeni değiştirilemedi",
- "error_delete_face": "Yüzü varlıktan silme hatası",
+ "error_delete_face": "Öğeden yüz silme hatası",
+ "error_getting_places": "Konum bilgisi alınırken hata oluştu",
"error_loading_image": "Resim yüklenirken hata oluştu",
+ "error_loading_partners": "Ortakları yükleme hatası: {error}",
"error_saving_image": "Hata: {error}",
"error_tag_face_bounding_box": "Yüz etiketleme hatası – sınırlayıcı kutu koordinatları alınamadı",
"error_title": "Bir Hata Oluştu - Bir şeyler ters gitti",
"errors": {
- "cannot_navigate_next_asset": "Sonraki varlığa geçiş yapılamıyor",
- "cannot_navigate_previous_asset": "Önceki varlığa geçiş yapılamıyor",
+ "cannot_navigate_next_asset": "Sonraki öğeye geçiş yapılamıyor",
+ "cannot_navigate_previous_asset": "Önceki öğeye geçiş yapılamıyor",
"cant_apply_changes": "Değişiklikler uygulanamıyor",
"cant_change_activity": "Etkinliği {enabled, select, true {devre dışı bırakamıyor} other {etkinleştiremiyor}}",
- "cant_change_asset_favorite": "Varlığın favori durumunu değiştiremiyor",
- "cant_change_metadata_assets_count": "{count, plural, one {# varlığın} other {# varlıkların}} meta verisi değiştirilemiyor",
+ "cant_change_asset_favorite": "Öğenin favori durumu değiştirilemiyor",
+ "cant_change_metadata_assets_count": "{count, plural, one {# öğenin} other {# öğelerin}} meta verisi değiştirilemiyor",
"cant_get_faces": "Yüzler alınamadı",
"cant_get_number_of_comments": "Yorumların sayısı alınamadı",
"cant_search_people": "Kişiler aranamıyor",
"cant_search_places": "Mekanlar aranamıyor",
- "error_adding_assets_to_album": "Albüme varlık ekleme hatası",
+ "error_adding_assets_to_album": "Albüme öğe ekleme hatası",
"error_adding_users_to_album": "Albüme kullanıcı ekleme hatası",
"error_deleting_shared_user": "Paylaşılan kullanıcı silme hatası",
"error_downloading": "{filename} indirme hatası",
"error_hiding_buy_button": "Satın alma butonu gizleme hatası",
- "error_removing_assets_from_album": "Varlığı albümden silme hatası, daha fazla detay için konsolu kontrol et",
- "error_selecting_all_assets": "Bütün varlıkları seçme hatası",
+ "error_removing_assets_from_album": "Öğeyi albümden silme hatası, daha fazla detay için konsolu kontrol et",
+ "error_selecting_all_assets": "Tüm öğeleri seçerken hata oluştu",
"exclusion_pattern_already_exists": "Bu dışlama modeli halihazırda mevcut.",
"failed_to_create_album": "Albüm oluşturulamadı",
"failed_to_create_shared_link": "Paylaşılan bağlantı oluşturulamadı",
"failed_to_edit_shared_link": "Paylaşılan bağlantı düzenlenemedi",
"failed_to_get_people": "Kişiler alınamadı",
"failed_to_keep_this_delete_others": "Bu öğenin tutulması ve diğer öğenin silinmesi başarısız oldu",
- "failed_to_load_asset": "Varlık yüklenemedi",
- "failed_to_load_assets": "Varlıklar yüklenemedi",
+ "failed_to_load_asset": "Öğe yüklenemedi",
+ "failed_to_load_assets": "Öğeler yüklenemedi",
"failed_to_load_notifications": "Bildirim yüklenemedi",
"failed_to_load_people": "Kişiler yüklenemedi",
"failed_to_remove_product_key": "Ürün anahtarı kaldırılamadı",
- "failed_to_stack_assets": "Varlıklar yığınlanamadı",
- "failed_to_unstack_assets": "Varlıkların yığını kaldırılamadı",
+ "failed_to_reset_pin_code": "PIN kodu sıfırlanamadı",
+ "failed_to_stack_assets": "Öğeler yığınlanamadı",
+ "failed_to_unstack_assets": "Öğelerin yığını kaldırılamadı",
"failed_to_update_notification_status": "Bildirim durumu güncellenemedi",
"import_path_already_exists": "Bu içe aktarma yolu halihazırda mevcut.",
"incorrect_email_or_password": "Yanlış e-posta veya şifre",
"paths_validation_failed": "{paths, plural, one {# Yol} other {# Yollar}} doğrulanamadı",
"profile_picture_transparent_pixels": "Profil resimleri şeffaf piksele sahip olamaz. Lütfen resme yakınlaştırın ve/veya resmi hareket ettirin.",
"quota_higher_than_disk_size": "Disk boyutundan daha yüksek bir kota belirlediniz",
+ "something_went_wrong": "Bir şeyler ters gitti",
"unable_to_add_album_users": "Kullanıcılar albüme eklenemiyor",
- "unable_to_add_assets_to_shared_link": "Varlıklar paylaşılan bağlantıya eklenemiyor",
+ "unable_to_add_assets_to_shared_link": "Öğeler paylaşılan bağlantıya eklenemiyor",
"unable_to_add_comment": "Yorum eklenemiyor",
"unable_to_add_exclusion_pattern": "Hariç tutma modeli eklenemiyor",
"unable_to_add_import_path": "İçe aktarma yolu eklenemiyor",
@@ -936,8 +972,8 @@
"unable_to_create_library": "Kütüphane oluşturulamıyor",
"unable_to_create_user": "Kullanıcı oluşturulamıyor",
"unable_to_delete_album": "Albüm silinemiyor",
- "unable_to_delete_asset": "Varlık silinemiyor",
- "unable_to_delete_assets": "Varlıklar silinemiyor",
+ "unable_to_delete_asset": "Öğe silinemiyor",
+ "unable_to_delete_assets": "Öğeler silinemiyor",
"unable_to_delete_exclusion_pattern": "Hariç tutma deseni silinemiyor",
"unable_to_delete_import_path": "İçe aktarma yolu silinemiyor",
"unable_to_delete_shared_link": "Paylaşılan bağlantı silinemiyor",
@@ -957,19 +993,19 @@
"unable_to_log_out_device": "Cihazdan çıkış yapılamıyor",
"unable_to_login_with_oauth": "OAuth ile giriş yapılamıyor",
"unable_to_play_video": "Video oynatılamıyor",
- "unable_to_reassign_assets_existing_person": "Varlıklar {name, select, null {mevcut bir kişiye} other {{name}}} yeniden atanamıyor",
- "unable_to_reassign_assets_new_person": "Varlıklar yeni bir kişiye yeniden atanamıyor",
+ "unable_to_reassign_assets_existing_person": "Öğeler {name, select, null {mevcut bir kişiye} other {{name}}} yeniden atanamıyor",
+ "unable_to_reassign_assets_new_person": "Öğeler yeni bir kişiye yeniden atanamıyor",
"unable_to_refresh_user": "Kullanıcı yenilenemiyor",
"unable_to_remove_album_users": "Albüm kullanıcıları kaldırılamıyor",
"unable_to_remove_api_key": "API anahtarı kaldırılamıyor",
- "unable_to_remove_assets_from_shared_link": "Varlıklar paylaşılan bağlantıdan kaldırılamıyor",
+ "unable_to_remove_assets_from_shared_link": "Öğeler paylaşılan bağlantıdan kaldırılamıyor",
"unable_to_remove_library": "Kütüphane kaldırılamadı",
"unable_to_remove_partner": "Ortak kaldırılamıyor",
"unable_to_remove_reaction": "Reaksiyon kaldırılamıyor",
"unable_to_reset_password": "Şifre sıfırlanamıyor",
- "unable_to_reset_pin_code": "Pin kodunu sıfırlanamıyor",
+ "unable_to_reset_pin_code": "PIN kodu sıfırlanamıyor",
"unable_to_resolve_duplicate": "Çiftler çözümlenemiyor",
- "unable_to_restore_assets": "Varlıklar geri yüklenemiyor",
+ "unable_to_restore_assets": "Öğeler geri yüklenemiyor",
"unable_to_restore_trash": "Çöp geri yüklenemiyor",
"unable_to_restore_user": "Kullanıcı geri yüklenemiyor",
"unable_to_save_album": "Albüm kaydedilemiyor",
@@ -983,7 +1019,7 @@
"unable_to_set_feature_photo": "Özellikli fotoğraf ayarlanamıyor",
"unable_to_set_profile_picture": "Profil resmi ayarlanamıyor",
"unable_to_submit_job": "Görev gönderilemiyor",
- "unable_to_trash_asset": "Varlık çöp kutusuna taşınamıyor",
+ "unable_to_trash_asset": "Öğe çöp kutusuna taşınamıyor",
"unable_to_unlink_account": "Hesap bağlantısı kaldırılamıyor",
"unable_to_unlink_motion_video": "Hareket videosunun bağlantısı kaldırılamıyor",
"unable_to_update_album_cover": "Albüm resmi güncellenemiyor",
@@ -1025,15 +1061,16 @@
"face_unassigned": "Yüz atanmadı",
"failed": "Başarısız",
"failed_to_authenticate": "Kimlik doğrulaması yapılamadı",
- "failed_to_load_assets": "Varlıklar yüklenemedi",
+ "failed_to_load_assets": "Öğeler yüklenemedi",
"failed_to_load_folder": "Klasör yüklenemedi",
- "favorite": "Gözde",
- "favorite_action_prompt": "{count} gözdelere eklendi",
- "favorite_or_unfavorite_photo": "Gözdeye ekle veya çıkar",
- "favorites": "Gözdeler",
- "favorites_page_no_favorites": "Gözde öge bulunamadı",
- "feature_photo_updated": "Özellikli fotoğraf güncellendi",
+ "favorite": "Favori",
+ "favorite_action_prompt": "{count} Favorilere eklendi",
+ "favorite_or_unfavorite_photo": "Favorilere ekle veya çıkar",
+ "favorites": "Favoriler",
+ "favorites_page_no_favorites": "Favori öğe bulunamadı",
+ "feature_photo_updated": "Öne çıkan fotoğraf güncellendi",
"features": "Özellikler",
+ "features_in_development": "Geliştirme Aşamasındaki Özellikler",
"features_setting_description": "Uygulamanın özelliklerini yönet",
"file_name": "Dosya adı",
"file_name_or_extension": "Dosya adı veya uzantı",
@@ -1043,21 +1080,26 @@
"filter_people": "Kişileri filtrele",
"filter_places": "Yerleri süz",
"find_them_fast": "Adlarına göre hızlıca bul",
+ "first": "İlk",
"fix_incorrect_match": "Yanlış eşleştirmeyi düzelt",
"folder": "Klasör",
"folder_not_found": "Klasör bulunamadı",
"folders": "Klasörler",
"folders_feature_description": "Dosya sistemindeki fotoğraf ve videoları klasör görünümüyle keşfedin",
+ "forgot_pin_code_question": "PIN kodunuzu mu unuttunuz?",
"forward": "İleri",
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "Bu özellik, çalışabilmek için Google'dan harici kaynaklar yükler.",
"general": "Genel",
+ "geolocation_instruction_location": "GPS koordinatları olan bir öğeyi tıklayarak konumunu kullanın veya haritadan doğrudan bir konum seçin",
"get_help": "Yardım Al",
"get_wifiname_error": "Wi-Fi adı alınamadı. Gerekli izinleri verdiğinizden ve bir Wi-Fi ağına bağlı olduğunuzdan emin olun",
"getting_started": "Başlarken",
"go_back": "Geri git",
"go_to_folder": "Klasöre git",
"go_to_search": "Aramaya git",
+ "gps": "GPS",
+ "gps_missing": "GPS yok",
"grant_permission": "İzin ver",
"group_albums_by": "Albümleri gruplandır...",
"group_country": "Ülkeye göre grupla",
@@ -1068,14 +1110,14 @@
"haptic_feedback_switch": "Dokunsal geri bildirimi aç",
"haptic_feedback_title": "Dokunsal Geri Bildirim (Haptic Feedback)",
"has_quota": "Kota var",
- "hash_asset": "Hash varlığı",
- "hashed_assets": "Hashlenmiş varlıklar",
+ "hash_asset": "Karma öğe",
+ "hashed_assets": "Karma öğeler",
"hashing": "Hashleme",
"header_settings_add_header_tip": "Header Ekle",
"header_settings_field_validator_msg": "Değer boş olamaz",
"header_settings_header_name_input": "Header adı",
"header_settings_header_value_input": "Header değeri",
- "headers_settings_tile_subtitle": "Uygulamanın her ağ isteğiyle birlikte göndermesi gereken proxy header'ları tanımlayın",
+ "headers_settings_tile_subtitle": "Uygulamanın her ağ isteğinde göndermesi gereken proxy başlıklarını tanımlayın",
"headers_settings_tile_title": "Özel proxy headers",
"hi_user": "Merhaba {name} {email}",
"hide_all_people": "Tüm kişileri gizle",
@@ -1084,24 +1126,25 @@
"hide_password": "Şifreyi gizle",
"hide_person": "Kişiyi gizle",
"hide_unnamed_people": "İsimsiz kişileri gizle",
- "home_page_add_to_album_conflicts": "{album} albümüne {added} öğe eklendi. {failed} varlık zaten albümdeydi.",
+ "home_page_add_to_album_conflicts": "{album} albümüne {added} öğe eklendi. {failed} öğe zaten albümdeydi.",
"home_page_add_to_album_err_local": "Yerel öğeler henüz albümlere eklenemiyor, atlanıyor",
"home_page_add_to_album_success": "{album} albümüne {added} öğe eklendi.",
- "home_page_album_err_partner": "Partner öğeleri henüz bir albüme eklenemiyor, atlanıyor",
+ "home_page_album_err_partner": "Ortak öğeler henüz bir albüme eklenemiyor, atlanıyor",
"home_page_archive_err_local": "Yerel öğeler henüz arşivlenemiyor, atlanıyor",
- "home_page_archive_err_partner": "Partner öğeleri henüz arşivlenemiyor, atlanıyor",
+ "home_page_archive_err_partner": "Ortak öğeler henüz arşivlenemiyor, atlanıyor",
"home_page_building_timeline": "Zaman çizelgesi oluşturuluyor",
- "home_page_delete_err_partner": "Partner öğeleri silinemez, atlanıyor",
+ "home_page_delete_err_partner": "Ortak öğeler silinemez, atlanıyor",
"home_page_delete_remote_err_local": "Uzaktan silme seçimindeki yerel öğeler atlanıyor",
- "home_page_favorite_err_local": "Yerel ögeler henüz gözdelere eklenemiyor, atlanıyor",
- "home_page_favorite_err_partner": "Ortak ögeleri henüz gözdelere eklenemiyor, atlanıyor",
- "home_page_first_time_notice": "Uygulamayı ilk kez kullanıyorsanız, zaman çizelgesinin albümlerdeki fotoğraf ve videolar ile oluşturulabilmesi için lütfen yedekleme için albüm(ler) seçtiğinizden emin olun.",
- "home_page_locked_error_local": "Yerel varlıklar kilitli klasöre taşınamıyor, atlanıyor",
- "home_page_locked_error_partner": "Ortak varlıklar kilitli klasöre taşınamıyor, atlanıyor",
+ "home_page_favorite_err_local": "Yerel öğeler henüz favorilere eklenemiyor, atlanıyor",
+ "home_page_favorite_err_partner": "Ortak öğeler henüz favorilere eklenemiyor, atlanıyor",
+ "home_page_first_time_notice": "Uygulamayı ilk kez kullanıyorsanız, zaman çizelgesinin albümlerdeki fotoğraf ve videolar ile oluşturulabilmesi için lütfen yedekleme için albüm seçtiğinizden emin olun",
+ "home_page_locked_error_local": "Yerel öğeler kilitli klasöre taşınamıyor, atlanıyor",
+ "home_page_locked_error_partner": "Ortak öğeler kilitli klasöre taşınamıyor, atlanıyor",
"home_page_share_err_local": "Yerel öğeler bağlantı ile paylaşılamaz, atlanıyor",
"home_page_upload_err_limit": "Aynı anda en fazla 30 öğe yüklenebilir, atlanabilir",
"host": "Ana bilgisayar",
"hour": "Saat",
+ "hours": "Saatler",
"id": "ID",
"idle": "Boşta",
"ignore_icloud_photos": "iCloud Fotoğraflarını Yok Say",
@@ -1129,7 +1172,7 @@
"in_archive": "Arşivde",
"include_archived": "Arşivlenenleri dahil et",
"include_shared_albums": "Paylaşılmış albümleri dahil et",
- "include_shared_partner_assets": "Paylaşılan ortak varlıkları dahil et",
+ "include_shared_partner_assets": "Paylaşılan ortak öğeleri dahil et",
"individual_share": "Bireysel paylaşım",
"individual_shares": "Kişisel paylaşımlar",
"info": "Bilgi",
@@ -1144,9 +1187,9 @@
"invite_people": "Kişileri Davet Et",
"invite_to_album": "Albüme davet et",
"ios_debug_info_fetch_ran_at": "Veri çekme {dateTime} tarihinde çalıştırıldı",
- "ios_debug_info_last_sync_at": "Son eşleme: {dateTime}",
+ "ios_debug_info_last_sync_at": "Son eşzamanlama {dateTime}",
"ios_debug_info_no_processes_queued": "Hiçbir arka plan işlemi kuyruğa alınmadı",
- "ios_debug_info_no_sync_yet": "Henüz hiçbir arka plan eşleme görevi çalıştırılmadı",
+ "ios_debug_info_no_sync_yet": "Henüz arka plan eşzamanlama görevi çalıştırılmadı",
"ios_debug_info_processes_queued": "{count, plural, one {{count} arka plan işlemi kuyruğa alındı} other {{count} arka plan işlemi kuyruğa alındı}}",
"ios_debug_info_processing_ran_at": "İşleme {dateTime} tarihinde çalıştırıldı",
"items_count": "{count, plural, one {# Öğe} other {# Öğe}}",
@@ -1154,7 +1197,7 @@
"keep": "Koru",
"keep_all": "Hepsini koru",
"keep_this_delete_others": "Bunu sakla, diğerlerini sil",
- "kept_this_deleted_others": "Bu varlık tutuldu ve {count, plural, one {# varlık} other {# varlık}} silindi",
+ "kept_this_deleted_others": "Bu öğe tutuldu ve {count, plural, one {# varlık} other {# varlık}} silindi",
"keyboard_shortcuts": "Klavye kısayolları",
"language": "Dil",
"language_no_results_subtitle": "Arama teriminizi değiştirmeyi deneyin",
@@ -1162,10 +1205,12 @@
"language_search_hint": "Dilleri ara...",
"language_setting_description": "Tercih ettiğiniz dili seçiniz",
"large_files": "Büyük Dosyalar",
+ "last": "Son",
"last_seen": "Son görülme",
- "latest_version": "En son versiyon",
+ "latest_version": "En Son Sürüm",
"latitude": "Enlem",
"leave": "Ayrıl",
+ "leave_album": "Albümden çık",
"lens_model": "Mercek modeli",
"let_others_respond": "Diğerlerinin yanıt vermesine izin ver",
"level": "Seviye",
@@ -1179,6 +1224,7 @@
"library_page_sort_title": "Albüm başlığı",
"licenses": "Lisanslar",
"light": "Açık",
+ "like": "Beğen",
"like_deleted": "Beğeni silindi",
"link_motion_video": "Hareket videosunu bağla",
"link_to_oauth": "OAuth'a bağla",
@@ -1187,9 +1233,10 @@
"loading": "Yükleniyor",
"loading_search_results_failed": "Arama sonuçları yüklenemedi",
"local": "Yerel",
- "local_asset_cast_failed": "Sunucuya yüklenmemiş bir varlık yansıtılamaz",
- "local_assets": "Yerel Varlıklar",
- "local_network": "Yerel Wi-Fi",
+ "local_asset_cast_failed": "Sunucuya yüklenmemiş bir öğe yansıtılamaz",
+ "local_assets": "Yerel Öğeler",
+ "local_media_summary": "Yerel Medya Özeti",
+ "local_network": "Yerel ağ",
"local_network_sheet_info": "Uygulama belirlenmiş Wi-Fi ağını kullanırken bu URL üzerinden sunucuya bağlanacaktır",
"location_permission": "Konum izni",
"location_permission_content": "Otomatik geçiş özelliğinin çalışabilmesi için Immich'in mevcut Wi-Fi ağının adını bilmesi, bunu sağlamak için de tam konum iznine ihtiyacı vardır",
@@ -1200,6 +1247,7 @@
"location_picker_longitude_hint": "Buraya boylam yazın",
"lock": "Kilitle",
"locked_folder": "Kilitli Klasör",
+ "log_detail_title": "Günlük Ayrıntıları",
"log_out": "Oturumu kapat",
"log_out_all_devices": "Tüm Cihazlarda Oturumu Kapat",
"logged_in_as": "{user} olarak oturum açıldı",
@@ -1219,17 +1267,18 @@
"login_form_err_trailing_whitespace": "Sondaki boşluk",
"login_form_failed_get_oauth_server_config": "OAuth kullanırken bir hata oluştu, sunucu URL'sini kontrol edin",
"login_form_failed_get_oauth_server_disable": "OAuth özelliği bu sunucuda mevcut değil",
- "login_form_failed_login": "Giriş yaparken hata oluştu, sunucu URL'sini, e-postayı ve parolayı kontrol edin",
+ "login_form_failed_login": "Giriş yaparken hata oluştu, sunucu URL'sini, e-postayı ve şifreyi kontrol edin",
"login_form_handshake_exception": "Sunucuda bir El Sıkışma İstisnası vardı. Kendi kendine imzalanmış bir sertifika kullanıyorsanız, ayarlar menüsünden kendi kendine imzalanmış sertifikalara izin verin.",
- "login_form_password_hint": "parola",
+ "login_form_password_hint": "şifre",
"login_form_save_login": "Oturum açık kalsın",
- "login_form_server_empty": "Sunucu URL'si girin",
+ "login_form_server_empty": "Sunucu URL'si girin.",
"login_form_server_error": "Sunucuya bağlanılamadı.",
"login_has_been_disabled": "Giriş devre dışı bırakıldı.",
- "login_password_changed_error": "Parolanız güncellenirken bir hata oluştu.",
- "login_password_changed_success": "Parola güncellendi",
+ "login_password_changed_error": "Şifreniz güncellenirken bir hata oluştu",
+ "login_password_changed_success": "Şifre başarıyla güncellendi",
"logout_all_device_confirmation": "Tüm cihazlarda oturum kapatmak istediğinizden emin misiniz?",
"logout_this_device_confirmation": "Bu cihazda oturum kapatmak istediğinizden emin misiniz?",
+ "logs": "Kayıtlar",
"longitude": "Boylam",
"look": "Görünüm",
"loop_videos": "Videoları döngüye al",
@@ -1237,6 +1286,7 @@
"main_branch_warning": "Geliştirme sürümü kullanıyorsunuz. Yayınlanan bir sürüm kullanmanızı önemle tavsiye ederiz!",
"main_menu": "Ana menü",
"make": "Marka",
+ "manage_geolocation": "Konumu yönet",
"manage_shared_links": "Paylaşılan bağlantıları yönet",
"manage_sharing_with_partners": "Ortaklarla paylaşımı yönet",
"manage_the_app_settings": "Uygulama ayarlarını yönet",
@@ -1245,7 +1295,7 @@
"manage_your_devices": "Cihazlarınızı yönetin",
"manage_your_oauth_connection": "OAuth bağlantınızı yönetin",
"map": "Harita",
- "map_assets_in_bounds": "{count} fotoğraf",
+ "map_assets_in_bounds": "{count, plural, =0 {Bu alanda fotoğraf yok} one {# photo} other {# photos}}",
"map_cannot_get_user_location": "Kullanıcının konumu alınamıyor",
"map_location_dialog_yes": "Evet",
"map_location_picker_page_use_location": "Bu konumu kullan",
@@ -1263,14 +1313,15 @@
"map_settings_date_range_option_years": "Son {years} yıl",
"map_settings_dialog_title": "Harita Ayarları",
"map_settings_include_show_archived": "Arşivdekileri dahil et",
- "map_settings_include_show_partners": "Partnerleri Dahil Et",
- "map_settings_only_show_favorites": "Sadece Gözdeleri Göster",
+ "map_settings_include_show_partners": "Ortakları Dahil Et",
+ "map_settings_only_show_favorites": "Sadece Favorileri Göster",
"map_settings_theme_settings": "Harita Teması",
"map_zoom_to_see_photos": "Fotoğrafları görmek için uzaklaştırın",
"mark_all_as_read": "Tümünü okundu olarak işaretle",
"mark_as_read": "Okundu olarak işaretle",
"marked_all_as_read": "Tümü okundu olarak işaretlendi",
"matches": "Eşleşenler",
+ "matching_assets": "Eşleşen Öğeler",
"media_type": "Medya türü",
"memories": "Anılar",
"memories_all_caught_up": "Tümü görüldü",
@@ -1289,6 +1340,7 @@
"merged_people_count": "{count, plural, one {# kişi} other {# kişi}} birleştirildi",
"minimize": "Küçült",
"minute": "Dakika",
+ "minutes": "Dakikalar",
"missing": "Eksik",
"model": "Model",
"month": "Ay",
@@ -1299,8 +1351,8 @@
"move_to_lock_folder_action_prompt": "{count} kilitli klasöre eklendi",
"move_to_locked_folder": "Kilitli klasöre taşı",
"move_to_locked_folder_confirmation": "Bu fotoğraflar ve videolar tüm albümlerden kaldırılacak ve yalnızca kilitli klasörden görüntülenebilecektir",
- "moved_to_archive": "{count, plural, one {# öğe arşive taşındı} other {# öğe arşive taşındı}}",
- "moved_to_library": "{count, plural, one {# öğe kitaplığa taşındı} other {# öğe kitaplığa taşındı}}",
+ "moved_to_archive": "{count, plural, one {# öğe} other {# öğeler}} arşive taşındı",
+ "moved_to_library": "{count, plural, one {# öğe} other {# öğeler}} kitaplığa taşındı",
"moved_to_trash": "Çöp kutusuna taşındı",
"multiselect_grid_edit_date_time_err_read_only": "Salt okunur öğelerin tarihi düzenlenemedi, atlanıyor",
"multiselect_grid_edit_gps_err_read_only": "Salt okunur öğelerin konumu düzenlenemedi, atlanıyor",
@@ -1308,6 +1360,10 @@
"my_albums": "Albümlerim",
"name": "İsim",
"name_or_nickname": "İsim veya takma isim",
+ "network_requirement_photos_upload": "Fotoğrafları yedeklemek için mobil veriyi kullan",
+ "network_requirement_videos_upload": "Videoları yedeklemek için mobil veriyi kullan",
+ "network_requirements": "Ağ Gereksinimleri",
+ "network_requirements_updated": "Ağ durumu değişti, yedekleme kuyruğu sıfırlandı",
"networking_settings": "Ağ Ayarları",
"networking_subtitle": "Sunucu uç nokta ayarlarını düzenle",
"never": "Asla",
@@ -1317,8 +1373,9 @@
"new_person": "Yeni kişi",
"new_pin_code": "Yeni PIN kodu",
"new_pin_code_subtitle": "Kilitli klasöre ilk kez erişiyorsunuz. Bu sayfaya güvenli erişim için bir PIN kodu oluşturun",
+ "new_timeline": "Yeni Zaman Çizelgesi",
"new_user_created": "Yeni kullanıcı oluşturuldu",
- "new_version_available": "YENİ VERSİYON MEVCUT",
+ "new_version_available": "YENİ SÜRÜM MEVCUT",
"newest_first": "Önce en yeniler",
"next": "Sonraki",
"next_memory": "Sonraki anı",
@@ -1330,23 +1387,28 @@
"no_assets_message": "İLK FOTOĞRAFINIZI YÜKLEMEK İÇİN TIKLAYIN",
"no_assets_to_show": "Gösterilecek öğe yok",
"no_cast_devices_found": "Yansıtılacak cihaz bulunamadı",
+ "no_checksum_local": "Sağlama toplamı mevcut değil - yerel varlıkları alamıyor",
+ "no_checksum_remote": "Sağlama toplamı mevcut değil - uzak varlık alınamıyor",
"no_duplicates_found": "Çift bulunamadı.",
"no_exif_info_available": "EXIF bilgisi mevcut değil",
"no_explore_results_message": "Koleksiyonunuzu keşfetmek için daha fazla fotoğraf yükleyin.",
- "no_favorites_message": "En sevdiğiniz fotoğraf ve videoları hızlıca bulmak için gözdelere ekleyin",
+ "no_favorites_message": "En sevdiğiniz fotoğraf ve videoları hızlıca bulmak için favorilere ekleyin",
"no_libraries_message": "Fotoğraf ve videolarınızı görmek için bir harici kütüphane oluşturun",
+ "no_local_assets_found": "Bu sağlama toplamı ile yerel varlık bulunamadı",
"no_locked_photos_message": "Kilitli klasördeki fotoğraf ve videolar gizlidir; kitaplığınızda gezinirken veya arama yaparken görünmezler.",
"no_name": "İsim yok",
"no_notifications": "Bildirim yok",
"no_people_found": "Eşleşen kişi bulunamadı",
"no_places": "Yer yok",
+ "no_remote_assets_found": "Bu sağlama toplamı ile uzaktaki varlık bulunamadı",
"no_results": "Sonuç bulunamadı",
"no_results_description": "Eş anlamlı ya da daha genel anlamlı bir kelime deneyin",
"no_shared_albums_message": "Fotoğrafları ve videoları ağınızdaki kişilerle paylaşmak için bir albüm oluşturun",
"no_uploads_in_progress": "Yükleme işlemi yok",
+ "not_available": "YOK",
"not_in_any_album": "Hiçbir albümde değil",
"not_selected": "Seçilmedi",
- "note_apply_storage_label_to_previously_uploaded assets": "Not: Daha önce yüklenen varlıklar için bir depolama yolu etiketi uygulamak üzere şunu başlatın",
+ "note_apply_storage_label_to_previously_uploaded assets": "Not: Daha önce yüklenen öğeler için bir depolama yolu etiketi uygulamak üzere şunu başlatın",
"notes": "Notlar",
"nothing_here_yet": "Burada henüz bir şey yok",
"notification_permission_dialog_content": "Bildirimleri etkinleştirmek için cihaz ayarlarına gidin ve izin verin.",
@@ -1359,6 +1421,7 @@
"oauth": "OAuth",
"official_immich_resources": "Resmi Immich Kaynakları",
"offline": "Çevrim dışı",
+ "offset": "Ofset",
"ok": "Tamam",
"oldest_first": "Eski olan önce",
"on_this_device": "Bu cihazda",
@@ -1370,13 +1433,15 @@
"onboarding_user_welcome_description": "Haydi başlayalım!",
"onboarding_welcome_user": "Hoş geldin, {user}",
"online": "Çevrimiçi",
- "only_favorites": "Sadece gözdeler",
+ "only_favorites": "Sadece favoriler",
"open": "Aç",
"open_in_map_view": "Harita görünümünde aç",
"open_in_openstreetmap": "OpenStreetMap'te Aç",
"open_the_search_filters": "Arama filtrelerini aç",
"options": "Seçenekler",
"or": "veya",
+ "organize_into_albums": "Albümler halinde düzenle",
+ "organize_into_albums_description": "Mevcut eşzamanlama ayarlarını kullanarak mevcut fotoğrafları albümlere ekleyin",
"organize_your_library": "Kütüphanenizi düzenleyin",
"original": "orijinal",
"other": "Diğer",
@@ -1391,17 +1456,17 @@
"partner_can_access_location": "Fotoğraf ve videolarınızın çekildiği konum",
"partner_list_user_photos": "{user} fotoğrafları",
"partner_list_view_all": "Tümünü gör",
- "partner_page_empty_message": "Fotoğraflarınız henüz hiçbir partnerle paylaşılmadı.",
+ "partner_page_empty_message": "Fotoğraflarınız henüz hiçbir ortakla paylaşılmadı.",
"partner_page_no_more_users": "Eklenecek başka kullanıcı yok",
- "partner_page_partner_add_failed": "Partner eklenemedi",
- "partner_page_select_partner": "Partner seç",
+ "partner_page_partner_add_failed": "Ortak eklenemedi",
+ "partner_page_select_partner": "Ortak seç",
"partner_page_shared_to_title": "Paylaşıldı",
"partner_page_stop_sharing_content": "{partner} artık fotoğraflarınıza erişemeyecek.",
- "partner_sharing": "Ortak paylaşımı",
+ "partner_sharing": "Ortak Paylaşımı",
"partners": "Ortaklar",
"password": "Şifre",
- "password_does_not_match": "Şifreler eşleşmiyor",
- "password_required": "Şifre gereklidir",
+ "password_does_not_match": "Şifre eşleşmiyor",
+ "password_required": "Şifre Gerekiyor",
"password_reset_success": "Şifre başarıyla sıfırlandı",
"past_durations": {
"days": "{days, plural, one {Dün} other {Son # gün}}",
@@ -1421,10 +1486,10 @@
"permanent_deletion_warning": "Kalıcı silme uyarısı",
"permanent_deletion_warning_setting_description": "Nesneleri kalıcı olarak silerken uyarı göster",
"permanently_delete": "Kalıcı olarak sil",
- "permanently_delete_assets_count": "{count, plural, one {Dosya} other {Dosyalar}} kalıcı olarak silindi",
- "permanently_delete_assets_prompt": "Bu {count, plural, one {dosyayı} other {# dosyaları}} kalıcı olarak silmek istediğinizden emin misiniz? Bu işlem {count, plural, one {bu dosyayı} other {bu dosyaları}} albümlerinizden de kaldırır.",
- "permanently_deleted_asset": "Kalıcı olarak silinmiş ögeler",
- "permanently_deleted_assets_count": "{count, plural, one {# dosya} other {# dosya}} kalıcı olarak silindi",
+ "permanently_delete_assets_count": "{count, plural, one {öğe} other {öğeler}} kalıcı olarak silindi",
+ "permanently_delete_assets_prompt": "Bu {count, plural, one {öğeyi} other {# öğeleri}} kalıcı olarak silmek istediğinizden emin misiniz? Bu işlem {count, plural, one {bu öğeyi} other {bu öğeleri}} albümlerinizden de kaldırır.",
+ "permanently_deleted_asset": "Kalıcı olarak silinmiş öğeler",
+ "permanently_deleted_assets_count": "{count, plural, one {# öğe} other {# öğeler}} kalıcı olarak silindi",
"permission": "İzin",
"permission_empty": "İzniniz boş olmamalı",
"permission_onboarding_back": "Geri",
@@ -1436,6 +1501,9 @@
"permission_onboarding_permission_limited": "Sınırlı izin. Immich'in tüm fotoğrav ve videolarınızı yedeklemesine ve yönetmesine izin vermek için Ayarlar'da fotoğraf ve video izinlerini verin.",
"permission_onboarding_request": "Immich'in fotoğraflarınızı ve videolarınızı görüntüleyebilmesi için izne ihtiyacı var.",
"person": "Kişi",
+ "person_age_months": "{months, plural, one {# month} other {# months}} eski",
+ "person_age_year_months": "1 yıl, {months, plural, one {# month} other {# months}} eski",
+ "person_age_years": "{years, plural, other {# sene}} önce",
"person_birthdate": "{date} tarihinde doğdu",
"person_hidden": "{name}{hidden, select, true { (gizli)} other {}}",
"photo_shared_all_users": "Fotoğraflarınızı tüm kullanıcılarla paylaştınız gibi görünüyor veya paylaşacak kullanıcı bulunmuyor.",
@@ -1453,12 +1521,13 @@
"places_count": "{count, plural, one {{count, number} yer} other {{count, number} yer}}",
"play": "Oynat",
"play_memories": "Anıları oynat",
- "play_motion_photo": "Hareketli fotoğrafı oynat",
+ "play_motion_photo": "Hareketli Fotoğrafı Oynat",
"play_or_pause_video": "Videoyu oynat ya da durdur",
"please_auth_to_access": "Erişim için lütfen kimliğinizi doğrulayın",
"port": "Port",
"preferences_settings_subtitle": "Uygulama tercihlerini düzenle",
"preferences_settings_title": "Tercihler",
+ "preparing": "Hazırlanıyor",
"preset": "Ön ayar",
"preview": "Önizleme",
"previous": "Önceki",
@@ -1475,6 +1544,7 @@
"profile_drawer_client_out_of_date_minor": "Mobil uygulama güncel değil. Lütfen en son sürüme güncelleyin.",
"profile_drawer_client_server_up_to_date": "Uygulama ve sunucu güncel",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "Salt okunur mod etkinleştirildi. Çıkmak için kullanıcı avatar simgesine uzun basın.",
"profile_drawer_server_out_of_date_major": "Sunucu güncel değil. Lütfen en son ana sürüme güncelleyin.",
"profile_drawer_server_out_of_date_minor": "Sunucu güncel değil. Lütfen en son sürüme güncelleyin.",
"profile_image_of_user": "{user} kullanıcısının profil resmi",
@@ -1513,6 +1583,7 @@
"purchase_server_description_2": "Destekçi statüsü",
"purchase_server_title": "Sunucu",
"purchase_settings_server_activated": "Sunucu ürün anahtarı, yönetici tarafından yönetilir",
+ "query_asset_id": "Öğe Kimliği Sorgulama",
"queue_status": "Sırada {count}/{total}",
"rating": "Derecelendirme",
"rating_clear": "Derecelendirmeyi temizle",
@@ -1520,10 +1591,13 @@
"rating_description": "EXIF derecelendirmesini bilgi panelinde göster",
"reaction_options": "Tepki seçenekleri",
"read_changelog": "Değişiklik günlüğünü oku",
+ "readonly_mode_disabled": "Salt okunur mod devre dışı",
+ "readonly_mode_enabled": "Salt okunur mod etkin",
+ "ready_for_upload": "Yüklemeye hazır",
"reassign": "Yeniden ata",
- "reassigned_assets_to_existing_person": "{count, plural, one {# dosya} other {# dosya}} {name, select, null {mevcut bir kişiye} other {{name}}} atandı",
- "reassigned_assets_to_new_person": "{count, plural, one {# dosya} other {# dosya}} yeni bir kişiye atandı",
- "reassing_hint": "Seçili dosyaları mevcut bir kişiye atayın",
+ "reassigned_assets_to_existing_person": "{count, plural, one {# öğe} other {# öğeler}} {name, select, null {mevcut bir kişiye} other {{name}}} atandı",
+ "reassigned_assets_to_new_person": "{count, plural, one {# öğe} other {# öğeler}} yeni bir kişiye atandı",
+ "reassing_hint": "Seçili öğeleri mevcut bir kişiye atayın",
"recent": "Son",
"recent-albums": "Son kaydedilen albümler",
"recent_searches": "Son aramalar",
@@ -1543,16 +1617,17 @@
"refreshing_metadata": "Meta veriler yenileniyor",
"regenerating_thumbnails": "Küçük resimler yeniden oluşturuluyor",
"remote": "Uzaktan",
- "remote_assets": "Uzak Varlıklar",
+ "remote_assets": "Uzak Öğeler",
+ "remote_media_summary": "Uzaktan Medya Özeti",
"remove": "Kaldır",
- "remove_assets_album_confirmation": "{count, plural, one {# dosyayı} other {# dosyayı}} albümden çıkarmak istediğinizden emin misiniz?",
- "remove_assets_shared_link_confirmation": "{count, plural, one {# dosyayı} other {# dosyayı}} bu paylaşılan bağlantıdan çıkarmak istediğinizden emin misiniz?",
- "remove_assets_title": "Dosyaları çıkar?",
+ "remove_assets_album_confirmation": "{count, plural, one {# öğeyi} other {# öğeleri}} albümden çıkarmak istediğinizden emin misiniz?",
+ "remove_assets_shared_link_confirmation": "{count, plural, one {# öğeyi} other {# öğeleri}} bu paylaşılan bağlantıdan çıkarmak istediğinizden emin misiniz?",
+ "remove_assets_title": "Öğeleri çıkar?",
"remove_custom_date_range": "Özel tarih aralığını kaldır",
- "remove_deleted_assets": "Çevrimdışı dosyaları kaldır",
+ "remove_deleted_assets": "Silinen Öğeleri Kaldır",
"remove_from_album": "Albümden çıkar",
"remove_from_album_action_prompt": "{count} albümden kaldırıldı",
- "remove_from_favorites": "Gözdelerden çıkar",
+ "remove_from_favorites": "Favorilerden çıkar",
"remove_from_lock_folder_action_prompt": "{count} kilitli klasörden kaldırıldı",
"remove_from_locked_folder": "Kilitli klasörden kaldır",
"remove_from_locked_folder_confirmation": "Bu fotoğraf ve videoları kilitli klasörden çıkarmak istediğinizden emin misiniz? Çıkarıldıklarında kitaplığınızda görünür olacaklar.",
@@ -1564,25 +1639,28 @@
"remove_user": "Kullanıcıyı çıkar",
"removed_api_key": "API anahtarı {name} kaldırıldı",
"removed_from_archive": "Arşivden çıkarıldı",
- "removed_from_favorites": "Gözdelerden kaldırıldı",
- "removed_from_favorites_count": "{count, plural, other {#}} gözdelerden çıkarıldı",
+ "removed_from_favorites": "Favorilerden kaldırıldı",
+ "removed_from_favorites_count": "{count, plural, other {#}} favorilerden çıkarıldı",
"removed_memory": "Anı kaldırıldı",
"removed_photo_from_memory": "Fotoğraf anıdan kaldırıldı",
- "removed_tagged_assets": "{count, plural, one {# dosya} other {# dosya}} etiketleri kaldırıldı",
+ "removed_tagged_assets": "{count, plural, one {# öğenin} other {# öğelerin}} etiketleri kaldırıldı",
"rename": "Yeniden adlandır",
"repair": "Onar",
"repair_no_results_message": "Bulunamayan ve eksik dosyalar burada listelenecektir",
"replace_with_upload": "Yükleme ile değiştir",
"repository": "Depo",
- "require_password": "Şifre gerekli",
+ "require_password": "Şifre gerekiyor",
"require_user_to_change_password_on_first_login": "Kullanıcı ilk girişte şifreyi değiştirmeli",
"rescan": "Yeniden tara",
"reset": "Sıfırla",
"reset_password": "Şifreyi sıfırla",
"reset_people_visibility": "Kişilerin görünürlüğünü sıfırla",
"reset_pin_code": "PIN kodunu sıfırlayın",
+ "reset_pin_code_description": "PIN kodunuzu unuttuysanız, sıfırlamak için sunucu yöneticisiyle iletişime geçebilirsiniz",
+ "reset_pin_code_success": "PIN kodu başarıyla sıfırlandı",
+ "reset_pin_code_with_password": "PIN kodunuzu her zaman şifrenizle sıfırlayabilirsiniz",
"reset_sqlite": "SQLite Veritabanını Sıfırla",
- "reset_sqlite_confirmation": "SQLite veritabanını sıfırlamak istediğinizden emin misiniz? Verileri yeniden senkronize etmek için oturumu kapatıp tekrar oturum açmanız gerekecektir",
+ "reset_sqlite_confirmation": "SQLite veritabanını sıfırlamak istediğinizden emin misiniz? Verileri yeniden eşzamanlamak için oturumu kapatıp tekrar oturum açmanız gerekecektir",
"reset_sqlite_success": "SQLite veritabanını başarıyla sıfırladınız",
"reset_to_default": "Varsayılana sıfırla",
"resolve_duplicates": "Çiftleri çöz",
@@ -1591,8 +1669,9 @@
"restore_all": "Tümünü geri yükle",
"restore_trash_action_prompt": "{count} çöp kutusundan geri yüklendi",
"restore_user": "Kullanıcıyı geri yükle",
- "restored_asset": "Dosya geri yüklendi",
+ "restored_asset": "Öğe geri yüklendi",
"resume": "Devam et",
+ "resume_paused_jobs": "Sürdür {count, plural, one {# duraklatılmış iş} other {# duraklatılmış işler}}",
"retry_upload": "Yeniden yüklemeyi dene",
"review_duplicates": "Çiftleri gözden geçir",
"review_large_files": "Büyük dosyaları inceleyin",
@@ -1659,7 +1738,7 @@
"search_result_page_new_search_hint": "Yeni Arama",
"search_settings": "Ayarları ara",
"search_state": "Eyalet/İl ara...",
- "search_suggestion_list_smart_search_hint_1": "Akıllı arama varsayılan olarak etkindir, meta verileri aramak için syntax kullanın",
+ "search_suggestion_list_smart_search_hint_1": "Akıllı arama varsayılan olarak etkindir, meta verileri aramak için şu sözdizimini kullanın ",
"search_suggestion_list_smart_search_hint_2": "m:meta-veri-araması",
"search_tags": "Etiketleri ara...",
"search_timezone": "Saat dilimi ara...",
@@ -1686,6 +1765,7 @@
"select_user_for_sharing_page_err_album": "Albüm oluşturulamadı",
"selected": "Seçildi",
"selected_count": "{count, plural, other {# seçildi}}",
+ "selected_gps_coordinates": "Seçilen GPS Koordinatları",
"send_message": "Mesaj gönder",
"send_welcome_email": "Hoş geldin e-postası gönder",
"server_endpoint": "Sunucu Uç Noktası",
@@ -1695,7 +1775,7 @@
"server_online": "Sunucu çevrimiçi",
"server_privacy": "Sunucu Gizliliği",
"server_stats": "Sunucu istatistikleri",
- "server_version": "Sunucu versiyonu",
+ "server_version": "Sunucu Sürümü",
"set": "Ayarla",
"set_as_album_cover": "Albüm resmi olarak ayarla",
"set_as_featured_photo": "Öne çıkan fotoğraf olarak ayarla",
@@ -1703,9 +1783,9 @@
"set_date_of_birth": "Doğum tarihini ayarla",
"set_profile_picture": "Profil resmini ayarla",
"set_slideshow_to_fullscreen": "Slayt gösterisini tam ekran yap",
- "set_stack_primary_asset": "Birincil varlık olarak ayarla",
+ "set_stack_primary_asset": "Birincil öğe olarak ayarla",
"setting_image_viewer_help": "Görüntüleyici önce küçük resmi gösterir, ardından orta boy önizlemeyi (etkinleştirilmişse) ve son olarak orijinali (etkinleştirilmişse) gösterir.",
- "setting_image_viewer_original_subtitle": "Orijinal tam çözünürlüklü görüntüyü göstermek için etkinleştirin. Veri kullanımını azaltmak için devre dışı bırakın (hem ağ hem de cihaz önbelleği).",
+ "setting_image_viewer_original_subtitle": "Orijinal tam çözünürlüklü görüntüyü (büyük!) yüklemek için etkinleştirin. Veri kullanımını azaltmak için devre dışı bırakın (hem ağ hem de cihaz önbelleği).",
"setting_image_viewer_original_title": "Orijinal görüntüyü göster",
"setting_image_viewer_preview_subtitle": "Orta çözünürlüklü bir görüntü göstermek için etkinleştirin. Orijinali doğrudan göstermek veya yalnızca küçük resmi kullanmak için devre dışı bırakın.",
"setting_image_viewer_preview_title": "Önizleme görüntüsü göster",
@@ -1731,7 +1811,7 @@
"settings_saved": "Ayarlar kaydedildi",
"setup_pin_code": "PIN kodunu ayarlayın",
"share": "Paylaş",
- "share_action_prompt": "Paylaşılan {count} varlık",
+ "share_action_prompt": "Paylaşılan {count} öğe",
"share_add_photos": "Fotoğraf ekle",
"share_assets_selected": "{count} seçili",
"share_dialog_preparing": "Hazırlanıyor...",
@@ -1751,7 +1831,7 @@
"shared_intent_upload_button_progress_text": "{current} / {total} Yüklendi",
"shared_link_app_bar_title": "Paylaşılan Bağlantılar",
"shared_link_clipboard_copied_massage": "Panoya kopyalandı",
- "shared_link_clipboard_text": "Bağlantı: {link}\nParola: {password}",
+ "shared_link_clipboard_text": "Bağlantı: {link}\nŞifre: {password}",
"shared_link_create_error": "Paylaşım bağlantısı oluşturulurken hata oluştu",
"shared_link_custom_url_description": "Özel bir URL ile bu paylaşılan bağlantıya erişin",
"shared_link_edit_description_hint": "Açıklama yazın",
@@ -1763,7 +1843,7 @@
"shared_link_edit_expire_after_option_minutes": "{count} dakika",
"shared_link_edit_expire_after_option_months": "{count} ay",
"shared_link_edit_expire_after_option_year": "{count} yıl",
- "shared_link_edit_password_hint": "Paylaşım parolasını girin",
+ "shared_link_edit_password_hint": "Paylaşım şifresini girin",
"shared_link_edit_submit_button": "Bağlantıyı güncelle",
"shared_link_error_server_url_fetch": "Sunucu URL'si alınamadı",
"shared_link_expires_day": "Süresi {count} gün içinde doluyor",
@@ -1779,10 +1859,10 @@
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Paylaşılan Bağlantıları Yönet",
"shared_link_options": "Paylaşılan bağlantı seçenekleri",
- "shared_link_password_description": "Bu paylaşılan bağlantıya erişmek için şifre gerektirir",
+ "shared_link_password_description": "Bu paylaşılan bağlantıya erişmek için şifre gereklidir",
"shared_links": "Paylaşılan bağlantılar",
"shared_links_description": "Fotoğraf ve videoları bir bağlantı ile paylaş",
- "shared_photos_and_videos_count": "{assetCount, plural, one {# paylaşılan fotoğraf veya video.} other {# paylaşılan fotoğraf & video.}}",
+ "shared_photos_and_videos_count": "{assetCount, plural, other {# paylaşılan fotoğraflar & videolar.}}",
"shared_with_me": "Benimle paylaşılanlar",
"shared_with_partner": "{partner} ile paylaşıldı",
"sharing": "Paylaşılıyor",
@@ -1792,8 +1872,8 @@
"sharing_page_empty_list": "LİSTEYİ BOŞALT",
"sharing_sidebar_description": "Yan panelde paylaşılanlara kısa yol göster",
"sharing_silver_appbar_create_shared_album": "Yeni paylaşılan albüm",
- "sharing_silver_appbar_share_partner": "Partnerle paylaş",
- "shift_to_permanent_delete": "Dosyayı kalıcı olarak silmek için ⇧ tuşuna basın",
+ "sharing_silver_appbar_share_partner": "Ortakla paylaş",
+ "shift_to_permanent_delete": "Öğeyi kalıcı olarak silmek için ⇧ tuşuna basın",
"show_album_options": "Albüm ayarlarını göster",
"show_albums": "Albümleri göster",
"show_all_people": "Tüm kişileri göster",
@@ -1814,6 +1894,7 @@
"show_slideshow_transition": "Slayt geçişini göster",
"show_supporter_badge": "Destekçi rozeti",
"show_supporter_badge_description": "Destekçi rozetini göster",
+ "show_text_search_menu": "Metin arama menüsünü göster",
"shuffle": "Karıştır",
"sidebar": "Yan panel",
"sidebar_display_description": "Yan panelde görünüme kısa yol göster",
@@ -1829,6 +1910,7 @@
"sort_created": "Oluşturulma tarihi",
"sort_items": "Öğe sayısı",
"sort_modified": "Değişiklik tarihi",
+ "sort_newest": "En yeni fotoğraf",
"sort_oldest": "En eski fotoğraf",
"sort_people_by_similarity": "İnsanları benzerliğe göre sırala",
"sort_recent": "En yeni fotoğraf",
@@ -1839,10 +1921,11 @@
"stack_duplicates": "Çiftleri yığınla",
"stack_select_one_photo": "Yığın için ana fotoğrafı seç",
"stack_selected_photos": "Seçili fotoğrafları yığınla",
- "stacked_assets_count": "{count, plural, one {# dosya} other {# dosya}} yığınlandı",
+ "stacked_assets_count": "{count, plural, one {# öğe} other {# öğeler}} yığınlandı",
"stacktrace": "Yığın izi",
"start": "Başlat",
"start_date": "Başlangıç tarihi",
+ "start_date_before_end_date": "Başlangıç tarihi bitiş tarihinden önce olmalıdır",
"state": "Eyalet/İl",
"status": "Durum",
"stop_casting": "Yansıtmayı durdur",
@@ -1862,27 +1945,29 @@
"support_and_feedback": "Destek & Geri Bildirim",
"support_third_party_description": "Immich kurulumu üçüncü bir tarafça yapıldı. Yaşadığınız sorunlar bu paketle ilgili olabilir. Lütfen öncelikli olarak aşağıdaki bağlantıları kullanarak bu sağlayıcıyla iletişime geçin.",
"swap_merge_direction": "Birleştirme yönünü değiştir",
- "sync": "Senkronize et",
+ "sync": "Eşzamanla",
"sync_albums": "Albümleri eşzamanla",
"sync_albums_manual_subtitle": "Yüklenmiş fotoğraf ve videoları yedekleme için seçili albümler ile eşzamanlayın",
- "sync_local": "Yerel Senkronizasyon",
- "sync_remote": "Uzaktan Senkronizasyon",
- "sync_upload_album_setting_subtitle": "Seçili albümleri Immich'te oluşturun ve içindekileri Immich'e yükleyin.",
+ "sync_local": "Yerel Eşzamanlama",
+ "sync_remote": "Uzaktan Eşzamanlama",
+ "sync_status": "Eşzamanlama Durumu",
+ "sync_status_subtitle": "Eşzamanlama sistemini görüntüleyin ve yönetin",
+ "sync_upload_album_setting_subtitle": "Fotoğraflarınızı ve videolarınızı oluşturun ve Immich'te seçtiğiniz albümlere yükleyin",
"tag": "Etiket",
- "tag_assets": "Dosyaları etiketle",
+ "tag_assets": "Öğeleri etiketle",
"tag_created": "Etiket oluşturuldu: {tag}",
"tag_feature_description": "Etiket temalarına göre gruplandırılmış fotoğraf ve videoları keşfedin",
"tag_not_found_question": "Etiket bulunamadı mı? Yeni bir etiket oluşturun.",
"tag_people": "İnsanları etiketle",
"tag_updated": "Etiket güncellendi: {tag}",
- "tagged_assets": "{count, plural, one {# dosya} other {# dosya}} etiketlendi",
+ "tagged_assets": "{count, plural, one {# öğe} other {# öğeler}} etiketlendi",
"tags": "Etiketler",
"tap_to_run_job": "Başlatmak için dokunun",
"template": "Şablon",
"theme": "Tema",
"theme_selection": "Tema seçimi",
"theme_selection_description": "Temayı otomatik olarak tarayıcınızın sistem tercihine göre açık veya koyu ayarlayın",
- "theme_setting_asset_list_storage_indicator_title": "Öğelerin küçük resimlerinde depolama göstergesini göster",
+ "theme_setting_asset_list_storage_indicator_title": "Öğe kutucuklarında depolama göstergesini göster",
"theme_setting_asset_list_tiles_per_row_title": "Satır başına öğe sayısı ({count})",
"theme_setting_colorful_interface_subtitle": "Birincil rengi arka plan yüzeylerine uygulayın.",
"theme_setting_colorful_interface_title": "Renkli arayüz",
@@ -1893,7 +1978,7 @@
"theme_setting_system_primary_color_title": "Sistem rengini kullan",
"theme_setting_system_theme_switch": "Otomatik (sistem ayarına göre)",
"theme_setting_theme_subtitle": "Uygulama teması seç",
- "theme_setting_three_stage_loading_subtitle": "Üç aşamalı yükleme, yükleme performansını artırabilir ancak önemli ölçüde daha yüksek ağ yüküne sebep olur.",
+ "theme_setting_three_stage_loading_subtitle": "Üç aşamalı yükleme, yükleme performansını artırabilir ancak ağ yükünü önemli ölçüde artırır",
"theme_setting_three_stage_loading_title": "Üç aşamalı yüklemeyi etkinleştir",
"they_will_be_merged_together": "Birlikte birleştirilecekler",
"third_party_resources": "Üçüncü taraf kaynaklar",
@@ -1902,9 +1987,11 @@
"timezone": "Zaman dilimi",
"to_archive": "Arşivle",
"to_change_password": "Şifreyi değiştir",
- "to_favorite": "Gözdelere ekle",
+ "to_favorite": "Favorilere ekle",
"to_login": "Oturum aç",
+ "to_multi_select": "çoklu seçim için",
"to_parent": "Üst öğeye git",
+ "to_select": "seçmek için",
"to_trash": "Çöpe taşı",
"toggle_settings": "Ayarları değiştir",
"total": "Toplam",
@@ -1913,17 +2000,18 @@
"trash_action_prompt": "{count} çöp kutusuna taşındı",
"trash_all": "Hepsini sil",
"trash_count": "Çöp kutusu {count, number}",
- "trash_delete_asset": "Ögeyi Sil/Çöpe gönder",
+ "trash_delete_asset": "Öğeyi Sil/Çöpe Gönder",
"trash_emptied": "Çöp kutusu temizlendi",
"trash_no_results_message": "Silinen fotoğraf ve videolar burada listelenecektir.",
"trash_page_delete_all": "Tümünü Sil",
"trash_page_empty_trash_dialog_content": "Çöp kutusuna atılmış öğeleri silmek istediğinize emin misiniz? Bu öğeler Immich'ten kalıcı olarak silinecek",
"trash_page_info": "Çöp kutusuna atılan öğeler {days} gün sonra kalıcı olarak silinecektir",
- "trash_page_no_assets": "Çöp kutusu boş",
- "trash_page_restore_all": "Tümünü geri yükle",
- "trash_page_select_assets_btn": "İçerik seç",
+ "trash_page_no_assets": "Çöp kutusuna atılmış öğe yok",
+ "trash_page_restore_all": "Tümünü Geri Yükle",
+ "trash_page_select_assets_btn": "Öğeleri seç",
"trash_page_title": "Çöp Kutusu ({count})",
"trashed_items_will_be_permanently_deleted_after": "Silinen öğeler {days, plural, one {# gün} other {# gün}} sonra kalıcı olarak silinecek.",
+ "troubleshoot": "Sorun giderme",
"type": "Tür",
"unable_to_change_pin_code": "PIN kodu değiştirilemedi",
"unable_to_setup_pin_code": "PIN kodu ayarlanamadı",
@@ -1931,45 +2019,46 @@
"unarchive_action_prompt": "{count} Arşivden kaldırıldı",
"unarchived_count": "{count, plural, other {# arşivden çıkarıldı}}",
"undo": "Geri al",
- "unfavorite": "Gözdelerden kaldır",
- "unfavorite_action_prompt": "{count} Sık Kullanılanlar'dan kaldırıldı",
+ "unfavorite": "Favorilerden kaldır",
+ "unfavorite_action_prompt": "{count} Favorilerden kaldırıldı",
"unhide_person": "Kişiyi göster",
"unknown": "Bilinmeyen",
- "unknown_country": "Bilinmeyen ülke",
- "unknown_year": "Bilinmeyen YIl",
+ "unknown_country": "Bilinmeyen Ülke",
+ "unknown_year": "Bilinmeyen Yıl",
"unlimited": "Sınırsız",
"unlink_motion_video": "Hareketli video bağlantısını kaldır",
"unlink_oauth": "OAuth bağlantısını kaldır",
"unlinked_oauth_account": "Bağlantısı kaldırılmış OAuth hesabı",
- "unmute_memories": "Anıların sesini aç",
+ "unmute_memories": "Anıların Sesini Aç",
"unnamed_album": "İsimsiz Albüm",
"unnamed_album_delete_confirmation": "Bu albümü silmek istediğinizden emin misiniz?",
- "unnamed_share": "İsimsiz paylaşım",
+ "unnamed_share": "İsimsiz Paylaşım",
"unsaved_change": "Kaydedilmemiş değişiklik",
"unselect_all": "Tümünü seçimini kaldır",
"unselect_all_duplicates": "Tüm çiftlerin seçimini kaldır",
"unselect_all_in": "{group} içindeki tüm seçimleri kaldır",
"unstack": "Yığını kaldır",
"unstack_action_prompt": "{count} istiflenmemiş",
- "unstacked_assets_count": "{count, plural, one {# dosya} other {# dosya}} yığını kaldırıldı",
+ "unstacked_assets_count": "{count, plural, one {# öğenin} other {# öğelerin}} yığını kaldırıldı",
"untagged": "Etiketlenmemiş",
"up_next": "Sıradaki",
+ "update_location_action_prompt": "Seçilen {count} öğenin konumunu şu şekilde güncelleyin:",
"updated_at": "Güncellenme",
- "updated_password": "Şifreyi güncelle",
+ "updated_password": "Güncellenen şifre",
"upload": "Yükle",
"upload_action_prompt": "{count} yükleme için sıraya alındı",
"upload_concurrency": "Yükleme eşzamanlılığı",
"upload_details": "Yükleme Ayrıntıları",
"upload_dialog_info": "Seçili öğeleri sunucuya yedeklemek istiyor musunuz?",
"upload_dialog_title": "Öğe Yükle",
- "upload_errors": "{count, plural, one {# hata} other {# hatayla}} yükleme tamamlandı, yeni yüklenen dosyaları görmek için sayfayı güncelleyin.",
+ "upload_errors": "{count, plural, one {# hata} other {# hatayla}} yükleme tamamlandı, yeni yüklenen öğeleri görmek için sayfayı güncelleyin.",
"upload_finished": "Yükleme tamamlandı",
"upload_progress": "{remaining, number} kalan - {processed, number}/{total, number} işlendi",
- "upload_skipped_duplicates": "{count, plural, one {# çift dosya} other {# çift dosya}} atlandı",
+ "upload_skipped_duplicates": "{count, plural, one {# yinelenen öğe} other {# yinelenen öğeler}} atlandı",
"upload_status_duplicates": "Çiftler",
"upload_status_errors": "Hatalar",
"upload_status_uploaded": "Yüklendi",
- "upload_success": "Yükleme başarılı, yüklenen yeni ögeleri görebilmek için sayfayı yenileyin.",
+ "upload_success": "Yükleme başarılı, yüklenen yeni öğeleri görebilmek için sayfayı yenileyin.",
"upload_to_immich": "Immich'e Yükle ({count})",
"uploading": "Yükleniyor",
"uploading_media": "Medya yükleme",
@@ -1981,7 +2070,7 @@
"user": "Kullanıcı",
"user_has_been_deleted": "Bu kullanıcı silindi.",
"user_id": "Kullanıcı ID",
- "user_liked": "{type, select, photo {Bu fotoğraf} video {Bu video} asset {Bu dosya} other {Bu}} {user} tarafından beğenildi",
+ "user_liked": "{type, select, photo {Bu fotoğraf} video {Bu video} asset {Bu öğe} other {Bu}} {user} tarafından beğenildi",
"user_pin_code_settings": "PIN Kodu",
"user_pin_code_settings_description": "PIN kodunuzu yönetin",
"user_privacy": "Kullanıcı Gizliliği",
@@ -1990,21 +2079,21 @@
"user_role_set": "{user}, {role} olarak ayarlandı",
"user_usage_detail": "Kullanıcı kullanım detayı",
"user_usage_stats": "Hesap kullanım istatistikleri",
- "user_usage_stats_description": "hesap kullanım istatistiklerini göster",
+ "user_usage_stats_description": "Hesap kullanım istatistiklerini göster",
"username": "Kullanıcı adı",
"users": "Kullanıcılar",
"users_added_to_album_count": "Albüme {count, plural, one {# user} other {# users}} eklendi",
- "utilities": "Yardımcılar",
+ "utilities": "Yardımcı Programlar",
"validate": "Doğrula",
"validate_endpoint_error": "Lütfen geçerli bir URL girin",
"variables": "Değişkenler",
- "version": "Versiyon",
+ "version": "Sürüm",
"version_announcement_closing": "Arkadaşınız, Alex",
"version_announcement_message": "Merhaba! Immich'in yeni bir sürümü mevcut. Lütfen yapılandırmanızın güncel olduğundan emin olmak için sürüm notlarını okumak için biraz zaman ayırın, özellikle WatchTower veya Immich kurulumunuzu otomatik olarak güncelleyen bir mekanizma kullanıyorsanız yanlış yapılandırmaların önüne geçmek adına bu önemlidir.",
- "version_history": "Versiyon geçmişi",
+ "version_history": "Sürüm Geçmişi",
"version_history_item": "{version}, {date} tarihinde kuruldu",
"video": "Video",
- "video_hover_setting": "Üzerinde durulduğunda video önizlemesi oynat",
+ "video_hover_setting": "Üzerinde durulduğunda video ön izlemesi oynat",
"video_hover_setting_description": "Öğe üzerinde fareyle durulduğunda video küçük resmini oynatır. Bu özellik devre dışıyken, oynatma simgesine fareyle gidilerek oynatma başlatılabilir.",
"videos": "Videolar",
"videos_count": "{count, plural, one {# video} other {# video}}",
@@ -2017,9 +2106,10 @@
"view_link": "Bağlantıyı göster",
"view_links": "Bağlantıları göster",
"view_name": "Göster",
- "view_next_asset": "Sonraki dosyayı görüntüle",
- "view_previous_asset": "Önceki dosyayı görüntüle",
+ "view_next_asset": "Sonraki öğeyi görüntüle",
+ "view_previous_asset": "Önceki öğeyi görüntüle",
"view_qr_code": "QR kodu görüntüle",
+ "view_similar_photos": "Benzer fotoğrafları görüntüle",
"view_stack": "Yığını görüntüle",
"view_user": "Kullanıcıyı Görüntüle",
"viewer_remove_from_stack": "Yığından Kaldır",
@@ -2038,5 +2128,6 @@
"yes": "Evet",
"you_dont_have_any_shared_links": "Herhangi bir paylaşılan bağlantınız yok",
"your_wifi_name": "Wi-Fi Adınız",
- "zoom_image": "Görüntüyü yakınlaştır"
+ "zoom_image": "Görüntüyü yakınlaştır",
+ "zoom_to_bounds": "Sınırlara yakınlaştır"
}
diff --git a/i18n/uk.json b/i18n/uk.json
index 903c83ec25..a664fc9aa0 100644
--- a/i18n/uk.json
+++ b/i18n/uk.json
@@ -28,6 +28,7 @@
"add_to_album": "Додати у альбом",
"add_to_album_bottom_sheet_added": "Додано до {album}",
"add_to_album_bottom_sheet_already_exists": "Вже є в {album}",
+ "add_to_album_bottom_sheet_some_local_assets": "Деякі локальні ресурси не вдалося додати до альбому",
"add_to_album_toggle": "Перемикання вибору для {album}",
"add_to_albums": "Додати до альбомів",
"add_to_albums_count": "Додати до альбомів ({count})",
@@ -39,7 +40,7 @@
"admin": {
"add_exclusion_pattern_description": "Додайте шаблони виключень. Підстановка з використанням *, ** та ? підтримується. Для ігнорування всіх файлів у будь-якому каталозі з ім'ям «Raw», використовуйте \"**/Raw/**\". Для ігнорування всіх файлів, що закінчуються на \".tif\", використовуйте \"**/*.tif\". Для ігнорування абсолютного шляху використовуйте \"/path/to/ignore/**\".",
"admin_user": "Адміністратор",
- "asset_offline_description": "Цей файл зовнішньої бібліотеки не знайдено на диску і був переміщений до смітника. Якщо файл був переміщений у межах бібліотеки, перевірте свою стрічку на наявність нового відповідного файлу. Щоб відновити цей файл, переконайтеся, що шлях до файлу доступний для Immich, і проскануйте бібліотеку.",
+ "asset_offline_description": "Цей файл зовнішньої бібліотеки не знайдено на диску і був переміщений до кошика. Якщо файл був переміщений у межах бібліотеки, перевірте свою стрічку на наявність нового відповідного файлу. Щоб відновити цей файл, переконайтеся, що шлях до файлу доступний для Immich, і проскануйте бібліотеку.",
"authentication_settings": "Налаштування аутентифікації",
"authentication_settings_description": "Управління паролями, OAuth та іншими налаштуваннями аутентифікації",
"authentication_settings_disable_all": "Ви впевнені, що хочете вимкнути всі методи входу? Вхід буде повністю вимкнений.",
@@ -70,14 +71,14 @@
"cron_expression_description": "Встановіть інтервал сканування, використовуючи формат cron. Для отримання додаткової інформації зверніться до напр. Crontab Guru",
"cron_expression_presets": "Попередні налаштування cron виразів",
"disable_login": "Вимкнути вхід",
- "duplicate_detection_job_description": "Запустити машинне навчання на активах для виявлення схожих зображень. Залежить від інтелектуального пошуку",
+ "duplicate_detection_job_description": "Запустити машинне навчання на ресурсах для виявлення схожих зображень. Використовує інтелектуальний пошук",
"exclusion_pattern_description": "Шаблони виключень дозволяють ігнорувати файли та папки під час сканування вашої бібліотеки. Це корисно, якщо у вас є папки, які містять файли, які ви не хочете імпортувати, наприклад, RAW-файли.",
"external_library_management": "Керування зовнішніми бібліотеками",
"face_detection": "Виявлення обличчя",
"face_detection_description": "Виявлення облич на медіафайлах за допомогою машинного навчання. Для відео обробляється лише ескіз. \"Оновити\" повторно обробляє всі файли. \"Скинути\" додатково очищає всі поточні дані про обличчя. \"Відсутні\" ставить у чергу файли, які ще не були оброблені. Виявлені обличчя будуть поставлені в чергу для розпізнавання після завершення виявлення, групуючи їх у вже існуючих або нових людей.",
"facial_recognition_job_description": "Групування виявлених облич у людей. Цей крок виконується після завершення виявлення облич. \"Скинути\" повторно кластеризує всі обличчя. \"Відсутні\" ставить у чергу обличчя, яким ще не призначено людину.",
"failed_job_command": "Команда {command} не виконалася для завдання: {job}",
- "force_delete_user_warning": "ПОПЕРЕДЖЕННЯ: Це негайно призведе до видалення користувача і всіх активів. Цю дію не можна скасувати, і файли не можна буде відновити.",
+ "force_delete_user_warning": "ПОПЕРЕДЖЕННЯ: Це негайно призведе до видалення користувача і всіх ресурсів. Цю дію не можна скасувати, і файли не можна буде відновити.",
"image_format": "Формат",
"image_format_description": "Формат WebP виробляє меньші файлів, ніж JPEG, але його кодування вимагає більше часу.",
"image_fullsize_description": "Повнорозмірне зображення з видаленими метаданими, які використовуються під час збільшення",
@@ -123,6 +124,13 @@
"logging_enable_description": "Увімкнути ведення журналу",
"logging_level_description": "Коли увімкнено, який рівень журналювання використовувати.",
"logging_settings": "Журналювання",
+ "machine_learning_availability_checks": "Перевірки доступності",
+ "machine_learning_availability_checks_description": "Автоматично виявляти та надавати перевагу доступним серверам машинного навчання",
+ "machine_learning_availability_checks_enabled": "Увімкнути перевірки доступності",
+ "machine_learning_availability_checks_interval": "Інтервал перевірки",
+ "machine_learning_availability_checks_interval_description": "Інтервал у мілісекундах між перевірками доступності",
+ "machine_learning_availability_checks_timeout": "Тайм-аут запиту",
+ "machine_learning_availability_checks_timeout_description": "Тайм-аут у мілісекундах для перевірки доступності",
"machine_learning_clip_model": "Модель CLIP",
"machine_learning_clip_model_description": "Ім'я однієї з моделей CLIP, яка перерахована тут. Зауважте, що потрібно знову запустити завдання «Розумний пошук» для всіх зображень після зміни моделі.",
"machine_learning_duplicate_detection": "Виявлення дублікатів",
@@ -258,10 +266,10 @@
"server_welcome_message": "Вітальне повідомлення",
"server_welcome_message_description": "Повідомлення, яке відображається на сторінці входу.",
"sidecar_job": "Метадані з sidecar-файлів",
- "sidecar_job_description": "Виявлення або синхронізація метаданих додатків з файлової системи",
+ "sidecar_job_description": "Пошук або синхронізація сайдкар-метаданих з файлової системи",
"slideshow_duration_description": "Кількість секунд для відображення кожного зображення",
"smart_search_job_description": "Запуск машинного навчання для ресурсів для підтримки розумного пошуку",
- "storage_template_date_time_description": "Позначка часу створення активу використовується для інформації про дату й час",
+ "storage_template_date_time_description": "Позначка часу створення ресурсу використовується для інформації про дату й час",
"storage_template_date_time_sample": "Час вибірки {date}",
"storage_template_enable_description": "Ввімкнути механізм шаблонів сховища",
"storage_template_hash_verification_enabled": "Увімкнено перевірку хешу",
@@ -340,7 +348,7 @@
"transcoding_settings": "Налаштування транскодування відео",
"transcoding_settings_description": "Керування які відео транскодувати і як їх обробляти",
"transcoding_target_resolution": "Роздільна здатність",
- "transcoding_target_resolution_description": "Вищі роздільні здатності можуть зберігати більше деталей, але займають більше часу на кодування, мають більші розміри файлів і можуть зменшити швидкість роботи додатку.",
+ "transcoding_target_resolution_description": "Вищі роздільні здатності можуть зберігати більше деталей, але займають більше часу на кодування, мають більші розміри файлів і можуть зменшити швидкість роботи застосунку.",
"transcoding_temporal_aq": "Тимчасове AQ",
"transcoding_temporal_aq_description": "Це застосовується лише до NVENC. Підвищує якість сцен з великою деталізацією та низьким рухом. Може бути несумісним зі старими пристроями.",
"transcoding_threads": "Потоки",
@@ -353,11 +361,11 @@
"transcoding_two_pass_encoding_setting_description": "Транскодування за двома проходами для отримання кращих закодованих відео. Коли ввімкнено максимальний бітрейт (необхідний для роботи з H.264 та HEVC), цей режим використовує діапазон бітрейту, заснований на максимальному бітрейті, і ігнорує CRF. Для VP9 можна використовувати CRF, якщо вимкнено максимальний бітрейт.",
"transcoding_video_codec": "Відеокодек",
"transcoding_video_codec_description": "VP9 має високу ефективність і сумісність з вебом, але потребує більше часу на транскодування. HEVC працює схоже, але має меншу сумісність з вебом. H.264 має широку сумісність і швидко транскодується, але створює значно більші файли. AV1 - найефективніший кодек, але не підтримується на старіших пристроях.",
- "trash_enabled_description": "Увімкнення смітника",
+ "trash_enabled_description": "Увімкнення кошика",
"trash_number_of_days": "Кількість днів",
- "trash_number_of_days_description": "Кількість днів, щоб залишити ресурси в смітнику перед остаточним їх видаленням",
- "trash_settings": "Налаштування смітника",
- "trash_settings_description": "Керування налаштуваннями смітника",
+ "trash_number_of_days_description": "Кількість днів, протягом якої залишати ресурси в кошику перед їх остаточним видаленням",
+ "trash_settings": "Налаштування кошика",
+ "trash_settings_description": "Керування налаштуваннями кошика",
"unlink_all_oauth_accounts": "Від’єднати всі облікові записи OAuth",
"unlink_all_oauth_accounts_description": "Не забудьте від’єднати всі облікові записи OAuth перед переходом до нового постачальника.",
"unlink_all_oauth_accounts_prompt": "Ви впевнені, що хочете від’єднати всі облікові записи OAuth? Це скине ідентифікатор OAuth для кожного користувача, і цю дію не можна буде скасувати.",
@@ -387,15 +395,15 @@
"admin_password": "Пароль адміністратора",
"administration": "Адміністрування",
"advanced": "Розширені",
- "advanced_settings_beta_timeline_subtitle": "Випробуйте новий інтерфейс застосунку",
- "advanced_settings_beta_timeline_title": "Бета-версія стрічки",
- "advanced_settings_enable_alternate_media_filter_subtitle": "Використовуйте цей варіант для фільтрації медіафайлів під час синхронізації за альтернативними критеріями. Спробуйте це, якщо у вас виникають проблеми з тим, що додаток не виявляє всі альбоми.",
+ "advanced_settings_enable_alternate_media_filter_subtitle": "Використовуйте цей варіант для фільтрації медіафайлів під час синхронізації за альтернативними критеріями. Спробуйте це, якщо у вас виникають проблеми з тим, що застосунок не виявляє всі альбоми.",
"advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНТАЛЬНИЙ] Використовуйте альтернативний фільтр синхронізації альбомів пристрою",
"advanced_settings_log_level_title": "Рівень логування: {level}",
"advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте цей параметр, щоб завантажувати зображення з серверу.",
"advanced_settings_prefer_remote_title": "Перевага віддаленим зображенням",
"advanced_settings_proxy_headers_subtitle": "Визначте заголовки проксі-сервера, які Immich має надсилати з кожним мережевим запитом",
"advanced_settings_proxy_headers_title": "Проксі-заголовки",
+ "advanced_settings_readonly_mode_subtitle": "Увімкнення режиму тільки для читання, в якому фотографії можна тільки переглядати, а такі функції, як вибір декількох зображень, спільний доступ, передача, видалення, вимкнені. Увімкнення/вимкнення режиму тільки для читання за допомогою аватара користувача на головному екрані",
+ "advanced_settings_readonly_mode_title": "Режим лише для читання",
"advanced_settings_self_signed_ssl_subtitle": "Пропускає перевірку SSL-сертифіката сервера. Потрібне для самопідписаних сертифікатів.",
"advanced_settings_self_signed_ssl_title": "Дозволити самопідписані SSL-сертифікати",
"advanced_settings_sync_remote_deletions_subtitle": "Автоматично видаляти або відновлювати ресурс на цьому пристрої, коли ця дія виконується в веб-інтерфейсі",
@@ -423,6 +431,7 @@
"album_remove_user_confirmation": "Ви впевнені, що хочете видалити {user}?",
"album_search_not_found": "Альбомів, що відповідають вашому запиту, не знайдено",
"album_share_no_users": "Схоже, ви поділилися цим альбомом з усіма користувачами або у вас немає жодного користувача, з яким можна було б поділитися.",
+ "album_summary": "Короткий опис альбому",
"album_updated": "Альбом оновлено",
"album_updated_setting_description": "Отримуйте сповіщення на електронну пошту, коли у спільному альбомі з'являються нові ресурси",
"album_user_left": "Ви покинули {album}",
@@ -461,6 +470,7 @@
"app_bar_signout_dialog_title": "Вийти з аккаунта",
"app_settings": "Налаштування програми",
"appears_in": "З'являється в",
+ "apply_count": "Застосувати ({count, number})",
"archive": "Архівувати",
"archive_action_prompt": "{count} додано до архіву",
"archive_or_unarchive_photo": "Архівувати або розархівувати фото",
@@ -488,11 +498,13 @@
"asset_list_layout_sub_title": "Розмітка",
"asset_list_settings_subtitle": "Налаштування вигляду сітки фото",
"asset_list_settings_title": "Фото-сітка",
- "asset_offline": "Актив вимкнено",
- "asset_offline_description": "Цей зовнішній актив більше не знайдено на диску. Будь ласка, зверніться до адміністратора Immich за допомогою.",
+ "asset_offline": "Ресурс офлайн",
+ "asset_offline_description": "Цей зовнішній ресурс більше не знайдено на диску. Будь ласка, зверніться до адміністратора Immich за допомогою.",
"asset_restored_successfully": "Елемент успішно відновлено",
"asset_skipped": "Пропущено",
- "asset_skipped_in_trash": "У смітнику",
+ "asset_skipped_in_trash": "У кошику",
+ "asset_trashed": "Об'єкт видалено з кошика",
+ "asset_troubleshoot": "Вирішення проблем з активами",
"asset_uploaded": "Завантажено",
"asset_uploading": "Завантаження…",
"asset_viewer_settings_subtitle": "Керуйте налаштуваннями переглядача галереї",
@@ -500,34 +512,36 @@
"assets": "елементи",
"assets_added_count": "Додано {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_added_to_album_count": "Додано {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} до альбому",
- "assets_added_to_albums_count": "Додано {assetTotal, plural, one {# актив} other {# активи}} до {albumTotal} альбомів",
+ "assets_added_to_albums_count": "Додано {assetTotal, plural, one {# ресурс} other {# ресурси}} до {albumTotal, plural, one {# альбом} other {# альбом}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Ресурс} other {Ресурси}} не можна додати до альбому",
- "assets_cannot_be_added_to_albums": "{count, plural, one {Актив} other {Активи}} не можна додати до жодного з альбомів",
+ "assets_cannot_be_added_to_albums": "{count, plural, one {Елемент} other {Елементи}} не можна додати до жодного з альбомів",
"assets_count": "{count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_deleted_permanently": "{count} елемент(и) остаточно видалено",
"assets_deleted_permanently_from_server": "{count} елемент(и) видалено назавжди з сервера Immich",
"assets_downloaded_failed": "{count, plural, one {Завантажено # файл — {error} файл не вдалося} other {Завантажено # файлів — {error} файлів не вдалося}}",
"assets_downloaded_successfully": "{count, plural, one {Успішно завантажено # файл} other {Успішно завантажено # файлів}}",
- "assets_moved_to_trash_count": "Переміщено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} у смітник",
+ "assets_moved_to_trash_count": "Переміщено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} у кошик",
"assets_permanently_deleted_count": "Остаточно видалено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_removed_count": "Вилучено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_removed_permanently_from_device": "{count} елемент(и) видалені назавжди з вашого пристрою",
- "assets_restore_confirmation": "Ви впевнені, що хочете відновити всі свої активи з смітника? Цю дію не можна скасувати! Зверніть увагу, що будь-які офлайн-активи не можуть бути відновлені таким чином.",
+ "assets_restore_confirmation": "Ви впевнені, що хочете відновити всі свої елементи з кошика? Цю дію не можна скасувати! Зверніть увагу, що жодні офлайн ресурси не можуть бути відновлені таким чином.",
"assets_restored_count": "Відновлено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_restored_successfully": "{count} елемент(и) успішно відновлено",
"assets_trashed": "{count} елемент(и) поміщено до кошика",
- "assets_trashed_count": "Поміщено в смітник {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
+ "assets_trashed_count": "Поміщено в кошик {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_trashed_from_server": "{count} елемент(и) поміщено до кошика на сервері Immich",
"assets_were_part_of_album_count": "{count, plural, one {Ресурс був} few {Ресурси були} other {Ресурси були}} вже частиною альбому",
- "assets_were_part_of_albums_count": "{count, plural, one {Актив був} other {Активи були}} вже є частиною альбомів",
+ "assets_were_part_of_albums_count": "{count, plural, one {Елемент вже був} other {Елементи вже були}} частиною альбомів",
"authorized_devices": "Авторизовані пристрої",
"automatic_endpoint_switching_subtitle": "Підключатися локально через зазначену Wi-Fi мережу, коли це можливо, і використовувати альтернативні з'єднання в інших випадках",
"automatic_endpoint_switching_title": "Автоматичне перемикання URL",
"autoplay_slideshow": "Автоматичне відтворення слайдшоу",
"back": "Назад",
"back_close_deselect": "Повернутися, закрити або скасувати вибір",
+ "background_backup_running_error": "Наразі виконується фонове резервне копіювання, неможливо розпочати резервне копіювання вручну",
"background_location_permission": "Дозвіл до місцезнаходження у фоні",
"background_location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має *завжди* мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі",
+ "background_options": "Параметри фону",
"backup": "Резервне копіювання",
"backup_album_selection_page_albums_device": "Альбоми на пристрої ({count})",
"backup_album_selection_page_albums_tap": "Торкніться, щоб включити, двічі, щоб виключити",
@@ -535,6 +549,7 @@
"backup_album_selection_page_select_albums": "Оберіть альбоми",
"backup_album_selection_page_selection_info": "Інформація про обране",
"backup_album_selection_page_total_assets": "Загальна кількість унікальних елементів",
+ "backup_albums_sync": "Синхронізація резервних копій альбомів",
"backup_all": "Усі",
"backup_background_service_backup_failed_message": "Не вдалося зробити резервну копію елементів. Повторюю…",
"backup_background_service_connection_failed_message": "Не вдалося зв'язатися із сервером. Повторюю…",
@@ -584,6 +599,7 @@
"backup_controller_page_turn_on": "Увімкнути резервне копіювання в активному режимі",
"backup_controller_page_uploading_file_info": "Завантажую інформацію про файл",
"backup_err_only_album": "Не можу видалити єдиний альбом",
+ "backup_error_sync_failed": "Помилка синхронізації. Не вдається обробити резервну копію.",
"backup_info_card_assets": "елементи",
"backup_manual_cancelled": "Скасовано",
"backup_manual_in_progress": "Завантаження вже відбувається. Спробуйте згодом",
@@ -594,8 +610,6 @@
"backup_setting_subtitle": "Управління налаштуваннями завантаження у фоновому та активному режимі",
"backup_settings_subtitle": "Керування налаштуваннями завантаження",
"backward": "Зворотній",
- "beta_sync": "Стан бета-синхронізації",
- "beta_sync_subtitle": "Налаштування нової системи синхронізації",
"biometric_auth_enabled": "Біометрична автентифікація увімкнена",
"biometric_locked_out": "Вам закрито доступ до біометричної автентифікації",
"biometric_no_options": "Біометричні параметри недоступні",
@@ -608,12 +622,12 @@
"build_image": "Версія збірки",
"bulk_delete_duplicates_confirmation": "Ви впевнені, що хочете масово видалити {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}}? Це дія залишить найбільший ресурс у кожній групі і остаточно видалить всі інші дублікати. Цю дію неможливо скасувати!",
"bulk_keep_duplicates_confirmation": "Ви впевнені, що хочете залишити {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}}? Це дозволить вирішити всі групи дублікатів без видалення чого-небудь.",
- "bulk_trash_duplicates_confirmation": "Ви впевнені, що хочете викинути в смітник {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}} масово? Це залишить найбільший ресурс у кожній групі і викине в смітник всі інші дублікати.",
+ "bulk_trash_duplicates_confirmation": "Ви впевнені, що хочете викинути в кошик {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}} масово? Це залишить найбільший ресурс у кожній групі і викине в кошик всі інші дублікати.",
"buy": "Придбайте Immich",
"cache_settings_clear_cache_button": "Очистити кеш",
"cache_settings_clear_cache_button_title": "Очищає кеш програми. Це суттєво знизить продуктивність програми, доки кеш не буде перебудовано.",
"cache_settings_duplicated_assets_clear_button": "ОЧИСТИТИ",
- "cache_settings_duplicated_assets_subtitle": "Фото та відео, які додаток ігнорує",
+ "cache_settings_duplicated_assets_subtitle": "Фото та відео, які ігноруються застосунком",
"cache_settings_duplicated_assets_title": "Дубльовані елементи ({count})",
"cache_settings_statistics_album": "Бібліотечні мініатюри",
"cache_settings_statistics_full": "Повнорзомірні зображення",
@@ -653,9 +667,11 @@
"change_pin_code": "Змінити PIN-код",
"change_your_password": "Змініть свій пароль",
"changed_visibility_successfully": "Видимість успішно змінено",
- "check_corrupt_asset_backup": "Перевірити на пошкоджені резервні копії активів",
+ "charging": "Зарядка",
+ "charging_requirement_mobile_backup": "Для фонового резервного копіювання пристрій повинен заряджатися",
+ "check_corrupt_asset_backup": "Перевірити на пошкоджені резервні копії ресурсів",
"check_corrupt_asset_backup_button": "Виконати перевірку",
- "check_corrupt_asset_backup_description": "Запустіть цю перевірку лише через Wi-Fi та після того, як всі активи будуть завантажені на сервер. Процес може зайняти кілька хвилин.",
+ "check_corrupt_asset_backup_description": "Запустити цю перевірку лише через Wi-Fi та після того, як всі ресурси будуть завантажені на сервер. Процес може зайняти кілька хвилин.",
"check_logs": "Перевірити журнали",
"choose_matching_people_to_merge": "Виберіть людей для об'єднання",
"city": "Місто",
@@ -688,7 +704,7 @@
"completed": "Завершено",
"confirm": "Підтвердіть",
"confirm_admin_password": "Підтвердити пароль адміністратора",
- "confirm_delete_face": "Ви впевнені, що хочете видалити обличчя {name} з активу?",
+ "confirm_delete_face": "Ви впевнені, що хочете видалити обличчя {name} з елементу?",
"confirm_delete_shared_link": "Ви впевнені, що хочете видалити це спільне посилання?",
"confirm_keep_this_delete_others": "Усі інші ресурси в стеку буде видалено, окрім цього ресурсу. Ви впевнені, що хочете продовжити?",
"confirm_new_pin_code": "Підтвердьте новий PIN-код",
@@ -729,7 +745,7 @@
"create_link_to_share_description": "Дозволити перегляд вибраних фотографій за посиланням будь-кому",
"create_new": "СТВОРИТИ НОВИЙ",
"create_new_person": "Створити нову особу",
- "create_new_person_hint": "Призначити обраним активам нову особу",
+ "create_new_person_hint": "Призначити обраним елементам нову особу",
"create_new_user": "Створити нового користувача",
"create_shared_album_page_share_add_assets": "ДОДАТИ ЕЛЕМЕНТИ",
"create_shared_album_page_share_select_photos": "Вибрати фото",
@@ -739,6 +755,7 @@
"create_user": "Створити користувача",
"created": "Створено",
"created_at": "Створено",
+ "creating_linked_albums": "Створення пов’язаних альбомів...",
"crop": "Кадрувати",
"curated_object_page_title": "Речі",
"current_device": "Поточний пристрій",
@@ -794,7 +811,7 @@
"delete_tag_confirmation_prompt": "Ви впевнені, що хочете видалити тег {tagName}?",
"delete_user": "Видалити користувача",
"deleted_shared_link": "Видалено загальне посилання",
- "deletes_missing_assets": "Видаляє активи, які відсутні на диску",
+ "deletes_missing_assets": "Видаляє ресурси, які відсутні на диску",
"description": "Опис",
"description_input_hint_text": "Додати опис...",
"description_input_submit_error": "Помилка оновлення опису, перевірте логи для подробиць",
@@ -874,8 +891,8 @@
"email": "Електронна пошта",
"email_notifications": "Сповіщення ел. поштою",
"empty_folder": "Ця папка порожня",
- "empty_trash": "Очистити смітник",
- "empty_trash_confirmation": "Ви впевнені, що хочете очистити смітник? Це остаточно видалить всі ресурси в смітнику з Immich.\nЦю дію не можна скасувати!",
+ "empty_trash": "Очистити кошик",
+ "empty_trash_confirmation": "Ви впевнені, що хочете очистити кошик? Це остаточно видалить всі ресурси в кошику з Immich.\nЦю дію не можна скасувати!",
"enable": "Увімкнути",
"enable_backup": "Увімкнути резервне копіювання",
"enable_biometric_auth_description": "Введіть свій PIN-код, щоб увімкнути біометричну автентифікацію",
@@ -887,8 +904,10 @@
"enter_your_pin_code_subtitle": "Введіть свій PIN-код, щоб отримати доступ до особистої папки",
"error": "Помилка",
"error_change_sort_album": "Не вдалося змінити порядок сортування альбому",
- "error_delete_face": "Помилка при видаленні обличчя з активу",
+ "error_delete_face": "Помилка при видаленні обличчя з елементу",
+ "error_getting_places": "Помилка отримання місць",
"error_loading_image": "Помилка завантаження зображення",
+ "error_loading_partners": "Помилка завантаження партнерів: {error}",
"error_saving_image": "Помилка: {error}",
"error_tag_face_bounding_box": "Помилка під час позначення обличчя – не вдалося отримати координати рамки",
"error_title": "Помилка: щось пішло не так",
@@ -964,7 +983,7 @@
"unable_to_download_files": "Неможливо завантажити файли",
"unable_to_edit_exclusion_pattern": "Не вдалося редагувати шаблон виключення",
"unable_to_edit_import_path": "Неможливо відредагувати шлях імпорту",
- "unable_to_empty_trash": "Неможливо очистити смітник",
+ "unable_to_empty_trash": "Неможливо очистити кошик",
"unable_to_enter_fullscreen": "Неможливо увійти в повноекранний режим",
"unable_to_exit_fullscreen": "Неможливо вийти з повноекранного режиму",
"unable_to_get_comments_number": "Не вдалося отримати кількість коментарів",
@@ -988,7 +1007,7 @@
"unable_to_reset_password": "Не вдається скинути пароль",
"unable_to_reset_pin_code": "Неможливо скинути PIN-код",
"unable_to_resolve_duplicate": "Не вдається вирішити дублікат",
- "unable_to_restore_assets": "Неможливо відновити активи",
+ "unable_to_restore_assets": "Неможливо відновити елементи",
"unable_to_restore_trash": "Не вдалося відновити вміст",
"unable_to_restore_user": "Не вдається відновити користувача",
"unable_to_save_album": "Не вдається зберегти альбом",
@@ -1002,7 +1021,7 @@
"unable_to_set_feature_photo": "Не вдалося встановити фотографію на обкладинку",
"unable_to_set_profile_picture": "Не вдається встановити зображення профілю",
"unable_to_submit_job": "Не вдалося відправити завдання",
- "unable_to_trash_asset": "Неможливо вилучити актив",
+ "unable_to_trash_asset": "Неможливо видалити елемент",
"unable_to_unlink_account": "Не вдається відв'язати обліковий запис",
"unable_to_unlink_motion_video": "Не вдається від'єднати рухоме відео",
"unable_to_update_album_cover": "Неможливо оновити обкладинку альбому",
@@ -1040,7 +1059,7 @@
"external": "Зовнішні",
"external_libraries": "Зовнішні бібліотеки",
"external_network": "Зовнішня мережа",
- "external_network_sheet_info": "Коли ви не підключені до переважної мережі Wi-Fi, додаток підключатиметься до сервера через першу з наведених нижче URL-адрес, яку він зможе досягти, починаючи зверху вниз",
+ "external_network_sheet_info": "Коли ви не підключені до обраної мережі Wi-Fi, застосунок підключатиметься до сервера через першу з наведених нижче URL-адрес, яку він зможе досягти, починаючи зверху вниз",
"face_unassigned": "Не призначено",
"failed": "Не вдалося",
"failed_to_authenticate": "Помилка автентифікації",
@@ -1053,7 +1072,8 @@
"favorites_page_no_favorites": "Немає улюблених елементів",
"feature_photo_updated": "Вибране фото оновлено",
"features": "Додаткові можливості",
- "features_setting_description": "Керування додатковими можливостями додатка",
+ "features_in_development": "Функції в розробці",
+ "features_setting_description": "Керування додатковими можливостями застосунку",
"file_name": "Ім'я файлу",
"file_name_or_extension": "Ім'я файлу або розширення",
"filename": "Ім'я файлу",
@@ -1073,12 +1093,15 @@
"gcast_enabled": "Google Cast'",
"gcast_enabled_description": "Ця функція завантажує зовнішні ресурси з Google для своєї роботи.",
"general": "Загальні",
+ "geolocation_instruction_location": "Натисніть на об'єкт із GPS-координатами, щоб використати його місцезнаходження, або виберіть місцезнаходження безпосередньо на карті",
"get_help": "Отримати допомогу",
"get_wifiname_error": "Не вдалося отримати назву Wi-Fi. Переконайтеся, що ви надали необхідні дозволи та підключені до Wi-Fi мережі",
"getting_started": "Початок",
"go_back": "Повернутися назад",
"go_to_folder": "Перейти до папки",
"go_to_search": "Перейти до пошуку",
+ "gps": "GPS",
+ "gps_missing": "Немає GPS",
"grant_permission": "Надати дозвіл",
"group_albums_by": "Групувати альбоми за...",
"group_country": "Групувати за країною",
@@ -1116,7 +1139,7 @@
"home_page_delete_remote_err_local": "Локальні елемент(и) вже в процесі видалення з сервера, пропущено",
"home_page_favorite_err_local": "Поки що не можна додати до улюблених локальні елементи, пропущено",
"home_page_favorite_err_partner": "Поки що не можна додати до улюблених елементи партнера, пропущено",
- "home_page_first_time_notice": "Якщо ви користуєтеся додатком вперше, будь ласка, оберіть альбом для резервного копіювання, щоб на шкалі часу з’явилися фото та відео",
+ "home_page_first_time_notice": "Якщо ви користуєтеся застосунком вперше, будь ласка, оберіть альбом для резервного копіювання, щоб на шкалі часу з’явилися фото та відео",
"home_page_locked_error_local": "Не вдається перемістити локальні файли до особистої папки, пропускається",
"home_page_locked_error_partner": "Не вдається перемістити партнерські файли до особистої папки, пропускається",
"home_page_share_err_local": "Неможливо поділитися локальними елементами через посилання, пропущено",
@@ -1151,7 +1174,7 @@
"in_archive": "В архіві",
"include_archived": "Відображати архів",
"include_shared_albums": "Включити спільні альбоми",
- "include_shared_partner_assets": "Включайте спільні партнерські активи",
+ "include_shared_partner_assets": "Включайте спільні партнерські ресурси",
"individual_share": "Індивідуальний доступ",
"individual_shares": "Окремі спільні доступи",
"info": "Інформація",
@@ -1214,8 +1237,9 @@
"local": "На пристрої",
"local_asset_cast_failed": "Неможливо транслювати ресурс, який не завантажено на сервер",
"local_assets": "Локальні фото та відео",
+ "local_media_summary": "Зведення місцевих ЗМІ",
"local_network": "Локальна мережа",
- "local_network_sheet_info": "Додаток підключатиметься до сервера через цей URL, коли використовується вказана Wi-Fi мережа",
+ "local_network_sheet_info": "Застосунок підключатиметься до сервера через цей URL, коли використовується вказана Wi-Fi мережа",
"location_permission": "Дозвіл до місцезнаходження",
"location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має завжди мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі",
"location_picker_choose_on_map": "Обрати на мапі",
@@ -1225,6 +1249,7 @@
"location_picker_longitude_hint": "Вкажіть довготу",
"lock": "Заблокувати",
"locked_folder": "Особиста папка",
+ "log_detail_title": "Деталі журналу",
"log_out": "Вийти",
"log_out_all_devices": "Вийти з усіх пристроїв",
"logged_in_as": "Вхід виконано як {user}",
@@ -1255,6 +1280,7 @@
"login_password_changed_success": "Пароль оновлено успішно",
"logout_all_device_confirmation": "Ви впевнені, що хочете вийти з усіх пристроїв?",
"logout_this_device_confirmation": "Ви впевнені, що хочете вийти з цього пристрою?",
+ "logs": "Журнали",
"longitude": "Довгота",
"look": "Дивитися",
"loop_videos": "Циклічні відео",
@@ -1262,6 +1288,7 @@
"main_branch_warning": "Ви використовуєте версію для розробників; настійно рекомендуємо використовувати релізну версію!",
"main_menu": "Головне меню",
"make": "Виробник",
+ "manage_geolocation": "Керувати місцезнаходженням",
"manage_shared_links": "Керування спільними посиланнями",
"manage_sharing_with_partners": "Керуйте спільним використанням з партнерами",
"manage_the_app_settings": "Керування налаштуваннями програми",
@@ -1296,6 +1323,7 @@
"mark_as_read": "Позначити як прочитане",
"marked_all_as_read": "Позначено всі як прочитані",
"matches": "Збіги",
+ "matching_assets": "Відповідні активи",
"media_type": "Тип медіа",
"memories": "Спогади",
"memories_all_caught_up": "Це все на сьогодні",
@@ -1325,9 +1353,9 @@
"move_to_lock_folder_action_prompt": "{count} додано до захищеної теки",
"move_to_locked_folder": "Перемістити до особистої папки",
"move_to_locked_folder_confirmation": "Ці фото та відео буде видалено зі всіх альбомів і їх можна буде переглядати лише в особистій папці",
- "moved_to_archive": "Переміщено {count, plural, one {# актив} other {# активів}} в архів",
- "moved_to_library": "Переміщено {count, plural, one {# актив} other {# активів}} в бібліотеку",
- "moved_to_trash": "Перенесено до смітника",
+ "moved_to_archive": "Переміщено {count, plural, one {# елемент} other {# елементів}} в архів",
+ "moved_to_library": "Переміщено {count, plural, one {# елемент} other {# елементів}} в бібліотеку",
+ "moved_to_trash": "Перенесено до кошика",
"multiselect_grid_edit_date_time_err_read_only": "Неможливо редагувати дату елементів лише для читання, пропущено",
"multiselect_grid_edit_gps_err_read_only": "Неможливо редагувати місцезнаходження елементів лише для читання, пропущено",
"mute_memories": "Приглушити спогади",
@@ -1336,6 +1364,7 @@
"name_or_nickname": "Ім'я або псевдонім",
"network_requirement_photos_upload": "Використовувати стільникові дані для резервного копіювання фото",
"network_requirement_videos_upload": "Використовувати стільникові дані для резервного копіювання відео",
+ "network_requirements": "Вимоги до мережі",
"network_requirements_updated": "Вимоги до мережі змінилися, черга резервного копіювання очищена",
"networking_settings": "Мережеві налаштування",
"networking_subtitle": "Керування налаштуваннями кінцевої точки сервера",
@@ -1346,6 +1375,7 @@
"new_person": "Нова людина",
"new_pin_code": "Новий PIN-код",
"new_pin_code_subtitle": "Ви вперше отримуєте доступ до особистої папки. Створіть PIN-код для безпечного доступу до цієї сторінки",
+ "new_timeline": "Нова хронологія",
"new_user_created": "Створено нового користувача",
"new_version_available": "ДОСТУПНА НОВА ВЕРСІЯ",
"newest_first": "Спочатку нові",
@@ -1359,20 +1389,25 @@
"no_assets_message": "НАТИСНІТЬ, ЩОБ ЗАВАНТАЖИТИ ВАШЕ ПЕРШЕ ФОТО",
"no_assets_to_show": "Елементи відсутні",
"no_cast_devices_found": "Пристрої для трансляції не знайдено",
+ "no_checksum_local": "Контрольна сума недоступна – неможливо отримати локальні ресурси",
+ "no_checksum_remote": "Контрольна сума недоступна – неможливо отримати віддалений ресурс",
"no_duplicates_found": "Дублікатів не виявлено.",
"no_exif_info_available": "Відсутня інформація про exif",
"no_explore_results_message": "Завантажуйте більше фотографій, щоб насолоджуватися вашою колекцією.",
"no_favorites_message": "Додавайте улюблені файли, щоб швидко знаходити ваші найкращі зображення та відео",
"no_libraries_message": "Створіть зовнішню бібліотеку для перегляду фотографій і відео",
+ "no_local_assets_found": "З цією контрольною сумою не знайдено локальних ресурсів",
"no_locked_photos_message": "Фото та відео в особистій папці приховані і не відображаються під час перегляду чи пошуку у вашій бібліотеці.",
"no_name": "Без імені",
"no_notifications": "Немає сповіщень",
"no_people_found": "Людей, що відповідають запиту, не знайдено",
"no_places": "Місць немає",
+ "no_remote_assets_found": "З цією контрольною сумою не знайдено віддалених ресурсів",
"no_results": "Немає результатів",
"no_results_description": "Спробуйте використовувати синонім або більш загальне ключове слово",
"no_shared_albums_message": "Створіть альбом, щоб ділитися фотографіями та відео з людьми у вашій мережі",
"no_uploads_in_progress": "Немає активних завантажень",
+ "not_available": "Немає даних",
"not_in_any_album": "У жодному альбомі",
"not_selected": "Не вибрано",
"note_apply_storage_label_to_previously_uploaded assets": "Примітка: Щоб застосувати мітку сховища до раніше завантажених ресурсів, виконайте команду",
@@ -1407,6 +1442,8 @@
"open_the_search_filters": "Відкрийте фільтри пошуку",
"options": "Налаштування",
"or": "або",
+ "organize_into_albums": "Упорядкувати в альбоми",
+ "organize_into_albums_description": "Помістити наявні фотографії в альбоми, використовуючи поточні налаштування синхронізації",
"organize_your_library": "Організуйте свою бібліотеку",
"original": "оригінал",
"other": "Інше",
@@ -1464,7 +1501,7 @@
"permission_onboarding_permission_denied": "Доступ заборонено. Для використання Immich надайте дозволи до \"Фото та відео\" в налаштуваннях.",
"permission_onboarding_permission_granted": "Доступ надано! Все готово.",
"permission_onboarding_permission_limited": "Доступ обмежено. Щоби дозволити Immich створювати резервні копії та керувати всією галереєю, надайте дозволи на фото й відео в налаштуваннях.",
- "permission_onboarding_request": "Додатку Immich потрібен дозвіл для перегляду ваших фото та відео.",
+ "permission_onboarding_request": "Застосунку Immich потрібен дозвіл для перегляду ваших фото та відео.",
"person": "Людина",
"person_age_months": "{months, plural, one {# місяць} other {# місяці}}",
"person_age_year_months": "1 year , {months, plural, one {# місяць} other {# місяці}}",
@@ -1490,8 +1527,9 @@
"play_or_pause_video": "Відтворення або призупинення відео",
"please_auth_to_access": "Будь ласка, пройдіть автентифікацію",
"port": "Порт",
- "preferences_settings_subtitle": "Керування налаштуваннями додатку",
+ "preferences_settings_subtitle": "Керування налаштуваннями застосунку",
"preferences_settings_title": "Параметри",
+ "preparing": "Підготовка",
"preset": "Передвстановлення",
"preview": "Прев'ю",
"previous": "Попереднє",
@@ -1504,10 +1542,11 @@
"privacy": "Конфіденційність",
"profile": "Профіль",
"profile_drawer_app_logs": "Журнал",
- "profile_drawer_client_out_of_date_major": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мажорної версії.",
- "profile_drawer_client_out_of_date_minor": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мінорної версії.",
+ "profile_drawer_client_out_of_date_major": "Мобільний застосунок застарів. Будь ласка, оновіть до останньої мажорної версії.",
+ "profile_drawer_client_out_of_date_minor": "Мобільний застосунок застарів. Будь ласка, оновіть до останньої мінорної версії.",
"profile_drawer_client_server_up_to_date": "Клієнт та сервер — актуальні",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "Режим лише для читання ввімкнено. Щоб вийти, довго натисніть значок аватара користувача.",
"profile_drawer_server_out_of_date_major": "Сервер застарів. Будь ласка, оновіть до останньої мажорної версії.",
"profile_drawer_server_out_of_date_minor": "Сервер застарів. Будь ласка, оновіть до останньої мінорної версії.",
"profile_image_of_user": "Зображення профілю {user}",
@@ -1546,6 +1585,7 @@
"purchase_server_description_2": "Статус підтримки",
"purchase_server_title": "Сервер",
"purchase_settings_server_activated": "Ключ продукту сервера керується адміністратором",
+ "query_asset_id": "Ідентифікатор ресурсу запиту",
"queue_status": "У черзі {count} з {total}",
"rating": "Зоряний рейтинг",
"rating_clear": "Очистити рейтинг",
@@ -1553,6 +1593,9 @@
"rating_description": "Показувати рейтинг EXIF на інформаційній панелі",
"reaction_options": "Опції реакції",
"read_changelog": "Прочитати зміни в оновленні",
+ "readonly_mode_disabled": "Режим лише для читання вимкнено",
+ "readonly_mode_enabled": "Режим лише для читання ввімкнено",
+ "ready_for_upload": "Готово до завантаження",
"reassign": "Перепризначити",
"reassigned_assets_to_existing_person": "Перепризначено {count, plural, one {# ресурс} few {# ресурси} many {# ресурсів} other {# ресурсів}} {name, select, null {існуючій особі} other {{name}}}",
"reassigned_assets_to_new_person": "Перепризначено {count, plural, one {# ресурс} other {# ресурси}} новій особі",
@@ -1577,6 +1620,7 @@
"regenerating_thumbnails": "Відновлення мініатюр",
"remote": "На сервері",
"remote_assets": "Віддалені фото та відео",
+ "remote_media_summary": "Зведення віддалених медіафайлів",
"remove": "Вилучити",
"remove_assets_album_confirmation": "Ви впевнені, що хочете видалити {count, plural, one {# ресурс} few {# ресурси} many {# ресурсів} other {# ресурсів}} з альбому?",
"remove_assets_shared_link_confirmation": "Ви впевнені, що хочете видалити {count, plural, one {# ресурс} few {# ресурси} many {# ресурсів} other {# ресурсів}} з цього спільного посилання?",
@@ -1601,7 +1645,7 @@
"removed_from_favorites_count": "{count, plural, other {Видалено #}} з обраних",
"removed_memory": "Видалена пам'ять",
"removed_photo_from_memory": "Фото видалене з пам'яті",
- "removed_tagged_assets": "Видалено тег із {count, plural, one {# активу} other {# активів}}",
+ "removed_tagged_assets": "Видалено тег із {count, plural, one {# елементу} other {# елементів}}",
"rename": "Перейменувати",
"repair": "Ремонт",
"repair_no_results_message": "Невідстежувані та відсутні файли будуть відображені тут",
@@ -1625,10 +1669,11 @@
"resolved_all_duplicates": "Усі дублікати усунуто",
"restore": "Відновити",
"restore_all": "Відновити все",
- "restore_trash_action_prompt": "{count} відновлено зі смітника",
+ "restore_trash_action_prompt": "{count} відновлено з кошика",
"restore_user": "Відновити користувача",
- "restored_asset": "Відновлений актив",
+ "restored_asset": "Відновлений ресурс",
"resume": "Продовжити",
+ "resume_paused_jobs": "Відновити {count, plural, one {# призупинене завдання} other {# призупинені завдання}}",
"retry_upload": "Повторити завантаження",
"review_duplicates": "Переглянути дублікати",
"review_large_files": "Перегляд великих файлів",
@@ -1722,10 +1767,11 @@
"select_user_for_sharing_page_err_album": "Не вдалося створити альбом",
"selected": "Обрано",
"selected_count": "{count, plural, one {# обраний} other {# обраних}}",
+ "selected_gps_coordinates": "Вибрані GPS-координати",
"send_message": "Надіслати повідомлення",
"send_welcome_email": "Надішліть вітальний лист",
"server_endpoint": "Кінцева точка сервера",
- "server_info_box_app_version": "Версія додатка",
+ "server_info_box_app_version": "Версія застосунку",
"server_info_box_server_url": "URL сервера",
"server_offline": "Сервер офлайн",
"server_online": "Сервер онлайн",
@@ -1747,7 +1793,7 @@
"setting_image_viewer_preview_title": "Завантажувати зображення попереднього перегляду",
"setting_image_viewer_title": "Зображення",
"setting_languages_apply": "Застосувати",
- "setting_languages_subtitle": "Змінити мову додатку",
+ "setting_languages_subtitle": "Змінити мову застосунку",
"setting_notifications_notify_failures_grace_period": "Повідомити про помилки фонового резервного копіювання: {duration}",
"setting_notifications_notify_hours": "{count} годин",
"setting_notifications_notify_immediately": "негайно",
@@ -1850,6 +1896,7 @@
"show_slideshow_transition": "Показати перехід слайд-шоу",
"show_supporter_badge": "Значок підтримки",
"show_supporter_badge_description": "Показати значок підтримки",
+ "show_text_search_menu": "Показати меню текстового пошуку",
"shuffle": "Перемішати",
"sidebar": "Бічна панель",
"sidebar_display_description": "Відобразити посилання на перегляд у бічній панелі",
@@ -1880,6 +1927,7 @@
"stacktrace": "Стек викликів",
"start": "Старт",
"start_date": "Дата початку",
+ "start_date_before_end_date": "Дата початку має бути раніше дати завершення",
"state": "Регіон",
"status": "Стан",
"stop_casting": "Зупинити трансляцію",
@@ -1904,6 +1952,8 @@
"sync_albums_manual_subtitle": "Синхронізувати всі завантажені фото та відео у вибрані альбоми для резервного копіювання",
"sync_local": "Синхронізувати на пристрої",
"sync_remote": "Синхронізувати з сервером",
+ "sync_status": "Стан синхронізації",
+ "sync_status_subtitle": "Перегляд та керування системою синхронізації",
"sync_upload_album_setting_subtitle": "Створюйте та завантажуйте свої фотографії та відео до вибраних альбомів на сервер Immich",
"tag": "Тег",
"tag_assets": "Додати теги",
@@ -1912,7 +1962,7 @@
"tag_not_found_question": "Не вдається знайти тег? Створити новий тег.",
"tag_people": "Тег людей",
"tag_updated": "Оновлено тег: {tag}",
- "tagged_assets": "Позначено тегом {count, plural, one {# актив} other {# активи}}",
+ "tagged_assets": "Позначено тегом {count, plural, one {# ресурс} other {# ресурси}}",
"tags": "Теги",
"tap_to_run_job": "Торкніться, щоб запустити завдання",
"template": "Шаблон",
@@ -1929,7 +1979,7 @@
"theme_setting_primary_color_title": "Основний колір",
"theme_setting_system_primary_color_title": "Використовувати колір системи",
"theme_setting_system_theme_switch": "Автоматично (як у системі)",
- "theme_setting_theme_subtitle": "Налаштування теми додатка",
+ "theme_setting_theme_subtitle": "Налаштування теми застосунку",
"theme_setting_three_stage_loading_subtitle": "Триетапне завантаження може підвищити продуктивність завантаження, але спричинить значно більше навантаження на мережу",
"theme_setting_three_stage_loading_title": "Увімкнути триетапне завантаження",
"they_will_be_merged_together": "Вони будуть об'єднані разом",
@@ -1941,26 +1991,29 @@
"to_change_password": "Змінити пароль",
"to_favorite": "Обране",
"to_login": "Вхід",
+ "to_multi_select": "для багаторазового вибору",
"to_parent": "Повернутись назад",
- "to_trash": "Смітник",
+ "to_select": "вибрати",
+ "to_trash": "Кошик",
"toggle_settings": "Перемикання налаштувань",
"total": "Усього",
"total_usage": "Загальне використання",
- "trash": "Смітник",
- "trash_action_prompt": "{count} переміщено до смітника",
+ "trash": "Кошик",
+ "trash_action_prompt": "{count} переміщено до кошика",
"trash_all": "Видалити все",
"trash_count": "Видалити {count, number}",
- "trash_delete_asset": "Смітник/Видалити ресурс",
- "trash_emptied": "Кошик очищений",
+ "trash_delete_asset": "У кошик/Видалити ресурс",
+ "trash_emptied": "Кошик очищено",
"trash_no_results_message": "Тут з'являтимуться видалені фото та відео.",
- "trash_page_delete_all": "Видалити усі",
+ "trash_page_delete_all": "Видалити усе",
"trash_page_empty_trash_dialog_content": "Ви хочете очистити кошик? Ці елементи будуть остаточно видалені з Immich",
"trash_page_info": "Поміщені у кошик елементи буде остаточно видалено через {days} днів",
- "trash_page_no_assets": "Віддалені елементи відсутні",
- "trash_page_restore_all": "Відновити усі",
- "trash_page_select_assets_btn": "Вибрані елементи",
+ "trash_page_no_assets": "Видалені елементи відсутні",
+ "trash_page_restore_all": "Відновити усе",
+ "trash_page_select_assets_btn": "Вибрати елементи",
"trash_page_title": "Кошик ({count})",
"trashed_items_will_be_permanently_deleted_after": "Видалені елементи будуть остаточно видалені через {days, plural, one {# день} few {# дні} many {# днів} other {# днів}}.",
+ "troubleshoot": "Виправлення неполадок",
"type": "Тип",
"unable_to_change_pin_code": "Неможливо змінити PIN-код",
"unable_to_setup_pin_code": "Неможливо налаштувати PIN-код",
@@ -1991,6 +2044,7 @@
"unstacked_assets_count": "Розгорнути {count, plural, one {# ресурс} few {# ресурси} many {# ресурсів} other {# ресурсів}}",
"untagged": "Без тегів",
"up_next": "Наступне",
+ "update_location_action_prompt": "Оновити розташування вибраних об’єктів ({count}) за допомогою:",
"updated_at": "Оновлено",
"updated_password": "Пароль оновлено",
"upload": "Завантажити",
@@ -2057,6 +2111,7 @@
"view_next_asset": "Переглянути наступний ресурс",
"view_previous_asset": "Переглянути попередній ресурс",
"view_qr_code": "Переглянути QR-код",
+ "view_similar_photos": "Переглянути схожі фотографії",
"view_stack": "Перегляд стеку",
"view_user": "Переглянути користувача",
"viewer_remove_from_stack": "Видалити зі стеку",
@@ -2075,5 +2130,6 @@
"yes": "Так",
"you_dont_have_any_shared_links": "У вас немає спільних посилань",
"your_wifi_name": "Назва вашої Wi-Fi мережі",
- "zoom_image": "Збільшити зображення"
+ "zoom_image": "Збільшити зображення",
+ "zoom_to_bounds": "Збільшити масштаб до меж"
}
diff --git a/i18n/vi.json b/i18n/vi.json
index 49a73f022c..b9ee8cfcc9 100644
--- a/i18n/vi.json
+++ b/i18n/vi.json
@@ -360,8 +360,6 @@
"admin_password": "Mật khẩu Quản trị viên",
"administration": "Quản trị",
"advanced": "Nâng cao",
- "advanced_settings_beta_timeline_subtitle": "Trải nghiệm giao diện app mới",
- "advanced_settings_beta_timeline_title": "Timeline Beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Dùng tùy chọn này để lọc phương tiện khi đồng bộ theo tiêu chí khác. Chỉ thử khi ứng dụng không nhận diện được tất cả các album.",
"advanced_settings_enable_alternate_media_filter_title": "[THỬ NGHIỆM] Dùng bộ lọc đồng bộ album thay thế",
"advanced_settings_log_level_title": "Phân loại nhật ký: {level}",
@@ -558,8 +556,6 @@
"backup_setting_subtitle": "Quản lý cài đặt tải lên ở chế độ nền và khi đang mở",
"backup_settings_subtitle": "Cài đặt việc tải lên",
"backward": "Lùi lại",
- "beta_sync": "Trạng thái đồng bộ Beta",
- "beta_sync_subtitle": "Hệ thống đồng mới",
"biometric_auth_enabled": "Đã bật xác thực sinh trắc học",
"biometric_locked_out": "Bạn đã bị khóa xác thực bằng sinh trắc học",
"biometric_no_options": "Không có tùy chọn bằng sinh trắc học",
diff --git a/i18n/zh_Hant.json b/i18n/zh_Hant.json
index 338021de91..fe9108c116 100644
--- a/i18n/zh_Hant.json
+++ b/i18n/zh_Hant.json
@@ -28,6 +28,7 @@
"add_to_album": "加入到相簿",
"add_to_album_bottom_sheet_added": "新增到 {album}",
"add_to_album_bottom_sheet_already_exists": "已在 {album} 中",
+ "add_to_album_bottom_sheet_some_local_assets": "無法將某些本地資產添加到相册",
"add_to_album_toggle": "選擇相簿{album}",
"add_to_albums": "加入相簿",
"add_to_albums_count": "將({count})個項目加入相簿",
@@ -123,6 +124,13 @@
"logging_enable_description": "啟用日誌記錄",
"logging_level_description": "啟用時的日誌層級。",
"logging_settings": "日誌",
+ "machine_learning_availability_checks": "可用性檢查",
+ "machine_learning_availability_checks_description": "自動檢測並優先選擇可用的機器學習服務器",
+ "machine_learning_availability_checks_enabled": "啟用可用性檢查",
+ "machine_learning_availability_checks_interval": "檢查間隔",
+ "machine_learning_availability_checks_interval_description": "可用性檢查之間的間隔(毫秒)",
+ "machine_learning_availability_checks_timeout": "請求超時",
+ "machine_learning_availability_checks_timeout_description": "可用性檢查超時(毫秒)",
"machine_learning_clip_model": "CLIP 模型",
"machine_learning_clip_model_description": "這裡有份 CLIP 模型名單。注意:更換模型後須對所有圖片重新執行「智慧搜尋」任務。",
"machine_learning_duplicate_detection": "重複項目偵測",
@@ -132,7 +140,7 @@
"machine_learning_enabled": "啟用機器學習",
"machine_learning_enabled_description": "若停用,則無視下方的設定,所有機器學習的功能都將停用。",
"machine_learning_facial_recognition": "人臉辨識",
- "machine_learning_facial_recognition_description": "偵測、辨識並對圖片中的臉孔分組",
+ "machine_learning_facial_recognition_description": "偵測、辨識並對圖片中的臉孔分類",
"machine_learning_facial_recognition_model": "人臉辨識模型",
"machine_learning_facial_recognition_model_description": "模型順序由大至小排列。大的模型較慢且使用較多記憶體,但成效較佳。更換模型後需對所有影像重新執行「人臉辨識」。",
"machine_learning_facial_recognition_setting": "啟用人臉辨識",
@@ -387,8 +395,6 @@
"admin_password": "管理員密碼",
"administration": "管理",
"advanced": "進階",
- "advanced_settings_beta_timeline_subtitle": "試用全新的應用程式體驗",
- "advanced_settings_beta_timeline_title": "測試版時間軸",
"advanced_settings_enable_alternate_media_filter_subtitle": "使用此選項可在同步時依其他條件篩選媒體。僅在應用程式無法偵測到所有相簿時再嘗試使用。",
"advanced_settings_enable_alternate_media_filter_title": "[實驗性] 使用替代的裝置相簿同步篩選器",
"advanced_settings_log_level_title": "日誌等級:{level}",
@@ -396,6 +402,8 @@
"advanced_settings_prefer_remote_title": "偏好遠端影像",
"advanced_settings_proxy_headers_subtitle": "定義 Immich 在每次網路請求時應該發送的代理標頭",
"advanced_settings_proxy_headers_title": "代理標頭",
+ "advanced_settings_readonly_mode_subtitle": "開啟唯讀模式後,照片只能瀏覽,像是多選影像、分享、投放、刪除等功能都會關閉。可在主畫面透過使用者頭像來開啟/關閉唯讀模式",
+ "advanced_settings_readonly_mode_title": "唯讀模式",
"advanced_settings_self_signed_ssl_subtitle": "略過伺服器端點的 SSL 憑證驗證。自簽憑證時必須啟用此設定。",
"advanced_settings_self_signed_ssl_title": "允許自簽的 SSL 憑證",
"advanced_settings_sync_remote_deletions_subtitle": "當在網頁端執行刪除或還原操作時,自動在此裝置上刪除或還原該媒體",
@@ -423,6 +431,7 @@
"album_remove_user_confirmation": "確定要移除 {user} 嗎?",
"album_search_not_found": "找不到符合搜尋條件的相簿",
"album_share_no_users": "看來您與所有使用者共享了這本相簿,或沒有其他使用者可供分享。",
+ "album_summary": "相册摘要",
"album_updated": "更新相簿時",
"album_updated_setting_description": "當共享相簿有新項目時用電子郵件通知我",
"album_user_left": "離開 {album}",
@@ -461,6 +470,7 @@
"app_bar_signout_dialog_title": "登出",
"app_settings": "應用程式設定",
"appears_in": "出現於",
+ "apply_count": "應用({count, number})",
"archive": "封存",
"archive_action_prompt": "已將 ({count}) 個加入進封存",
"archive_or_unarchive_photo": "封存或取消封存照片",
@@ -493,6 +503,8 @@
"asset_restored_successfully": "媒體復原成功",
"asset_skipped": "已跳過",
"asset_skipped_in_trash": "已在垃圾桶",
+ "asset_trashed": "資產被丟棄",
+ "asset_troubleshoot": "資產故障排除",
"asset_uploaded": "已上傳",
"asset_uploading": "上傳中…",
"asset_viewer_settings_subtitle": "管理您的媒體庫檢視器設定",
@@ -500,7 +512,7 @@
"assets": "媒體",
"assets_added_count": "已新增 {count, plural, one {# 個媒體} other {# 個媒體}}",
"assets_added_to_album_count": "已將 {count, plural, one {# 個媒體} other {# 個媒體}}加入相簿",
- "assets_added_to_albums_count": "已新增 {assetTotal, plural, one {# 個} other {# 個}}項目到{albumTotal}個相簿中",
+ "assets_added_to_albums_count": "已新增 {assetTotal, plural, one {# 個} other {# 個}}項目到 {albumTotal, plural, one {# 個} other {# 個}}相簿中",
"assets_cannot_be_added_to_album_count": "無法將 {count, plural, one {媒體} other {媒體}} 加入至相簿",
"assets_cannot_be_added_to_albums": "{count, plural, one {個} other {個}}項目無法被加入相簿",
"assets_count": "{count, plural, one {# 個媒體} other {# 個媒體}}",
@@ -526,8 +538,10 @@
"autoplay_slideshow": "自動播放幻燈片",
"back": "返回",
"back_close_deselect": "返回、關閉及取消選取",
+ "background_backup_running_error": "後臺備份當前正在運行,無法啟動手動備份",
"background_location_permission": "背景存取位置權限",
"background_location_permission_content": "為了在背景執行時切換網路,Immich 必須始終具有精確位置存取權限,才能讀取 Wi-Fi 網路名稱",
+ "background_options": "背景選項",
"backup": "備份",
"backup_album_selection_page_albums_device": "裝置上的相簿({count})",
"backup_album_selection_page_albums_tap": "點一下以選取,點兩下以排除",
@@ -535,6 +549,7 @@
"backup_album_selection_page_select_albums": "選取相簿",
"backup_album_selection_page_selection_info": "選取資訊",
"backup_album_selection_page_total_assets": "總不重複媒體數",
+ "backup_albums_sync": "備份相册同步",
"backup_all": "全部",
"backup_background_service_backup_failed_message": "備份媒體失敗。正在重試…",
"backup_background_service_connection_failed_message": "連線伺服器失敗。正在重試…",
@@ -577,7 +592,7 @@
"backup_controller_page_start_backup": "開始備份",
"backup_controller_page_status_off": "前台自動備份已關閉",
"backup_controller_page_status_on": "前台自動備份已開啟",
- "backup_controller_page_storage_format": "{used} 中的 {total} 已使用",
+ "backup_controller_page_storage_format": "{used} / {total} 已使用",
"backup_controller_page_to_backup": "要備份的相簿",
"backup_controller_page_total_sub": "已選取相簿中的所有不重複的照片與影片",
"backup_controller_page_turn_off": "關閉前台備份",
@@ -594,8 +609,6 @@
"backup_setting_subtitle": "管理背景與前台上傳設定",
"backup_settings_subtitle": "管理上傳設定",
"backward": "由舊至新",
- "beta_sync": "測試版同步狀態",
- "beta_sync_subtitle": "管理新的同步系統",
"biometric_auth_enabled": "生物辨識驗證已啟用",
"biometric_locked_out": "您已被鎖定無法使用生物辨識驗證",
"biometric_no_options": "沒有生物辨識選項可用",
@@ -653,6 +666,8 @@
"change_pin_code": "變更 PIN 碼",
"change_your_password": "變更您的密碼",
"changed_visibility_successfully": "已成功變更可見性",
+ "charging": "充電",
+ "charging_requirement_mobile_backup": "後臺備份要求設備正在充電",
"check_corrupt_asset_backup": "檢查損毀的備份項目",
"check_corrupt_asset_backup_button": "執行檢查",
"check_corrupt_asset_backup_description": "僅在連接 Wi-Fi 且所有媒體已完成備份後執行此檢查。此程序可能需要數分鐘。",
@@ -739,6 +754,7 @@
"create_user": "建立使用者",
"created": "建立於",
"created_at": "建立於",
+ "creating_linked_albums": "創建連結相册 ...",
"crop": "裁剪",
"curated_object_page_title": "事物",
"current_device": "目前裝置",
@@ -888,7 +904,9 @@
"error": "錯誤",
"error_change_sort_album": "變更相簿排序失敗",
"error_delete_face": "從媒體刪除臉孔時失敗",
+ "error_getting_places": "獲取位置時出錯",
"error_loading_image": "圖片載入錯誤",
+ "error_loading_partners": "加載合作夥伴時出錯:{error}",
"error_saving_image": "錯誤:{error}",
"error_tag_face_bounding_box": "標記臉部錯誤 - 無法取得邊界框坐標",
"error_title": "錯誤 - 發生錯誤",
@@ -1047,117 +1065,121 @@
"failed_to_load_assets": "無法載入媒體",
"failed_to_load_folder": "無法載入資料夾",
"favorite": "收藏",
- "favorite_action_prompt": "已新增 {count} 個到我的最愛",
+ "favorite_action_prompt": "已新增 {count} 個到收藏",
"favorite_or_unfavorite_photo": "收藏或取消收藏照片",
"favorites": "收藏",
"favorites_page_no_favorites": "未找到收藏項目",
"feature_photo_updated": "特色照片已更新",
"features": "功能",
+ "features_in_development": "發展中的特點",
"features_setting_description": "管理應用程式功能",
- "file_name": "檔名",
- "file_name_or_extension": "檔名或副檔名",
+ "file_name": "檔案名稱",
+ "file_name_or_extension": "檔案名稱或副檔名",
"filename": "檔案名稱",
"filetype": "檔案類型",
"filter": "濾鏡",
"filter_people": "篩選人物",
"filter_places": "篩選地點",
- "find_them_fast": "搜尋名稱,快速找人",
+ "find_them_fast": "透過搜尋名稱快速找到他們",
"first": "第一個",
"fix_incorrect_match": "修復不相符的",
"folder": "資料夾",
- "folder_not_found": "未找到資料夾",
+ "folder_not_found": "找不到資料夾",
"folders": "資料夾",
- "folders_feature_description": "以資料夾瀏覽檔案系統中的照片和影片",
- "forgot_pin_code_question": "忘記 PIN 碼?",
+ "folders_feature_description": "透過資料夾檢視瀏覽檔案系統中的相片與影片",
+ "forgot_pin_code_question": "忘記您的 PIN 碼?",
"forward": "由新至舊",
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "此功能需要從 Google 載入外部資源才能正常運作。",
"general": "一般",
+ "geolocation_instruction_location": "點擊具有 GPS 座標的項目以使用其位置,或直接從地圖中選擇地點",
"get_help": "線上求助",
"get_wifiname_error": "無法取得 Wi-Fi 名稱。請確認您已授予必要的權限,並已連接至 Wi-Fi 網路",
"getting_started": "開始使用",
"go_back": "返回",
- "go_to_folder": "轉至資料夾",
+ "go_to_folder": "前往資料夾",
"go_to_search": "前往搜尋",
+ "gps": "GPS",
+ "gps_missing": "無GPS",
"grant_permission": "授予權限",
"group_albums_by": "分類群組的方式...",
- "group_country": "按國家分組",
- "group_no": "無分組",
- "group_owner": "按擁有者分組",
+ "group_country": "按照國家分類",
+ "group_no": "沒有分類",
+ "group_owner": "按擁有者分類",
"group_places_by": "分類地點的方式...",
- "group_year": "按年份分組",
- "haptic_feedback_switch": "啓用振動反饋",
- "haptic_feedback_title": "振動反饋",
- "has_quota": "配額",
- "hash_asset": "雜湊項目",
- "hashed_assets": "已雜湊項目",
- "hashing": "計算雜湊值",
+ "group_year": "按年份分類",
+ "haptic_feedback_switch": "啟用震動回饋",
+ "haptic_feedback_title": "震動回饋",
+ "has_quota": "已設定配額",
+ "hash_asset": "雜湊媒體",
+ "hashed_assets": "已雜湊的媒體",
+ "hashing": "正在計算雜湊值",
"header_settings_add_header_tip": "新增標頭",
- "header_settings_field_validator_msg": "設定不可為空",
+ "header_settings_field_validator_msg": "值不可為空",
"header_settings_header_name_input": "標頭名稱",
"header_settings_header_value_input": "標頭值",
- "headers_settings_tile_subtitle": "定義代理標頭,套用於每次網絡請求",
+ "headers_settings_tile_subtitle": "定義應用程式在每次網路請求時應附帶的代理標頭",
"headers_settings_tile_title": "自定義代理標頭",
"hi_user": "嗨!{name}({email})",
"hide_all_people": "隱藏所有人物",
- "hide_gallery": "隱藏畫廊",
+ "hide_gallery": "隱藏媒體庫",
"hide_named_person": "隱藏 {name}",
"hide_password": "隱藏密碼",
"hide_person": "隱藏人物",
- "hide_unnamed_people": "隱藏未命名人物",
- "home_page_add_to_album_conflicts": "已在相簿 {album} 中新增 {added} 個項目。其中 {failed} 個項目已經在相簿中。",
- "home_page_add_to_album_err_local": "暫不能將本地項目新增到相簿中,略過",
- "home_page_add_to_album_success": "已在相簿 {album} 中新增 {added} 個項目。",
- "home_page_album_err_partner": "暫無法將親朋好友的項目新增到相簿,略過",
- "home_page_archive_err_local": "暫無法封存本地項目,略過",
- "home_page_archive_err_partner": "無法封存親朋好友的項目,略過",
- "home_page_building_timeline": "正在生成時間線",
- "home_page_delete_err_partner": "無法刪除親朋好友的項目,略過",
- "home_page_delete_remote_err_local": "遙距項目刪除模式,略過本地項目",
+ "hide_unnamed_people": "隱藏未命名的人物",
+ "home_page_add_to_album_conflicts": "已將 {added} 個媒體新增到相簿 {album}。{failed} 個媒體已在該相簿中。",
+ "home_page_add_to_album_err_local": "暫時不能將本地媒體新增到相簿,已略過",
+ "home_page_add_to_album_success": "已在 {album} 相簿中新增 {added} 個媒體。",
+ "home_page_album_err_partner": "暫時不能無法將親朋好友的媒體新增到相簿,已略過",
+ "home_page_archive_err_local": "暫時不能封存本地媒體,已略過",
+ "home_page_archive_err_partner": "無法封存親朋好友的媒體,已略過",
+ "home_page_building_timeline": "正在建立時間軸",
+ "home_page_delete_err_partner": "無法刪除親朋好友的媒體,已略過",
+ "home_page_delete_remote_err_local": "刪除遠端媒體的選取中包含本機媒體,已略過",
"home_page_favorite_err_local": "暫不能收藏本地項目,略過",
"home_page_favorite_err_partner": "暫無法收藏親朋好友的項目,略過",
"home_page_first_time_notice": "如果這是您第一次使用本程式,請確保選擇一個要備份的相簿,以將照片與影片加入時間軸",
"home_page_locked_error_local": "無法移動本機檔案至鎖定的資料夾,已略過",
- "home_page_locked_error_partner": "無法移動他人分享的檔案至鎖定的資料夾,已略過",
- "home_page_share_err_local": "暫無法通過鏈接共享本地項目,略過",
- "home_page_upload_err_limit": "一次最多只能上傳 30 個項目,略過",
+ "home_page_locked_error_partner": "無法移動親朋好友分享的媒體至鎖定的資料夾,已略過",
+ "home_page_share_err_local": "無法通過連結共享本地媒體,已略過",
+ "home_page_upload_err_limit": "一次最多只能上傳 30 個媒體,已略過",
"host": "主機",
"hour": "小時",
"hours": "小時",
"id": "ID",
"idle": "閒置",
- "ignore_icloud_photos": "忽略iCloud照片",
- "ignore_icloud_photos_description": "存儲在iCloud中的照片不會上傳至Immich伺服器",
+ "ignore_icloud_photos": "忽略 iCloud 照片",
+ "ignore_icloud_photos_description": "儲存在 iCloud 中的照片不會上傳至 Immich 伺服器",
"image": "圖片",
"image_alt_text_date": "{isVideo, select, true {影片} other {圖片}}拍攝於 {date}",
"image_alt_text_date_1_person": "{isVideo, select, true {影片} other {圖片}} 與 {person1} 一同於 {date} 拍攝",
- "image_alt_text_date_2_people": "{isVideo, select, true {影片} other {圖片}} 與 {person1} 和 {person2} 一同於 {date} 拍攝",
- "image_alt_text_date_3_people": "{isVideo, select, true {影片} other {圖片}} 與 {person1}、{person2} 和 {person3} 一同於 {date} 拍攝",
- "image_alt_text_date_4_or_more_people": "{isVideo, select, true {影片} other {圖片}} 與 {person1}、{person2} 和其他 {additionalCount, number} 人於 {date} 拍攝",
- "image_alt_text_date_place": "{date}在 {country} - {city} 拍攝的{isVideo, select, true {影片} other {圖片}}",
- "image_alt_text_date_place_1_person": "{isVideo, select, true {影片} other {圖片}} 於 {city}、{country},與 {person1} 一同在 {date} 拍攝",
- "image_alt_text_date_place_2_people": "{isVideo, select, true {影片} other {圖片}} 在 {city}、{country},與 {person1} 和 {person2} 一同於 {date} 拍攝",
- "image_alt_text_date_place_3_people": "{isVideo, select, true {影片} other {圖片}} 在 {city}、{country},與 {person1}、{person2} 和 {person3} 一同於 {date} 拍攝",
- "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {影片} other {圖片}} 在 {city}、{country},與 {person1}、{person2} 和其他 {additionalCount, number} 人於 {date} 拍攝",
- "image_saved_successfully": "圖片已儲存",
- "image_viewer_page_state_provider_download_started": "下載啓動",
+ "image_alt_text_date_2_people": "{person1} 和 {person2} 一同於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_3_people": "{person1}、{person2} 和 {person3} 一同於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_4_or_more_people": "{person1}、{person2} 和其他 {additionalCount, number} 人於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_place": "於 {date} 在 {country} - {city} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_place_1_person": "在 {country} - {city},與 {person1} 一同於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_place_2_people": "在 {country} - {city} 與 {person1} 和 {person2} 一同於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_place_3_people": "在 {country} - {city} 與 {person1}、{person2} 和 {person3} 一同於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_alt_text_date_place_4_or_more_people": "在 {country} - {city} 與 {person1}、{person2} 和其他 {additionalCount, number} 人於 {date} 拍攝的{isVideo, select, true {影片} other {圖片}}",
+ "image_saved_successfully": "已儲存圖片",
+ "image_viewer_page_state_provider_download_started": "下載已啟動",
"image_viewer_page_state_provider_download_success": "下載成功",
- "image_viewer_page_state_provider_share_error": "共享時發生錯誤",
+ "image_viewer_page_state_provider_share_error": "分享時發生錯誤",
"immich_logo": "Immich 標誌",
"immich_web_interface": "Immich 網頁介面",
- "import_from_json": "匯入 JSON",
+ "import_from_json": "從 JSON 匯入",
"import_path": "匯入路徑",
- "in_albums": "在 {count, plural, other {# 本相簿}}中",
- "in_archive": "已封存",
+ "in_albums": "在 {count, plural, one {# 本相簿} other {# 本相簿}}中",
+ "in_archive": "在封存中",
"include_archived": "包含已封存",
"include_shared_albums": "包含共享相簿",
- "include_shared_partner_assets": "包括共享親朋好友檔案",
+ "include_shared_partner_assets": "包括共享親朋好友的媒體",
"individual_share": "個別分享",
"individual_shares": "個別分享",
"info": "資訊",
"interval": {
"day_at_onepm": "每天下午 1 點",
- "hours": "每 {hours, plural, other {{hours, number} 小時}}",
+ "hours": "每 {hours, plural, one {小時} other {{hours, number} 小時}}",
"night_at_midnight": "每晚午夜",
"night_at_twoam": "每晚凌晨 2 點"
},
@@ -1165,13 +1187,13 @@
"invalid_date_format": "無效的日期格式",
"invite_people": "邀請人員",
"invite_to_album": "邀請至相簿",
- "ios_debug_info_fetch_ran_at": "於{dateTime}執行取回",
- "ios_debug_info_last_sync_at": "於{dateTime}最後一次同步",
+ "ios_debug_info_fetch_ran_at": "抓取已於 {dateTime} 執行",
+ "ios_debug_info_last_sync_at": "上次同步於 {dateTime}",
"ios_debug_info_no_processes_queued": "無排程中的背景程序",
"ios_debug_info_no_sync_yet": "尚未執行任何背景同步任務",
"ios_debug_info_processes_queued": "{count, plural, one {{count} 個背景程序已排程} other {{count} 個背景程序已排程}}",
- "ios_debug_info_processing_ran_at": "程序於{dateTime}執行",
- "items_count": "{count, plural, other {# 個項目}}",
+ "ios_debug_info_processing_ran_at": "於 {dateTime} 執行處理",
+ "items_count": "{count, plural, one {# 個項目} other {# 個項目}}",
"jobs": "任務",
"keep": "保留",
"keep_all": "全部保留",
@@ -1214,6 +1236,7 @@
"local": "本地",
"local_asset_cast_failed": "無法轉換未上傳至伺服器的項目",
"local_assets": "本地項目",
+ "local_media_summary": "當地媒體摘要",
"local_network": "本地網路",
"local_network_sheet_info": "當使用指定的 Wi-Fi 網路時,應用程式將透過此網址連線至伺服器",
"location_permission": "位置權限",
@@ -1225,6 +1248,7 @@
"location_picker_longitude_hint": "請在此處輸入您的經度值",
"lock": "鎖定",
"locked_folder": "鎖定的資料夾",
+ "log_detail_title": "日誌詳細資訊",
"log_out": "登出",
"log_out_all_devices": "登出所有裝置",
"logged_in_as": "以{user}身分登入",
@@ -1255,6 +1279,7 @@
"login_password_changed_success": "密碼更新成功",
"logout_all_device_confirmation": "您確定要登出所有裝置嗎?",
"logout_this_device_confirmation": "要登出這臺裝置嗎?",
+ "logs": "日誌",
"longitude": "經度",
"look": "樣貌",
"loop_videos": "重播影片",
@@ -1262,6 +1287,7 @@
"main_branch_warning": "您現在使用的是開發版本;我們強烈您建議使用正式發行版!",
"main_menu": "主頁面",
"make": "製造商",
+ "manage_geolocation": "管理位置",
"manage_shared_links": "管理共享連結",
"manage_sharing_with_partners": "管理與親朋好友的分享",
"manage_the_app_settings": "管理應用程式設定",
@@ -1296,6 +1322,7 @@
"mark_as_read": "標記為已讀",
"marked_all_as_read": "已全部標記為已讀",
"matches": "相符",
+ "matching_assets": "匹配資產",
"media_type": "媒體類型",
"memories": "回憶",
"memories_all_caught_up": "已全部看完",
@@ -1336,6 +1363,7 @@
"name_or_nickname": "名稱或暱稱",
"network_requirement_photos_upload": "使用行動網路流量備份照片",
"network_requirement_videos_upload": "使用行動網路流量備份影片",
+ "network_requirements": "網絡要求",
"network_requirements_updated": "網絡需求已變更,現重置備份佇列",
"networking_settings": "網路",
"networking_subtitle": "管理伺服器端點設定",
@@ -1346,6 +1374,7 @@
"new_person": "新的人物",
"new_pin_code": "新 PIN 碼",
"new_pin_code_subtitle": "這是您第一次存取鎖定的資料夾。建立 PIN 碼以安全存取此頁面",
+ "new_timeline": "新時間軸",
"new_user_created": "已建立新使用者",
"new_version_available": "新版本已發布",
"newest_first": "最新優先",
@@ -1359,20 +1388,25 @@
"no_assets_message": "按這裡上傳您的第一張照片",
"no_assets_to_show": "無項目展示",
"no_cast_devices_found": "沒有找到 Google Cast 裝置",
+ "no_checksum_local": "沒有可用的校驗和-無法獲取本地資產",
+ "no_checksum_remote": "沒有可用的校驗和-無法獲取遠程資產",
"no_duplicates_found": "沒發現重複項目。",
"no_exif_info_available": "沒有可用的 Exif 資訊",
"no_explore_results_message": "上傳更多照片以利探索。",
"no_favorites_message": "加入收藏,加速尋找影像",
"no_libraries_message": "建立外部媒體庫以查看您的照片和影片",
+ "no_local_assets_found": "未找到具有此校驗和的本地資產",
"no_locked_photos_message": "鎖定的資料夾中的照片和影片會被隱藏,當您瀏覽或搜尋圖庫時不會顯示。",
"no_name": "無名",
"no_notifications": "沒有通知",
"no_people_found": "找不到符合的人物",
"no_places": "沒有地點",
+ "no_remote_assets_found": "未找到具有此校驗和的遠程資產",
"no_results": "沒有結果",
"no_results_description": "試試同義詞或更通用的關鍵字吧",
"no_shared_albums_message": "建立相簿分享照片和影片",
"no_uploads_in_progress": "沒有正在上傳的項目",
+ "not_available": "不適用",
"not_in_any_album": "不在任何相簿中",
"not_selected": "未選擇",
"note_apply_storage_label_to_previously_uploaded assets": "*註:執行套用儲存標籤前先上傳項目",
@@ -1407,6 +1441,8 @@
"open_the_search_filters": "開啟搜尋篩選器",
"options": "選項",
"or": "或",
+ "organize_into_albums": "整理成相册",
+ "organize_into_albums_description": "使用當前同步設定將現有照片放入相册",
"organize_your_library": "整理您的圖庫",
"original": "原圖",
"other": "其他",
@@ -1446,7 +1482,7 @@
"pending": "待處理",
"people": "人物",
"people_edits_count": "編輯了 {count, plural, one {# 位人士} other {# 位人士}}",
- "people_feature_description": "以人物分組瀏覽照片和影片",
+ "people_feature_description": "以人物分類瀏覽照片和影片",
"people_sidebar_description": "在側邊欄顯示「人物」的連結",
"permanent_deletion_warning": "永久刪除警告",
"permanent_deletion_warning_setting_description": "在永久刪除檔案時顯示警告",
@@ -1468,7 +1504,7 @@
"person": "人物",
"person_age_months": "{months, plural, one {# 個月} other {# 個月}}前",
"person_age_year_months": "1 年 {months, plural, one {# 個月} other {# 個月}}前",
- "person_age_years": "{years, plural, other {# 年}}前",
+ "person_age_years": "{years, plural, other {# 歲}}",
"person_birthdate": "生於 {date}",
"person_hidden": "{name}{hidden, select, true {(隱藏)} other {}}",
"photo_shared_all_users": "看來您與所有使用者分享了照片,或沒有其他使用者可供分享。",
@@ -1492,6 +1528,7 @@
"port": "埠口",
"preferences_settings_subtitle": "管理應用程式偏好設定",
"preferences_settings_title": "偏好設定",
+ "preparing": "準備",
"preset": "預設",
"preview": "預覽",
"previous": "上一張",
@@ -1508,6 +1545,7 @@
"profile_drawer_client_out_of_date_minor": "客戶端有小版本升級,請盡快升級至最新版。",
"profile_drawer_client_server_up_to_date": "客戶端和服務端都是最新的",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "唯讀模式已開啟。請長按使用者頭像圖示以退出。",
"profile_drawer_server_out_of_date_major": "服務端有大版本升級,請盡快升級至最新版。",
"profile_drawer_server_out_of_date_minor": "服務端有小版本升級,請盡快升級至最新版。",
"profile_image_of_user": "{user} 的個人資料圖片",
@@ -1546,6 +1584,7 @@
"purchase_server_description_2": "擁護者狀態",
"purchase_server_title": "伺服器",
"purchase_settings_server_activated": "伺服器產品金鑰是由管理者管理的",
+ "query_asset_id": "査詢資產ID",
"queue_status": "處理中 {count}/{total}",
"rating": "評星",
"rating_clear": "清除評等",
@@ -1553,6 +1592,9 @@
"rating_description": "在資訊面板中顯示 EXIF 評等",
"reaction_options": "反應選項",
"read_changelog": "閱覽變更日誌",
+ "readonly_mode_disabled": "唯讀模式已關閉",
+ "readonly_mode_enabled": "唯讀模式已開啟",
+ "ready_for_upload": "已準備好上傳",
"reassign": "重新指定",
"reassigned_assets_to_existing_person": "已將 {count, plural, other {# 個檔案}}重新指定給{name, select, null {現有的人} other {{name}}}",
"reassigned_assets_to_new_person": "已將 {count, plural, other {# 個檔案}}重新指定給一位新人物",
@@ -1577,6 +1619,7 @@
"regenerating_thumbnails": "重新產生縮圖中",
"remote": "遠端",
"remote_assets": "遠端項目",
+ "remote_media_summary": "遠程媒體摘要",
"remove": "移除",
"remove_assets_album_confirmation": "確定要從相簿中移除 {count, plural, other {# 個檔案}}嗎?",
"remove_assets_shared_link_confirmation": "確定刪除共享連結中{count, plural, other {# 個項目}}嗎?",
@@ -1629,6 +1672,7 @@
"restore_user": "還原使用者",
"restored_asset": "已還原檔案",
"resume": "繼續",
+ "resume_paused_jobs": "恢復 {count, plural, one {# 暫停的任務} other {# 暫停的任務}}",
"retry_upload": "重新上傳",
"review_duplicates": "檢視重複項目",
"review_large_files": "檢視大型文件",
@@ -1722,6 +1766,7 @@
"select_user_for_sharing_page_err_album": "新增相簿失敗",
"selected": "已選擇",
"selected_count": "{count, plural, other {選了 # 項}}",
+ "selected_gps_coordinates": "選定的GPS座標",
"send_message": "傳訊息",
"send_welcome_email": "傳送歡迎電子郵件",
"server_endpoint": "伺服器端點",
@@ -1850,6 +1895,7 @@
"show_slideshow_transition": "顯示幻燈片轉場",
"show_supporter_badge": "擁護者徽章",
"show_supporter_badge_description": "顯示擁護者徽章",
+ "show_text_search_menu": "顯示文字蒐索選單",
"shuffle": "隨機排序",
"sidebar": "側邊欄",
"sidebar_display_description": "在側邊欄中顯示鏈結",
@@ -1880,6 +1926,7 @@
"stacktrace": "堆疊追蹤",
"start": "開始",
"start_date": "開始日期",
+ "start_date_before_end_date": "開始日期必須早於結束日期",
"state": "地區",
"status": "狀態",
"stop_casting": "停止casting",
@@ -1904,11 +1951,13 @@
"sync_albums_manual_subtitle": "將所有上傳的短片和照片同步到選定的備份相簿",
"sync_local": "同步本機",
"sync_remote": "同步遠端",
+ "sync_status": "同步状态",
+ "sync_status_subtitle": "查看和管理同步系統",
"sync_upload_album_setting_subtitle": "新增照片和短片並上傳到 Immich 上的選定相簿中",
"tag": "標籤",
"tag_assets": "標記檔案",
"tag_created": "已建立標籤:{tag}",
- "tag_feature_description": "以邏輯標記要旨分組瀏覽照片和影片",
+ "tag_feature_description": "以邏輯標記要旨分類瀏覽照片和影片",
"tag_not_found_question": "找不到標籤?建立新標籤。",
"tag_people": "標籤人物",
"tag_updated": "已更新標籤:{tag}",
@@ -1941,7 +1990,9 @@
"to_change_password": "變更密碼",
"to_favorite": "收藏",
"to_login": "登入",
+ "to_multi_select": "進行多選",
"to_parent": "到上一級",
+ "to_select": "选择",
"to_trash": "垃圾桶",
"toggle_settings": "切換設定",
"total": "統計",
@@ -1961,6 +2012,7 @@
"trash_page_select_assets_btn": "選擇項目",
"trash_page_title": "垃圾桶 ({count})",
"trashed_items_will_be_permanently_deleted_after": "垃圾桶中的項目會在 {days, plural, other {# 天}}後永久刪除。",
+ "troubleshoot": "疑难解答",
"type": "類型",
"unable_to_change_pin_code": "無法變更 PIN 碼",
"unable_to_setup_pin_code": "無法設定 PIN 碼",
@@ -1991,6 +2043,7 @@
"unstacked_assets_count": "已解除堆疊 {count, plural, other {# 個檔案}}",
"untagged": "無標籤",
"up_next": "下一個",
+ "update_location_action_prompt": "使用以下命令更新{count}個所選資產的位置:",
"updated_at": "更新於",
"updated_password": "已更新密碼",
"upload": "上傳",
@@ -2057,6 +2110,7 @@
"view_next_asset": "查看下一項",
"view_previous_asset": "查看上一項",
"view_qr_code": "查看 QR code",
+ "view_similar_photos": "查看相似照片",
"view_stack": "查看堆疊",
"view_user": "顯示使用者",
"viewer_remove_from_stack": "從堆疊中移除",
@@ -2075,5 +2129,6 @@
"yes": "是",
"you_dont_have_any_shared_links": "您沒有任何共享連結",
"your_wifi_name": "您的 Wi-Fi 名稱",
- "zoom_image": "縮放圖片"
+ "zoom_image": "縮放圖片",
+ "zoom_to_bounds": "縮放到邊界"
}
diff --git a/i18n/zh_SIMPLIFIED.json b/i18n/zh_SIMPLIFIED.json
index 816cbcf29f..1f1455aa19 100644
--- a/i18n/zh_SIMPLIFIED.json
+++ b/i18n/zh_SIMPLIFIED.json
@@ -26,8 +26,9 @@
"add_tag": "添加标签",
"add_to": "添加到…",
"add_to_album": "添加到相册",
- "add_to_album_bottom_sheet_added": "添加到 {album}",
- "add_to_album_bottom_sheet_already_exists": "已在 {album} 中",
+ "add_to_album_bottom_sheet_added": "添加到相册 “{album}”",
+ "add_to_album_bottom_sheet_already_exists": "已在相册“ {album} ” 中",
+ "add_to_album_bottom_sheet_some_local_assets": "某些本地资产无法添加到相册",
"add_to_album_toggle": "选择相册 {album}",
"add_to_albums": "添加到相册",
"add_to_albums_count": "添加到相册({count}个)",
@@ -100,7 +101,7 @@
"image_thumbnail_description": "剥离元数据的小缩略图,用于浏览主时间线等照片组",
"image_thumbnail_quality_description": "缩略图质量从 1 到 100。越高越好,但会产生更大的文件,并且会降低系统的响应能力。",
"image_thumbnail_title": "缩略图设置",
- "job_concurrency": "{job}并发",
+ "job_concurrency": "{job}任务并发",
"job_created": "任务已创建",
"job_not_concurrency_safe": "此任务并发并不安全。",
"job_settings": "任务设置",
@@ -121,13 +122,20 @@
"library_watching_settings": "监控图库(实验性)",
"library_watching_settings_description": "自动监控文件变化",
"logging_enable_description": "启用日志记录",
- "logging_level_description": "启用的日志级别。",
+ "logging_level_description": "启用时,要使用的日志级别。",
"logging_settings": "日志",
+ "machine_learning_availability_checks": "可用性检查",
+ "machine_learning_availability_checks_description": "自动检测并优先选择可用的机器学习服务器",
+ "machine_learning_availability_checks_enabled": "启用可用性检查",
+ "machine_learning_availability_checks_interval": "检查间隔",
+ "machine_learning_availability_checks_interval_description": "两次可用性检查之间的间隔(毫秒)",
+ "machine_learning_availability_checks_timeout": "请求超时",
+ "machine_learning_availability_checks_timeout_description": "用于可用性检查的超时时间(毫秒)",
"machine_learning_clip_model": "CLIP 模型",
"machine_learning_clip_model_description": "请于 此处查看支持的 CLIP 模型名称。注意,更换模型后需要对所有图片重新运行“智能搜索”任务。",
"machine_learning_duplicate_detection": "重复项检测",
"machine_learning_duplicate_detection_enabled": "启用重复检测",
- "machine_learning_duplicate_detection_enabled_description": "如果禁用此功能,完全相同的项目仍将被去重。",
+ "machine_learning_duplicate_detection_enabled_description": "如果禁用,完全相同的项目仍将被去重。",
"machine_learning_duplicate_detection_setting_description": "使用 CLIP 向量匹配(关键词相似度)来查找可能的重复项",
"machine_learning_enabled": "启用机器学习",
"machine_learning_enabled_description": "如果禁用,无论以下如何设置,所有机器学习功能将被禁用。",
@@ -158,7 +166,7 @@
"map_enable_description": "启用地图功能",
"map_gps_settings": "地图与 GPS 设置",
"map_gps_settings_description": "管理地图与 GPS(反向地理编码)设置",
- "map_implications": "地图功能依赖于外部地形贴图服务(tiles.immich.cloud)",
+ "map_implications": "地图功能依赖于外部地图瓦片服务(tiles.immich.cloud)",
"map_light_style": "浅色模式",
"map_manage_reverse_geocoding_settings": "管理反向地理编码设置",
"map_reverse_geocoding": "反向地理编码",
@@ -220,7 +228,7 @@
"oauth_enable_description": "使用 OAuth 登录",
"oauth_mobile_redirect_uri": "移动端重定向 URI",
"oauth_mobile_redirect_uri_override": "移动端重定向 URI 覆盖",
- "oauth_mobile_redirect_uri_override_description": "当 OAuth 提供商不允许使用移动 URI 时启用,如“''{callback}''”",
+ "oauth_mobile_redirect_uri_override_description": "当 OAuth 提供商不允许使用移动 URI 时启用,如“{callback}”",
"oauth_role_claim": "角色声明",
"oauth_role_claim_description": "根据此声明的存在自动授予管理员访问权限。声明可以是“user”(用户)或“admin”(管理员)。",
"oauth_settings": "OAuth",
@@ -364,7 +372,7 @@
"user_cleanup_job": "清理用户",
"user_delete_delay": "{user}的账户及项目将在{delay, plural, one {#天} other {#天}}后自动永久删除。",
"user_delete_delay_settings": "延期删除",
- "user_delete_delay_settings_description": "永久删除账户及其所有项目之前所保留的天数。用户删除作业会在午夜检查是否有用户可以删除。对该设置的更改将在下次执行时生效。",
+ "user_delete_delay_settings_description": "删除后永久删除用户帐户和资产的天数。用户删除作业会在午夜检查是否有用户可以删除。对该设置的更改将在下次执行时生效。",
"user_delete_immediately": "{user}的账户及项目将立即永久删除。",
"user_delete_immediately_checkbox": "立即删除检索到的用户及项目",
"user_details": "用户详情",
@@ -387,8 +395,6 @@
"admin_password": "管理员密码",
"administration": "系统管理",
"advanced": "高级",
- "advanced_settings_beta_timeline_subtitle": "体验全新的应用程序",
- "advanced_settings_beta_timeline_title": "测试版时间线",
"advanced_settings_enable_alternate_media_filter_subtitle": "使用此选项可在同步过程中根据备用条件筛选项目。仅当您在应用程序检测所有相册均遇到问题时才尝试此功能。",
"advanced_settings_enable_alternate_media_filter_title": "[实验] 使用备用的设备相册同步筛选条件",
"advanced_settings_log_level_title": "日志等级: {level}",
@@ -396,6 +402,8 @@
"advanced_settings_prefer_remote_title": "优先远程项目",
"advanced_settings_proxy_headers_subtitle": "定义代理标头,应用于 Immich 的每次网络请求",
"advanced_settings_proxy_headers_title": "代理标头",
+ "advanced_settings_readonly_mode_subtitle": "启用只读模式,在该模式下只能查看照片,多选、共享、投屏、删除等操作都被禁用。从主屏幕通过用户头像启用/禁用只读",
+ "advanced_settings_readonly_mode_title": "只读模式",
"advanced_settings_self_signed_ssl_subtitle": "跳过对服务器 的 SSL 证书验证(该选项适用于使用自签名证书的服务器)。",
"advanced_settings_self_signed_ssl_title": "允许自签名 SSL 证书",
"advanced_settings_sync_remote_deletions_subtitle": "在网页上执行操作时,自动删除或还原该设备中的项目",
@@ -423,6 +431,7 @@
"album_remove_user_confirmation": "确定要移除“{user}”吗?",
"album_search_not_found": "未找到符合搜索条件的相册",
"album_share_no_users": "看起来您已与所有用户共享了此相册,或者您根本没有任何用户可共享。",
+ "album_summary": "相册摘要",
"album_updated": "相册有更新",
"album_updated_setting_description": "当共享相册有新项目时接收邮件通知",
"album_user_left": "离开“{album}”",
@@ -456,11 +465,12 @@
"api_key_description": "该应用密钥只会显示一次。请确保在关闭窗口前复制下来。",
"api_key_empty": "API 密钥名称不可为空",
"api_keys": "API 密钥",
- "app_bar_signout_dialog_content": "确定退出登录?",
+ "app_bar_signout_dialog_content": "是否确定退出登录?",
"app_bar_signout_dialog_ok": "是",
"app_bar_signout_dialog_title": "退出登录",
"app_settings": "应用设置",
"appears_in": "出现于",
+ "apply_count": "应用 ({count, number}个资产)",
"archive": "归档",
"archive_action_prompt": "已将 {count} 项添加到归档",
"archive_or_unarchive_photo": "归档或取消归档照片",
@@ -493,6 +503,8 @@
"asset_restored_successfully": "已成功恢复所有项目",
"asset_skipped": "已跳过",
"asset_skipped_in_trash": "已回收",
+ "asset_trashed": "资产已被删除",
+ "asset_troubleshoot": "资产故障排除",
"asset_uploaded": "已上传",
"asset_uploading": "上传中…",
"asset_viewer_settings_subtitle": "管理图库浏览器设置",
@@ -500,7 +512,7 @@
"assets": "项目",
"assets_added_count": "已添加{count, plural, one {#个项目} other {#个项目}}",
"assets_added_to_album_count": "已添加{count, plural, one {#个项目} other {#个项目}}到相册",
- "assets_added_to_albums_count": "已添加 {assetTotal, plural, one {# 个项目} other {# 个项目}}到 {albumTotal} 个相册",
+ "assets_added_to_albums_count": "已添加 {assetTotal, plural, one {# 个项目} other {# 个项目}}到 {albumTotal, plural, one {# 个相册} other {# 个相册}}",
"assets_cannot_be_added_to_album_count": "无法添加 {count, plural, one {个项目} other {个项目}} 到相册中",
"assets_cannot_be_added_to_albums": "无法添加 {count, plural, one {个项目} other {个项目}} 到相册",
"assets_count": "{count, plural, one {#个项目} other {#个项目}}",
@@ -526,8 +538,10 @@
"autoplay_slideshow": "自动播放幻灯片",
"back": "返回",
"back_close_deselect": "返回、关闭或反选",
+ "background_backup_running_error": "后台备份正在运行,无法启动手动备份",
"background_location_permission": "后台定位权限",
"background_location_permission_content": "为确保后台运行时自动切换网络,需授予 Immich *始终允许精确定位* 权限,以识别 Wi-Fi 网络名称",
+ "background_options": "背景选项",
"backup": "备份",
"backup_album_selection_page_albums_device": "设备上的相册({count})",
"backup_album_selection_page_albums_tap": "单击选中,双击取消",
@@ -535,6 +549,7 @@
"backup_album_selection_page_select_albums": "选择相册",
"backup_album_selection_page_selection_info": "选择信息",
"backup_album_selection_page_total_assets": "总计",
+ "backup_albums_sync": "备份相册同步",
"backup_all": "全部",
"backup_background_service_backup_failed_message": "备份失败,正在重试…",
"backup_background_service_connection_failed_message": "连接服务器失败,正在重试…",
@@ -594,8 +609,6 @@
"backup_setting_subtitle": "管理后台和前台上传设置",
"backup_settings_subtitle": "管理上传设置",
"backward": "后退",
- "beta_sync": "测试版同步状态",
- "beta_sync_subtitle": "管理新的同步系统",
"biometric_auth_enabled": "生物识别身份验证已启用",
"biometric_locked_out": "您被锁定在生物识别身份验证之外",
"biometric_no_options": "没有可用的生物识别选项",
@@ -653,6 +666,8 @@
"change_pin_code": "修改PIN码",
"change_your_password": "修改您的密码",
"changed_visibility_successfully": "更改可见性成功",
+ "charging": "充电",
+ "charging_requirement_mobile_backup": "后台备份需要设备处于充电状态",
"check_corrupt_asset_backup": "检查备份是否损坏",
"check_corrupt_asset_backup_button": "执行检查",
"check_corrupt_asset_backup_description": "仅在连接到 Wi-Fi 并完成所有项目备份后执行此检查。该过程可能需要几分钟。",
@@ -739,6 +754,7 @@
"create_user": "创建用户",
"created": "已创建",
"created_at": "已创建",
+ "creating_linked_albums": "正在创建相册链接…",
"crop": "裁剪",
"curated_object_page_title": "事物",
"current_device": "当前设备",
@@ -888,14 +904,16 @@
"error": "错误",
"error_change_sort_album": "更改相册排序失败",
"error_delete_face": "删除人脸失败",
+ "error_getting_places": "获取位置时出错",
"error_loading_image": "加载图片时出错",
+ "error_loading_partners": "加载同伴时出错:{error}",
"error_saving_image": "错误:{error}",
"error_tag_face_bounding_box": "标记人脸出错 - 无法获取人脸框坐标",
"error_title": "错误 - 好像出了问题",
"errors": {
"cannot_navigate_next_asset": "无法导航到下一个项目",
"cannot_navigate_previous_asset": "无法导航到上一个项目",
- "cant_apply_changes": "无用应用更改",
+ "cant_apply_changes": "无法应用更改",
"cant_change_activity": "无法{enabled, select, true {禁用} other {启用}}活动",
"cant_change_asset_favorite": "无法修改项目的收藏属性",
"cant_change_metadata_assets_count": "无法修改{count, plural, one {#个项目} other {#个项目}}的元数据",
@@ -1053,6 +1071,7 @@
"favorites_page_no_favorites": "未找到收藏项目",
"feature_photo_updated": "人物头像已更新",
"features": "功能",
+ "features_in_development": "开发中的功能",
"features_setting_description": "管理 App 功能",
"file_name": "文件名",
"file_name_or_extension": "文件名",
@@ -1073,12 +1092,15 @@
"gcast_enabled": "Google Cast 投屏",
"gcast_enabled_description": "该功能需要加载来自 Google 的外部资源。",
"general": "通用",
+ "geolocation_instruction_location": "点击带有GPS坐标的资产以使用其位置,或直接从地图上选择位置",
"get_help": "获取帮助",
"get_wifiname_error": "无法获取 Wi-Fi 名称。确保已授予必要的权限,并已连接到 Wi-Fi 网络",
"getting_started": "入门",
"go_back": "返回",
"go_to_folder": "进入文件夹",
"go_to_search": "前往搜索",
+ "gps": "有GPS信息",
+ "gps_missing": "无GPS信息",
"grant_permission": "获取权限",
"group_albums_by": "相册分组依据...",
"group_country": "按国家分组",
@@ -1214,17 +1236,19 @@
"local": "本地",
"local_asset_cast_failed": "无法投放未上传至服务器的项目",
"local_assets": "本地项目",
+ "local_media_summary": "本地媒体摘要",
"local_network": "本地网络",
"local_network_sheet_info": "当使用指定的 Wi-Fi 网络时,应用程序将通过此 URL 访问服务器",
"location_permission": "定位权限",
"location_permission_content": "使用自动切换功能,Immich 需要精确定位权限,以获取当前 Wi-Fi 网络名称",
- "location_picker_choose_on_map": "在地图上选择",
- "location_picker_latitude_error": "输入有效的纬度值",
- "location_picker_latitude_hint": "请在此处输入您的纬度值",
- "location_picker_longitude_error": "输入有效的经度值",
- "location_picker_longitude_hint": "请在此处输入您的经度值",
+ "location_picker_choose_on_map": "在地图上定位",
+ "location_picker_latitude_error": "请输入有效的纬度",
+ "location_picker_latitude_hint": "请在此处输入纬度",
+ "location_picker_longitude_error": "请输入有效的经度",
+ "location_picker_longitude_hint": "请在此处输入经度",
"lock": "锁定",
"locked_folder": "锁定文件夹",
+ "log_detail_title": "日志详细信息",
"log_out": "注销",
"log_out_all_devices": "注销所有设备",
"logged_in_as": "以 {user} 身份登录",
@@ -1255,6 +1279,7 @@
"login_password_changed_success": "密码更新成功",
"logout_all_device_confirmation": "确定要从所有设备注销?",
"logout_this_device_confirmation": "确定要从本设备注销?",
+ "logs": "日志",
"longitude": "经度",
"look": "样式",
"loop_videos": "循环视频",
@@ -1262,6 +1287,7 @@
"main_branch_warning": "您当前使用的是开发版;我们强烈建议您使用正式发行版(release版)!",
"main_menu": "主菜单",
"make": "品牌",
+ "manage_geolocation": "管理坐标位置",
"manage_shared_links": "管理共享链接",
"manage_sharing_with_partners": "管理与同伴的共享",
"manage_the_app_settings": "管理应用设置",
@@ -1288,7 +1314,7 @@
"map_settings_date_range_option_years": "{years} 年前",
"map_settings_dialog_title": "地图设置",
"map_settings_include_show_archived": "包括已归档项目",
- "map_settings_include_show_partners": "包含伙伴",
+ "map_settings_include_show_partners": "包含同伴",
"map_settings_only_show_favorites": "仅显示收藏的项目",
"map_settings_theme_settings": "地图主题",
"map_zoom_to_see_photos": "缩小以查看项目",
@@ -1296,6 +1322,7 @@
"mark_as_read": "标记为已读",
"marked_all_as_read": "已全部标记为已读",
"matches": "匹配",
+ "matching_assets": "匹配资产",
"media_type": "媒体类型",
"memories": "回忆",
"memories_all_caught_up": "已全部看完",
@@ -1336,6 +1363,7 @@
"name_or_nickname": "名称或昵称",
"network_requirement_photos_upload": "使用蜂窝数据备份照片",
"network_requirement_videos_upload": "使用蜂窝数据备份视频",
+ "network_requirements": "网络要求",
"network_requirements_updated": "网络要求发生变化,正在重置备份队列",
"networking_settings": "网络",
"networking_subtitle": "管理服务器接口设置",
@@ -1346,6 +1374,7 @@
"new_person": "新人物",
"new_pin_code": "新的PIN码",
"new_pin_code_subtitle": "这是您第一次访问此锁定文件夹。创建一个PIN码以安全访问此页面",
+ "new_timeline": "新建时间轴",
"new_user_created": "已创建新用户",
"new_version_available": "有新版本发布啦",
"newest_first": "最新优先",
@@ -1357,22 +1386,27 @@
"no_albums_yet": "貌似您还没有创建相册。",
"no_archived_assets_message": "归档照片和视频以便在照片视图中隐藏它们",
"no_assets_message": "点击上传您的第一张照片",
- "no_assets_to_show": "无项目展示",
+ "no_assets_to_show": "没有要显示的资产",
"no_cast_devices_found": "未找到投放设备",
+ "no_checksum_local": "没有可用的校验和-无法获取本地资产",
+ "no_checksum_remote": "没有可用的校验和-无法获取远程资产",
"no_duplicates_found": "未发现重复项。",
"no_exif_info_available": "没有可用的 EXIF 信息",
"no_explore_results_message": "上传更多照片来探索。",
"no_favorites_message": "添加到收藏夹,快速查找最佳图片和视频",
"no_libraries_message": "创建外部图库来查看您的照片和视频",
+ "no_local_assets_found": "未找到具有此校验和的本地资产",
"no_locked_photos_message": "锁定文件夹中的照片和视频将被隐藏,不会在您浏览、搜索图库时出现。",
"no_name": "未命名",
"no_notifications": "没有通知",
"no_people_found": "未找到匹配的人物",
"no_places": "无位置",
+ "no_remote_assets_found": "未找到具有此校验和的远程资产",
"no_results": "无结果",
"no_results_description": "尝试使用同义词或更通用的关键词",
"no_shared_albums_message": "创建相册以共享照片和视频",
"no_uploads_in_progress": "没有正在进行的上传",
+ "not_available": "不适用",
"not_in_any_album": "不在任何相册中",
"not_selected": "未选择",
"note_apply_storage_label_to_previously_uploaded assets": "提示:要将存储标签应用于之前上传的项目,需要运行",
@@ -1407,6 +1441,8 @@
"open_the_search_filters": "打开搜索过滤器",
"options": "选项",
"or": "或",
+ "organize_into_albums": "整理成相册",
+ "organize_into_albums_description": "使用当前同步设置将现有照片放入相册",
"organize_your_library": "整理您的图库",
"original": "原图",
"other": "其它",
@@ -1492,6 +1528,7 @@
"port": "端口",
"preferences_settings_subtitle": "管理应用的偏好设置",
"preferences_settings_title": "偏好设置",
+ "preparing": "准备中",
"preset": "预设",
"preview": "预览",
"previous": "上一个",
@@ -1508,6 +1545,7 @@
"profile_drawer_client_out_of_date_minor": "客户端有小版本升级,请尽快升级至最新版。",
"profile_drawer_client_server_up_to_date": "客户端和服务端都是最新的",
"profile_drawer_github": "GitHub",
+ "profile_drawer_readonly_mode": "只读模式已启用。长按用户头像图标退出。",
"profile_drawer_server_out_of_date_major": "服务端有大版本升级,请尽快升级至最新版。",
"profile_drawer_server_out_of_date_minor": "服务端有小版本升级,请尽快升级至最新版。",
"profile_image_of_user": "{user}的个人资料图片",
@@ -1546,6 +1584,7 @@
"purchase_server_description_2": "支持者状态",
"purchase_server_title": "服务器",
"purchase_settings_server_activated": "服务器产品密钥正在由管理员管理",
+ "query_asset_id": "查询资产ID",
"queue_status": "排队中 {count}/{total}",
"rating": "星级",
"rating_clear": "删除星级",
@@ -1553,6 +1592,9 @@
"rating_description": "在信息面板中展示 EXIF 星级",
"reaction_options": "回应选项",
"read_changelog": "阅读更新日志",
+ "readonly_mode_disabled": "只读模式已禁用",
+ "readonly_mode_enabled": "只读模式已启用",
+ "ready_for_upload": "准备上传",
"reassign": "重新指派",
"reassigned_assets_to_existing_person": "重新指派{count, plural, one {#个项目} other {#个项目}}到{name, select, null {已存在的人物} other {{name}}}",
"reassigned_assets_to_new_person": "重新指派{count, plural, one {#个项目} other {#个项目}}到新的人物",
@@ -1577,6 +1619,7 @@
"regenerating_thumbnails": "正在重新生成缩略图",
"remote": "远程",
"remote_assets": "远程项目",
+ "remote_media_summary": "远程媒体摘要",
"remove": "移除",
"remove_assets_album_confirmation": "确定要从图库中移除{count, plural, one {#个项目} other {#个项目}}?",
"remove_assets_shared_link_confirmation": "确定要从共享链接中移除{count, plural, one {#个项目} other {#个项目}}?",
@@ -1629,6 +1672,7 @@
"restore_user": "恢复用户",
"restored_asset": "已恢复项目",
"resume": "继续",
+ "resume_paused_jobs": "继续 {count, plural, one {# 已暂停的任务} other {# 已暂停的任务}}",
"retry_upload": "重新上传",
"review_duplicates": "检查重复项",
"review_large_files": "查看大文件",
@@ -1722,6 +1766,7 @@
"select_user_for_sharing_page_err_album": "创建相册失败",
"selected": "已选择",
"selected_count": "{count, plural, other {#项已选择}}",
+ "selected_gps_coordinates": "已选定的GPS坐标",
"send_message": "发送消息",
"send_welcome_email": "发送欢迎邮件",
"server_endpoint": "服务器 URL",
@@ -1850,10 +1895,11 @@
"show_slideshow_transition": "显示幻灯片过渡效果",
"show_supporter_badge": "支持者徽章",
"show_supporter_badge_description": "展示支持者徽章",
+ "show_text_search_menu": "显示文本搜索菜单",
"shuffle": "随机",
"sidebar": "侧边栏",
"sidebar_display_description": "在侧边栏中显示链接",
- "sign_out": "注销",
+ "sign_out": "退出登录",
"sign_up": "注册",
"size": "大小",
"skip_to_content": "跳转到内容",
@@ -1880,6 +1926,7 @@
"stacktrace": "堆栈跟踪",
"start": "开始",
"start_date": "开始日期",
+ "start_date_before_end_date": "开始日期必须在结束日期之前",
"state": "省份",
"status": "状态",
"stop_casting": "停止投放",
@@ -1904,6 +1951,8 @@
"sync_albums_manual_subtitle": "将所有上传的视频和照片同步到选定的备份相册",
"sync_local": "同步本地",
"sync_remote": "同步远程",
+ "sync_status": "同步状态",
+ "sync_status_subtitle": "查看和管理同步系统",
"sync_upload_album_setting_subtitle": "创建照片和视频并上传到 Immich 上的选定相册中",
"tag": "标签",
"tag_assets": "标记项目",
@@ -1914,7 +1963,7 @@
"tag_updated": "已更新标签:{tag}",
"tagged_assets": "{count, plural, one {# 个项目} other {# 个项目}}被加上标签",
"tags": "标签",
- "tap_to_run_job": "点击运行作业",
+ "tap_to_run_job": "点击运行任务",
"template": "模版",
"theme": "主题",
"theme_selection": "主题选项",
@@ -1941,7 +1990,9 @@
"to_change_password": "修改密码",
"to_favorite": "收藏",
"to_login": "登录",
+ "to_multi_select": "多选",
"to_parent": "返回上一级",
+ "to_select": "选择",
"to_trash": "放入回收站",
"toggle_settings": "切换设置",
"total": "总计",
@@ -1961,6 +2012,7 @@
"trash_page_select_assets_btn": "选择项目",
"trash_page_title": "回收站 ({count})",
"trashed_items_will_be_permanently_deleted_after": "回收站中的项目将在{days, plural, one {#天} other {#天}}后被永久删除。",
+ "troubleshoot": "故障排除",
"type": "类型",
"unable_to_change_pin_code": "无法修改PIN码",
"unable_to_setup_pin_code": "无法设置PIN码",
@@ -1991,6 +2043,7 @@
"unstacked_assets_count": "{count, plural, one {#个项目} other {#个项目}}已取消堆叠",
"untagged": "无标签",
"up_next": "下一个",
+ "update_location_action_prompt": "更新 {count} 个所选资产的位置:",
"updated_at": "已更新",
"updated_password": "更新密码",
"upload": "上传",
@@ -2057,6 +2110,7 @@
"view_next_asset": "查看下一项",
"view_previous_asset": "查看上一项",
"view_qr_code": "查看二维码",
+ "view_similar_photos": "查看相似照片",
"view_stack": "查看堆叠项目",
"view_user": "查看用户",
"viewer_remove_from_stack": "从堆叠中移除",
@@ -2075,5 +2129,6 @@
"yes": "是",
"you_dont_have_any_shared_links": "您没有任何共享链接",
"your_wifi_name": "您的 Wi-Fi 名称",
- "zoom_image": "缩放图像"
+ "zoom_image": "缩放图像",
+ "zoom_to_bounds": "缩放到边界"
}
diff --git a/machine-learning/Dockerfile b/machine-learning/Dockerfile
index 7232a25e9e..e4ed643375 100644
--- a/machine-learning/Dockerfile
+++ b/machine-learning/Dockerfile
@@ -1,6 +1,6 @@
ARG DEVICE=cpu
-FROM python:3.11-bookworm@sha256:c642d5dfaf9115a12086785f23008558ae2e13bcd0c4794536340bcb777a4381 AS builder-cpu
+FROM python:3.11-bookworm@sha256:fc1f2e357c307c4044133952b203e66a47e7726821a664f603a180a0c5823844 AS builder-cpu
FROM builder-cpu AS builder-openvino
@@ -22,7 +22,7 @@ FROM builder-cpu AS builder-rknn
# Warning: 25GiB+ disk space required to pull this image
# TODO: find a way to reduce the image size
-FROM rocm/dev-ubuntu-22.04:6.3.4-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm
+FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm
# renovate: datasource=github-releases depName=Microsoft/onnxruntime
ARG ONNXRUNTIME_VERSION="v1.20.1"
@@ -59,7 +59,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
RUN apt-get update && apt-get install -y --no-install-recommends g++
-COPY --from=ghcr.io/astral-sh/uv:latest@sha256:f64ad69940b634e75d2e4d799eb5238066c5eeda49f76e782d4873c3d014ea33 /uv /uvx /bin/
+COPY --from=ghcr.io/astral-sh/uv:0.8.15@sha256:a5727064a0de127bdb7c9d3c1383f3a9ac307d9f2d8a391edc7896c54289ced0 /uv /uvx /bin/
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
@@ -68,11 +68,11 @@ RUN if [ "$DEVICE" = "rocm" ]; then \
uv pip install /opt/onnxruntime_rocm-*.whl; \
fi
-FROM python:3.11-slim-bookworm@sha256:838ff46ae6c481e85e369706fa3dea5166953824124735639f3c9f52af85f319 AS prod-cpu
+FROM python:3.11-slim-bookworm@sha256:873f91540d53b36327ed4fb018c9669107a4e2a676719720edb4209c4b15d029 AS prod-cpu
ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2
-FROM python:3.11-slim-bookworm@sha256:838ff46ae6c481e85e369706fa3dea5166953824124735639f3c9f52af85f319 AS prod-openvino
+FROM python:3.11-slim-bookworm@sha256:873f91540d53b36327ed4fb018c9669107a4e2a676719720edb4209c4b15d029 AS prod-openvino
RUN apt-get update && \
apt-get install --no-install-recommends -yqq ocl-icd-libopencl1 wget && \
@@ -99,7 +99,7 @@ COPY --from=builder-cuda /usr/local/bin/python3 /usr/local/bin/python3
COPY --from=builder-cuda /usr/local/lib/python3.11 /usr/local/lib/python3.11
COPY --from=builder-cuda /usr/local/lib/libpython3.11.so /usr/local/lib/libpython3.11.so
-FROM rocm/dev-ubuntu-22.04:6.3.4-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS prod-rocm
+FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS prod-rocm
FROM prod-cpu AS prod-armnn
diff --git a/machine-learning/pyproject.toml b/machine-learning/pyproject.toml
index f0f08b20b6..93e8bb3898 100644
--- a/machine-learning/pyproject.toml
+++ b/machine-learning/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "immich-ml"
-version = "1.129.0"
+version = "2.0.0"
description = ""
authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }]
requires-python = ">=3.10,<4.0"
diff --git a/machine-learning/uv.lock b/machine-learning/uv.lock
index db34b66301..c30120a40b 100644
--- a/machine-learning/uv.lock
+++ b/machine-learning/uv.lock
@@ -507,61 +507,87 @@ wheels = [
[[package]]
name = "coverage"
-version = "7.6.4"
+version = "7.10.6"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716, upload-time = "2024-10-20T22:57:39.682Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/14/70/025b179c993f019105b79575ac6edb5e084fb0f0e63f15cdebef4e454fb5/coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90", size = 823736, upload-time = "2025-08-29T15:35:16.668Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a5/93/4ad92f71e28ece5c0326e5f4a6630aa4928a8846654a65cfff69b49b95b9/coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", size = 206713, upload-time = "2024-10-20T22:56:03.877Z" },
- { url = "https://files.pythonhosted.org/packages/01/ae/747a580b1eda3f2e431d87de48f0604bd7bc92e52a1a95185a4aa585bc47/coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", size = 207149, upload-time = "2024-10-20T22:56:06.511Z" },
- { url = "https://files.pythonhosted.org/packages/07/1a/1f573f8a6145f6d4c9130bbc120e0024daf1b24cf2a78d7393fa6eb6aba7/coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", size = 235584, upload-time = "2024-10-20T22:56:07.678Z" },
- { url = "https://files.pythonhosted.org/packages/40/42/c8523f2e4db34aa9389caee0d3688b6ada7a84fcc782e943a868a7f302bd/coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", size = 233486, upload-time = "2024-10-20T22:56:09.496Z" },
- { url = "https://files.pythonhosted.org/packages/8d/95/565c310fffa16ede1a042e9ea1ca3962af0d8eb5543bc72df6b91dc0c3d5/coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", size = 234649, upload-time = "2024-10-20T22:56:11.326Z" },
- { url = "https://files.pythonhosted.org/packages/d5/81/3b550674d98968ec29c92e3e8650682be6c8b1fa7581a059e7e12e74c431/coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", size = 233744, upload-time = "2024-10-20T22:56:12.481Z" },
- { url = "https://files.pythonhosted.org/packages/0d/70/d66c7f51b3e33aabc5ea9f9624c1c9d9655472962270eb5e7b0d32707224/coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", size = 232204, upload-time = "2024-10-20T22:56:14.236Z" },
- { url = "https://files.pythonhosted.org/packages/23/2d/2b3a2dbed7a5f40693404c8a09e779d7c1a5fbed089d3e7224c002129ec8/coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", size = 233335, upload-time = "2024-10-20T22:56:15.521Z" },
- { url = "https://files.pythonhosted.org/packages/5a/4f/92d1d2ad720d698a4e71c176eacf531bfb8e0721d5ad560556f2c484a513/coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", size = 209435, upload-time = "2024-10-20T22:56:17.309Z" },
- { url = "https://files.pythonhosted.org/packages/c7/b9/cdf158e7991e2287bcf9082670928badb73d310047facac203ff8dcd5ff3/coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", size = 210243, upload-time = "2024-10-20T22:56:18.366Z" },
- { url = "https://files.pythonhosted.org/packages/87/31/9c0cf84f0dfcbe4215b7eb95c31777cdc0483c13390e69584c8150c85175/coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", size = 206819, upload-time = "2024-10-20T22:56:20.132Z" },
- { url = "https://files.pythonhosted.org/packages/53/ed/a38401079ad320ad6e054a01ec2b61d270511aeb3c201c80e99c841229d5/coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", size = 207263, upload-time = "2024-10-20T22:56:21.88Z" },
- { url = "https://files.pythonhosted.org/packages/20/e7/c3ad33b179ab4213f0d70da25a9c214d52464efa11caeab438592eb1d837/coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", size = 239205, upload-time = "2024-10-20T22:56:23.03Z" },
- { url = "https://files.pythonhosted.org/packages/36/91/fc02e8d8e694f557752120487fd982f654ba1421bbaa5560debf96ddceda/coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", size = 236612, upload-time = "2024-10-20T22:56:24.882Z" },
- { url = "https://files.pythonhosted.org/packages/cc/57/cb08f0eda0389a9a8aaa4fc1f9fec7ac361c3e2d68efd5890d7042c18aa3/coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", size = 238479, upload-time = "2024-10-20T22:56:26.749Z" },
- { url = "https://files.pythonhosted.org/packages/d5/c9/2c7681a9b3ca6e6f43d489c2e6653a53278ed857fd6e7010490c307b0a47/coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", size = 237405, upload-time = "2024-10-20T22:56:27.958Z" },
- { url = "https://files.pythonhosted.org/packages/b5/4e/ebfc6944b96317df8b537ae875d2e57c27b84eb98820bc0a1055f358f056/coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", size = 236038, upload-time = "2024-10-20T22:56:29.816Z" },
- { url = "https://files.pythonhosted.org/packages/13/f2/3a0bf1841a97c0654905e2ef531170f02c89fad2555879db8fe41a097871/coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", size = 236812, upload-time = "2024-10-20T22:56:31.654Z" },
- { url = "https://files.pythonhosted.org/packages/b9/9c/66bf59226b52ce6ed9541b02d33e80a6e816a832558fbdc1111a7bd3abd4/coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", size = 209400, upload-time = "2024-10-20T22:56:33.569Z" },
- { url = "https://files.pythonhosted.org/packages/2a/a0/b0790934c04dfc8d658d4a62acb8f7ca0efdf3818456fcad757b11c6479d/coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", size = 210243, upload-time = "2024-10-20T22:56:34.863Z" },
- { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013, upload-time = "2024-10-20T22:56:36.034Z" },
- { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251, upload-time = "2024-10-20T22:56:38.054Z" },
- { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268, upload-time = "2024-10-20T22:56:40.051Z" },
- { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298, upload-time = "2024-10-20T22:56:41.929Z" },
- { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367, upload-time = "2024-10-20T22:56:43.141Z" },
- { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853, upload-time = "2024-10-20T22:56:44.33Z" },
- { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160, upload-time = "2024-10-20T22:56:46.258Z" },
- { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824, upload-time = "2024-10-20T22:56:48.666Z" },
- { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639, upload-time = "2024-10-20T22:56:50.664Z" },
- { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428, upload-time = "2024-10-20T22:56:52.468Z" },
- { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039, upload-time = "2024-10-20T22:56:53.656Z" },
- { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298, upload-time = "2024-10-20T22:56:54.979Z" },
- { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813, upload-time = "2024-10-20T22:56:56.209Z" },
- { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959, upload-time = "2024-10-20T22:56:58.06Z" },
- { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950, upload-time = "2024-10-20T22:56:59.329Z" },
- { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610, upload-time = "2024-10-20T22:57:00.645Z" },
- { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697, upload-time = "2024-10-20T22:57:01.944Z" },
- { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541, upload-time = "2024-10-20T22:57:03.848Z" },
- { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707, upload-time = "2024-10-20T22:57:05.123Z" },
- { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439, upload-time = "2024-10-20T22:57:06.35Z" },
- { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784, upload-time = "2024-10-20T22:57:07.857Z" },
- { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058, upload-time = "2024-10-20T22:57:09.845Z" },
- { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772, upload-time = "2024-10-20T22:57:11.147Z" },
- { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490, upload-time = "2024-10-20T22:57:13.02Z" },
- { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848, upload-time = "2024-10-20T22:57:14.927Z" },
- { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340, upload-time = "2024-10-20T22:57:16.246Z" },
- { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229, upload-time = "2024-10-20T22:57:17.546Z" },
- { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510, upload-time = "2024-10-20T22:57:18.925Z" },
- { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353, upload-time = "2024-10-20T22:57:20.891Z" },
- { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502, upload-time = "2024-10-20T22:57:22.21Z" },
- { url = "https://files.pythonhosted.org/packages/cc/56/e1d75e8981a2a92c2a777e67c26efa96c66da59d645423146eb9ff3a851b/coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", size = 198954, upload-time = "2024-10-20T22:57:38.28Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/1d/2e64b43d978b5bd184e0756a41415597dfef30fcbd90b747474bd749d45f/coverage-7.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70e7bfbd57126b5554aa482691145f798d7df77489a177a6bef80de78860a356", size = 217025, upload-time = "2025-08-29T15:32:57.169Z" },
+ { url = "https://files.pythonhosted.org/packages/23/62/b1e0f513417c02cc10ef735c3ee5186df55f190f70498b3702d516aad06f/coverage-7.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e41be6f0f19da64af13403e52f2dec38bbc2937af54df8ecef10850ff8d35301", size = 217419, upload-time = "2025-08-29T15:32:59.908Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/16/b800640b7a43e7c538429e4d7223e0a94fd72453a1a048f70bf766f12e96/coverage-7.10.6-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c61fc91ab80b23f5fddbee342d19662f3d3328173229caded831aa0bd7595460", size = 244180, upload-time = "2025-08-29T15:33:01.608Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/6f/5e03631c3305cad187eaf76af0b559fff88af9a0b0c180d006fb02413d7a/coverage-7.10.6-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10356fdd33a7cc06e8051413140bbdc6f972137508a3572e3f59f805cd2832fd", size = 245992, upload-time = "2025-08-29T15:33:03.239Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/a1/f30ea0fb400b080730125b490771ec62b3375789f90af0bb68bfb8a921d7/coverage-7.10.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80b1695cf7c5ebe7b44bf2521221b9bb8cdf69b1f24231149a7e3eb1ae5fa2fb", size = 247851, upload-time = "2025-08-29T15:33:04.603Z" },
+ { url = "https://files.pythonhosted.org/packages/02/8e/cfa8fee8e8ef9a6bb76c7bef039f3302f44e615d2194161a21d3d83ac2e9/coverage-7.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2e4c33e6378b9d52d3454bd08847a8651f4ed23ddbb4a0520227bd346382bbc6", size = 245891, upload-time = "2025-08-29T15:33:06.176Z" },
+ { url = "https://files.pythonhosted.org/packages/93/a9/51be09b75c55c4f6c16d8d73a6a1d46ad764acca0eab48fa2ffaef5958fe/coverage-7.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c8a3ec16e34ef980a46f60dc6ad86ec60f763c3f2fa0db6d261e6e754f72e945", size = 243909, upload-time = "2025-08-29T15:33:07.74Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/a6/ba188b376529ce36483b2d585ca7bdac64aacbe5aa10da5978029a9c94db/coverage-7.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7d79dabc0a56f5af990cc6da9ad1e40766e82773c075f09cc571e2076fef882e", size = 244786, upload-time = "2025-08-29T15:33:08.965Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/4c/37ed872374a21813e0d3215256180c9a382c3f5ced6f2e5da0102fc2fd3e/coverage-7.10.6-cp310-cp310-win32.whl", hash = "sha256:86b9b59f2b16e981906e9d6383eb6446d5b46c278460ae2c36487667717eccf1", size = 219521, upload-time = "2025-08-29T15:33:10.599Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/36/9311352fdc551dec5b973b61f4e453227ce482985a9368305880af4f85dd/coverage-7.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:e132b9152749bd33534e5bd8565c7576f135f157b4029b975e15ee184325f528", size = 220417, upload-time = "2025-08-29T15:33:11.907Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/16/2bea27e212c4980753d6d563a0803c150edeaaddb0771a50d2afc410a261/coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f", size = 217129, upload-time = "2025-08-29T15:33:13.575Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/51/e7159e068831ab37e31aac0969d47b8c5ee25b7d307b51e310ec34869315/coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc", size = 217532, upload-time = "2025-08-29T15:33:14.872Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/c0/246ccbea53d6099325d25cd208df94ea435cd55f0db38099dd721efc7a1f/coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a", size = 247931, upload-time = "2025-08-29T15:33:16.142Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/fb/7435ef8ab9b2594a6e3f58505cc30e98ae8b33265d844007737946c59389/coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a", size = 249864, upload-time = "2025-08-29T15:33:17.434Z" },
+ { url = "https://files.pythonhosted.org/packages/51/f8/d9d64e8da7bcddb094d511154824038833c81e3a039020a9d6539bf303e9/coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62", size = 251969, upload-time = "2025-08-29T15:33:18.822Z" },
+ { url = "https://files.pythonhosted.org/packages/43/28/c43ba0ef19f446d6463c751315140d8f2a521e04c3e79e5c5fe211bfa430/coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153", size = 249659, upload-time = "2025-08-29T15:33:20.407Z" },
+ { url = "https://files.pythonhosted.org/packages/79/3e/53635bd0b72beaacf265784508a0b386defc9ab7fad99ff95f79ce9db555/coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5", size = 247714, upload-time = "2025-08-29T15:33:21.751Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/55/0964aa87126624e8c159e32b0bc4e84edef78c89a1a4b924d28dd8265625/coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619", size = 248351, upload-time = "2025-08-29T15:33:23.105Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/ab/6cfa9dc518c6c8e14a691c54e53a9433ba67336c760607e299bfcf520cb1/coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba", size = 219562, upload-time = "2025-08-29T15:33:24.717Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/18/99b25346690cbc55922e7cfef06d755d4abee803ef335baff0014268eff4/coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e", size = 220453, upload-time = "2025-08-29T15:33:26.482Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/ed/81d86648a07ccb124a5cf1f1a7788712b8d7216b593562683cd5c9b0d2c1/coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c", size = 219127, upload-time = "2025-08-29T15:33:27.777Z" },
+ { url = "https://files.pythonhosted.org/packages/26/06/263f3305c97ad78aab066d116b52250dd316e74fcc20c197b61e07eb391a/coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea", size = 217324, upload-time = "2025-08-29T15:33:29.06Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/60/1e1ded9a4fe80d843d7d53b3e395c1db3ff32d6c301e501f393b2e6c1c1f/coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634", size = 217560, upload-time = "2025-08-29T15:33:30.748Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/25/52136173c14e26dfed8b106ed725811bb53c30b896d04d28d74cb64318b3/coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6", size = 249053, upload-time = "2025-08-29T15:33:32.041Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/1d/ae25a7dc58fcce8b172d42ffe5313fc267afe61c97fa872b80ee72d9515a/coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9", size = 251802, upload-time = "2025-08-29T15:33:33.625Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/7a/1f561d47743710fe996957ed7c124b421320f150f1d38523d8d9102d3e2a/coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c", size = 252935, upload-time = "2025-08-29T15:33:34.909Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/ad/8b97cd5d28aecdfde792dcbf646bac141167a5cacae2cd775998b45fabb5/coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a", size = 250855, upload-time = "2025-08-29T15:33:36.922Z" },
+ { url = "https://files.pythonhosted.org/packages/33/6a/95c32b558d9a61858ff9d79580d3877df3eb5bc9eed0941b1f187c89e143/coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5", size = 248974, upload-time = "2025-08-29T15:33:38.175Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/9c/8ce95dee640a38e760d5b747c10913e7a06554704d60b41e73fdea6a1ffd/coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972", size = 250409, upload-time = "2025-08-29T15:33:39.447Z" },
+ { url = "https://files.pythonhosted.org/packages/04/12/7a55b0bdde78a98e2eb2356771fd2dcddb96579e8342bb52aa5bc52e96f0/coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d", size = 219724, upload-time = "2025-08-29T15:33:41.172Z" },
+ { url = "https://files.pythonhosted.org/packages/36/4a/32b185b8b8e327802c9efce3d3108d2fe2d9d31f153a0f7ecfd59c773705/coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629", size = 220536, upload-time = "2025-08-29T15:33:42.524Z" },
+ { url = "https://files.pythonhosted.org/packages/08/3a/d5d8dc703e4998038c3099eaf77adddb00536a3cec08c8dcd556a36a3eb4/coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80", size = 219171, upload-time = "2025-08-29T15:33:43.974Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/e7/917e5953ea29a28c1057729c1d5af9084ab6d9c66217523fd0e10f14d8f6/coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6", size = 217351, upload-time = "2025-08-29T15:33:45.438Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/86/2e161b93a4f11d0ea93f9bebb6a53f113d5d6e416d7561ca41bb0a29996b/coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80", size = 217600, upload-time = "2025-08-29T15:33:47.269Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/66/d03348fdd8df262b3a7fb4ee5727e6e4936e39e2f3a842e803196946f200/coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003", size = 248600, upload-time = "2025-08-29T15:33:48.953Z" },
+ { url = "https://files.pythonhosted.org/packages/73/dd/508420fb47d09d904d962f123221bc249f64b5e56aa93d5f5f7603be475f/coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27", size = 251206, upload-time = "2025-08-29T15:33:50.697Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/1f/9020135734184f439da85c70ea78194c2730e56c2d18aee6e8ff1719d50d/coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4", size = 252478, upload-time = "2025-08-29T15:33:52.303Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/a4/3d228f3942bb5a2051fde28c136eea23a761177dc4ff4ef54533164ce255/coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d", size = 250637, upload-time = "2025-08-29T15:33:53.67Z" },
+ { url = "https://files.pythonhosted.org/packages/36/e3/293dce8cdb9a83de971637afc59b7190faad60603b40e32635cbd15fbf61/coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc", size = 248529, upload-time = "2025-08-29T15:33:55.022Z" },
+ { url = "https://files.pythonhosted.org/packages/90/26/64eecfa214e80dd1d101e420cab2901827de0e49631d666543d0e53cf597/coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc", size = 250143, upload-time = "2025-08-29T15:33:56.386Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/70/bd80588338f65ea5b0d97e424b820fb4068b9cfb9597fbd91963086e004b/coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e", size = 219770, upload-time = "2025-08-29T15:33:58.063Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/14/0b831122305abcc1060c008f6c97bbdc0a913ab47d65070a01dc50293c2b/coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32", size = 220566, upload-time = "2025-08-29T15:33:59.766Z" },
+ { url = "https://files.pythonhosted.org/packages/83/c6/81a83778c1f83f1a4a168ed6673eeedc205afb562d8500175292ca64b94e/coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2", size = 219195, upload-time = "2025-08-29T15:34:01.191Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/1c/ccccf4bf116f9517275fa85047495515add43e41dfe8e0bef6e333c6b344/coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b", size = 218059, upload-time = "2025-08-29T15:34:02.91Z" },
+ { url = "https://files.pythonhosted.org/packages/92/97/8a3ceff833d27c7492af4f39d5da6761e9ff624831db9e9f25b3886ddbca/coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393", size = 218287, upload-time = "2025-08-29T15:34:05.106Z" },
+ { url = "https://files.pythonhosted.org/packages/92/d8/50b4a32580cf41ff0423777a2791aaf3269ab60c840b62009aec12d3970d/coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27", size = 259625, upload-time = "2025-08-29T15:34:06.575Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/7e/6a7df5a6fb440a0179d94a348eb6616ed4745e7df26bf2a02bc4db72c421/coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df", size = 261801, upload-time = "2025-08-29T15:34:08.006Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/4c/a270a414f4ed5d196b9d3d67922968e768cd971d1b251e1b4f75e9362f75/coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb", size = 264027, upload-time = "2025-08-29T15:34:09.806Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/8b/3210d663d594926c12f373c5370bf1e7c5c3a427519a8afa65b561b9a55c/coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282", size = 261576, upload-time = "2025-08-29T15:34:11.585Z" },
+ { url = "https://files.pythonhosted.org/packages/72/d0/e1961eff67e9e1dba3fc5eb7a4caf726b35a5b03776892da8d79ec895775/coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4", size = 259341, upload-time = "2025-08-29T15:34:13.159Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/06/d6478d152cd189b33eac691cba27a40704990ba95de49771285f34a5861e/coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21", size = 260468, upload-time = "2025-08-29T15:34:14.571Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/73/737440247c914a332f0b47f7598535b29965bf305e19bbc22d4c39615d2b/coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0", size = 220429, upload-time = "2025-08-29T15:34:16.394Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/76/b92d3214740f2357ef4a27c75a526eb6c28f79c402e9f20a922c295c05e2/coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5", size = 221493, upload-time = "2025-08-29T15:34:17.835Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/8e/6dcb29c599c8a1f654ec6cb68d76644fe635513af16e932d2d4ad1e5ac6e/coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b", size = 219757, upload-time = "2025-08-29T15:34:19.248Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/aa/76cf0b5ec00619ef208da4689281d48b57f2c7fde883d14bf9441b74d59f/coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e", size = 217331, upload-time = "2025-08-29T15:34:20.846Z" },
+ { url = "https://files.pythonhosted.org/packages/65/91/8e41b8c7c505d398d7730206f3cbb4a875a35ca1041efc518051bfce0f6b/coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb", size = 217607, upload-time = "2025-08-29T15:34:22.433Z" },
+ { url = "https://files.pythonhosted.org/packages/87/7f/f718e732a423d442e6616580a951b8d1ec3575ea48bcd0e2228386805e79/coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034", size = 248663, upload-time = "2025-08-29T15:34:24.425Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/52/c1106120e6d801ac03e12b5285e971e758e925b6f82ee9b86db3aa10045d/coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1", size = 251197, upload-time = "2025-08-29T15:34:25.906Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/ec/3a8645b1bb40e36acde9c0609f08942852a4af91a937fe2c129a38f2d3f5/coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a", size = 252551, upload-time = "2025-08-29T15:34:27.337Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/70/09ecb68eeb1155b28a1d16525fd3a9b65fbe75337311a99830df935d62b6/coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb", size = 250553, upload-time = "2025-08-29T15:34:29.065Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/80/47df374b893fa812e953b5bc93dcb1427a7b3d7a1a7d2db33043d17f74b9/coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d", size = 248486, upload-time = "2025-08-29T15:34:30.897Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/65/9f98640979ecee1b0d1a7164b589de720ddf8100d1747d9bbdb84be0c0fb/coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747", size = 249981, upload-time = "2025-08-29T15:34:32.365Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/55/eeb6603371e6629037f47bd25bef300387257ed53a3c5fdb159b7ac8c651/coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5", size = 220054, upload-time = "2025-08-29T15:34:34.124Z" },
+ { url = "https://files.pythonhosted.org/packages/15/d1/a0912b7611bc35412e919a2cd59ae98e7ea3b475e562668040a43fb27897/coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713", size = 220851, upload-time = "2025-08-29T15:34:35.651Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/2d/11880bb8ef80a45338e0b3e0725e4c2d73ffbb4822c29d987078224fd6a5/coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32", size = 219429, upload-time = "2025-08-29T15:34:37.16Z" },
+ { url = "https://files.pythonhosted.org/packages/83/c0/1f00caad775c03a700146f55536ecd097a881ff08d310a58b353a1421be0/coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65", size = 218080, upload-time = "2025-08-29T15:34:38.919Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/c4/b1c5d2bd7cc412cbeb035e257fd06ed4e3e139ac871d16a07434e145d18d/coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6", size = 218293, upload-time = "2025-08-29T15:34:40.425Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/07/4468d37c94724bf6ec354e4ec2f205fda194343e3e85fd2e59cec57e6a54/coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0", size = 259800, upload-time = "2025-08-29T15:34:41.996Z" },
+ { url = "https://files.pythonhosted.org/packages/82/d8/f8fb351be5fee31690cd8da768fd62f1cfab33c31d9f7baba6cd8960f6b8/coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e", size = 261965, upload-time = "2025-08-29T15:34:43.61Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/70/65d4d7cfc75c5c6eb2fed3ee5cdf420fd8ae09c4808723a89a81d5b1b9c3/coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5", size = 264220, upload-time = "2025-08-29T15:34:45.387Z" },
+ { url = "https://files.pythonhosted.org/packages/98/3c/069df106d19024324cde10e4ec379fe2fb978017d25e97ebee23002fbadf/coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7", size = 261660, upload-time = "2025-08-29T15:34:47.288Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/8a/2974d53904080c5dc91af798b3a54a4ccb99a45595cc0dcec6eb9616a57d/coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5", size = 259417, upload-time = "2025-08-29T15:34:48.779Z" },
+ { url = "https://files.pythonhosted.org/packages/30/38/9616a6b49c686394b318974d7f6e08f38b8af2270ce7488e879888d1e5db/coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0", size = 260567, upload-time = "2025-08-29T15:34:50.718Z" },
+ { url = "https://files.pythonhosted.org/packages/76/16/3ed2d6312b371a8cf804abf4e14895b70e4c3491c6e53536d63fd0958a8d/coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7", size = 220831, upload-time = "2025-08-29T15:34:52.653Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e5/d38d0cb830abede2adb8b147770d2a3d0e7fecc7228245b9b1ae6c24930a/coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930", size = 221950, upload-time = "2025-08-29T15:34:54.212Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/51/e48e550f6279349895b0ffcd6d2a690e3131ba3a7f4eafccc141966d4dea/coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b", size = 219969, upload-time = "2025-08-29T15:34:55.83Z" },
+ { url = "https://files.pythonhosted.org/packages/44/0c/50db5379b615854b5cf89146f8f5bd1d5a9693d7f3a987e269693521c404/coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3", size = 208986, upload-time = "2025-08-29T15:35:14.506Z" },
]
[package.optional-dependencies]
@@ -1341,7 +1367,7 @@ wheels = [
[[package]]
name = "locust"
-version = "2.38.1"
+version = "2.40.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "configargparse" },
@@ -1353,17 +1379,20 @@ dependencies = [
{ name = "locust-cloud" },
{ name = "msgpack" },
{ name = "psutil" },
+ { name = "pytest" },
+ { name = "python-engineio" },
+ { name = "python-socketio", extra = ["client"] },
{ name = "pywin32", marker = "sys_platform == 'win32'" },
{ name = "pyzmq" },
{ name = "requests" },
{ name = "setuptools" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.12'" },
{ name = "werkzeug" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/be/03/2f92b75d971e6043cca6fcec59ceccfa800a1324425a74950603d8cac33a/locust-2.38.1.tar.gz", hash = "sha256:4ad9f2f9e7d56b7747ba67cb16e47ca0466b3908f402f50660f15f37621a5218", size = 1406572, upload-time = "2025-08-12T11:38:52.007Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/27/e0/a99401e233ad1b9ad26265ad8f45f2466abb6ef954e7747e8484864eb6df/locust-2.40.2.tar.gz", hash = "sha256:9ffdf900d1ad949d4c5809e2a4e526bba582175f025f24da2755f43f4b5cb23e", size = 1411854, upload-time = "2025-09-08T12:55:28.664Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/dd/f6/4a8087f44abd67bb8cc51fba52dcfdddc09d69c154819d56b7da4c79f9ad/locust-2.38.1-py3-none-any.whl", hash = "sha256:34978219ee0d682a135fd4c67f287c26725e7b3fa83d34d65be70efdb42ab4d1", size = 1424130, upload-time = "2025-08-12T11:38:49.707Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/e7/85ddb125d91b3a2bfa2a52eeae2d4c7da062239aaa475d6aebddb5688f41/locust-2.40.2-py3-none-any.whl", hash = "sha256:c8f0060d2bd8479034e9e61e6473669c4c8216930d99ee61ec0e627340b89d3e", size = 1430483, upload-time = "2025-09-08T12:55:25.659Z" },
]
[[package]]
@@ -1838,79 +1867,79 @@ wheels = [
[[package]]
name = "orjson"
-version = "3.11.2"
+version = "3.11.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/df/1d/5e0ae38788bdf0721326695e65fdf41405ed535f633eb0df0f06f57552fa/orjson-3.11.2.tar.gz", hash = "sha256:91bdcf5e69a8fd8e8bdb3de32b31ff01d2bd60c1e8d5fe7d5afabdcf19920309", size = 5470739, upload-time = "2025-08-12T15:12:28.626Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/be/4d/8df5f83256a809c22c4d6792ce8d43bb503be0fb7a8e4da9025754b09658/orjson-3.11.3.tar.gz", hash = "sha256:1c0603b1d2ffcd43a411d64797a19556ef76958aef1c182f22dc30860152a98a", size = 5482394, upload-time = "2025-08-26T17:46:43.171Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a1/7b/7aebe925c6b1c46c8606a960fe1d6b681fccd4aaf3f37cd647c3309d6582/orjson-3.11.2-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d6b8a78c33496230a60dc9487118c284c15ebdf6724386057239641e1eb69761", size = 226896, upload-time = "2025-08-12T15:10:22.02Z" },
- { url = "https://files.pythonhosted.org/packages/7d/39/c952c9b0d51063e808117dd1e53668a2e4325cc63cfe7df453d853ee8680/orjson-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc04036eeae11ad4180d1f7b5faddb5dab1dee49ecd147cd431523869514873b", size = 111845, upload-time = "2025-08-12T15:10:24.963Z" },
- { url = "https://files.pythonhosted.org/packages/f5/dc/90b7f29be38745eeacc30903b693f29fcc1097db0c2a19a71ffb3e9f2a5f/orjson-3.11.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c04325839c5754c253ff301cee8aaed7442d974860a44447bb3be785c411c27", size = 116395, upload-time = "2025-08-12T15:10:26.314Z" },
- { url = "https://files.pythonhosted.org/packages/10/c2/fe84ba63164c22932b8d59b8810e2e58590105293a259e6dd1bfaf3422c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32769e04cd7fdc4a59854376211145a1bbbc0aea5e9d6c9755d3d3c301d7c0df", size = 118768, upload-time = "2025-08-12T15:10:27.605Z" },
- { url = "https://files.pythonhosted.org/packages/a9/ce/d9748ec69b1a4c29b8e2bab8233e8c41c583c69f515b373f1fb00247d8c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff285d14917ea1408a821786e3677c5261fa6095277410409c694b8e7720ae0", size = 120887, upload-time = "2025-08-12T15:10:29.153Z" },
- { url = "https://files.pythonhosted.org/packages/c1/66/b90fac8e4a76e83f981912d7f9524d402b31f6c1b8bff3e498aa321c326c/orjson-3.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2662f908114864b63ff75ffe6ffacf996418dd6cc25e02a72ad4bda81b1ec45a", size = 123650, upload-time = "2025-08-12T15:10:30.602Z" },
- { url = "https://files.pythonhosted.org/packages/33/81/56143898d1689c7f915ac67703efb97e8f2f8d5805ce8c2c3fd0f2bb6e3d/orjson-3.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab463cf5d08ad6623a4dac1badd20e88a5eb4b840050c4812c782e3149fe2334", size = 121287, upload-time = "2025-08-12T15:10:31.868Z" },
- { url = "https://files.pythonhosted.org/packages/80/de/f9c6d00c127be766a3739d0d85b52a7c941e437d8dd4d573e03e98d0f89c/orjson-3.11.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64414241bde943cbf3c00d45fcb5223dca6d9210148ba984aae6b5d63294502b", size = 119637, upload-time = "2025-08-12T15:10:33.078Z" },
- { url = "https://files.pythonhosted.org/packages/67/4c/ab70c7627022d395c1b4eb5badf6196b7144e82b46a3a17ed2354f9e592d/orjson-3.11.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7773e71c0ae8c9660192ff144a3d69df89725325e3d0b6a6bb2c50e5ebaf9b84", size = 392478, upload-time = "2025-08-12T15:10:34.669Z" },
- { url = "https://files.pythonhosted.org/packages/77/91/d890b873b69311db4fae2624c5603c437df9c857fb061e97706dac550a77/orjson-3.11.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:652ca14e283b13ece35bf3a86503c25592f294dbcfc5bb91b20a9c9a62a3d4be", size = 134343, upload-time = "2025-08-12T15:10:35.978Z" },
- { url = "https://files.pythonhosted.org/packages/47/16/1aa248541b4830274a079c4aeb2aa5d1ff17c3f013b1d0d8d16d0848f3de/orjson-3.11.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:26e99e98df8990ecfe3772bbdd7361f602149715c2cbc82e61af89bfad9528a4", size = 123887, upload-time = "2025-08-12T15:10:37.601Z" },
- { url = "https://files.pythonhosted.org/packages/95/e4/7419833c55ac8b5f385d00c02685a260da1f391e900fc5c3e0b797e0d506/orjson-3.11.2-cp310-cp310-win32.whl", hash = "sha256:5814313b3e75a2be7fe6c7958201c16c4560e21a813dbad25920752cecd6ad66", size = 124560, upload-time = "2025-08-12T15:10:38.966Z" },
- { url = "https://files.pythonhosted.org/packages/74/f8/27ca7ef3e194c462af32ce1883187f5ec483650c559166f0de59c4c2c5f0/orjson-3.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc471ce2225ab4c42ca672f70600d46a8b8e28e8d4e536088c1ccdb1d22b35ce", size = 119700, upload-time = "2025-08-12T15:10:40.911Z" },
- { url = "https://files.pythonhosted.org/packages/78/7d/e295df1ac9920cbb19fb4c1afa800e86f175cb657143aa422337270a4782/orjson-3.11.2-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:888b64ef7eaeeff63f773881929434a5834a6a140a63ad45183d59287f07fc6a", size = 226502, upload-time = "2025-08-12T15:10:42.284Z" },
- { url = "https://files.pythonhosted.org/packages/65/21/ffb0f10ea04caf418fb4e7ad1fda4b9ab3179df9d7a33b69420f191aadd5/orjson-3.11.2-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:83387cc8b26c9fa0ae34d1ea8861a7ae6cff8fb3e346ab53e987d085315a728e", size = 115999, upload-time = "2025-08-12T15:10:43.738Z" },
- { url = "https://files.pythonhosted.org/packages/90/d5/8da1e252ac3353d92e6f754ee0c85027c8a2cda90b6899da2be0df3ef83d/orjson-3.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7e35f003692c216d7ee901b6b916b5734d6fc4180fcaa44c52081f974c08e17", size = 111563, upload-time = "2025-08-12T15:10:45.301Z" },
- { url = "https://files.pythonhosted.org/packages/4f/81/baabc32e52c570b0e4e1044b1bd2ccbec965e0de3ba2c13082255efa2006/orjson-3.11.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a0a4c29ae90b11d0c00bcc31533854d89f77bde2649ec602f512a7e16e00640", size = 116222, upload-time = "2025-08-12T15:10:46.92Z" },
- { url = "https://files.pythonhosted.org/packages/8d/b7/da2ad55ad80b49b560dce894c961477d0e76811ee6e614b301de9f2f8728/orjson-3.11.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:585d712b1880f68370108bc5534a257b561672d1592fae54938738fe7f6f1e33", size = 118594, upload-time = "2025-08-12T15:10:48.488Z" },
- { url = "https://files.pythonhosted.org/packages/61/be/014f7eab51449f3c894aa9bbda2707b5340c85650cb7d0db4ec9ae280501/orjson-3.11.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d08e342a7143f8a7c11f1c4033efe81acbd3c98c68ba1b26b96080396019701f", size = 120700, upload-time = "2025-08-12T15:10:49.811Z" },
- { url = "https://files.pythonhosted.org/packages/cf/ae/c217903a30c51341868e2d8c318c59a8413baa35af54d7845071c8ccd6fe/orjson-3.11.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c0f84fc50398773a702732c87cd622737bf11c0721e6db3041ac7802a686fb", size = 123433, upload-time = "2025-08-12T15:10:51.06Z" },
- { url = "https://files.pythonhosted.org/packages/57/c2/b3c346f78b1ff2da310dd300cb0f5d32167f872b4d3bb1ad122c889d97b0/orjson-3.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:140f84e3c8d4c142575898c91e3981000afebf0333df753a90b3435d349a5fe5", size = 121061, upload-time = "2025-08-12T15:10:52.381Z" },
- { url = "https://files.pythonhosted.org/packages/00/c8/c97798f6010327ffc75ad21dd6bca11ea2067d1910777e798c2849f1c68f/orjson-3.11.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96304a2b7235e0f3f2d9363ddccdbfb027d27338722fe469fe656832a017602e", size = 119410, upload-time = "2025-08-12T15:10:53.692Z" },
- { url = "https://files.pythonhosted.org/packages/37/fd/df720f7c0e35694617b7f95598b11a2cb0374661d8389703bea17217da53/orjson-3.11.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d7612bb227d5d9582f1f50a60bd55c64618fc22c4a32825d233a4f2771a428a", size = 392294, upload-time = "2025-08-12T15:10:55.079Z" },
- { url = "https://files.pythonhosted.org/packages/ba/52/0120d18f60ab0fe47531d520372b528a45c9a25dcab500f450374421881c/orjson-3.11.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a134587d18fe493befc2defffef2a8d27cfcada5696cb7234de54a21903ae89a", size = 134134, upload-time = "2025-08-12T15:10:56.568Z" },
- { url = "https://files.pythonhosted.org/packages/ec/10/1f967671966598366de42f07e92b0fc694ffc66eafa4b74131aeca84915f/orjson-3.11.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0b84455e60c4bc12c1e4cbaa5cfc1acdc7775a9da9cec040e17232f4b05458bd", size = 123745, upload-time = "2025-08-12T15:10:57.907Z" },
- { url = "https://files.pythonhosted.org/packages/43/eb/76081238671461cfd0f47e0c24f408ffa66184237d56ef18c33e86abb612/orjson-3.11.2-cp311-cp311-win32.whl", hash = "sha256:f0660efeac223f0731a70884e6914a5f04d613b5ae500744c43f7bf7b78f00f9", size = 124393, upload-time = "2025-08-12T15:10:59.267Z" },
- { url = "https://files.pythonhosted.org/packages/26/76/cc598c1811ba9ba935171267b02e377fc9177489efce525d478a2999d9cc/orjson-3.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:955811c8405251d9e09cbe8606ad8fdef49a451bcf5520095a5ed38c669223d8", size = 119561, upload-time = "2025-08-12T15:11:00.559Z" },
- { url = "https://files.pythonhosted.org/packages/d8/17/c48011750f0489006f7617b0a3cebc8230f36d11a34e7e9aca2085f07792/orjson-3.11.2-cp311-cp311-win_arm64.whl", hash = "sha256:2e4d423a6f838552e3a6d9ec734b729f61f88b1124fd697eab82805ea1a2a97d", size = 114186, upload-time = "2025-08-12T15:11:01.931Z" },
- { url = "https://files.pythonhosted.org/packages/40/02/46054ebe7996a8adee9640dcad7d39d76c2000dc0377efa38e55dc5cbf78/orjson-3.11.2-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:901d80d349d8452162b3aa1afb82cec5bee79a10550660bc21311cc61a4c5486", size = 226528, upload-time = "2025-08-12T15:11:03.317Z" },
- { url = "https://files.pythonhosted.org/packages/e2/c6/6b6f0b4d8aea1137436546b990f71be2cd8bd870aa2f5aa14dba0fcc95dc/orjson-3.11.2-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:cf3bd3967a360e87ee14ed82cb258b7f18c710dacf3822fb0042a14313a673a1", size = 115931, upload-time = "2025-08-12T15:11:04.759Z" },
- { url = "https://files.pythonhosted.org/packages/ae/05/4205cc97c30e82a293dd0d149b1a89b138ebe76afeca66fc129fa2aa4e6a/orjson-3.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26693dde66910078229a943e80eeb99fdce6cd2c26277dc80ead9f3ab97d2131", size = 111382, upload-time = "2025-08-12T15:11:06.468Z" },
- { url = "https://files.pythonhosted.org/packages/50/c7/b8a951a93caa821f9272a7c917115d825ae2e4e8768f5ddf37968ec9de01/orjson-3.11.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ad4c8acb50a28211c33fc7ef85ddf5cb18d4636a5205fd3fa2dce0411a0e30c", size = 116271, upload-time = "2025-08-12T15:11:07.845Z" },
- { url = "https://files.pythonhosted.org/packages/17/03/1006c7f8782d5327439e26d9b0ec66500ea7b679d4bbb6b891d2834ab3ee/orjson-3.11.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:994181e7f1725bb5f2d481d7d228738e0743b16bf319ca85c29369c65913df14", size = 119086, upload-time = "2025-08-12T15:11:09.329Z" },
- { url = "https://files.pythonhosted.org/packages/44/61/57d22bc31f36a93878a6f772aea76b2184102c6993dea897656a66d18c74/orjson-3.11.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb79a0476393c07656b69c8e763c3cc925fa8e1d9e9b7d1f626901bb5025448", size = 120724, upload-time = "2025-08-12T15:11:10.674Z" },
- { url = "https://files.pythonhosted.org/packages/78/a9/4550e96b4c490c83aea697d5347b8f7eb188152cd7b5a38001055ca5b379/orjson-3.11.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191ed27a1dddb305083d8716af413d7219f40ec1d4c9b0e977453b4db0d6fb6c", size = 123577, upload-time = "2025-08-12T15:11:12.015Z" },
- { url = "https://files.pythonhosted.org/packages/3a/86/09b8cb3ebd513d708ef0c92d36ac3eebda814c65c72137b0a82d6d688fc4/orjson-3.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0afb89f16f07220183fd00f5f297328ed0a68d8722ad1b0c8dcd95b12bc82804", size = 121195, upload-time = "2025-08-12T15:11:13.399Z" },
- { url = "https://files.pythonhosted.org/packages/37/68/7b40b39ac2c1c644d4644e706d0de6c9999764341cd85f2a9393cb387661/orjson-3.11.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ab6e6b4e93b1573a026b6ec16fca9541354dd58e514b62c558b58554ae04307", size = 119234, upload-time = "2025-08-12T15:11:15.134Z" },
- { url = "https://files.pythonhosted.org/packages/40/7c/bb6e7267cd80c19023d44d8cbc4ea4ed5429fcd4a7eb9950f50305697a28/orjson-3.11.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9cb23527efb61fb75527df55d20ee47989c4ee34e01a9c98ee9ede232abf6219", size = 392250, upload-time = "2025-08-12T15:11:16.604Z" },
- { url = "https://files.pythonhosted.org/packages/64/f2/6730ace05583dbca7c1b406d59f4266e48cd0d360566e71482420fb849fc/orjson-3.11.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a4dd1268e4035af21b8a09e4adf2e61f87ee7bf63b86d7bb0a237ac03fad5b45", size = 134572, upload-time = "2025-08-12T15:11:18.205Z" },
- { url = "https://files.pythonhosted.org/packages/96/0f/7d3e03a30d5aac0432882b539a65b8c02cb6dd4221ddb893babf09c424cc/orjson-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff8b155b145eaf5a9d94d2c476fbe18d6021de93cf36c2ae2c8c5b775763f14e", size = 123869, upload-time = "2025-08-12T15:11:19.554Z" },
- { url = "https://files.pythonhosted.org/packages/45/80/1513265eba6d4a960f078f4b1d2bff94a571ab2d28c6f9835e03dfc65cc6/orjson-3.11.2-cp312-cp312-win32.whl", hash = "sha256:ae3bb10279d57872f9aba68c9931aa71ed3b295fa880f25e68da79e79453f46e", size = 124430, upload-time = "2025-08-12T15:11:20.914Z" },
- { url = "https://files.pythonhosted.org/packages/fb/61/eadf057b68a332351eeb3d89a4cc538d14f31cd8b5ec1b31a280426ccca2/orjson-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:d026e1967239ec11a2559b4146a61d13914504b396f74510a1c4d6b19dfd8732", size = 119598, upload-time = "2025-08-12T15:11:22.372Z" },
- { url = "https://files.pythonhosted.org/packages/6b/3f/7f4b783402143d965ab7e9a2fc116fdb887fe53bdce7d3523271cd106098/orjson-3.11.2-cp312-cp312-win_arm64.whl", hash = "sha256:59f8d5ad08602711af9589375be98477d70e1d102645430b5a7985fdbf613b36", size = 114052, upload-time = "2025-08-12T15:11:23.762Z" },
- { url = "https://files.pythonhosted.org/packages/c2/f3/0dd6b4750eb556ae4e2c6a9cb3e219ec642e9c6d95f8ebe5dc9020c67204/orjson-3.11.2-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a079fdba7062ab396380eeedb589afb81dc6683f07f528a03b6f7aae420a0219", size = 226419, upload-time = "2025-08-12T15:11:25.517Z" },
- { url = "https://files.pythonhosted.org/packages/44/d5/e67f36277f78f2af8a4690e0c54da6b34169812f807fd1b4bfc4dbcf9558/orjson-3.11.2-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:6a5f62ebbc530bb8bb4b1ead103647b395ba523559149b91a6c545f7cd4110ad", size = 115803, upload-time = "2025-08-12T15:11:27.357Z" },
- { url = "https://files.pythonhosted.org/packages/24/37/ff8bc86e0dacc48f07c2b6e20852f230bf4435611bab65e3feae2b61f0ae/orjson-3.11.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7df6c7b8b0931feb3420b72838c3e2ba98c228f7aa60d461bc050cf4ca5f7b2", size = 111337, upload-time = "2025-08-12T15:11:28.805Z" },
- { url = "https://files.pythonhosted.org/packages/b9/25/37d4d3e8079ea9784ea1625029988e7f4594ce50d4738b0c1e2bf4a9e201/orjson-3.11.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6f59dfea7da1fced6e782bb3699718088b1036cb361f36c6e4dd843c5111aefe", size = 116222, upload-time = "2025-08-12T15:11:30.18Z" },
- { url = "https://files.pythonhosted.org/packages/b7/32/a63fd9c07fce3b4193dcc1afced5dd4b0f3a24e27556604e9482b32189c9/orjson-3.11.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edf49146520fef308c31aa4c45b9925fd9c7584645caca7c0c4217d7900214ae", size = 119020, upload-time = "2025-08-12T15:11:31.59Z" },
- { url = "https://files.pythonhosted.org/packages/b4/b6/400792b8adc3079a6b5d649264a3224d6342436d9fac9a0ed4abc9dc4596/orjson-3.11.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50995bbeb5d41a32ad15e023305807f561ac5dcd9bd41a12c8d8d1d2c83e44e6", size = 120721, upload-time = "2025-08-12T15:11:33.035Z" },
- { url = "https://files.pythonhosted.org/packages/40/f3/31ab8f8c699eb9e65af8907889a0b7fef74c1d2b23832719a35da7bb0c58/orjson-3.11.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cc42960515076eb639b705f105712b658c525863d89a1704d984b929b0577d1", size = 123574, upload-time = "2025-08-12T15:11:34.433Z" },
- { url = "https://files.pythonhosted.org/packages/bd/a6/ce4287c412dff81878f38d06d2c80845709c60012ca8daf861cb064b4574/orjson-3.11.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56777cab2a7b2a8ea687fedafb84b3d7fdafae382165c31a2adf88634c432fa", size = 121225, upload-time = "2025-08-12T15:11:36.133Z" },
- { url = "https://files.pythonhosted.org/packages/69/b0/7a881b2aef4fed0287d2a4fbb029d01ed84fa52b4a68da82bdee5e50598e/orjson-3.11.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07349e88025b9b5c783077bf7a9f401ffbfb07fd20e86ec6fc5b7432c28c2c5e", size = 119201, upload-time = "2025-08-12T15:11:37.642Z" },
- { url = "https://files.pythonhosted.org/packages/cf/98/a325726b37f7512ed6338e5e65035c3c6505f4e628b09a5daf0419f054ea/orjson-3.11.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:45841fbb79c96441a8c58aa29ffef570c5df9af91f0f7a9572e5505e12412f15", size = 392193, upload-time = "2025-08-12T15:11:39.153Z" },
- { url = "https://files.pythonhosted.org/packages/cb/4f/a7194f98b0ce1d28190e0c4caa6d091a3fc8d0107ad2209f75c8ba398984/orjson-3.11.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13d8d8db6cd8d89d4d4e0f4161acbbb373a4d2a4929e862d1d2119de4aa324ac", size = 134548, upload-time = "2025-08-12T15:11:40.768Z" },
- { url = "https://files.pythonhosted.org/packages/e8/5e/b84caa2986c3f472dc56343ddb0167797a708a8d5c3be043e1e2677b55df/orjson-3.11.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51da1ee2178ed09c00d09c1b953e45846bbc16b6420965eb7a913ba209f606d8", size = 123798, upload-time = "2025-08-12T15:11:42.164Z" },
- { url = "https://files.pythonhosted.org/packages/9c/5b/e398449080ce6b4c8fcadad57e51fa16f65768e1b142ba90b23ac5d10801/orjson-3.11.2-cp313-cp313-win32.whl", hash = "sha256:51dc033df2e4a4c91c0ba4f43247de99b3cbf42ee7a42ee2b2b2f76c8b2f2cb5", size = 124402, upload-time = "2025-08-12T15:11:44.036Z" },
- { url = "https://files.pythonhosted.org/packages/b3/66/429e4608e124debfc4790bfc37131f6958e59510ba3b542d5fc163be8e5f/orjson-3.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:29d91d74942b7436f29b5d1ed9bcfc3f6ef2d4f7c4997616509004679936650d", size = 119498, upload-time = "2025-08-12T15:11:45.864Z" },
- { url = "https://files.pythonhosted.org/packages/7b/04/f8b5f317cce7ad3580a9ad12d7e2df0714dfa8a83328ecddd367af802f5b/orjson-3.11.2-cp313-cp313-win_arm64.whl", hash = "sha256:4ca4fb5ac21cd1e48028d4f708b1bb13e39c42d45614befd2ead004a8bba8535", size = 114051, upload-time = "2025-08-12T15:11:47.555Z" },
- { url = "https://files.pythonhosted.org/packages/74/83/2c363022b26c3c25b3708051a19d12f3374739bb81323f05b284392080c0/orjson-3.11.2-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3dcba7101ea6a8d4ef060746c0f2e7aa8e2453a1012083e1ecce9726d7554cb7", size = 226406, upload-time = "2025-08-12T15:11:49.445Z" },
- { url = "https://files.pythonhosted.org/packages/b0/a7/aa3c973de0b33fc93b4bd71691665ffdfeae589ea9d0625584ab10a7d0f5/orjson-3.11.2-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:15d17bdb76a142e1f55d91913e012e6e6769659daa6bfef3ef93f11083137e81", size = 115788, upload-time = "2025-08-12T15:11:50.992Z" },
- { url = "https://files.pythonhosted.org/packages/ef/f2/e45f233dfd09fdbb052ec46352363dca3906618e1a2b264959c18f809d0b/orjson-3.11.2-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:53c9e81768c69d4b66b8876ec3c8e431c6e13477186d0db1089d82622bccd19f", size = 111318, upload-time = "2025-08-12T15:11:52.495Z" },
- { url = "https://files.pythonhosted.org/packages/3e/23/cf5a73c4da6987204cbbf93167f353ff0c5013f7c5e5ef845d4663a366da/orjson-3.11.2-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d4f13af59a7b84c1ca6b8a7ab70d608f61f7c44f9740cd42409e6ae7b6c8d8b7", size = 121231, upload-time = "2025-08-12T15:11:53.941Z" },
- { url = "https://files.pythonhosted.org/packages/40/1d/47468a398ae68a60cc21e599144e786e035bb12829cb587299ecebc088f1/orjson-3.11.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bde64aa469b5ee46cc960ed241fae3721d6a8801dacb2ca3466547a2535951e4", size = 119204, upload-time = "2025-08-12T15:11:55.409Z" },
- { url = "https://files.pythonhosted.org/packages/4d/d9/f99433d89b288b5bc8836bffb32a643f805e673cf840ef8bab6e73ced0d1/orjson-3.11.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b5ca86300aeb383c8fa759566aca065878d3d98c3389d769b43f0a2e84d52c5f", size = 392237, upload-time = "2025-08-12T15:11:57.18Z" },
- { url = "https://files.pythonhosted.org/packages/d4/dc/1b9d80d40cebef603325623405136a29fb7d08c877a728c0943dd066c29a/orjson-3.11.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:24e32a558ebed73a6a71c8f1cbc163a7dd5132da5270ff3d8eeb727f4b6d1bc7", size = 134578, upload-time = "2025-08-12T15:11:58.844Z" },
- { url = "https://files.pythonhosted.org/packages/45/b3/72e7a4c5b6485ef4e83ef6aba7f1dd041002bad3eb5d1d106ca5b0fc02c6/orjson-3.11.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e36319a5d15b97e4344110517450396845cc6789aed712b1fbf83c1bd95792f6", size = 123799, upload-time = "2025-08-12T15:12:00.352Z" },
- { url = "https://files.pythonhosted.org/packages/c8/3e/a3d76b392e7acf9b34dc277171aad85efd6accc75089bb35b4c614990ea9/orjson-3.11.2-cp314-cp314-win32.whl", hash = "sha256:40193ada63fab25e35703454d65b6afc71dbc65f20041cb46c6d91709141ef7f", size = 124461, upload-time = "2025-08-12T15:12:01.854Z" },
- { url = "https://files.pythonhosted.org/packages/fb/e3/75c6a596ff8df9e4a5894813ff56695f0a218e6ea99420b4a645c4f7795d/orjson-3.11.2-cp314-cp314-win_amd64.whl", hash = "sha256:7c8ac5f6b682d3494217085cf04dadae66efee45349ad4ee2a1da3c97e2305a8", size = 119494, upload-time = "2025-08-12T15:12:03.337Z" },
- { url = "https://files.pythonhosted.org/packages/5b/3d/9e74742fc261c5ca473c96bb3344d03995869e1dc6402772c60afb97736a/orjson-3.11.2-cp314-cp314-win_arm64.whl", hash = "sha256:21cf261e8e79284242e4cb1e5924df16ae28255184aafeff19be1405f6d33f67", size = 114046, upload-time = "2025-08-12T15:12:04.87Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/64/4a3cef001c6cd9c64256348d4c13a7b09b857e3e1cbb5185917df67d8ced/orjson-3.11.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:29cb1f1b008d936803e2da3d7cba726fc47232c45df531b29edf0b232dd737e7", size = 238600, upload-time = "2025-08-26T17:44:36.875Z" },
+ { url = "https://files.pythonhosted.org/packages/10/ce/0c8c87f54f79d051485903dc46226c4d3220b691a151769156054df4562b/orjson-3.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97dceed87ed9139884a55db8722428e27bd8452817fbf1869c58b49fecab1120", size = 123526, upload-time = "2025-08-26T17:44:39.574Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/d0/249497e861f2d438f45b3ab7b7b361484237414945169aa285608f9f7019/orjson-3.11.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58533f9e8266cb0ac298e259ed7b4d42ed3fa0b78ce76860626164de49e0d467", size = 128075, upload-time = "2025-08-26T17:44:40.672Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/64/00485702f640a0fd56144042a1ea196469f4a3ae93681871564bf74fa996/orjson-3.11.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c212cfdd90512fe722fa9bd620de4d46cda691415be86b2e02243242ae81873", size = 130483, upload-time = "2025-08-26T17:44:41.788Z" },
+ { url = "https://files.pythonhosted.org/packages/64/81/110d68dba3909171bf3f05619ad0cf187b430e64045ae4e0aa7ccfe25b15/orjson-3.11.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff835b5d3e67d9207343effb03760c00335f8b5285bfceefd4dc967b0e48f6a", size = 132539, upload-time = "2025-08-26T17:44:43.12Z" },
+ { url = "https://files.pythonhosted.org/packages/79/92/dba25c22b0ddfafa1e6516a780a00abac28d49f49e7202eb433a53c3e94e/orjson-3.11.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5aa4682912a450c2db89cbd92d356fef47e115dffba07992555542f344d301b", size = 135390, upload-time = "2025-08-26T17:44:44.199Z" },
+ { url = "https://files.pythonhosted.org/packages/44/1d/ca2230fd55edbd87b58a43a19032d63a4b180389a97520cc62c535b726f9/orjson-3.11.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d18dd34ea2e860553a579df02041845dee0af8985dff7f8661306f95504ddf", size = 132966, upload-time = "2025-08-26T17:44:45.719Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/b9/96bbc8ed3e47e52b487d504bd6861798977445fbc410da6e87e302dc632d/orjson-3.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8b11701bc43be92ea42bd454910437b355dfb63696c06fe953ffb40b5f763b4", size = 131349, upload-time = "2025-08-26T17:44:46.862Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/3c/418fbd93d94b0df71cddf96b7fe5894d64a5d890b453ac365120daec30f7/orjson-3.11.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:90368277087d4af32d38bd55f9da2ff466d25325bf6167c8f382d8ee40cb2bbc", size = 404087, upload-time = "2025-08-26T17:44:48.079Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/a9/2bfd58817d736c2f63608dec0c34857339d423eeed30099b126562822191/orjson-3.11.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd7ff459fb393358d3a155d25b275c60b07a2c83dcd7ea962b1923f5a1134569", size = 146067, upload-time = "2025-08-26T17:44:49.302Z" },
+ { url = "https://files.pythonhosted.org/packages/33/ba/29023771f334096f564e48d82ed855a0ed3320389d6748a9c949e25be734/orjson-3.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f8d902867b699bcd09c176a280b1acdab57f924489033e53d0afe79817da37e6", size = 135506, upload-time = "2025-08-26T17:44:50.558Z" },
+ { url = "https://files.pythonhosted.org/packages/39/62/b5a1eca83f54cb3aa11a9645b8a22f08d97dbd13f27f83aae7c6666a0a05/orjson-3.11.3-cp310-cp310-win32.whl", hash = "sha256:bb93562146120bb51e6b154962d3dadc678ed0fce96513fa6bc06599bb6f6edc", size = 136352, upload-time = "2025-08-26T17:44:51.698Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/c0/7ebfaa327d9a9ed982adc0d9420dbce9a3fec45b60ab32c6308f731333fa/orjson-3.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:976c6f1975032cc327161c65d4194c549f2589d88b105a5e3499429a54479770", size = 131539, upload-time = "2025-08-26T17:44:52.974Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/8b/360674cd817faef32e49276187922a946468579fcaf37afdfb6c07046e92/orjson-3.11.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d2ae0cc6aeb669633e0124531f342a17d8e97ea999e42f12a5ad4adaa304c5f", size = 238238, upload-time = "2025-08-26T17:44:54.214Z" },
+ { url = "https://files.pythonhosted.org/packages/05/3d/5fa9ea4b34c1a13be7d9046ba98d06e6feb1d8853718992954ab59d16625/orjson-3.11.3-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ba21dbb2493e9c653eaffdc38819b004b7b1b246fb77bfc93dc016fe664eac91", size = 127713, upload-time = "2025-08-26T17:44:55.596Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/5f/e18367823925e00b1feec867ff5f040055892fc474bf5f7875649ecfa586/orjson-3.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f1a271e56d511d1569937c0447d7dce5a99a33ea0dec76673706360a051904", size = 123241, upload-time = "2025-08-26T17:44:57.185Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/bd/3c66b91c4564759cf9f473251ac1650e446c7ba92a7c0f9f56ed54f9f0e6/orjson-3.11.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b67e71e47caa6680d1b6f075a396d04fa6ca8ca09aafb428731da9b3ea32a5a6", size = 127895, upload-time = "2025-08-26T17:44:58.349Z" },
+ { url = "https://files.pythonhosted.org/packages/82/b5/dc8dcd609db4766e2967a85f63296c59d4722b39503e5b0bf7fd340d387f/orjson-3.11.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7d012ebddffcce8c85734a6d9e5f08180cd3857c5f5a3ac70185b43775d043d", size = 130303, upload-time = "2025-08-26T17:44:59.491Z" },
+ { url = "https://files.pythonhosted.org/packages/48/c2/d58ec5fd1270b2aa44c862171891adc2e1241bd7dab26c8f46eb97c6c6f1/orjson-3.11.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd759f75d6b8d1b62012b7f5ef9461d03c804f94d539a5515b454ba3a6588038", size = 132366, upload-time = "2025-08-26T17:45:00.654Z" },
+ { url = "https://files.pythonhosted.org/packages/73/87/0ef7e22eb8dd1ef940bfe3b9e441db519e692d62ed1aae365406a16d23d0/orjson-3.11.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6890ace0809627b0dff19cfad92d69d0fa3f089d3e359a2a532507bb6ba34efb", size = 135180, upload-time = "2025-08-26T17:45:02.424Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/6a/e5bf7b70883f374710ad74faf99bacfc4b5b5a7797c1d5e130350e0e28a3/orjson-3.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d4a5e041ae435b815e568537755773d05dac031fee6a57b4ba70897a44d9d2", size = 132741, upload-time = "2025-08-26T17:45:03.663Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/0c/4577fd860b6386ffaa56440e792af01c7882b56d2766f55384b5b0e9d39b/orjson-3.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d68bf97a771836687107abfca089743885fb664b90138d8761cce61d5625d55", size = 131104, upload-time = "2025-08-26T17:45:04.939Z" },
+ { url = "https://files.pythonhosted.org/packages/66/4b/83e92b2d67e86d1c33f2ea9411742a714a26de63641b082bdbf3d8e481af/orjson-3.11.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bfc27516ec46f4520b18ef645864cee168d2a027dbf32c5537cb1f3e3c22dac1", size = 403887, upload-time = "2025-08-26T17:45:06.228Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/e5/9eea6a14e9b5ceb4a271a1fd2e1dec5f2f686755c0fab6673dc6ff3433f4/orjson-3.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f66b001332a017d7945e177e282a40b6997056394e3ed7ddb41fb1813b83e824", size = 145855, upload-time = "2025-08-26T17:45:08.338Z" },
+ { url = "https://files.pythonhosted.org/packages/45/78/8d4f5ad0c80ba9bf8ac4d0fc71f93a7d0dc0844989e645e2074af376c307/orjson-3.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:212e67806525d2561efbfe9e799633b17eb668b8964abed6b5319b2f1cfbae1f", size = 135361, upload-time = "2025-08-26T17:45:09.625Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/5f/16386970370178d7a9b438517ea3d704efcf163d286422bae3b37b88dbb5/orjson-3.11.3-cp311-cp311-win32.whl", hash = "sha256:6e8e0c3b85575a32f2ffa59de455f85ce002b8bdc0662d6b9c2ed6d80ab5d204", size = 136190, upload-time = "2025-08-26T17:45:10.962Z" },
+ { url = "https://files.pythonhosted.org/packages/09/60/db16c6f7a41dd8ac9fb651f66701ff2aeb499ad9ebc15853a26c7c152448/orjson-3.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:6be2f1b5d3dc99a5ce5ce162fc741c22ba9f3443d3dd586e6a1211b7bc87bc7b", size = 131389, upload-time = "2025-08-26T17:45:12.285Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/2a/bb811ad336667041dea9b8565c7c9faf2f59b47eb5ab680315eea612ef2e/orjson-3.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:fafb1a99d740523d964b15c8db4eabbfc86ff29f84898262bf6e3e4c9e97e43e", size = 126120, upload-time = "2025-08-26T17:45:13.515Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/b0/a7edab2a00cdcb2688e1c943401cb3236323e7bfd2839815c6131a3742f4/orjson-3.11.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8c752089db84333e36d754c4baf19c0e1437012242048439c7e80eb0e6426e3b", size = 238259, upload-time = "2025-08-26T17:45:15.093Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/c6/ff4865a9cc398a07a83342713b5932e4dc3cb4bf4bc04e8f83dedfc0d736/orjson-3.11.3-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:9b8761b6cf04a856eb544acdd82fc594b978f12ac3602d6374a7edb9d86fd2c2", size = 127633, upload-time = "2025-08-26T17:45:16.417Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/e6/e00bea2d9472f44fe8794f523e548ce0ad51eb9693cf538a753a27b8bda4/orjson-3.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b13974dc8ac6ba22feaa867fc19135a3e01a134b4f7c9c28162fed4d615008a", size = 123061, upload-time = "2025-08-26T17:45:17.673Z" },
+ { url = "https://files.pythonhosted.org/packages/54/31/9fbb78b8e1eb3ac605467cb846e1c08d0588506028b37f4ee21f978a51d4/orjson-3.11.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f83abab5bacb76d9c821fd5c07728ff224ed0e52d7a71b7b3de822f3df04e15c", size = 127956, upload-time = "2025-08-26T17:45:19.172Z" },
+ { url = "https://files.pythonhosted.org/packages/36/88/b0604c22af1eed9f98d709a96302006915cfd724a7ebd27d6dd11c22d80b/orjson-3.11.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6fbaf48a744b94091a56c62897b27c31ee2da93d826aa5b207131a1e13d4064", size = 130790, upload-time = "2025-08-26T17:45:20.586Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/9d/1c1238ae9fffbfed51ba1e507731b3faaf6b846126a47e9649222b0fd06f/orjson-3.11.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc779b4f4bba2847d0d2940081a7b6f7b5877e05408ffbb74fa1faf4a136c424", size = 132385, upload-time = "2025-08-26T17:45:22.036Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/b5/c06f1b090a1c875f337e21dd71943bc9d84087f7cdf8c6e9086902c34e42/orjson-3.11.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd4b909ce4c50faa2192da6bb684d9848d4510b736b0611b6ab4020ea6fd2d23", size = 135305, upload-time = "2025-08-26T17:45:23.4Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/26/5f028c7d81ad2ebbf84414ba6d6c9cac03f22f5cd0d01eb40fb2d6a06b07/orjson-3.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524b765ad888dc5518bbce12c77c2e83dee1ed6b0992c1790cc5fb49bb4b6667", size = 132875, upload-time = "2025-08-26T17:45:25.182Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/d4/b8df70d9cfb56e385bf39b4e915298f9ae6c61454c8154a0f5fd7efcd42e/orjson-3.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:84fd82870b97ae3cdcea9d8746e592b6d40e1e4d4527835fc520c588d2ded04f", size = 130940, upload-time = "2025-08-26T17:45:27.209Z" },
+ { url = "https://files.pythonhosted.org/packages/da/5e/afe6a052ebc1a4741c792dd96e9f65bf3939d2094e8b356503b68d48f9f5/orjson-3.11.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fbecb9709111be913ae6879b07bafd4b0785b44c1eb5cac8ac76da048b3885a1", size = 403852, upload-time = "2025-08-26T17:45:28.478Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/90/7bbabafeb2ce65915e9247f14a56b29c9334003536009ef5b122783fe67e/orjson-3.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9dba358d55aee552bd868de348f4736ca5a4086d9a62e2bfbbeeb5629fe8b0cc", size = 146293, upload-time = "2025-08-26T17:45:29.86Z" },
+ { url = "https://files.pythonhosted.org/packages/27/b3/2d703946447da8b093350570644a663df69448c9d9330e5f1d9cce997f20/orjson-3.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eabcf2e84f1d7105f84580e03012270c7e97ecb1fb1618bda395061b2a84a049", size = 135470, upload-time = "2025-08-26T17:45:31.243Z" },
+ { url = "https://files.pythonhosted.org/packages/38/70/b14dcfae7aff0e379b0119c8a812f8396678919c431efccc8e8a0263e4d9/orjson-3.11.3-cp312-cp312-win32.whl", hash = "sha256:3782d2c60b8116772aea8d9b7905221437fdf53e7277282e8d8b07c220f96cca", size = 136248, upload-time = "2025-08-26T17:45:32.567Z" },
+ { url = "https://files.pythonhosted.org/packages/35/b8/9e3127d65de7fff243f7f3e53f59a531bf6bb295ebe5db024c2503cc0726/orjson-3.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:79b44319268af2eaa3e315b92298de9a0067ade6e6003ddaef72f8e0bedb94f1", size = 131437, upload-time = "2025-08-26T17:45:34.949Z" },
+ { url = "https://files.pythonhosted.org/packages/51/92/a946e737d4d8a7fd84a606aba96220043dcc7d6988b9e7551f7f6d5ba5ad/orjson-3.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:0e92a4e83341ef79d835ca21b8bd13e27c859e4e9e4d7b63defc6e58462a3710", size = 125978, upload-time = "2025-08-26T17:45:36.422Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/79/8932b27293ad35919571f77cb3693b5906cf14f206ef17546052a241fdf6/orjson-3.11.3-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:af40c6612fd2a4b00de648aa26d18186cd1322330bd3a3cc52f87c699e995810", size = 238127, upload-time = "2025-08-26T17:45:38.146Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/82/cb93cd8cf132cd7643b30b6c5a56a26c4e780c7a145db6f83de977b540ce/orjson-3.11.3-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:9f1587f26c235894c09e8b5b7636a38091a9e6e7fe4531937534749c04face43", size = 127494, upload-time = "2025-08-26T17:45:39.57Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/b8/2d9eb181a9b6bb71463a78882bcac1027fd29cf62c38a40cc02fc11d3495/orjson-3.11.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61dcdad16da5bb486d7227a37a2e789c429397793a6955227cedbd7252eb5a27", size = 123017, upload-time = "2025-08-26T17:45:40.876Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/14/a0e971e72d03b509190232356d54c0f34507a05050bd026b8db2bf2c192c/orjson-3.11.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c6d71478e2cbea0a709e8a06365fa63da81da6498a53e4c4f065881d21ae8f", size = 127898, upload-time = "2025-08-26T17:45:42.188Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/af/dc74536722b03d65e17042cc30ae586161093e5b1f29bccda24765a6ae47/orjson-3.11.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff94112e0098470b665cb0ed06efb187154b63649403b8d5e9aedeb482b4548c", size = 130742, upload-time = "2025-08-26T17:45:43.511Z" },
+ { url = "https://files.pythonhosted.org/packages/62/e6/7a3b63b6677bce089fe939353cda24a7679825c43a24e49f757805fc0d8a/orjson-3.11.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b756575aaa2a855a75192f356bbda11a89169830e1439cfb1a3e1a6dde7be", size = 132377, upload-time = "2025-08-26T17:45:45.525Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/cd/ce2ab93e2e7eaf518f0fd15e3068b8c43216c8a44ed82ac2b79ce5cef72d/orjson-3.11.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9416cc19a349c167ef76135b2fe40d03cea93680428efee8771f3e9fb66079d", size = 135313, upload-time = "2025-08-26T17:45:46.821Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/b4/f98355eff0bd1a38454209bbc73372ce351ba29933cb3e2eba16c04b9448/orjson-3.11.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b822caf5b9752bc6f246eb08124c3d12bf2175b66ab74bac2ef3bbf9221ce1b2", size = 132908, upload-time = "2025-08-26T17:45:48.126Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/92/8f5182d7bc2a1bed46ed960b61a39af8389f0ad476120cd99e67182bfb6d/orjson-3.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:414f71e3bdd5573893bf5ecdf35c32b213ed20aa15536fe2f588f946c318824f", size = 130905, upload-time = "2025-08-26T17:45:49.414Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/60/c41ca753ce9ffe3d0f67b9b4c093bdd6e5fdb1bc53064f992f66bb99954d/orjson-3.11.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:828e3149ad8815dc14468f36ab2a4b819237c155ee1370341b91ea4c8672d2ee", size = 403812, upload-time = "2025-08-26T17:45:51.085Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/13/e4a4f16d71ce1868860db59092e78782c67082a8f1dc06a3788aef2b41bc/orjson-3.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac9e05f25627ffc714c21f8dfe3a579445a5c392a9c8ae7ba1d0e9fb5333f56e", size = 146277, upload-time = "2025-08-26T17:45:52.851Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/8b/bafb7f0afef9344754a3a0597a12442f1b85a048b82108ef2c956f53babd/orjson-3.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e44fbe4000bd321d9f3b648ae46e0196d21577cf66ae684a96ff90b1f7c93633", size = 135418, upload-time = "2025-08-26T17:45:54.806Z" },
+ { url = "https://files.pythonhosted.org/packages/60/d4/bae8e4f26afb2c23bea69d2f6d566132584d1c3a5fe89ee8c17b718cab67/orjson-3.11.3-cp313-cp313-win32.whl", hash = "sha256:2039b7847ba3eec1f5886e75e6763a16e18c68a63efc4b029ddf994821e2e66b", size = 136216, upload-time = "2025-08-26T17:45:57.182Z" },
+ { url = "https://files.pythonhosted.org/packages/88/76/224985d9f127e121c8cad882cea55f0ebe39f97925de040b75ccd4b33999/orjson-3.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:29be5ac4164aa8bdcba5fa0700a3c9c316b411d8ed9d39ef8a882541bd452fae", size = 131362, upload-time = "2025-08-26T17:45:58.56Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/cf/0dce7a0be94bd36d1346be5067ed65ded6adb795fdbe3abd234c8d576d01/orjson-3.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:18bd1435cb1f2857ceb59cfb7de6f92593ef7b831ccd1b9bfb28ca530e539dce", size = 125989, upload-time = "2025-08-26T17:45:59.95Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/77/d3b1fef1fc6aaeed4cbf3be2b480114035f4df8fa1a99d2dac1d40d6e924/orjson-3.11.3-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cf4b81227ec86935568c7edd78352a92e97af8da7bd70bdfdaa0d2e0011a1ab4", size = 238115, upload-time = "2025-08-26T17:46:01.669Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/6d/468d21d49bb12f900052edcfbf52c292022d0a323d7828dc6376e6319703/orjson-3.11.3-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:bc8bc85b81b6ac9fc4dae393a8c159b817f4c2c9dee5d12b773bddb3b95fc07e", size = 127493, upload-time = "2025-08-26T17:46:03.466Z" },
+ { url = "https://files.pythonhosted.org/packages/67/46/1e2588700d354aacdf9e12cc2d98131fb8ac6f31ca65997bef3863edb8ff/orjson-3.11.3-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:88dcfc514cfd1b0de038443c7b3e6a9797ffb1b3674ef1fd14f701a13397f82d", size = 122998, upload-time = "2025-08-26T17:46:04.803Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/94/11137c9b6adb3779f1b34fd98be51608a14b430dbc02c6d41134fbba484c/orjson-3.11.3-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d61cd543d69715d5fc0a690c7c6f8dcc307bc23abef9738957981885f5f38229", size = 132915, upload-time = "2025-08-26T17:46:06.237Z" },
+ { url = "https://files.pythonhosted.org/packages/10/61/dccedcf9e9bcaac09fdabe9eaee0311ca92115699500efbd31950d878833/orjson-3.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2b7b153ed90ababadbef5c3eb39549f9476890d339cf47af563aea7e07db2451", size = 130907, upload-time = "2025-08-26T17:46:07.581Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/fd/0e935539aa7b08b3ca0f817d73034f7eb506792aae5ecc3b7c6e679cdf5f/orjson-3.11.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7909ae2460f5f494fecbcd10613beafe40381fd0316e35d6acb5f3a05bfda167", size = 403852, upload-time = "2025-08-26T17:46:08.982Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/2b/50ae1a5505cd1043379132fdb2adb8a05f37b3e1ebffe94a5073321966fd/orjson-3.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2030c01cbf77bc67bee7eef1e7e31ecf28649353987775e3583062c752da0077", size = 146309, upload-time = "2025-08-26T17:46:10.576Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/1d/a473c158e380ef6f32753b5f39a69028b25ec5be331c2049a2201bde2e19/orjson-3.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0169ebd1cbd94b26c7a7ad282cf5c2744fce054133f959e02eb5265deae1872", size = 135424, upload-time = "2025-08-26T17:46:12.386Z" },
+ { url = "https://files.pythonhosted.org/packages/da/09/17d9d2b60592890ff7382e591aa1d9afb202a266b180c3d4049b1ec70e4a/orjson-3.11.3-cp314-cp314-win32.whl", hash = "sha256:0c6d7328c200c349e3a4c6d8c83e0a5ad029bdc2d417f234152bf34842d0fc8d", size = 136266, upload-time = "2025-08-26T17:46:13.853Z" },
+ { url = "https://files.pythonhosted.org/packages/15/58/358f6846410a6b4958b74734727e582ed971e13d335d6c7ce3e47730493e/orjson-3.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:317bbe2c069bbc757b1a2e4105b64aacd3bc78279b66a6b9e51e846e4809f804", size = 131351, upload-time = "2025-08-26T17:46:15.27Z" },
+ { url = "https://files.pythonhosted.org/packages/28/01/d6b274a0635be0468d4dbd9cafe80c47105937a0d42434e805e67cd2ed8b/orjson-3.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:e8f6a7a27d7b7bec81bd5924163e9af03d49bbb63013f107b48eb5d16db711bc", size = 125985, upload-time = "2025-08-26T17:46:16.67Z" },
]
[[package]]
@@ -2202,7 +2231,7 @@ wheels = [
[[package]]
name = "pytest"
-version = "8.4.1"
+version = "8.4.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
@@ -2213,9 +2242,9 @@ dependencies = [
{ name = "pygments" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
]
[[package]]
@@ -2233,28 +2262,28 @@ wheels = [
[[package]]
name = "pytest-cov"
-version = "6.2.1"
+version = "7.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "coverage", extra = ["toml"] },
{ name = "pluggy" },
{ name = "pytest" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload-time = "2025-06-12T10:47:47.684Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload-time = "2025-06-12T10:47:45.932Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" },
]
[[package]]
name = "pytest-mock"
-version = "3.14.1"
+version = "3.15.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytest" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/71/28/67172c96ba684058a4d24ffe144d64783d2a270d0af0d9e792737bddc75c/pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e", size = 33241, upload-time = "2025-05-26T13:58:45.167Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/61/99/3323ee5c16b3637b4d941c362182d3e749c11e400bea31018c42219f3a98/pytest_mock-3.15.0.tar.gz", hash = "sha256:ab896bd190316b9d5d87b277569dfcdf718b2d049a2ccff5f7aca279c002a1cf", size = 33838, upload-time = "2025-09-04T20:57:48.679Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b2/05/77b60e520511c53d1c1ca75f1930c7dd8e971d0c4379b7f4b3f9644685ba/pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0", size = 9923, upload-time = "2025-05-26T13:58:43.487Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/b3/7fefc43fb706380144bcd293cc6e446e6f637ddfa8b83f48d1734156b529/pytest_mock-3.15.0-py3-none-any.whl", hash = "sha256:ef2219485fb1bd256b00e7ad7466ce26729b30eadfc7cbcdb4fa9a92ca68db6f", size = 10050, upload-time = "2025-09-04T20:57:47.274Z" },
]
[[package]]
@@ -2530,27 +2559,28 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.12.8"
+version = "0.13.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/4b/da/5bd7565be729e86e1442dad2c9a364ceeff82227c2dece7c29697a9795eb/ruff-0.12.8.tar.gz", hash = "sha256:4cb3a45525176e1009b2b64126acf5f9444ea59066262791febf55e40493a033", size = 5242373, upload-time = "2025-08-07T19:05:47.268Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/6e/1a/1f4b722862840295bcaba8c9e5261572347509548faaa99b2d57ee7bfe6a/ruff-0.13.0.tar.gz", hash = "sha256:5b4b1ee7eb35afae128ab94459b13b2baaed282b1fb0f472a73c82c996c8ae60", size = 5372863, upload-time = "2025-09-10T16:25:37.917Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c9/1e/c843bfa8ad1114fab3eb2b78235dda76acd66384c663a4e0415ecc13aa1e/ruff-0.12.8-py3-none-linux_armv6l.whl", hash = "sha256:63cb5a5e933fc913e5823a0dfdc3c99add73f52d139d6cd5cc8639d0e0465513", size = 11675315, upload-time = "2025-08-07T19:05:06.15Z" },
- { url = "https://files.pythonhosted.org/packages/24/ee/af6e5c2a8ca3a81676d5480a1025494fd104b8896266502bb4de2a0e8388/ruff-0.12.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9a9bbe28f9f551accf84a24c366c1aa8774d6748438b47174f8e8565ab9dedbc", size = 12456653, upload-time = "2025-08-07T19:05:09.759Z" },
- { url = "https://files.pythonhosted.org/packages/99/9d/e91f84dfe3866fa648c10512904991ecc326fd0b66578b324ee6ecb8f725/ruff-0.12.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2fae54e752a3150f7ee0e09bce2e133caf10ce9d971510a9b925392dc98d2fec", size = 11659690, upload-time = "2025-08-07T19:05:12.551Z" },
- { url = "https://files.pythonhosted.org/packages/fe/ac/a363d25ec53040408ebdd4efcee929d48547665858ede0505d1d8041b2e5/ruff-0.12.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0acbcf01206df963d9331b5838fb31f3b44fa979ee7fa368b9b9057d89f4a53", size = 11896923, upload-time = "2025-08-07T19:05:14.821Z" },
- { url = "https://files.pythonhosted.org/packages/58/9f/ea356cd87c395f6ade9bb81365bd909ff60860975ca1bc39f0e59de3da37/ruff-0.12.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae3e7504666ad4c62f9ac8eedb52a93f9ebdeb34742b8b71cd3cccd24912719f", size = 11477612, upload-time = "2025-08-07T19:05:16.712Z" },
- { url = "https://files.pythonhosted.org/packages/1a/46/92e8fa3c9dcfd49175225c09053916cb97bb7204f9f899c2f2baca69e450/ruff-0.12.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb82efb5d35d07497813a1c5647867390a7d83304562607f3579602fa3d7d46f", size = 13182745, upload-time = "2025-08-07T19:05:18.709Z" },
- { url = "https://files.pythonhosted.org/packages/5e/c4/f2176a310f26e6160deaf661ef60db6c3bb62b7a35e57ae28f27a09a7d63/ruff-0.12.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dbea798fc0065ad0b84a2947b0aff4233f0cb30f226f00a2c5850ca4393de609", size = 14206885, upload-time = "2025-08-07T19:05:21.025Z" },
- { url = "https://files.pythonhosted.org/packages/87/9d/98e162f3eeeb6689acbedbae5050b4b3220754554526c50c292b611d3a63/ruff-0.12.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49ebcaccc2bdad86fd51b7864e3d808aad404aab8df33d469b6e65584656263a", size = 13639381, upload-time = "2025-08-07T19:05:23.423Z" },
- { url = "https://files.pythonhosted.org/packages/81/4e/1b7478b072fcde5161b48f64774d6edd59d6d198e4ba8918d9f4702b8043/ruff-0.12.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ac9c570634b98c71c88cb17badd90f13fc076a472ba6ef1d113d8ed3df109fb", size = 12613271, upload-time = "2025-08-07T19:05:25.507Z" },
- { url = "https://files.pythonhosted.org/packages/e8/67/0c3c9179a3ad19791ef1b8f7138aa27d4578c78700551c60d9260b2c660d/ruff-0.12.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:560e0cd641e45591a3e42cb50ef61ce07162b9c233786663fdce2d8557d99818", size = 12847783, upload-time = "2025-08-07T19:05:28.14Z" },
- { url = "https://files.pythonhosted.org/packages/4e/2a/0b6ac3dd045acf8aa229b12c9c17bb35508191b71a14904baf99573a21bd/ruff-0.12.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:71c83121512e7743fba5a8848c261dcc454cafb3ef2934a43f1b7a4eb5a447ea", size = 11702672, upload-time = "2025-08-07T19:05:30.413Z" },
- { url = "https://files.pythonhosted.org/packages/9d/ee/f9fdc9f341b0430110de8b39a6ee5fa68c5706dc7c0aa940817947d6937e/ruff-0.12.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:de4429ef2ba091ecddedd300f4c3f24bca875d3d8b23340728c3cb0da81072c3", size = 11440626, upload-time = "2025-08-07T19:05:32.492Z" },
- { url = "https://files.pythonhosted.org/packages/89/fb/b3aa2d482d05f44e4d197d1de5e3863feb13067b22c571b9561085c999dc/ruff-0.12.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a2cab5f60d5b65b50fba39a8950c8746df1627d54ba1197f970763917184b161", size = 12462162, upload-time = "2025-08-07T19:05:34.449Z" },
- { url = "https://files.pythonhosted.org/packages/18/9f/5c5d93e1d00d854d5013c96e1a92c33b703a0332707a7cdbd0a4880a84fb/ruff-0.12.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:45c32487e14f60b88aad6be9fd5da5093dbefb0e3e1224131cb1d441d7cb7d46", size = 12913212, upload-time = "2025-08-07T19:05:36.541Z" },
- { url = "https://files.pythonhosted.org/packages/71/13/ab9120add1c0e4604c71bfc2e4ef7d63bebece0cfe617013da289539cef8/ruff-0.12.8-py3-none-win32.whl", hash = "sha256:daf3475060a617fd5bc80638aeaf2f5937f10af3ec44464e280a9d2218e720d3", size = 11694382, upload-time = "2025-08-07T19:05:38.468Z" },
- { url = "https://files.pythonhosted.org/packages/f6/dc/a2873b7c5001c62f46266685863bee2888caf469d1edac84bf3242074be2/ruff-0.12.8-py3-none-win_amd64.whl", hash = "sha256:7209531f1a1fcfbe8e46bcd7ab30e2f43604d8ba1c49029bb420b103d0b5f76e", size = 12740482, upload-time = "2025-08-07T19:05:40.391Z" },
- { url = "https://files.pythonhosted.org/packages/cb/5c/799a1efb8b5abab56e8a9f2a0b72d12bd64bb55815e9476c7d0a2887d2f7/ruff-0.12.8-py3-none-win_arm64.whl", hash = "sha256:c90e1a334683ce41b0e7a04f41790c429bf5073b62c1ae701c9dc5b3d14f0749", size = 11884718, upload-time = "2025-08-07T19:05:42.866Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/fe/6f87b419dbe166fd30a991390221f14c5b68946f389ea07913e1719741e0/ruff-0.13.0-py3-none-linux_armv6l.whl", hash = "sha256:137f3d65d58ee828ae136a12d1dc33d992773d8f7644bc6b82714570f31b2004", size = 12187826, upload-time = "2025-09-10T16:24:39.5Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/25/c92296b1fc36d2499e12b74a3fdb230f77af7bdf048fad7b0a62e94ed56a/ruff-0.13.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:21ae48151b66e71fd111b7d79f9ad358814ed58c339631450c66a4be33cc28b9", size = 12933428, upload-time = "2025-09-10T16:24:43.866Z" },
+ { url = "https://files.pythonhosted.org/packages/44/cf/40bc7221a949470307d9c35b4ef5810c294e6cfa3caafb57d882731a9f42/ruff-0.13.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:64de45f4ca5441209e41742d527944635a05a6e7c05798904f39c85bafa819e3", size = 12095543, upload-time = "2025-09-10T16:24:46.638Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/03/8b5ff2a211efb68c63a1d03d157e924997ada87d01bebffbd13a0f3fcdeb/ruff-0.13.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2c653ae9b9d46e0ef62fc6fbf5b979bda20a0b1d2b22f8f7eb0cde9f4963b8", size = 12312489, upload-time = "2025-09-10T16:24:49.556Z" },
+ { url = "https://files.pythonhosted.org/packages/37/fc/2336ef6d5e9c8d8ea8305c5f91e767d795cd4fc171a6d97ef38a5302dadc/ruff-0.13.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cec632534332062bc9eb5884a267b689085a1afea9801bf94e3ba7498a2d207", size = 11991631, upload-time = "2025-09-10T16:24:53.439Z" },
+ { url = "https://files.pythonhosted.org/packages/39/7f/f6d574d100fca83d32637d7f5541bea2f5e473c40020bbc7fc4a4d5b7294/ruff-0.13.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcd628101d9f7d122e120ac7c17e0a0f468b19bc925501dbe03c1cb7f5415b24", size = 13720602, upload-time = "2025-09-10T16:24:56.392Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/c8/a8a5b81d8729b5d1f663348d11e2a9d65a7a9bd3c399763b1a51c72be1ce/ruff-0.13.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afe37db8e1466acb173bb2a39ca92df00570e0fd7c94c72d87b51b21bb63efea", size = 14697751, upload-time = "2025-09-10T16:24:59.89Z" },
+ { url = "https://files.pythonhosted.org/packages/57/f5/183ec292272ce7ec5e882aea74937f7288e88ecb500198b832c24debc6d3/ruff-0.13.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f96a8d90bb258d7d3358b372905fe7333aaacf6c39e2408b9f8ba181f4b6ef2", size = 14095317, upload-time = "2025-09-10T16:25:03.025Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/8d/7f9771c971724701af7926c14dab31754e7b303d127b0d3f01116faef456/ruff-0.13.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b5e3d883e4f924c5298e3f2ee0f3085819c14f68d1e5b6715597681433f153", size = 13144418, upload-time = "2025-09-10T16:25:06.272Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/a6/7985ad1778e60922d4bef546688cd8a25822c58873e9ff30189cfe5dc4ab/ruff-0.13.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03447f3d18479df3d24917a92d768a89f873a7181a064858ea90a804a7538991", size = 13370843, upload-time = "2025-09-10T16:25:09.965Z" },
+ { url = "https://files.pythonhosted.org/packages/64/1c/bafdd5a7a05a50cc51d9f5711da704942d8dd62df3d8c70c311e98ce9f8a/ruff-0.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fbc6b1934eb1c0033da427c805e27d164bb713f8e273a024a7e86176d7f462cf", size = 13321891, upload-time = "2025-09-10T16:25:12.969Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/3e/7817f989cb9725ef7e8d2cee74186bf90555279e119de50c750c4b7a72fe/ruff-0.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a8ab6a3e03665d39d4a25ee199d207a488724f022db0e1fe4002968abdb8001b", size = 12119119, upload-time = "2025-09-10T16:25:16.621Z" },
+ { url = "https://files.pythonhosted.org/packages/58/07/9df080742e8d1080e60c426dce6e96a8faf9a371e2ce22eef662e3839c95/ruff-0.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2a5c62f8ccc6dd2fe259917482de7275cecc86141ee10432727c4816235bc41", size = 11961594, upload-time = "2025-09-10T16:25:19.49Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/f4/ae1185349197d26a2316840cb4d6c3fba61d4ac36ed728bf0228b222d71f/ruff-0.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b7b85ca27aeeb1ab421bc787009831cffe6048faae08ad80867edab9f2760945", size = 12933377, upload-time = "2025-09-10T16:25:22.371Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/39/e776c10a3b349fc8209a905bfb327831d7516f6058339a613a8d2aaecacd/ruff-0.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:79ea0c44a3032af768cabfd9616e44c24303af49d633b43e3a5096e009ebe823", size = 13418555, upload-time = "2025-09-10T16:25:25.681Z" },
+ { url = "https://files.pythonhosted.org/packages/46/09/dca8df3d48e8b3f4202bf20b1658898e74b6442ac835bfe2c1816d926697/ruff-0.13.0-py3-none-win32.whl", hash = "sha256:4e473e8f0e6a04e4113f2e1de12a5039579892329ecc49958424e5568ef4f768", size = 12141613, upload-time = "2025-09-10T16:25:28.664Z" },
+ { url = "https://files.pythonhosted.org/packages/61/21/0647eb71ed99b888ad50e44d8ec65d7148babc0e242d531a499a0bbcda5f/ruff-0.13.0-py3-none-win_amd64.whl", hash = "sha256:48e5c25c7a3713eea9ce755995767f4dcd1b0b9599b638b12946e892123d1efb", size = 13258250, upload-time = "2025-09-10T16:25:31.773Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/a3/03216a6a86c706df54422612981fb0f9041dbb452c3401501d4a22b942c9/ruff-0.13.0-py3-none-win_arm64.whl", hash = "sha256:ab80525317b1e1d38614addec8ac954f1b3e662de9d59114ecbf771d00cf613e", size = 12312357, upload-time = "2025-09-10T16:25:35.595Z" },
]
[[package]]
@@ -2873,27 +2903,27 @@ wheels = [
[[package]]
name = "tokenizers"
-version = "0.21.4"
+version = "0.22.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huggingface-hub" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c2/2f/402986d0823f8d7ca139d969af2917fefaa9b947d1fb32f6168c509f2492/tokenizers-0.21.4.tar.gz", hash = "sha256:fa23f85fbc9a02ec5c6978da172cdcbac23498c3ca9f3645c5c68740ac007880", size = 351253, upload-time = "2025-07-28T15:48:54.325Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/5e/b4/c1ce3699e81977da2ace8b16d2badfd42b060e7d33d75c4ccdbf9dc920fa/tokenizers-0.22.0.tar.gz", hash = "sha256:2e33b98525be8453f355927f3cab312c36cd3e44f4d7e9e97da2fa94d0a49dcb", size = 362771, upload-time = "2025-08-29T10:25:33.914Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/98/c6/fdb6f72bf6454f52eb4a2510be7fb0f614e541a2554d6210e370d85efff4/tokenizers-0.21.4-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ccc10a7c3bcefe0f242867dc914fc1226ee44321eb618cfe3019b5df3400133", size = 2863987, upload-time = "2025-07-28T15:48:44.877Z" },
- { url = "https://files.pythonhosted.org/packages/8d/a6/28975479e35ddc751dc1ddc97b9b69bf7fcf074db31548aab37f8116674c/tokenizers-0.21.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:5e2f601a8e0cd5be5cc7506b20a79112370b9b3e9cb5f13f68ab11acd6ca7d60", size = 2732457, upload-time = "2025-07-28T15:48:43.265Z" },
- { url = "https://files.pythonhosted.org/packages/aa/8f/24f39d7b5c726b7b0be95dca04f344df278a3fe3a4deb15a975d194cbb32/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b376f5a1aee67b4d29032ee85511bbd1b99007ec735f7f35c8a2eb104eade5", size = 3012624, upload-time = "2025-07-28T13:22:43.895Z" },
- { url = "https://files.pythonhosted.org/packages/58/47/26358925717687a58cb74d7a508de96649544fad5778f0cd9827398dc499/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2107ad649e2cda4488d41dfd031469e9da3fcbfd6183e74e4958fa729ffbf9c6", size = 2939681, upload-time = "2025-07-28T13:22:47.499Z" },
- { url = "https://files.pythonhosted.org/packages/99/6f/cc300fea5db2ab5ddc2c8aea5757a27b89c84469899710c3aeddc1d39801/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c73012da95afafdf235ba80047699df4384fdc481527448a078ffd00e45a7d9", size = 3247445, upload-time = "2025-07-28T15:48:39.711Z" },
- { url = "https://files.pythonhosted.org/packages/be/bf/98cb4b9c3c4afd8be89cfa6423704337dc20b73eb4180397a6e0d456c334/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f23186c40395fc390d27f519679a58023f368a0aad234af145e0f39ad1212732", size = 3428014, upload-time = "2025-07-28T13:22:49.569Z" },
- { url = "https://files.pythonhosted.org/packages/75/c7/96c1cc780e6ca7f01a57c13235dd05b7bc1c0f3588512ebe9d1331b5f5ae/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc88bb34e23a54cc42713d6d98af5f1bf79c07653d24fe984d2d695ba2c922a2", size = 3193197, upload-time = "2025-07-28T13:22:51.471Z" },
- { url = "https://files.pythonhosted.org/packages/f2/90/273b6c7ec78af547694eddeea9e05de771278bd20476525ab930cecaf7d8/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b7eabb104f46c1c50b486520555715457ae833d5aee9ff6ae853d1130506ff", size = 3115426, upload-time = "2025-07-28T15:48:41.439Z" },
- { url = "https://files.pythonhosted.org/packages/91/43/c640d5a07e95f1cf9d2c92501f20a25f179ac53a4f71e1489a3dcfcc67ee/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:714b05b2e1af1288bd1bc56ce496c4cebb64a20d158ee802887757791191e6e2", size = 9089127, upload-time = "2025-07-28T15:48:46.472Z" },
- { url = "https://files.pythonhosted.org/packages/44/a1/dd23edd6271d4dca788e5200a807b49ec3e6987815cd9d0a07ad9c96c7c2/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1340ff877ceedfa937544b7d79f5b7becf33a4cfb58f89b3b49927004ef66f78", size = 9055243, upload-time = "2025-07-28T15:48:48.539Z" },
- { url = "https://files.pythonhosted.org/packages/21/2b/b410d6e9021c4b7ddb57248304dc817c4d4970b73b6ee343674914701197/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3c1f4317576e465ac9ef0d165b247825a2a4078bcd01cba6b54b867bdf9fdd8b", size = 9298237, upload-time = "2025-07-28T15:48:50.443Z" },
- { url = "https://files.pythonhosted.org/packages/b7/0a/42348c995c67e2e6e5c89ffb9cfd68507cbaeb84ff39c49ee6e0a6dd0fd2/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c212aa4e45ec0bb5274b16b6f31dd3f1c41944025c2358faaa5782c754e84c24", size = 9461980, upload-time = "2025-07-28T15:48:52.325Z" },
- { url = "https://files.pythonhosted.org/packages/3d/d3/dacccd834404cd71b5c334882f3ba40331ad2120e69ded32cf5fda9a7436/tokenizers-0.21.4-cp39-abi3-win32.whl", hash = "sha256:6c42a930bc5f4c47f4ea775c91de47d27910881902b0f20e4990ebe045a415d0", size = 2329871, upload-time = "2025-07-28T15:48:56.841Z" },
- { url = "https://files.pythonhosted.org/packages/41/f2/fd673d979185f5dcbac4be7d09461cbb99751554ffb6718d0013af8604cb/tokenizers-0.21.4-cp39-abi3-win_amd64.whl", hash = "sha256:475d807a5c3eb72c59ad9b5fcdb254f6e17f53dfcbb9903233b0dfa9c943b597", size = 2507568, upload-time = "2025-07-28T15:48:55.456Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/b1/18c13648edabbe66baa85fe266a478a7931ddc0cd1ba618802eb7b8d9865/tokenizers-0.22.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:eaa9620122a3fb99b943f864af95ed14c8dfc0f47afa3b404ac8c16b3f2bb484", size = 3081954, upload-time = "2025-08-29T10:25:24.993Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/02/c3c454b641bd7c4f79e4464accfae9e7dfc913a777d2e561e168ae060362/tokenizers-0.22.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:71784b9ab5bf0ff3075bceeb198149d2c5e068549c0d18fe32d06ba0deb63f79", size = 2945644, upload-time = "2025-08-29T10:25:23.405Z" },
+ { url = "https://files.pythonhosted.org/packages/55/02/d10185ba2fd8c2d111e124c9d92de398aee0264b35ce433f79fb8472f5d0/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec5b71f668a8076802b0241a42387d48289f25435b86b769ae1837cad4172a17", size = 3254764, upload-time = "2025-08-29T10:25:12.445Z" },
+ { url = "https://files.pythonhosted.org/packages/13/89/17514bd7ef4bf5bfff58e2b131cec0f8d5cea2b1c8ffe1050a2c8de88dbb/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ea8562fa7498850d02a16178105b58803ea825b50dc9094d60549a7ed63654bb", size = 3161654, upload-time = "2025-08-29T10:25:15.493Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/d8/bac9f3a7ef6dcceec206e3857c3b61bb16c6b702ed7ae49585f5bd85c0ef/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4136e1558a9ef2e2f1de1555dcd573e1cbc4a320c1a06c4107a3d46dc8ac6e4b", size = 3511484, upload-time = "2025-08-29T10:25:20.477Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/27/9c9800eb6763683010a4851db4d1802d8cab9cec114c17056eccb4d4a6e0/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf5954de3962a5fd9781dc12048d24a1a6f1f5df038c6e95db328cd22964206", size = 3712829, upload-time = "2025-08-29T10:25:17.154Z" },
+ { url = "https://files.pythonhosted.org/packages/10/e3/b1726dbc1f03f757260fa21752e1921445b5bc350389a8314dd3338836db/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8337ca75d0731fc4860e6204cc24bb36a67d9736142aa06ed320943b50b1e7ed", size = 3408934, upload-time = "2025-08-29T10:25:18.76Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/61/aeab3402c26874b74bb67a7f2c4b569dde29b51032c5384db592e7b216f4/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a89264e26f63c449d8cded9061adea7b5de53ba2346fc7e87311f7e4117c1cc8", size = 3345585, upload-time = "2025-08-29T10:25:22.08Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/d3/498b4a8a8764cce0900af1add0f176ff24f475d4413d55b760b8cdf00893/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:790bad50a1b59d4c21592f9c3cf5e5cf9c3c7ce7e1a23a739f13e01fb1be377a", size = 9322986, upload-time = "2025-08-29T10:25:26.607Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/62/92378eb1c2c565837ca3cb5f9569860d132ab9d195d7950c1ea2681dffd0/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:76cf6757c73a10ef10bf06fa937c0ec7393d90432f543f49adc8cab3fb6f26cb", size = 9276630, upload-time = "2025-08-29T10:25:28.349Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/f0/342d80457aa1cda7654327460f69db0d69405af1e4c453f4dc6ca7c4a76e/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:1626cb186e143720c62c6c6b5371e62bbc10af60481388c0da89bc903f37ea0c", size = 9547175, upload-time = "2025-08-29T10:25:29.989Z" },
+ { url = "https://files.pythonhosted.org/packages/14/84/8aa9b4adfc4fbd09381e20a5bc6aa27040c9c09caa89988c01544e008d18/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:da589a61cbfea18ae267723d6b029b84598dc8ca78db9951d8f5beff72d8507c", size = 9692735, upload-time = "2025-08-29T10:25:32.089Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/24/83ee2b1dc76bfe05c3142e7d0ccdfe69f0ad2f1ebf6c726cea7f0874c0d0/tokenizers-0.22.0-cp39-abi3-win32.whl", hash = "sha256:dbf9d6851bddae3e046fedfb166f47743c1c7bd11c640f0691dd35ef0bcad3be", size = 2471915, upload-time = "2025-08-29T10:25:36.411Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/9b/0e0bf82214ee20231845b127aa4a8015936ad5a46779f30865d10e404167/tokenizers-0.22.0-cp39-abi3-win_amd64.whl", hash = "sha256:c78174859eeaee96021f248a56c801e36bfb6bd5b067f2e95aa82445ca324f00", size = 2680494, upload-time = "2025-08-29T10:25:35.14Z" },
]
[[package]]
@@ -2919,11 +2949,11 @@ wheels = [
[[package]]
name = "types-pyyaml"
-version = "6.0.12.20250809"
+version = "6.0.12.20250822"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/36/21/52ffdbddea3c826bc2758d811ccd7f766912de009c5cf096bd5ebba44680/types_pyyaml-6.0.12.20250809.tar.gz", hash = "sha256:af4a1aca028f18e75297da2ee0da465f799627370d74073e96fee876524f61b5", size = 17385, upload-time = "2025-08-09T03:14:34.867Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/49/85/90a442e538359ab5c9e30de415006fb22567aa4301c908c09f19e42975c2/types_pyyaml-6.0.12.20250822.tar.gz", hash = "sha256:259f1d93079d335730a9db7cff2bcaf65d7e04b4a56b5927d49a612199b59413", size = 17481, upload-time = "2025-08-22T03:02:16.209Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/35/3e/0346d09d6e338401ebf406f12eaf9d0b54b315b86f1ec29e34f1a0aedae9/types_pyyaml-6.0.12.20250809-py3-none-any.whl", hash = "sha256:032b6003b798e7de1a1ddfeefee32fac6486bdfe4845e0ae0e7fb3ee4512b52f", size = 20277, upload-time = "2025-08-09T03:14:34.055Z" },
+ { url = "https://files.pythonhosted.org/packages/32/8e/8f0aca667c97c0d76024b37cffa39e76e2ce39ca54a38f285a64e6ae33ba/types_pyyaml-6.0.12.20250822-py3-none-any.whl", hash = "sha256:1fe1a5e146aa315483592d292b72a172b65b946a6d98aa6ddd8e4aa838ab7098", size = 20314, upload-time = "2025-08-22T03:02:15.002Z" },
]
[[package]]
@@ -2940,29 +2970,29 @@ wheels = [
[[package]]
name = "types-setuptools"
-version = "80.9.0.20250809"
+version = "80.9.0.20250822"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/43/4f/d78a04083ee3cc0a7c14406afb2f1e7b63e70da95b777571d665d89b1765/types_setuptools-80.9.0.20250809.tar.gz", hash = "sha256:e986ba37ffde364073d76189e1d79d9928fb6f5278c7d07589cde353d0218864", size = 41209, upload-time = "2025-08-09T03:14:24.977Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/19/bd/1e5f949b7cb740c9f0feaac430e301b8f1c5f11a81e26324299ea671a237/types_setuptools-80.9.0.20250822.tar.gz", hash = "sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965", size = 41296, upload-time = "2025-08-22T03:02:08.771Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ca/1d/ad4fd409b377904324cbd2dc3a11e29ba13e2cf603c5a14cd88a35da5be0/types_setuptools-80.9.0.20250809-py3-none-any.whl", hash = "sha256:7c6539b4c7ac7b4ab4db2be66d8a58fb1e28affa3ee3834be48acafd94f5976a", size = 63160, upload-time = "2025-08-09T03:14:23.639Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/2d/475bf15c1cdc172e7a0d665b6e373ebfb1e9bf734d3f2f543d668b07a142/types_setuptools-80.9.0.20250822-py3-none-any.whl", hash = "sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3", size = 63179, upload-time = "2025-08-22T03:02:07.643Z" },
]
[[package]]
name = "types-simplejson"
-version = "3.20.0.20250326"
+version = "3.20.0.20250822"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/af/14/e26fc55e1ea56f9ea470917d3e2f8240e6d043ca914181021d04115ae0f7/types_simplejson-3.20.0.20250326.tar.gz", hash = "sha256:b2689bc91e0e672d7a5a947b4cb546b76ae7ddc2899c6678e72a10bf96cd97d2", size = 10489, upload-time = "2025-03-26T02:53:35.825Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/df/6b/96d43a90cd202bd552cdd871858a11c138fe5ef11aeb4ed8e8dc51389257/types_simplejson-3.20.0.20250822.tar.gz", hash = "sha256:2b0bfd57a6beed3b932fd2c3c7f8e2f48a7df3978c9bba43023a32b3741a95b0", size = 10608, upload-time = "2025-08-22T03:03:35.36Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/76/bf/d3f3a5ba47fd18115e8446d39f025b85905d2008677c29ee4d03b4cddd57/types_simplejson-3.20.0.20250326-py3-none-any.whl", hash = "sha256:db1ddea7b8f7623b27a137578f22fc6c618db8c83ccfb1828ca0d2f0ec11efa7", size = 10462, upload-time = "2025-03-26T02:53:35.036Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/9f/8e2c9e6aee9a2ff34f2ffce6ccd9c26edeef6dfd366fde611dc2e2c00ab9/types_simplejson-3.20.0.20250822-py3-none-any.whl", hash = "sha256:b5e63ae220ac7a1b0bb9af43b9cb8652237c947981b2708b0c776d3b5d8fa169", size = 10417, upload-time = "2025-08-22T03:03:34.485Z" },
]
[[package]]
name = "types-ujson"
-version = "5.10.0.20250326"
+version = "5.10.0.20250822"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/cc/5c/c974451c4babdb4ae3588925487edde492d59a8403010b4642a554d09954/types_ujson-5.10.0.20250326.tar.gz", hash = "sha256:5469e05f2c31ecb3c4c0267cc8fe41bcd116826fbb4ded69801a645c687dd014", size = 8340, upload-time = "2025-03-26T02:53:39.197Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/5c/bd/d372d44534f84864a96c19a7059d9b4d29db8541828b8b9dc3040f7a46d0/types_ujson-5.10.0.20250822.tar.gz", hash = "sha256:0a795558e1f78532373cf3f03f35b1f08bc60d52d924187b97995ee3597ba006", size = 8437, upload-time = "2025-08-22T03:02:19.433Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3e/c9/8a73a5f8fa6e70fc02eed506d5ac0ae9ceafbd2b8c9ad34a7de0f29900d6/types_ujson-5.10.0.20250326-py3-none-any.whl", hash = "sha256:acc0913f569def62ef6a892c8a47703f65d05669a3252391a97765cf207dca5b", size = 7644, upload-time = "2025-03-26T02:53:38.2Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/f2/d812543c350674d8b3f6e17c8922248ee3bb752c2a76f64beb8c538b40cf/types_ujson-5.10.0.20250822-py3-none-any.whl", hash = "sha256:3e9e73a6dc62ccc03449d9ac2c580cd1b7a8e4873220db498f7dd056754be080", size = 7657, upload-time = "2025-08-22T03:02:18.699Z" },
]
[[package]]
diff --git a/misc/release/archive-version.js b/misc/release/archive-version.js
index 3ef4f58b1e..1a66963dad 100755
--- a/misc/release/archive-version.js
+++ b/misc/release/archive-version.js
@@ -10,7 +10,7 @@ if (!nextVersion) {
const filename = './docs/static/archived-versions.json';
const oldVersions = JSON.parse(readFileSync(filename));
const newVersions = [
- { label: `v${nextVersion}`, url: `https://v${nextVersion}.archive.immich.app` },
+ { label: `v${nextVersion}`, url: `https://docs.v${nextVersion}.archive.immich.app` },
...oldVersions,
];
diff --git a/misc/release/pump-version.sh b/misc/release/pump-version.sh
index 789805255b..65a2e70e50 100755
--- a/misc/release/pump-version.sh
+++ b/misc/release/pump-version.sh
@@ -65,7 +65,7 @@ if [ "$CURRENT_SERVER" != "$NEXT_SERVER" ]; then
pnpm install --frozen-lockfile --prefix server
pnpm --prefix server run build
- make open-api
+ ( cd ./open-api && bash ./bin/generate-open-api.sh )
jq --arg version "$NEXT_SERVER" '.version = $version' open-api/typescript-sdk/package.json > open-api/typescript-sdk/package.json.tmp && mv open-api/typescript-sdk/package.json.tmp open-api/typescript-sdk/package.json
@@ -80,7 +80,7 @@ if [ "$CURRENT_SERVER" != "$NEXT_SERVER" ]; then
jq --arg version "$NEXT_SERVER" '.version = $version' e2e/package.json > e2e/package.json.tmp && mv e2e/package.json.tmp e2e/package.json
pnpm install --frozen-lockfile --prefix e2e
- uvx --from=toml-cli toml set --toml-path=pyproject.toml project.version "$SERVER_PUMP"
+ uvx --from=toml-cli toml set --toml-path=machine-learning/pyproject.toml project.version "$NEXT_SERVER"
fi
if [ "$CURRENT_MOBILE" != "$NEXT_MOBILE" ]; then
diff --git a/mise.toml b/mise.toml
new file mode 100644
index 0000000000..2008fa5e4a
--- /dev/null
+++ b/mise.toml
@@ -0,0 +1,512 @@
+[tools]
+node = "22.20.0"
+flutter = "3.35.4"
+pnpm = "10.15.1"
+
+[tools."github:CQLabs/homebrew-dcm"]
+version = "1.30.0"
+bin = "dcm"
+postinstall = "chmod +x $MISE_TOOL_INSTALL_PATH/dcm"
+
+[settings]
+experimental = true
+pin = true
+
+# .github
+[tasks."github:install"]
+run = "pnpm install --filter github --frozen-lockfile"
+
+[tasks."github:format"]
+env._.path = "./.github/node_modules/.bin"
+dir = ".github"
+run = "prettier --check ."
+
+[tasks."github:format-fix"]
+env._.path = "./.github/node_modules/.bin"
+dir = ".github"
+run = "prettier --write ."
+
+# @immich/cli
+[tasks."cli:install"]
+run = "pnpm install --filter @immich/cli --frozen-lockfile"
+
+[tasks."cli:build"]
+env._.path = "./cli/node_modules/.bin"
+dir = "cli"
+run = "vite build"
+
+[tasks."cli:test"]
+env._.path = "./cli/node_modules/.bin"
+dir = "cli"
+run = "vite"
+
+[tasks."cli:lint"]
+env._.path = "./cli/node_modules/.bin"
+dir = "cli"
+run = "eslint \"src/**/*.ts\" --max-warnings 0"
+
+[tasks."cli:lint-fix"]
+run = "mise run cli:lint --fix"
+
+[tasks."cli:format"]
+env._.path = "./cli/node_modules/.bin"
+dir = "cli"
+run = "prettier --check ."
+
+[tasks."cli:format-fix"]
+env._.path = "./cli/node_modules/.bin"
+dir = "cli"
+run = "prettier --write ."
+
+[tasks."cli:check"]
+env._.path = "./cli/node_modules/.bin"
+dir = "cli"
+run = "tsc --noEmit"
+
+# @immich/sdk
+[tasks."sdk:install"]
+run = "pnpm install --filter @immich/sdk --frozen-lockfile"
+
+[tasks."sdk:build"]
+env._.path = "./open-api/typescript-sdk/node_modules/.bin"
+dir = "./open-api/typescript-sdk"
+run = "tsc"
+
+# docs
+[tasks."docs:install"]
+run = "pnpm install --filter documentation --frozen-lockfile"
+
+[tasks."docs:start"]
+env._.path = "./docs/node_modules/.bin"
+dir = "docs"
+run = "docusaurus --port 3005"
+
+[tasks."docs:build"]
+env._.path = "./docs/node_modules/.bin"
+dir = "docs"
+run = [
+ "jq -c < ../open-api/immich-openapi-specs.json > ./static/openapi.json || exit 0",
+ "docusaurus build",
+]
+
+
+[tasks."docs:preview"]
+env._.path = "./docs/node_modules/.bin"
+dir = "docs"
+run = "docusaurus serve"
+
+
+[tasks."docs:format"]
+env._.path = "./docs/node_modules/.bin"
+dir = "docs"
+run = "prettier --check ."
+
+[tasks."docs:format-fix"]
+env._.path = "./docs/node_modules/.bin"
+dir = "docs"
+run = "prettier --write ."
+
+
+# e2e
+[tasks."e2e:install"]
+run = "pnpm install --filter immich-e2e --frozen-lockfile"
+
+[tasks."e2e:test"]
+env._.path = "./e2e/node_modules/.bin"
+dir = "e2e"
+run = "vitest --run"
+
+[tasks."e2e:test-web"]
+env._.path = "./e2e/node_modules/.bin"
+dir = "e2e"
+run = "playwright test"
+
+[tasks."e2e:format"]
+env._.path = "./e2e/node_modules/.bin"
+dir = "e2e"
+run = "prettier --check ."
+
+[tasks."e2e:format-fix"]
+env._.path = "./e2e/node_modules/.bin"
+dir = "e2e"
+run = "prettier --write ."
+
+[tasks."e2e:lint"]
+env._.path = "./e2e/node_modules/.bin"
+dir = "e2e"
+run = "eslint \"src/**/*.ts\" --max-warnings 0"
+
+[tasks."e2e:lint-fix"]
+run = "mise run e2e:lint --fix"
+
+[tasks."e2e:check"]
+env._.path = "./e2e/node_modules/.bin"
+dir = "e2e"
+run = "tsc --noEmit"
+
+# i18n
+[tasks."i18n:format"]
+run = "mise run i18n:format-fix"
+
+[tasks."i18n:format-fix"]
+run = "pnpm dlx sort-json ./i18n/*.json"
+
+
+# server
+[tasks."server:install"]
+run = "pnpm install --filter immich --frozen-lockfile"
+
+[tasks."server:build"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "nest build"
+
+[tasks."server:test"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "vitest --config test/vitest.config.mjs"
+
+[tasks."server:test-medium"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "vitest --config test/vitest.config.medium.mjs"
+
+[tasks."server:format"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "prettier --check ."
+
+[tasks."server:format-fix"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "prettier --write ."
+
+[tasks."server:lint"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "eslint \"src/**/*.ts\" \"test/**/*.ts\" --max-warnings 0"
+
+[tasks."server:lint-fix"]
+run = "mise run server:lint --fix"
+
+[tasks."server:check"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "tsc --noEmit"
+
+[tasks."server:sql"]
+dir = "server"
+run = "node ./dist/bin/sync-open-api.js"
+
+[tasks."server:open-api"]
+dir = "server"
+run = "node ./dist/bin/sync-open-api.js"
+
+[tasks."server:migrations"]
+dir = "server"
+run = "node ./dist/bin/migrations.js"
+description = "Run database migration commands (create, generate, run, debug, or query)"
+
+[tasks."server:schema-drop"]
+run = "mise run server:migrations query 'DROP schema public cascade; CREATE schema public;'"
+
+[tasks."server:schema-reset"]
+run = "mise run server:schema-drop && mise run server:migrations run"
+
+[tasks."server:email-dev"]
+env._.path = "./server/node_modules/.bin"
+dir = "server"
+run = "email dev -p 3050 --dir src/emails"
+
+[tasks."server:checklist"]
+run = [
+ "mise run server:install",
+ "mise run server:format",
+ "mise run server:lint",
+ "mise run server:check",
+ "mise run server:test-medium --run",
+ "mise run server:test --run",
+]
+
+
+# web
+[tasks."web:install"]
+run = "pnpm install --filter immich-web --frozen-lockfile"
+
+[tasks."web:svelte-kit-sync"]
+env._.path = "./web/node_modules/.bin"
+dir = "web"
+run = "svelte-kit sync"
+
+[tasks."web:build"]
+env._.path = "./web/node_modules/.bin"
+dir = "web"
+run = "vite build"
+
+[tasks."web:build-stats"]
+env.BUILD_STATS = "true"
+env._.path = "./web/node_modules/.bin"
+dir = "web"
+run = "vite build"
+
+[tasks."web:preview"]
+env._.path = "./web/node_modules/.bin"
+dir = "web"
+run = "vite preview"
+
+[tasks."web:start"]
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "vite dev --host 0.0.0.0 --port 3000"
+
+[tasks."web:test"]
+depends = "web:svelte-kit-sync"
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "vitest"
+
+[tasks."web:format"]
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "prettier --check ."
+
+[tasks."web:format-fix"]
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "prettier --write ."
+
+[tasks."web:lint"]
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "eslint . --max-warnings 0"
+
+[tasks."web:lint-p"]
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "eslint-p . --max-warnings 0 --concurrency=4"
+
+[tasks."web:lint-fix"]
+run = "mise run web:lint --fix"
+
+[tasks."web:check"]
+depends = "web:svelte-kit-sync"
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "tsc --noEmit"
+
+[tasks."web:check-svelte"]
+depends = "web:svelte-kit-sync"
+env._.path = "web/node_modules/.bin"
+dir = "web"
+run = "svelte-check --no-tsconfig --fail-on-warnings"
+
+[tasks."web:checklist"]
+run = [
+ "mise run web:install",
+ "mise run web:format",
+ "mise run web:check",
+ "mise run web:test --run",
+ "mise run web:lint",
+]
+
+
+# mobile
+[tasks."mobile:codegen:dart"]
+alias = "mobile:codegen"
+description = "Execute build_runner to auto-generate dart code"
+dir = "mobile"
+sources = [
+ "pubspec.yaml",
+ "build.yaml",
+ "lib/**/*.dart",
+ "infrastructure/**/*.drift",
+]
+outputs = { auto = true }
+run = "dart run build_runner build --delete-conflicting-outputs"
+
+[tasks."mobile:codegen:pigeon"]
+alias = "mobile:pigeon"
+description = "Generate pigeon platform code"
+dir = "mobile"
+depends = [
+ "mobile:pigeon:native-sync",
+ "mobile:pigeon:thumbnail",
+ "mobile:pigeon:background-worker",
+ "mobile:pigeon:background-worker-lock",
+ "mobile:pigeon:connectivity",
+]
+
+[tasks."mobile:codegen:translation"]
+alias = "mobile:translation"
+description = "Generate translations from i18n JSONs"
+dir = "mobile"
+run = [
+ { task = "i18n:format-fix" },
+ { tasks = [
+ "mobile:i18n:loader",
+ "mobile:i18n:keys",
+ ] },
+]
+
+[tasks."mobile:codegen:app-icon"]
+description = "Generate app icons"
+dir = "mobile"
+run = "flutter pub run flutter_launcher_icons:main"
+
+[tasks."mobile:codegen:splash"]
+description = "Generate splash screen"
+dir = "mobile"
+run = "flutter pub run flutter_native_splash:create"
+
+[tasks."mobile:test"]
+description = "Run mobile tests"
+dir = "mobile"
+run = "flutter test"
+
+[tasks."mobile:lint"]
+description = "Analyze Dart code"
+dir = "mobile"
+depends = ["mobile:analyze:dart", "mobile:analyze:dcm"]
+
+[tasks."mobile:lint-fix"]
+description = "Auto-fix Dart code"
+dir = "mobile"
+depends = ["mobile:analyze:fix:dart", "mobile:analyze:fix:dcm"]
+
+[tasks."mobile:format"]
+description = "Format Dart code"
+dir = "mobile"
+run = "dart format --set-exit-if-changed $(find lib -name '*.dart' -not \\( -name '*.g.dart' -o -name '*.drift.dart' -o -name '*.gr.dart' \\))"
+
+[tasks."mobile:build:android"]
+description = "Build Android release"
+dir = "mobile"
+run = "flutter build appbundle"
+
+[tasks."mobile:drift:migration"]
+alias = "mobile:migration"
+description = "Generate database migrations"
+dir = "mobile"
+run = "dart run drift_dev make-migrations"
+
+
+# mobile internal tasks
+[tasks."mobile:pigeon:native-sync"]
+description = "Generate native sync API pigeon code"
+dir = "mobile"
+hide = true
+sources = ["pigeon/native_sync_api.dart"]
+outputs = [
+ "lib/platform/native_sync_api.g.dart",
+ "ios/Runner/Sync/Messages.g.swift",
+ "android/app/src/main/kotlin/app/alextran/immich/sync/Messages.g.kt",
+]
+run = [
+ "dart run pigeon --input pigeon/native_sync_api.dart",
+ "dart format lib/platform/native_sync_api.g.dart",
+]
+
+[tasks."mobile:pigeon:thumbnail"]
+description = "Generate thumbnail API pigeon code"
+dir = "mobile"
+hide = true
+sources = ["pigeon/thumbnail_api.dart"]
+outputs = [
+ "lib/platform/thumbnail_api.g.dart",
+ "ios/Runner/Images/Thumbnails.g.swift",
+ "android/app/src/main/kotlin/app/alextran/immich/images/Thumbnails.g.kt",
+]
+run = [
+ "dart run pigeon --input pigeon/thumbnail_api.dart",
+ "dart format lib/platform/thumbnail_api.g.dart",
+]
+
+[tasks."mobile:pigeon:background-worker"]
+description = "Generate background worker API pigeon code"
+dir = "mobile"
+hide = true
+sources = ["pigeon/background_worker_api.dart"]
+outputs = [
+ "lib/platform/background_worker_api.g.dart",
+ "ios/Runner/Background/BackgroundWorker.g.swift",
+ "android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorker.g.kt",
+]
+run = [
+ "dart run pigeon --input pigeon/background_worker_api.dart",
+ "dart format lib/platform/background_worker_api.g.dart",
+]
+
+[tasks."mobile:pigeon:background-worker-lock"]
+description = "Generate background worker lock API pigeon code"
+dir = "mobile"
+hide = true
+sources = ["pigeon/background_worker_lock_api.dart"]
+outputs = [
+ "lib/platform/background_worker_lock_api.g.dart",
+ "android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerLock.g.kt",
+]
+run = [
+ "dart run pigeon --input pigeon/background_worker_lock_api.dart",
+ "dart format lib/platform/background_worker_lock_api.g.dart",
+]
+
+[tasks."mobile:pigeon:connectivity"]
+description = "Generate connectivity API pigeon code"
+dir = "mobile"
+hide = true
+sources = ["pigeon/connectivity_api.dart"]
+outputs = [
+ "lib/platform/connectivity_api.g.dart",
+ "ios/Runner/Connectivity/Connectivity.g.swift",
+ "android/app/src/main/kotlin/app/alextran/immich/connectivity/Connectivity.g.kt",
+]
+run = [
+ "dart run pigeon --input pigeon/connectivity_api.dart",
+ "dart format lib/platform/connectivity_api.g.dart",
+]
+
+[tasks."mobile:i18n:loader"]
+description = "Generate i18n loader"
+dir = "mobile"
+hide = true
+sources = ["i18n/"]
+outputs = "lib/generated/codegen_loader.g.dart"
+run = [
+ "dart run easy_localization:generate -S ../i18n",
+ "dart format lib/generated/codegen_loader.g.dart",
+]
+
+[tasks."mobile:i18n:keys"]
+description = "Generate i18n keys"
+dir = "mobile"
+hide = true
+sources = ["i18n/en.json"]
+outputs = "lib/generated/intl_keys.g.dart"
+run = [
+ "dart run bin/generate_keys.dart",
+ "dart format lib/generated/intl_keys.g.dart",
+]
+
+[tasks."mobile:analyze:dart"]
+description = "Run Dart analysis"
+dir = "mobile"
+hide = true
+run = "dart analyze --fatal-infos"
+
+[tasks."mobile:analyze:dcm"]
+description = "Run Dart Code Metrics"
+dir = "mobile"
+hide = true
+run = "dcm analyze lib --fatal-style --fatal-warnings"
+
+[tasks."mobile:analyze:fix:dart"]
+description = "Auto-fix Dart analysis"
+dir = "mobile"
+hide = true
+run = "dart fix --apply"
+
+[tasks."mobile:analyze:fix:dcm"]
+description = "Auto-fix Dart Code Metrics"
+dir = "mobile"
+hide = true
+run = "dcm fix lib"
diff --git a/mobile/.fvmrc b/mobile/.fvmrc
index 3ca65ffc7c..a4d5f6d9b7 100644
--- a/mobile/.fvmrc
+++ b/mobile/.fvmrc
@@ -1,3 +1,3 @@
{
- "flutter": "3.32.8"
+ "flutter": "3.35.4"
}
\ No newline at end of file
diff --git a/mobile/.vscode/settings.json b/mobile/.vscode/settings.json
index 9a9fb67ce3..9c6057e582 100644
--- a/mobile/.vscode/settings.json
+++ b/mobile/.vscode/settings.json
@@ -1,8 +1,8 @@
{
- "dart.flutterSdkPath": ".fvm/versions/3.32.8",
+ "dart.flutterSdkPath": ".fvm/versions/3.35.4",
"dart.lineLength": 120,
"[dart]": {
- "editor.rulers": [120],
+ "editor.rulers": [120]
},
"search.exclude": {
"**/.fvm": true
diff --git a/mobile/README.md b/mobile/README.md
index 436b0a4c34..59b2d9340c 100644
--- a/mobile/README.md
+++ b/mobile/README.md
@@ -84,4 +84,4 @@ Below is how your code needs to be structured:
## Contributing
-Please refer to the [architecture](https://immich.app/docs/developer/architecture/) for contributing to the mobile app!
+Please refer to the [architecture](https://docs.immich.app/developer/architecture/) for contributing to the mobile app!
diff --git a/mobile/analysis_options.yaml b/mobile/analysis_options.yaml
index 1b0b7170d2..c04e1dafdc 100644
--- a/mobile/analysis_options.yaml
+++ b/mobile/analysis_options.yaml
@@ -43,8 +43,9 @@ analyzer:
- lib/**/*.g.dart
- lib/**/*.drift.dart
- plugins:
- - custom_lint
+ # TODO: Re-enable after upgrading custom_lint
+ # plugins:
+ # - custom_lint
custom_lint:
debug: true
@@ -81,6 +82,7 @@ custom_lint:
# acceptable exceptions for the time being (until Isar is fully replaced)
- lib/providers/app_life_cycle.provider.dart
- integration_test/test_utils/general_helper.dart
+ - lib/domain/services/background_worker.service.dart
- lib/main.dart
- lib/pages/album/album_asset_selection.page.dart
- lib/routing/router.dart
@@ -133,6 +135,13 @@ custom_lint:
dart_code_metrics:
rules:
+ - banned-usage:
+ entries:
+ - name: debugPrint
+ description: Use dPrint instead of debugPrint for proper tree-shaking in release builds.
+ exclude-paths:
+ - 'lib/utils/debug_print.dart'
+ severity: perf
# All rules from "recommended" preset
# Show potential errors
# - avoid-cascade-after-if-null
diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt
index ff806870f9..5a3b0e1f3d 100644
--- a/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt
+++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt
@@ -3,17 +3,20 @@ package app.alextran.immich
import android.app.Application
import androidx.work.Configuration
import androidx.work.WorkManager
+import app.alextran.immich.background.BackgroundWorkerApiImpl
class ImmichApp : Application() {
- override fun onCreate() {
- super.onCreate()
- val config = Configuration.Builder().build()
- WorkManager.initialize(this, config)
- // always start BackupWorker after WorkManager init; this fixes the following bug:
- // After the process is killed (by user or system), the first trigger (taking a new picture) is lost.
- // Thus, the BackupWorker is not started. If the system kills the process after each initialization
- // (because of low memory etc.), the backup is never performed.
- // As a workaround, we also run a backup check when initializing the application
- ContentObserverWorker.startBackupWorker(context = this, delayMilliseconds = 0)
- }
-}
\ No newline at end of file
+ override fun onCreate() {
+ super.onCreate()
+ val config = Configuration.Builder().build()
+ WorkManager.initialize(this, config)
+ // always start BackupWorker after WorkManager init; this fixes the following bug:
+ // After the process is killed (by user or system), the first trigger (taking a new picture) is lost.
+ // Thus, the BackupWorker is not started. If the system kills the process after each initialization
+ // (because of low memory etc.), the backup is never performed.
+ // As a workaround, we also run a backup check when initializing the application
+
+ ContentObserverWorker.startBackupWorker(context = this, delayMilliseconds = 0)
+ BackgroundWorkerApiImpl.enqueueBackgroundWorker(this)
+ }
+}
diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt
index b1a50695a3..034f5ee72e 100644
--- a/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt
+++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt
@@ -1,8 +1,14 @@
package app.alextran.immich
+import android.content.Context
import android.os.Build
import android.os.ext.SdkExtensions
-import androidx.annotation.NonNull
+import app.alextran.immich.background.BackgroundEngineLock
+import app.alextran.immich.background.BackgroundWorkerApiImpl
+import app.alextran.immich.background.BackgroundWorkerFgHostApi
+import app.alextran.immich.background.BackgroundWorkerLockApi
+import app.alextran.immich.connectivity.ConnectivityApi
+import app.alextran.immich.connectivity.ConnectivityApiImpl
import app.alextran.immich.images.ThumbnailApi
import app.alextran.immich.images.ThumbnailsImpl
import app.alextran.immich.sync.NativeSyncApi
@@ -12,19 +18,30 @@ import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
class MainActivity : FlutterFragmentActivity() {
- override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
+ override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
- flutterEngine.plugins.add(BackgroundServicePlugin())
- flutterEngine.plugins.add(HttpSSLOptionsPlugin())
- // No need to set up method channel here as it's now handled in the plugin
+ registerPlugins(this, flutterEngine)
+ }
- val nativeSyncApiImpl =
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) < 1) {
- NativeSyncApiImpl26(this)
- } else {
- NativeSyncApiImpl30(this)
- }
- NativeSyncApi.setUp(flutterEngine.dartExecutor.binaryMessenger, nativeSyncApiImpl)
- ThumbnailApi.setUp(flutterEngine.dartExecutor.binaryMessenger, ThumbnailsImpl(this))
+ companion object {
+ fun registerPlugins(ctx: Context, flutterEngine: FlutterEngine) {
+ val messenger = flutterEngine.dartExecutor.binaryMessenger
+ val backgroundEngineLockImpl = BackgroundEngineLock(ctx)
+ BackgroundWorkerLockApi.setUp(messenger, backgroundEngineLockImpl)
+ val nativeSyncApiImpl =
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) < 1) {
+ NativeSyncApiImpl26(ctx)
+ } else {
+ NativeSyncApiImpl30(ctx)
+ }
+ NativeSyncApi.setUp(messenger, nativeSyncApiImpl)
+ ThumbnailApi.setUp(messenger, ThumbnailsImpl(ctx))
+ BackgroundWorkerFgHostApi.setUp(messenger, BackgroundWorkerApiImpl(ctx))
+ ConnectivityApi.setUp(messenger, ConnectivityApiImpl(ctx))
+
+ flutterEngine.plugins.add(BackgroundServicePlugin())
+ flutterEngine.plugins.add(HttpSSLOptionsPlugin())
+ flutterEngine.plugins.add(backgroundEngineLockImpl)
+ }
}
}
diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt
new file mode 100644
index 0000000000..d8afe32b5c
--- /dev/null
+++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt
@@ -0,0 +1,50 @@
+package app.alextran.immich.background
+
+import android.content.Context
+import android.util.Log
+import io.flutter.embedding.engine.plugins.FlutterPlugin
+import java.util.concurrent.atomic.AtomicInteger
+
+private const val TAG = "BackgroundEngineLock"
+
+class BackgroundEngineLock(context: Context) : BackgroundWorkerLockApi, FlutterPlugin {
+ private val ctx: Context = context.applicationContext
+
+ companion object {
+
+ private var engineCount = AtomicInteger(0)
+
+ private fun checkAndEnforceBackgroundLock(ctx: Context) {
+ // work manager task is running while the main app is opened, cancel the worker
+ if (BackgroundWorkerPreferences(ctx).isLocked() &&
+ engineCount.get() > 1 &&
+ BackgroundWorkerApiImpl.isBackgroundWorkerRunning()
+ ) {
+ Log.i(TAG, "Background worker is locked, cancelling the background worker")
+ BackgroundWorkerApiImpl.cancelBackgroundWorker(ctx)
+ }
+ }
+ }
+
+ override fun lock() {
+ BackgroundWorkerPreferences(ctx).setLocked(true)
+ checkAndEnforceBackgroundLock(ctx)
+ Log.i(TAG, "Background worker is locked")
+ }
+
+ override fun unlock() {
+ BackgroundWorkerPreferences(ctx).setLocked(false)
+ Log.i(TAG, "Background worker is unlocked")
+ }
+
+ override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
+ checkAndEnforceBackgroundLock(binding.applicationContext)
+ engineCount.incrementAndGet()
+ Log.i(TAG, "Flutter engine attached. Attached Engines count: $engineCount")
+ }
+
+ override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
+ engineCount.decrementAndGet()
+ Log.i(TAG, "Flutter engine detached. Attached Engines count: $engineCount")
+ }
+}
diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorker.g.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorker.g.kt
new file mode 100644
index 0000000000..052395c172
--- /dev/null
+++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorker.g.kt
@@ -0,0 +1,332 @@
+// Autogenerated from Pigeon (v26.0.0), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass")
+
+package app.alextran.immich.background
+
+import android.util.Log
+import io.flutter.plugin.common.BasicMessageChannel
+import io.flutter.plugin.common.BinaryMessenger
+import io.flutter.plugin.common.EventChannel
+import io.flutter.plugin.common.MessageCodec
+import io.flutter.plugin.common.StandardMethodCodec
+import io.flutter.plugin.common.StandardMessageCodec
+import java.io.ByteArrayOutputStream
+import java.nio.ByteBuffer
+private object BackgroundWorkerPigeonUtils {
+
+ fun createConnectionError(channelName: String): FlutterError {
+ return FlutterError("channel-error", "Unable to establish connection on channel: '$channelName'.", "") }
+
+ fun wrapResult(result: Any?): List