mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0651612d46 |
@@ -51,7 +51,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
gh api graphql \
|
gh api graphql \
|
||||||
-f prId="$NODE_ID" \
|
-f prId="$NODE_ID" \
|
||||||
-f body="This PR has been automatically closed as the description doesn't follow [our template](https://github.com/immich-app/immich/blob/main/.github/pull_request_template.md). After you edit it to match the template, the PR will automatically be reopened." \
|
-f body="This PR has been automatically closed as the description doesn't follow our template. After you edit it to match the template, the PR will automatically be reopened." \
|
||||||
-f query='
|
-f query='
|
||||||
mutation CommentAndClosePR($prId: ID!, $body: String!) {
|
mutation CommentAndClosePR($prId: ID!, $body: String!) {
|
||||||
addComment(input: {
|
addComment(input: {
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Publish Android Artifact
|
- name: Publish Android Artifact
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
with:
|
with:
|
||||||
name: release-apk-signed
|
name: release-apk-signed
|
||||||
path: mobile/build/app/outputs/flutter-apk/*.apk
|
path: mobile/build/app/outputs/flutter-apk/*.apk
|
||||||
@@ -210,7 +210,7 @@ jobs:
|
|||||||
working-directory: ./mobile
|
working-directory: ./mobile
|
||||||
|
|
||||||
- name: Setup Ruby
|
- name: Setup Ruby
|
||||||
uses: ruby/setup-ruby@e65c17d16e57e481586a6a5a0282698790062f92 # v1.300.0
|
uses: ruby/setup-ruby@c515ec17f69368147deb311832da000dd229d338 # v1.297.0
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.3'
|
ruby-version: '3.3'
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
@@ -291,7 +291,7 @@ jobs:
|
|||||||
security delete-keychain build.keychain || true
|
security delete-keychain build.keychain || true
|
||||||
|
|
||||||
- name: Upload IPA artifact
|
- name: Upload IPA artifact
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
with:
|
with:
|
||||||
name: ios-release-ipa
|
name: ios-release-ipa
|
||||||
path: mobile/ios/Runner.ipa
|
path: mobile/ios/Runner.ipa
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Check for breaking API changes
|
- name: Check for breaking API changes
|
||||||
uses: oasdiff/oasdiff-action/breaking@e6faebce24cf20ac38653d0d2c7f4aa80aaafc79 # v0.0.38
|
uses: oasdiff/oasdiff-action/breaking@1f38ea5ea0b4a2e4e49901c3bcdf4386a05e9ea1 # v0.0.37
|
||||||
with:
|
with:
|
||||||
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
|
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
|
||||||
revision: open-api/immich-openapi-specs.json
|
revision: open-api/immich-openapi-specs.json
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
|
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
|
||||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
@@ -115,7 +115,7 @@ jobs:
|
|||||||
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
|
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
|
||||||
|
|
||||||
- name: Build and push image
|
- name: Build and push image
|
||||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
|
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
|
||||||
with:
|
with:
|
||||||
file: cli/Dockerfile
|
file: cli/Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
needs: [get_body, should_run]
|
needs: [get_body, should_run]
|
||||||
if: ${{ needs.should_run.outputs.should_run == 'true' }}
|
if: ${{ needs.should_run.outputs.should_run == 'true' }}
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/immich-app/mdq:main@sha256:557cca601891b8b7d78b940071d35aaf7aaeb9b327d19b22cf282118edbc5272
|
image: ghcr.io/immich-app/mdq:main@sha256:df7188ba88abb0800d73cc97d3633280f0c0c3d4c441d678225067bf154150fb
|
||||||
outputs:
|
outputs:
|
||||||
checked: ${{ steps.get_checkbox.outputs.checked }}
|
checked: ${{ steps.get_checkbox.outputs.checked }}
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
|
uses: github/codeql-action/init@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -70,7 +70,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# 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)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
|
uses: github/codeql-action/autobuild@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ 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
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
@@ -83,6 +83,6 @@ jobs:
|
|||||||
# ./location_of_script_within_repo/buildscript.sh
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
|
uses: github/codeql-action/analyze@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
|
||||||
with:
|
with:
|
||||||
category: '/language:${{matrix.language}}'
|
category: '/language:${{matrix.language}}'
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ jobs:
|
|||||||
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
||||||
steps:
|
steps:
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
suffix: ['']
|
suffix: ['']
|
||||||
steps:
|
steps:
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ jobs:
|
|||||||
run: pnpm build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Upload build output
|
- name: Upload build output
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
with:
|
with:
|
||||||
name: docs-build-output
|
name: docs-build-output
|
||||||
path: docs/build/
|
path: docs/build/
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-token
|
id: generate-token
|
||||||
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
|
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ jobs:
|
|||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate_token
|
id: generate_token
|
||||||
if: ${{ inputs.skip != true }}
|
if: ${{ inputs.skip != true }}
|
||||||
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
|
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-token
|
id: generate-token
|
||||||
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
|
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
@@ -124,7 +124,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Generate a token
|
- name: Generate a token
|
||||||
id: generate-token
|
id: generate-token
|
||||||
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
|
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
|
||||||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||||
|
|
||||||
- uses: mshick/add-pr-comment@64b8e914979889d746c99dea15a76e77ef64580a # v3.10.0
|
- uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0
|
||||||
with:
|
with:
|
||||||
github-token: ${{ steps.token.outputs.token }}
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
message-id: 'preview-status'
|
message-id: 'preview-status'
|
||||||
@@ -48,14 +48,14 @@ jobs:
|
|||||||
name: 'preview'
|
name: 'preview'
|
||||||
})
|
})
|
||||||
|
|
||||||
- uses: mshick/add-pr-comment@64b8e914979889d746c99dea15a76e77ef64580a # v3.10.0
|
- uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0
|
||||||
if: ${{ github.event.pull_request.head.repo.fork }}
|
if: ${{ github.event.pull_request.head.repo.fork }}
|
||||||
with:
|
with:
|
||||||
github-token: ${{ steps.token.outputs.token }}
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
message-id: 'preview-status'
|
message-id: 'preview-status'
|
||||||
message: 'PRs from forks cannot have preview environments.'
|
message: 'PRs from forks cannot have preview environments.'
|
||||||
|
|
||||||
- uses: mshick/add-pr-comment@64b8e914979889d746c99dea15a76e77ef64580a # v3.10.0
|
- uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0
|
||||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
with:
|
with:
|
||||||
github-token: ${{ steps.token.outputs.token }}
|
github-token: ${{ steps.token.outputs.token }}
|
||||||
|
|||||||
@@ -464,7 +464,7 @@ jobs:
|
|||||||
run: docker compose logs --no-color > docker-compose-logs.txt
|
run: docker compose logs --no-color > docker-compose-logs.txt
|
||||||
working-directory: ./e2e
|
working-directory: ./e2e
|
||||||
- name: Archive Docker logs
|
- name: Archive Docker logs
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: e2e-server-docker-logs-${{ matrix.runner }}
|
name: e2e-server-docker-logs-${{ matrix.runner }}
|
||||||
@@ -522,7 +522,7 @@ jobs:
|
|||||||
run: pnpm test:web
|
run: pnpm test:web
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
- name: Archive e2e test (web) results
|
- name: Archive e2e test (web) results
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
if: success() || failure()
|
if: success() || failure()
|
||||||
with:
|
with:
|
||||||
name: e2e-web-test-results-${{ matrix.runner }}
|
name: e2e-web-test-results-${{ matrix.runner }}
|
||||||
@@ -533,7 +533,7 @@ jobs:
|
|||||||
run: pnpm test:web:ui
|
run: pnpm test:web:ui
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
- name: Archive ui test (web) results
|
- name: Archive ui test (web) results
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
if: success() || failure()
|
if: success() || failure()
|
||||||
with:
|
with:
|
||||||
name: e2e-ui-test-results-${{ matrix.runner }}
|
name: e2e-ui-test-results-${{ matrix.runner }}
|
||||||
@@ -544,7 +544,7 @@ jobs:
|
|||||||
run: pnpm test:web:maintenance
|
run: pnpm test:web:maintenance
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
- name: Archive maintenance tests (web) results
|
- name: Archive maintenance tests (web) results
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
if: success() || failure()
|
if: success() || failure()
|
||||||
with:
|
with:
|
||||||
name: e2e-maintenance-isolated-test-results-${{ matrix.runner }}
|
name: e2e-maintenance-isolated-test-results-${{ matrix.runner }}
|
||||||
@@ -554,7 +554,7 @@ jobs:
|
|||||||
run: docker compose logs --no-color > docker-compose-logs.txt
|
run: docker compose logs --no-color > docker-compose-logs.txt
|
||||||
working-directory: ./e2e
|
working-directory: ./e2e
|
||||||
- name: Archive Docker logs
|
- name: Archive Docker logs
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: e2e-web-docker-logs-${{ matrix.runner }}
|
name: e2e-web-docker-logs-${{ matrix.runner }}
|
||||||
|
|||||||
@@ -28,5 +28,3 @@ vite.config.js.timestamp-*
|
|||||||
.pnpm-store
|
.pnpm-store
|
||||||
.devcontainer/library
|
.devcontainer/library
|
||||||
.devcontainer/.env*
|
.devcontainer/.env*
|
||||||
*.tsbuildinfo
|
|
||||||
*.tsbuildInfo
|
|
||||||
|
|||||||
+5
-5
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@immich/cli",
|
"name": "@immich/cli",
|
||||||
"version": "2.7.5",
|
"version": "2.6.3",
|
||||||
"description": "Command Line Interface (CLI) for Immich",
|
"description": "Command Line Interface (CLI) for Immich",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"exports": "./dist/index.js",
|
"exports": "./dist/index.js",
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/micromatch": "^4.0.9",
|
"@types/micromatch": "^4.0.9",
|
||||||
"@types/mock-fs": "^4.13.1",
|
"@types/mock-fs": "^4.13.1",
|
||||||
"@types/node": "^24.12.2",
|
"@types/node": "^24.12.0",
|
||||||
"@vitest/coverage-v8": "^4.0.0",
|
"@vitest/coverage-v8": "^4.0.0",
|
||||||
"byte-size": "^9.0.0",
|
"byte-size": "^9.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
@@ -28,13 +28,13 @@
|
|||||||
"eslint": "^10.0.0",
|
"eslint": "^10.0.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-unicorn": "^64.0.0",
|
"eslint-plugin-unicorn": "^63.0.0",
|
||||||
"globals": "^17.0.0",
|
"globals": "^17.0.0",
|
||||||
"mock-fs": "^5.2.0",
|
"mock-fs": "^5.2.0",
|
||||||
"prettier": "^3.7.4",
|
"prettier": "^3.7.4",
|
||||||
"prettier-plugin-organize-imports": "^4.0.0",
|
"prettier-plugin-organize-imports": "^4.0.0",
|
||||||
"typescript": "^6.0.0",
|
"typescript": "^5.3.3",
|
||||||
"typescript-eslint": "^8.58.0",
|
"typescript-eslint": "^8.28.0",
|
||||||
"vite": "^8.0.0",
|
"vite": "^8.0.0",
|
||||||
"vitest": "^4.0.0",
|
"vitest": "^4.0.0",
|
||||||
"vitest-fetch-mock": "^0.4.0",
|
"vitest-fetch-mock": "^0.4.0",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import path from 'node:path';
|
|||||||
import { setTimeout as sleep } from 'node:timers/promises';
|
import { setTimeout as sleep } from 'node:timers/promises';
|
||||||
import { describe, expect, it, MockedFunction, vi } from 'vitest';
|
import { describe, expect, it, MockedFunction, vi } from 'vitest';
|
||||||
|
|
||||||
import { AssetRejectReason, AssetUploadAction, checkBulkUpload, defaults, getSupportedMediaTypes } from '@immich/sdk';
|
import { Action, checkBulkUpload, defaults, getSupportedMediaTypes, Reason } from '@immich/sdk';
|
||||||
import createFetchMock from 'vitest-fetch-mock';
|
import createFetchMock from 'vitest-fetch-mock';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -120,7 +120,7 @@ describe('checkForDuplicates', () => {
|
|||||||
vi.mocked(checkBulkUpload).mockResolvedValue({
|
vi.mocked(checkBulkUpload).mockResolvedValue({
|
||||||
results: [
|
results: [
|
||||||
{
|
{
|
||||||
action: AssetUploadAction.Accept,
|
action: Action.Accept,
|
||||||
id: testFilePath,
|
id: testFilePath,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -144,10 +144,10 @@ describe('checkForDuplicates', () => {
|
|||||||
vi.mocked(checkBulkUpload).mockResolvedValue({
|
vi.mocked(checkBulkUpload).mockResolvedValue({
|
||||||
results: [
|
results: [
|
||||||
{
|
{
|
||||||
action: AssetUploadAction.Reject,
|
action: Action.Reject,
|
||||||
id: testFilePath,
|
id: testFilePath,
|
||||||
assetId: 'fc5621b1-86f6-44a1-9905-403e607df9f5',
|
assetId: 'fc5621b1-86f6-44a1-9905-403e607df9f5',
|
||||||
reason: AssetRejectReason.Duplicate,
|
reason: Reason.Duplicate,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
@@ -167,7 +167,7 @@ describe('checkForDuplicates', () => {
|
|||||||
vi.mocked(checkBulkUpload).mockResolvedValue({
|
vi.mocked(checkBulkUpload).mockResolvedValue({
|
||||||
results: [
|
results: [
|
||||||
{
|
{
|
||||||
action: AssetUploadAction.Accept,
|
action: Action.Accept,
|
||||||
id: testFilePath,
|
id: testFilePath,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -187,7 +187,7 @@ describe('checkForDuplicates', () => {
|
|||||||
mocked.mockResolvedValue({
|
mocked.mockResolvedValue({
|
||||||
results: [
|
results: [
|
||||||
{
|
{
|
||||||
action: AssetUploadAction.Accept,
|
action: Action.Accept,
|
||||||
id: testFilePath,
|
id: testFilePath,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import {
|
import {
|
||||||
|
Action,
|
||||||
AssetBulkUploadCheckItem,
|
AssetBulkUploadCheckItem,
|
||||||
AssetBulkUploadCheckResult,
|
AssetBulkUploadCheckResult,
|
||||||
AssetMediaResponseDto,
|
AssetMediaResponseDto,
|
||||||
AssetMediaStatus,
|
AssetMediaStatus,
|
||||||
AssetUploadAction,
|
|
||||||
Permission,
|
Permission,
|
||||||
addAssetsToAlbum,
|
addAssetsToAlbum,
|
||||||
checkBulkUpload,
|
checkBulkUpload,
|
||||||
@@ -234,7 +234,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
|
|||||||
const results = response.results as AssetBulkUploadCheckResults;
|
const results = response.results as AssetBulkUploadCheckResults;
|
||||||
|
|
||||||
for (const { id: filepath, assetId, action } of results) {
|
for (const { id: filepath, assetId, action } of results) {
|
||||||
if (action === AssetUploadAction.Accept) {
|
if (action === Action.Accept) {
|
||||||
newFiles.push(filepath);
|
newFiles.push(filepath);
|
||||||
} else {
|
} else {
|
||||||
// rejects are always duplicates
|
// rejects are always duplicates
|
||||||
@@ -404,6 +404,8 @@ const uploadFile = async (input: string, stats: Stats): Promise<AssetMediaRespon
|
|||||||
const { baseUrl, headers } = defaults;
|
const { baseUrl, headers } = defaults;
|
||||||
|
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
|
formData.append('deviceAssetId', `${basename(input)}-${stats.size}`.replaceAll(/\s+/g, ''));
|
||||||
|
formData.append('deviceId', 'CLI');
|
||||||
formData.append('fileCreatedAt', stats.mtime.toISOString());
|
formData.append('fileCreatedAt', stats.mtime.toISOString());
|
||||||
formData.append('fileModifiedAt', stats.mtime.toISOString());
|
formData.append('fileModifiedAt', stats.mtime.toISOString());
|
||||||
formData.append('fileSize', String(stats.size));
|
formData.append('fileSize', String(stats.size));
|
||||||
|
|||||||
+2
-6
@@ -15,12 +15,8 @@
|
|||||||
"incremental": true,
|
"incremental": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"rootDir": "./src",
|
"baseUrl": "./",
|
||||||
"paths": {
|
|
||||||
"src/*": ["./src/*"],
|
|
||||||
},
|
|
||||||
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo",
|
|
||||||
"types": ["vitest/globals"]
|
"types": ["vitest/globals"]
|
||||||
},
|
},
|
||||||
"exclude": ["dist", "node_modules", "vite.config.ts"]
|
"exclude": ["dist", "node_modules"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[tools]
|
[tools]
|
||||||
terragrunt = "0.99.5"
|
terragrunt = "0.99.4"
|
||||||
opentofu = "1.11.5"
|
opentofu = "1.11.5"
|
||||||
|
|
||||||
[tasks."tg:fmt"]
|
[tasks."tg:fmt"]
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
|
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
|
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: always
|
restart: always
|
||||||
@@ -85,7 +85,7 @@ services:
|
|||||||
container_name: immich_prometheus
|
container_name: immich_prometheus
|
||||||
ports:
|
ports:
|
||||||
- 9090:9090
|
- 9090:9090
|
||||||
image: prom/prometheus@sha256:dda13e28bf95a5e5ca5b8ed56852006094c1c8e8871d9c9dbeed30aa6e55271f
|
image: prom/prometheus@sha256:4a61322ac1103a0e3aea2a61ef1718422a48fa046441f299d71e660a3bc71ae9
|
||||||
volumes:
|
volumes:
|
||||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||||
- prometheus-data:/prometheus
|
- prometheus-data:/prometheus
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
|
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6
|
||||||
user: '1000:1000'
|
user: '1000:1000'
|
||||||
security_opt:
|
security_opt:
|
||||||
- no-new-privileges:true
|
- no-new-privileges:true
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
|
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: always
|
restart: always
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ You can search the following types of content:
|
|||||||
| Time frame | Start and end date of a specific time bucket |
|
| Time frame | Start and end date of a specific time bucket |
|
||||||
| Media type | Image or video or both |
|
| Media type | Image or video or both |
|
||||||
| Display options | In Archive, in Favorites or Not in any album |
|
| Display options | In Archive, in Favorites or Not in any album |
|
||||||
| Star rating | User-assigned star rating |
|
| Start rating | User-assigned start rating |
|
||||||
|
|
||||||
<img src={require('./img/advanced-search-filters.webp').default} width="70%" title='Advanced search filters' />
|
<img src={require('./img/advanced-search-filters.webp').default} width="70%" title='Advanced search filters' />
|
||||||
|
|
||||||
|
|||||||
@@ -28,17 +28,17 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a
|
|||||||
|
|
||||||
## Video formats
|
## Video formats
|
||||||
|
|
||||||
| Format | Extension(s) | Supported? | Notes |
|
| Format | Extension(s) | Supported? | Notes |
|
||||||
| :---------- | :-------------------------- | :----------------: | :---- |
|
| :---------- | :-------------------- | :----------------: | :---- |
|
||||||
| `3GPP` | `.3gp` `.3gpp` | :white_check_mark: | |
|
| `3GPP` | `.3gp` `.3gpp` | :white_check_mark: | |
|
||||||
| `AVI` | `.avi` | :white_check_mark: | |
|
| `AVI` | `.avi` | :white_check_mark: | |
|
||||||
| `FLV` | `.flv` | :white_check_mark: | |
|
| `FLV` | `.flv` | :white_check_mark: | |
|
||||||
| `M4V` | `.m4v` | :white_check_mark: | |
|
| `M4V` | `.m4v` | :white_check_mark: | |
|
||||||
| `MATROSKA` | `.mkv` | :white_check_mark: | |
|
| `MATROSKA` | `.mkv` | :white_check_mark: | |
|
||||||
| `MP2T` | `.mts` `.m2ts` `.m2t` `.ts` | :white_check_mark: | |
|
| `MP2T` | `.mts` `.m2ts` `.m2t` | :white_check_mark: | |
|
||||||
| `MP4` | `.mp4` `.insv` | :white_check_mark: | |
|
| `MP4` | `.mp4` `.insv` | :white_check_mark: | |
|
||||||
| `MPEG` | `.mpg` `.mpe` `.mpeg` | :white_check_mark: | |
|
| `MPEG` | `.mpg` `.mpe` `.mpeg` | :white_check_mark: | |
|
||||||
| `MXF` | `.mxf` | :white_check_mark: | |
|
| `MXF` | `.mxf` | :white_check_mark: | |
|
||||||
| `QUICKTIME` | `.mov` | :white_check_mark: | |
|
| `QUICKTIME` | `.mov` | :white_check_mark: | |
|
||||||
| `WEBM` | `.webm` | :white_check_mark: | |
|
| `WEBM` | `.webm` | :white_check_mark: | |
|
||||||
| `WMV` | `.wmv` | :white_check_mark: | |
|
| `WMV` | `.wmv` | :white_check_mark: | |
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ def upload(file):
|
|||||||
}
|
}
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
|
'deviceAssetId': f'{file}-{stats.st_mtime}',
|
||||||
|
'deviceId': 'python',
|
||||||
'fileCreatedAt': datetime.fromtimestamp(stats.st_mtime),
|
'fileCreatedAt': datetime.fromtimestamp(stats.st_mtime),
|
||||||
'fileModifiedAt': datetime.fromtimestamp(stats.st_mtime),
|
'fileModifiedAt': datetime.fromtimestamp(stats.st_mtime),
|
||||||
'isFavorite': 'false',
|
'isFavorite': 'false',
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ Immich requires [**Docker**](https://docs.docker.com/get-started/get-docker/) wi
|
|||||||
The Compose plugin will be installed by both Docker Engine and Desktop by following the linked installation guides; it can also be [separately installed](https://docs.docker.com/compose/install/).
|
The Compose plugin will be installed by both Docker Engine and Desktop by following the linked installation guides; it can also be [separately installed](https://docs.docker.com/compose/install/).
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
Immich requires the command `docker compose`; the similarly named `docker-compose` is [deprecated](https://docs.docker.com/retired/#docker-compose-v1-replaced-by-compose-v2) and is no longer supported by Immich.
|
Immich requires the command `docker compose`; the similarly named `docker-compose` is [deprecated](https://docs.docker.com/compose/migrate/) and is no longer supported by Immich.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
### Special requirements for Windows users
|
### Special requirements for Windows users
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ You can read more about the differences between storage template engine on and o
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Date and time variables in storage templates are rendered in the server's local timezone.
|
|
||||||
|
|
||||||
```bash title="Default template"
|
```bash title="Default template"
|
||||||
Year/Year-Month-Day/Filename.Extension
|
Year/Year-Month-Day/Filename.Extension
|
||||||
```
|
```
|
||||||
|
|||||||
+4
-4
@@ -30,17 +30,17 @@
|
|||||||
"postcss": "^8.4.25",
|
"postcss": "^8.4.25",
|
||||||
"prism-react-renderer": "^2.3.1",
|
"prism-react-renderer": "^2.3.1",
|
||||||
"raw-loader": "^4.0.2",
|
"raw-loader": "^4.0.2",
|
||||||
"react": "^19.0.0",
|
"react": "^18.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^18.0.0",
|
||||||
"tailwindcss": "^3.2.4",
|
"tailwindcss": "^3.2.4",
|
||||||
"url": "^0.11.0"
|
"url": "^0.11.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@docusaurus/module-type-aliases": "~3.9.0",
|
"@docusaurus/module-type-aliases": "~3.9.0",
|
||||||
"@docusaurus/tsconfig": "^3.10.0",
|
"@docusaurus/tsconfig": "^3.7.0",
|
||||||
"@docusaurus/types": "^3.7.0",
|
"@docusaurus/types": "^3.7.0",
|
||||||
"prettier": "^3.7.4",
|
"prettier": "^3.7.4",
|
||||||
"typescript": "^6.0.0"
|
"typescript": "^5.1.6"
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"production": [
|
"production": [
|
||||||
|
|||||||
Vendored
-4
@@ -1,8 +1,4 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"label": "v2.7.5",
|
|
||||||
"url": "https://docs.v2.7.5.archive.immich.app"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "v2.6.3",
|
"label": "v2.6.3",
|
||||||
"url": "https://docs.v2.6.3.archive.immich.app"
|
"url": "https://docs.v2.6.3.archive.immich.app"
|
||||||
|
|||||||
+5
-1
@@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
// This file is not used in compilation. It is here just for a nice editor experience.
|
// This file is not used in compilation. It is here just for a nice editor experience.
|
||||||
"extends": "@docusaurus/tsconfig"
|
"extends": "@docusaurus/tsconfig",
|
||||||
|
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": "."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich-e2e-redis
|
container_name: immich-e2e-redis
|
||||||
image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
|
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "immich-e2e",
|
"name": "immich-e2e",
|
||||||
"version": "2.7.5",
|
"version": "2.6.3",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -32,15 +32,15 @@
|
|||||||
"@playwright/test": "^1.44.1",
|
"@playwright/test": "^1.44.1",
|
||||||
"@socket.io/component-emitter": "^3.1.2",
|
"@socket.io/component-emitter": "^3.1.2",
|
||||||
"@types/luxon": "^3.4.2",
|
"@types/luxon": "^3.4.2",
|
||||||
"@types/node": "^24.12.2",
|
"@types/node": "^24.12.0",
|
||||||
"@types/pg": "^8.15.1",
|
"@types/pg": "^8.15.1",
|
||||||
"@types/pngjs": "^6.0.4",
|
"@types/pngjs": "^6.0.4",
|
||||||
"@types/supertest": "^7.0.0",
|
"@types/supertest": "^6.0.2",
|
||||||
"dotenv": "^17.2.3",
|
"dotenv": "^17.2.3",
|
||||||
"eslint": "^10.0.0",
|
"eslint": "^10.0.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-unicorn": "^64.0.0",
|
"eslint-plugin-unicorn": "^63.0.0",
|
||||||
"exiftool-vendored": "^35.0.0",
|
"exiftool-vendored": "^35.0.0",
|
||||||
"globals": "^17.0.0",
|
"globals": "^17.0.0",
|
||||||
"luxon": "^3.4.4",
|
"luxon": "^3.4.4",
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
"sharp": "^0.34.5",
|
"sharp": "^0.34.5",
|
||||||
"socket.io-client": "^4.7.4",
|
"socket.io-client": "^4.7.4",
|
||||||
"supertest": "^7.0.0",
|
"supertest": "^7.0.0",
|
||||||
"typescript": "^6.0.0",
|
"typescript": "^5.3.3",
|
||||||
"typescript-eslint": "^8.28.0",
|
"typescript-eslint": "^8.28.0",
|
||||||
"utimes": "^5.2.1",
|
"utimes": "^5.2.1",
|
||||||
"vite-tsconfig-paths": "^6.1.1",
|
"vite-tsconfig-paths": "^6.1.1",
|
||||||
|
|||||||
@@ -130,11 +130,12 @@ describe('/albums', () => {
|
|||||||
describe('GET /albums', () => {
|
describe('GET /albums', () => {
|
||||||
it("should not show other users' favorites", async () => {
|
it("should not show other users' favorites", async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get(`/albums/${user1Albums[0].id}`)
|
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
|
||||||
.set('Authorization', `Bearer ${user2.accessToken}`);
|
.set('Authorization', `Bearer ${user2.accessToken}`);
|
||||||
expect(status).toEqual(200);
|
expect(status).toEqual(200);
|
||||||
expect(body).toEqual({
|
expect(body).toEqual({
|
||||||
...user1Albums[0],
|
...user1Albums[0],
|
||||||
|
assets: [expect.objectContaining({ isFavorite: false })],
|
||||||
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
||||||
lastModifiedAssetTimestamp: expect.any(String),
|
lastModifiedAssetTimestamp: expect.any(String),
|
||||||
startDate: expect.any(String),
|
startDate: expect.any(String),
|
||||||
@@ -303,12 +304,13 @@ describe('/albums', () => {
|
|||||||
describe('GET /albums/:id', () => {
|
describe('GET /albums/:id', () => {
|
||||||
it('should return album info for own album', async () => {
|
it('should return album info for own album', async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get(`/albums/${user1Albums[0].id}`)
|
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
expect(body).toEqual({
|
expect(body).toEqual({
|
||||||
...user1Albums[0],
|
...user1Albums[0],
|
||||||
|
assets: [expect.objectContaining({ id: user1Albums[0].assets[0].id })],
|
||||||
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
||||||
lastModifiedAssetTimestamp: expect.any(String),
|
lastModifiedAssetTimestamp: expect.any(String),
|
||||||
startDate: expect.any(String),
|
startDate: expect.any(String),
|
||||||
@@ -320,7 +322,7 @@ describe('/albums', () => {
|
|||||||
|
|
||||||
it('should return album info for shared album (editor)', async () => {
|
it('should return album info for shared album (editor)', async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get(`/albums/${user2Albums[0].id}`)
|
.get(`/albums/${user2Albums[0].id}?withoutAssets=false`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
@@ -329,14 +331,14 @@ describe('/albums', () => {
|
|||||||
|
|
||||||
it('should return album info for shared album (viewer)', async () => {
|
it('should return album info for shared album (viewer)', async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get(`/albums/${user1Albums[3].id}`)
|
.get(`/albums/${user1Albums[3].id}?withoutAssets=false`)
|
||||||
.set('Authorization', `Bearer ${user2.accessToken}`);
|
.set('Authorization', `Bearer ${user2.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
expect(body).toMatchObject({ id: user1Albums[3].id });
|
expect(body).toMatchObject({ id: user1Albums[3].id });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return album info', async () => {
|
it('should return album info with assets when withoutAssets is undefined', async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get(`/albums/${user1Albums[0].id}`)
|
.get(`/albums/${user1Albums[0].id}`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
@@ -344,6 +346,25 @@ describe('/albums', () => {
|
|||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
expect(body).toEqual({
|
expect(body).toEqual({
|
||||||
...user1Albums[0],
|
...user1Albums[0],
|
||||||
|
assets: [expect.objectContaining({ id: user1Albums[0].assets[0].id })],
|
||||||
|
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
||||||
|
lastModifiedAssetTimestamp: expect.any(String),
|
||||||
|
startDate: expect.any(String),
|
||||||
|
endDate: expect.any(String),
|
||||||
|
albumUsers: expect.any(Array),
|
||||||
|
shared: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return album info without assets when withoutAssets is true', async () => {
|
||||||
|
const { status, body } = await request(app)
|
||||||
|
.get(`/albums/${user1Albums[0].id}?withoutAssets=true`)
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
|
expect(status).toBe(200);
|
||||||
|
expect(body).toEqual({
|
||||||
|
...user1Albums[0],
|
||||||
|
assets: [],
|
||||||
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
||||||
assetCount: 1,
|
assetCount: 1,
|
||||||
lastModifiedAssetTimestamp: expect.any(String),
|
lastModifiedAssetTimestamp: expect.any(String),
|
||||||
@@ -358,12 +379,13 @@ describe('/albums', () => {
|
|||||||
await utils.deleteAssets(user1.accessToken, [user1Asset2.id]);
|
await utils.deleteAssets(user1.accessToken, [user1Asset2.id]);
|
||||||
|
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get(`/albums/${user2Albums[0].id}`)
|
.get(`/albums/${user2Albums[0].id}?withoutAssets=true`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`);
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
expect(body).toEqual({
|
expect(body).toEqual({
|
||||||
...user2Albums[0],
|
...user2Albums[0],
|
||||||
|
assets: [],
|
||||||
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
|
||||||
assetCount: 1,
|
assetCount: 1,
|
||||||
lastModifiedAssetTimestamp: expect.any(String),
|
lastModifiedAssetTimestamp: expect.any(String),
|
||||||
@@ -404,6 +426,7 @@ describe('/albums', () => {
|
|||||||
shared: false,
|
shared: false,
|
||||||
albumUsers: [],
|
albumUsers: [],
|
||||||
hasSharedLink: false,
|
hasSharedLink: false,
|
||||||
|
assets: [],
|
||||||
assetCount: 0,
|
assetCount: 0,
|
||||||
owner: expect.objectContaining({ email: user1.userEmail }),
|
owner: expect.objectContaining({ email: user1.userEmail }),
|
||||||
isActivityEnabled: true,
|
isActivityEnabled: true,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
AssetMediaResponseDto,
|
AssetMediaResponseDto,
|
||||||
AssetMediaStatus,
|
AssetMediaStatus,
|
||||||
|
AssetResponseDto,
|
||||||
AssetTypeEnum,
|
AssetTypeEnum,
|
||||||
AssetVisibility,
|
AssetVisibility,
|
||||||
getAssetInfo,
|
getAssetInfo,
|
||||||
@@ -18,7 +19,7 @@ import { Socket } from 'socket.io-client';
|
|||||||
import { createUserDto, uuidDto } from 'src/fixtures';
|
import { createUserDto, uuidDto } from 'src/fixtures';
|
||||||
import { makeRandomImage } from 'src/generators';
|
import { makeRandomImage } from 'src/generators';
|
||||||
import { errorDto } from 'src/responses';
|
import { errorDto } from 'src/responses';
|
||||||
import { app, asBearerAuth, tempDir, testAssetDir, utils } from 'src/utils';
|
import { app, asBearerAuth, tempDir, TEN_TIMES, testAssetDir, utils } from 'src/utils';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
@@ -94,8 +95,8 @@ describe('/asset', () => {
|
|||||||
utils.createAsset(user1.accessToken),
|
utils.createAsset(user1.accessToken),
|
||||||
utils.createAsset(user1.accessToken, {
|
utils.createAsset(user1.accessToken, {
|
||||||
isFavorite: true,
|
isFavorite: true,
|
||||||
fileCreatedAt: yesterday.toUTC().toISO(),
|
fileCreatedAt: yesterday.toISO(),
|
||||||
fileModifiedAt: yesterday.toUTC().toISO(),
|
fileModifiedAt: yesterday.toISO(),
|
||||||
assetData: { filename: 'example.mp4' },
|
assetData: { filename: 'example.mp4' },
|
||||||
}),
|
}),
|
||||||
utils.createAsset(user1.accessToken),
|
utils.createAsset(user1.accessToken),
|
||||||
@@ -379,12 +380,62 @@ describe('/asset', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('GET /assets/random', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await Promise.all([
|
||||||
|
utils.createAsset(user1.accessToken),
|
||||||
|
utils.createAsset(user1.accessToken),
|
||||||
|
utils.createAsset(user1.accessToken),
|
||||||
|
utils.createAsset(user1.accessToken),
|
||||||
|
utils.createAsset(user1.accessToken),
|
||||||
|
utils.createAsset(user1.accessToken),
|
||||||
|
]);
|
||||||
|
|
||||||
|
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each(TEN_TIMES)('should return 1 random assets', async () => {
|
||||||
|
const { status, body } = await request(app)
|
||||||
|
.get('/assets/random')
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
|
expect(status).toBe(200);
|
||||||
|
|
||||||
|
const assets: AssetResponseDto[] = body;
|
||||||
|
expect(assets.length).toBe(1);
|
||||||
|
expect(assets[0].ownerId).toBe(user1.userId);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each(TEN_TIMES)('should return 2 random assets', async () => {
|
||||||
|
const { status, body } = await request(app)
|
||||||
|
.get('/assets/random?count=2')
|
||||||
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
|
|
||||||
|
expect(status).toBe(200);
|
||||||
|
|
||||||
|
const assets: AssetResponseDto[] = body;
|
||||||
|
expect(assets.length).toBe(2);
|
||||||
|
|
||||||
|
for (const asset of assets) {
|
||||||
|
expect(asset.ownerId).toBe(user1.userId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it.skip('should return 1 asset if there are 10 assets in the database but user 2 only has 1', async () => {
|
||||||
|
const { status, body } = await request(app)
|
||||||
|
.get('/assets/random')
|
||||||
|
.set('Authorization', `Bearer ${user2.accessToken}`);
|
||||||
|
|
||||||
|
expect(status).toBe(200);
|
||||||
|
expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('PUT /assets/:id', () => {
|
describe('PUT /assets/:id', () => {
|
||||||
it('should require access', async () => {
|
it('should require access', async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.put(`/assets/${user2Assets[0].id}`)
|
.put(`/assets/${user2Assets[0].id}`)
|
||||||
.set('Authorization', `Bearer ${user1.accessToken}`)
|
.set('Authorization', `Bearer ${user1.accessToken}`);
|
||||||
.send({});
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.noPermission);
|
expect(body).toEqual(errorDto.noPermission);
|
||||||
});
|
});
|
||||||
@@ -1091,6 +1142,8 @@ describe('/asset', () => {
|
|||||||
const { body, status } = await request(app)
|
const { body, status } = await request(app)
|
||||||
.post('/assets')
|
.post('/assets')
|
||||||
.set('Authorization', `Bearer ${quotaUser.accessToken}`)
|
.set('Authorization', `Bearer ${quotaUser.accessToken}`)
|
||||||
|
.field('deviceAssetId', 'example-image')
|
||||||
|
.field('deviceId', 'e2e')
|
||||||
.field('fileCreatedAt', new Date().toISOString())
|
.field('fileCreatedAt', new Date().toISOString())
|
||||||
.field('fileModifiedAt', new Date().toISOString())
|
.field('fileModifiedAt', new Date().toISOString())
|
||||||
.attach('assetData', makeRandomImage(), 'example.jpg');
|
.attach('assetData', makeRandomImage(), 'example.jpg');
|
||||||
@@ -1107,6 +1160,8 @@ describe('/asset', () => {
|
|||||||
const { body, status } = await request(app)
|
const { body, status } = await request(app)
|
||||||
.post('/assets')
|
.post('/assets')
|
||||||
.set('Authorization', `Bearer ${quotaUser.accessToken}`)
|
.set('Authorization', `Bearer ${quotaUser.accessToken}`)
|
||||||
|
.field('deviceAssetId', 'example-image')
|
||||||
|
.field('deviceId', 'e2e')
|
||||||
.field('fileCreatedAt', new Date().toISOString())
|
.field('fileCreatedAt', new Date().toISOString())
|
||||||
.field('fileModifiedAt', new Date().toISOString())
|
.field('fileModifiedAt', new Date().toISOString())
|
||||||
.attach('assetData', randomBytes(2014), 'example.jpg');
|
.attach('assetData', randomBytes(2014), 'example.jpg');
|
||||||
@@ -1160,4 +1215,29 @@ describe('/asset', () => {
|
|||||||
expect(video.checksum).toStrictEqual(checksum);
|
expect(video.checksum).toStrictEqual(checksum);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('POST /assets/exist', () => {
|
||||||
|
it('ignores invalid deviceAssetIds', async () => {
|
||||||
|
const response = await utils.checkExistingAssets(user1.accessToken, {
|
||||||
|
deviceId: 'test-assets-exist',
|
||||||
|
deviceAssetIds: ['invalid', 'INVALID'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.existingIds).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns the IDs of existing assets', async () => {
|
||||||
|
await utils.createAsset(user1.accessToken, {
|
||||||
|
deviceId: 'test-assets-exist',
|
||||||
|
deviceAssetId: 'test-asset-0',
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await utils.checkExistingAssets(user1.accessToken, {
|
||||||
|
deviceId: 'test-assets-exist',
|
||||||
|
deviceAssetIds: ['test-asset-0'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.existingIds).toEqual(['test-asset-0']);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ describe('/libraries', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[importPaths] Array must have unique items']));
|
expect(body).toEqual(errorDto.badRequest(["All importPaths's elements must be unique"]));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not create an external library with duplicate exclusion patterns', async () => {
|
it('should not create an external library with duplicate exclusion patterns', async () => {
|
||||||
@@ -125,7 +125,7 @@ describe('/libraries', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[exclusionPatterns] Array must have unique items']));
|
expect(body).toEqual(errorDto.badRequest(["All exclusionPatterns's elements must be unique"]));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ describe('/libraries', () => {
|
|||||||
.send({ name: '' });
|
.send({ name: '' });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[name] Too small: expected string to have >=1 characters']));
|
expect(body).toEqual(errorDto.badRequest(['name should not be empty']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should change the import paths', async () => {
|
it('should change the import paths', async () => {
|
||||||
@@ -181,7 +181,7 @@ describe('/libraries', () => {
|
|||||||
.send({ importPaths: [''] });
|
.send({ importPaths: [''] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[importPaths] Array items must not be empty']));
|
expect(body).toEqual(errorDto.badRequest(['each value in importPaths should not be empty']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should reject duplicate import paths', async () => {
|
it('should reject duplicate import paths', async () => {
|
||||||
@@ -191,7 +191,7 @@ describe('/libraries', () => {
|
|||||||
.send({ importPaths: ['/path', '/path'] });
|
.send({ importPaths: ['/path', '/path'] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[importPaths] Array must have unique items']));
|
expect(body).toEqual(errorDto.badRequest(["All importPaths's elements must be unique"]));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should change the exclusion pattern', async () => {
|
it('should change the exclusion pattern', async () => {
|
||||||
@@ -215,7 +215,7 @@ describe('/libraries', () => {
|
|||||||
.send({ exclusionPatterns: ['**/*.jpg', '**/*.jpg'] });
|
.send({ exclusionPatterns: ['**/*.jpg', '**/*.jpg'] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[exclusionPatterns] Array must have unique items']));
|
expect(body).toEqual(errorDto.badRequest(["All exclusionPatterns's elements must be unique"]));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should reject an empty exclusion pattern', async () => {
|
it('should reject an empty exclusion pattern', async () => {
|
||||||
@@ -225,7 +225,7 @@ describe('/libraries', () => {
|
|||||||
.send({ exclusionPatterns: [''] });
|
.send({ exclusionPatterns: [''] });
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[exclusionPatterns] Array items must not be empty']));
|
expect(body).toEqual(errorDto.badRequest(['each value in exclusionPatterns should not be empty']));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ describe('/map', () => {
|
|||||||
.get('/map/reverse-geocode?lon=123')
|
.get('/map/reverse-geocode?lon=123')
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[lat] Invalid input: expected number, received NaN']));
|
expect(body).toEqual(errorDto.badRequest(['lat must be a number between -90 and 90']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if a lat is not a number', async () => {
|
it('should throw an error if a lat is not a number', async () => {
|
||||||
@@ -117,7 +117,7 @@ describe('/map', () => {
|
|||||||
.get('/map/reverse-geocode?lat=abc&lon=123.456')
|
.get('/map/reverse-geocode?lat=abc&lon=123.456')
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[lat] Invalid input: expected number, received NaN']));
|
expect(body).toEqual(errorDto.badRequest(['lat must be a number between -90 and 90']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if a lat is out of range', async () => {
|
it('should throw an error if a lat is out of range', async () => {
|
||||||
@@ -125,7 +125,7 @@ describe('/map', () => {
|
|||||||
.get('/map/reverse-geocode?lat=91&lon=123.456')
|
.get('/map/reverse-geocode?lat=91&lon=123.456')
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[lat] Too big: expected number to be <=90']));
|
expect(body).toEqual(errorDto.badRequest(['lat must be a number between -90 and 90']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if a lon is not provided', async () => {
|
it('should throw an error if a lon is not provided', async () => {
|
||||||
@@ -133,7 +133,7 @@ describe('/map', () => {
|
|||||||
.get('/map/reverse-geocode?lat=75')
|
.get('/map/reverse-geocode?lat=75')
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[lon] Invalid input: expected number, received NaN']));
|
expect(body).toEqual(errorDto.badRequest(['lon must be a number between -180 and 180']));
|
||||||
});
|
});
|
||||||
|
|
||||||
const reverseGeocodeTestCases = [
|
const reverseGeocodeTestCases = [
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ const setupOAuth = async (token: string, dto: Partial<SystemConfigOAuthDto>) =>
|
|||||||
...defaults.oauth,
|
...defaults.oauth,
|
||||||
buttonText: 'Login with Immich',
|
buttonText: 'Login with Immich',
|
||||||
issuerUrl: `${authServer.internal}/.well-known/openid-configuration`,
|
issuerUrl: `${authServer.internal}/.well-known/openid-configuration`,
|
||||||
allowInsecureRequests: true,
|
|
||||||
...dto,
|
...dto,
|
||||||
};
|
};
|
||||||
await updateConfig({ systemConfigDto: { ...defaults, oauth: merged } }, options);
|
await updateConfig({ systemConfigDto: { ...defaults, oauth: merged } }, options);
|
||||||
@@ -102,7 +101,7 @@ describe(`/oauth`, () => {
|
|||||||
it(`should throw an error if a redirect uri is not provided`, async () => {
|
it(`should throw an error if a redirect uri is not provided`, async () => {
|
||||||
const { status, body } = await request(app).post('/oauth/authorize').send({});
|
const { status, body } = await request(app).post('/oauth/authorize').send({});
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[redirectUri] Invalid input: expected string, received undefined']));
|
expect(body).toEqual(errorDto.badRequest(['redirectUri must be a string', 'redirectUri should not be empty']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return a redirect uri', async () => {
|
it('should return a redirect uri', async () => {
|
||||||
@@ -124,13 +123,13 @@ describe(`/oauth`, () => {
|
|||||||
it(`should throw an error if a url is not provided`, async () => {
|
it(`should throw an error if a url is not provided`, async () => {
|
||||||
const { status, body } = await request(app).post('/oauth/callback').send({});
|
const { status, body } = await request(app).post('/oauth/callback').send({});
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[url] Invalid input: expected string, received undefined']));
|
expect(body).toEqual(errorDto.badRequest(['url must be a string', 'url should not be empty']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should throw an error if the url is empty`, async () => {
|
it(`should throw an error if the url is empty`, async () => {
|
||||||
const { status, body } = await request(app).post('/oauth/callback').send({ url: '' });
|
const { status, body } = await request(app).post('/oauth/callback').send({ url: '' });
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[url] Too small: expected string to have >=1 characters']));
|
expect(body).toEqual(errorDto.badRequest(['url should not be empty']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should throw an error if the state is not provided`, async () => {
|
it(`should throw an error if the state is not provided`, async () => {
|
||||||
@@ -400,23 +399,4 @@ describe(`/oauth`, () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('allowInsecureRequests: false', () => {
|
|
||||||
beforeAll(async () => {
|
|
||||||
await setupOAuth(admin.accessToken, {
|
|
||||||
enabled: true,
|
|
||||||
clientId: OAuthClient.DEFAULT,
|
|
||||||
clientSecret: OAuthClient.DEFAULT,
|
|
||||||
allowInsecureRequests: false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reject OAuth discovery over HTTP', async () => {
|
|
||||||
const { status, body } = await request(app)
|
|
||||||
.post('/oauth/authorize')
|
|
||||||
.send({ redirectUri: 'http://127.0.0.1:2285/auth/login' });
|
|
||||||
expect(status).toBe(500);
|
|
||||||
expect(body).toMatchObject({ statusCode: 500 });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ describe('/search', () => {
|
|||||||
const bytes = await readFile(join(testAssetDir, filename));
|
const bytes = await readFile(join(testAssetDir, filename));
|
||||||
assets.push(
|
assets.push(
|
||||||
await utils.createAsset(admin.accessToken, {
|
await utils.createAsset(admin.accessToken, {
|
||||||
|
deviceAssetId: `test-${filename}`,
|
||||||
assetData: { bytes, filename },
|
assetData: { bytes, filename },
|
||||||
...dto,
|
...dto,
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -243,21 +243,9 @@ describe('/shared-links', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should get data for correct password protected link', async () => {
|
it('should get data for correct password protected link', async () => {
|
||||||
const response = await request(app)
|
|
||||||
.post('/shared-links/login')
|
|
||||||
.send({ password: 'foo' })
|
|
||||||
.query({ key: linkWithPassword.key });
|
|
||||||
|
|
||||||
expect(response.status).toBe(201);
|
|
||||||
|
|
||||||
const cookies = response.get('Set-Cookie') ?? [];
|
|
||||||
expect(cookies).toHaveLength(1);
|
|
||||||
expect(cookies[0]).toContain('immich_shared_link_token');
|
|
||||||
|
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.get('/shared-links/me')
|
.get('/shared-links/me')
|
||||||
.query({ key: linkWithPassword.key })
|
.query({ key: linkWithPassword.key, password: 'foo' });
|
||||||
.set('Cookie', cookies);
|
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
expect(body).toEqual(
|
expect(body).toEqual(
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ describe('/tags', () => {
|
|||||||
.get(`/tags/${uuidDto.invalid}`)
|
.get(`/tags/${uuidDto.invalid}`)
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[id] Invalid UUID']));
|
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should get tag details', async () => {
|
it('should get tag details', async () => {
|
||||||
@@ -427,7 +427,7 @@ describe('/tags', () => {
|
|||||||
.delete(`/tags/${uuidDto.invalid}`)
|
.delete(`/tags/${uuidDto.invalid}`)
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(errorDto.badRequest(['[id] Invalid UUID']));
|
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should delete a tag', async () => {
|
it('should delete a tag', async () => {
|
||||||
|
|||||||
@@ -287,8 +287,7 @@ describe('/admin/users', () => {
|
|||||||
it('should delete user', async () => {
|
it('should delete user', async () => {
|
||||||
const { status, body } = await request(app)
|
const { status, body } = await request(app)
|
||||||
.delete(`/admin/users/${userToDelete.userId}`)
|
.delete(`/admin/users/${userToDelete.userId}`)
|
||||||
.set('Authorization', `Bearer ${admin.accessToken}`)
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
.send({});
|
|
||||||
|
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
expect(body).toMatchObject({
|
expect(body).toMatchObject({
|
||||||
|
|||||||
@@ -178,9 +178,7 @@ describe('/users', () => {
|
|||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(
|
expect(body).toEqual(errorDto.badRequest(['download.archiveSize must be an integer number']));
|
||||||
errorDto.badRequest(['[download.archiveSize] Invalid input: expected int, received number']),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update download archive size', async () => {
|
it('should update download archive size', async () => {
|
||||||
@@ -206,9 +204,7 @@ describe('/users', () => {
|
|||||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||||
|
|
||||||
expect(status).toBe(400);
|
expect(status).toBe(400);
|
||||||
expect(body).toEqual(
|
expect(body).toEqual(errorDto.badRequest(['download.includeEmbeddedVideos must be a boolean value']));
|
||||||
errorDto.badRequest(['[download.includeEmbeddedVideos] Invalid input: expected boolean, received number']),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update download include embedded videos', async () => {
|
it('should update download include embedded videos', async () => {
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ test.describe('Duplicates Utility', () => {
|
|||||||
|
|
||||||
test.beforeEach(async ({ context }) => {
|
test.beforeEach(async ({ context }) => {
|
||||||
[firstAsset, secondAsset] = await Promise.all([
|
[firstAsset, secondAsset] = await Promise.all([
|
||||||
utils.createAsset(admin.accessToken, {}),
|
utils.createAsset(admin.accessToken, { deviceAssetId: 'duplicate-a' }),
|
||||||
utils.createAsset(admin.accessToken, {}),
|
utils.createAsset(admin.accessToken, { deviceAssetId: 'duplicate-b' }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await updateAssets(
|
await updateAssets(
|
||||||
|
|||||||
@@ -77,4 +77,18 @@ test.describe('Photo Viewer', () => {
|
|||||||
});
|
});
|
||||||
expect(tagAtCenter).toBe('IMG');
|
expect(tagAtCenter).toBe('IMG');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('reloads photo when checksum changes', async ({ page }) => {
|
||||||
|
await page.goto(`/photos/${asset.id}`);
|
||||||
|
|
||||||
|
const preview = page.getByTestId('preview').filter({ visible: true });
|
||||||
|
await expect(preview).toHaveAttribute('src', /.+/);
|
||||||
|
const initialSrc = await preview.getAttribute('src');
|
||||||
|
|
||||||
|
const websocketEvent = utils.waitForWebsocketEvent({ event: 'assetUpdate', id: asset.id });
|
||||||
|
await utils.replaceAsset(admin.accessToken, asset.id);
|
||||||
|
await websocketEvent;
|
||||||
|
|
||||||
|
await expect(preview).not.toHaveAttribute('src', initialSrc!);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -315,9 +315,11 @@ export function toAssetResponseDto(asset: MockTimelineAsset, owner?: UserRespons
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
id: asset.id,
|
id: asset.id,
|
||||||
|
deviceAssetId: `device-${asset.id}`,
|
||||||
ownerId: asset.ownerId,
|
ownerId: asset.ownerId,
|
||||||
owner: owner || defaultOwner,
|
owner: owner || defaultOwner,
|
||||||
libraryId: `library-${asset.ownerId}`,
|
libraryId: `library-${asset.ownerId}`,
|
||||||
|
deviceId: `device-${asset.ownerId}`,
|
||||||
type: asset.isVideo ? AssetTypeEnum.Video : AssetTypeEnum.Image,
|
type: asset.isVideo ? AssetTypeEnum.Video : AssetTypeEnum.Image,
|
||||||
originalPath: `/original/${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
|
originalPath: `/original/${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
|
||||||
originalFileName: `${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
|
originalFileName: `${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
|
||||||
@@ -427,6 +429,7 @@ export function getAlbum(
|
|||||||
hasSharedLink: false,
|
hasSharedLink: false,
|
||||||
isActivityEnabled: true,
|
isActivityEnabled: true,
|
||||||
assetCount: albumAssets.length,
|
assetCount: albumAssets.length,
|
||||||
|
assets: albumAssets,
|
||||||
startDate: albumAssets.length > 0 ? albumAssets.at(-1)?.fileCreatedAt : undefined,
|
startDate: albumAssets.length > 0 ? albumAssets.at(-1)?.fileCreatedAt : undefined,
|
||||||
endDate: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
|
endDate: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
|
||||||
lastModifiedAssetTimestamp: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
|
lastModifiedAssetTimestamp: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { BrowserContext } from '@playwright/test';
|
import { BrowserContext } from '@playwright/test';
|
||||||
import { playwrightHost } from 'src/../playwright.config';
|
import { playwrightHost } from 'playwright.config';
|
||||||
|
|
||||||
export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserId: string) => {
|
export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserId: string) => {
|
||||||
await context.addCookies([
|
await context.addCookies([
|
||||||
@@ -173,7 +173,6 @@ export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserI
|
|||||||
'.mpeg',
|
'.mpeg',
|
||||||
'.mpg',
|
'.mpg',
|
||||||
'.mts',
|
'.mts',
|
||||||
'.ts',
|
|
||||||
'.vob',
|
'.vob',
|
||||||
'.webm',
|
'.webm',
|
||||||
'.wmv',
|
'.wmv',
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
|
|||||||
const now = new Date().toISOString();
|
const now = new Date().toISOString();
|
||||||
return {
|
return {
|
||||||
id: assetId,
|
id: assetId,
|
||||||
|
deviceAssetId: `device-${assetId}`,
|
||||||
ownerId,
|
ownerId,
|
||||||
owner: {
|
owner: {
|
||||||
id: ownerId,
|
id: ownerId,
|
||||||
@@ -26,6 +27,7 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
|
|||||||
avatarColor: 'blue' as never,
|
avatarColor: 'blue' as never,
|
||||||
},
|
},
|
||||||
libraryId: `library-${ownerId}`,
|
libraryId: `library-${ownerId}`,
|
||||||
|
deviceId: `device-${ownerId}`,
|
||||||
type: AssetTypeEnum.Image,
|
type: AssetTypeEnum.Image,
|
||||||
originalPath: `/original/${assetId}.jpg`,
|
originalPath: `/original/${assetId}.jpg`,
|
||||||
originalFileName: `${assetId}.jpg`,
|
originalFileName: `${assetId}.jpg`,
|
||||||
@@ -67,7 +69,7 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
|
|||||||
tags: [],
|
tags: [],
|
||||||
people: [],
|
people: [],
|
||||||
unassignedFaces: [],
|
unassignedFaces: [],
|
||||||
stack: undefined,
|
stack: null,
|
||||||
isOffline: false,
|
isOffline: false,
|
||||||
hasMetadata: true,
|
hasMetadata: true,
|
||||||
duplicateId: null,
|
duplicateId: null,
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import {
|
|||||||
generateTimelineData,
|
generateTimelineData,
|
||||||
TimelineAssetConfig,
|
TimelineAssetConfig,
|
||||||
TimelineData,
|
TimelineData,
|
||||||
toAssetResponseDto,
|
|
||||||
} from 'src/ui/generators/timeline';
|
} from 'src/ui/generators/timeline';
|
||||||
import { setupBaseMockApiRoutes } from 'src/ui/mock-network/base-network';
|
import { setupBaseMockApiRoutes } from 'src/ui/mock-network/base-network';
|
||||||
import { setupTimelineMockApiRoutes, TimelineTestContext } from 'src/ui/mock-network/timeline-network';
|
import { setupTimelineMockApiRoutes, TimelineTestContext } from 'src/ui/mock-network/timeline-network';
|
||||||
@@ -31,10 +30,6 @@ test.describe('search gallery-viewer', () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
test.beforeAll(async () => {
|
test.beforeAll(async () => {
|
||||||
test.fail(
|
|
||||||
process.env.PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS !== '1',
|
|
||||||
'This test requires env var: PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS=1',
|
|
||||||
);
|
|
||||||
adminUserId = faker.string.uuid();
|
adminUserId = faker.string.uuid();
|
||||||
testContext.adminId = adminUserId;
|
testContext.adminId = adminUserId;
|
||||||
timelineRestData = generateTimelineData({ ...createDefaultTimelineConfig(), ownerId: adminUserId });
|
timelineRestData = generateTimelineData({ ...createDefaultTimelineConfig(), ownerId: adminUserId });
|
||||||
@@ -49,10 +44,7 @@ test.describe('search gallery-viewer', () => {
|
|||||||
|
|
||||||
await context.route('**/api/search/metadata', async (route, request) => {
|
await context.route('**/api/search/metadata', async (route, request) => {
|
||||||
if (request.method() === 'POST') {
|
if (request.method() === 'POST') {
|
||||||
const searchAssets = assets
|
const searchAssets = assets.slice(0, 5).filter((asset) => !changes.assetDeletions.includes(asset.id));
|
||||||
.slice(0, 5)
|
|
||||||
.filter((asset) => !changes.assetDeletions.includes(asset.id))
|
|
||||||
.map((asset) => toAssetResponseDto(asset));
|
|
||||||
return route.fulfill({
|
return route.fulfill({
|
||||||
status: 200,
|
status: 200,
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import {
|
|||||||
AssetMediaResponseDto,
|
AssetMediaResponseDto,
|
||||||
AssetResponseDto,
|
AssetResponseDto,
|
||||||
AssetVisibility,
|
AssetVisibility,
|
||||||
|
CheckExistingAssetsDto,
|
||||||
CreateAlbumDto,
|
CreateAlbumDto,
|
||||||
CreateLibraryDto,
|
CreateLibraryDto,
|
||||||
JobCreateDto,
|
JobCreateDto,
|
||||||
@@ -19,6 +20,7 @@ import {
|
|||||||
UserAdminCreateDto,
|
UserAdminCreateDto,
|
||||||
UserPreferencesUpdateDto,
|
UserPreferencesUpdateDto,
|
||||||
ValidateLibraryDto,
|
ValidateLibraryDto,
|
||||||
|
checkExistingAssets,
|
||||||
createAlbum,
|
createAlbum,
|
||||||
createApiKey,
|
createApiKey,
|
||||||
createJob,
|
createJob,
|
||||||
@@ -341,6 +343,8 @@ export const utils = {
|
|||||||
},
|
},
|
||||||
) => {
|
) => {
|
||||||
const _dto = {
|
const _dto = {
|
||||||
|
deviceAssetId: 'test-1',
|
||||||
|
deviceId: 'test',
|
||||||
fileCreatedAt: new Date().toISOString(),
|
fileCreatedAt: new Date().toISOString(),
|
||||||
fileModifiedAt: new Date().toISOString(),
|
fileModifiedAt: new Date().toISOString(),
|
||||||
...dto,
|
...dto,
|
||||||
@@ -371,6 +375,40 @@ export const utils = {
|
|||||||
return body as AssetMediaResponseDto;
|
return body as AssetMediaResponseDto;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
replaceAsset: async (
|
||||||
|
accessToken: string,
|
||||||
|
assetId: string,
|
||||||
|
dto?: Partial<Omit<AssetMediaCreateDto, 'assetData'>> & { assetData?: FileData },
|
||||||
|
) => {
|
||||||
|
const _dto = {
|
||||||
|
deviceAssetId: 'test-1',
|
||||||
|
deviceId: 'test',
|
||||||
|
fileCreatedAt: new Date().toISOString(),
|
||||||
|
fileModifiedAt: new Date().toISOString(),
|
||||||
|
...dto,
|
||||||
|
};
|
||||||
|
|
||||||
|
const assetData = dto?.assetData?.bytes || makeRandomImage();
|
||||||
|
const filename = dto?.assetData?.filename || 'example.png';
|
||||||
|
|
||||||
|
if (dto?.assetData?.bytes) {
|
||||||
|
console.log(`Uploading ${filename}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const builder = request(app)
|
||||||
|
.put(`/assets/${assetId}/original`)
|
||||||
|
.attach('assetData', assetData, filename)
|
||||||
|
.set('Authorization', `Bearer ${accessToken}`);
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(_dto)) {
|
||||||
|
void builder.field(key, String(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
const { body } = await builder;
|
||||||
|
|
||||||
|
return body as AssetMediaResponseDto;
|
||||||
|
},
|
||||||
|
|
||||||
createImageFile: (path: string) => {
|
createImageFile: (path: string) => {
|
||||||
if (!existsSync(dirname(path))) {
|
if (!existsSync(dirname(path))) {
|
||||||
mkdirSync(dirname(path), { recursive: true });
|
mkdirSync(dirname(path), { recursive: true });
|
||||||
@@ -412,6 +450,9 @@ export const utils = {
|
|||||||
|
|
||||||
getAssetInfo: (accessToken: string, id: string) => getAssetInfo({ id }, { headers: asBearerAuth(accessToken) }),
|
getAssetInfo: (accessToken: string, id: string) => getAssetInfo({ id }, { headers: asBearerAuth(accessToken) }),
|
||||||
|
|
||||||
|
checkExistingAssets: (accessToken: string, checkExistingAssetsDto: CheckExistingAssetsDto) =>
|
||||||
|
checkExistingAssets({ checkExistingAssetsDto }, { headers: asBearerAuth(accessToken) }),
|
||||||
|
|
||||||
searchAssets: async (accessToken: string, dto: MetadataSearchDto) => {
|
searchAssets: async (accessToken: string, dto: MetadataSearchDto) => {
|
||||||
return searchAssets({ metadataSearchDto: dto }, { headers: asBearerAuth(accessToken) });
|
return searchAssets({ metadataSearchDto: dto }, { headers: asBearerAuth(accessToken) });
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-3
@@ -14,10 +14,8 @@
|
|||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"paths": {
|
|
||||||
"src/*": ["./src/*"]
|
|
||||||
},
|
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
|
"baseUrl": "./"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts", "vitest*.config.ts"],
|
"include": ["src/**/*.ts", "vitest*.config.ts"],
|
||||||
"exclude": ["dist", "node_modules"]
|
"exclude": ["dist", "node_modules"]
|
||||||
|
|||||||
+8
-17
@@ -3,7 +3,7 @@
|
|||||||
"account": "حساب",
|
"account": "حساب",
|
||||||
"account_settings": "إعدادات الحساب",
|
"account_settings": "إعدادات الحساب",
|
||||||
"acknowledge": "أُدرك ذلك",
|
"acknowledge": "أُدرك ذلك",
|
||||||
"action": "إجراء",
|
"action": "عملية",
|
||||||
"action_common_update": "تحديث",
|
"action_common_update": "تحديث",
|
||||||
"action_description": "مجموعة من الفعاليات التي ستنفذ على الأصول التي تم تصفيتها",
|
"action_description": "مجموعة من الفعاليات التي ستنفذ على الأصول التي تم تصفيتها",
|
||||||
"actions": "عمليات",
|
"actions": "عمليات",
|
||||||
@@ -61,8 +61,8 @@
|
|||||||
"backup_onboarding_1_description": "نسخة خارج الموقع في موقع آخر.",
|
"backup_onboarding_1_description": "نسخة خارج الموقع في موقع آخر.",
|
||||||
"backup_onboarding_2_description": "نسخ محلية على أجهزة مختلفة. يشمل ذلك الملفات الرئيسية ونسخة احتياطية محلية منها.",
|
"backup_onboarding_2_description": "نسخ محلية على أجهزة مختلفة. يشمل ذلك الملفات الرئيسية ونسخة احتياطية محلية منها.",
|
||||||
"backup_onboarding_3_description": "إجمالي نُسخ بياناتك، بما في ذلك الملفات الأصلية. يشمل ذلك نسخةً واحدةً خارج الموقع ونسختين محليتين.",
|
"backup_onboarding_3_description": "إجمالي نُسخ بياناتك، بما في ذلك الملفات الأصلية. يشمل ذلك نسخةً واحدةً خارج الموقع ونسختين محليتين.",
|
||||||
"backup_onboarding_description": "يُنصح باتباع <backblaze-link>استراتيجية النسخ الاحتياطي 3-2- 1</backblaze-link> لحماية بياناتك. احتفظ بنسخ احتياطية من صورك/فيديوهاتك المحمّلة، بالإضافة إلى قاعدة بيانات Immich، لضمان حل نسخ احتياطي شامل.",
|
"backup_onboarding_description": "يُنصح باتباع <backblaze-link>استراتيجية النسخ الاحتياطي 3-2-1</backblaze-link> لحماية بياناتك. احتفظ بنسخ احتياطية من صورك/فيديوهاتك المحمّلة، بالإضافة إلى قاعدة بيانات Immich، لضمان حل نسخ احتياطي شامل.",
|
||||||
"backup_onboarding_footer": "لمزيد من المعلومات حول النسخ الاحتياطي لـ <link>Immich</link>، يرجى الرجوع إلى <link>الوثائق</link>.",
|
"backup_onboarding_footer": "لمزيد من المعلومات حول النسخ الاحتياطي لـ Immich، يرجى الرجوع إلى <link> التعليمات </link>.",
|
||||||
"backup_onboarding_parts_title": "يتضمن النسخ الاحتياطي 3-2-1 ما يلي:",
|
"backup_onboarding_parts_title": "يتضمن النسخ الاحتياطي 3-2-1 ما يلي:",
|
||||||
"backup_onboarding_title": "النسخ الاحتياطية",
|
"backup_onboarding_title": "النسخ الاحتياطية",
|
||||||
"backup_settings": "إعدادات تفريغ قاعدة البيانات",
|
"backup_settings": "إعدادات تفريغ قاعدة البيانات",
|
||||||
@@ -333,7 +333,7 @@
|
|||||||
"storage_template_migration_description": "قم بتطبيق القالب الحالي <link>{template}</link> على المحتويات التي تم رفعها سابقًا",
|
"storage_template_migration_description": "قم بتطبيق القالب الحالي <link>{template}</link> على المحتويات التي تم رفعها سابقًا",
|
||||||
"storage_template_migration_info": "تغييرات النموذج الخزني ستغير جميع الصيغ الى احرف صغيرة. تغييرات النموذج ستنطبق فقط على المحتويات الجديدة. لتطبيق النموذج على المحتويات التي تم رفعها سابقًا، قم بتشغيل <link>{job}</link>.",
|
"storage_template_migration_info": "تغييرات النموذج الخزني ستغير جميع الصيغ الى احرف صغيرة. تغييرات النموذج ستنطبق فقط على المحتويات الجديدة. لتطبيق النموذج على المحتويات التي تم رفعها سابقًا، قم بتشغيل <link>{job}</link>.",
|
||||||
"storage_template_migration_job": "وظيفة تهجير قالب التخزين",
|
"storage_template_migration_job": "وظيفة تهجير قالب التخزين",
|
||||||
"storage_template_more_details": "لمزيد من التفاصيل حول هذه الميزة، يرجى الرجوع إلى <template-link>Storage Template</template-link> و <implications-link>implications</implications-link>.",
|
"storage_template_more_details": "لمزيد من التفاصيل حول هذه الميزة، يرجى الرجوع إلى <template-link>Storage Template</template-link> و<implications-link>implications</implications-link>",
|
||||||
"storage_template_onboarding_description_v2": "عند التفعيل. هذه الخاصية ستقوم بالترتيب التلقائي للملفات بناء على نموذج معرف من قبل المستخدم. رجاء اطلع على <link>التوثيق</link>.",
|
"storage_template_onboarding_description_v2": "عند التفعيل. هذه الخاصية ستقوم بالترتيب التلقائي للملفات بناء على نموذج معرف من قبل المستخدم. رجاء اطلع على <link>التوثيق</link>.",
|
||||||
"storage_template_path_length": "الحد التقريبي لطول المسار: <b>{length, number}</b>/{limit, number}",
|
"storage_template_path_length": "الحد التقريبي لطول المسار: <b>{length, number}</b>/{limit, number}",
|
||||||
"storage_template_settings": "قالب التخزين",
|
"storage_template_settings": "قالب التخزين",
|
||||||
@@ -372,7 +372,7 @@
|
|||||||
"transcoding_audio_codec": "كود الصوت",
|
"transcoding_audio_codec": "كود الصوت",
|
||||||
"transcoding_audio_codec_description": "Opus هو الخيار ذو أعلى جودة، ولكنه يتمتع بتوافق أقل مع الأجهزة أو البرمجيات القديمة.",
|
"transcoding_audio_codec_description": "Opus هو الخيار ذو أعلى جودة، ولكنه يتمتع بتوافق أقل مع الأجهزة أو البرمجيات القديمة.",
|
||||||
"transcoding_bitrate_description": "مقاطع الفيديو التي يتجاوز معدل البت أقصى قيمة أو التي لا تكون في تنسيق مقبول",
|
"transcoding_bitrate_description": "مقاطع الفيديو التي يتجاوز معدل البت أقصى قيمة أو التي لا تكون في تنسيق مقبول",
|
||||||
"transcoding_codecs_learn_more": "لمعرفة المزيد حول المصطلحات المستخدمة هنا، يرجى الرجوع إلى وثائق FFmpeg لـ <h264-link>H.264 codec</h264-link>، و <hevc-link>HEVC codec</hevc-link> و <vp9-link>VP9 codec</vp9-link>.",
|
"transcoding_codecs_learn_more": "لمعرفة المزيد حول المصطلحات المستخدمة هنا، يرجى الرجوع إلى وثائق FFmpeg لل<h264-link>H.264 codec</h264-link>, <hevc-link>HEVC codec</hevc-link> and <vp9-link>VP9 codec</vp9-link>.",
|
||||||
"transcoding_constant_quality_mode": "وضع الجودة الثابتة",
|
"transcoding_constant_quality_mode": "وضع الجودة الثابتة",
|
||||||
"transcoding_constant_quality_mode_description": "ICQ أفضل من CQP، ولكن بعض أجهزة عتاد التسريع لا تدعم هذا الوضع. تعيين هذا الخيار يسجعل الأفضلية للوضع المحدد عند استخدام الترميز بناءً على الجودة. يتم تجاهله بواسطة NVENC لأنه لا يدعم ICQ.",
|
"transcoding_constant_quality_mode_description": "ICQ أفضل من CQP، ولكن بعض أجهزة عتاد التسريع لا تدعم هذا الوضع. تعيين هذا الخيار يسجعل الأفضلية للوضع المحدد عند استخدام الترميز بناءً على الجودة. يتم تجاهله بواسطة NVENC لأنه لا يدعم ICQ.",
|
||||||
"transcoding_constant_rate_factor": "عامل معدل الجودة الثابت (-crf)",
|
"transcoding_constant_rate_factor": "عامل معدل الجودة الثابت (-crf)",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "إنشاء رابط للمشاركة",
|
"create_link_to_share": "إنشاء رابط للمشاركة",
|
||||||
"create_link_to_share_description": "السماح لأي شخص لديه الرابط بمشاهدة الصورة (الصور) المحددة",
|
"create_link_to_share_description": "السماح لأي شخص لديه الرابط بمشاهدة الصورة (الصور) المحددة",
|
||||||
"create_new": "انشاء جديد",
|
"create_new": "انشاء جديد",
|
||||||
"create_new_face": "إنشاء وجه جديد",
|
|
||||||
"create_new_person": "إنشاء شخص جديد",
|
"create_new_person": "إنشاء شخص جديد",
|
||||||
"create_new_person_hint": "تعيين المحتويات المحددة لشخص جديد",
|
"create_new_person_hint": "تعيين المحتويات المحددة لشخص جديد",
|
||||||
"create_new_user": "إنشاء مستخدم جديد",
|
"create_new_user": "إنشاء مستخدم جديد",
|
||||||
"create_person": "إنشاء شخص",
|
|
||||||
"create_person_subtitle": "أضف اسماً للوجه المحدد لإنشاء الشخص الجديد والإشارة إليه",
|
|
||||||
"create_shared_album_page_share_add_assets": "إضافة الأصول",
|
"create_shared_album_page_share_add_assets": "إضافة الأصول",
|
||||||
"create_shared_album_page_share_select_photos": "حدد الصور",
|
"create_shared_album_page_share_select_photos": "حدد الصور",
|
||||||
"create_shared_link": "انشاء رابط مشترك",
|
"create_shared_link": "انشاء رابط مشترك",
|
||||||
@@ -895,8 +892,6 @@
|
|||||||
"day": "يوم",
|
"day": "يوم",
|
||||||
"days": "ايام",
|
"days": "ايام",
|
||||||
"deduplicate_all": "إلغاء تكرار الكل",
|
"deduplicate_all": "إلغاء تكرار الكل",
|
||||||
"default_locale": "الإعدادات المحلية الافتراضية",
|
|
||||||
"default_locale_description": "تنسيق التواريخ والأرقام بناءً على الإعدادات المحلية للمتصفح",
|
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"delete_action_confirmation_message": "هل انت متأكد من حذف هذا الملف؟ هذا سؤدي الى نقل الملف الى سلة مهملات الخادم وسيتم اشعارك ان كنت تريد حذفه على الجهاز",
|
"delete_action_confirmation_message": "هل انت متأكد من حذف هذا الملف؟ هذا سؤدي الى نقل الملف الى سلة مهملات الخادم وسيتم اشعارك ان كنت تريد حذفه على الجهاز",
|
||||||
"delete_action_prompt": "تم حذف {count}",
|
"delete_action_prompt": "تم حذف {count}",
|
||||||
@@ -1389,11 +1384,9 @@
|
|||||||
"library_page_sort_title": "عنوان الألبوم",
|
"library_page_sort_title": "عنوان الألبوم",
|
||||||
"licenses": "رُخَص",
|
"licenses": "رُخَص",
|
||||||
"light": "المضيئ",
|
"light": "المضيئ",
|
||||||
"light_theme": "التبديل إلى المظهر الفاتح",
|
|
||||||
"like": "اعجاب",
|
"like": "اعجاب",
|
||||||
"like_deleted": "تم حذف الإعجاب",
|
"like_deleted": "تم حذف الإعجاب",
|
||||||
"link_motion_video": "رابط فيديو الحركة",
|
"link_motion_video": "رابط فيديو الحركة",
|
||||||
"link_to_docs": "لمزيد من المعلومات، يُرجى الرجوع إلى <link>الوثائق</link>.",
|
|
||||||
"link_to_oauth": "الربط مع OAuth",
|
"link_to_oauth": "الربط مع OAuth",
|
||||||
"linked_oauth_account": "حساب مرتبط بـ OAuth",
|
"linked_oauth_account": "حساب مرتبط بـ OAuth",
|
||||||
"list": "قائمة",
|
"list": "قائمة",
|
||||||
@@ -2217,7 +2210,6 @@
|
|||||||
"tag": "العلامة",
|
"tag": "العلامة",
|
||||||
"tag_assets": "أصول العلامة",
|
"tag_assets": "أصول العلامة",
|
||||||
"tag_created": "تم إنشاء العلامة: {tag}",
|
"tag_created": "تم إنشاء العلامة: {tag}",
|
||||||
"tag_face": "علِّم الوجه",
|
|
||||||
"tag_feature_description": "تصفح الصور ومقاطع الفيديو المجمعة حسب مواضيع العلامات المنطقية",
|
"tag_feature_description": "تصفح الصور ومقاطع الفيديو المجمعة حسب مواضيع العلامات المنطقية",
|
||||||
"tag_not_found_question": "لا يمكن العثور على علامة؟ <link>قم بإنشاء علامة جديدة.</link>",
|
"tag_not_found_question": "لا يمكن العثور على علامة؟ <link>قم بإنشاء علامة جديدة.</link>",
|
||||||
"tag_people": "علِّم الأشخاص",
|
"tag_people": "علِّم الأشخاص",
|
||||||
@@ -2392,14 +2384,13 @@
|
|||||||
"view_name": "عرض",
|
"view_name": "عرض",
|
||||||
"view_next_asset": "عرض المحتوى التالي",
|
"view_next_asset": "عرض المحتوى التالي",
|
||||||
"view_previous_asset": "عرض المحتوى السابق",
|
"view_previous_asset": "عرض المحتوى السابق",
|
||||||
"view_qr_code": "عرض رمز الاستجابة السريعة",
|
"view_qr_code": "عرض رمز الاستجابة السريعة",
|
||||||
"view_similar_photos": "عرض صور مشابهة",
|
"view_similar_photos": "عرض صور مشابهة",
|
||||||
"view_stack": "عرض التكديس",
|
"view_stack": "عرض التكديس",
|
||||||
"view_user": "عرض المستخدم",
|
"view_user": "عرض المستخدم",
|
||||||
"viewer_remove_from_stack": "حذف من الكومه أو المجموعة",
|
"viewer_remove_from_stack": "حذف من الكومه أو المجموعة",
|
||||||
"viewer_stack_use_as_main_asset": "استخدم كأصل رئيسي",
|
"viewer_stack_use_as_main_asset": "استخدم كأصل رئيسي",
|
||||||
"viewer_unstack": "فك الكومه",
|
"viewer_unstack": "فك الكومه",
|
||||||
"visibility": "إمكانية الرؤية",
|
|
||||||
"visibility_changed": "الرؤية تغيرت لـ {count, plural, one {شخص واحد} other {# عدة أشخاص}}",
|
"visibility_changed": "الرؤية تغيرت لـ {count, plural, one {شخص واحد} other {# عدة أشخاص}}",
|
||||||
"visual": "مرئي",
|
"visual": "مرئي",
|
||||||
"visual_builder": "اداة نشاء مرئية",
|
"visual_builder": "اداة نشاء مرئية",
|
||||||
@@ -2411,14 +2402,14 @@
|
|||||||
"welcome_to_immich": "مرحباً بك في Immich",
|
"welcome_to_immich": "مرحباً بك في Immich",
|
||||||
"width": "عُرض",
|
"width": "عُرض",
|
||||||
"wifi_name": "اسم شبكة Wi-Fi",
|
"wifi_name": "اسم شبكة Wi-Fi",
|
||||||
"workflow_delete_prompt": "متأكد من حذف سير العمل هذا؟",
|
"workflow_delete_prompt": "هل أنت متأكد من حذف سير العمل هذا؟",
|
||||||
"workflow_deleted": "تم حذف سير العمل",
|
"workflow_deleted": "تم حذف سير العمل",
|
||||||
"workflow_description": "وصف سير العمل",
|
"workflow_description": "وصف سير العمل",
|
||||||
"workflow_info": "معلومات سير العمل",
|
"workflow_info": "معلومات سير العمل",
|
||||||
"workflow_json": "ملف JSON لسير العمل",
|
"workflow_json": "ملف JSON لسير العمل",
|
||||||
"workflow_json_help": "قم بتعديل إعدادات سير العمل بصيغة JSON. ستتم مزامنة التغييرات مع أداة الإنشاء المرئية.",
|
"workflow_json_help": "قم بتعديل إعدادات سير العمل بصيغة JSON. ستتم مزامنة التغييرات مع أداة الإنشاء المرئية.",
|
||||||
"workflow_name": "اسم سير العمل",
|
"workflow_name": "اسم سير العمل",
|
||||||
"workflow_navigation_prompt": "متاكد من المغادرة بدون حفظ التغييرات؟",
|
"workflow_navigation_prompt": "هل انت متاكد من المغادرة بدون حفظ التغييرات؟",
|
||||||
"workflow_summary": "ملخص سير العمل",
|
"workflow_summary": "ملخص سير العمل",
|
||||||
"workflow_update_success": "تم تحديث سير العمل بنجاح",
|
"workflow_update_success": "تم تحديث سير العمل بنجاح",
|
||||||
"workflow_updated": "تم تحديث سير العمل",
|
"workflow_updated": "تم تحديث سير العمل",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Създаване на линк за споделяне",
|
"create_link_to_share": "Създаване на линк за споделяне",
|
||||||
"create_link_to_share_description": "Позволете на всеки, който има линк, да види избраната(ите) снимка(и)",
|
"create_link_to_share_description": "Позволете на всеки, който има линк, да види избраната(ите) снимка(и)",
|
||||||
"create_new": "СЪЗДАЙ НОВ",
|
"create_new": "СЪЗДАЙ НОВ",
|
||||||
"create_new_face": "Създай ново лице",
|
|
||||||
"create_new_person": "Създаване на ново лице",
|
"create_new_person": "Създаване на ново лице",
|
||||||
"create_new_person_hint": "Присвойте избраните файлове на нов човек",
|
"create_new_person_hint": "Присвойте избраните файлове на нов човек",
|
||||||
"create_new_user": "Създаване на нов потребител",
|
"create_new_user": "Създаване на нов потребител",
|
||||||
"create_person": "Създай човек",
|
|
||||||
"create_person_subtitle": "Добави име към избраното лице за да създадеш и да сложиш етикет на новия човек",
|
|
||||||
"create_shared_album_page_share_add_assets": "ДОБАВИ ОБЕКТИ",
|
"create_shared_album_page_share_add_assets": "ДОБАВИ ОБЕКТИ",
|
||||||
"create_shared_album_page_share_select_photos": "Избери снимки",
|
"create_shared_album_page_share_select_photos": "Избери снимки",
|
||||||
"create_shared_link": "Създай линк за споделяне",
|
"create_shared_link": "Създай линк за споделяне",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Таг",
|
"tag": "Таг",
|
||||||
"tag_assets": "Тагни елементи",
|
"tag_assets": "Тагни елементи",
|
||||||
"tag_created": "Създаден етикет: {tag}",
|
"tag_created": "Създаден етикет: {tag}",
|
||||||
"tag_face": "Отбележи лице",
|
|
||||||
"tag_feature_description": "Разглеждане на снимки и видеоклипове, групирани по теми с логически тагове",
|
"tag_feature_description": "Разглеждане на снимки и видеоклипове, групирани по теми с логически тагове",
|
||||||
"tag_not_found_question": "Не можете да намерите етикет? <link>Създайте нов етикет.</link>",
|
"tag_not_found_question": "Не можете да намерите етикет? <link>Създайте нов етикет.</link>",
|
||||||
"tag_people": "Отбележи Хора",
|
"tag_people": "Отбележи Хора",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Crear enllaç per compartir",
|
"create_link_to_share": "Crear enllaç per compartir",
|
||||||
"create_link_to_share_description": "Deixa que qualsevol persona amb l'enllaç vegi les fotos seleccionades",
|
"create_link_to_share_description": "Deixa que qualsevol persona amb l'enllaç vegi les fotos seleccionades",
|
||||||
"create_new": "CREAR NOU",
|
"create_new": "CREAR NOU",
|
||||||
"create_new_face": "Crea una nova cara",
|
|
||||||
"create_new_person": "Crea una nova persona",
|
"create_new_person": "Crea una nova persona",
|
||||||
"create_new_person_hint": "Assigna els elements seleccionats a una persona nova",
|
"create_new_person_hint": "Assigna els elements seleccionats a una persona nova",
|
||||||
"create_new_user": "Crea un usuari nou",
|
"create_new_user": "Crea un usuari nou",
|
||||||
"create_person": "Crea una persona",
|
|
||||||
"create_person_subtitle": "Afegeix un nom a la cara seleccionada per crear i etiquetar la nova persona",
|
|
||||||
"create_shared_album_page_share_add_assets": "AFEGEIX ELEMENTS",
|
"create_shared_album_page_share_add_assets": "AFEGEIX ELEMENTS",
|
||||||
"create_shared_album_page_share_select_photos": "Escull fotografies",
|
"create_shared_album_page_share_select_photos": "Escull fotografies",
|
||||||
"create_shared_link": "Crea un enllaç compartit",
|
"create_shared_link": "Crea un enllaç compartit",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Etiqueta",
|
"tag": "Etiqueta",
|
||||||
"tag_assets": "Etiquetar actius",
|
"tag_assets": "Etiquetar actius",
|
||||||
"tag_created": "Etiqueta creada: {tag}",
|
"tag_created": "Etiqueta creada: {tag}",
|
||||||
"tag_face": "Etiqueta una cara",
|
|
||||||
"tag_feature_description": "Exploreu fotos i vídeos agrupats per temes d'etiquetes lògiques",
|
"tag_feature_description": "Exploreu fotos i vídeos agrupats per temes d'etiquetes lògiques",
|
||||||
"tag_not_found_question": "No trobeu una etiqueta? <link>Crear una nova etiqueta.</link>",
|
"tag_not_found_question": "No trobeu una etiqueta? <link>Crear una nova etiqueta.</link>",
|
||||||
"tag_people": "Etiquetar personas",
|
"tag_people": "Etiquetar personas",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Opret link for at dele",
|
"create_link_to_share": "Opret link for at dele",
|
||||||
"create_link_to_share_description": "Tillad alle med linket at se de(t) valgte billede(r)",
|
"create_link_to_share_description": "Tillad alle med linket at se de(t) valgte billede(r)",
|
||||||
"create_new": "OPRET NY",
|
"create_new": "OPRET NY",
|
||||||
"create_new_face": "Opret nyt ansigt",
|
|
||||||
"create_new_person": "Opret ny person",
|
"create_new_person": "Opret ny person",
|
||||||
"create_new_person_hint": "Tildel valgte aktiver til en ny person",
|
"create_new_person_hint": "Tildel valgte aktiver til en ny person",
|
||||||
"create_new_user": "Opret ny bruger",
|
"create_new_user": "Opret ny bruger",
|
||||||
"create_person": "Opret person",
|
|
||||||
"create_person_subtitle": "Tilføj et navn til det valgte ansigt for at oprette og tagge den nye person",
|
|
||||||
"create_shared_album_page_share_add_assets": "TILFØJ ELEMENT",
|
"create_shared_album_page_share_add_assets": "TILFØJ ELEMENT",
|
||||||
"create_shared_album_page_share_select_photos": "Vælg Billeder",
|
"create_shared_album_page_share_select_photos": "Vælg Billeder",
|
||||||
"create_shared_link": "Opret delt link",
|
"create_shared_link": "Opret delt link",
|
||||||
@@ -895,7 +892,6 @@
|
|||||||
"day": "Dag",
|
"day": "Dag",
|
||||||
"days": "Dage",
|
"days": "Dage",
|
||||||
"deduplicate_all": "Dedubliker alle",
|
"deduplicate_all": "Dedubliker alle",
|
||||||
"default_locale": "Standard sprog",
|
|
||||||
"default_locale_description": "Formatér datoer og tal baseret på din browsers landestandard",
|
"default_locale_description": "Formatér datoer og tal baseret på din browsers landestandard",
|
||||||
"delete": "Slet",
|
"delete": "Slet",
|
||||||
"delete_action_confirmation_message": "Er du sikker på, at du vil slette dette objekt? Denne handling vil flytte objektet til serverens papirkurv, og vil spørge dig, om du vil slette den lokalt",
|
"delete_action_confirmation_message": "Er du sikker på, at du vil slette dette objekt? Denne handling vil flytte objektet til serverens papirkurv, og vil spørge dig, om du vil slette den lokalt",
|
||||||
@@ -2217,7 +2213,6 @@
|
|||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Tag mediefiler",
|
"tag_assets": "Tag mediefiler",
|
||||||
"tag_created": "Oprettet tag: {tag}",
|
"tag_created": "Oprettet tag: {tag}",
|
||||||
"tag_face": "Tag ansigt",
|
|
||||||
"tag_feature_description": "Gennemse billeder og videoer grupperet efter logiske tag-emner",
|
"tag_feature_description": "Gennemse billeder og videoer grupperet efter logiske tag-emner",
|
||||||
"tag_not_found_question": "Kan du ikke finde et tag? <link>Opret et nyt tag.</link>",
|
"tag_not_found_question": "Kan du ikke finde et tag? <link>Opret et nyt tag.</link>",
|
||||||
"tag_people": "Tag personer",
|
"tag_people": "Tag personer",
|
||||||
|
|||||||
+4
-8
@@ -541,7 +541,7 @@
|
|||||||
"app_settings": "App-Einstellungen",
|
"app_settings": "App-Einstellungen",
|
||||||
"app_stores": "App Stores",
|
"app_stores": "App Stores",
|
||||||
"app_update_available": "App Update verfügbar",
|
"app_update_available": "App Update verfügbar",
|
||||||
"appears_in": "Enthalten in",
|
"appears_in": "Erscheint in",
|
||||||
"apply_count": "Anwenden ({count, number})",
|
"apply_count": "Anwenden ({count, number})",
|
||||||
"archive": "Archiv",
|
"archive": "Archiv",
|
||||||
"archive_action_prompt": "{count} zum Archiv hinzugefügt",
|
"archive_action_prompt": "{count} zum Archiv hinzugefügt",
|
||||||
@@ -812,8 +812,8 @@
|
|||||||
"confirm_keep_this_delete_others": "Alle anderen Dateien im Stapel bis auf diese werden gelöscht. Bist du sicher, dass du fortfahren möchten?",
|
"confirm_keep_this_delete_others": "Alle anderen Dateien im Stapel bis auf diese werden gelöscht. Bist du sicher, dass du fortfahren möchten?",
|
||||||
"confirm_new_pin_code": "Neuen PIN-Code bestätigen",
|
"confirm_new_pin_code": "Neuen PIN-Code bestätigen",
|
||||||
"confirm_password": "Passwort bestätigen",
|
"confirm_password": "Passwort bestätigen",
|
||||||
"confirm_tag_face": "Wollen Sie dieses Gesicht mit {name} taggen?",
|
"confirm_tag_face": "Wollen Sie dieses Gesicht mit {name} markieren?",
|
||||||
"confirm_tag_face_unnamed": "Möchten Sie dieses Gesicht taggen?",
|
"confirm_tag_face_unnamed": "Möchten Sie dieses Gesicht markieren?",
|
||||||
"connected_device": "Verbundenes Gerät",
|
"connected_device": "Verbundenes Gerät",
|
||||||
"connected_to": "Verbunden mit",
|
"connected_to": "Verbunden mit",
|
||||||
"contain": "Vollständig",
|
"contain": "Vollständig",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Link zum Teilen erstellen",
|
"create_link_to_share": "Link zum Teilen erstellen",
|
||||||
"create_link_to_share_description": "Lass jeden mit dem Link die ausgewählten Fotos sehen",
|
"create_link_to_share_description": "Lass jeden mit dem Link die ausgewählten Fotos sehen",
|
||||||
"create_new": "NEUES ERSTELLEN",
|
"create_new": "NEUES ERSTELLEN",
|
||||||
"create_new_face": "Neues Gesicht erstellen",
|
|
||||||
"create_new_person": "Neue Person anlegen",
|
"create_new_person": "Neue Person anlegen",
|
||||||
"create_new_person_hint": "Ausgewählte Dateien einer neuen Person zuweisen",
|
"create_new_person_hint": "Ausgewählte Dateien einer neuen Person zuweisen",
|
||||||
"create_new_user": "Neuen Nutzer erstellen",
|
"create_new_user": "Neuen Nutzer erstellen",
|
||||||
"create_person": "Person anlegen",
|
|
||||||
"create_person_subtitle": "Gib dem gewählten Gesicht einen Namen um die neue Person zu erstellen und zu taggen",
|
|
||||||
"create_shared_album_page_share_add_assets": "INHALTE HINZUFÜGEN",
|
"create_shared_album_page_share_add_assets": "INHALTE HINZUFÜGEN",
|
||||||
"create_shared_album_page_share_select_photos": "Fotos auswählen",
|
"create_shared_album_page_share_select_photos": "Fotos auswählen",
|
||||||
"create_shared_link": "Geteilten Link erstellen",
|
"create_shared_link": "Geteilten Link erstellen",
|
||||||
@@ -1038,7 +1035,7 @@
|
|||||||
"error_loading_partners": "Fehler beim Laden der Partner: {error}",
|
"error_loading_partners": "Fehler beim Laden der Partner: {error}",
|
||||||
"error_retrieving_asset_information": "Fehler beim Abruf der Dateiinformationen",
|
"error_retrieving_asset_information": "Fehler beim Abruf der Dateiinformationen",
|
||||||
"error_saving_image": "Fehler: {error}",
|
"error_saving_image": "Fehler: {error}",
|
||||||
"error_tag_face_bounding_box": "Fehler beim Taggen des Gesichts - Begrenzungen können nicht abgerufen werden",
|
"error_tag_face_bounding_box": "Fehler beim Markieren des Gesichts - Begrenzungen können nicht abgerufen werden",
|
||||||
"error_title": "Fehler - Etwas ist schief gelaufen",
|
"error_title": "Fehler - Etwas ist schief gelaufen",
|
||||||
"error_while_navigating": "Fehler beim Navigieren zur Datei",
|
"error_while_navigating": "Fehler beim Navigieren zur Datei",
|
||||||
"errors": {
|
"errors": {
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Dateien taggen",
|
"tag_assets": "Dateien taggen",
|
||||||
"tag_created": "Tag erstellt: {tag}",
|
"tag_created": "Tag erstellt: {tag}",
|
||||||
"tag_face": "Gesicht taggen",
|
|
||||||
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
|
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
|
||||||
"tag_not_found_question": "Kein Tag vorhanden? <link>Erstelle einen neuen Tag.</link>",
|
"tag_not_found_question": "Kein Tag vorhanden? <link>Erstelle einen neuen Tag.</link>",
|
||||||
"tag_people": "Personen taggen",
|
"tag_people": "Personen taggen",
|
||||||
|
|||||||
+111
-111
@@ -1,132 +1,132 @@
|
|||||||
{
|
{
|
||||||
"about": "Über",
|
"about": "Über",
|
||||||
"account": "Konto",
|
"account": "Konto",
|
||||||
"account_settings": "Konto Einstellungen",
|
"account_settings": "Konto Istelligä",
|
||||||
"acknowledge": "Bestätigä",
|
"acknowledge": "Bestätige",
|
||||||
"action": "Aktion",
|
"action": "Aktion",
|
||||||
"action_common_update": "Update",
|
"action_common_update": "Update",
|
||||||
"action_description": "Aktionä, wo uf de gefilterti Mediä ausgführt werdä solled",
|
"action_description": "Es paar Aktione, wo a de gfilterete Assets usgführt wärde sölled",
|
||||||
"actions": "Aktionen",
|
"actions": "Aktione",
|
||||||
"active": "Aktiv",
|
"active": "Aktiv",
|
||||||
"active_count": "Aktiv: {count}",
|
"active_count": "Aktivi: {count}",
|
||||||
"activity": "Aktivität",
|
"activity": "Aktivität",
|
||||||
"activity_changed": "Aktivität ist {enabled, select, true {aktiviert} other {deaktiviert}}",
|
"activity_changed": "Aktivität isch {enabled, select, true {aktiviert} other {deaktiviert}}",
|
||||||
"add": "Hinzuefüge",
|
"add": "Hinzuefüegä",
|
||||||
"add_a_description": "Beschreibung hinzufügen",
|
"add_a_description": "Beschriibig hinzuefüege",
|
||||||
"add_a_location": "Standort hinzuefügä",
|
"add_a_location": "Standort hinzuefüege",
|
||||||
"add_a_name": "Namä hinzefügä",
|
"add_a_name": "Name hinzuefüege",
|
||||||
"add_a_title": "Titel hinzufeügä",
|
"add_a_title": "Titel hinzuefüege",
|
||||||
"add_action": "Aktion hinzuefügä",
|
"add_action": "Aktion hinzuefüege",
|
||||||
"add_action_description": "Klick do zum e Aktion hinzuefüge",
|
"add_action_description": "Aklicke um en Aktion dure zfüehre",
|
||||||
"add_assets": "Mediä hinzuefüge",
|
"add_assets": "Assets hinzufüege",
|
||||||
"add_birthday": "Geburtstag hinzuefüge",
|
"add_birthday": "Geburtstag hinzuefüege",
|
||||||
"add_endpoint": "Endpunkt hinzuefüge",
|
"add_endpoint": "Endpunkt hinzuefüge",
|
||||||
"add_exclusion_pattern": "Ausschlussmuster hinzufügen",
|
"add_exclusion_pattern": "Uuschlussmuster hinzuefüege",
|
||||||
"add_filter": "Filter hinzufügen",
|
"add_filter": "Filter hinzuefüge",
|
||||||
"add_filter_description": "Klicke hier um eine Filterbedingung hinzuzufügen",
|
"add_filter_description": "Klicke, um e Filterbedingig hinzuezfüege",
|
||||||
"add_location": "Standort hinzufügen",
|
"add_location": "Standort hinzuefüege",
|
||||||
"add_more_users": "Mehr Benutzer hinzufügen",
|
"add_more_users": "Meh Benutzer hinzuefüege",
|
||||||
"add_partner": "Partner hinzufügen",
|
"add_partner": "Partner hinzuefüege",
|
||||||
"add_path": "Pfad hinzufügen",
|
"add_path": "Pfad hinzuefüege",
|
||||||
"add_photos": "Fotos hinzufügen",
|
"add_photos": "Föteli hinzuefüege",
|
||||||
"add_tag": "Tag hinzufügen",
|
"add_tag": "Tag hinzuefüege",
|
||||||
"add_to": "Hinzufügen zu…",
|
"add_to": "Hinzuefüege zu …",
|
||||||
"add_to_album": "Zu Album hinzufügen",
|
"add_to_album": "Zum Album hinzuefüege",
|
||||||
"add_to_album_bottom_sheet_added": "Zu {album} hinzugefügt",
|
"add_to_album_bottom_sheet_added": "Zu {album} hinzuegfüegt",
|
||||||
"add_to_album_bottom_sheet_already_exists": "Bereits in {album}",
|
"add_to_album_bottom_sheet_already_exists": "Scho in {album}",
|
||||||
"add_to_album_bottom_sheet_some_local_assets": "Einige lokale Dateien konnten nicht zum Album hinzugefügt werden",
|
"add_to_album_bottom_sheet_some_local_assets": "Es hend es paar lokali Dateie nöd chöne im Album hinzuegfüegt werde",
|
||||||
"add_to_album_toggle": "Auswahl umschalten für {album}",
|
"add_to_album_toggle": "Uuswahl umschalte für {album}",
|
||||||
"add_to_albums": "Zu Alben hinzufügen",
|
"add_to_albums": "Zu Albe hinzuefüege",
|
||||||
"add_to_albums_count": "Zu Alben hinzufügen ({count})",
|
"add_to_albums_count": "Zu Albe hinzuefüege ({count})",
|
||||||
"add_to_bottom_bar": "Hinzufügen zu",
|
"add_to_bottom_bar": "Hinzuefüege zu",
|
||||||
"add_to_shared_album": "Zu geteiltem Album hinzufügen",
|
"add_to_shared_album": "Zum teilte Album hinzuefüege",
|
||||||
"add_upload_to_stack": "Upload zum Stapel hinzufügen",
|
"add_upload_to_stack": "Upload zum Stack hinzuefüege",
|
||||||
"add_url": "URL hinzufügen",
|
"add_url": "URL hinzuefüege",
|
||||||
"add_workflow_step": "Workflow-Schritt hinzufügen",
|
"add_workflow_step": "Workflow-Schritt hinzuefüege",
|
||||||
"added_to_archive": "Zum Archiv hinzugefügt",
|
"added_to_archive": "Is Archiv verschobe",
|
||||||
"added_to_favorites": "Zu Favoriten hinzugefügt",
|
"added_to_favorites": "Zu dine Favoritä hinzuegfüegt",
|
||||||
"added_to_favorites_count": "{count, number} zu Favoriten hinzugefügt",
|
"added_to_favorites_count": "{count, number} zu Favorite hinzuegfüegt",
|
||||||
"admin": {
|
"admin": {
|
||||||
"add_exclusion_pattern_description": "Ausschlussmuster hinzufügen. Platzhalter, wie *, **, und ? werden unterstützt. Um alle Dateien in einem Verzeichnis namens „Raw“ zu ignorieren, „**/Raw/**“ verwenden. Um alle Dateien zu ignorieren, die auf „.tif“ enden, „**/*.tif“ verwenden. Um einen absoluten Pfad zu ignorieren, „/pfad/zum/ignorieren/**“ verwenden.",
|
"add_exclusion_pattern_description": "Uusschlussmuster hinzuefüge. Platzhalter, wie *, **, und ? wärded understützt. Zum all Dateie i eim Verzeichnis namens „Raw\" ignoriere, „**/Raw/**“ verwände. Zum all Dateien ignorieren, wo uf „.tif“ änded, „**/*.tif“ verwände. Zum en absolute Pfad ignoriere, „/pfad/zum/ignoriere/**“ verwände.",
|
||||||
"admin_user": "Administrator",
|
"admin_user": "Admin Benutzer",
|
||||||
"asset_offline_description": "Diese Datei einer externen Bibliothek befindet sich nicht mehr auf der Festplatte und wurde in den Papierkorb verschoben. Falls die Datei innerhalb der Bibliothek verschoben wurde, überprüfe deine Zeitleiste auf die neue entsprechende Datei. Um diese Datei wiederherzustellen, stelle bitte sicher, dass Immich auf den unten stehenden Dateipfad zugreifen kann und scanne die Bibliothek.",
|
"asset_offline_description": "Die Datei vonere externe Bibliothek isch nümme uf de Festplatte und isch in Papierchorb verschobe worde. Falls die Datei innerhalb vo de Bibliothek verschoben worde isch, überprüf dini Ziitleiste uf die neui entsprechendi Datei. Zum die Datei wiederherstelle, stell bitte sicher, dass Immich uf de unde stehendi Dateipfad chan zuegriife und scann d'Bibliothek.",
|
||||||
"authentication_settings": "Authentifizierungseinstellungen",
|
"authentication_settings": "Authentifizierigs Iistellige",
|
||||||
"authentication_settings_description": "Passwort-, OAuth- und andere Authentifizierungseinstellungen verwalten",
|
"authentication_settings_description": "Passwort, OAuth und anderi Authentifizierigseinstellige verwalte",
|
||||||
"authentication_settings_disable_all": "Bist du sicher, dass du alle Loginmethoden deaktivieren willst? Die Anmeldung wird vollständig deaktiviert.",
|
"authentication_settings_disable_all": "Bisch sicher, dass du alli Login-Methodä wotsch deaktivierä? S Login isch denn komplett deaktiviert.",
|
||||||
"authentication_settings_reenable": "Nutze einen <link>Server-Befehl</link> zur Reaktivierung.",
|
"authentication_settings_reenable": "Bruuch ein <link>Server-Befehl</link> zum reaktiviere.",
|
||||||
"background_task_job": "Hintergrundaufgaben",
|
"background_task_job": "Hintergrund Ufgabä",
|
||||||
"backup_database": "Datenbanksicherung erstellen",
|
"backup_database": "Datenbank-Dump aalege",
|
||||||
"backup_database_enable_description": "Datenbank regelmässig sichern",
|
"backup_database_enable_description": "Datenbank-Dumps aktiviere",
|
||||||
"backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Sicherungen",
|
"backup_keep_last_amount": "Aazahl vo de vorherige Dumps, wo bhalte werde sölle",
|
||||||
"backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.",
|
"backup_onboarding_1_description": "Offsite-Kopie i dä Cloud oder amene andere physische Standort.",
|
||||||
"backup_onboarding_2_description": "lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.",
|
"backup_onboarding_2_description": "Lokali Kopie uf verschiedene Grät. Das beinhaltet d Hauptdateie und e lokali Sicherig vo dene Dateie.",
|
||||||
"backup_onboarding_3_description": "Kopien deiner Daten inklusive Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopien.",
|
"backup_onboarding_3_description": "Total aazahl vo dine Dateikopie, inklusiv d Originaldateie. Das beinhaltet 1 Offsite-Kopie und 2 lokali Kopie.",
|
||||||
"backup_onboarding_description": "Eine <backblaze-link>3-2-1 Sicherungsstrategie</backblaze-link> wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Sicherungslösung zu haben.",
|
"backup_onboarding_description": "E <backblaze-link>3-2-1-Backup-Strategie</backblaze-link> wird empfohle, zum dini Dateie z schütze. Du söttsch sowohl Kopie vo dine ufgeladene Fotos/Videos wie au d Immich-Datenbank bhalte, für e rundum sauberi Backup-Lösig.",
|
||||||
"backup_onboarding_footer": "Weitere Informationen zum Sichern von Immich findest du in der <link>Dokumentation</link>.",
|
"backup_onboarding_footer": "Für meh Infos zum Backup vo Immich lueg bitte i d <link>Dokumentation</link>.",
|
||||||
"backup_onboarding_parts_title": "Eine 3-2-1-Sicherung umfasst:",
|
"backup_onboarding_parts_title": "Es 3-2-1-Backup beinhaltet:",
|
||||||
"backup_onboarding_title": "Backups",
|
"backup_onboarding_title": "Backups",
|
||||||
"backup_settings": "Einstellungen für Datenbanksicherung",
|
"backup_settings": "Iistellige für Datenbank-Dumps",
|
||||||
"backup_settings_description": "Einstellungen zur regelmässigen Sicherung der Datenbank.",
|
"backup_settings_description": "Datenbank-Dump-Iistellige verwalte.",
|
||||||
"cleared_jobs": "Folgende Aufgaben zurückgesetzt: {job}",
|
"cleared_jobs": "Jobs glöscht für: {job}",
|
||||||
"config_set_by_file": "Die Konfiguration ist aktuell durch eine Konfigurationsdatei gsetzt",
|
"config_set_by_file": "D Konfiguration isch aktuell dur e Konfigurationsdatei gsetzt",
|
||||||
"confirm_delete_library": "Bist du sicher, dass du die Bibliothek {library} löschen willst?",
|
"confirm_delete_library": "Bisch sicher, dass du d Bibliothek {library} wotsch lösche?",
|
||||||
"confirm_delete_library_assets": "Bist du sicher, dass du diese Bibliothek löschen willst? Dies löscht {count, plural, one {# enthaltene Datei} other {alle # enthaltenen Dateien}} aus Immich und kann nicht rückgängig gemacht werden. Die Dateien bleiben auf der Festplatte erhalten.",
|
"confirm_delete_library_assets": "Bisch sicher, dass du die Bibliothek wotsch lösche? Das löscht {count, plural, one {# enthaltenes Asset} other {alli # enthaltene Assets}} us Immich und chan nöd rückgängig gmacht werde. D Dateie bliibed uf em Dateträger.",
|
||||||
"confirm_email_below": "Zum Bestätigen, tippe unten \"{email}\" ein",
|
"confirm_email_below": "Zum bestätige bitte \"{email}\" une iitippe",
|
||||||
"confirm_reprocess_all_faces": "Bist du sicher, dass du alle Gesichter erneut verarbeiten möchtest? Dies löscht auch alle bereits benannten Personen.",
|
"confirm_reprocess_all_faces": "Bisch sicher, dass du alli Gsichter neu verarbeite wotsch? Däbii werde au benannti Persone glöscht.",
|
||||||
"confirm_user_password_reset": "Bist du sicher, dass du das Passwort für {user} zurücksetzen möchtest?",
|
"confirm_user_password_reset": "Bisch sicher, dass du s Passwort für {user} möchtisch zruggsetze?",
|
||||||
"confirm_user_pin_code_reset": "Bist du sicher, dass du den PIN-Code von {user} zurücksetzen möchtest?",
|
"confirm_user_pin_code_reset": "Bisch sicher, dass du de PIN-Code vo {user} möchtisch zruggsetze?",
|
||||||
"copy_config_to_clipboard_description": "Aktuelle Systemkonfiguration als JSON-Objekt in die Zwischenablage kopieren",
|
"copy_config_to_clipboard_description": "Kopier die aktuelli Systemkonfiguration als JSON-Objekt i d'Zwüschenablage",
|
||||||
"create_job": "Aufgabe erstellen",
|
"create_job": "Uufgabe erstelle",
|
||||||
"cron_expression": "Cron-Ausdruck",
|
"cron_expression": "Cron-Ziitagabe",
|
||||||
"cron_expression_description": "Setze das Scanintervall im Cron-Format. Für mehr Informationen, siehe z. B. <link>Crontab Guru</link>",
|
"cron_expression_description": "Setz s Scanintervall im Cron-Format. Hilf mit däm Format bütet z. B. der <link>Crontab Guru</link>",
|
||||||
"cron_expression_presets": "Vorlagen für Cron-Ausdrücke",
|
"cron_expression_presets": "Vorlage für Cron-Uusdruck",
|
||||||
"disable_login": "Login deaktivieren",
|
"disable_login": "Login deaktiviere",
|
||||||
"duplicate_detection_job_description": "Verwendet maschinelles Lernen auf den Dateien, um Duplikate zu finden. Baut auf der intelligenten Suche auf",
|
"duplicate_detection_job_description": "Die Uufgab füehrt s maschinelle Lärne für jedi Datei us, zum Duplikat finde. Die Uufgabe berueht uf de intelligente Suechi",
|
||||||
"exclusion_pattern_description": "Mit Ausschlussmustern können Dateien und Ordner beim Scannen deiner Bibliothek ignoriert werden. Dies ist nützlich, wenn du Ordner hast, die Dateien enthalten, die du nicht importieren möchtest, wie z. B. RAW-Dateien.",
|
"exclusion_pattern_description": "Mit Uusschlussmuster chönnd Dateie und Ordner bim Scanne vo dinere Bibliothek ignoriert wärde. Das isch nützlich, wenn du Ordner häsch, wo Dateien drin händ, wo d nöd wotsch importiere, wie z. B. RAW-Dateie.",
|
||||||
"export_config_as_json_description": "Aktuelle Systemkonfiguration als JSON-Datei herunterladen",
|
"export_config_as_json_description": "Lad die aktuelli Systemkonfiguration als JSON-Datei abe",
|
||||||
"external_libraries_page_description": "Externe Bibliotheksseite für Administratoren",
|
"external_libraries_page_description": "Externi Bibliothekssiite für Administratore",
|
||||||
"face_detection": "Gesichtserkennung",
|
"face_detection": "Gsichtserkennig",
|
||||||
"face_detection_description": "Diese Aufgabe erkennt mit maschinellem Lernen Gesichter in Dateien. Bei Videos wird nur das Vorschaubild verwendet. „Aktualisieren“ verarbeitet alle Dateien neu. „Zurücksetzen“ setzt zusätzlich alle Gesichter zurück. „Fehlende“ fügt nur nicht verarbeitete Dateien in die Warteschlange ein. Erfasste Gesichter werden zur Gesichtsidentifizierung in die Warteschlange eingefügt, um sie in bestehende oder neue Personen zu gruppieren.",
|
"face_detection_description": "Die Uufgab erfasst Gsichter in Dateien dur maschinells Lerne. Bi Video wird nur d'Miniaturasicht brucht. „Aktualisiere“ verarbeitet all Dateie neu. „Zruggsetze“ setzt au no all Gsichter zrugg. „Fehlendi“ stellt nur nöd verarbeiteti Dateie in d'Warteschlange. Erfassti Gsichter wärdet zur Gsichtsidentifizierig in diWarteschlange gstellt, damit sie i bestehendi oder neui Persone z'gruppiere.",
|
||||||
"facial_recognition_job_description": "Diese Aufgabe gruppiert im Anschluss an die Gesichtserkennung die erkannten Gesichter zu Personen. „Zurücksetzen“ gruppiert alle Gesichter neu, während „Fehlende“ Gesichter ohne Zuordnung in die Warteschlange stellt.",
|
"facial_recognition_job_description": "Die Uufgabe gruppiert im Anschluss an d'Gsichtserfassig die erfasste Gsichter zu Persone. „Zruggsetze“ gruppiert alli Gsichter neu und mit „Fehlendi“ werdet Gsichter ohni Zuordnig i d'Warteschlange gstellt.",
|
||||||
"failed_job_command": "Befehl {command} ist für Aufgabe {job} fehlgeschlagen",
|
"failed_job_command": "Befehl {command} hät für d'Uufgabe {job} nöd funktioniert",
|
||||||
"force_delete_user_warning": "WARNUNG: Diese Aktion löscht sofort den Benutzer und all seine Dateien. Dies kann nicht rückgängig gemacht werden und die Dateien können nicht wiederhergestellt werden.",
|
"force_delete_user_warning": "WARNIG: Die Aktion löscht dä Benutzer und all sini Dateie. Das chann nöd rückgängig gmacht wärde und d'Dateie chönnd nöd wiederhergstellt wärde.",
|
||||||
"image_format": "Format",
|
"image_format": "Format",
|
||||||
"image_format_description": "WebP erzeugt kleinere Dateien als JPEG, ist aber etwas langsamer in der Erstellung.",
|
"image_format_description": "WebP erzeugt chlineri Dateie we JPEG, isch aber es bitz langsamer i de Erstellig.",
|
||||||
"image_fullsize_description": "Hochauflösendes Bild mit entfernten Metadaten, das beim Zoomen verwendet wird",
|
"image_fullsize_description": "Hochuflösends Bild mit glöschte Metadate, wo bim Zoome brucht wird",
|
||||||
"image_fullsize_enabled": "Hochauflösende Vorschaubilder aktivieren",
|
"image_fullsize_enabled": "Hochuflösendi Vorschaubilder aktiviere",
|
||||||
"image_fullsize_enabled_description": "Generiere Vorschaubilder in Originalauflösung für nicht web-kompatible Formate. Wenn \"Eingebettete Vorschau bevorzugen\" aktiviert ist, werden eingebettete Vorschaubilder direkt verwendet. Hat keinen Einfluss auf web-kompatible Formate wie JPEG.",
|
"image_fullsize_enabled_description": "Generiere hochauflösende Vorschaubilder in Originalauflösung für nicht web-kompatibel Formate. Wenn \"Eingebettete Vorschau bevorzugen\" aktiviert ist, werden eingebettete Vorschaubilder direkt verwendet. Hat keinen Einfluss auf web-kompatible Formate wie JPEG.",
|
||||||
"image_fullsize_quality_description": "Qualität der hochauflösenden Vorschaubilder von 1-100. Höher ist besser, erzeugt aber grössere Dateien.",
|
"image_fullsize_quality_description": "Qualität der hochauflösenden Vorschaubilder von 1-100. Höher ist besser, erzeugt aber grössere Dateien.",
|
||||||
"image_fullsize_title": "Hochauflösende Vorschaueinstellungen",
|
"image_fullsize_title": "Hochauflösende Vorschaueinstellungen",
|
||||||
"image_prefer_embedded_preview": "Eingebettete Vorschau bevorzugen",
|
"image_prefer_embedded_preview": "Eingebettete Vorschau bevorzugen",
|
||||||
"image_prefer_embedded_preview_setting_description": "Verwende eingebettete Vorschaubilder in RAW-Fotos als Grundlage für die Bildverarbeitung, sofern diese zur Verfügung stehen. Dies kann bei einigen Bildern genauere Farben erzeugen, allerdings ist die Qualität der Vorschau kameraabhängig und das Bild kann mehr Kompressionsartefakte aufweisen.",
|
"image_prefer_embedded_preview_setting_description": "Verwende eingebettete Vorschaubilder in RAW-Fotos als Grundlage für die Bildverarbeitung, sofern diese zur Verfügung stehen. Dies kann bei einigen Bildern genauere Farben erzeugen, allerdings ist die Qualität der Vorschau kameraabhängig und das Bild kann mehr Kompressionsartefakte aufweisen.",
|
||||||
"image_prefer_wide_gamut": "Breites Spektrum bevorzugen",
|
"image_prefer_wide_gamut": "Breites Spektrum bevorzugen",
|
||||||
"image_prefer_wide_gamut_setting_description": "Display P3 (DCI-P3) für Vorschaubilder verwenden. Dadurch bleibt die Lebendigkeit von Bildern mit breiten Farbräumen besser erhalten, aber die Bilder können auf älteren Geräten mit einer älteren Browserversion etwas anders aussehen. sRGB-Bilder werden im sRGB-Format belassen, um Farbverschiebungen zu vermeiden.",
|
"image_prefer_wide_gamut_setting_description": "Bruuch Display P3 für Vorschaubildli. Das erhaltet d'Vitalität von Bildli mit grossem Farbruum besser. Uf alte Grät mit alte Browser chann das aber andersch uusgseh. sRGB-Bildli wärdet als sRGB bhalte zum Farbänderige vermiide.",
|
||||||
"image_preview_description": "Mittelgrosses Bild mit entfernten Metadaten, das bei der Betrachtung einer einzelnen Datei und für maschinelles Lernen verwendet wird",
|
"image_preview_description": "Mittelgrossi Bildli ohni Metadate, bruuchts für Einzelaasichte und fürs maschinelle Lärne",
|
||||||
"image_preview_quality_description": "Vorschauqualität von 1-100. Ein höherer Wert ist besser, erzeugt dadurch aber grössere Dateien und kann die Reaktionsfähigkeit der App beeinträchtigen. Ein niedriger Wert kann dafür aber die Qualität des maschinellen Lernens beeinträchtigen.",
|
"image_preview_quality_description": "Vorschauqualität vo 1-100. Höcher isch besser, git aber grösseri Dateie und chan d'App Schwuppdizität reduziere. Z tüffi Wert chönnd s maschinelle Lärne beiträchtige.",
|
||||||
"image_preview_title": "Vorschaueinstellungen",
|
"image_preview_title": "Vorschauiistellige",
|
||||||
"image_progressive": "Fortlaufend",
|
"image_progressive": "Fortlaufend",
|
||||||
"image_progressive_description": "JPEG-Bilder schrittweise kodieren, um ein stufenweises Laden zu ermöglichen. Dies hat keine Auswirkungen auf WebP-Bilder.",
|
"image_progressive_description": "Codier fortlaufendi JPEG-Bildi: Sie wärdet bim Lade aufbauend aazeiget. Das hät kei Würkig uf WebP-Bildi.",
|
||||||
"image_quality": "Qualität",
|
"image_quality": "Qualität",
|
||||||
"image_resolution": "Auflösung",
|
"image_resolution": "Uuflösig",
|
||||||
"image_resolution_description": "Höhere Auflösungen können mehr Details erhalten, benötigen aber mehr Zeit für die Kodierung, haben grössere Dateigrössen und können die Reaktionsfähigkeit der App beeinträchtigen.",
|
"image_resolution_description": "Höcheri Uuflösig erhaltet meh Detail, gaht aber länger zum codiere, macht grösseri Dateie und chan d'App Schuppdizität reduziere.",
|
||||||
"image_settings": "Bildeinstellungen",
|
"image_settings": "Bild-Iistellige",
|
||||||
"image_settings_description": "Qualität und Auflösung der generierten Bilder verwalten",
|
"image_settings_description": "Qualität und Uuflösig von erstellte Bildli verwalte",
|
||||||
"image_thumbnail_description": "Kleines Vorschaubild mit entfernten Metadaten, die bei der Anzeige von Sammlungen von Fotos wie der Zeitleiste verwendet wird",
|
"image_thumbnail_description": "Chlini Vorschaubildli ohni Metadate, bruuchts für Aasichte mit Gruppe vo Föteli wie i de Hauptziitachse",
|
||||||
"image_thumbnail_quality_description": "Qualität der Vorschaubilder von 1-100. Höher ist besser, erzeugt aber grössere Dateien und kann die Reaktionsfähigkeit der App beeinträchtigen.",
|
"image_thumbnail_quality_description": "Vorschauqualität vo 1-100. Höcher isch besser, git aber grösseri Dateie und chan d'App Schwuppdizität reduziere.",
|
||||||
"image_thumbnail_title": "Einstellungen für Vorschaubilder",
|
"image_thumbnail_title": "Iistellige für Vorschaubildli",
|
||||||
"import_config_from_json_description": "Systemkonfiguration von hochgeladener JSON-Konfigurationsdatei importieren",
|
"import_config_from_json_description": "Systemkonfiguration importiere durs Ufelade vonere JSON-Datei",
|
||||||
"job_concurrency": "{job} (Anzahl gleichzeitig laufende Prozesse)",
|
"job_concurrency": "{job} Näbeläufigkeit",
|
||||||
"job_created": "Aufgabe erstellt",
|
"job_created": "Uufgab erstellt",
|
||||||
"job_not_concurrency_safe": "Diese Aufgabe kann nicht mehrmals parallel laufen gelassen werden.",
|
"job_not_concurrency_safe": "Die Uufgabe ist nöd für Paralleluusführig gmacht.",
|
||||||
"job_settings": "Aufgabeneinstellungen",
|
"job_settings": "Uufgabe-Iistellige",
|
||||||
"job_settings_description": "Gleichzeitige Ausführung von Aufgaben verwalten",
|
"job_settings_description": "Uufgabe-Näbeläufigkeit verwalte",
|
||||||
"jobs_over_time": "Jobs im Laufe der Zeit",
|
"jobs_over_time": "Uufgabe in ziitliche Verlauf",
|
||||||
"library_created": "Bibliothek erstellt: {library}",
|
"library_created": "Bibliothek erstellt: {library}",
|
||||||
"library_deleted": "Bibliothek gelöscht",
|
"library_deleted": "Bibliothek glöscht",
|
||||||
"library_details": "Bibliotheksdetails",
|
"library_details": "Bibliotheks-Details",
|
||||||
"library_folder_description": "Wähle einen Ordner zum Importieren. Dieser Ordner wird inklusive Unterordnern nach Bildern und Videos durchsucht.",
|
"library_folder_description": "Gib en Order zum Importiere a. Dä Order mit sine Underordner wird nach Bildli und Videos durchsucht.",
|
||||||
"library_remove_exclusion_pattern_prompt": "Bilst du sicher, dass du dieses Ausschlussmuster entfernen möchtest?",
|
"library_remove_exclusion_pattern_prompt": "Bisch sicher, dass das Uuschluss-Muster wotsch lösche?",
|
||||||
"library_remove_folder_prompt": "Bist du sicher, dass du diesen Import-Ordner entfernen möchtest?",
|
"library_remove_folder_prompt": "Bisch sicher, dass dä Import-Ordner wotsch lösche?",
|
||||||
"library_scanning": "Regelmässiges Scannen"
|
"library_scanning": "Regelmässigi Überprüefig"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-5
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Δημιουργία συνδέσμου για διαμοιρασμό",
|
"create_link_to_share": "Δημιουργία συνδέσμου για διαμοιρασμό",
|
||||||
"create_link_to_share_description": "Επιτρέψτε σε οποιονδήποτε έχει τον σύνδεσμο να δει τη/τις επιλεγμένη/ες φωτογραφία/ες",
|
"create_link_to_share_description": "Επιτρέψτε σε οποιονδήποτε έχει τον σύνδεσμο να δει τη/τις επιλεγμένη/ες φωτογραφία/ες",
|
||||||
"create_new": "ΔΗΜΙΟΥΡΓΙΑ ΝΕΟΥ",
|
"create_new": "ΔΗΜΙΟΥΡΓΙΑ ΝΕΟΥ",
|
||||||
"create_new_face": "Δημιουργία νέου προσώπου",
|
"create_new_person": "Δημιουργία νέου προσώπου",
|
||||||
"create_new_person": "Δημιουργία νέου ατόμου",
|
|
||||||
"create_new_person_hint": "Αντιστοίχιση των επιλεγμένων αρχείων σε ένα νέο πρόσωπο",
|
"create_new_person_hint": "Αντιστοίχιση των επιλεγμένων αρχείων σε ένα νέο πρόσωπο",
|
||||||
"create_new_user": "Δημιουργία νέου χρήστη",
|
"create_new_user": "Δημιουργία νέου χρήστη",
|
||||||
"create_person": "Δημιουργία ατόμου",
|
|
||||||
"create_person_subtitle": "Προσθέστε ένα όνομα στο επιλεγμένο πρόσωπο για να δημιουργηθεί και να επισημανθεί το νέο άτομο",
|
|
||||||
"create_shared_album_page_share_add_assets": "ΠΡΟΣΘΗΚΗ ΣΤΟΙΧΕΙΩΝ",
|
"create_shared_album_page_share_add_assets": "ΠΡΟΣΘΗΚΗ ΣΤΟΙΧΕΙΩΝ",
|
||||||
"create_shared_album_page_share_select_photos": "Επιλέξτε Φωτογραφίες",
|
"create_shared_album_page_share_select_photos": "Επιλέξτε Φωτογραφίες",
|
||||||
"create_shared_link": "Δημιουργία κοινόχρηστου συνδέσμου",
|
"create_shared_link": "Δημιουργία κοινόχρηστου συνδέσμου",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Ετικέτα",
|
"tag": "Ετικέτα",
|
||||||
"tag_assets": "Ετικετοποίηση στοιχείων",
|
"tag_assets": "Ετικετοποίηση στοιχείων",
|
||||||
"tag_created": "Δημιουργήθηκε ετικέτα: {tag}",
|
"tag_created": "Δημιουργήθηκε ετικέτα: {tag}",
|
||||||
"tag_face": "Επισήμανση προσώπου",
|
|
||||||
"tag_feature_description": "Περιήγηση σε φωτογραφίες και βίντεο που είναι οργανωμένα σύμφωνα με λογικά θέματα ετικετών",
|
"tag_feature_description": "Περιήγηση σε φωτογραφίες και βίντεο που είναι οργανωμένα σύμφωνα με λογικά θέματα ετικετών",
|
||||||
"tag_not_found_question": "Δεν μπορείτε να βρείτε μια ετικέτα; <link>Δημιουργήστε μια νέα ετικέτα.</link>",
|
"tag_not_found_question": "Δεν μπορείτε να βρείτε μια ετικέτα; <link>Δημιουργήστε μια νέα ετικέτα.</link>",
|
||||||
"tag_people": "Επισήμανση ατόμων",
|
"tag_people": "Επισήμανση ατόμων",
|
||||||
|
|||||||
@@ -267,8 +267,6 @@
|
|||||||
"notification_enable_email_notifications": "Enable email notifications",
|
"notification_enable_email_notifications": "Enable email notifications",
|
||||||
"notification_settings": "Notification Settings",
|
"notification_settings": "Notification Settings",
|
||||||
"notification_settings_description": "Manage notification settings, including email",
|
"notification_settings_description": "Manage notification settings, including email",
|
||||||
"oauth_allow_insecure_requests": "Allow insecure requests",
|
|
||||||
"oauth_allow_insecure_requests_description": "WARNING: This disables TLS certificate validation for OAuth requests and may expose you to MITM attacks.",
|
|
||||||
"oauth_auto_launch": "Auto launch",
|
"oauth_auto_launch": "Auto launch",
|
||||||
"oauth_auto_launch_description": "Start the OAuth login flow automatically upon navigating to the login page",
|
"oauth_auto_launch_description": "Start the OAuth login flow automatically upon navigating to the login page",
|
||||||
"oauth_auto_register": "Auto register",
|
"oauth_auto_register": "Auto register",
|
||||||
@@ -1394,7 +1392,6 @@
|
|||||||
"light_theme": "Switch to light theme",
|
"light_theme": "Switch to light theme",
|
||||||
"like": "Like",
|
"like": "Like",
|
||||||
"like_deleted": "Like deleted",
|
"like_deleted": "Like deleted",
|
||||||
"link": "Link",
|
|
||||||
"link_motion_video": "Link motion video",
|
"link_motion_video": "Link motion video",
|
||||||
"link_to_docs": "For more information, refer to the <link>documentation</link>.",
|
"link_to_docs": "For more information, refer to the <link>documentation</link>.",
|
||||||
"link_to_oauth": "Link to OAuth",
|
"link_to_oauth": "Link to OAuth",
|
||||||
@@ -1565,8 +1562,6 @@
|
|||||||
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
|
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
|
||||||
"mute_memories": "Mute Memories",
|
"mute_memories": "Mute Memories",
|
||||||
"my_albums": "My albums",
|
"my_albums": "My albums",
|
||||||
"my_immich_description": "Copy current page as a My Immich link",
|
|
||||||
"my_immich_title": "My Immich link",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"name_or_nickname": "Name or nickname",
|
"name_or_nickname": "Name or nickname",
|
||||||
"name_required": "Name is required",
|
"name_required": "Name is required",
|
||||||
@@ -1931,8 +1926,6 @@
|
|||||||
"scan_settings": "Scan Settings",
|
"scan_settings": "Scan Settings",
|
||||||
"scanning": "Scanning",
|
"scanning": "Scanning",
|
||||||
"scanning_for_album": "Scanning for album...",
|
"scanning_for_album": "Scanning for album...",
|
||||||
"screencast_mode_description": "Show keyboard and mouse event indicators on the screen",
|
|
||||||
"screencast_mode_title": "Toggle screencast mode",
|
|
||||||
"search": "Search",
|
"search": "Search",
|
||||||
"search_albums": "Search albums",
|
"search_albums": "Search albums",
|
||||||
"search_by_context": "Search by context",
|
"search_by_context": "Search by context",
|
||||||
@@ -2221,8 +2214,6 @@
|
|||||||
"sync_status": "Sync Status",
|
"sync_status": "Sync Status",
|
||||||
"sync_status_subtitle": "View and manage the sync system",
|
"sync_status_subtitle": "View and manage the sync system",
|
||||||
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
|
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
|
||||||
"system_theme": "System theme",
|
|
||||||
"system_theme_command_description": "Use the system theme ({value})",
|
|
||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Tag assets",
|
"tag_assets": "Tag assets",
|
||||||
"tag_created": "Created tag: {tag}",
|
"tag_created": "Created tag: {tag}",
|
||||||
|
|||||||
+1
-32
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Krei ligilon por dividi",
|
"create_link_to_share": "Krei ligilon por dividi",
|
||||||
"create_link_to_share_description": "Permesi, ke iu ajn kun la ligilo povu vidi la elektita(j)n foto(j)n",
|
"create_link_to_share_description": "Permesi, ke iu ajn kun la ligilo povu vidi la elektita(j)n foto(j)n",
|
||||||
"create_new": "KREI NOVAN",
|
"create_new": "KREI NOVAN",
|
||||||
"create_new_face": "Krei novan vizaĝon",
|
|
||||||
"create_new_person": "Krei novan homon",
|
"create_new_person": "Krei novan homon",
|
||||||
"create_new_person_hint": "Atribui elektitajn elementojn al nova homo",
|
"create_new_person_hint": "Atribui elektitajn elementojn al nova homo",
|
||||||
"create_new_user": "Krei novan uzanton",
|
"create_new_user": "Krei novan uzanton",
|
||||||
"create_person": "Krei homon",
|
|
||||||
"create_person_subtitle": "Aldoni nomon al la elektita vizaĝo por krei kaj etikedi novan homon",
|
|
||||||
"create_shared_album_page_share_add_assets": "ALDONI ELEMENTOJN",
|
"create_shared_album_page_share_add_assets": "ALDONI ELEMENTOJN",
|
||||||
"create_shared_album_page_share_select_photos": "Elekti fotojn",
|
"create_shared_album_page_share_select_photos": "Elekti fotojn",
|
||||||
"create_shared_link": "Krei dividitan ligilon",
|
"create_shared_link": "Krei dividitan ligilon",
|
||||||
@@ -1046,7 +1043,7 @@
|
|||||||
"cannot_navigate_previous_asset": "Ne eblas navigi al antaŭa elemento",
|
"cannot_navigate_previous_asset": "Ne eblas navigi al antaŭa elemento",
|
||||||
"cant_apply_changes": "Ne eblas apliki ŝanĝojn",
|
"cant_apply_changes": "Ne eblas apliki ŝanĝojn",
|
||||||
"cant_change_activity": "Ne eblas {enabled, select, true {malŝalti} other {ŝalti}} tiun agon",
|
"cant_change_activity": "Ne eblas {enabled, select, true {malŝalti} other {ŝalti}} tiun agon",
|
||||||
"cant_change_asset_favorite": "Ne eblas ŝanĝi preferon por tiu elemento",
|
"cant_change_asset_favorite": "Ne eblas ŝanĝi preferaton por tiu elemento",
|
||||||
"cant_change_metadata_assets_count": "Ne eblas ŝanĝi metadatumojn de {count, plural, one {# elemento} other {# elementoj}}",
|
"cant_change_metadata_assets_count": "Ne eblas ŝanĝi metadatumojn de {count, plural, one {# elemento} other {# elementoj}}",
|
||||||
"cant_get_faces": "Ne eblas trovi vizaĝojn",
|
"cant_get_faces": "Ne eblas trovi vizaĝojn",
|
||||||
"cant_get_number_of_comments": "Ne eblas trovi nombron da komentoj",
|
"cant_get_number_of_comments": "Ne eblas trovi nombron da komentoj",
|
||||||
@@ -1077,18 +1074,7 @@
|
|||||||
"incorrect_email_or_password": "Neĝusta retadreso aŭ pasvorto",
|
"incorrect_email_or_password": "Neĝusta retadreso aŭ pasvorto",
|
||||||
"library_folder_already_exists": "Tiu ĉi import-vojo jam ekzistas.",
|
"library_folder_already_exists": "Tiu ĉi import-vojo jam ekzistas.",
|
||||||
"page_not_found": "Paĝo ne trovita",
|
"page_not_found": "Paĝo ne trovita",
|
||||||
"paths_validation_failed": "Evidentiĝis, ke {paths, plural, one {# vojo estas nevalida} other {# vojoj estas nevalidaj}}",
|
|
||||||
"profile_picture_transparent_pixels": "Ne eblas havi travideblaj bilderoj en profilbildo. Bonvolu zomi kaj/aŭ ŝovi la bildon al loko sen tiaj bilderoj.",
|
|
||||||
"quota_higher_than_disk_size": "Vi donis kvoton pli grandan ol la disko mem",
|
|
||||||
"something_went_wrong": "Io misis",
|
|
||||||
"unable_to_add_album_users": "Ne eblas aldoni uzantojn al la albumo",
|
|
||||||
"unable_to_add_assets_to_shared_link": "Ne eblas aldoni elementojn al la dividita ligilo",
|
|
||||||
"unable_to_add_comment": "Ne eblas aldoni komenton",
|
|
||||||
"unable_to_add_exclusion_pattern": "Ne eblas aldoni skemon de ekskludo",
|
"unable_to_add_exclusion_pattern": "Ne eblas aldoni skemon de ekskludo",
|
||||||
"unable_to_add_partners": "Ne eblas aldoni partnerojn",
|
|
||||||
"unable_to_add_remove_archive": "Ne eblas {archived, select, true {forigi elementon de} other {aldoni elementon al}} la arĥivo",
|
|
||||||
"unable_to_add_remove_favorites": "Ne eblas {favorite, select, true {aldoni elementon al} other {forigi elementon de}} preferataĵoj",
|
|
||||||
"unable_to_change_favorite": "Ne eblas ŝanĝi preferon por tiu elemento",
|
|
||||||
"unable_to_create": "Ne eblis krei laborfluon",
|
"unable_to_create": "Ne eblis krei laborfluon",
|
||||||
"unable_to_delete_exclusion_pattern": "Ne eblas forigi skemon de ekskludo",
|
"unable_to_delete_exclusion_pattern": "Ne eblas forigi skemon de ekskludo",
|
||||||
"unable_to_delete_workflow": "Ne eblis forigi laborfluon",
|
"unable_to_delete_workflow": "Ne eblis forigi laborfluon",
|
||||||
@@ -1102,25 +1088,15 @@
|
|||||||
"expand_all": "Etendi ĉiujn",
|
"expand_all": "Etendi ĉiujn",
|
||||||
"explore": "Esplori",
|
"explore": "Esplori",
|
||||||
"explorer": "Foliumilo",
|
"explorer": "Foliumilo",
|
||||||
"favorite": "Preferataĵo",
|
|
||||||
"favorite_action_prompt": "{count} aldonita(j) al Preferataĵoj",
|
|
||||||
"favorite_or_unfavorite_photo": "Aldoni/forigi foton al/de preferataĵoj",
|
|
||||||
"favorites": "Preferataĵoj",
|
|
||||||
"favorites_page_no_favorites": "Neniuj preferataj elementoj trovitaj",
|
|
||||||
"free_up_space": "Liberigi spacon",
|
"free_up_space": "Liberigi spacon",
|
||||||
"free_up_space_description": "Vi forigos fotojn kaj/aŭ videojn, kiuj havas savkopiojn en la servilo, por liberigi spacon en via aparato. La kopioj en la servilo restos.",
|
"free_up_space_description": "Vi forigos fotojn kaj/aŭ videojn, kiuj havas savkopiojn en la servilo, por liberigi spacon en via aparato. La kopioj en la servilo restos.",
|
||||||
"general": "Ĝeneralaj",
|
"general": "Ĝeneralaj",
|
||||||
"home_page_favorite_err_local": "Ankoraŭ ne eblas aldoni lokajn elementojn al Preferataĵoj; ignorita(j)",
|
|
||||||
"home_page_favorite_err_partner": "Ankoraŭ ne eblas aldoni elementojn de partnero al Preferataĵoj; ignorita(j)",
|
|
||||||
"keep_favorites": "Konservi preferataĵojn",
|
|
||||||
"manage_media_access_settings": "Malfermi agordaĵaron",
|
"manage_media_access_settings": "Malfermi agordaĵaron",
|
||||||
"manage_the_app_settings": "Agordi la apon",
|
"manage_the_app_settings": "Agordi la apon",
|
||||||
"map_settings_only_show_favorites": "Montri nur preferataĵojn",
|
|
||||||
"missing": "Netraktitaj",
|
"missing": "Netraktitaj",
|
||||||
"networking_subtitle": "Administri agordojn pri finpunktoj de la servilo",
|
"networking_subtitle": "Administri agordojn pri finpunktoj de la servilo",
|
||||||
"no_devices": "Neniuj aprobitaj aparatoj",
|
"no_devices": "Neniuj aprobitaj aparatoj",
|
||||||
"no_explore_results_message": "Alŝutu pli da fotoj por esplori vian kolekton.",
|
"no_explore_results_message": "Alŝutu pli da fotoj por esplori vian kolekton.",
|
||||||
"no_favorites_message": "Aldoni al Preferataĵoj por rapide retrovi viajn plej bonajn bildojn kaj videojn",
|
|
||||||
"no_notifications": "Neniuj sciigoj",
|
"no_notifications": "Neniuj sciigoj",
|
||||||
"no_results_description": "Provu sinonimon aŭ pli ĝeneralan ŝlosilvorton",
|
"no_results_description": "Provu sinonimon aŭ pli ĝeneralan ŝlosilvorton",
|
||||||
"notification_permission_dialog_content": "Por ŝalti sciigojn, iru al Agordoj kaj elektu 'permesi'.",
|
"notification_permission_dialog_content": "Por ŝalti sciigojn, iru al Agordoj kaj elektu 'permesi'.",
|
||||||
@@ -1130,14 +1106,10 @@
|
|||||||
"notification_toggle_setting_description": "Ŝalti sciigojn per retmesaĝo",
|
"notification_toggle_setting_description": "Ŝalti sciigojn per retmesaĝo",
|
||||||
"notifications": "Sciigoj",
|
"notifications": "Sciigoj",
|
||||||
"notifications_setting_description": "Administri sciigojn",
|
"notifications_setting_description": "Administri sciigojn",
|
||||||
"only_favorites": "Nur preferataĵoj",
|
|
||||||
"preferences_settings_subtitle": "Administri agordojn pri la apo",
|
"preferences_settings_subtitle": "Administri agordojn pri la apo",
|
||||||
"purchase_settings_server_activated": "La administranto respondecas pri la ŝlosilo de aŭtentikeco por la servilo",
|
"purchase_settings_server_activated": "La administranto respondecas pri la ŝlosilo de aŭtentikeco por la servilo",
|
||||||
"rating_clear": "Forviŝi pritakson",
|
"rating_clear": "Forviŝi pritakson",
|
||||||
"refresh": "Denove",
|
"refresh": "Denove",
|
||||||
"remove_from_favorites": "Forigi el preferataĵoj",
|
|
||||||
"removed_from_favorites": "Forigita(j) el preferataĵoj",
|
|
||||||
"removed_from_favorites_count": "{count, plural, other {Forigis #}} el Preferataĵoj",
|
|
||||||
"rescan": "Reanalizi",
|
"rescan": "Reanalizi",
|
||||||
"reset": "Restartigi",
|
"reset": "Restartigi",
|
||||||
"reset_sqlite_clear_app_data": "Forviŝi datumojn",
|
"reset_sqlite_clear_app_data": "Forviŝi datumojn",
|
||||||
@@ -1155,10 +1127,7 @@
|
|||||||
"setting_notifications_subtitle": "Redakti viajn preferojn pri sciigoj",
|
"setting_notifications_subtitle": "Redakti viajn preferojn pri sciigoj",
|
||||||
"start_date": "Komenca dato",
|
"start_date": "Komenca dato",
|
||||||
"start_date_before_end_date": "Komenca dato devas esti antaŭ fina dato",
|
"start_date_before_end_date": "Komenca dato devas esti antaŭ fina dato",
|
||||||
"to_favorite": "Aldoni al preferataĵoj",
|
|
||||||
"trigger_description": "Evento, kiu ekfunkciigas la laborfluon",
|
"trigger_description": "Evento, kiu ekfunkciigas la laborfluon",
|
||||||
"unfavorite": "Forigi el preferataĵoj",
|
|
||||||
"unfavorite_action_prompt": "{count} forigita(j) el Preferataĵoj",
|
|
||||||
"untitled_workflow": "Sentitola laborfluo",
|
"untitled_workflow": "Sentitola laborfluo",
|
||||||
"upload_concurrency": "Nombro da samtempaj alŝutoj",
|
"upload_concurrency": "Nombro da samtempaj alŝutoj",
|
||||||
"user_pin_code_settings_description": "Administri vian PIN-kodon",
|
"user_pin_code_settings_description": "Administri vian PIN-kodon",
|
||||||
|
|||||||
+2
-6
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Crear enlace compartido",
|
"create_link_to_share": "Crear enlace compartido",
|
||||||
"create_link_to_share_description": "Permitir que cualquier persona con el enlace vea la(s) foto(s) seleccionada(s)",
|
"create_link_to_share_description": "Permitir que cualquier persona con el enlace vea la(s) foto(s) seleccionada(s)",
|
||||||
"create_new": "CREAR NUEVO",
|
"create_new": "CREAR NUEVO",
|
||||||
"create_new_face": "Crear nueva cara",
|
|
||||||
"create_new_person": "Crear nueva persona",
|
"create_new_person": "Crear nueva persona",
|
||||||
"create_new_person_hint": "Asignar los recursos seleccionados a una nueva persona",
|
"create_new_person_hint": "Asignar los recursos seleccionados a una nueva persona",
|
||||||
"create_new_user": "Crear nuevo usuario",
|
"create_new_user": "Crear nuevo usuario",
|
||||||
"create_person": "Crear persona",
|
|
||||||
"create_person_subtitle": "Añade un nombre a la cara seleccionada para crear y etiquetar a la nueva persona",
|
|
||||||
"create_shared_album_page_share_add_assets": "AÑADIR RECURSOS",
|
"create_shared_album_page_share_add_assets": "AÑADIR RECURSOS",
|
||||||
"create_shared_album_page_share_select_photos": "Seleccionar fotos",
|
"create_shared_album_page_share_select_photos": "Seleccionar fotos",
|
||||||
"create_shared_link": "Crear un enlace compartido",
|
"create_shared_link": "Crear un enlace compartido",
|
||||||
@@ -1025,7 +1022,7 @@
|
|||||||
"enable_biometric_auth_description": "Introduce tu código PIN para habilitar la autentificación biométrica",
|
"enable_biometric_auth_description": "Introduce tu código PIN para habilitar la autentificación biométrica",
|
||||||
"enabled": "Habilitado",
|
"enabled": "Habilitado",
|
||||||
"end_date": "Fecha final",
|
"end_date": "Fecha final",
|
||||||
"enqueued": "Añadido a la cola",
|
"enqueued": "Agregado a la cola",
|
||||||
"enter_wifi_name": "Introduce el nombre Wi-Fi",
|
"enter_wifi_name": "Introduce el nombre Wi-Fi",
|
||||||
"enter_your_pin_code": "Introduce tu código PIN",
|
"enter_your_pin_code": "Introduce tu código PIN",
|
||||||
"enter_your_pin_code_subtitle": "Introduce tu código PIN para acceder a la carpeta protegida",
|
"enter_your_pin_code_subtitle": "Introduce tu código PIN para acceder a la carpeta protegida",
|
||||||
@@ -1088,7 +1085,7 @@
|
|||||||
"unable_to_add_partners": "No se pueden añadir miembros",
|
"unable_to_add_partners": "No se pueden añadir miembros",
|
||||||
"unable_to_add_remove_archive": "No se pudo {archived, select, true {eliminar el recurso del} other {añadir el recurso al}} archivo",
|
"unable_to_add_remove_archive": "No se pudo {archived, select, true {eliminar el recurso del} other {añadir el recurso al}} archivo",
|
||||||
"unable_to_add_remove_favorites": "No se pudo {favorite, select, true {añadir el recuso a} other {eliminar el recurso de}} los favoritos",
|
"unable_to_add_remove_favorites": "No se pudo {favorite, select, true {añadir el recuso a} other {eliminar el recurso de}} los favoritos",
|
||||||
"unable_to_archive_unarchive": "No se pudo {archived, select, true {añadir el elemento al} other {quitar el elemento del}} archivo",
|
"unable_to_archive_unarchive": "No se pudo {archived, select, true {agregar el elemento al} other {quitar el elemento del}} archivo",
|
||||||
"unable_to_change_album_user_role": "No se puede cambiar la función del usuario del álbum",
|
"unable_to_change_album_user_role": "No se puede cambiar la función del usuario del álbum",
|
||||||
"unable_to_change_date": "No se puede cambiar la fecha",
|
"unable_to_change_date": "No se puede cambiar la fecha",
|
||||||
"unable_to_change_description": "Imposible cambiar la descripción",
|
"unable_to_change_description": "Imposible cambiar la descripción",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Etiqueta",
|
"tag": "Etiqueta",
|
||||||
"tag_assets": "Etiquetar recursos",
|
"tag_assets": "Etiquetar recursos",
|
||||||
"tag_created": "Etiqueta creada: {tag}",
|
"tag_created": "Etiqueta creada: {tag}",
|
||||||
"tag_face": "Etiquetar cara",
|
|
||||||
"tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas",
|
"tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas",
|
||||||
"tag_not_found_question": "¿No encuentra una etiqueta? <link>Crea una nueva etiqueta.</link>",
|
"tag_not_found_question": "¿No encuentra una etiqueta? <link>Crea una nueva etiqueta.</link>",
|
||||||
"tag_people": "Etiquetar personas",
|
"tag_people": "Etiquetar personas",
|
||||||
|
|||||||
+2
-14
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Luo linkki jaettavaksi",
|
"create_link_to_share": "Luo linkki jaettavaksi",
|
||||||
"create_link_to_share_description": "Salli kaikkien linkin saaneiden nähdä valitut kuvat",
|
"create_link_to_share_description": "Salli kaikkien linkin saaneiden nähdä valitut kuvat",
|
||||||
"create_new": "LUO UUSI",
|
"create_new": "LUO UUSI",
|
||||||
"create_new_face": "Luo uudet kasvot",
|
|
||||||
"create_new_person": "Luo uusi henkilö",
|
"create_new_person": "Luo uusi henkilö",
|
||||||
"create_new_person_hint": "Määritä valitut mediat uudelle henkilölle",
|
"create_new_person_hint": "Määritä valitut mediat uudelle henkilölle",
|
||||||
"create_new_user": "Luo uusi käyttäjä",
|
"create_new_user": "Luo uusi käyttäjä",
|
||||||
"create_person": "Luo henkilö",
|
|
||||||
"create_person_subtitle": "Lisää nimi valituille kasvoille luodaksesi uudelle henkilölle tunnisteen",
|
|
||||||
"create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA",
|
"create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA",
|
||||||
"create_shared_album_page_share_select_photos": "Valitse kuvat",
|
"create_shared_album_page_share_select_photos": "Valitse kuvat",
|
||||||
"create_shared_link": "Luo jakolinkki",
|
"create_shared_link": "Luo jakolinkki",
|
||||||
@@ -869,7 +866,6 @@
|
|||||||
"crop_aspect_ratio_fixed": "Kiinteä",
|
"crop_aspect_ratio_fixed": "Kiinteä",
|
||||||
"crop_aspect_ratio_free": "Vapaa",
|
"crop_aspect_ratio_free": "Vapaa",
|
||||||
"crop_aspect_ratio_original": "Alkuperäinen",
|
"crop_aspect_ratio_original": "Alkuperäinen",
|
||||||
"crop_aspect_ratio_square": "Neliö",
|
|
||||||
"curated_object_page_title": "Asiat",
|
"curated_object_page_title": "Asiat",
|
||||||
"current_device": "Nykyinen laite",
|
"current_device": "Nykyinen laite",
|
||||||
"current_pin_code": "Nykyinen PIN-koodi",
|
"current_pin_code": "Nykyinen PIN-koodi",
|
||||||
@@ -884,7 +880,7 @@
|
|||||||
"daily_title_text_date": "E, dd MMM",
|
"daily_title_text_date": "E, dd MMM",
|
||||||
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
"daily_title_text_date_year": "E, dd MMM, yyyy",
|
||||||
"dark": "Tumma",
|
"dark": "Tumma",
|
||||||
"dark_theme": "Vaihda tummaan teemaan",
|
"dark_theme": "Vaihda tumma teema",
|
||||||
"date": "Päivämäärä",
|
"date": "Päivämäärä",
|
||||||
"date_after": "Päivämäärän jälkeen",
|
"date_after": "Päivämäärän jälkeen",
|
||||||
"date_and_time": "Päivämäärä ja aika",
|
"date_and_time": "Päivämäärä ja aika",
|
||||||
@@ -895,8 +891,6 @@
|
|||||||
"day": "Päivä",
|
"day": "Päivä",
|
||||||
"days": "Päivää",
|
"days": "Päivää",
|
||||||
"deduplicate_all": "Poista kaikkien kaksoiskappaleet",
|
"deduplicate_all": "Poista kaikkien kaksoiskappaleet",
|
||||||
"default_locale": "Oletuskieli",
|
|
||||||
"default_locale_description": "Muotoile päivämäärät ja luvut selaimesi kieliasetusten mukaan",
|
|
||||||
"delete": "Poista",
|
"delete": "Poista",
|
||||||
"delete_action_confirmation_message": "Haluatko varmasti poistaa tämän aineiston? Tämä toiminto siirtää aineiston palvelimen roskakoriin ja kysyy, haluatko poistaa sen myös paikallisesti",
|
"delete_action_confirmation_message": "Haluatko varmasti poistaa tämän aineiston? Tämä toiminto siirtää aineiston palvelimen roskakoriin ja kysyy, haluatko poistaa sen myös paikallisesti",
|
||||||
"delete_action_prompt": "{count} poistettu",
|
"delete_action_prompt": "{count} poistettu",
|
||||||
@@ -972,7 +966,7 @@
|
|||||||
"downloading_media": "Median lataaminen",
|
"downloading_media": "Median lataaminen",
|
||||||
"drop_files_to_upload": "Pudota tiedostot mihin tahansa ladataksesi ne",
|
"drop_files_to_upload": "Pudota tiedostot mihin tahansa ladataksesi ne",
|
||||||
"duplicates": "Kaksoiskappaleet",
|
"duplicates": "Kaksoiskappaleet",
|
||||||
"duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos mitkään) ovat kaksoiskappaleita.",
|
"duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos mitkään) ovat kaksoiskappaleita",
|
||||||
"duration": "Kesto",
|
"duration": "Kesto",
|
||||||
"edit": "Muokkaa",
|
"edit": "Muokkaa",
|
||||||
"edit_album": "Muokkaa albumia",
|
"edit_album": "Muokkaa albumia",
|
||||||
@@ -1009,8 +1003,6 @@
|
|||||||
"editor_edits_applied_success": "Muutokset otettu käyttöön",
|
"editor_edits_applied_success": "Muutokset otettu käyttöön",
|
||||||
"editor_flip_horizontal": "Käännä vaakatasossa",
|
"editor_flip_horizontal": "Käännä vaakatasossa",
|
||||||
"editor_flip_vertical": "Käännä pystytasossa",
|
"editor_flip_vertical": "Käännä pystytasossa",
|
||||||
"editor_handle_corner": "{corner, select, top_left {Vasen yläkulma} top_right {Oikea yläkulma} bottom_left {Vasen alakulma} bottom_right {Oikea alakulma} other {A}} kulman kahva",
|
|
||||||
"editor_handle_edge": "{edge, select, top {Yläreuna} bottom {Alareuna} left {Vasen reuna} right {Oikea reuna} other {En}} reunan kahva",
|
|
||||||
"editor_orientation": "Suunta",
|
"editor_orientation": "Suunta",
|
||||||
"editor_reset_all_changes": "Nollaa muutokset",
|
"editor_reset_all_changes": "Nollaa muutokset",
|
||||||
"editor_rotate_left": "Kierrä 90° vastapäivään",
|
"editor_rotate_left": "Kierrä 90° vastapäivään",
|
||||||
@@ -1389,11 +1381,9 @@
|
|||||||
"library_page_sort_title": "Albumin otsikko",
|
"library_page_sort_title": "Albumin otsikko",
|
||||||
"licenses": "Lisenssit",
|
"licenses": "Lisenssit",
|
||||||
"light": "Vaalea",
|
"light": "Vaalea",
|
||||||
"light_theme": "Vaihda vaaleaan teemaan",
|
|
||||||
"like": "Tykkää",
|
"like": "Tykkää",
|
||||||
"like_deleted": "Tykkäys poistettu",
|
"like_deleted": "Tykkäys poistettu",
|
||||||
"link_motion_video": "Linkitä liikevideo",
|
"link_motion_video": "Linkitä liikevideo",
|
||||||
"link_to_docs": "Lisätietoja löytyy <link>dokumentaatiosta</link>.",
|
|
||||||
"link_to_oauth": "Linkki OAuth",
|
"link_to_oauth": "Linkki OAuth",
|
||||||
"linked_oauth_account": "Linkitetty OAuth-tili",
|
"linked_oauth_account": "Linkitetty OAuth-tili",
|
||||||
"list": "Lista",
|
"list": "Lista",
|
||||||
@@ -2217,7 +2207,6 @@
|
|||||||
"tag": "Tunniste",
|
"tag": "Tunniste",
|
||||||
"tag_assets": "Lisää tunnisteita",
|
"tag_assets": "Lisää tunnisteita",
|
||||||
"tag_created": "Luotu tunniste: {tag}",
|
"tag_created": "Luotu tunniste: {tag}",
|
||||||
"tag_face": "Merkitse kasvot",
|
|
||||||
"tag_feature_description": "Selaa valokuvia ja videoita, jotka on ryhmitelty loogisten tunnisteotsikoiden mukaan",
|
"tag_feature_description": "Selaa valokuvia ja videoita, jotka on ryhmitelty loogisten tunnisteotsikoiden mukaan",
|
||||||
"tag_not_found_question": "Etkö löydä tunnistetta? <link>Luo uusi tunniste.</link>",
|
"tag_not_found_question": "Etkö löydä tunnistetta? <link>Luo uusi tunniste.</link>",
|
||||||
"tag_people": "Merkitse henkilö tunnisteella",
|
"tag_people": "Merkitse henkilö tunnisteella",
|
||||||
@@ -2399,7 +2388,6 @@
|
|||||||
"viewer_remove_from_stack": "Poista pinosta",
|
"viewer_remove_from_stack": "Poista pinosta",
|
||||||
"viewer_stack_use_as_main_asset": "Käytä pääkohteena",
|
"viewer_stack_use_as_main_asset": "Käytä pääkohteena",
|
||||||
"viewer_unstack": "Pura pino",
|
"viewer_unstack": "Pura pino",
|
||||||
"visibility": "Näkyvyys",
|
|
||||||
"visibility_changed": "{count, plural, one {# henkilön} other {# henkilöiden}} näkyvyys vaihdettu",
|
"visibility_changed": "{count, plural, one {# henkilön} other {# henkilöiden}} näkyvyys vaihdettu",
|
||||||
"visual": "Visuaalinen",
|
"visual": "Visuaalinen",
|
||||||
"visual_builder": "Visuaalinen koostaja",
|
"visual_builder": "Visuaalinen koostaja",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Créer un lien pour partager",
|
"create_link_to_share": "Créer un lien pour partager",
|
||||||
"create_link_to_share_description": "Permettre à n'importe qui ayant le lien de voir la(es) photo(s) sélectionnée(s)",
|
"create_link_to_share_description": "Permettre à n'importe qui ayant le lien de voir la(es) photo(s) sélectionnée(s)",
|
||||||
"create_new": "NOUVEAU",
|
"create_new": "NOUVEAU",
|
||||||
"create_new_face": "Créer un nouveau visage",
|
|
||||||
"create_new_person": "Créer une nouvelle personne",
|
"create_new_person": "Créer une nouvelle personne",
|
||||||
"create_new_person_hint": "Attribuer les médias sélectionnés à une nouvelle personne",
|
"create_new_person_hint": "Attribuer les médias sélectionnés à une nouvelle personne",
|
||||||
"create_new_user": "Créer un nouvel utilisateur",
|
"create_new_user": "Créer un nouvel utilisateur",
|
||||||
"create_person": "Créer une personne",
|
|
||||||
"create_person_subtitle": "Ajouter un nom au visage sélectionné pour créer et étiqueter la nouvelle personne",
|
|
||||||
"create_shared_album_page_share_add_assets": "AJOUTER DES ÉLÉMENTS",
|
"create_shared_album_page_share_add_assets": "AJOUTER DES ÉLÉMENTS",
|
||||||
"create_shared_album_page_share_select_photos": "Sélectionner les photos",
|
"create_shared_album_page_share_select_photos": "Sélectionner les photos",
|
||||||
"create_shared_link": "Créer un lien partagé",
|
"create_shared_link": "Créer un lien partagé",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Étiquette",
|
"tag": "Étiquette",
|
||||||
"tag_assets": "Étiqueter les médias",
|
"tag_assets": "Étiqueter les médias",
|
||||||
"tag_created": "Étiquette créée : {tag}",
|
"tag_created": "Étiquette créée : {tag}",
|
||||||
"tag_face": "Étiqueter le visage",
|
|
||||||
"tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques",
|
"tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques",
|
||||||
"tag_not_found_question": "Vous ne trouvez pas une étiquette ? <link>Créer une nouvelle étiquette.</link>",
|
"tag_not_found_question": "Vous ne trouvez pas une étiquette ? <link>Créer une nouvelle étiquette.</link>",
|
||||||
"tag_people": "Étiqueter les personnes",
|
"tag_people": "Étiqueter les personnes",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Crear ligazón para compartir",
|
"create_link_to_share": "Crear ligazón para compartir",
|
||||||
"create_link_to_share_description": "Permitir que calquera persoa coa ligazón vexa a(s) foto(s) seleccionada(s)",
|
"create_link_to_share_description": "Permitir que calquera persoa coa ligazón vexa a(s) foto(s) seleccionada(s)",
|
||||||
"create_new": "CREAR NOVO",
|
"create_new": "CREAR NOVO",
|
||||||
"create_new_face": "Crear nova cara",
|
|
||||||
"create_new_person": "Crear nova persoa",
|
"create_new_person": "Crear nova persoa",
|
||||||
"create_new_person_hint": "Asignar activos seleccionados a unha nova persoa",
|
"create_new_person_hint": "Asignar activos seleccionados a unha nova persoa",
|
||||||
"create_new_user": "Crear novo usuario",
|
"create_new_user": "Crear novo usuario",
|
||||||
"create_person": "Crear persona",
|
|
||||||
"create_person_subtitle": "Engade un nome á cara seleccionada para crear e etiquetar á nova persona",
|
|
||||||
"create_shared_album_page_share_add_assets": "ENGADIR ACTIVOS",
|
"create_shared_album_page_share_add_assets": "ENGADIR ACTIVOS",
|
||||||
"create_shared_album_page_share_select_photos": "Seleccionar Fotos",
|
"create_shared_album_page_share_select_photos": "Seleccionar Fotos",
|
||||||
"create_shared_link": "Crear ligazón compartida",
|
"create_shared_link": "Crear ligazón compartida",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Etiqueta",
|
"tag": "Etiqueta",
|
||||||
"tag_assets": "Etiquetar activos",
|
"tag_assets": "Etiquetar activos",
|
||||||
"tag_created": "Etiqueta creada: {tag}",
|
"tag_created": "Etiqueta creada: {tag}",
|
||||||
"tag_face": "Etiquetar cara",
|
|
||||||
"tag_feature_description": "Navegar por fotos e vídeos agrupados por temas de etiquetas lóxicas",
|
"tag_feature_description": "Navegar por fotos e vídeos agrupados por temas de etiquetas lóxicas",
|
||||||
"tag_not_found_question": "Non atopa unha etiqueta? <link>Crear unha nova etiqueta.</link>",
|
"tag_not_found_question": "Non atopa unha etiqueta? <link>Crear unha nova etiqueta.</link>",
|
||||||
"tag_people": "Etiquetar Persoas",
|
"tag_people": "Etiquetar Persoas",
|
||||||
|
|||||||
+1
-13
@@ -845,12 +845,9 @@
|
|||||||
"create_link_to_share": "Izradite vezu za dijeljenje",
|
"create_link_to_share": "Izradite vezu za dijeljenje",
|
||||||
"create_link_to_share_description": "Dopusti svakome s vezom da vidi odabrane fotografije",
|
"create_link_to_share_description": "Dopusti svakome s vezom da vidi odabrane fotografije",
|
||||||
"create_new": "KREIRAJ NOVO",
|
"create_new": "KREIRAJ NOVO",
|
||||||
"create_new_face": "Stvori novo lice",
|
|
||||||
"create_new_person": "Stvorite novu osobu",
|
"create_new_person": "Stvorite novu osobu",
|
||||||
"create_new_person_hint": "Dodijelite odabrane stavke novoj osobi",
|
"create_new_person_hint": "Dodijelite odabrane stavke novoj osobi",
|
||||||
"create_new_user": "Kreiraj novog korisnika",
|
"create_new_user": "Kreiraj novog korisnika",
|
||||||
"create_person": "Stvori novu osobu",
|
|
||||||
"create_person_subtitle": "Dodaj ime odabranom licu kako bi stvorio i tagirao novu osobu",
|
|
||||||
"create_shared_album_page_share_add_assets": "DODAJ STAVKE",
|
"create_shared_album_page_share_add_assets": "DODAJ STAVKE",
|
||||||
"create_shared_album_page_share_select_photos": "Odaberi fotografije",
|
"create_shared_album_page_share_select_photos": "Odaberi fotografije",
|
||||||
"create_shared_link": "Kreiraj dijeljeni link",
|
"create_shared_link": "Kreiraj dijeljeni link",
|
||||||
@@ -925,7 +922,6 @@
|
|||||||
"deselect_all": "Poništi odabir svih",
|
"deselect_all": "Poništi odabir svih",
|
||||||
"details": "Detalji",
|
"details": "Detalji",
|
||||||
"direction": "Smjer",
|
"direction": "Smjer",
|
||||||
"disable": "Onesposobi",
|
|
||||||
"disabled": "Onemogućeno",
|
"disabled": "Onemogućeno",
|
||||||
"disallow_edits": "Zabrani izmjene",
|
"disallow_edits": "Zabrani izmjene",
|
||||||
"discord": "Discord",
|
"discord": "Discord",
|
||||||
@@ -951,7 +947,6 @@
|
|||||||
"download_include_embedded_motion_videos": "Ugrađeni videozapisi",
|
"download_include_embedded_motion_videos": "Ugrađeni videozapisi",
|
||||||
"download_include_embedded_motion_videos_description": "Uključite videozapise ugrađene u fotografije s pokretom kao zasebnu datoteku",
|
"download_include_embedded_motion_videos_description": "Uključite videozapise ugrađene u fotografije s pokretom kao zasebnu datoteku",
|
||||||
"download_notfound": "Preuzimanje nije pronađeno",
|
"download_notfound": "Preuzimanje nije pronađeno",
|
||||||
"download_original": "Preuzmi original",
|
|
||||||
"download_paused": "Preuzimanje pauzirano",
|
"download_paused": "Preuzimanje pauzirano",
|
||||||
"download_settings": "Preuzmi",
|
"download_settings": "Preuzmi",
|
||||||
"download_settings_description": "Upravljajte postavkama vezanim uz preuzimanje stavki",
|
"download_settings_description": "Upravljajte postavkama vezanim uz preuzimanje stavki",
|
||||||
@@ -961,11 +956,10 @@
|
|||||||
"download_waiting_to_retry": "Čeka se ponovni pokušaj",
|
"download_waiting_to_retry": "Čeka se ponovni pokušaj",
|
||||||
"downloading": "Preuzimanje",
|
"downloading": "Preuzimanje",
|
||||||
"downloading_asset_filename": "Preuzimanje stavke {filename}",
|
"downloading_asset_filename": "Preuzimanje stavke {filename}",
|
||||||
"downloading_from_icloud": "Preuzmi s iCloud",
|
|
||||||
"downloading_media": "Preuzimanje medija",
|
"downloading_media": "Preuzimanje medija",
|
||||||
"drop_files_to_upload": "Ispustite datoteke bilo gdje za prijenos",
|
"drop_files_to_upload": "Ispustite datoteke bilo gdje za prijenos",
|
||||||
"duplicates": "Duplikati",
|
"duplicates": "Duplikati",
|
||||||
"duplicates_description": "Razriješite svaku grupu tako da naznačite koji su duplikati, ako ih ima.",
|
"duplicates_description": "Razriješite svaku grupu tako da naznačite koji su duplikati, ako ih ima",
|
||||||
"duration": "Trajanje",
|
"duration": "Trajanje",
|
||||||
"edit": "Izmjena",
|
"edit": "Izmjena",
|
||||||
"edit_album": "Uredi album",
|
"edit_album": "Uredi album",
|
||||||
@@ -993,12 +987,6 @@
|
|||||||
"editor": "Urednik",
|
"editor": "Urednik",
|
||||||
"editor_close_without_save_prompt": "Promjene neće biti spremljene",
|
"editor_close_without_save_prompt": "Promjene neće biti spremljene",
|
||||||
"editor_close_without_save_title": "Zatvoriti uređivač?",
|
"editor_close_without_save_title": "Zatvoriti uređivač?",
|
||||||
"editor_confirm_reset_all_changes": "Jeste li sigurni da želite resetirati sve opcije?",
|
|
||||||
"editor_discard_edits_confirm": "Odbaci izmjene",
|
|
||||||
"editor_discard_edits_prompt": "Imate nesačuvane izmjene. Jeste li sigurni da ih želite odbaciti?",
|
|
||||||
"editor_discard_edits_title": "Odbaci izmjene?",
|
|
||||||
"editor_rotate_left": "Rotiraj 90° u suprotnom smjeru kazaljke na satu",
|
|
||||||
"editor_rotate_right": "Rotiraj 90° u smjeru kazaljke na satu",
|
|
||||||
"email": "E-pošta",
|
"email": "E-pošta",
|
||||||
"email_notifications": "Obavijesti putem e-maila",
|
"email_notifications": "Obavijesti putem e-maila",
|
||||||
"empty_folder": "Ova mapa je prazna",
|
"empty_folder": "Ova mapa je prazna",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Buat tautan untuk dibagikan",
|
"create_link_to_share": "Buat tautan untuk dibagikan",
|
||||||
"create_link_to_share_description": "Biarkan siapa pun dengan tautan melihat foto yang dipilih",
|
"create_link_to_share_description": "Biarkan siapa pun dengan tautan melihat foto yang dipilih",
|
||||||
"create_new": "BUAT BARU",
|
"create_new": "BUAT BARU",
|
||||||
"create_new_face": "Buat wajah baru",
|
|
||||||
"create_new_person": "Buat orang baru",
|
"create_new_person": "Buat orang baru",
|
||||||
"create_new_person_hint": "Tetapkan aset yang dipilih ke orang yang baru",
|
"create_new_person_hint": "Tetapkan aset yang dipilih ke orang yang baru",
|
||||||
"create_new_user": "Buat pengguna baru",
|
"create_new_user": "Buat pengguna baru",
|
||||||
"create_person": "Buat orang",
|
|
||||||
"create_person_subtitle": "Tambahkan nama pada wajah yang dipilih untuk membuat dan menandai orang baru",
|
|
||||||
"create_shared_album_page_share_add_assets": "TAMBAHKAN ASET",
|
"create_shared_album_page_share_add_assets": "TAMBAHKAN ASET",
|
||||||
"create_shared_album_page_share_select_photos": "Pilih Foto",
|
"create_shared_album_page_share_select_photos": "Pilih Foto",
|
||||||
"create_shared_link": "Buat tautan bersama",
|
"create_shared_link": "Buat tautan bersama",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Tag aset",
|
"tag_assets": "Tag aset",
|
||||||
"tag_created": "Tag yang dibuat: {tag}",
|
"tag_created": "Tag yang dibuat: {tag}",
|
||||||
"tag_face": "Tandai wajah",
|
|
||||||
"tag_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan topik tag yang logis",
|
"tag_feature_description": "Menjelajahi foto dan video yang dikelompokkan berdasarkan topik tag yang logis",
|
||||||
"tag_not_found_question": "Tidak dapat menemukan tag? <link>Buat tag baru.</link>",
|
"tag_not_found_question": "Tidak dapat menemukan tag? <link>Buat tag baru.</link>",
|
||||||
"tag_people": "Beri Tag Orang",
|
"tag_people": "Beri Tag Orang",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Crea link da condividere",
|
"create_link_to_share": "Crea link da condividere",
|
||||||
"create_link_to_share_description": "Permetti a chiunque con il link di vedere le foto selezionate",
|
"create_link_to_share_description": "Permetti a chiunque con il link di vedere le foto selezionate",
|
||||||
"create_new": "CREA NUOVO",
|
"create_new": "CREA NUOVO",
|
||||||
"create_new_face": "Crea nuova faccia",
|
|
||||||
"create_new_person": "Crea nuova persona",
|
"create_new_person": "Crea nuova persona",
|
||||||
"create_new_person_hint": "Assegna le risorse selezionate a una nuova persona",
|
"create_new_person_hint": "Assegna le risorse selezionate a una nuova persona",
|
||||||
"create_new_user": "Crea nuovo utente",
|
"create_new_user": "Crea nuovo utente",
|
||||||
"create_person": "Crea persona",
|
|
||||||
"create_person_subtitle": "Aggiungi un nome alla faccia selezionata per creare e taggare la nuova persona",
|
|
||||||
"create_shared_album_page_share_add_assets": "AGGIUNGI RISORSE",
|
"create_shared_album_page_share_add_assets": "AGGIUNGI RISORSE",
|
||||||
"create_shared_album_page_share_select_photos": "Seleziona foto",
|
"create_shared_album_page_share_select_photos": "Seleziona foto",
|
||||||
"create_shared_link": "Crea link condiviso",
|
"create_shared_link": "Crea link condiviso",
|
||||||
@@ -895,8 +892,6 @@
|
|||||||
"day": "Giorno",
|
"day": "Giorno",
|
||||||
"days": "Giorni",
|
"days": "Giorni",
|
||||||
"deduplicate_all": "Elimina tutti i doppioni",
|
"deduplicate_all": "Elimina tutti i doppioni",
|
||||||
"default_locale": "Predefinito Locale",
|
|
||||||
"default_locale_description": "Formatta le date e i numeri sulla base del tuo browser locale",
|
|
||||||
"delete": "Elimina",
|
"delete": "Elimina",
|
||||||
"delete_action_confirmation_message": "Vuoi davvero eliminare questa risorsa? Questa azione sposterà la risorsa nel cestino del server e ti chiederà se desideri eliminarla dal dispositivo",
|
"delete_action_confirmation_message": "Vuoi davvero eliminare questa risorsa? Questa azione sposterà la risorsa nel cestino del server e ti chiederà se desideri eliminarla dal dispositivo",
|
||||||
"delete_action_prompt": "{count} elementi eliminati",
|
"delete_action_prompt": "{count} elementi eliminati",
|
||||||
@@ -1393,7 +1388,6 @@
|
|||||||
"like": "Mi piace",
|
"like": "Mi piace",
|
||||||
"like_deleted": "Mi piace rimosso",
|
"like_deleted": "Mi piace rimosso",
|
||||||
"link_motion_video": "Collega video in movimento",
|
"link_motion_video": "Collega video in movimento",
|
||||||
"link_to_docs": "Per maggiori informazioni, riferirsi al <link>documentazione</link>.",
|
|
||||||
"link_to_oauth": "Collegamento a OAuth",
|
"link_to_oauth": "Collegamento a OAuth",
|
||||||
"linked_oauth_account": "Account OAuth collegato",
|
"linked_oauth_account": "Account OAuth collegato",
|
||||||
"list": "Lista",
|
"list": "Lista",
|
||||||
@@ -2217,7 +2211,6 @@
|
|||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Tagga risorse",
|
"tag_assets": "Tagga risorse",
|
||||||
"tag_created": "Tag creato: {tag}",
|
"tag_created": "Tag creato: {tag}",
|
||||||
"tag_face": "Tagga la faccia",
|
|
||||||
"tag_feature_description": "Navigazione foto e video raggruppati per argomenti tag logici",
|
"tag_feature_description": "Navigazione foto e video raggruppati per argomenti tag logici",
|
||||||
"tag_not_found_question": "Non riesci a trovare un tag? <link>Creane uno nuovo.</link>",
|
"tag_not_found_question": "Non riesci a trovare un tag? <link>Creane uno nuovo.</link>",
|
||||||
"tag_people": "Tagga persone",
|
"tag_people": "Tagga persone",
|
||||||
|
|||||||
+24
-38
@@ -798,7 +798,7 @@
|
|||||||
"command_palette_to_close": "닫기",
|
"command_palette_to_close": "닫기",
|
||||||
"command_palette_to_navigate": "들어가기",
|
"command_palette_to_navigate": "들어가기",
|
||||||
"command_palette_to_select": "선택하기",
|
"command_palette_to_select": "선택하기",
|
||||||
"command_palette_to_show_all": "모두 보기",
|
"command_palette_to_show_all": "다 보여주기",
|
||||||
"comment_deleted": "댓글이 삭제되었습니다.",
|
"comment_deleted": "댓글이 삭제되었습니다.",
|
||||||
"comment_options": "댓글 옵션",
|
"comment_options": "댓글 옵션",
|
||||||
"comments_and_likes": "댓글 및 좋아요",
|
"comments_and_likes": "댓글 및 좋아요",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "공유 링크 생성",
|
"create_link_to_share": "공유 링크 생성",
|
||||||
"create_link_to_share_description": "링크가 있는 경우 누구나 선택한 사진을 볼 수 있습니다.",
|
"create_link_to_share_description": "링크가 있는 경우 누구나 선택한 사진을 볼 수 있습니다.",
|
||||||
"create_new": "새로 만들기",
|
"create_new": "새로 만들기",
|
||||||
"create_new_face": "새 얼굴 생성",
|
|
||||||
"create_new_person": "인물 생성",
|
"create_new_person": "인물 생성",
|
||||||
"create_new_person_hint": "선택한 항목의 인물을 새 인물로 변경",
|
"create_new_person_hint": "선택한 항목의 인물을 새 인물로 변경",
|
||||||
"create_new_user": "새 사용자 생성",
|
"create_new_user": "새 사용자 생성",
|
||||||
"create_person": "인물 생성",
|
|
||||||
"create_person_subtitle": "선택한 얼굴에 이름을 추가해 신규 인물을 생성하고 태그 지정",
|
|
||||||
"create_shared_album_page_share_add_assets": "항목 추가",
|
"create_shared_album_page_share_add_assets": "항목 추가",
|
||||||
"create_shared_album_page_share_select_photos": "사진 선택",
|
"create_shared_album_page_share_select_photos": "사진 선택",
|
||||||
"create_shared_link": "공유 링크 생성",
|
"create_shared_link": "공유 링크 생성",
|
||||||
@@ -869,7 +866,6 @@
|
|||||||
"crop_aspect_ratio_fixed": "고정",
|
"crop_aspect_ratio_fixed": "고정",
|
||||||
"crop_aspect_ratio_free": "직접 조절",
|
"crop_aspect_ratio_free": "직접 조절",
|
||||||
"crop_aspect_ratio_original": "원본",
|
"crop_aspect_ratio_original": "원본",
|
||||||
"crop_aspect_ratio_square": "정사각형",
|
|
||||||
"curated_object_page_title": "사물",
|
"curated_object_page_title": "사물",
|
||||||
"current_device": "현재 기기",
|
"current_device": "현재 기기",
|
||||||
"current_pin_code": "현재 PIN 코드",
|
"current_pin_code": "현재 PIN 코드",
|
||||||
@@ -884,7 +880,7 @@
|
|||||||
"daily_title_text_date": "M월 d일 EEEE",
|
"daily_title_text_date": "M월 d일 EEEE",
|
||||||
"daily_title_text_date_year": "yyyy년 M월 d일 EEEE",
|
"daily_title_text_date_year": "yyyy년 M월 d일 EEEE",
|
||||||
"dark": "다크",
|
"dark": "다크",
|
||||||
"dark_theme": "다크 테마 전환",
|
"dark_theme": "다크 테마 토글",
|
||||||
"date": "날짜",
|
"date": "날짜",
|
||||||
"date_after": "다음 날짜 이후",
|
"date_after": "다음 날짜 이후",
|
||||||
"date_and_time": "날짜 및 시간",
|
"date_and_time": "날짜 및 시간",
|
||||||
@@ -895,8 +891,6 @@
|
|||||||
"day": "일",
|
"day": "일",
|
||||||
"days": "일",
|
"days": "일",
|
||||||
"deduplicate_all": "모두 삭제",
|
"deduplicate_all": "모두 삭제",
|
||||||
"default_locale": "기본 로케일",
|
|
||||||
"default_locale_description": "브라우저 로케일 설정에 따라 날짜 및 숫자 형식을 지정합니다",
|
|
||||||
"delete": "삭제",
|
"delete": "삭제",
|
||||||
"delete_action_confirmation_message": "이 항목을 삭제하시겠습니까? 서버에서는 항목을 휴지통으로 이동시키며, 로컬에서도 삭제할 것인지 확인 메시지가 표시됩니다.",
|
"delete_action_confirmation_message": "이 항목을 삭제하시겠습니까? 서버에서는 항목을 휴지통으로 이동시키며, 로컬에서도 삭제할 것인지 확인 메시지가 표시됩니다.",
|
||||||
"delete_action_prompt": "{count}개 항목 삭제됨",
|
"delete_action_prompt": "{count}개 항목 삭제됨",
|
||||||
@@ -1009,8 +1003,6 @@
|
|||||||
"editor_edits_applied_success": "편집이 적용되었습니다.",
|
"editor_edits_applied_success": "편집이 적용되었습니다.",
|
||||||
"editor_flip_horizontal": "좌우반전",
|
"editor_flip_horizontal": "좌우반전",
|
||||||
"editor_flip_vertical": "상하반전",
|
"editor_flip_vertical": "상하반전",
|
||||||
"editor_handle_corner": "{corner, select, top_left {좌상단} top_right {우상단} bottom_left {좌하단} bottom_right {우하단} other {A}} 코너 핸들",
|
|
||||||
"editor_handle_edge": "{edge, select, top {위} bottom {아래} left {왼쪽} right {오른쪽} other {An}} 모서리 핸들",
|
|
||||||
"editor_orientation": "방향",
|
"editor_orientation": "방향",
|
||||||
"editor_reset_all_changes": "편집내용 초기화",
|
"editor_reset_all_changes": "편집내용 초기화",
|
||||||
"editor_rotate_left": "반시계 방향으로 90° 회전",
|
"editor_rotate_left": "반시계 방향으로 90° 회전",
|
||||||
@@ -1069,26 +1061,26 @@
|
|||||||
"failed_to_load_assets": "항목 로드 실패",
|
"failed_to_load_assets": "항목 로드 실패",
|
||||||
"failed_to_load_notifications": "알림 로드 실패",
|
"failed_to_load_notifications": "알림 로드 실패",
|
||||||
"failed_to_load_people": "인물 로드 실패",
|
"failed_to_load_people": "인물 로드 실패",
|
||||||
"failed_to_remove_product_key": "제품 키 제거에 실패했습니다.",
|
"failed_to_remove_product_key": "제품 키 제거에 실패",
|
||||||
"failed_to_reset_pin_code": "PIN 코드 초기화 실패",
|
"failed_to_reset_pin_code": "PIN 코드 초기화 실패",
|
||||||
"failed_to_stack_assets": "항목 스택에 실패했습니다.",
|
"failed_to_stack_assets": "항목 스택에 실패",
|
||||||
"failed_to_unstack_assets": "항목 스택 풀기에 실패했습니다.",
|
"failed_to_unstack_assets": "항목 스택 풀기에 실패",
|
||||||
"failed_to_update_notification_status": "알림 상태 업데이트 실패",
|
"failed_to_update_notification_status": "알림 상태 업데이트 실패",
|
||||||
"incorrect_email_or_password": "잘못된 이메일 또는 비밀번호",
|
"incorrect_email_or_password": "잘못된 이메일 또는 비밀번호",
|
||||||
"library_folder_already_exists": "가져올 경로가 이미 존재합니다.",
|
"library_folder_already_exists": "가져올 경로가 이미 존재합니다.",
|
||||||
"page_not_found": "페이지를 찾을 수 없음",
|
"page_not_found": "페이지를 찾을 수 없음 :/",
|
||||||
"paths_validation_failed": "{paths, plural, one {경로 #개} other {경로 #개}}가 유효성 검사에 실패했습니다.",
|
"paths_validation_failed": "{paths, plural, one {경로 #개} other {경로 #개}}가 유효성 검사에 실패했습니다.",
|
||||||
"profile_picture_transparent_pixels": "프로필 사진에 투명 픽셀을 사용할 수 없습니다. 사진을 확대하거나 이동하세요.",
|
"profile_picture_transparent_pixels": "프로필 사진에 투명 픽셀을 사용할 수 없습니다. 사진을 확대하거나 이동하세요.",
|
||||||
"quota_higher_than_disk_size": "할당량은 디스크 크기보다 작아야 합니다.",
|
"quota_higher_than_disk_size": "할당량은 디스크 크기보다 작아야 합니다.",
|
||||||
"something_went_wrong": "문제가 발생했습니다.",
|
"something_went_wrong": "문제가 발생했습니다.",
|
||||||
"unable_to_add_album_users": "앨범에 사용자를 추가할 수 없습니다.",
|
"unable_to_add_album_users": "앨범에 사용자를 추가할 수 없음",
|
||||||
"unable_to_add_assets_to_shared_link": "항목을 공유 링크에 추가할 수 없습니다.",
|
"unable_to_add_assets_to_shared_link": "항목을 공유 링크에 추가할 수 없음",
|
||||||
"unable_to_add_comment": "댓글을 추가할 수 없습니다.",
|
"unable_to_add_comment": "댓글을 추가할 수 없음",
|
||||||
"unable_to_add_exclusion_pattern": "제외 규칙을 추가할 수 없습니다.",
|
"unable_to_add_exclusion_pattern": "제외 규칙을 추가할 수 없음",
|
||||||
"unable_to_add_partners": "파트너를 추가할 수 없습니다.",
|
"unable_to_add_partners": "파트너를 추가할 수 없음",
|
||||||
"unable_to_add_remove_archive": "{archived, select, true {보관함에서 항목을 제거할} other {보관함으로 항목을 이동할}} 수 없습니다.",
|
"unable_to_add_remove_archive": "{archived, select, true {보관함에서 항목을 제거할} other {보관함으로 항목을 이동할}} 수 없음",
|
||||||
"unable_to_add_remove_favorites": "즐겨찾기에 항목을 {favorite, select, true {추가} other {제거}}할 수 없습니다",
|
"unable_to_add_remove_favorites": "즐겨찾기에 항목을 {favorite, select, true {추가} other {제거}}할 수 없음",
|
||||||
"unable_to_archive_unarchive": "항목을 {archived, select, true {보관} other {보관 해제}}할 수 없습니다",
|
"unable_to_archive_unarchive": "항목을 {archived, select, true {보관} other {보관 해제}}할 수 없음",
|
||||||
"unable_to_change_album_user_role": "앨범 사용자의 역할을 변경할 수 없습니다.",
|
"unable_to_change_album_user_role": "앨범 사용자의 역할을 변경할 수 없습니다.",
|
||||||
"unable_to_change_date": "날짜를 변경할 수 없습니다.",
|
"unable_to_change_date": "날짜를 변경할 수 없습니다.",
|
||||||
"unable_to_change_description": "설명을 변경할 수 없습니다.",
|
"unable_to_change_description": "설명을 변경할 수 없습니다.",
|
||||||
@@ -1134,10 +1126,10 @@
|
|||||||
"unable_to_remove_library": "라이브러리를 제거할 수 없습니다.",
|
"unable_to_remove_library": "라이브러리를 제거할 수 없습니다.",
|
||||||
"unable_to_remove_partner": "파트너를 제거할 수 없습니다.",
|
"unable_to_remove_partner": "파트너를 제거할 수 없습니다.",
|
||||||
"unable_to_remove_reaction": "반응을 제거할 수 없습니다.",
|
"unable_to_remove_reaction": "반응을 제거할 수 없습니다.",
|
||||||
"unable_to_reset_password": "비밀번호를 초기화할 수 없습니다.",
|
"unable_to_reset_password": "비밀번호를 초기화할 수 없음",
|
||||||
"unable_to_reset_pin_code": "PIN 코드를 초기화할 수 없음",
|
"unable_to_reset_pin_code": "PIN 코드를 초기화할 수 없음",
|
||||||
"unable_to_resolve_duplicate": "비슷한 항목을 처리할 수 없음",
|
"unable_to_resolve_duplicate": "비슷한 항목을 처리할 수 없음",
|
||||||
"unable_to_restore_assets": "항목을 복원할 수 없습니다.",
|
"unable_to_restore_assets": "항목을 복원할 수 없음",
|
||||||
"unable_to_restore_trash": "휴지통을 복원할 수 없습니다.",
|
"unable_to_restore_trash": "휴지통을 복원할 수 없습니다.",
|
||||||
"unable_to_restore_user": "사용자를 복원할 수 없습니다.",
|
"unable_to_restore_user": "사용자를 복원할 수 없습니다.",
|
||||||
"unable_to_save_album": "앨범을 저장할 수 없습니다.",
|
"unable_to_save_album": "앨범을 저장할 수 없습니다.",
|
||||||
@@ -1150,7 +1142,7 @@
|
|||||||
"unable_to_scan_library": "라이브러리를 스캔할 수 없습니다.",
|
"unable_to_scan_library": "라이브러리를 스캔할 수 없습니다.",
|
||||||
"unable_to_set_feature_photo": "대표 사진을 설정할 수 없습니다.",
|
"unable_to_set_feature_photo": "대표 사진을 설정할 수 없습니다.",
|
||||||
"unable_to_set_profile_picture": "프로필 사진을 설정할 수 없습니다.",
|
"unable_to_set_profile_picture": "프로필 사진을 설정할 수 없습니다.",
|
||||||
"unable_to_set_rating": "별점을 지정할 수 없습니다.",
|
"unable_to_set_rating": "평점을 정할 수 없음",
|
||||||
"unable_to_submit_job": "작업을 수행할 수 없습니다.",
|
"unable_to_submit_job": "작업을 수행할 수 없습니다.",
|
||||||
"unable_to_trash_asset": "휴지통으로 이동할 수 없습니다.",
|
"unable_to_trash_asset": "휴지통으로 이동할 수 없습니다.",
|
||||||
"unable_to_unlink_account": "계정 연결을 해제할 수 없습니다.",
|
"unable_to_unlink_account": "계정 연결을 해제할 수 없습니다.",
|
||||||
@@ -1389,11 +1381,9 @@
|
|||||||
"library_page_sort_title": "앨범명",
|
"library_page_sort_title": "앨범명",
|
||||||
"licenses": "라이선스",
|
"licenses": "라이선스",
|
||||||
"light": "라이트",
|
"light": "라이트",
|
||||||
"light_theme": "라이트 테마로 전환",
|
|
||||||
"like": "좋아요",
|
"like": "좋아요",
|
||||||
"like_deleted": "좋아요가 삭제되었습니다.",
|
"like_deleted": "좋아요가 삭제되었습니다.",
|
||||||
"link_motion_video": "모션 비디오 링크",
|
"link_motion_video": "모션 비디오 링크",
|
||||||
"link_to_docs": "자세한 내용은 <link>문서</link>를 참조하십시오.",
|
|
||||||
"link_to_oauth": "OAuth에 연결",
|
"link_to_oauth": "OAuth에 연결",
|
||||||
"linked_oauth_account": "OAuth 계정이 연결되었습니다.",
|
"linked_oauth_account": "OAuth 계정이 연결되었습니다.",
|
||||||
"list": "목록",
|
"list": "목록",
|
||||||
@@ -1655,7 +1645,6 @@
|
|||||||
"only_favorites": "즐겨찾기만",
|
"only_favorites": "즐겨찾기만",
|
||||||
"open": "열기",
|
"open": "열기",
|
||||||
"open_calendar": "캘린더 열기",
|
"open_calendar": "캘린더 열기",
|
||||||
"open_in_browser": "브라우저에서 열기",
|
|
||||||
"open_in_map_view": "지도 보기에서 열기",
|
"open_in_map_view": "지도 보기에서 열기",
|
||||||
"open_in_openstreetmap": "OpenStreetMap에서 열기",
|
"open_in_openstreetmap": "OpenStreetMap에서 열기",
|
||||||
"open_the_search_filters": "검색 필터 열기",
|
"open_the_search_filters": "검색 필터 열기",
|
||||||
@@ -1812,11 +1801,11 @@
|
|||||||
"purchase_settings_server_activated": "서버 제품 키는 관리자가 제어합니다.",
|
"purchase_settings_server_activated": "서버 제품 키는 관리자가 제어합니다.",
|
||||||
"query_asset_id": "쿼리 항목 ID",
|
"query_asset_id": "쿼리 항목 ID",
|
||||||
"queue_status": "전체 {total}, {count} 대기 중",
|
"queue_status": "전체 {total}, {count} 대기 중",
|
||||||
"rate_asset": "항목 별점",
|
"rate_asset": "항목 평점",
|
||||||
"rating": "별점",
|
"rating": "별점",
|
||||||
"rating_clear": "별점 초기화",
|
"rating_clear": "평점 초기화",
|
||||||
"rating_count": "{count, plural, =0 {별점 없음} one {#점} other {#점}}",
|
"rating_count": "{count, plural, =0 {평점 없음} one {#점} other {#점}}",
|
||||||
"rating_description": "상세 정보 패널에 EXIF 별점 태그 표시",
|
"rating_description": "상세 정보 패널에 EXIF 등급 태그 표시",
|
||||||
"reaction_options": "반응 옵션",
|
"reaction_options": "반응 옵션",
|
||||||
"read_changelog": "변경 내역 보기",
|
"read_changelog": "변경 내역 보기",
|
||||||
"readonly_mode_disabled": "읽기 전용 모드 비활성화",
|
"readonly_mode_disabled": "읽기 전용 모드 비활성화",
|
||||||
@@ -1934,7 +1923,6 @@
|
|||||||
"search_by_filename": "파일명 또는 확장자로 검색",
|
"search_by_filename": "파일명 또는 확장자로 검색",
|
||||||
"search_by_filename_example": "예: IMG_1234.JPG 또는 PNG",
|
"search_by_filename_example": "예: IMG_1234.JPG 또는 PNG",
|
||||||
"search_by_ocr": "OCR로 검색",
|
"search_by_ocr": "OCR로 검색",
|
||||||
"search_by_ocr_example": "라떼",
|
|
||||||
"search_camera_lens_model": "렌즈 모델 검색...",
|
"search_camera_lens_model": "렌즈 모델 검색...",
|
||||||
"search_camera_make": "카메라 제조사 검색...",
|
"search_camera_make": "카메라 제조사 검색...",
|
||||||
"search_camera_model": "카메라 모델명 검색...",
|
"search_camera_model": "카메라 모델명 검색...",
|
||||||
@@ -1954,7 +1942,7 @@
|
|||||||
"search_filter_media_type_title": "미디어 종류 선택",
|
"search_filter_media_type_title": "미디어 종류 선택",
|
||||||
"search_filter_ocr": "OCR 검색",
|
"search_filter_ocr": "OCR 검색",
|
||||||
"search_filter_people_title": "인물 선택",
|
"search_filter_people_title": "인물 선택",
|
||||||
"search_filter_star_rating": "별점",
|
"search_filter_star_rating": "평점",
|
||||||
"search_filter_tags_title": "태그 선택",
|
"search_filter_tags_title": "태그 선택",
|
||||||
"search_for": "검색",
|
"search_for": "검색",
|
||||||
"search_for_existing_person": "존재하는 인물 검색",
|
"search_for_existing_person": "존재하는 인물 검색",
|
||||||
@@ -1976,7 +1964,7 @@
|
|||||||
"search_page_your_map": "나의 지도",
|
"search_page_your_map": "나의 지도",
|
||||||
"search_people": "인물 검색",
|
"search_people": "인물 검색",
|
||||||
"search_places": "장소 검색",
|
"search_places": "장소 검색",
|
||||||
"search_rating": "별점으로 검색...",
|
"search_rating": "등급으로 검색...",
|
||||||
"search_result_page_new_search_hint": "새 검색",
|
"search_result_page_new_search_hint": "새 검색",
|
||||||
"search_settings": "설정 검색",
|
"search_settings": "설정 검색",
|
||||||
"search_state": "지역 검색...",
|
"search_state": "지역 검색...",
|
||||||
@@ -1998,7 +1986,6 @@
|
|||||||
"select_all_in": "{group}의 모든 항목 선택",
|
"select_all_in": "{group}의 모든 항목 선택",
|
||||||
"select_avatar_color": "아바타 색상 선택",
|
"select_avatar_color": "아바타 색상 선택",
|
||||||
"select_count": "{count, plural, one {# 선택중} other {# 선택중}}",
|
"select_count": "{count, plural, one {# 선택중} other {# 선택중}}",
|
||||||
"select_cutoff_date": "유지 기간 설정",
|
|
||||||
"select_face": "얼굴 선택",
|
"select_face": "얼굴 선택",
|
||||||
"select_featured_photo": "대표 사진 선택",
|
"select_featured_photo": "대표 사진 선택",
|
||||||
"select_from_computer": "컴퓨터에서 선택",
|
"select_from_computer": "컴퓨터에서 선택",
|
||||||
@@ -2397,7 +2384,6 @@
|
|||||||
"viewer_remove_from_stack": "스택에서 제거",
|
"viewer_remove_from_stack": "스택에서 제거",
|
||||||
"viewer_stack_use_as_main_asset": "대표 항목으로 설정",
|
"viewer_stack_use_as_main_asset": "대표 항목으로 설정",
|
||||||
"viewer_unstack": "스택 풀기",
|
"viewer_unstack": "스택 풀기",
|
||||||
"visibility": "표시 설정",
|
|
||||||
"visibility_changed": "인물 {count, plural, one {#명} other {#명}}의 표시 여부가 변경됨",
|
"visibility_changed": "인물 {count, plural, one {#명} other {#명}}의 표시 여부가 변경됨",
|
||||||
"visual": "비주얼",
|
"visual": "비주얼",
|
||||||
"visual_builder": "비주얼 빌더",
|
"visual_builder": "비주얼 빌더",
|
||||||
@@ -2428,7 +2414,7 @@
|
|||||||
"yes": "네",
|
"yes": "네",
|
||||||
"you_dont_have_any_shared_links": "공유 링크가 없습니다.",
|
"you_dont_have_any_shared_links": "공유 링크가 없습니다.",
|
||||||
"your_wifi_name": "Wi-Fi 네트워크 이름",
|
"your_wifi_name": "Wi-Fi 네트워크 이름",
|
||||||
"zero_to_clear_rating": "0을 눌러 항목 별점 초기화",
|
"zero_to_clear_rating": "0을 눌러 항목 평점 초기화",
|
||||||
"zoom_image": "이미지 확대",
|
"zoom_image": "이미지 확대",
|
||||||
"zoom_to_bounds": "화면에 맞춰 확대"
|
"zoom_to_bounds": "화면에 맞춰 확대"
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-7
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Sukurti bendrinimo nuorodą",
|
"create_link_to_share": "Sukurti bendrinimo nuorodą",
|
||||||
"create_link_to_share_description": "Leisti bet kam su nuoroda matyti pažymėtą(-as) nuotrauką(-as)",
|
"create_link_to_share_description": "Leisti bet kam su nuoroda matyti pažymėtą(-as) nuotrauką(-as)",
|
||||||
"create_new": "SUKURTI NAUJĄ",
|
"create_new": "SUKURTI NAUJĄ",
|
||||||
"create_new_face": "Sukurti naują veidą",
|
|
||||||
"create_new_person": "Sukurti naują žmogų",
|
"create_new_person": "Sukurti naują žmogų",
|
||||||
"create_new_person_hint": "Priskirti pasirinktus elementus naujam žmogui",
|
"create_new_person_hint": "Priskirti pasirinktus elementus naujam žmogui",
|
||||||
"create_new_user": "Sukurti naują varotoją",
|
"create_new_user": "Sukurti naują varotoją",
|
||||||
"create_person": "Sukurti asmenį",
|
|
||||||
"create_person_subtitle": "Pridėkite vardą prie pasirinkto veido, kad sukurtumėte ir pažymėtumėte naują asmenį",
|
|
||||||
"create_shared_album_page_share_add_assets": "PRIDĖTI ELEMENTŲ",
|
"create_shared_album_page_share_add_assets": "PRIDĖTI ELEMENTŲ",
|
||||||
"create_shared_album_page_share_select_photos": "Pažymėti nuotraukas",
|
"create_shared_album_page_share_select_photos": "Pažymėti nuotraukas",
|
||||||
"create_shared_link": "Sukurti dalijimosi nuorodą",
|
"create_shared_link": "Sukurti dalijimosi nuorodą",
|
||||||
@@ -1215,7 +1212,7 @@
|
|||||||
"file_name_text": "Failo pavadinimas",
|
"file_name_text": "Failo pavadinimas",
|
||||||
"file_name_with_value": "Failo pavadinimas: {file_name}",
|
"file_name_with_value": "Failo pavadinimas: {file_name}",
|
||||||
"file_size": "Failo dydis",
|
"file_size": "Failo dydis",
|
||||||
"filename": "Failo pavadinimas",
|
"filename": "Failopavadinimas",
|
||||||
"filetype": "Failo tipas",
|
"filetype": "Failo tipas",
|
||||||
"filter": "Filtras",
|
"filter": "Filtras",
|
||||||
"filter_description": "Tikslinių elementų filtravimo sąlygos",
|
"filter_description": "Tikslinių elementų filtravimo sąlygos",
|
||||||
@@ -1390,8 +1387,8 @@
|
|||||||
"licenses": "Licencijos",
|
"licenses": "Licencijos",
|
||||||
"light": "Šviesi",
|
"light": "Šviesi",
|
||||||
"light_theme": "Perjungti į šviesią temą",
|
"light_theme": "Perjungti į šviesią temą",
|
||||||
"like": "Patinka",
|
"like": "Kaip",
|
||||||
"like_deleted": "Patinka panaikintas",
|
"like_deleted": "Kaip ištrintas",
|
||||||
"link_motion_video": "Susieti judesio vaizdo įrašą",
|
"link_motion_video": "Susieti judesio vaizdo įrašą",
|
||||||
"link_to_docs": "Daugiau informacijos rasite <link>dokumentacijoje</link>.",
|
"link_to_docs": "Daugiau informacijos rasite <link>dokumentacijoje</link>.",
|
||||||
"link_to_oauth": "Susieti su OAuth",
|
"link_to_oauth": "Susieti su OAuth",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Žyma",
|
"tag": "Žyma",
|
||||||
"tag_assets": "Pažymėti",
|
"tag_assets": "Pažymėti",
|
||||||
"tag_created": "Sukurta žyma: {tag}",
|
"tag_created": "Sukurta žyma: {tag}",
|
||||||
"tag_face": "Pažymėti veidą",
|
|
||||||
"tag_feature_description": "Peržiūrėkite nuotraukas ir vaizdo įrašus sugrupuotus pagal sužymėtas temas",
|
"tag_feature_description": "Peržiūrėkite nuotraukas ir vaizdo įrašus sugrupuotus pagal sužymėtas temas",
|
||||||
"tag_not_found_question": "Nerandate žymos? <link>Sukurti naują žymą.</link>",
|
"tag_not_found_question": "Nerandate žymos? <link>Sukurti naują žymą.</link>",
|
||||||
"tag_people": "Pažymėti Žmones",
|
"tag_people": "Pažymėti Žmones",
|
||||||
|
|||||||
@@ -713,11 +713,9 @@
|
|||||||
"create_link": "Izveidot saiti",
|
"create_link": "Izveidot saiti",
|
||||||
"create_link_to_share": "Izveidot kopīgošanas saiti",
|
"create_link_to_share": "Izveidot kopīgošanas saiti",
|
||||||
"create_new": "IZVEIDOT JAUNU",
|
"create_new": "IZVEIDOT JAUNU",
|
||||||
"create_new_face": "Izveidot jaunu seju",
|
|
||||||
"create_new_person": "Izveidot jaunu personu",
|
"create_new_person": "Izveidot jaunu personu",
|
||||||
"create_new_person_hint": "Piesaistīt izvēlētos failus jaunai personai",
|
"create_new_person_hint": "Piesaistīt izvēlētos failus jaunai personai",
|
||||||
"create_new_user": "Izveidot jaunu lietotāju",
|
"create_new_user": "Izveidot jaunu lietotāju",
|
||||||
"create_person": "Izveidot personu",
|
|
||||||
"create_shared_album_page_share_add_assets": "PIEVIENOT AKTĪVUS",
|
"create_shared_album_page_share_add_assets": "PIEVIENOT AKTĪVUS",
|
||||||
"create_shared_album_page_share_select_photos": "Fotoattēlu Izvēle",
|
"create_shared_album_page_share_select_photos": "Fotoattēlu Izvēle",
|
||||||
"create_user": "Izveidot lietotāju",
|
"create_user": "Izveidot lietotāju",
|
||||||
@@ -881,7 +879,6 @@
|
|||||||
"failed_to_update_notification_status": "Neizdevās mainīt paziņojuma statusu",
|
"failed_to_update_notification_status": "Neizdevās mainīt paziņojuma statusu",
|
||||||
"incorrect_email_or_password": "Nepareizs e-pasts vai parole",
|
"incorrect_email_or_password": "Nepareizs e-pasts vai parole",
|
||||||
"library_folder_already_exists": "Šis importa ceļš jau pastāv.",
|
"library_folder_already_exists": "Šis importa ceļš jau pastāv.",
|
||||||
"page_not_found": "Lapa nav atrasta",
|
|
||||||
"profile_picture_transparent_pixels": "Profila attēlos nevar būt caurspīdīgi pikseļi. Lūdzu, palielini un/vai pārvieto attēlu.",
|
"profile_picture_transparent_pixels": "Profila attēlos nevar būt caurspīdīgi pikseļi. Lūdzu, palielini un/vai pārvieto attēlu.",
|
||||||
"quota_higher_than_disk_size": "Tu esi iestatījis kvotu, kas pārsniedz diska izmēru",
|
"quota_higher_than_disk_size": "Tu esi iestatījis kvotu, kas pārsniedz diska izmēru",
|
||||||
"something_went_wrong": "Kaut kas nogāja greizi",
|
"something_went_wrong": "Kaut kas nogāja greizi",
|
||||||
@@ -1298,7 +1295,6 @@
|
|||||||
"only_favorites": "Tikai izlase",
|
"only_favorites": "Tikai izlase",
|
||||||
"open": "Atvērt",
|
"open": "Atvērt",
|
||||||
"open_calendar": "Atvērt kalendāru",
|
"open_calendar": "Atvērt kalendāru",
|
||||||
"open_in_browser": "Atvērt pārlūkprogrammā",
|
|
||||||
"open_in_map_view": "Atvērt kartes skatā",
|
"open_in_map_view": "Atvērt kartes skatā",
|
||||||
"open_in_openstreetmap": "Atvērt OpenStreetMap",
|
"open_in_openstreetmap": "Atvērt OpenStreetMap",
|
||||||
"open_the_search_filters": "Atvērt meklēšanas filtrus",
|
"open_the_search_filters": "Atvērt meklēšanas filtrus",
|
||||||
@@ -1459,7 +1455,6 @@
|
|||||||
"reset_people_visibility": "Atiestatīt personu redzamību",
|
"reset_people_visibility": "Atiestatīt personu redzamību",
|
||||||
"reset_pin_code": "Atiestatīt PIN kodu",
|
"reset_pin_code": "Atiestatīt PIN kodu",
|
||||||
"reset_sqlite": "Atiestatīt SQLite datubāzi",
|
"reset_sqlite": "Atiestatīt SQLite datubāzi",
|
||||||
"reset_sqlite_clear_app_data": "Notīrīt datus",
|
|
||||||
"reset_to_default": "Atiestatīt noklusējuma iestatījumus",
|
"reset_to_default": "Atiestatīt noklusējuma iestatījumus",
|
||||||
"resolve_duplicates": "Atrisināt dublēšanās gadījumus",
|
"resolve_duplicates": "Atrisināt dublēšanās gadījumus",
|
||||||
"resolved_all_duplicates": "Visi dublikāti ir atrisināti",
|
"resolved_all_duplicates": "Visi dublikāti ir atrisināti",
|
||||||
@@ -1710,7 +1705,6 @@
|
|||||||
"sync_local": "Sinhronizēt lokāli",
|
"sync_local": "Sinhronizēt lokāli",
|
||||||
"sync_status": "Sinhronizācijas statuss",
|
"sync_status": "Sinhronizācijas statuss",
|
||||||
"sync_status_subtitle": "Skatīt un pārvaldīt sinhronizācijas sistēmu",
|
"sync_status_subtitle": "Skatīt un pārvaldīt sinhronizācijas sistēmu",
|
||||||
"tag_face": "Atzīmēt seju",
|
|
||||||
"text_recognition": "Teksta atpazīšana",
|
"text_recognition": "Teksta atpazīšana",
|
||||||
"theme": "Dizains",
|
"theme": "Dizains",
|
||||||
"theme_setting_asset_list_storage_indicator_title": "Rādīt krātuves indikatoru uz attēliem režga skatā",
|
"theme_setting_asset_list_storage_indicator_title": "Rādīt krātuves indikatoru uz attēliem režga skatā",
|
||||||
@@ -1839,7 +1833,6 @@
|
|||||||
"viewer_remove_from_stack": "Noņemt no Steka",
|
"viewer_remove_from_stack": "Noņemt no Steka",
|
||||||
"viewer_stack_use_as_main_asset": "Izmantot kā Galveno Aktīvu",
|
"viewer_stack_use_as_main_asset": "Izmantot kā Galveno Aktīvu",
|
||||||
"viewer_unstack": "At-Stekot",
|
"viewer_unstack": "At-Stekot",
|
||||||
"visibility": "Redzamība",
|
|
||||||
"visual": "Vizuāli",
|
"visual": "Vizuāli",
|
||||||
"visual_builder": "Vizuālais veidotājs",
|
"visual_builder": "Vizuālais veidotājs",
|
||||||
"waiting": "Gaida",
|
"waiting": "Gaida",
|
||||||
|
|||||||
+6
-10
@@ -5,7 +5,7 @@
|
|||||||
"acknowledge": "Bekreft",
|
"acknowledge": "Bekreft",
|
||||||
"action": "Handling",
|
"action": "Handling",
|
||||||
"action_common_update": "Oppdater",
|
"action_common_update": "Oppdater",
|
||||||
"action_description": "Ett sett handlinger som skal utføres på de filtrerte mediefilene",
|
"action_description": "Ett sett med handlinger som skal utføres på de filtrerede objekter",
|
||||||
"actions": "Handlinger",
|
"actions": "Handlinger",
|
||||||
"active": "Aktiv",
|
"active": "Aktiv",
|
||||||
"active_count": "Aktiv: {count}",
|
"active_count": "Aktiv: {count}",
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"add_a_title": "Legg til tittel",
|
"add_a_title": "Legg til tittel",
|
||||||
"add_action": "Legg til hendelse",
|
"add_action": "Legg til hendelse",
|
||||||
"add_action_description": "Trykk for å legge til en hendelse å utføre",
|
"add_action_description": "Trykk for å legge til en hendelse å utføre",
|
||||||
"add_assets": "Legg til mediefiler",
|
"add_assets": "Legg til objekter",
|
||||||
"add_birthday": "Legg til bursdag",
|
"add_birthday": "Legg til bursdag",
|
||||||
"add_endpoint": "Legg til endepunkt",
|
"add_endpoint": "Legg til endepunkt",
|
||||||
"add_exclusion_pattern": "Legg til ekskluderingsmønster",
|
"add_exclusion_pattern": "Legg til ekskluderingsmønster",
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
"add_to_album": "Legg til album",
|
"add_to_album": "Legg til album",
|
||||||
"add_to_album_bottom_sheet_added": "Lagt til i {album}",
|
"add_to_album_bottom_sheet_added": "Lagt til i {album}",
|
||||||
"add_to_album_bottom_sheet_already_exists": "Allerede i {album}",
|
"add_to_album_bottom_sheet_already_exists": "Allerede i {album}",
|
||||||
"add_to_album_bottom_sheet_some_local_assets": "Noen lokale filer kunne ikke legges til i albumet",
|
"add_to_album_bottom_sheet_some_local_assets": "Noen lokale elementer kunne ikke legges til i albumet",
|
||||||
"add_to_album_toggle": "Avhuking for {album}",
|
"add_to_album_toggle": "Avhuking for {album}",
|
||||||
"add_to_albums": "Legg til i album",
|
"add_to_albums": "Legg til i album",
|
||||||
"add_to_albums_count": "Legg til i album ({count})",
|
"add_to_albums_count": "Legg til i album ({count})",
|
||||||
@@ -50,8 +50,8 @@
|
|||||||
"add_exclusion_pattern_description": "Legg til ekskluderingsmønstre. Globbing med *, ** og ? støttes. For å ignorere alle filer i en hvilken som helst mappe som heter \"Raw\", bruk \"**/Raw/**\". For å ignorere alle filer som slutter på \".tif\", bruk \"**/*.tif\". For å ignorere en absolutt filplassering, bruk \"/filsti/til/ignorer/**\".",
|
"add_exclusion_pattern_description": "Legg til ekskluderingsmønstre. Globbing med *, ** og ? støttes. For å ignorere alle filer i en hvilken som helst mappe som heter \"Raw\", bruk \"**/Raw/**\". For å ignorere alle filer som slutter på \".tif\", bruk \"**/*.tif\". For å ignorere en absolutt filplassering, bruk \"/filsti/til/ignorer/**\".",
|
||||||
"admin_user": "Administrasjonsbruker",
|
"admin_user": "Administrasjonsbruker",
|
||||||
"asset_offline_description": "Dette eksterne bibliotekselementet finnes ikke lenger på disk og har blitt flyttet til papirkurven. Hvis filen ble flyttet innad i biblioteket, se etter det tilsvarende elementet i tidslinjen din. For å gjenopprette elementet, vennligst sørg for at filstien under er tilgjengelig for Immich og skann biblioteket.",
|
"asset_offline_description": "Dette eksterne bibliotekselementet finnes ikke lenger på disk og har blitt flyttet til papirkurven. Hvis filen ble flyttet innad i biblioteket, se etter det tilsvarende elementet i tidslinjen din. For å gjenopprette elementet, vennligst sørg for at filstien under er tilgjengelig for Immich og skann biblioteket.",
|
||||||
"authentication_settings": "Godkjenings Instillinger",
|
"authentication_settings": "Godkjenninger",
|
||||||
"authentication_settings_description": "Administrer passord, OAuth, og andre innstillinger for autentiserings Instilinger",
|
"authentication_settings_description": "Administrer passord, OAuth, og andre innstillinger for autentisering",
|
||||||
"authentication_settings_disable_all": "Er du sikker på at du ønsker å deaktivere alle innloggingsmetoder? Innlogging vil bli fullstendig deaktivert.",
|
"authentication_settings_disable_all": "Er du sikker på at du ønsker å deaktivere alle innloggingsmetoder? Innlogging vil bli fullstendig deaktivert.",
|
||||||
"authentication_settings_reenable": "For å aktivere på nytt, bruk en <link>Server Command</link>.",
|
"authentication_settings_reenable": "For å aktivere på nytt, bruk en <link>Server Command</link>.",
|
||||||
"background_task_job": "Bakgrunnsjobber",
|
"background_task_job": "Bakgrunnsjobber",
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
"cron_expression_description": "Still inn skanneintervallet med cron-formatet. For mer informasjon henvises til f.eks. <link>Crontab Guru</link>",
|
"cron_expression_description": "Still inn skanneintervallet med cron-formatet. For mer informasjon henvises til f.eks. <link>Crontab Guru</link>",
|
||||||
"cron_expression_presets": "Forhåndsinnstillinger for Cron-uttrykk",
|
"cron_expression_presets": "Forhåndsinnstillinger for Cron-uttrykk",
|
||||||
"disable_login": "Deaktiver innlogging",
|
"disable_login": "Deaktiver innlogging",
|
||||||
"duplicate_detection_job_description": "Kjør maskinlæring på filer for å oppdage lignende bilder. Krever bruk av Smart Søk",
|
"duplicate_detection_job_description": "Kjør maskinlæring på filer for å oppdage lignende bilder. Krever bruk av Smart Search",
|
||||||
"exclusion_pattern_description": "Ekskluderingsmønstre lar deg ignorere filer og mapper når du skanner biblioteket ditt. Dette er nyttig hvis du har mapper som inneholder filer du ikke vil importere, for eksempel RAW-filer.",
|
"exclusion_pattern_description": "Ekskluderingsmønstre lar deg ignorere filer og mapper når du skanner biblioteket ditt. Dette er nyttig hvis du har mapper som inneholder filer du ikke vil importere, for eksempel RAW-filer.",
|
||||||
"export_config_as_json_description": "Last ned nåværende systemkonfigurasjon som en JSON fil",
|
"export_config_as_json_description": "Last ned nåværende systemkonfigurasjon som en JSON fil",
|
||||||
"external_libraries_page_description": "Administrering for eksterne bibliotek",
|
"external_libraries_page_description": "Administrering for eksterne bibliotek",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Opprett delelink",
|
"create_link_to_share": "Opprett delelink",
|
||||||
"create_link_to_share_description": "La alle med lenken se de(t) valgte bildet/bildene",
|
"create_link_to_share_description": "La alle med lenken se de(t) valgte bildet/bildene",
|
||||||
"create_new": "LAG NY",
|
"create_new": "LAG NY",
|
||||||
"create_new_face": "Opprett nytt ansikt",
|
|
||||||
"create_new_person": "Opprett ny person",
|
"create_new_person": "Opprett ny person",
|
||||||
"create_new_person_hint": "Tildel valgte eiendeler til en ny person",
|
"create_new_person_hint": "Tildel valgte eiendeler til en ny person",
|
||||||
"create_new_user": "Opprett ny bruker",
|
"create_new_user": "Opprett ny bruker",
|
||||||
"create_person": "Opprett person",
|
|
||||||
"create_person_subtitle": "Gi det valgte ansiktet et navn for å opprette og tagge den nye personen",
|
|
||||||
"create_shared_album_page_share_add_assets": "LEGG TIL OBJEKTER",
|
"create_shared_album_page_share_add_assets": "LEGG TIL OBJEKTER",
|
||||||
"create_shared_album_page_share_select_photos": "Velg bilder",
|
"create_shared_album_page_share_select_photos": "Velg bilder",
|
||||||
"create_shared_link": "Opprett delt lenke",
|
"create_shared_link": "Opprett delt lenke",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Tagg",
|
"tag": "Tagg",
|
||||||
"tag_assets": "Merk ressurser",
|
"tag_assets": "Merk ressurser",
|
||||||
"tag_created": "Lag merke: {tag}",
|
"tag_created": "Lag merke: {tag}",
|
||||||
"tag_face": "Tagg ansikt",
|
|
||||||
"tag_feature_description": "Bla gjennom bilder og videoer gruppert etter logiske merke-emner",
|
"tag_feature_description": "Bla gjennom bilder og videoer gruppert etter logiske merke-emner",
|
||||||
"tag_not_found_question": "Finner du ikke en merke? <link>Opprett en nytt merke.</link>",
|
"tag_not_found_question": "Finner du ikke en merke? <link>Opprett en nytt merke.</link>",
|
||||||
"tag_people": "Tag personer",
|
"tag_people": "Tag personer",
|
||||||
|
|||||||
+26
-30
@@ -544,7 +544,7 @@
|
|||||||
"appears_in": "Komt voor in",
|
"appears_in": "Komt voor in",
|
||||||
"apply_count": "Toepassen ({count, number})",
|
"apply_count": "Toepassen ({count, number})",
|
||||||
"archive": "Archief",
|
"archive": "Archief",
|
||||||
"archive_action_prompt": "{count, plural, one {# item} other {# items}} toegevoegd aan het archief",
|
"archive_action_prompt": "{count} item(s) toegevoegd aan het archief",
|
||||||
"archive_or_unarchive_photo": "Foto archiveren of uit het archief halen",
|
"archive_or_unarchive_photo": "Foto archiveren of uit het archief halen",
|
||||||
"archive_page_no_archived_assets": "Geen gearchiveerde items gevonden",
|
"archive_page_no_archived_assets": "Geen gearchiveerde items gevonden",
|
||||||
"archive_page_title": "Archief ({count})",
|
"archive_page_title": "Archief ({count})",
|
||||||
@@ -593,20 +593,20 @@
|
|||||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {# item} other {# items}} konden niet aan album toegevoegd worden",
|
"assets_cannot_be_added_to_album_count": "{count, plural, one {# item} other {# items}} konden niet aan album toegevoegd worden",
|
||||||
"assets_cannot_be_added_to_albums": "{count, plural, one {Item kan} other {Items kunnen}} niet toegevoegd worden aan de albums",
|
"assets_cannot_be_added_to_albums": "{count, plural, one {Item kan} other {Items kunnen}} niet toegevoegd worden aan de albums",
|
||||||
"assets_count": "{count, plural, one {# item} other {# items}}",
|
"assets_count": "{count, plural, one {# item} other {# items}}",
|
||||||
"assets_deleted_permanently": "{count, plural, one {# item} other {# items}} permanent verwijderd",
|
"assets_deleted_permanently": "{count} item(s) permanent verwijderd",
|
||||||
"assets_deleted_permanently_from_server": "{count, plural, one {# item} other {# items}} permanent verwijderd van de Immich server",
|
"assets_deleted_permanently_from_server": "{count} item(s) permanent verwijderd van de Immich server",
|
||||||
"assets_downloaded_failed": "{count, plural, one {# bestand gedownload - {error} bestand mislukt} other {# bestanden gedownload - {error} bestanden mislukt}}",
|
"assets_downloaded_failed": "{count, plural, one {# bestand gedownload - {error} bestand mislukt} other {# bestanden gedownload - {error} bestanden mislukt}}",
|
||||||
"assets_downloaded_successfully": "{count, plural, one {# bestand succesvol gedownload} other {# bestanden succesvol gedownload}}",
|
"assets_downloaded_successfully": "{count, plural, one {# bestand succesvol gedownload} other {# bestanden succesvol gedownload}}",
|
||||||
"assets_moved_to_trash_count": "{count, plural, one {# item} other {# items}} verplaatst naar prullenbak",
|
"assets_moved_to_trash_count": "{count, plural, one {# item} other {# items}} verplaatst naar prullenbak",
|
||||||
"assets_permanently_deleted_count": "{count, plural, one {# item} other {# items}} permanent verwijderd",
|
"assets_permanently_deleted_count": "{count, plural, one {# item} other {# items}} permanent verwijderd",
|
||||||
"assets_removed_count": "{count, plural, one {# item} other {# items}} verwijderd",
|
"assets_removed_count": "{count, plural, one {# item} other {# items}} verwijderd",
|
||||||
"assets_removed_permanently_from_device": "{count, plural, one {# item} other {# items}} permanent verwijderd van je apparaat",
|
"assets_removed_permanently_from_device": "{count} item(s) permanent verwijderd van je apparaat",
|
||||||
"assets_restore_confirmation": "Weet je zeker dat je alle verwijderde items wilt herstellen? Je kunt deze actie niet ongedaan maken! Offline items kunnen op deze manier niet worden hersteld.",
|
"assets_restore_confirmation": "Weet je zeker dat je alle verwijderde items wilt herstellen? Je kunt deze actie niet ongedaan maken! Offline items kunnen op deze manier niet worden hersteld.",
|
||||||
"assets_restored_count": "{count, plural, one {# item} other {# items}} hersteld",
|
"assets_restored_count": "{count, plural, one {# item} other {# items}} hersteld",
|
||||||
"assets_restored_successfully": "{count, plural, one {# item} other {# items}} succesvol hersteld",
|
"assets_restored_successfully": "{count} item(s) succesvol hersteld",
|
||||||
"assets_trashed": "{count, plural, one {# item} other {# items}} naar de prullenbak verplaatst",
|
"assets_trashed": "{count} item(s) naar de prullenbak verplaatst",
|
||||||
"assets_trashed_count": "{count, plural, one {# item} other {# items}} naar prullenbak verplaatst",
|
"assets_trashed_count": "{count, plural, one {# item} other {# items}} naar prullenbak verplaatst",
|
||||||
"assets_trashed_from_server": "{count, plural, one {# item} other {# items}} naar de prullenbak verplaatst op de Immich server",
|
"assets_trashed_from_server": "{count} item(s) naar de prullenbak verplaatst op de Immich server",
|
||||||
"assets_were_part_of_album_count": "{count, plural, one {Item was} other {Items waren}} al onderdeel van het album",
|
"assets_were_part_of_album_count": "{count, plural, one {Item was} other {Items waren}} al onderdeel van het album",
|
||||||
"assets_were_part_of_albums_count": "{count, plural, one {Item is} other {Items zijn}} al onderdeel van de albums",
|
"assets_were_part_of_albums_count": "{count, plural, one {Item is} other {Items zijn}} al onderdeel van de albums",
|
||||||
"authorized_devices": "Geautoriseerde apparaten",
|
"authorized_devices": "Geautoriseerde apparaten",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Gedeelde link maken",
|
"create_link_to_share": "Gedeelde link maken",
|
||||||
"create_link_to_share_description": "Laat iedereen met de link de geselecteerde foto(s) zien",
|
"create_link_to_share_description": "Laat iedereen met de link de geselecteerde foto(s) zien",
|
||||||
"create_new": "MAAK NIEUW",
|
"create_new": "MAAK NIEUW",
|
||||||
"create_new_face": "Nieuw gezicht aanmaken",
|
|
||||||
"create_new_person": "Nieuwe persoon aanmaken",
|
"create_new_person": "Nieuwe persoon aanmaken",
|
||||||
"create_new_person_hint": "Geselecteerde items toewijzen aan een nieuwe persoon",
|
"create_new_person_hint": "Geselecteerde items toewijzen aan een nieuwe persoon",
|
||||||
"create_new_user": "Nieuwe gebruiker aanmaken",
|
"create_new_user": "Nieuwe gebruiker aanmaken",
|
||||||
"create_person": "Persoon aanmaken",
|
|
||||||
"create_person_subtitle": "Voeg een naam toe aan het geselecteerde gezicht om de nieuwe persoon aan te maken en te taggen",
|
|
||||||
"create_shared_album_page_share_add_assets": "ITEMS TOEVOEGEN",
|
"create_shared_album_page_share_add_assets": "ITEMS TOEVOEGEN",
|
||||||
"create_shared_album_page_share_select_photos": "Selecteer foto's",
|
"create_shared_album_page_share_select_photos": "Selecteer foto's",
|
||||||
"create_shared_link": "Gedeelde link maken",
|
"create_shared_link": "Gedeelde link maken",
|
||||||
@@ -876,7 +873,7 @@
|
|||||||
"current_server_address": "Huidig serveradres",
|
"current_server_address": "Huidig serveradres",
|
||||||
"custom_date": "Aangepaste datum",
|
"custom_date": "Aangepaste datum",
|
||||||
"custom_locale": "Aangepaste landinstelling",
|
"custom_locale": "Aangepaste landinstelling",
|
||||||
"custom_locale_description": "Formatteer datums, tijden, en getallen op basis van de geselecteerde taal en regio",
|
"custom_locale_description": "Formatteer datums, tijden en getallen op basis van de geselecteerde taal en de regio",
|
||||||
"custom_url": "Aangepaste URL",
|
"custom_url": "Aangepaste URL",
|
||||||
"cutoff_date_description": "Bewaar foto's van de laatste…",
|
"cutoff_date_description": "Bewaar foto's van de laatste…",
|
||||||
"cutoff_day": "{count, plural, one {dag} other {dagen}}",
|
"cutoff_day": "{count, plural, one {dag} other {dagen}}",
|
||||||
@@ -896,10 +893,10 @@
|
|||||||
"days": "Dagen",
|
"days": "Dagen",
|
||||||
"deduplicate_all": "Alles dedupliceren",
|
"deduplicate_all": "Alles dedupliceren",
|
||||||
"default_locale": "Standaard landinstelling",
|
"default_locale": "Standaard landinstelling",
|
||||||
"default_locale_description": "Formatteer datums en getallen op basis van de taalinstellingen van je browser",
|
"default_locale_description": "Formatteer datums en getallen op basis van de taalinstellingen van uw browser",
|
||||||
"delete": "Verwijderen",
|
"delete": "Verwijderen",
|
||||||
"delete_action_confirmation_message": "Weet je zeker dat je dit item wilt verwijderen? Deze actie zorgt ervoor dat het item naar de prullenbak van de server wordt verplaatst en je wordt gevraagd of je deze ook lokaal wilt verwijderen",
|
"delete_action_confirmation_message": "Weet je zeker dat je dit item wilt verwijderen? Deze actie zorgt ervoor dat het item naar de prullenbak van de server wordt verplaatst en je wordt gevraagd of je deze ook lokaal wilt verwijderen",
|
||||||
"delete_action_prompt": "{count} verwijderd",
|
"delete_action_prompt": "{count} item(s) verwijderd",
|
||||||
"delete_album": "Album verwijderen",
|
"delete_album": "Album verwijderen",
|
||||||
"delete_api_key_prompt": "Weet je zeker dat je deze API-sleutel wilt verwijderen?",
|
"delete_api_key_prompt": "Weet je zeker dat je deze API-sleutel wilt verwijderen?",
|
||||||
"delete_dialog_alert": "Deze items zullen permanent verwijderd worden van Immich en je apparaat",
|
"delete_dialog_alert": "Deze items zullen permanent verwijderd worden van Immich en je apparaat",
|
||||||
@@ -913,12 +910,12 @@
|
|||||||
"delete_key": "Verwijder key",
|
"delete_key": "Verwijder key",
|
||||||
"delete_library": "Verwijder bibliotheek",
|
"delete_library": "Verwijder bibliotheek",
|
||||||
"delete_link": "Verwijder link",
|
"delete_link": "Verwijder link",
|
||||||
"delete_local_action_prompt": "{count} lokaal verwijderd",
|
"delete_local_action_prompt": "{count} item(s) lokaal verwijderd",
|
||||||
"delete_local_dialog_ok_backed_up_only": "Verwijder alleen met back-up",
|
"delete_local_dialog_ok_backed_up_only": "Verwijder alleen met back-up",
|
||||||
"delete_local_dialog_ok_force": "Toch verwijderen",
|
"delete_local_dialog_ok_force": "Toch verwijderen",
|
||||||
"delete_others": "Andere verwijderen",
|
"delete_others": "Andere verwijderen",
|
||||||
"delete_permanently": "Permanent verwijderen",
|
"delete_permanently": "Permanent verwijderen",
|
||||||
"delete_permanently_action_prompt": "{count} permanent verwijderd",
|
"delete_permanently_action_prompt": "{count} item(s) permanent verwijderd",
|
||||||
"delete_shared_link": "Verwijder gedeelde link",
|
"delete_shared_link": "Verwijder gedeelde link",
|
||||||
"delete_shared_link_dialog_title": "Verwijder gedeelde link",
|
"delete_shared_link_dialog_title": "Verwijder gedeelde link",
|
||||||
"delete_tag": "Tag verwijderen",
|
"delete_tag": "Tag verwijderen",
|
||||||
@@ -948,7 +945,7 @@
|
|||||||
"documentation": "Documentatie",
|
"documentation": "Documentatie",
|
||||||
"done": "Klaar",
|
"done": "Klaar",
|
||||||
"download": "Downloaden",
|
"download": "Downloaden",
|
||||||
"download_action_prompt": "{count, plural, one {# item} other {# items}} aan het downloaden",
|
"download_action_prompt": "{count} item(s) aan het downloaden",
|
||||||
"download_canceled": "Download geannuleerd",
|
"download_canceled": "Download geannuleerd",
|
||||||
"download_complete": "Download voltooid",
|
"download_complete": "Download voltooid",
|
||||||
"download_enqueue": "Download in wachtrij",
|
"download_enqueue": "Download in wachtrij",
|
||||||
@@ -980,7 +977,7 @@
|
|||||||
"edit_birthday": "Wijzig verjaardag",
|
"edit_birthday": "Wijzig verjaardag",
|
||||||
"edit_date": "Datum bewerken",
|
"edit_date": "Datum bewerken",
|
||||||
"edit_date_and_time": "Datum en tijd bewerken",
|
"edit_date_and_time": "Datum en tijd bewerken",
|
||||||
"edit_date_and_time_action_prompt": "Datum en tijd bijgewerkt van {count, plural, one {# item} other {# items}}",
|
"edit_date_and_time_action_prompt": "Datum en tijd bijgewerkt van {count} item(s)",
|
||||||
"edit_date_and_time_by_offset": "Wijzigen datum door verschuiving",
|
"edit_date_and_time_by_offset": "Wijzigen datum door verschuiving",
|
||||||
"edit_date_and_time_by_offset_interval": "Nieuw datuminterval: {from}-{to}",
|
"edit_date_and_time_by_offset_interval": "Nieuw datuminterval: {from}-{to}",
|
||||||
"edit_description": "Beschrijving bewerken",
|
"edit_description": "Beschrijving bewerken",
|
||||||
@@ -990,7 +987,7 @@
|
|||||||
"edit_key": "Key bewerken",
|
"edit_key": "Key bewerken",
|
||||||
"edit_link": "Link bewerken",
|
"edit_link": "Link bewerken",
|
||||||
"edit_location": "Locatie bewerken",
|
"edit_location": "Locatie bewerken",
|
||||||
"edit_location_action_prompt": "Locatie bijgewerkt van {count, plural, one {# item} other {# items}}",
|
"edit_location_action_prompt": "Locatie bijgewerkt van {count} item(s)",
|
||||||
"edit_location_dialog_title": "Locatie",
|
"edit_location_dialog_title": "Locatie",
|
||||||
"edit_name": "Naam bewerken",
|
"edit_name": "Naam bewerken",
|
||||||
"edit_people": "Mensen bewerken",
|
"edit_people": "Mensen bewerken",
|
||||||
@@ -1203,7 +1200,7 @@
|
|||||||
"failed_to_load_assets": "Kan items niet laden",
|
"failed_to_load_assets": "Kan items niet laden",
|
||||||
"failed_to_load_folder": "Laden van map mislukt",
|
"failed_to_load_folder": "Laden van map mislukt",
|
||||||
"favorite": "Favoriet",
|
"favorite": "Favoriet",
|
||||||
"favorite_action_prompt": "{count, plural, one {# item} other {# items}} toegevoegd aan je favorieten",
|
"favorite_action_prompt": "{count} item(s) toegevoegd aan je favorieten",
|
||||||
"favorite_or_unfavorite_photo": "Foto markeren als of verwijderen uit favorieten",
|
"favorite_or_unfavorite_photo": "Foto markeren als of verwijderen uit favorieten",
|
||||||
"favorites": "Favorieten",
|
"favorites": "Favorieten",
|
||||||
"favorites_page_no_favorites": "Geen favoriete items gevonden",
|
"favorites_page_no_favorites": "Geen favoriete items gevonden",
|
||||||
@@ -1389,7 +1386,7 @@
|
|||||||
"library_page_sort_title": "Albumtitel",
|
"library_page_sort_title": "Albumtitel",
|
||||||
"licenses": "Licenties",
|
"licenses": "Licenties",
|
||||||
"light": "Licht",
|
"light": "Licht",
|
||||||
"light_theme": "Wissel naar licht thema",
|
"light_theme": "Wissel naar lichte thema",
|
||||||
"like": "Vind ik leuk",
|
"like": "Vind ik leuk",
|
||||||
"like_deleted": "Like verwijderd",
|
"like_deleted": "Like verwijderd",
|
||||||
"link_motion_video": "Koppel bewegende video",
|
"link_motion_video": "Koppel bewegende video",
|
||||||
@@ -1551,7 +1548,7 @@
|
|||||||
"move_off_locked_folder": "Verplaats uit vergrendelde map",
|
"move_off_locked_folder": "Verplaats uit vergrendelde map",
|
||||||
"move_to": "Verplaatsen naar",
|
"move_to": "Verplaatsen naar",
|
||||||
"move_to_device_trash": "Naar prullenbak van apparaat",
|
"move_to_device_trash": "Naar prullenbak van apparaat",
|
||||||
"move_to_lock_folder_action_prompt": "{count, plural, one {# item} other {# items}} toegevoegd aan de vergrendelde map",
|
"move_to_lock_folder_action_prompt": "{count} item(s) toegevoegd aan de vergrendelde map",
|
||||||
"move_to_locked_folder": "Verplaats naar vergrendelde map",
|
"move_to_locked_folder": "Verplaats naar vergrendelde map",
|
||||||
"move_to_locked_folder_confirmation": "Deze foto’s en video’s worden uit alle albums verwijderd en zijn alleen te bekijken in de vergrendelde map",
|
"move_to_locked_folder_confirmation": "Deze foto’s en video’s worden uit alle albums verwijderd en zijn alleen te bekijken in de vergrendelde map",
|
||||||
"move_up": "Naar boven verplaatsen",
|
"move_up": "Naar boven verplaatsen",
|
||||||
@@ -1854,9 +1851,9 @@
|
|||||||
"remove_custom_date_range": "Aangepast datumbereik verwijderen",
|
"remove_custom_date_range": "Aangepast datumbereik verwijderen",
|
||||||
"remove_deleted_assets": "Verwijder offline bestanden",
|
"remove_deleted_assets": "Verwijder offline bestanden",
|
||||||
"remove_from_album": "Verwijderen uit album",
|
"remove_from_album": "Verwijderen uit album",
|
||||||
"remove_from_album_action_prompt": "{count, plural, one {# item} other {# items}} verwijderd uit het album",
|
"remove_from_album_action_prompt": "{count} item(s) verwijderd uit het album",
|
||||||
"remove_from_favorites": "Verwijderen uit favorieten",
|
"remove_from_favorites": "Verwijderen uit favorieten",
|
||||||
"remove_from_lock_folder_action_prompt": "{count, plural, one {# item} other {# items}} verwijderd uit de vergrendelde map",
|
"remove_from_lock_folder_action_prompt": "{count} item(s) verwijderd uit de vergrendelde map",
|
||||||
"remove_from_locked_folder": "Verwijder uit de vergrendelde map",
|
"remove_from_locked_folder": "Verwijder uit de vergrendelde map",
|
||||||
"remove_from_locked_folder_confirmation": "Weet je zeker dat je deze foto's en video's uit de vergrendelde map wilt verplaatsen? Ze zijn dan weer zichtbaar in je bibliotheek.",
|
"remove_from_locked_folder_confirmation": "Weet je zeker dat je deze foto's en video's uit de vergrendelde map wilt verplaatsen? Ze zijn dan weer zichtbaar in je bibliotheek.",
|
||||||
"remove_from_shared_link": "Verwijderen uit gedeelde link",
|
"remove_from_shared_link": "Verwijderen uit gedeelde link",
|
||||||
@@ -1899,7 +1896,7 @@
|
|||||||
"resolved_all_duplicates": "Alle duplicaten opgelost",
|
"resolved_all_duplicates": "Alle duplicaten opgelost",
|
||||||
"restore": "Herstellen",
|
"restore": "Herstellen",
|
||||||
"restore_all": "Herstel alle",
|
"restore_all": "Herstel alle",
|
||||||
"restore_trash_action_prompt": "{count, plural, one {# item} other {# items}} teruggehaald uit de prullenbak",
|
"restore_trash_action_prompt": "{count} item(s) teruggehaald uit de prullenbak",
|
||||||
"restore_user": "Gebruiker herstellen",
|
"restore_user": "Gebruiker herstellen",
|
||||||
"restored_asset": "Item hersteld",
|
"restored_asset": "Item hersteld",
|
||||||
"resume": "Hervatten",
|
"resume": "Hervatten",
|
||||||
@@ -2067,9 +2064,9 @@
|
|||||||
"settings_saved": "Instellingen opgeslagen",
|
"settings_saved": "Instellingen opgeslagen",
|
||||||
"setup_pin_code": "Stel een pincode in",
|
"setup_pin_code": "Stel een pincode in",
|
||||||
"share": "Delen",
|
"share": "Delen",
|
||||||
"share_action_prompt": "{count, plural, one {# item} other {# items}} gedeeld",
|
"share_action_prompt": "{count} item(s) gedeeld",
|
||||||
"share_add_photos": "Foto's toevoegen",
|
"share_add_photos": "Foto's toevoegen",
|
||||||
"share_assets_selected": "{count, plural, one {# item} other {# items}} geselecteerd",
|
"share_assets_selected": "{count} item(s) geselecteerd",
|
||||||
"share_dialog_preparing": "Voorbereiden...",
|
"share_dialog_preparing": "Voorbereiden...",
|
||||||
"share_link": "Link delen",
|
"share_link": "Link delen",
|
||||||
"shared": "Gedeeld",
|
"shared": "Gedeeld",
|
||||||
@@ -2177,7 +2174,7 @@
|
|||||||
"sort_title": "Titel",
|
"sort_title": "Titel",
|
||||||
"source": "Bron",
|
"source": "Bron",
|
||||||
"stack": "Stapel",
|
"stack": "Stapel",
|
||||||
"stack_action_prompt": "{count} items gestapeld",
|
"stack_action_prompt": "{count} item(s) gestapeld",
|
||||||
"stack_duplicates": "Stapel duplicaten",
|
"stack_duplicates": "Stapel duplicaten",
|
||||||
"stack_select_one_photo": "Selecteer één primaire foto voor de stapel",
|
"stack_select_one_photo": "Selecteer één primaire foto voor de stapel",
|
||||||
"stack_selected_photos": "Geselecteerde foto's stapelen",
|
"stack_selected_photos": "Geselecteerde foto's stapelen",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Tag",
|
"tag": "Tag",
|
||||||
"tag_assets": "Items taggen",
|
"tag_assets": "Items taggen",
|
||||||
"tag_created": "Tag aangemaakt: {tag}",
|
"tag_created": "Tag aangemaakt: {tag}",
|
||||||
"tag_face": "Gezicht labelen",
|
|
||||||
"tag_feature_description": "Bladeren door foto's en video's gegroepeerd op tags",
|
"tag_feature_description": "Bladeren door foto's en video's gegroepeerd op tags",
|
||||||
"tag_not_found_question": "Kun je een tag niet vinden? <link>Maak een nieuwe tag.</link>",
|
"tag_not_found_question": "Kun je een tag niet vinden? <link>Maak een nieuwe tag.</link>",
|
||||||
"tag_people": "Mensen taggen",
|
"tag_people": "Mensen taggen",
|
||||||
@@ -2264,7 +2260,7 @@
|
|||||||
"total": "Totaal",
|
"total": "Totaal",
|
||||||
"total_usage": "Totaal gebruik",
|
"total_usage": "Totaal gebruik",
|
||||||
"trash": "Prullenbak",
|
"trash": "Prullenbak",
|
||||||
"trash_action_prompt": "{count, plural, one {# item} other {# items}} verplaatst naar de prullenbak",
|
"trash_action_prompt": "{count} item(s) verplaatst naar de prullenbak",
|
||||||
"trash_all": "Verplaats alle naar prullenbak",
|
"trash_all": "Verplaats alle naar prullenbak",
|
||||||
"trash_count": "{count, number} naar prullenbak",
|
"trash_count": "{count, number} naar prullenbak",
|
||||||
"trash_delete_asset": "Items naar prullenbak verplaatsen of verwijderen",
|
"trash_delete_asset": "Items naar prullenbak verplaatsen of verwijderen",
|
||||||
@@ -2314,7 +2310,7 @@
|
|||||||
"unselect_all_duplicates": "Deselecteer alle duplicaten",
|
"unselect_all_duplicates": "Deselecteer alle duplicaten",
|
||||||
"unselect_all_in": "Deselecteer alles in {group}",
|
"unselect_all_in": "Deselecteer alles in {group}",
|
||||||
"unstack": "Ontstapelen",
|
"unstack": "Ontstapelen",
|
||||||
"unstack_action_prompt": "{count} items ontstapeld",
|
"unstack_action_prompt": "{count} item(s) ontstapeld",
|
||||||
"unstacked_assets_count": "{count, plural, one {# item} other {# items}} ontstapeld",
|
"unstacked_assets_count": "{count, plural, one {# item} other {# items}} ontstapeld",
|
||||||
"unsupported_field_type": "Veldtype niet ondersteund",
|
"unsupported_field_type": "Veldtype niet ondersteund",
|
||||||
"unsupported_file_type": "Bestand {file} kan niet worden geüpload omdat het bestandstype {type} niet wordt ondersteund.",
|
"unsupported_file_type": "Bestand {file} kan niet worden geüpload omdat het bestandstype {type} niet wordt ondersteund.",
|
||||||
|
|||||||
@@ -37,10 +37,8 @@
|
|||||||
"add_to_album_bottom_sheet_some_local_assets": "Somme lokale eigedelar kunne ikkje leggjast til i album",
|
"add_to_album_bottom_sheet_some_local_assets": "Somme lokale eigedelar kunne ikkje leggjast til i album",
|
||||||
"add_to_albums": "Legg til i album",
|
"add_to_albums": "Legg til i album",
|
||||||
"add_to_albums_count": "Legg til i album ({count})",
|
"add_to_albums_count": "Legg til i album ({count})",
|
||||||
"add_to_bottom_bar": "Legg til i",
|
|
||||||
"add_to_shared_album": "Legg til i delt album",
|
"add_to_shared_album": "Legg til i delt album",
|
||||||
"add_url": "Legg til URL",
|
"add_url": "Legg til URL",
|
||||||
"add_workflow_step": "Legg til steg i arbeidsflyt",
|
|
||||||
"added_to_archive": "Lagt til i arkiv",
|
"added_to_archive": "Lagt til i arkiv",
|
||||||
"added_to_favorites": "Lagt til i favorittar",
|
"added_to_favorites": "Lagt til i favorittar",
|
||||||
"added_to_favorites_count": "La til {count, number} i favorittar",
|
"added_to_favorites_count": "La til {count, number} i favorittar",
|
||||||
@@ -73,7 +71,6 @@
|
|||||||
"confirm_reprocess_all_faces": "Er du sikker på at du vil behandle alle ansikt på nytt? Det vil òg fjerne namngjevne personar.",
|
"confirm_reprocess_all_faces": "Er du sikker på at du vil behandle alle ansikt på nytt? Det vil òg fjerne namngjevne personar.",
|
||||||
"confirm_user_password_reset": "Er du sikker at du vil tilbakestille passordet til {user}?",
|
"confirm_user_password_reset": "Er du sikker at du vil tilbakestille passordet til {user}?",
|
||||||
"confirm_user_pin_code_reset": "Er du sikker på at du vil tilbakestille {user} sin PIN-kode?",
|
"confirm_user_pin_code_reset": "Er du sikker på at du vil tilbakestille {user} sin PIN-kode?",
|
||||||
"copy_config_to_clipboard_description": "Kopier systemkonfigurasjonen som eit JSON-objekt til utklippstavla",
|
|
||||||
"create_job": "Lag jobb",
|
"create_job": "Lag jobb",
|
||||||
"cron_expression": "Cron uttrykk",
|
"cron_expression": "Cron uttrykk",
|
||||||
"cron_expression_description": "Set inn skanningsintervall med cron-formatet. For meir informasjon sjå t.d. <link>Crontab Guru</link>",
|
"cron_expression_description": "Set inn skanningsintervall med cron-formatet. For meir informasjon sjå t.d. <link>Crontab Guru</link>",
|
||||||
@@ -81,7 +78,6 @@
|
|||||||
"disable_login": "Deaktiver innlogging",
|
"disable_login": "Deaktiver innlogging",
|
||||||
"duplicate_detection_job_description": "Kjør maskinlæring på filer for å oppdage liknande bilete. Krev bruk av Smart Search",
|
"duplicate_detection_job_description": "Kjør maskinlæring på filer for å oppdage liknande bilete. Krev bruk av Smart Search",
|
||||||
"exclusion_pattern_description": "Utelatingsmønster let deg utelate filer og mapper når du skannar biblioteket ditt. Det er nyttig om du har mapper som inneheld filer du ikkje ynskjer å importere, til dømes RAW-filer.",
|
"exclusion_pattern_description": "Utelatingsmønster let deg utelate filer og mapper når du skannar biblioteket ditt. Det er nyttig om du har mapper som inneheld filer du ikkje ynskjer å importere, til dømes RAW-filer.",
|
||||||
"export_config_as_json_description": "Last ned nåverande systemkonfigurasjon som ei JSON-fil",
|
|
||||||
"face_detection": "Ansiktssøk",
|
"face_detection": "Ansiktssøk",
|
||||||
"face_detection_description": "Finn ansikt i bilete ved hjelp av maskinlæring. For videoar vert berre miniatyrbilete bruka. \"Alle\" søkjer (opp att) gjennom alle bilete. \"Tilbakestill\" fjernar all gjeldande ansiktsdata. \"Manglande\" legg filer som ikkje vert behandla til i køa for ansiktssøk. Oppdaga ansikt vert lagt i køa for ansiktsattkjenning, og kopla til eksisterande eller nye personar.",
|
"face_detection_description": "Finn ansikt i bilete ved hjelp av maskinlæring. For videoar vert berre miniatyrbilete bruka. \"Alle\" søkjer (opp att) gjennom alle bilete. \"Tilbakestill\" fjernar all gjeldande ansiktsdata. \"Manglande\" legg filer som ikkje vert behandla til i køa for ansiktssøk. Oppdaga ansikt vert lagt i køa for ansiktsattkjenning, og kopla til eksisterande eller nye personar.",
|
||||||
"facial_recognition_job_description": "Koplar attkjende ansikt til personar. Det skjer fyrst når anskiktssøkjet er ferdig. \"Tilbakestill\" fjernar alle koplingar til personar, og tilbakestiller ansiktsgrupper. \"Manglande\" legg ansikt som ikkje er oppkopla til i køa.",
|
"facial_recognition_job_description": "Koplar attkjende ansikt til personar. Det skjer fyrst når anskiktssøkjet er ferdig. \"Tilbakestill\" fjernar alle koplingar til personar, og tilbakestiller ansiktsgrupper. \"Manglande\" legg ansikt som ikkje er oppkopla til i køa.",
|
||||||
@@ -109,7 +105,6 @@
|
|||||||
"image_thumbnail_description": "Lite miniatyrbilete med fjerna metadata, brukt når ein ser på grupper av bilete som hovudtidslinja",
|
"image_thumbnail_description": "Lite miniatyrbilete med fjerna metadata, brukt når ein ser på grupper av bilete som hovudtidslinja",
|
||||||
"image_thumbnail_quality_description": "Kvalitet på miniatyrbilete frå 1-100. Høgare er betre, men gjev større filstorleik, og kan senkje appresposen.",
|
"image_thumbnail_quality_description": "Kvalitet på miniatyrbilete frå 1-100. Høgare er betre, men gjev større filstorleik, og kan senkje appresposen.",
|
||||||
"image_thumbnail_title": "Innstillingar for miniatyrbilete",
|
"image_thumbnail_title": "Innstillingar for miniatyrbilete",
|
||||||
"import_config_from_json_description": "Importer systemkonfigurasjon ved å laste opp ei JSON konfigurasjonsfil",
|
|
||||||
"job_concurrency": "{job} samstundes utføring",
|
"job_concurrency": "{job} samstundes utføring",
|
||||||
"job_created": "Jobb laga",
|
"job_created": "Jobb laga",
|
||||||
"job_not_concurrency_safe": "Kan ikke trygt utføre jobben samstundes.",
|
"job_not_concurrency_safe": "Kan ikke trygt utføre jobben samstundes.",
|
||||||
@@ -117,30 +112,22 @@
|
|||||||
"job_settings_description": "Handsam samstundes utføring av jobber",
|
"job_settings_description": "Handsam samstundes utføring av jobber",
|
||||||
"jobs_delayed": "{jobCount, plural, other {# forsinka}}",
|
"jobs_delayed": "{jobCount, plural, other {# forsinka}}",
|
||||||
"jobs_failed": "{jobCount, plural, other {# mislykkast}}",
|
"jobs_failed": "{jobCount, plural, other {# mislykkast}}",
|
||||||
"jobs_over_time": "Jobbar over tid",
|
|
||||||
"library_created": "Opprett bibliotek: {library}",
|
"library_created": "Opprett bibliotek: {library}",
|
||||||
"library_deleted": "Bibliotek sletta",
|
"library_deleted": "Bibliotek sletta",
|
||||||
"library_details": "Bibliotekdetaljar",
|
|
||||||
"library_folder_description": "Vel ei mappe å importere. Denne mappa, inkludert undermappar, vil bli skanna for biletar og videoar.",
|
|
||||||
"library_remove_exclusion_pattern_prompt": "Er du sikker på at du vil fjerne dette unntaksmønsteret?",
|
|
||||||
"library_scanning": "Regelbunden skanning",
|
"library_scanning": "Regelbunden skanning",
|
||||||
"library_scanning_description": "Sett opp regelbunden skanning av biblioteket",
|
"library_scanning_description": "Sett opp regelbunden skanning av biblioteket",
|
||||||
"library_scanning_enable_description": "Aktiver regelbunden skanning av biblioteket",
|
"library_scanning_enable_description": "Aktiver regelbunden skanning av biblioteket",
|
||||||
"library_settings": "Eksternt Bibliotek",
|
"library_settings": "Eksternt Bibliotek",
|
||||||
"library_settings_description": "Handsam eksterne biblioteksinnstillingar",
|
"library_settings_description": "Handsam eksterne biblioteksinnstillingar",
|
||||||
"library_tasks_description": "Utfør bibliotekstoppgåver",
|
"library_tasks_description": "Utfør bibliotekstoppgåver",
|
||||||
"library_updated": "Oppdatert bibliotek",
|
|
||||||
"library_watching_enable_description": "Sjekk eksterne bibliotek for forandringar",
|
"library_watching_enable_description": "Sjekk eksterne bibliotek for forandringar",
|
||||||
"library_watching_settings": "Biblioteksovervåking (EKSPERIMENTELL)",
|
"library_watching_settings": "Biblioteksovervåking (EKSPERIMENTELL)",
|
||||||
"library_watching_settings_description": "Sjekk automatisk for forandringar",
|
"library_watching_settings_description": "Sjekk automatisk for forandringar",
|
||||||
"logging_enable_description": "Aktiver loggføring",
|
"logging_enable_description": "Aktiver loggføring",
|
||||||
"logging_level_description": "Når aktivert, kva loggnivå å bruke.",
|
"logging_level_description": "Når aktivert, kva loggnivå å bruke.",
|
||||||
"logging_settings": "Logging",
|
"logging_settings": "Logging",
|
||||||
"machine_learning_availability_checks": "Tilgjengelegheitssjekkar",
|
|
||||||
"machine_learning_availability_checks_description": "Automatiser oppdaging og prioritet av tilgjengelege maskinlærings-serverar",
|
"machine_learning_availability_checks_description": "Automatiser oppdaging og prioritet av tilgjengelege maskinlærings-serverar",
|
||||||
"machine_learning_availability_checks_enabled": "Slå på tilgjengelegheitssjekkar",
|
|
||||||
"machine_learning_availability_checks_interval": "Sjekk intervall",
|
"machine_learning_availability_checks_interval": "Sjekk intervall",
|
||||||
"machine_learning_availability_checks_timeout": "Tidsavbrot på forespørsel",
|
|
||||||
"machine_learning_availability_checks_timeout_description": "Utløpstid i millisekund for tilgjengelegheitssjekk",
|
"machine_learning_availability_checks_timeout_description": "Utløpstid i millisekund for tilgjengelegheitssjekk",
|
||||||
"machine_learning_clip_model": "CLIP modell",
|
"machine_learning_clip_model": "CLIP modell",
|
||||||
"machine_learning_clip_model_description": "Namnet på ein CLIP modell finst <link>her</link>. Merk at du må køyre 'Smart Søk'-jobben på nytt for alle bilete etter du har forandra modell.",
|
"machine_learning_clip_model_description": "Namnet på ein CLIP modell finst <link>her</link>. Merk at du må køyre 'Smart Søk'-jobben på nytt for alle bilete etter du har forandra modell.",
|
||||||
@@ -164,11 +151,6 @@
|
|||||||
"machine_learning_min_detection_score_description": "Minimum tillitspoeng for at eit ansikt skal bli oppdaga, på ein skala frå 0 til 1. Lågare verdiar vil oppdage fleire ansikt, men kan føre til feilaktige treff.",
|
"machine_learning_min_detection_score_description": "Minimum tillitspoeng for at eit ansikt skal bli oppdaga, på ein skala frå 0 til 1. Lågare verdiar vil oppdage fleire ansikt, men kan føre til feilaktige treff.",
|
||||||
"machine_learning_min_recognized_faces": "Minimum gjenkjende ansikt",
|
"machine_learning_min_recognized_faces": "Minimum gjenkjende ansikt",
|
||||||
"machine_learning_min_recognized_faces_description": "Minste tal på gjenkjende fjes for å opprette ein person. Aukar ein dette, vert ansiktsgjenkjenninga meir presis, på bekostning av auka sjanse for at ansikt ikkje vert tileigna ein person.",
|
"machine_learning_min_recognized_faces_description": "Minste tal på gjenkjende fjes for å opprette ein person. Aukar ein dette, vert ansiktsgjenkjenninga meir presis, på bekostning av auka sjanse for at ansikt ikkje vert tileigna ein person.",
|
||||||
"machine_learning_ocr": "OCR",
|
|
||||||
"machine_learning_ocr_description": "Bruk maskinlæring for å gjenkjenne tekst i bilete",
|
|
||||||
"machine_learning_ocr_enabled": "Slå på OCR",
|
|
||||||
"machine_learning_ocr_max_resolution": "Maksimal oppløysing",
|
|
||||||
"machine_learning_ocr_model": "OCR-modell",
|
|
||||||
"machine_learning_settings": "Innstillingar for maskinlæring",
|
"machine_learning_settings": "Innstillingar for maskinlæring",
|
||||||
"machine_learning_settings_description": "Administrer maskinlæringsfunksjonar og innstillingar",
|
"machine_learning_settings_description": "Administrer maskinlæringsfunksjonar og innstillingar",
|
||||||
"machine_learning_smart_search": "Smart Søk",
|
"machine_learning_smart_search": "Smart Søk",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "immich-i18n",
|
"name": "immich-i18n",
|
||||||
"version": "2.7.5",
|
"version": "2.6.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"format": "prettier --cache --check .",
|
"format": "prettier --cache --check .",
|
||||||
|
|||||||
+4
-4
@@ -1009,8 +1009,8 @@
|
|||||||
"editor_edits_applied_success": "Zmiany zostały pomyślnie zastosowane",
|
"editor_edits_applied_success": "Zmiany zostały pomyślnie zastosowane",
|
||||||
"editor_flip_horizontal": "Odwróć poziomo",
|
"editor_flip_horizontal": "Odwróć poziomo",
|
||||||
"editor_flip_vertical": "Odwróć pionowo",
|
"editor_flip_vertical": "Odwróć pionowo",
|
||||||
"editor_handle_corner": "{corner, select, top_left {Górny lewy} top_right {Górny prawy} bottom_left {Dolny lewy} bottom_right {Dolny prawy} other {Jakiś}} uchwyt narożny",
|
"editor_handle_corner": "{corner, select, top_left {Top-left} top_right {Top-right} bottom_left {Bottom-left} bottom_right {Bottom-right} other {A}} uchwyt narożny",
|
||||||
"editor_handle_edge": "{edge, select, top {Górny} bottom {Dolny} left {Lewy} right {Prawy} other {Jakiś}} uchwyt krawędziowy",
|
"editor_handle_edge": "{edge, select, top {Top} bottom {Bottom} left {Left} right {Right} other {An}} uchwyt krawędziowy",
|
||||||
"editor_orientation": "Orientacja",
|
"editor_orientation": "Orientacja",
|
||||||
"editor_reset_all_changes": "Zresetuj zmiany",
|
"editor_reset_all_changes": "Zresetuj zmiany",
|
||||||
"editor_rotate_left": "Obróć o 90° przeciwnie do ruchu wskazówek zegara",
|
"editor_rotate_left": "Obróć o 90° przeciwnie do ruchu wskazówek zegara",
|
||||||
@@ -2224,12 +2224,12 @@
|
|||||||
"tag_updated": "Uaktualniono etykietę: {tag}",
|
"tag_updated": "Uaktualniono etykietę: {tag}",
|
||||||
"tagged_assets": "Przypisano etykietę {count, plural, one {# zasobowi} other {# zasobom}}",
|
"tagged_assets": "Przypisano etykietę {count, plural, one {# zasobowi} other {# zasobom}}",
|
||||||
"tags": "Etykiety",
|
"tags": "Etykiety",
|
||||||
"tap_to_run_job": "Naciśnij, żeby uruchomić zadanie",
|
"tap_to_run_job": "Uruchom zadanie",
|
||||||
"template": "Szablon",
|
"template": "Szablon",
|
||||||
"text_recognition": "Rozpoznawanie tekstu",
|
"text_recognition": "Rozpoznawanie tekstu",
|
||||||
"theme": "Motyw",
|
"theme": "Motyw",
|
||||||
"theme_selection": "Wybór motywu",
|
"theme_selection": "Wybór motywu",
|
||||||
"theme_selection_description": "Automatycznie zmień motyw na jasny lub ciemny zależnie od ustawień systemu",
|
"theme_selection_description": "Automatycznie zmień motyw na jasny lub ciemny zależnie od ustawień przeglądarki",
|
||||||
"theme_setting_asset_list_storage_indicator_title": "Pokaż wskaźnik przechowywania na kafelkach zasobów",
|
"theme_setting_asset_list_storage_indicator_title": "Pokaż wskaźnik przechowywania na kafelkach zasobów",
|
||||||
"theme_setting_asset_list_tiles_per_row_title": "Liczba zasobów w wierszu ({count})",
|
"theme_setting_asset_list_tiles_per_row_title": "Liczba zasobów w wierszu ({count})",
|
||||||
"theme_setting_colorful_interface_subtitle": "Zastosuj kolor podstawowy do powierzchni tła.",
|
"theme_setting_colorful_interface_subtitle": "Zastosuj kolor podstawowy do powierzchni tła.",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Criar link para partilhar",
|
"create_link_to_share": "Criar link para partilhar",
|
||||||
"create_link_to_share_description": "Permitir a visualização desta(s) imagem(s) a qualquer pessoa com o link",
|
"create_link_to_share_description": "Permitir a visualização desta(s) imagem(s) a qualquer pessoa com o link",
|
||||||
"create_new": "CRIAR NOVO",
|
"create_new": "CRIAR NOVO",
|
||||||
"create_new_face": "Criar novo rosto",
|
|
||||||
"create_new_person": "Criar nova pessoa",
|
"create_new_person": "Criar nova pessoa",
|
||||||
"create_new_person_hint": "Associe os ficheiros a uma nova pessoa",
|
"create_new_person_hint": "Associe os ficheiros a uma nova pessoa",
|
||||||
"create_new_user": "Criar novo utilizador",
|
"create_new_user": "Criar novo utilizador",
|
||||||
"create_person": "Criar pessoa",
|
|
||||||
"create_person_subtitle": "Adicione um nome ao rosto selecionado para criar e etiquetar a nova pessoa",
|
|
||||||
"create_shared_album_page_share_add_assets": "ADICIONAR FICHEIROS",
|
"create_shared_album_page_share_add_assets": "ADICIONAR FICHEIROS",
|
||||||
"create_shared_album_page_share_select_photos": "Selecionar Fotos",
|
"create_shared_album_page_share_select_photos": "Selecionar Fotos",
|
||||||
"create_shared_link": "Criar link partilhado",
|
"create_shared_link": "Criar link partilhado",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Etiqueta",
|
"tag": "Etiqueta",
|
||||||
"tag_assets": "Etiquetar ficheiros",
|
"tag_assets": "Etiquetar ficheiros",
|
||||||
"tag_created": "Criada a etiqueta {tag}",
|
"tag_created": "Criada a etiqueta {tag}",
|
||||||
"tag_face": "Etiquetar rosto",
|
|
||||||
"tag_feature_description": "A mostrar fotos e videos agrupados por tópicos lógicos de etiquetas",
|
"tag_feature_description": "A mostrar fotos e videos agrupados por tópicos lógicos de etiquetas",
|
||||||
"tag_not_found_question": "Não consegue encontrar a etiqueta? <link>Crie uma nova etiqueta.</link>",
|
"tag_not_found_question": "Não consegue encontrar a etiqueta? <link>Crie uma nova etiqueta.</link>",
|
||||||
"tag_people": "Etiquetar Pessoas",
|
"tag_people": "Etiquetar Pessoas",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Создать ссылку общего доступа",
|
"create_link_to_share": "Создать ссылку общего доступа",
|
||||||
"create_link_to_share_description": "Разрешить всем, у кого есть ссылка, просматривать выбранные фотографии",
|
"create_link_to_share_description": "Разрешить всем, у кого есть ссылка, просматривать выбранные фотографии",
|
||||||
"create_new": "СОЗДАТЬ НОВЫЙ",
|
"create_new": "СОЗДАТЬ НОВЫЙ",
|
||||||
"create_new_face": "Создать новое лицо",
|
|
||||||
"create_new_person": "Добавить нового человека",
|
"create_new_person": "Добавить нового человека",
|
||||||
"create_new_person_hint": "Назначить выбранные объекты на нового человека",
|
"create_new_person_hint": "Назначить выбранные объекты на нового человека",
|
||||||
"create_new_user": "Создать нового пользователя",
|
"create_new_user": "Создать нового пользователя",
|
||||||
"create_person": "Создать человека",
|
|
||||||
"create_person_subtitle": "Укажите имя для создания нового человека",
|
|
||||||
"create_shared_album_page_share_add_assets": "ДОБАВИТЬ ОБЪЕКТЫ",
|
"create_shared_album_page_share_add_assets": "ДОБАВИТЬ ОБЪЕКТЫ",
|
||||||
"create_shared_album_page_share_select_photos": "Выбрать фотографии",
|
"create_shared_album_page_share_select_photos": "Выбрать фотографии",
|
||||||
"create_shared_link": "Создать общую ссылку",
|
"create_shared_link": "Создать общую ссылку",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Тег",
|
"tag": "Тег",
|
||||||
"tag_assets": "Добавить теги",
|
"tag_assets": "Добавить теги",
|
||||||
"tag_created": "Тег {tag} создан",
|
"tag_created": "Тег {tag} создан",
|
||||||
"tag_face": "Отметить человека",
|
|
||||||
"tag_feature_description": "Просмотр фотографий и видео, сгруппированных по тегам",
|
"tag_feature_description": "Просмотр фотографий и видео, сгруппированных по тегам",
|
||||||
"tag_not_found_question": "Не удается найти тег? <link>Создайте новый тег.</link>",
|
"tag_not_found_question": "Не удается найти тег? <link>Создайте новый тег.</link>",
|
||||||
"tag_people": "Отметить человека",
|
"tag_people": "Отметить человека",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Ustvari povezavo za skupno rabo",
|
"create_link_to_share": "Ustvari povezavo za skupno rabo",
|
||||||
"create_link_to_share_description": "Omogoči vsem s povezavo ogled izbranih fotografij",
|
"create_link_to_share_description": "Omogoči vsem s povezavo ogled izbranih fotografij",
|
||||||
"create_new": "USTVARI NOVEGA",
|
"create_new": "USTVARI NOVEGA",
|
||||||
"create_new_face": "Ustvari nov obraz",
|
|
||||||
"create_new_person": "Ustvari novo osebo",
|
"create_new_person": "Ustvari novo osebo",
|
||||||
"create_new_person_hint": "Dodeli izbrana sredstva novi osebi",
|
"create_new_person_hint": "Dodeli izbrana sredstva novi osebi",
|
||||||
"create_new_user": "Ustvari novega uporabnika",
|
"create_new_user": "Ustvari novega uporabnika",
|
||||||
"create_person": "Ustvari osebo",
|
|
||||||
"create_person_subtitle": "Dodajte ime izbranemu obrazu, da ustvarite in označite novo osebo",
|
|
||||||
"create_shared_album_page_share_add_assets": "DODAJ SREDSTVA",
|
"create_shared_album_page_share_add_assets": "DODAJ SREDSTVA",
|
||||||
"create_shared_album_page_share_select_photos": "Izberi fotografije",
|
"create_shared_album_page_share_select_photos": "Izberi fotografije",
|
||||||
"create_shared_link": "Ustvari deljeno povezavo",
|
"create_shared_link": "Ustvari deljeno povezavo",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Oznaka",
|
"tag": "Oznaka",
|
||||||
"tag_assets": "Označi sredstva",
|
"tag_assets": "Označi sredstva",
|
||||||
"tag_created": "Ustvarjena oznaka: {tag}",
|
"tag_created": "Ustvarjena oznaka: {tag}",
|
||||||
"tag_face": "Označi obraz",
|
|
||||||
"tag_feature_description": "Brskanje po fotografijah in videoposnetkih, razvrščenih po temah logičnih oznak",
|
"tag_feature_description": "Brskanje po fotografijah in videoposnetkih, razvrščenih po temah logičnih oznak",
|
||||||
"tag_not_found_question": "Ne najdete oznake? <link>Ustvarite novo oznako.</link>",
|
"tag_not_found_question": "Ne najdete oznake? <link>Ustvarite novo oznako.</link>",
|
||||||
"tag_people": "Označi osebe",
|
"tag_people": "Označi osebe",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Skapa länk att dela",
|
"create_link_to_share": "Skapa länk att dela",
|
||||||
"create_link_to_share_description": "Låt alla med länken se de valda fotona",
|
"create_link_to_share_description": "Låt alla med länken se de valda fotona",
|
||||||
"create_new": "SKAPA NY",
|
"create_new": "SKAPA NY",
|
||||||
"create_new_face": "Skapa nytt ansikte",
|
|
||||||
"create_new_person": "Skapa ny person",
|
"create_new_person": "Skapa ny person",
|
||||||
"create_new_person_hint": "Tilldela valda objekt till en ny person",
|
"create_new_person_hint": "Tilldela valda objekt till en ny person",
|
||||||
"create_new_user": "Skapa en ny användare",
|
"create_new_user": "Skapa en ny användare",
|
||||||
"create_person": "Skapa person",
|
|
||||||
"create_person_subtitle": "Lägg till ett namn till det valda ansiktet för att skapa och tagga den nya personen",
|
|
||||||
"create_shared_album_page_share_add_assets": "LÄGG TILL OBJEKT",
|
"create_shared_album_page_share_add_assets": "LÄGG TILL OBJEKT",
|
||||||
"create_shared_album_page_share_select_photos": "Välj bilder",
|
"create_shared_album_page_share_select_photos": "Välj bilder",
|
||||||
"create_shared_link": "Skapa delad länk",
|
"create_shared_link": "Skapa delad länk",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Tagg",
|
"tag": "Tagg",
|
||||||
"tag_assets": "Tagga objekt",
|
"tag_assets": "Tagga objekt",
|
||||||
"tag_created": "Skapade tagg: {tag}",
|
"tag_created": "Skapade tagg: {tag}",
|
||||||
"tag_face": "Tagga ansikte",
|
|
||||||
"tag_feature_description": "Bläddra bland foton och videor grupperade efter logiska taggar",
|
"tag_feature_description": "Bläddra bland foton och videor grupperade efter logiska taggar",
|
||||||
"tag_not_found_question": "Kan du inte hitta en tagg? <link>Skapa en ny tagg.</link>",
|
"tag_not_found_question": "Kan du inte hitta en tagg? <link>Skapa en ny tagg.</link>",
|
||||||
"tag_people": "Tagga Personer",
|
"tag_people": "Tagga Personer",
|
||||||
|
|||||||
+16
-31
@@ -5,7 +5,6 @@
|
|||||||
"acknowledge": "รับทราบ",
|
"acknowledge": "รับทราบ",
|
||||||
"action": "ดำเนินการ",
|
"action": "ดำเนินการ",
|
||||||
"action_common_update": "อัปเดต",
|
"action_common_update": "อัปเดต",
|
||||||
"action_description": "ชุดการดำเนินการที่จะปฏิบัติกับรายการที่ผ่านการกรอง",
|
|
||||||
"actions": "การดำเนินการ",
|
"actions": "การดำเนินการ",
|
||||||
"active": "กำลังทำงาน",
|
"active": "กำลังทำงาน",
|
||||||
"active_count": "กำลังทำงาน: {count}",
|
"active_count": "กำลังทำงาน: {count}",
|
||||||
@@ -17,13 +16,11 @@
|
|||||||
"add_a_name": "เพิ่มชื่อ",
|
"add_a_name": "เพิ่มชื่อ",
|
||||||
"add_a_title": "เพิ่มหัวข้อ",
|
"add_a_title": "เพิ่มหัวข้อ",
|
||||||
"add_action": "เพิ่มการดำเนินการ",
|
"add_action": "เพิ่มการดำเนินการ",
|
||||||
"add_action_description": "คลิกเพื่อเพิ่มการดำเนินการ",
|
|
||||||
"add_assets": "เพิ่มสื่อ",
|
"add_assets": "เพิ่มสื่อ",
|
||||||
"add_birthday": "เพิ่มวันเกิด",
|
"add_birthday": "เพิ่มวันเกิด",
|
||||||
"add_endpoint": "เพิ่มปลายทาง",
|
"add_endpoint": "เพิ่มปลายทาง",
|
||||||
"add_exclusion_pattern": "เพิ่มข้อยกเว้น",
|
"add_exclusion_pattern": "เพิ่มข้อยกเว้น",
|
||||||
"add_filter": "เพิ่มตัวกรอง",
|
"add_filter": "เพิ่มตัวกรอง",
|
||||||
"add_filter_description": "คลิกเพื่อเพิ่มการกรอง",
|
|
||||||
"add_location": "เพิ่มตำแหน่ง",
|
"add_location": "เพิ่มตำแหน่ง",
|
||||||
"add_more_users": "เพิ่มผู้ใช้งาน",
|
"add_more_users": "เพิ่มผู้ใช้งาน",
|
||||||
"add_partner": "เพิ่มคู่หู",
|
"add_partner": "เพิ่มคู่หู",
|
||||||
@@ -35,14 +32,12 @@
|
|||||||
"add_to_album_bottom_sheet_added": "เพิ่มไปยัง {album} แล้ว",
|
"add_to_album_bottom_sheet_added": "เพิ่มไปยัง {album} แล้ว",
|
||||||
"add_to_album_bottom_sheet_already_exists": "อยู่ใน {album} อยู่แล้ว",
|
"add_to_album_bottom_sheet_already_exists": "อยู่ใน {album} อยู่แล้ว",
|
||||||
"add_to_album_bottom_sheet_some_local_assets": "ไฟล์บางส่วนไม่สามารถเพิ่มไปยังอัลบั้มได้",
|
"add_to_album_bottom_sheet_some_local_assets": "ไฟล์บางส่วนไม่สามารถเพิ่มไปยังอัลบั้มได้",
|
||||||
"add_to_album_toggle": "สลับการเลือกสำหรับ {album}",
|
|
||||||
"add_to_albums": "เพิ่มเข้าในอัลบั้ม",
|
"add_to_albums": "เพิ่มเข้าในอัลบั้ม",
|
||||||
"add_to_albums_count": "เพิ่มไปยังอัลบั้ม ({count})",
|
"add_to_albums_count": "เพิ่มไปยังอัลบั้ม ({count})",
|
||||||
"add_to_bottom_bar": "เพิ่มไปยัง",
|
"add_to_bottom_bar": "เพิ่มไปยัง",
|
||||||
"add_to_shared_album": "เพิ่มไปยังอัลบั้มที่แชร์",
|
"add_to_shared_album": "เพิ่มไปยังอัลบั้มที่แชร์",
|
||||||
"add_upload_to_stack": "เพิ่มที่อัปโหลดเข้า stack",
|
"add_upload_to_stack": "เพิ่มที่อัปโหลดเข้า stack",
|
||||||
"add_url": "เพิ่ม URL",
|
"add_url": "เพิ่ม URL",
|
||||||
"add_workflow_step": "เพิ่มขั้นตอนการทำงาน",
|
|
||||||
"added_to_archive": "เพิ่มไปยังที่จัดเก็บถาวร",
|
"added_to_archive": "เพิ่มไปยังที่จัดเก็บถาวร",
|
||||||
"added_to_favorites": "เพิ่มเข้ารายการโปรดแล้ว",
|
"added_to_favorites": "เพิ่มเข้ารายการโปรดแล้ว",
|
||||||
"added_to_favorites_count": "เพิ่ม {count, number} รูปเข้ารายการโปรดแล้ว",
|
"added_to_favorites_count": "เพิ่ม {count, number} รูปเข้ารายการโปรดแล้ว",
|
||||||
@@ -75,7 +70,6 @@
|
|||||||
"confirm_reprocess_all_faces": "คุณแน่ใจว่าคุณต้องการประมวลผลใบหน้าทั้งหมดใหม่? ชื่อคนจะถูกลบไปด้วย",
|
"confirm_reprocess_all_faces": "คุณแน่ใจว่าคุณต้องการประมวลผลใบหน้าทั้งหมดใหม่? ชื่อคนจะถูกลบไปด้วย",
|
||||||
"confirm_user_password_reset": "คุณแน่ใจว่าต้องการรีเซ็ตรหัสผ่านของ {user} หรือไม่?",
|
"confirm_user_password_reset": "คุณแน่ใจว่าต้องการรีเซ็ตรหัสผ่านของ {user} หรือไม่?",
|
||||||
"confirm_user_pin_code_reset": "คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตรหัส PIN ของ {user}",
|
"confirm_user_pin_code_reset": "คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตรหัส PIN ของ {user}",
|
||||||
"copy_config_to_clipboard_description": "คัดลอกการตั้งค่าระบบปัจจุบันในรูปแบบ JSON ไปยังคลิปบอร์ด",
|
|
||||||
"create_job": "สร้างงาน",
|
"create_job": "สร้างงาน",
|
||||||
"cron_expression": "รูปแบบ cron",
|
"cron_expression": "รูปแบบ cron",
|
||||||
"cron_expression_description": "ตั้งช่วงเวลาในการสแกนโดยใช้รูปแบบ cron สำหรับข้อมูลเพิ่มเติมกรุณาอิง <link>Crontab Guru</link>",
|
"cron_expression_description": "ตั้งช่วงเวลาในการสแกนโดยใช้รูปแบบ cron สำหรับข้อมูลเพิ่มเติมกรุณาอิง <link>Crontab Guru</link>",
|
||||||
@@ -83,7 +77,6 @@
|
|||||||
"disable_login": "ปิดการล็อกอิน",
|
"disable_login": "ปิดการล็อกอิน",
|
||||||
"duplicate_detection_job_description": "ใช้ machine learning กับสี่อเพื่อตรวจจับรูปภาพที่คล้ายกัน โดยใช้การค้นหาอัจฉริยะ",
|
"duplicate_detection_job_description": "ใช้ machine learning กับสี่อเพื่อตรวจจับรูปภาพที่คล้ายกัน โดยใช้การค้นหาอัจฉริยะ",
|
||||||
"exclusion_pattern_description": "ข้อยกเว้นสามารถละเว้นไฟล์และโฟลเดอร์ขณะสแกนคลังภาพของคุณ มีประโยชน์เมื่อโฟลเดอร์มีไฟล์ที่ไม่อยากนำเข้า เช่นไฟล์ RAW",
|
"exclusion_pattern_description": "ข้อยกเว้นสามารถละเว้นไฟล์และโฟลเดอร์ขณะสแกนคลังภาพของคุณ มีประโยชน์เมื่อโฟลเดอร์มีไฟล์ที่ไม่อยากนำเข้า เช่นไฟล์ RAW",
|
||||||
"export_config_as_json_description": "ดาวน์โหลดการตั้งค่าระบบปัจจุบันไปยังไฟล์ในรูปแบบ JSON",
|
|
||||||
"external_libraries_page_description": "หน้าต่างคลังแอดมินภายนอก",
|
"external_libraries_page_description": "หน้าต่างคลังแอดมินภายนอก",
|
||||||
"face_detection": "การตรวจจับใบหน้า",
|
"face_detection": "การตรวจจับใบหน้า",
|
||||||
"face_detection_description": "ตรวจจับใบหน้าในสี่อโดยใช้ machine learning วิดีโอจะใช้ภาพตัวอย่างจากวิดีโอเท่านั้น \"ทั้งหมด\" จะประมวลผลสี่อทั้งหมด \"ขาดหาย\" จะประมวลผลสี่อที่ยังไม่ได้ประมวลผล ใบหน้าที่ถูกตรวจจับแล้วจะถูกเข้าคิวประมวลผลการจดจำใบหน้า เพิ่มเข้าไปในกลุ่มที่มีอยู่แล้วหรือคนใหม่",
|
"face_detection_description": "ตรวจจับใบหน้าในสี่อโดยใช้ machine learning วิดีโอจะใช้ภาพตัวอย่างจากวิดีโอเท่านั้น \"ทั้งหมด\" จะประมวลผลสี่อทั้งหมด \"ขาดหาย\" จะประมวลผลสี่อที่ยังไม่ได้ประมวลผล ใบหน้าที่ถูกตรวจจับแล้วจะถูกเข้าคิวประมวลผลการจดจำใบหน้า เพิ่มเข้าไปในกลุ่มที่มีอยู่แล้วหรือคนใหม่",
|
||||||
@@ -104,8 +97,6 @@
|
|||||||
"image_preview_description": "ภาพขนาดปานกลางที่ถูกลบข้อมูลเมตา ใช้สำหรับการดูแอสเซ็ตเดี่ยวและสำหรับการเรียนรู้ของเครื่อง (Machine Learning)",
|
"image_preview_description": "ภาพขนาดปานกลางที่ถูกลบข้อมูลเมตา ใช้สำหรับการดูแอสเซ็ตเดี่ยวและสำหรับการเรียนรู้ของเครื่อง (Machine Learning)",
|
||||||
"image_preview_quality_description": "คุณภาพการแสดงตัวอย่างตั้งแต่ 1-100 ยิ่งสูงยิ่งดี แต่จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและอาจทำให้แอปตอบสนองช้าลง การตั้งค่าต่ำอาจส่งผลต่อคุณภาพ Machine Learning",
|
"image_preview_quality_description": "คุณภาพการแสดงตัวอย่างตั้งแต่ 1-100 ยิ่งสูงยิ่งดี แต่จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและอาจทำให้แอปตอบสนองช้าลง การตั้งค่าต่ำอาจส่งผลต่อคุณภาพ Machine Learning",
|
||||||
"image_preview_title": "ตั้งค่าพรีวิว",
|
"image_preview_title": "ตั้งค่าพรีวิว",
|
||||||
"image_progressive": "รูปภาพแบบโปรเกรสซีฟ",
|
|
||||||
"image_progressive_description": "เข้ารหัสรูปภาพ JPEG แบบโปรเกรสซีฟเพื่อให้แสดงผลแบบค่อยๆ ชัดขึ้นขณะโหลด ทั้งนี้จะไม่มีผลกับรูปภาพ WebP",
|
|
||||||
"image_quality": "คุณภาพ",
|
"image_quality": "คุณภาพ",
|
||||||
"image_resolution": "ความละเอียด",
|
"image_resolution": "ความละเอียด",
|
||||||
"image_resolution_description": "ความละเอียดสูกว่าสามารถเก็บรายละเอียดได้มากกว่าแต่ใช้เวลา encode นานกว่า ไฟล์ใหญ่กว่า และลดความตอบสนองของแอป",
|
"image_resolution_description": "ความละเอียดสูกว่าสามารถเก็บรายละเอียดได้มากกว่าแต่ใช้เวลา encode นานกว่า ไฟล์ใหญ่กว่า และลดความตอบสนองของแอป",
|
||||||
@@ -114,7 +105,6 @@
|
|||||||
"image_thumbnail_description": "รูปขนาดย่อที่มีการลบข้อมูลเมตาด้าต้า ใช้เมื่อดูภาพถ่ายในกลุ่ม เช่น ในไทม์ไลน์หลัก",
|
"image_thumbnail_description": "รูปขนาดย่อที่มีการลบข้อมูลเมตาด้าต้า ใช้เมื่อดูภาพถ่ายในกลุ่ม เช่น ในไทม์ไลน์หลัก",
|
||||||
"image_thumbnail_quality_description": "คุณภาพของภาพขนาดย่อตั้งแต่ 1-100 ยิ่งสูงยิ่งดี แต่จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและอาจทำให้แอปตอบสนองช้าลง",
|
"image_thumbnail_quality_description": "คุณภาพของภาพขนาดย่อตั้งแต่ 1-100 ยิ่งสูงยิ่งดี แต่จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและอาจทำให้แอปตอบสนองช้าลง",
|
||||||
"image_thumbnail_title": "ตั้งค่า Thumbnail",
|
"image_thumbnail_title": "ตั้งค่า Thumbnail",
|
||||||
"import_config_from_json_description": "นำเข้าการตั้งค่าระบบโดยการอัปโหลดไฟล์คอนฟิก JSON",
|
|
||||||
"job_concurrency": "{job} งานพร้อมกัน",
|
"job_concurrency": "{job} งานพร้อมกัน",
|
||||||
"job_created": "สร้างงานเรียบร้อย",
|
"job_created": "สร้างงานเรียบร้อย",
|
||||||
"job_not_concurrency_safe": "งานนี้ทำงานพร้อมกันแบบปลอดภัยไม่ได้",
|
"job_not_concurrency_safe": "งานนี้ทำงานพร้อมกันแบบปลอดภัยไม่ได้",
|
||||||
@@ -520,10 +510,10 @@
|
|||||||
"always_keep_photos_hint": "\"เพิ่มพื้นที่ว่าง\" จะเก็บรูปภาพทั้งหมดบนอุปกรณ์นี้",
|
"always_keep_photos_hint": "\"เพิ่มพื้นที่ว่าง\" จะเก็บรูปภาพทั้งหมดบนอุปกรณ์นี้",
|
||||||
"always_keep_videos_hint": "\"เพิ่มพื้นที่ว่าง\" จะเก็บวิดีโอทั้งหมดบนอุปกรณ์นี้",
|
"always_keep_videos_hint": "\"เพิ่มพื้นที่ว่าง\" จะเก็บวิดีโอทั้งหมดบนอุปกรณ์นี้",
|
||||||
"anti_clockwise": "ทวนเข็มนาฬิกา",
|
"anti_clockwise": "ทวนเข็มนาฬิกา",
|
||||||
"api_key": "คีย์ API",
|
"api_key": "API key",
|
||||||
"api_key_description": "ค่านี้จะแสดงเพียงครั้งเดียว โปรดคัดลอกก่อนปิดหน้าต่าง",
|
"api_key_description": "ค่านี้จะแสดงเพียงครั้งเดียว โปรดคัดลอกก่อนปิดหน้าต่าง",
|
||||||
"api_key_empty": "ชื่อคีย์ API ของคุณไม่ควรว่างเปล่า",
|
"api_key_empty": "ชื่อ API Key ของคุณไม่ควรว่างเปล่า",
|
||||||
"api_keys": "คีย์ API",
|
"api_keys": "API Key",
|
||||||
"app_architecture_variant": "รูปแบบ (สถาปัตยกรรม)",
|
"app_architecture_variant": "รูปแบบ (สถาปัตยกรรม)",
|
||||||
"app_bar_signout_dialog_content": "คุณแน่ใจว่าอยากออกจากระบบ",
|
"app_bar_signout_dialog_content": "คุณแน่ใจว่าอยากออกจากระบบ",
|
||||||
"app_bar_signout_dialog_ok": "ใช่",
|
"app_bar_signout_dialog_ok": "ใช่",
|
||||||
@@ -877,7 +867,7 @@
|
|||||||
"delete": "ลบออก",
|
"delete": "ลบออก",
|
||||||
"delete_action_prompt": "ลบ {count} รายการแล้ว",
|
"delete_action_prompt": "ลบ {count} รายการแล้ว",
|
||||||
"delete_album": "ลบอัลบั้ม",
|
"delete_album": "ลบอัลบั้ม",
|
||||||
"delete_api_key_prompt": "คุณต้องการลบคีย์ API นี้หรือไม่?",
|
"delete_api_key_prompt": "คุณต้องการลบ API คีย์ นี้ใช่ไหม ?",
|
||||||
"delete_dialog_alert": "รายการดังกล่าวจะถูกลบจาก Immich และเครื่องอย่างถาวร",
|
"delete_dialog_alert": "รายการดังกล่าวจะถูกลบจาก Immich และเครื่องอย่างถาวร",
|
||||||
"delete_dialog_alert_local": "รายการดังกล่าวจะถูกลบจากเครื่องคุณอย่างถาวร แต่จะยังคงอยู่บนเซิร์ฟเวอร์ Immich",
|
"delete_dialog_alert_local": "รายการดังกล่าวจะถูกลบจากเครื่องคุณอย่างถาวร แต่จะยังคงอยู่บนเซิร์ฟเวอร์ Immich",
|
||||||
"delete_dialog_alert_local_non_backed_up": "รายการบางตัวไม่ได้ถูกสำรองบน Immich และจะถูกลบจากเครื่องคุณอย่างถาวร",
|
"delete_dialog_alert_local_non_backed_up": "รายการบางตัวไม่ได้ถูกสำรองบน Immich และจะถูกลบจากเครื่องคุณอย่างถาวร",
|
||||||
@@ -1072,7 +1062,7 @@
|
|||||||
"unable_to_connect": "ไม่สามารถเชื่อมต่อได้",
|
"unable_to_connect": "ไม่สามารถเชื่อมต่อได้",
|
||||||
"unable_to_copy_to_clipboard": "ไม่สามารถคัดลอกไปยังคลิปบอร์ดได้ ตรวจสอบให้แน่ใจว่าคุณเข้าถึงหน้าผ่านทาง https",
|
"unable_to_copy_to_clipboard": "ไม่สามารถคัดลอกไปยังคลิปบอร์ดได้ ตรวจสอบให้แน่ใจว่าคุณเข้าถึงหน้าผ่านทาง https",
|
||||||
"unable_to_create_admin_account": "ไม่สามารถสร้างบัญชีผู้ดูแลระบบได้",
|
"unable_to_create_admin_account": "ไม่สามารถสร้างบัญชีผู้ดูแลระบบได้",
|
||||||
"unable_to_create_api_key": "ไม่สามารถสร้างคีย์ API",
|
"unable_to_create_api_key": "ไม่สามารถสร้าง API คีย์ ได้",
|
||||||
"unable_to_create_library": "ไม่สามารถสร้างคลังภาพได้",
|
"unable_to_create_library": "ไม่สามารถสร้างคลังภาพได้",
|
||||||
"unable_to_create_user": "ไม่สามารถสร้างผู้ใช้ได้",
|
"unable_to_create_user": "ไม่สามารถสร้างผู้ใช้ได้",
|
||||||
"unable_to_delete_album": "ไม่สามารถลบอัลบั้มได้",
|
"unable_to_delete_album": "ไม่สามารถลบอัลบั้มได้",
|
||||||
@@ -1099,7 +1089,7 @@
|
|||||||
"unable_to_reassign_assets_new_person": "ไม่สามารถมอบหมาย ให้กับบุคคลใหม่ได้",
|
"unable_to_reassign_assets_new_person": "ไม่สามารถมอบหมาย ให้กับบุคคลใหม่ได้",
|
||||||
"unable_to_refresh_user": "ไม่สามารถรีเฟรชผู้ใช้ได้",
|
"unable_to_refresh_user": "ไม่สามารถรีเฟรชผู้ใช้ได้",
|
||||||
"unable_to_remove_album_users": "ไม่สามารถลบผู้ใช้ออกจากอัลบั้มได้",
|
"unable_to_remove_album_users": "ไม่สามารถลบผู้ใช้ออกจากอัลบั้มได้",
|
||||||
"unable_to_remove_api_key": "ไม่สามารถลบคีย์ API",
|
"unable_to_remove_api_key": "ไม่สามารถลบ API Key ได้",
|
||||||
"unable_to_remove_assets_from_shared_link": "ไม่สามารถลบออกจากลิงก์ที่แชร์ได้",
|
"unable_to_remove_assets_from_shared_link": "ไม่สามารถลบออกจากลิงก์ที่แชร์ได้",
|
||||||
"unable_to_remove_library": "ไม่สามารถลบคลังภาพได้",
|
"unable_to_remove_library": "ไม่สามารถลบคลังภาพได้",
|
||||||
"unable_to_remove_partner": "ไม่สามารถลบคู่หูได้",
|
"unable_to_remove_partner": "ไม่สามารถลบคู่หูได้",
|
||||||
@@ -1111,7 +1101,7 @@
|
|||||||
"unable_to_restore_trash": "ไม่สามารถเรียกคืนถังขยะได้",
|
"unable_to_restore_trash": "ไม่สามารถเรียกคืนถังขยะได้",
|
||||||
"unable_to_restore_user": "ไม่สามารถเรียกคืนผู้ใช้ได้",
|
"unable_to_restore_user": "ไม่สามารถเรียกคืนผู้ใช้ได้",
|
||||||
"unable_to_save_album": "ไม่สามารถบันทึกอัลบั้มได้",
|
"unable_to_save_album": "ไม่สามารถบันทึกอัลบั้มได้",
|
||||||
"unable_to_save_api_key": "ไม่สามารถบันทึกคีย์ API",
|
"unable_to_save_api_key": "ไม่สามารถบันทึก API คีย์ ได้",
|
||||||
"unable_to_save_date_of_birth": "ไม่สามารถบันทึกวันเกิดได้",
|
"unable_to_save_date_of_birth": "ไม่สามารถบันทึกวันเกิดได้",
|
||||||
"unable_to_save_name": "ไม่สามารถบันทึกชื่อได้",
|
"unable_to_save_name": "ไม่สามารถบันทึกชื่อได้",
|
||||||
"unable_to_save_profile": "ไม่สามารถบันทึกโปรไฟล์ได้",
|
"unable_to_save_profile": "ไม่สามารถบันทึกโปรไฟล์ได้",
|
||||||
@@ -1205,7 +1195,7 @@
|
|||||||
"geolocation_instruction_location": "คลิกบนสื่อที่มีพิกัด GPS เพื่อใช้ตำแหน่งนั้น หรือเลือกตำแหน่งจากแผนที่โดยตรง",
|
"geolocation_instruction_location": "คลิกบนสื่อที่มีพิกัด GPS เพื่อใช้ตำแหน่งนั้น หรือเลือกตำแหน่งจากแผนที่โดยตรง",
|
||||||
"get_help": "ขอความช่วยเหลือ",
|
"get_help": "ขอความช่วยเหลือ",
|
||||||
"get_people_error": "ข้อผิดพลาดขณะดึงข้อมูลผู้คน",
|
"get_people_error": "ข้อผิดพลาดขณะดึงข้อมูลผู้คน",
|
||||||
"get_wifiname_error": "ไม่สามารถรับชื่อ Wi-Fi กรุณายืนยันการให้อนุญาตแอป และยืนยันว่าเชื่อมต่อกับเครือข่าย Wi-Fi อยู่",
|
"get_wifiname_error": "ไม่สามารถรับชื่อ Wi-Fi กรุณายืนยันการให้อนุญาตแอพ และยืนยันว่า Wi-Fi เชื่อมต่ออยู่",
|
||||||
"getting_started": "เริ่มต้นใช้งาน",
|
"getting_started": "เริ่มต้นใช้งาน",
|
||||||
"go_back": "กลับ",
|
"go_back": "กลับ",
|
||||||
"go_to_folder": "ไปที่โฟล์เดอร์",
|
"go_to_folder": "ไปที่โฟล์เดอร์",
|
||||||
@@ -1440,7 +1430,7 @@
|
|||||||
"manage_sharing_with_partners": "จัดการการแชร์กับคู่หู",
|
"manage_sharing_with_partners": "จัดการการแชร์กับคู่หู",
|
||||||
"manage_the_app_settings": "จัดการการตั้งค่าแอป",
|
"manage_the_app_settings": "จัดการการตั้งค่าแอป",
|
||||||
"manage_your_account": "จัดการบัญชีของคุณ",
|
"manage_your_account": "จัดการบัญชีของคุณ",
|
||||||
"manage_your_api_keys": "จัดการคีย์ API ของคุณ",
|
"manage_your_api_keys": "จัดการกุญแจ API ของคุณ",
|
||||||
"manage_your_devices": "จัดการอุปกรณ์ของคุณ",
|
"manage_your_devices": "จัดการอุปกรณ์ของคุณ",
|
||||||
"manage_your_oauth_connection": "จัดการการเชื่อมต่อ OAuth ของคุณ",
|
"manage_your_oauth_connection": "จัดการการเชื่อมต่อ OAuth ของคุณ",
|
||||||
"map": "แผนที่",
|
"map": "แผนที่",
|
||||||
@@ -1526,7 +1516,7 @@
|
|||||||
"networking_subtitle": "ตั้งค่าปลายทางเซิร์ฟเวอร์",
|
"networking_subtitle": "ตั้งค่าปลายทางเซิร์ฟเวอร์",
|
||||||
"never": "ไม่เคย",
|
"never": "ไม่เคย",
|
||||||
"new_album": "อัลบั้มใหม่",
|
"new_album": "อัลบั้มใหม่",
|
||||||
"new_api_key": "สร้างคีย์ API ใหม่",
|
"new_api_key": "สร้าง API คีย์ใหม่",
|
||||||
"new_date_range": "ช่วงวันที่ใหม่",
|
"new_date_range": "ช่วงวันที่ใหม่",
|
||||||
"new_password": "รหัสผ่านใหม่",
|
"new_password": "รหัสผ่านใหม่",
|
||||||
"new_person": "คนใหม่",
|
"new_person": "คนใหม่",
|
||||||
@@ -1591,7 +1581,7 @@
|
|||||||
"on_this_device": "บนอุปกรณ์นี้",
|
"on_this_device": "บนอุปกรณ์นี้",
|
||||||
"onboarding": "การเริ่มต้นใช้งาน",
|
"onboarding": "การเริ่มต้นใช้งาน",
|
||||||
"onboarding_locale_description": "เลือกภาษาที่คุณต้องการ คุณสามารถเปลี่ยนได้ภายหลังในการตั้งค่า",
|
"onboarding_locale_description": "เลือกภาษาที่คุณต้องการ คุณสามารถเปลี่ยนได้ภายหลังในการตั้งค่า",
|
||||||
"onboarding_privacy_description": "คุณสมบัติ (ตัวเลือก) ต่อไปนี้ต้องอาศัยบริการภายนอก และสามารถปิดใช้งานได้ตลอดเวลาในการตั้งค่า",
|
"onboarding_privacy_description": "ฟีเจอร์ (ตัวเลือก) ต่อไปนี้ต้องอาศัยบริการภายนอก และสามารถปิดใช้งานได้ตลอดเวลาในการตั้งค่าการ",
|
||||||
"onboarding_server_welcome_description": "มาตั้งค่าเซิร์ฟเวอร์ของคุณด้วยการตั้งค่าที่ใช้บ่อยกันเถอะ",
|
"onboarding_server_welcome_description": "มาตั้งค่าเซิร์ฟเวอร์ของคุณด้วยการตั้งค่าที่ใช้บ่อยกันเถอะ",
|
||||||
"onboarding_theme_description": "เลือกธีมสี คุณสามารถเปลี่ยนแปลงได้ในภายหลังในการตั้งค่าของคุณ",
|
"onboarding_theme_description": "เลือกธีมสี คุณสามารถเปลี่ยนแปลงได้ในภายหลังในการตั้งค่าของคุณ",
|
||||||
"onboarding_user_welcome_description": "มาเริ่มต้นกันเถอะ!",
|
"onboarding_user_welcome_description": "มาเริ่มต้นกันเถอะ!",
|
||||||
@@ -1641,7 +1631,7 @@
|
|||||||
"pattern": "รูปแบบ",
|
"pattern": "รูปแบบ",
|
||||||
"pause": "หยุด",
|
"pause": "หยุด",
|
||||||
"pause_memories": "หยุดดูความทรงจํา",
|
"pause_memories": "หยุดดูความทรงจํา",
|
||||||
"paused": "หยุดชั่วคราว",
|
"paused": "หยุด",
|
||||||
"pending": "กำลังรอ",
|
"pending": "กำลังรอ",
|
||||||
"people": "ผู้คน",
|
"people": "ผู้คน",
|
||||||
"people_edits_count": "{count, plural, one {# person} other {# people}} ถูกแก้ไข",
|
"people_edits_count": "{count, plural, one {# person} other {# people}} ถูกแก้ไข",
|
||||||
@@ -1654,13 +1644,11 @@
|
|||||||
"permanently_delete_assets_prompt": "คุณแน่ใจหรือไม่ว่าต้องการลบ {count, plural, one {this asset?} other {these <b>#</b> asset?}}อย่างถาวร การดำเนินการนี้จะลบ {count, plural, one {it from its} other {them from their}} อัลบั้มด้วย",
|
"permanently_delete_assets_prompt": "คุณแน่ใจหรือไม่ว่าต้องการลบ {count, plural, one {this asset?} other {these <b>#</b> asset?}}อย่างถาวร การดำเนินการนี้จะลบ {count, plural, one {it from its} other {them from their}} อัลบั้มด้วย",
|
||||||
"permanently_deleted_asset": "ลบสื่อถาวรแล้ว",
|
"permanently_deleted_asset": "ลบสื่อถาวรแล้ว",
|
||||||
"permanently_deleted_assets_count": "ลบ {count, plural, one {# asset} other {# assets}} เรียบร้อยแล้ว",
|
"permanently_deleted_assets_count": "ลบ {count, plural, one {# asset} other {# assets}} เรียบร้อยแล้ว",
|
||||||
"permission": "สิทธิ์",
|
|
||||||
"permission_empty": "สิทธิ์ของคุณต้องไม่เว้นว่าง",
|
|
||||||
"permission_onboarding_back": "กลับ",
|
"permission_onboarding_back": "กลับ",
|
||||||
"permission_onboarding_continue_anyway": "ดำเนินการต่อ",
|
"permission_onboarding_continue_anyway": "ดำเนินการต่อ",
|
||||||
"permission_onboarding_get_started": "เริ่มต้น",
|
"permission_onboarding_get_started": "เริ่มต้น",
|
||||||
"permission_onboarding_go_to_settings": "ไปยังการตั้งค่า",
|
"permission_onboarding_go_to_settings": "ไปยังการตั้งค่า",
|
||||||
"permission_onboarding_permission_denied": "สิทธิ์ถูกปฏิเสธ กรุณาให้สิทธิ์เข้าถึงรูปภาพและวิดีโอเพื่อใช้งาน Immich",
|
"permission_onboarding_permission_denied": "ไม่อนุญาต ตั้งค่าสิทธิ์เข้าถึงรูปภาพและวิดีโอเพื่อใช้งาน Immich",
|
||||||
"permission_onboarding_permission_granted": "ให้สิทธิ์สำเร็จ คุณพร้อมใช้งานแล้ว",
|
"permission_onboarding_permission_granted": "ให้สิทธิ์สำเร็จ คุณพร้อมใช้งานแล้ว",
|
||||||
"permission_onboarding_permission_limited": "สิทธ์จำกัด เพื่อให้ Immich สำรองข้อมูลและจัดการคลังภาพได้ ตั้งค่าสิทธิเข้าถึงรูปภาพและวิดีโอ",
|
"permission_onboarding_permission_limited": "สิทธ์จำกัด เพื่อให้ Immich สำรองข้อมูลและจัดการคลังภาพได้ ตั้งค่าสิทธิเข้าถึงรูปภาพและวิดีโอ",
|
||||||
"permission_onboarding_request": "Immich จำเป็นจะต้องได้รับสิทธิ์ดูรูปภาพและวิดีโอ",
|
"permission_onboarding_request": "Immich จำเป็นจะต้องได้รับสิทธิ์ดูรูปภาพและวิดีโอ",
|
||||||
@@ -1795,7 +1783,7 @@
|
|||||||
"remove_photo_from_memory": "ลบรูปออกจากความทรงจำนี้",
|
"remove_photo_from_memory": "ลบรูปออกจากความทรงจำนี้",
|
||||||
"remove_url": "ลบ URL",
|
"remove_url": "ลบ URL",
|
||||||
"remove_user": "ลบผู้ใช้",
|
"remove_user": "ลบผู้ใช้",
|
||||||
"removed_api_key": "ลบคีย์ API แล้ว: {name}",
|
"removed_api_key": "API คีย์ของ: {name} ถูกลบแล้ว",
|
||||||
"removed_from_archive": "ลบจากเก็บถาวรแล้ว",
|
"removed_from_archive": "ลบจากเก็บถาวรแล้ว",
|
||||||
"removed_from_favorites": "ลบจากรายการโปรดแล้ว",
|
"removed_from_favorites": "ลบจากรายการโปรดแล้ว",
|
||||||
"removed_from_favorites_count": "{count, plural, other {ถูกลบ#}} จากรายการโปรดแล้ว",
|
"removed_from_favorites_count": "{count, plural, other {ถูกลบ#}} จากรายการโปรดแล้ว",
|
||||||
@@ -1843,7 +1831,7 @@
|
|||||||
"save": "บันทึก",
|
"save": "บันทึก",
|
||||||
"save_to_gallery": "บันทึกไปยังแกลเลอรี",
|
"save_to_gallery": "บันทึกไปยังแกลเลอรี",
|
||||||
"saved": "บันทึกแล้ว",
|
"saved": "บันทึกแล้ว",
|
||||||
"saved_api_key": "บันทึกคีย์ API แล้ว",
|
"saved_api_key": "บันทึก API คีย์ แล้ว",
|
||||||
"saved_profile": "แก้ไขโปรไฟล์สำเร็จ",
|
"saved_profile": "แก้ไขโปรไฟล์สำเร็จ",
|
||||||
"saved_settings": "บันทึกการตั้งค่าสำเร็จ",
|
"saved_settings": "บันทึกการตั้งค่าสำเร็จ",
|
||||||
"say_something": "พูดอะไรสักอย่าง",
|
"say_something": "พูดอะไรสักอย่าง",
|
||||||
@@ -2135,12 +2123,9 @@
|
|||||||
"sync_upload_album_setting_subtitle": "สร้างและอัปโหลดรูปภาพและวิดีโอของคุณไปยังอัลบั้มที่เลือกบน Immich",
|
"sync_upload_album_setting_subtitle": "สร้างและอัปโหลดรูปภาพและวิดีโอของคุณไปยังอัลบั้มที่เลือกบน Immich",
|
||||||
"tag": "แท็ก",
|
"tag": "แท็ก",
|
||||||
"tag_created": "สร้างแท็ก: {tag}",
|
"tag_created": "สร้างแท็ก: {tag}",
|
||||||
"tag_face": "แท็กใบหน้า",
|
|
||||||
"tag_feature_description": "ดูรูปถ่ายและวีดีโอที่สร้างกลุ่มตามหัวข้อแท็ก",
|
|
||||||
"tag_not_found_question": "ไม่สามารถหาแท็กได้ใช่หรือไม่?<link>สร้างแท็กใหม่</link>",
|
"tag_not_found_question": "ไม่สามารถหาแท็กได้ใช่หรือไม่?<link>สร้างแท็กใหม่</link>",
|
||||||
"tag_people": "แท็กผู้คน",
|
"tag_people": "แท็กผู้คน",
|
||||||
"tag_updated": "แท็กที่ถูกอัพเดต: {tag}",
|
"tag_updated": "แท็กที่ถูกอัพเดต: {tag}",
|
||||||
"tagged_assets": "ที่ถูกแท็ก",
|
|
||||||
"tags": "แท็ก",
|
"tags": "แท็ก",
|
||||||
"tap_to_run_job": "แตะเพื่อรันงาน",
|
"tap_to_run_job": "แตะเพื่อรันงาน",
|
||||||
"template": "เท็มเพลต",
|
"template": "เท็มเพลต",
|
||||||
@@ -2238,7 +2223,7 @@
|
|||||||
"upload_status_duplicates": "รายการซ้ำ",
|
"upload_status_duplicates": "รายการซ้ำ",
|
||||||
"upload_status_errors": "ข้อผิดพลาด",
|
"upload_status_errors": "ข้อผิดพลาด",
|
||||||
"upload_status_uploaded": "อัปโหลดแล้ว",
|
"upload_status_uploaded": "อัปโหลดแล้ว",
|
||||||
"upload_success": "อัปโหลดสำเร็จ รีเฟรชหน้าเพื่อดูสื่อที่อัปโหลดใหม่",
|
"upload_success": "อัปโหลดสำเร็จ รีเฟรชหน้าเพื่อดูสื่อใหม่ที่อัปโหลดล่าสุด",
|
||||||
"upload_to_immich": "อัปโหลดไปยัง Immich ({count})",
|
"upload_to_immich": "อัปโหลดไปยัง Immich ({count})",
|
||||||
"uploading": "กำลังอัปโหลด",
|
"uploading": "กำลังอัปโหลด",
|
||||||
"uploading_media": "กำลังอัปโหลดสื่อ",
|
"uploading_media": "กำลังอัปโหลดสื่อ",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Paylaşmak için link oluştur",
|
"create_link_to_share": "Paylaşmak için link oluştur",
|
||||||
"create_link_to_share_description": "Bağlantıya sahip olan herkesin seçilen fotoğrafları görmesine izin ver",
|
"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": "YENİ OLUŞTUR",
|
||||||
"create_new_face": "Yeni yüz oluştur",
|
|
||||||
"create_new_person": "Yeni kişi oluştur",
|
"create_new_person": "Yeni kişi oluştur",
|
||||||
"create_new_person_hint": "Seçili öğeleri 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_new_user": "Yeni kullanıcı oluştur",
|
||||||
"create_person": "Kişi oluştur",
|
|
||||||
"create_person_subtitle": "Seçilen yüze bir isim ekleyerek yeni kişiyi oluşturun ve etiketleyin",
|
|
||||||
"create_shared_album_page_share_add_assets": "ÖĞELER EKLE",
|
"create_shared_album_page_share_add_assets": "ÖĞELER EKLE",
|
||||||
"create_shared_album_page_share_select_photos": "Fotoğrafları Seç",
|
"create_shared_album_page_share_select_photos": "Fotoğrafları Seç",
|
||||||
"create_shared_link": "Paylaşılan bağlantı oluştur",
|
"create_shared_link": "Paylaşılan bağlantı oluştur",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Etiket",
|
"tag": "Etiket",
|
||||||
"tag_assets": "Öğeleri etiketle",
|
"tag_assets": "Öğeleri etiketle",
|
||||||
"tag_created": "Etiket oluşturuldu: {tag}",
|
"tag_created": "Etiket oluşturuldu: {tag}",
|
||||||
"tag_face": "Yüzü etiketle",
|
|
||||||
"tag_feature_description": "Etiket temalarına göre gruplandırılmış fotoğraf ve videoları keşfedin",
|
"tag_feature_description": "Etiket temalarına göre gruplandırılmış fotoğraf ve videoları keşfedin",
|
||||||
"tag_not_found_question": "Etiket bulunamadı mı? <link>Yeni bir etiket oluşturun.</link>",
|
"tag_not_found_question": "Etiket bulunamadı mı? <link>Yeni bir etiket oluşturun.</link>",
|
||||||
"tag_people": "İnsanları etiketle",
|
"tag_people": "İnsanları etiketle",
|
||||||
|
|||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "Створити посилання спільного доступу",
|
"create_link_to_share": "Створити посилання спільного доступу",
|
||||||
"create_link_to_share_description": "Дати змогу будь-кому переглядати вибрані фото за посиланням",
|
"create_link_to_share_description": "Дати змогу будь-кому переглядати вибрані фото за посиланням",
|
||||||
"create_new": "СТВОРИТИ НОВИЙ",
|
"create_new": "СТВОРИТИ НОВИЙ",
|
||||||
"create_new_face": "Створити нове обличчя",
|
|
||||||
"create_new_person": "Створити нову людину",
|
"create_new_person": "Створити нову людину",
|
||||||
"create_new_person_hint": "Призначити вибрані елементи новій людині",
|
"create_new_person_hint": "Призначити вибрані елементи новій людині",
|
||||||
"create_new_user": "Створити нового користувача",
|
"create_new_user": "Створити нового користувача",
|
||||||
"create_person": "Створити людину",
|
|
||||||
"create_person_subtitle": "Додайте ім'я до вибраного обличчя, щоб створити та позначити нову особу",
|
|
||||||
"create_shared_album_page_share_add_assets": "ДОДАТИ ЕЛЕМЕНТИ",
|
"create_shared_album_page_share_add_assets": "ДОДАТИ ЕЛЕМЕНТИ",
|
||||||
"create_shared_album_page_share_select_photos": "Вибрати фото",
|
"create_shared_album_page_share_select_photos": "Вибрати фото",
|
||||||
"create_shared_link": "Створити спільне посилання",
|
"create_shared_link": "Створити спільне посилання",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "Тег",
|
"tag": "Тег",
|
||||||
"tag_assets": "Додати теги",
|
"tag_assets": "Додати теги",
|
||||||
"tag_created": "Створено тег: {tag}",
|
"tag_created": "Створено тег: {tag}",
|
||||||
"tag_face": "Тег обличчя",
|
|
||||||
"tag_feature_description": "Перегляд фото та відео, згрупованих за логічними темами тегів",
|
"tag_feature_description": "Перегляд фото та відео, згрупованих за логічними темами тегів",
|
||||||
"tag_not_found_question": "Не вдається знайти тег? <link>Створіть новий тег.</link>",
|
"tag_not_found_question": "Не вдається знайти тег? <link>Створіть новий тег.</link>",
|
||||||
"tag_people": "Позначити людей",
|
"tag_people": "Позначити людей",
|
||||||
|
|||||||
+28
-28
@@ -537,10 +537,10 @@
|
|||||||
"app_bar_signout_dialog_content": "Bạn có muốn đăng xuất?",
|
"app_bar_signout_dialog_content": "Bạn có muốn đăng xuất?",
|
||||||
"app_bar_signout_dialog_ok": "Có",
|
"app_bar_signout_dialog_ok": "Có",
|
||||||
"app_bar_signout_dialog_title": "Đăng xuất",
|
"app_bar_signout_dialog_title": "Đăng xuất",
|
||||||
"app_download_links": "Liên kết tải ứng dụng",
|
"app_download_links": "Liên kết tải app",
|
||||||
"app_settings": "Ứng dụng",
|
"app_settings": "App",
|
||||||
"app_stores": "Cửa hàng ứng dụng",
|
"app_stores": "Cửa hàng app",
|
||||||
"app_update_available": "Đã có bản cập nhật ứng dụng",
|
"app_update_available": "Đã có bản cập nhật app",
|
||||||
"appears_in": "Xuất hiện trong",
|
"appears_in": "Xuất hiện trong",
|
||||||
"apply_count": "Áp dụng ({count, number})",
|
"apply_count": "Áp dụng ({count, number})",
|
||||||
"archive": "Lưu trữ",
|
"archive": "Lưu trữ",
|
||||||
@@ -617,7 +617,7 @@
|
|||||||
"back_close_deselect": "Quay lại, đóng, hoặc bỏ chọn",
|
"back_close_deselect": "Quay lại, đóng, hoặc bỏ chọn",
|
||||||
"background_backup_running_error": "Sao lưu nền hiện đang chạy, không thể bắt đầu sao lưu thủ công",
|
"background_backup_running_error": "Sao lưu nền hiện đang chạy, không thể bắt đầu sao lưu thủ công",
|
||||||
"background_location_permission": "Quyền truy cập vị trí khi chạy nền",
|
"background_location_permission": "Quyền truy cập vị trí khi chạy nền",
|
||||||
"background_location_permission_content": "Để chuyển đổi mạng khi chạy ở chế độ nền, Immich phải *luôn* có quyền truy cập vị trí chính xác để có thể đọc tên mạng Wi-Fi",
|
"background_location_permission_content": "Để chuyển đổi mạng khi chạy ở chế độ nền, Immich *luôn* phải có quyền truy cập vị trí chính xác để có thể đọc tên mạng Wi-Fi",
|
||||||
"background_options": "Tùy chọn nền",
|
"background_options": "Tùy chọn nền",
|
||||||
"backup": "Sao lưu",
|
"backup": "Sao lưu",
|
||||||
"backup_album_selection_page_albums_device": "Album trên thiết bị ({count})",
|
"backup_album_selection_page_albums_device": "Album trên thiết bị ({count})",
|
||||||
@@ -637,8 +637,8 @@
|
|||||||
"backup_background_service_in_progress_notification": "Đang sao lưu tệp của bạn…",
|
"backup_background_service_in_progress_notification": "Đang sao lưu tệp của bạn…",
|
||||||
"backup_background_service_upload_failure_notification": "Tải lên {filename} thất bại",
|
"backup_background_service_upload_failure_notification": "Tải lên {filename} thất bại",
|
||||||
"backup_controller_page_albums": "Album sao lưu",
|
"backup_controller_page_albums": "Album sao lưu",
|
||||||
"backup_controller_page_background_app_refresh_disabled_content": "Bật làm mới ứng dụng trong nền tại Cài đặt > Cài đặt chung > Làm mới ứng dụng trong nền để dùng sao lưu nền.",
|
"backup_controller_page_background_app_refresh_disabled_content": "Bật làm mới app trong nền tại Cài đặt > Cài đặt chung > Làm mới app trong nền để dùng sao lưu nền.",
|
||||||
"backup_controller_page_background_app_refresh_disabled_title": "Làm mới ứng dụng trong nền bị vô hiệu hoá",
|
"backup_controller_page_background_app_refresh_disabled_title": "Làm mới app trong nền bị vô hiệu hoá",
|
||||||
"backup_controller_page_background_app_refresh_enable_button_text": "Đi tới cài đặt",
|
"backup_controller_page_background_app_refresh_enable_button_text": "Đi tới cài đặt",
|
||||||
"backup_controller_page_background_battery_info_link": "Hướng dẫn tôi",
|
"backup_controller_page_background_battery_info_link": "Hướng dẫn tôi",
|
||||||
"backup_controller_page_background_battery_info_message": "Để có trải nghiệm sao lưu nền tốt nhất, vui lòng vô hiệu hóa bất kỳ tối ưu hóa pin nào đang hạn chế hoạt động nền của Immich.\n\nVì điều này phụ thuộc vào thiết bị, vui lòng tham khảo thông tin cần thiết của nhà sản xuất thiết bị của bạn.",
|
"backup_controller_page_background_battery_info_message": "Để có trải nghiệm sao lưu nền tốt nhất, vui lòng vô hiệu hóa bất kỳ tối ưu hóa pin nào đang hạn chế hoạt động nền của Immich.\n\nVì điều này phụ thuộc vào thiết bị, vui lòng tham khảo thông tin cần thiết của nhà sản xuất thiết bị của bạn.",
|
||||||
@@ -647,7 +647,7 @@
|
|||||||
"backup_controller_page_background_charging": "Chỉ khi đang sạc",
|
"backup_controller_page_background_charging": "Chỉ khi đang sạc",
|
||||||
"backup_controller_page_background_configure_error": "Cấu hình dịch vụ nền thất bại",
|
"backup_controller_page_background_configure_error": "Cấu hình dịch vụ nền thất bại",
|
||||||
"backup_controller_page_background_delay": "Trì hoãn sao lưu tệp mới: {duration}",
|
"backup_controller_page_background_delay": "Trì hoãn sao lưu tệp mới: {duration}",
|
||||||
"backup_controller_page_background_description": "Bật dịch vụ nền để tự động sao lưu tệp mới mà không cần mở ứng dụng",
|
"backup_controller_page_background_description": "Bật dịch vụ nền để tự động sao lưu tệp mới mà không cần mở app",
|
||||||
"backup_controller_page_background_is_off": "Sao lưu tự động trong nền đang tắt",
|
"backup_controller_page_background_is_off": "Sao lưu tự động trong nền đang tắt",
|
||||||
"backup_controller_page_background_is_on": "Sao lưu tự động trong nền đang bật",
|
"backup_controller_page_background_is_on": "Sao lưu tự động trong nền đang bật",
|
||||||
"backup_controller_page_background_turn_off": "Tắt dịch vụ nền",
|
"backup_controller_page_background_turn_off": "Tắt dịch vụ nền",
|
||||||
@@ -657,7 +657,7 @@
|
|||||||
"backup_controller_page_backup_selected": "Đã chọn: ",
|
"backup_controller_page_backup_selected": "Đã chọn: ",
|
||||||
"backup_controller_page_backup_sub": "Ảnh và video đã sao lưu",
|
"backup_controller_page_backup_sub": "Ảnh và video đã sao lưu",
|
||||||
"backup_controller_page_created": "Tạo vào: {date}",
|
"backup_controller_page_created": "Tạo vào: {date}",
|
||||||
"backup_controller_page_desc_backup": "Bật sao lưu khi ứng dụng hoạt động để tự động sao lưu tệp mới lên máy chủ khi mở ứng dụng.",
|
"backup_controller_page_desc_backup": "Bật sao lưu khi app hoạt động để tự động sao lưu tệp mới lên máy chủ khi mở app.",
|
||||||
"backup_controller_page_excluded": "Đã bỏ qua: ",
|
"backup_controller_page_excluded": "Đã bỏ qua: ",
|
||||||
"backup_controller_page_failed": "Thất bại ({count})",
|
"backup_controller_page_failed": "Thất bại ({count})",
|
||||||
"backup_controller_page_filename": "Tên tệp: {filename} [{size}]",
|
"backup_controller_page_filename": "Tên tệp: {filename} [{size}]",
|
||||||
@@ -668,12 +668,12 @@
|
|||||||
"backup_controller_page_remainder_sub": "Số lượng ảnh và video đã chọn chưa được sao lưu",
|
"backup_controller_page_remainder_sub": "Số lượng ảnh và video đã chọn chưa được sao lưu",
|
||||||
"backup_controller_page_server_storage": "Dung lượng máy chủ",
|
"backup_controller_page_server_storage": "Dung lượng máy chủ",
|
||||||
"backup_controller_page_start_backup": "Bắt đầu sao lưu",
|
"backup_controller_page_start_backup": "Bắt đầu sao lưu",
|
||||||
"backup_controller_page_status_off": "Sao lưu tự động khi ứng dụng hoạt động đang tắt",
|
"backup_controller_page_status_off": "Sao lưu tự động khi app hoạt động đang tắt",
|
||||||
"backup_controller_page_status_on": "Sao lưu tự động khi ứng dụng hoạt động đang bật",
|
"backup_controller_page_status_on": "Sao lưu tự động khi app hoạt động đang bật",
|
||||||
"backup_controller_page_storage_format": "Đã dùng {used} của {total}",
|
"backup_controller_page_storage_format": "Đã dùng {used} của {total}",
|
||||||
"backup_controller_page_to_backup": "Các album cần được sao lưu",
|
"backup_controller_page_to_backup": "Các album cần được sao lưu",
|
||||||
"backup_controller_page_total_sub": "Tất cả ảnh và video không trùng lập từ các album được chọn",
|
"backup_controller_page_total_sub": "Tất cả ảnh và video không trùng lập từ các album được chọn",
|
||||||
"backup_controller_page_turn_off": "Tắt sao lưu khi ứng dụng hoạt động",
|
"backup_controller_page_turn_off": "Tắt sao lưu khi app hoạt động",
|
||||||
"backup_controller_page_turn_on": "Bật sao lưu khi mở app",
|
"backup_controller_page_turn_on": "Bật sao lưu khi mở app",
|
||||||
"backup_controller_page_uploading_file_info": "Thông tin tệp đang tải lên",
|
"backup_controller_page_uploading_file_info": "Thông tin tệp đang tải lên",
|
||||||
"backup_err_only_album": "Không thể xóa album duy nhất",
|
"backup_err_only_album": "Không thể xóa album duy nhất",
|
||||||
@@ -704,16 +704,16 @@
|
|||||||
"bulk_trash_duplicates_confirmation": "Bạn có chắc muốn đưa {count, plural, one {# tệp trùng lặp} other {# tệp trùng lặp}} vào thùng rác? Điều này sẽ giữ lại ảnh chất lượng nhất của mỗi nhóm và đưa tất cả các bản trùng lặp khác vào thùng rác.",
|
"bulk_trash_duplicates_confirmation": "Bạn có chắc muốn đưa {count, plural, one {# tệp trùng lặp} other {# tệp trùng lặp}} vào thùng rác? Điều này sẽ giữ lại ảnh chất lượng nhất của mỗi nhóm và đưa tất cả các bản trùng lặp khác vào thùng rác.",
|
||||||
"buy": "Mua Immich",
|
"buy": "Mua Immich",
|
||||||
"cache_settings_clear_cache_button": "Xóa bộ nhớ đệm",
|
"cache_settings_clear_cache_button": "Xóa bộ nhớ đệm",
|
||||||
"cache_settings_clear_cache_button_title": "Xóa bộ nhớ đệm của ứng dụng. Điều này sẽ ảnh hưởng đến hiệu suất của ứng dụng đến khi bộ nhớ đệm được tạo lại.",
|
"cache_settings_clear_cache_button_title": "Xóa bộ nhớ đệm của app. Điều này sẽ ảnh hưởng đến hiệu suất của app đến khi bộ nhớ đệm được tạo lại.",
|
||||||
"cache_settings_duplicated_assets_clear_button": "XÓA",
|
"cache_settings_duplicated_assets_clear_button": "XÓA",
|
||||||
"cache_settings_duplicated_assets_subtitle": "Ảnh và video không được phép hiển thị trên ứng dụng",
|
"cache_settings_duplicated_assets_subtitle": "Ảnh và video không được phép hiển thị trên app",
|
||||||
"cache_settings_duplicated_assets_title": "Tệp bị trùng ({count})",
|
"cache_settings_duplicated_assets_title": "Tệp bị trùng ({count})",
|
||||||
"cache_settings_statistics_album": "Ảnh thu nhỏ thư viện",
|
"cache_settings_statistics_album": "Ảnh thu nhỏ thư viện",
|
||||||
"cache_settings_statistics_full": "Ảnh đầy đủ",
|
"cache_settings_statistics_full": "Ảnh đầy đủ",
|
||||||
"cache_settings_statistics_shared": "Ảnh thu nhỏ album chia sẻ",
|
"cache_settings_statistics_shared": "Ảnh thu nhỏ album chia sẻ",
|
||||||
"cache_settings_statistics_thumbnail": "Ảnh thu nhỏ",
|
"cache_settings_statistics_thumbnail": "Ảnh thu nhỏ",
|
||||||
"cache_settings_statistics_title": "Mức sử dụng bộ nhớ đệm",
|
"cache_settings_statistics_title": "Mức sử dụng bộ nhớ đệm",
|
||||||
"cache_settings_subtitle": "Kiểm soát hành vi bộ nhớ đệm của Immich",
|
"cache_settings_subtitle": "Kiểm soát hành vi bộ nhớ đệm của app Immich",
|
||||||
"cache_settings_tile_subtitle": "Kiểm soát cách xử lý lưu trữ cục bộ",
|
"cache_settings_tile_subtitle": "Kiểm soát cách xử lý lưu trữ cục bộ",
|
||||||
"cache_settings_tile_title": "Lưu trữ cục bộ",
|
"cache_settings_tile_title": "Lưu trữ cục bộ",
|
||||||
"cache_settings_title": "Cài đặt bộ nhớ đệm",
|
"cache_settings_title": "Cài đặt bộ nhớ đệm",
|
||||||
@@ -999,8 +999,8 @@
|
|||||||
"editor_discard_edits_confirm": "Bỏ thay đổi",
|
"editor_discard_edits_confirm": "Bỏ thay đổi",
|
||||||
"editor_discard_edits_prompt": "Bạn có những thay đổi chưa được lưu. Bạn có chắc chắn muốn hủy bỏ chúng không?",
|
"editor_discard_edits_prompt": "Bạn có những thay đổi chưa được lưu. Bạn có chắc chắn muốn hủy bỏ chúng không?",
|
||||||
"editor_discard_edits_title": "Hủy thay đổi?",
|
"editor_discard_edits_title": "Hủy thay đổi?",
|
||||||
"editor_edits_applied_error": "Không thể áp dụng chỉnh sửa",
|
"editor_edits_applied_error": "Lỗi khi áp dụng thay đổi",
|
||||||
"editor_edits_applied_success": "Chỉnh sửa được áp dụng thành công",
|
"editor_edits_applied_success": "Thay đổi được áp dụng thành công",
|
||||||
"editor_flip_horizontal": "Lật ngang",
|
"editor_flip_horizontal": "Lật ngang",
|
||||||
"editor_flip_vertical": "Lật dọc",
|
"editor_flip_vertical": "Lật dọc",
|
||||||
"editor_orientation": "Định hướng",
|
"editor_orientation": "Định hướng",
|
||||||
@@ -1202,7 +1202,7 @@
|
|||||||
"feature_photo_updated": "Đã cập nhật ảnh nổi bật",
|
"feature_photo_updated": "Đã cập nhật ảnh nổi bật",
|
||||||
"features": "Tính năng",
|
"features": "Tính năng",
|
||||||
"features_in_development": "Tính năng đang được phát triển",
|
"features_in_development": "Tính năng đang được phát triển",
|
||||||
"features_setting_description": "Quản lý các tính năng ứng dụng",
|
"features_setting_description": "Quản lý các tính năng app",
|
||||||
"file_name_or_extension": "Tên hoặc phần mở rộng tập tin",
|
"file_name_or_extension": "Tên hoặc phần mở rộng tập tin",
|
||||||
"file_name_text": "Tên tệp",
|
"file_name_text": "Tên tệp",
|
||||||
"file_name_with_value": "Tên tệp: {file_name}",
|
"file_name_with_value": "Tên tệp: {file_name}",
|
||||||
@@ -1280,7 +1280,7 @@
|
|||||||
"home_page_delete_remote_err_local": "Tệp trên thiết bị trong lựa chọn xóa từ xa, bỏ qua",
|
"home_page_delete_remote_err_local": "Tệp trên thiết bị trong lựa chọn xóa từ xa, bỏ qua",
|
||||||
"home_page_favorite_err_local": "Không thể thích tệp trên thiết bị, bỏ qua",
|
"home_page_favorite_err_local": "Không thể thích tệp trên thiết bị, bỏ qua",
|
||||||
"home_page_favorite_err_partner": "Không thể thích tệp của người thân, bỏ qua",
|
"home_page_favorite_err_partner": "Không thể thích tệp của người thân, bỏ qua",
|
||||||
"home_page_first_time_notice": "Nếu đây là lần đầu bạn dùng ứng dụng, hãy chọn một album sao lưu để dòng thời gian có thể hiển thị ảnh và video của bạn",
|
"home_page_first_time_notice": "Nếu đây là lần đầu bạn dùng app, hãy chọn một album sao lưu để dòng thời gian có thể hiển thị ảnh và video của bạn",
|
||||||
"home_page_locked_error_local": "Không thể di chuyển tệp trên thiết bị đến thư mục Khóa, bỏ qua",
|
"home_page_locked_error_local": "Không thể di chuyển tệp trên thiết bị đến thư mục Khóa, bỏ qua",
|
||||||
"home_page_locked_error_partner": "Không thể di chuyển tệp của người thân đến thư mục Khóa, bỏ qua",
|
"home_page_locked_error_partner": "Không thể di chuyển tệp của người thân đến thư mục Khóa, bỏ qua",
|
||||||
"home_page_share_err_local": "Không thể chia sẻ tệp trên thiết bị qua liên kết, bỏ qua",
|
"home_page_share_err_local": "Không thể chia sẻ tệp trên thiết bị qua liên kết, bỏ qua",
|
||||||
@@ -1395,7 +1395,7 @@
|
|||||||
"local_id": "ID cục bộ",
|
"local_id": "ID cục bộ",
|
||||||
"local_media_summary": "Mô tả phương tiện trên thiết bị",
|
"local_media_summary": "Mô tả phương tiện trên thiết bị",
|
||||||
"local_network": "Mạng nội bộ",
|
"local_network": "Mạng nội bộ",
|
||||||
"local_network_sheet_info": "Ứng dụng sẽ kết nối với máy chủ qua URL này khi sử dụng mạng Wi-Fi được chỉ định",
|
"local_network_sheet_info": "App sẽ kết nối với máy chủ qua URL này khi sử dụng mạng Wi-Fi được chỉ định",
|
||||||
"location": "Địa điểm",
|
"location": "Địa điểm",
|
||||||
"location_permission": "Quyền truy cập vị trí",
|
"location_permission": "Quyền truy cập vị trí",
|
||||||
"location_permission_content": "Để sử dụng tính năng tự động chuyển đổi, Immich cần có quyền vị trí chính xác để có thể đọc tên của mạng Wi-Fi hiện tại",
|
"location_permission_content": "Để sử dụng tính năng tự động chuyển đổi, Immich cần có quyền vị trí chính xác để có thể đọc tên của mạng Wi-Fi hiện tại",
|
||||||
@@ -1471,11 +1471,11 @@
|
|||||||
"manage_geolocation": "Quản lý địa điểm",
|
"manage_geolocation": "Quản lý địa điểm",
|
||||||
"manage_media_access_rationale": "Để có thể di chuyển tệp vào thùng rác và khôi phục chúng từ đó.",
|
"manage_media_access_rationale": "Để có thể di chuyển tệp vào thùng rác và khôi phục chúng từ đó.",
|
||||||
"manage_media_access_settings": "Mở cài đặt",
|
"manage_media_access_settings": "Mở cài đặt",
|
||||||
"manage_media_access_subtitle": "Cho phép ứng dụng [Immich] quản lý và di chuyển tệp.",
|
"manage_media_access_subtitle": "Cho phép app [Immich] quản lý và di chuyển tệp.",
|
||||||
"manage_media_access_title": "Quản lý phương tiện",
|
"manage_media_access_title": "Quản lý phương tiện",
|
||||||
"manage_shared_links": "Quản lý liên kết chia sẻ",
|
"manage_shared_links": "Quản lý liên kết chia sẻ",
|
||||||
"manage_sharing_with_partners": "Quản lý chia sẻ với người thân",
|
"manage_sharing_with_partners": "Quản lý chia sẻ với người thân",
|
||||||
"manage_the_app_settings": "Quản lý cài đặt ứng dụng",
|
"manage_the_app_settings": "Quản lý cài đặt app",
|
||||||
"manage_your_account": "Quản lý tài khoản của bạn",
|
"manage_your_account": "Quản lý tài khoản của bạn",
|
||||||
"manage_your_api_keys": "Quản lý các khóa API của bạn",
|
"manage_your_api_keys": "Quản lý các khóa API của bạn",
|
||||||
"manage_your_devices": "Quản lý các thiết bị đã đăng nhập của bạn",
|
"manage_your_devices": "Quản lý các thiết bị đã đăng nhập của bạn",
|
||||||
@@ -1490,7 +1490,7 @@
|
|||||||
"map_marker_for_images": "Đánh dấu bản đồ cho ảnh chụp tại {city}, {country}",
|
"map_marker_for_images": "Đánh dấu bản đồ cho ảnh chụp tại {city}, {country}",
|
||||||
"map_marker_with_image": "Đánh dấu bản đồ với ảnh",
|
"map_marker_with_image": "Đánh dấu bản đồ với ảnh",
|
||||||
"map_no_location_permission_content": "Cần quyền truy cập vị trí để hiển thị tệp từ vị trí hiện tại của bạn. Bạn có muốn cho phép ngay bây giờ không?",
|
"map_no_location_permission_content": "Cần quyền truy cập vị trí để hiển thị tệp từ vị trí hiện tại của bạn. Bạn có muốn cho phép ngay bây giờ không?",
|
||||||
"map_no_location_permission_title": "Ứng dụng không được phép truy cập vị trí",
|
"map_no_location_permission_title": "App không được phép truy cập vị trí",
|
||||||
"map_settings": "Cài đặt bản đồ",
|
"map_settings": "Cài đặt bản đồ",
|
||||||
"map_settings_dark_mode": "Chế độ tối",
|
"map_settings_dark_mode": "Chế độ tối",
|
||||||
"map_settings_date_range_option_day": "Trong vòng 24 giờ qua",
|
"map_settings_date_range_option_day": "Trong vòng 24 giờ qua",
|
||||||
@@ -1746,7 +1746,7 @@
|
|||||||
"play_transcoded_video": "Phát video đã chuyển mã",
|
"play_transcoded_video": "Phát video đã chuyển mã",
|
||||||
"please_auth_to_access": "Vui lòng xác thực để truy cập",
|
"please_auth_to_access": "Vui lòng xác thực để truy cập",
|
||||||
"port": "Cổng",
|
"port": "Cổng",
|
||||||
"preferences_settings_subtitle": "Tùy chỉnh trải nghiệm ứng dụng",
|
"preferences_settings_subtitle": "Tùy chỉnh trải nghiệm app",
|
||||||
"preferences_settings_title": "Cá nhân hóa",
|
"preferences_settings_title": "Cá nhân hóa",
|
||||||
"preparing": "Đang chuẩn bị",
|
"preparing": "Đang chuẩn bị",
|
||||||
"preset": "Mẫu có sẵn",
|
"preset": "Mẫu có sẵn",
|
||||||
@@ -1760,7 +1760,7 @@
|
|||||||
"primary": "Chính",
|
"primary": "Chính",
|
||||||
"privacy": "Bảo mật",
|
"privacy": "Bảo mật",
|
||||||
"profile": "Hồ sơ",
|
"profile": "Hồ sơ",
|
||||||
"profile_drawer_app_logs": "Nhật ký",
|
"profile_drawer_app_logs": "Log",
|
||||||
"profile_drawer_client_server_up_to_date": "Máy khách và máy chủ đã cập nhật",
|
"profile_drawer_client_server_up_to_date": "Máy khách và máy chủ đã cập nhật",
|
||||||
"profile_drawer_github": "GitHub",
|
"profile_drawer_github": "GitHub",
|
||||||
"profile_drawer_readonly_mode": "Đã bật chế độ chỉ-xem. Nhấn giữ ảnh đại diện người dùng để tắt.",
|
"profile_drawer_readonly_mode": "Đã bật chế độ chỉ-xem. Nhấn giữ ảnh đại diện người dùng để tắt.",
|
||||||
@@ -2006,7 +2006,7 @@
|
|||||||
"send_message": "Gửi tin nhắn",
|
"send_message": "Gửi tin nhắn",
|
||||||
"send_welcome_email": "Gửi email chào mừng",
|
"send_welcome_email": "Gửi email chào mừng",
|
||||||
"server_endpoint": "Địa chỉ máy chủ",
|
"server_endpoint": "Địa chỉ máy chủ",
|
||||||
"server_info_box_app_version": "Phiên bản ứng dụng",
|
"server_info_box_app_version": "Phiên bản app",
|
||||||
"server_info_box_server_url": "URL máy chủ",
|
"server_info_box_server_url": "URL máy chủ",
|
||||||
"server_offline": "Máy chủ ngoại tuyến",
|
"server_offline": "Máy chủ ngoại tuyến",
|
||||||
"server_online": "Phiên bản",
|
"server_online": "Phiên bản",
|
||||||
@@ -2228,7 +2228,7 @@
|
|||||||
"theme_setting_primary_color_title": "Màu chủ đạo",
|
"theme_setting_primary_color_title": "Màu chủ đạo",
|
||||||
"theme_setting_system_primary_color_title": "Dùng màu hệ thống",
|
"theme_setting_system_primary_color_title": "Dùng màu hệ thống",
|
||||||
"theme_setting_system_theme_switch": "Tự động (Giống thiết bị)",
|
"theme_setting_system_theme_switch": "Tự động (Giống thiết bị)",
|
||||||
"theme_setting_theme_subtitle": "Chọn cài đặt giao diện ứng dụng",
|
"theme_setting_theme_subtitle": "Chọn cài đặt giao diện app",
|
||||||
"theme_setting_three_stage_loading_subtitle": "Tải ba giai đoạn có thể tăng tốc độ tải ảnh nhưng sẽ tốn dữ liệu mạng đáng kể",
|
"theme_setting_three_stage_loading_subtitle": "Tải ba giai đoạn có thể tăng tốc độ tải ảnh nhưng sẽ tốn dữ liệu mạng đáng kể",
|
||||||
"theme_setting_three_stage_loading_title": "Bật tải ba giai đoạn",
|
"theme_setting_three_stage_loading_title": "Bật tải ba giai đoạn",
|
||||||
"then": "Tiếp theo",
|
"then": "Tiếp theo",
|
||||||
@@ -2276,7 +2276,7 @@
|
|||||||
"troubleshoot": "Khắc phục sự cố",
|
"troubleshoot": "Khắc phục sự cố",
|
||||||
"type": "Loại",
|
"type": "Loại",
|
||||||
"unable_to_change_pin_code": "Thay đổi mã PIN thất bại",
|
"unable_to_change_pin_code": "Thay đổi mã PIN thất bại",
|
||||||
"unable_to_check_version": "Không thể kiểm tra phiên bản ứng dụng hoặc máy chủ",
|
"unable_to_check_version": "Không thể kiểm tra phiên bản app hoặc máy chủ",
|
||||||
"unable_to_setup_pin_code": "Thiết lập mã PIN thất bại",
|
"unable_to_setup_pin_code": "Thiết lập mã PIN thất bại",
|
||||||
"unarchive": "Bỏ lưu trữ",
|
"unarchive": "Bỏ lưu trữ",
|
||||||
"unarchive_action_prompt": "{count} đã bỏ khỏi Lưu trữ",
|
"unarchive_action_prompt": "{count} đã bỏ khỏi Lưu trữ",
|
||||||
|
|||||||
@@ -87,7 +87,6 @@
|
|||||||
"external_libraries_page_description": "管理外部媒體庫嘅頁面",
|
"external_libraries_page_description": "管理外部媒體庫嘅頁面",
|
||||||
"face_detection": "人面偵測",
|
"face_detection": "人面偵測",
|
||||||
"face_detection_description": "使用機器學習偵測項目中嘅臉孔。對於影片,只係會分析縮圖。「重新整理」會重新處理所有嘅項目;「重設」就會額外清除目前嘅臉孔資料;「加入排程」會將尚未處理嘅項目加入序列。完成「臉孔偵測」後,偵測到嘅臉孔將會加入「臉孔辨識」排程,並歸類到而家或者新嘅人物群組。",
|
"face_detection_description": "使用機器學習偵測項目中嘅臉孔。對於影片,只係會分析縮圖。「重新整理」會重新處理所有嘅項目;「重設」就會額外清除目前嘅臉孔資料;「加入排程」會將尚未處理嘅項目加入序列。完成「臉孔偵測」後,偵測到嘅臉孔將會加入「臉孔辨識」排程,並歸類到而家或者新嘅人物群組。",
|
||||||
"facial_recognition_job_description": "將偵測到嘅臉孔歸類為人物。此步驟會在臉孔偵測完成後執行。「重設」會重新對所有嘅臉孔進行分群;「加入排程」就會將未指派人物嘅臉孔加入序列。",
|
|
||||||
"failed_job_command": "執行{job}任務嘅{command}指令失敗",
|
"failed_job_command": "執行{job}任務嘅{command}指令失敗",
|
||||||
"force_delete_user_warning": "警告:呢個會立即刪除用戶同埋佢所有嘅檔案。呢個係無法撤銷嘅動作,而且刪除嘅檔案將冇辦法復原。",
|
"force_delete_user_warning": "警告:呢個會立即刪除用戶同埋佢所有嘅檔案。呢個係無法撤銷嘅動作,而且刪除嘅檔案將冇辦法復原。",
|
||||||
"image_format": "格式",
|
"image_format": "格式",
|
||||||
@@ -100,7 +99,6 @@
|
|||||||
"image_prefer_embedded_preview": "偏向嵌入預覽",
|
"image_prefer_embedded_preview": "偏向嵌入預覽",
|
||||||
"image_prefer_embedded_preview_setting_description": "喺可用嘅時候將 RAW 相片中的內嵌預覽作為影像處理嘅輸入來源。雖然呢個設定可以令到部分相片嘅色彩更加準確,但預覽品質取決於相機,且影像可能會出現較多壓縮瑕疵。",
|
"image_prefer_embedded_preview_setting_description": "喺可用嘅時候將 RAW 相片中的內嵌預覽作為影像處理嘅輸入來源。雖然呢個設定可以令到部分相片嘅色彩更加準確,但預覽品質取決於相機,且影像可能會出現較多壓縮瑕疵。",
|
||||||
"image_prefer_wide_gamut": "傾向廣色域",
|
"image_prefer_wide_gamut": "傾向廣色域",
|
||||||
"image_prefer_wide_gamut_setting_description": "使用 Display P3 製作縮圖:可以更好地保留廣色域影像嘅鮮豔度,但係喺舊裝置同舊版瀏覽器上,影像呈現嘅效果可能會有所唔同。sRGB 影像會保留為 sRGB,以避免色彩偏移。",
|
|
||||||
"image_preview_description": "中等尺寸嘅圖片,用嚟檢視單一影像同埋機器學習",
|
"image_preview_description": "中等尺寸嘅圖片,用嚟檢視單一影像同埋機器學習",
|
||||||
"image_preview_title": "預覽設定",
|
"image_preview_title": "預覽設定",
|
||||||
"image_progressive": "逐步",
|
"image_progressive": "逐步",
|
||||||
|
|||||||
+5
-9
@@ -40,7 +40,7 @@
|
|||||||
"add_to_albums_count": "添加到相册 ({count})",
|
"add_to_albums_count": "添加到相册 ({count})",
|
||||||
"add_to_bottom_bar": "添加到",
|
"add_to_bottom_bar": "添加到",
|
||||||
"add_to_shared_album": "添加到共享相册",
|
"add_to_shared_album": "添加到共享相册",
|
||||||
"add_upload_to_stack": "添加上传至堆叠",
|
"add_upload_to_stack": "添加上传至堆栈",
|
||||||
"add_url": "添加 URL",
|
"add_url": "添加 URL",
|
||||||
"add_workflow_step": "添加工作流步骤",
|
"add_workflow_step": "添加工作流步骤",
|
||||||
"added_to_archive": "添加至存档",
|
"added_to_archive": "添加至存档",
|
||||||
@@ -622,7 +622,7 @@
|
|||||||
"backup": "备份",
|
"backup": "备份",
|
||||||
"backup_album_selection_page_albums_device": "设备上的相簿({count})",
|
"backup_album_selection_page_albums_device": "设备上的相簿({count})",
|
||||||
"backup_album_selection_page_albums_tap": "单击包含,双击排除",
|
"backup_album_selection_page_albums_tap": "单击包含,双击排除",
|
||||||
"backup_album_selection_page_assets_scatter": "资源可以分散在多个相册中。因此,在备份过程中,可以包含或排除某些相册。",
|
"backup_album_selection_page_assets_scatter": "选择包含或排除特定的相簿。(因为文件可能分散在多个相簿中)",
|
||||||
"backup_album_selection_page_select_albums": "选择相簿",
|
"backup_album_selection_page_select_albums": "选择相簿",
|
||||||
"backup_album_selection_page_selection_info": "选择信息",
|
"backup_album_selection_page_selection_info": "选择信息",
|
||||||
"backup_album_selection_page_total_assets": "选中的照片或视频总数",
|
"backup_album_selection_page_total_assets": "选中的照片或视频总数",
|
||||||
@@ -809,7 +809,7 @@
|
|||||||
"confirm_admin_password": "确认管理员密码",
|
"confirm_admin_password": "确认管理员密码",
|
||||||
"confirm_delete_face": "确定要从此文件中删除 {name} 的面部信息吗?",
|
"confirm_delete_face": "确定要从此文件中删除 {name} 的面部信息吗?",
|
||||||
"confirm_delete_shared_link": "确定要删除此共享链接吗?",
|
"confirm_delete_shared_link": "确定要删除此共享链接吗?",
|
||||||
"confirm_keep_this_delete_others": "堆叠中除此项目外的所有其他项目都将被删除。确定要继续吗?",
|
"confirm_keep_this_delete_others": "堆栈中除此项目外的所有其他项目都将被删除。确定要继续吗?",
|
||||||
"confirm_new_pin_code": "确认新 PIN 码",
|
"confirm_new_pin_code": "确认新 PIN 码",
|
||||||
"confirm_password": "确认密码",
|
"confirm_password": "确认密码",
|
||||||
"confirm_tag_face": "是否将此人脸标记为 {name}?",
|
"confirm_tag_face": "是否将此人脸标记为 {name}?",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "创建共享链接",
|
"create_link_to_share": "创建共享链接",
|
||||||
"create_link_to_share_description": "允许任何拥有链接的人查看所选照片",
|
"create_link_to_share_description": "允许任何拥有链接的人查看所选照片",
|
||||||
"create_new": "新建",
|
"create_new": "新建",
|
||||||
"create_new_face": "创建新人脸",
|
|
||||||
"create_new_person": "创建新人物",
|
"create_new_person": "创建新人物",
|
||||||
"create_new_person_hint": "将所选照片/视频分配给新人物",
|
"create_new_person_hint": "将所选照片/视频分配给新人物",
|
||||||
"create_new_user": "新建用户",
|
"create_new_user": "新建用户",
|
||||||
"create_person": "创建人物",
|
|
||||||
"create_person_subtitle": "为所选人脸添加姓名,以创建并标记新人物",
|
|
||||||
"create_shared_album_page_share_add_assets": "添加照片/视频",
|
"create_shared_album_page_share_add_assets": "添加照片/视频",
|
||||||
"create_shared_album_page_share_select_photos": "选择照片",
|
"create_shared_album_page_share_select_photos": "选择照片",
|
||||||
"create_shared_link": "创建共享链接",
|
"create_shared_link": "创建共享链接",
|
||||||
@@ -1635,7 +1632,7 @@
|
|||||||
"notifications": "通知",
|
"notifications": "通知",
|
||||||
"notifications_setting_description": "管理通知",
|
"notifications_setting_description": "管理通知",
|
||||||
"oauth": "OAuth",
|
"oauth": "OAuth",
|
||||||
"obtainium_configurator": "Obtainium 配置器",
|
"obtainium_configurator": "Obtainium配置器",
|
||||||
"obtainium_configurator_instructions": "使用 Obtainium 直接从 Immich 的 GitHub 发布页安装和更新 Android 应用。请创建一个 API 密钥并选择一个版本,以生成你的 Obtainium 配置链接",
|
"obtainium_configurator_instructions": "使用 Obtainium 直接从 Immich 的 GitHub 发布页安装和更新 Android 应用。请创建一个 API 密钥并选择一个版本,以生成你的 Obtainium 配置链接",
|
||||||
"ocr": "OCR",
|
"ocr": "OCR",
|
||||||
"official_immich_resources": "Immich官方资源",
|
"official_immich_resources": "Immich官方资源",
|
||||||
@@ -1710,7 +1707,7 @@
|
|||||||
"permanent_deletion_warning_setting_description": "永久删除照片/视频时显示警告",
|
"permanent_deletion_warning_setting_description": "永久删除照片/视频时显示警告",
|
||||||
"permanently_delete": "永久删除",
|
"permanently_delete": "永久删除",
|
||||||
"permanently_delete_assets_count": "永久删除{count, plural, one {个项目} other {个项目}}",
|
"permanently_delete_assets_count": "永久删除{count, plural, one {个项目} other {个项目}}",
|
||||||
"permanently_delete_assets_prompt": "确定要永久删除 {count, plural, one {此项目吗?} other {这 <b>#</b> 个项目吗?}}这也会将{count, plural, one {其} other {它们}}从所属相簿中移除。",
|
"permanently_delete_assets_prompt": "确定要永久删除 {count, plural, one {此项目吗?} other {这<b>#</b>个项目吗?}}这也会将{count, plural, one {其} other {它们}}从所属相簿中移除。",
|
||||||
"permanently_deleted_asset": "永久删除的项目",
|
"permanently_deleted_asset": "永久删除的项目",
|
||||||
"permanently_deleted_assets_count": "已永久删除{count, plural, one {#个项目} other {#个项目}}",
|
"permanently_deleted_assets_count": "已永久删除{count, plural, one {#个项目} other {#个项目}}",
|
||||||
"permission": "权限",
|
"permission": "权限",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "标签",
|
"tag": "标签",
|
||||||
"tag_assets": "标记项目",
|
"tag_assets": "标记项目",
|
||||||
"tag_created": "已创建标签:{tag}",
|
"tag_created": "已创建标签:{tag}",
|
||||||
"tag_face": "标记人脸",
|
|
||||||
"tag_feature_description": "按逻辑标签分组并浏览照片和视频",
|
"tag_feature_description": "按逻辑标签分组并浏览照片和视频",
|
||||||
"tag_not_found_question": "找不到标签吗?<link>创建新标签。</link>",
|
"tag_not_found_question": "找不到标签吗?<link>创建新标签。</link>",
|
||||||
"tag_people": "命名人物",
|
"tag_people": "命名人物",
|
||||||
|
|||||||
+79
-83
@@ -54,7 +54,7 @@
|
|||||||
"authentication_settings_description": "管理密碼、OAuth 與其他驗證設定",
|
"authentication_settings_description": "管理密碼、OAuth 與其他驗證設定",
|
||||||
"authentication_settings_disable_all": "您確定要停用所有登入方式嗎?這將導致完全無法登入。",
|
"authentication_settings_disable_all": "您確定要停用所有登入方式嗎?這將導致完全無法登入。",
|
||||||
"authentication_settings_reenable": "如需重新啟用,請使用 <link>伺服器指令</link>。",
|
"authentication_settings_reenable": "如需重新啟用,請使用 <link>伺服器指令</link>。",
|
||||||
"background_task_job": "背景任務",
|
"background_task_job": "背景工作",
|
||||||
"backup_database": "建立資料庫備份",
|
"backup_database": "建立資料庫備份",
|
||||||
"backup_database_enable_description": "啟用資料庫備份",
|
"backup_database_enable_description": "啟用資料庫備份",
|
||||||
"backup_keep_last_amount": "保留先前備份的數量",
|
"backup_keep_last_amount": "保留先前備份的數量",
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
"backup_onboarding_3_description": "您資料的總備份份數,包括原始檔案在內。這包括 1 份異地備份與 2 份本機副本。",
|
"backup_onboarding_3_description": "您資料的總備份份數,包括原始檔案在內。這包括 1 份異地備份與 2 份本機副本。",
|
||||||
"backup_onboarding_description": "建議採用 <backblaze-link>3-2-1 備份策略</backblaze-link> 來保護您的資料。您應保留已上傳的相片/影片副本,以及 Immich 資料庫,以建立完整的備份方案。",
|
"backup_onboarding_description": "建議採用 <backblaze-link>3-2-1 備份策略</backblaze-link> 來保護您的資料。您應保留已上傳的相片/影片副本,以及 Immich 資料庫,以建立完整的備份方案。",
|
||||||
"backup_onboarding_footer": "更多備份 Immich 資訊,請參考 <link>說明文件</link>。",
|
"backup_onboarding_footer": "更多備份 Immich 資訊,請參考 <link>說明文件</link>。",
|
||||||
"backup_onboarding_parts_title": "3-2-1 備份包含:",
|
"backup_onboarding_parts_title": "遵從備份原則 3-2-1:",
|
||||||
"backup_onboarding_title": "備份",
|
"backup_onboarding_title": "備份",
|
||||||
"backup_settings": "資料庫備份設定",
|
"backup_settings": "資料庫備份設定",
|
||||||
"backup_settings_description": "管理資料庫備份設定。",
|
"backup_settings_description": "管理資料庫備份設定。",
|
||||||
@@ -81,20 +81,20 @@
|
|||||||
"cron_expression_description": "使用 Cron 格式設定掃描間隔。更多資訊請參閱 <link>Crontab Guru</link>",
|
"cron_expression_description": "使用 Cron 格式設定掃描間隔。更多資訊請參閱 <link>Crontab Guru</link>",
|
||||||
"cron_expression_presets": "Cron 表達式預設值",
|
"cron_expression_presets": "Cron 表達式預設值",
|
||||||
"disable_login": "停用登入",
|
"disable_login": "停用登入",
|
||||||
"duplicate_detection_job_description": "針對資產執行機器學習以偵測相似圖片。需依賴「智慧搜尋」功能",
|
"duplicate_detection_job_description": "依靠智慧搜尋。對項目執行機器學習來偵測相似圖片",
|
||||||
"exclusion_pattern_description": "排除模式可讓您在掃描媒體庫時忽略特定檔案與資料夾。若某些資料夾包含您不想匯入的檔案(例如 RAW 檔),此功能將非常有用。",
|
"exclusion_pattern_description": "排除模式可讓您在掃描媒體庫時忽略特定檔案與資料夾。若某些資料夾包含您不想匯入的檔案(例如 RAW 檔),此功能將非常有用。",
|
||||||
"export_config_as_json_description": "將目前系統設定下載為 JSON 檔案",
|
"export_config_as_json_description": "將目前系統設定下載為 JSON 檔案",
|
||||||
"external_libraries_page_description": "管理外部媒體庫頁面",
|
"external_libraries_page_description": "管理外部媒體庫頁面",
|
||||||
"face_detection": "臉孔偵測",
|
"face_detection": "臉孔偵測",
|
||||||
"face_detection_description": "使用機器學習偵測項目中的臉孔。對於影片,僅會分析縮圖。「重新整理」會重新處理所有項目;「重設」則會額外清除目前的臉孔資料;「加入排程」會將尚未處理的項目加入佇列。完成「臉孔偵測」後,偵測到的臉孔將加入「臉孔辨識」排程,並歸類至現有或新的人物群組。",
|
"face_detection_description": "使用機器學習偵測項目中的臉孔。對於影片,僅會分析縮圖。「重新整理」會重新處理所有項目;「重設」則會額外清除目前的臉孔資料;「加入排程」會將尚未處理的項目加入序列。完成「臉孔偵測」後,偵測到的臉孔將加入「臉孔辨識」排程,並歸類至現有或新的人物群組。",
|
||||||
"facial_recognition_job_description": "將偵測到的臉孔歸類為人物。此步驟會在臉孔偵測完成後執行。「重設」會重新對所有臉孔進行分群;「加入排程」則會將尚未指派人物的臉孔加入佇列。",
|
"facial_recognition_job_description": "將偵測到的臉孔歸類為人物。此步驟會在臉孔偵測完成後執行。「重設」會重新對所有臉孔進行分群;「加入排程」則會將尚未指派人物的臉孔加入序列。",
|
||||||
"failed_job_command": "{job} 任務的 {command} 指令執行失敗",
|
"failed_job_command": "{job} 任務的 {command} 指令執行失敗",
|
||||||
"force_delete_user_warning": "警告:這將立即刪除使用者及其所有項目。此動作無法復原,且無法找回已刪除的檔案。",
|
"force_delete_user_warning": "警告:這將立即刪除使用者及其所有項目。此動作無法復原,且無法找回已刪除的檔案。",
|
||||||
"image_format": "格式",
|
"image_format": "格式",
|
||||||
"image_format_description": "WebP 能產生相對於 JPEG 更小的檔案,但編碼速度較慢。",
|
"image_format_description": "WebP 能產生相對於 JPEG 更小的檔案,但編碼速度較慢。",
|
||||||
"image_fullsize_description": "移除中繼資料的大尺寸影像,在放大圖片時使用",
|
"image_fullsize_description": "移除中繼資料的大尺寸影像,在放大圖片時使用",
|
||||||
"image_fullsize_enabled": "啟用大尺寸影像產生",
|
"image_fullsize_enabled": "啟用大尺寸影像產生",
|
||||||
"image_fullsize_enabled_description": "為非網頁相容格式產生大尺寸相片。啟用「偏好內嵌預覽」時,系統將直接使用內嵌預覽而不進行轉碼,不影響 JPEG 等網頁相容格式。",
|
"image_fullsize_enabled_description": "為非網頁友善格式產生大尺寸相片。啟用「偏好內嵌預覽」時,系統將直接使用內嵌預覽而不進行轉碼,不影響 JPEG 等網頁友善格式。",
|
||||||
"image_fullsize_quality_description": "大尺寸影像品質,範圍為 1 到 100。數值越高品質越好,但檔案也會越大。",
|
"image_fullsize_quality_description": "大尺寸影像品質,範圍為 1 到 100。數值越高品質越好,但檔案也會越大。",
|
||||||
"image_fullsize_title": "大尺寸影像設定",
|
"image_fullsize_title": "大尺寸影像設定",
|
||||||
"image_prefer_embedded_preview": "偏好內嵌預覽",
|
"image_prefer_embedded_preview": "偏好內嵌預覽",
|
||||||
@@ -104,14 +104,14 @@
|
|||||||
"image_preview_description": "中等尺寸影像(不含中繼資料),用於檢視單一項目與機器學習",
|
"image_preview_description": "中等尺寸影像(不含中繼資料),用於檢視單一項目與機器學習",
|
||||||
"image_preview_quality_description": "預覽品質範圍為 1 到 100。數值越高品質越好,但檔案也會更大,並可能降低應用程式的回應速度。設定過低的數值可能會影響機器學習的品質。",
|
"image_preview_quality_description": "預覽品質範圍為 1 到 100。數值越高品質越好,但檔案也會更大,並可能降低應用程式的回應速度。設定過低的數值可能會影響機器學習的品質。",
|
||||||
"image_preview_title": "預覽設定",
|
"image_preview_title": "預覽設定",
|
||||||
"image_progressive": "漸進式",
|
"image_progressive": "逐步",
|
||||||
"image_progressive_description": "對 JPEG 影像進行漸進式編碼,以達成漸進式載入顯示。這不會影響 WebP 影像。",
|
"image_progressive_description": "對 JPEG 影像進行漸進式編碼,以實現漸進式載入顯示。這不會影響 WebP 影像。",
|
||||||
"image_quality": "品質",
|
"image_quality": "品質",
|
||||||
"image_resolution": "解析度",
|
"image_resolution": "解析度",
|
||||||
"image_resolution_description": "較高的解析度能保留更多細節,但編碼時間會更長、檔案大小會更大,並可能降低應用程式的回應速度。",
|
"image_resolution_description": "較高的解析度能保留更多細節,但編碼時間會更長、檔案大小會更大,並可能降低應用程式的回應速度。",
|
||||||
"image_settings": "圖片設定",
|
"image_settings": "圖片設定",
|
||||||
"image_settings_description": "管理產生的影像品質與解析度",
|
"image_settings_description": "管理產生的影像品質與解析度",
|
||||||
"image_thumbnail_description": "已移除中繼資料的小型縮圖,用於檢視多張相片(如主時間軸)",
|
"image_thumbnail_description": "移除中繼資料的小型縮圖,以用於檢視大量相片時使用,例如主時間軸",
|
||||||
"image_thumbnail_quality_description": "縮圖品質範圍為 1 到 100。數值越高品質越好,但檔案也會更大,並可能降低應用程式的回應速度。",
|
"image_thumbnail_quality_description": "縮圖品質範圍為 1 到 100。數值越高品質越好,但檔案也會更大,並可能降低應用程式的回應速度。",
|
||||||
"image_thumbnail_title": "縮圖設定",
|
"image_thumbnail_title": "縮圖設定",
|
||||||
"import_config_from_json_description": "透過上傳 JSON 設定檔匯入系統設定",
|
"import_config_from_json_description": "透過上傳 JSON 設定檔匯入系統設定",
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
"machine_learning_facial_recognition": "人臉辨識",
|
"machine_learning_facial_recognition": "人臉辨識",
|
||||||
"machine_learning_facial_recognition_description": "偵測、辨識並對圖片中的臉孔分類",
|
"machine_learning_facial_recognition_description": "偵測、辨識並對圖片中的臉孔分類",
|
||||||
"machine_learning_facial_recognition_model": "人臉辨識模型",
|
"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": "啟用人臉辨識",
|
||||||
"machine_learning_facial_recognition_setting_description": "若停用,影像將不會進行人臉辨識編碼,且「探索」頁面的「人物」區塊將不會顯示任何內容。",
|
"machine_learning_facial_recognition_setting_description": "若停用,影像將不會進行人臉辨識編碼,且「探索」頁面的「人物」區塊將不會顯示任何內容。",
|
||||||
"machine_learning_max_detection_distance": "偵測距離上限",
|
"machine_learning_max_detection_distance": "偵測距離上限",
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
"machine_learning_min_recognized_faces_description": "建立新人物所需的最低已辨識臉孔數量。提高此數值可讓臉孔辨識更精確,但同時會增加臉孔未被指派給任何人物的可能性。",
|
"machine_learning_min_recognized_faces_description": "建立新人物所需的最低已辨識臉孔數量。提高此數值可讓臉孔辨識更精確,但同時會增加臉孔未被指派給任何人物的可能性。",
|
||||||
"machine_learning_ocr": "文字辨識(OCR)",
|
"machine_learning_ocr": "文字辨識(OCR)",
|
||||||
"machine_learning_ocr_description": "使用機器學習辨識影像中的文字",
|
"machine_learning_ocr_description": "使用機器學習辨識影像中的文字",
|
||||||
"machine_learning_ocr_enabled": "啟用 OCR",
|
"machine_learning_ocr_enabled": "啟用OCR",
|
||||||
"machine_learning_ocr_enabled_description": "若停用,影像將不會進行文字辨識。",
|
"machine_learning_ocr_enabled_description": "若停用,影像將不會進行文字辨識。",
|
||||||
"machine_learning_ocr_max_resolution": "最大解析度",
|
"machine_learning_ocr_max_resolution": "最大解析度",
|
||||||
"machine_learning_ocr_max_resolution_description": "解析度高於此值的預覽影像將在保持長寬比的情況下調整大小。數值越高越準確,但處理時間更長且會佔用更多記憶體。",
|
"machine_learning_ocr_max_resolution_description": "解析度高於此值的預覽影像將在保持長寬比的情況下調整大小。數值越高越準確,但處理時間更長且會佔用更多記憶體。",
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
"machine_learning_ocr_min_detection_score_description": "文字偵測的最低信心分數,範圍為 0 - 1。較低的數值會偵測到更多文字,但可能導致誤判。",
|
"machine_learning_ocr_min_detection_score_description": "文字偵測的最低信心分數,範圍為 0 - 1。較低的數值會偵測到更多文字,但可能導致誤判。",
|
||||||
"machine_learning_ocr_min_recognition_score": "最低辨識分數",
|
"machine_learning_ocr_min_recognition_score": "最低辨識分數",
|
||||||
"machine_learning_ocr_min_score_recognition_description": "已偵測文字的最低辨識信心分數,範圍為 0 - 1。較低的數值會辨識出更多文字,但可能導致誤判。",
|
"machine_learning_ocr_min_score_recognition_description": "已偵測文字的最低辨識信心分數,範圍為 0 - 1。較低的數值會辨識出更多文字,但可能導致誤判。",
|
||||||
"machine_learning_ocr_model": "OCR 模型",
|
"machine_learning_ocr_model": "OCR模型",
|
||||||
"machine_learning_ocr_model_description": "伺服器模型比行動裝置模型更準確,但處理時間較長且會佔用更多記憶體。",
|
"machine_learning_ocr_model_description": "伺服器模型比行動裝置模型更準確,但處理時間較長且會佔用更多記憶體。",
|
||||||
"machine_learning_settings": "機器學習設定",
|
"machine_learning_settings": "機器學習設定",
|
||||||
"machine_learning_settings_description": "管理機器學習的功能和設定",
|
"machine_learning_settings_description": "管理機器學習的功能和設定",
|
||||||
@@ -257,7 +257,7 @@
|
|||||||
"notification_email_password_description": "用於與電子郵件伺服器驗證的密碼",
|
"notification_email_password_description": "用於與電子郵件伺服器驗證的密碼",
|
||||||
"notification_email_port_description": "電子郵件伺服器的連接埠(例如 25、465 或 587)",
|
"notification_email_port_description": "電子郵件伺服器的連接埠(例如 25、465 或 587)",
|
||||||
"notification_email_secure": "SMTPS",
|
"notification_email_secure": "SMTPS",
|
||||||
"notification_email_secure_description": "使用 SMTPS(基於 TLS 的 SMTP)",
|
"notification_email_secure_description": "使用SMTPS(基於TLS的SMTP)",
|
||||||
"notification_email_sent_test_email_button": "傳送測試電子郵件並儲存",
|
"notification_email_sent_test_email_button": "傳送測試電子郵件並儲存",
|
||||||
"notification_email_setting_description": "寄送電子郵件通知的設定",
|
"notification_email_setting_description": "寄送電子郵件通知的設定",
|
||||||
"notification_email_test_email": "傳送測試電子郵件",
|
"notification_email_test_email": "傳送測試電子郵件",
|
||||||
@@ -281,11 +281,11 @@
|
|||||||
"oauth_role_claim_description": "根據此宣告的存在,自動授予管理員權限。該宣告的值可以是 'user' 或 'admin'。",
|
"oauth_role_claim_description": "根據此宣告的存在,自動授予管理員權限。該宣告的值可以是 'user' 或 'admin'。",
|
||||||
"oauth_settings": "OAuth",
|
"oauth_settings": "OAuth",
|
||||||
"oauth_settings_description": "管理 OAuth 登入設定",
|
"oauth_settings_description": "管理 OAuth 登入設定",
|
||||||
"oauth_settings_more_details": "若要瞭解此功能的詳細資訊,請參閱 <link>說明文件</link>。",
|
"oauth_settings_more_details": "欲瞭解此功能,請參閱 <link>說明書</link>。",
|
||||||
"oauth_storage_label_claim": "儲存標籤宣告",
|
"oauth_storage_label_claim": "儲存標籤宣告",
|
||||||
"oauth_storage_label_claim_description": "自動將使用者的儲存標籤設定為此宣告之值。",
|
"oauth_storage_label_claim_description": "自動將使用者的儲存標籤定為此宣告之值。",
|
||||||
"oauth_storage_quota_claim": "儲存配額宣告",
|
"oauth_storage_quota_claim": "儲存配額宣告",
|
||||||
"oauth_storage_quota_claim_description": "自動將使用者的儲存配額設定為此宣告之值。",
|
"oauth_storage_quota_claim_description": "自動將使用者的儲存配額定為此宣告之值。",
|
||||||
"oauth_storage_quota_default": "預設儲存配額(GiB)",
|
"oauth_storage_quota_default": "預設儲存配額(GiB)",
|
||||||
"oauth_storage_quota_default_description": "未提供宣告時所使用的配額(GiB)。",
|
"oauth_storage_quota_default_description": "未提供宣告時所使用的配額(GiB)。",
|
||||||
"oauth_timeout": "請求逾時",
|
"oauth_timeout": "請求逾時",
|
||||||
@@ -297,8 +297,8 @@
|
|||||||
"paths_validated_successfully": "所有路徑驗證成功",
|
"paths_validated_successfully": "所有路徑驗證成功",
|
||||||
"person_cleanup_job": "清理人物",
|
"person_cleanup_job": "清理人物",
|
||||||
"queue_details": "佇列資訊",
|
"queue_details": "佇列資訊",
|
||||||
"queues": "任務佇列",
|
"queues": "任務排程",
|
||||||
"queues_page_description": "管理員任務佇列頁面",
|
"queues_page_description": "序列排程管理界面",
|
||||||
"quota_size_gib": "配額大小(GiB)",
|
"quota_size_gib": "配額大小(GiB)",
|
||||||
"refreshing_all_libraries": "正在重新整理所有媒體庫",
|
"refreshing_all_libraries": "正在重新整理所有媒體庫",
|
||||||
"registration": "管理者註冊",
|
"registration": "管理者註冊",
|
||||||
@@ -320,8 +320,8 @@
|
|||||||
"server_welcome_message": "歡迎訊息",
|
"server_welcome_message": "歡迎訊息",
|
||||||
"server_welcome_message_description": "在登入頁面顯示的訊息。",
|
"server_welcome_message_description": "在登入頁面顯示的訊息。",
|
||||||
"settings_page_description": "管理設定頁面",
|
"settings_page_description": "管理設定頁面",
|
||||||
"sidecar_job": "附屬檔案中繼資料",
|
"sidecar_job": "側接檔案中繼資料",
|
||||||
"sidecar_job_description": "從檔案系統偵測或同步附屬檔案中繼資料",
|
"sidecar_job_description": "從檔案系統偵測或同步側接檔案中繼資料",
|
||||||
"slideshow_duration_description": "每張圖片放映的秒數",
|
"slideshow_duration_description": "每張圖片放映的秒數",
|
||||||
"smart_search_job_description": "對項目執行機器學習以支援智慧搜尋",
|
"smart_search_job_description": "對項目執行機器學習以支援智慧搜尋",
|
||||||
"storage_template_date_time_description": "檔案的建立時間戳會用於日期與時間資訊",
|
"storage_template_date_time_description": "檔案的建立時間戳會用於日期與時間資訊",
|
||||||
@@ -428,8 +428,8 @@
|
|||||||
"user_delete_delay": "<b>{user}</b> 的帳號和項目會在 {delay, plural, one {# 天} other {# 天}} 後永久刪除。",
|
"user_delete_delay": "<b>{user}</b> 的帳號和項目會在 {delay, plural, one {# 天} other {# 天}} 後永久刪除。",
|
||||||
"user_delete_delay_settings": "延後刪除",
|
"user_delete_delay_settings": "延後刪除",
|
||||||
"user_delete_delay_settings_description": "自移除後起算的天數,逾期後將永久刪除使用者帳號與項目。使用者刪除作業會在每日午夜執行,以檢查符合刪除條件的帳號。此設定的變更將在下一次執行時生效。",
|
"user_delete_delay_settings_description": "自移除後起算的天數,逾期後將永久刪除使用者帳號與項目。使用者刪除作業會在每日午夜執行,以檢查符合刪除條件的帳號。此設定的變更將在下一次執行時生效。",
|
||||||
"user_delete_immediately": "<b>{user}</b> 的帳號與項目將 <b>立即</b> 排入永久刪除佇列。",
|
"user_delete_immediately": "<b>{user}</b> 的帳號與項目將 <b>立即</b> 排入永久刪除序列。",
|
||||||
"user_delete_immediately_checkbox": "立即將使用者與項目排入永久刪除佇列",
|
"user_delete_immediately_checkbox": "立即將使用者與項目排入永久刪除序列",
|
||||||
"user_details": "使用者詳細資訊",
|
"user_details": "使用者詳細資訊",
|
||||||
"user_management": "使用者管理",
|
"user_management": "使用者管理",
|
||||||
"user_password_has_been_reset": "使用者密碼已重設:",
|
"user_password_has_been_reset": "使用者密碼已重設:",
|
||||||
@@ -493,7 +493,7 @@
|
|||||||
"album_selected": "已選取相簿",
|
"album_selected": "已選取相簿",
|
||||||
"album_share_no_users": "看來您與所有使用者共享了這本相簿,或沒有其他使用者可供分享。",
|
"album_share_no_users": "看來您與所有使用者共享了這本相簿,或沒有其他使用者可供分享。",
|
||||||
"album_summary": "相簿摘要",
|
"album_summary": "相簿摘要",
|
||||||
"album_updated": "相簿已更新",
|
"album_updated": "更新相簿時",
|
||||||
"album_updated_setting_description": "當共享相簿有新項目時用電子郵件通知我",
|
"album_updated_setting_description": "當共享相簿有新項目時用電子郵件通知我",
|
||||||
"album_upload_assets": "從您的電腦上傳檔案並加入相簿",
|
"album_upload_assets": "從您的電腦上傳檔案並加入相簿",
|
||||||
"album_user_left": "離開 {album}",
|
"album_user_left": "離開 {album}",
|
||||||
@@ -508,11 +508,11 @@
|
|||||||
"album_viewer_page_share_add_users": "邀請其他人",
|
"album_viewer_page_share_add_users": "邀請其他人",
|
||||||
"album_with_link_access": "任何擁有連結的人皆可檢視此相簿中的相片與人物。",
|
"album_with_link_access": "任何擁有連結的人皆可檢視此相簿中的相片與人物。",
|
||||||
"albums": "相簿",
|
"albums": "相簿",
|
||||||
"albums_count": "{count, plural, one {{count, number} 本相簿} other {{count, number} 本相簿}}",
|
"albums_count": "{count, plural, one {{count, number} 個相簿} other {{count, number} 個相簿}}",
|
||||||
"albums_default_sort_order": "預設相簿排序",
|
"albums_default_sort_order": "預設相簿排序",
|
||||||
"albums_default_sort_order_description": "建立新相簿時要初始化項目排序方式。",
|
"albums_default_sort_order_description": "建立新相簿時要初始化項目排序方式。",
|
||||||
"albums_feature_description": "可共享給其他使用者的項目集合。",
|
"albums_feature_description": "可共享給其他使用者的項目集合。",
|
||||||
"albums_on_device_count": "此裝置有 ({count}) 本相簿",
|
"albums_on_device_count": "此裝置有 ({count}) 個相簿",
|
||||||
"albums_selected": "{count, plural, one {已選取 # 本相簿} other {已選取 # 本相簿}}",
|
"albums_selected": "{count, plural, one {已選取 # 本相簿} other {已選取 # 本相簿}}",
|
||||||
"all": "全部",
|
"all": "全部",
|
||||||
"all_albums": "所有相簿",
|
"all_albums": "所有相簿",
|
||||||
@@ -591,7 +591,7 @@
|
|||||||
"assets_added_to_album_count": "已將 {count, plural, one {# 個項目} other {# 個項目}}加入至相簿",
|
"assets_added_to_album_count": "已將 {count, plural, one {# 個項目} other {# 個項目}}加入至相簿",
|
||||||
"assets_added_to_albums_count": "已將 {assetTotal, plural, other {# 個項目}} 新增至 {albumTotal, plural, other {# 本相簿}}",
|
"assets_added_to_albums_count": "已將 {assetTotal, plural, other {# 個項目}} 新增至 {albumTotal, plural, other {# 本相簿}}",
|
||||||
"assets_cannot_be_added_to_album_count": "無法將 {count, 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, other {# 個項目}} 加入任何相簿",
|
||||||
"assets_count": "{count, plural, one {# 個項目} other {# 個項目}}",
|
"assets_count": "{count, plural, one {# 個項目} other {# 個項目}}",
|
||||||
"assets_deleted_permanently": "已永久刪除 {count} 個項目",
|
"assets_deleted_permanently": "已永久刪除 {count} 個項目",
|
||||||
"assets_deleted_permanently_from_server": "已從 Immich 伺服器中永久移除 {count} 個項目",
|
"assets_deleted_permanently_from_server": "已從 Immich 伺服器中永久移除 {count} 個項目",
|
||||||
@@ -608,7 +608,7 @@
|
|||||||
"assets_trashed_count": "已將 {count, plural, one {# 個項目} other {# 個項目}}移至垃圾桶",
|
"assets_trashed_count": "已將 {count, plural, one {# 個項目} other {# 個項目}}移至垃圾桶",
|
||||||
"assets_trashed_from_server": "已從 Immich 伺服器將 {count} 個項目移至垃圾桶",
|
"assets_trashed_from_server": "已從 Immich 伺服器將 {count} 個項目移至垃圾桶",
|
||||||
"assets_were_part_of_album_count": "{count, plural, one {該項目已} other {這些項目已}}在相簿中",
|
"assets_were_part_of_album_count": "{count, plural, one {該項目已} other {這些項目已}}在相簿中",
|
||||||
"assets_were_part_of_albums_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_subtitle": "當可用時,透過指定的 Wi-Fi 在本機連線,其他情況則使用替代連線",
|
||||||
"automatic_endpoint_switching_title": "自動 URL 切換",
|
"automatic_endpoint_switching_title": "自動 URL 切換",
|
||||||
@@ -622,7 +622,7 @@
|
|||||||
"backup": "備份",
|
"backup": "備份",
|
||||||
"backup_album_selection_page_albums_device": "裝置上的相簿({count})",
|
"backup_album_selection_page_albums_device": "裝置上的相簿({count})",
|
||||||
"backup_album_selection_page_albums_tap": "點一下以選取,點兩下以排除",
|
"backup_album_selection_page_albums_tap": "點一下以選取,點兩下以排除",
|
||||||
"backup_album_selection_page_assets_scatter": "項目可以分散在多本相簿中,因此在備份過程中可以選擇納入或排除相簿。",
|
"backup_album_selection_page_assets_scatter": "項目可以分散在多個相簿中,因此在備份過程中可以選擇納入或排除相簿。",
|
||||||
"backup_album_selection_page_select_albums": "選取相簿",
|
"backup_album_selection_page_select_albums": "選取相簿",
|
||||||
"backup_album_selection_page_selection_info": "選取資訊",
|
"backup_album_selection_page_selection_info": "選取資訊",
|
||||||
"backup_album_selection_page_total_assets": "總不重複項目數",
|
"backup_album_selection_page_total_assets": "總不重複項目數",
|
||||||
@@ -761,11 +761,11 @@
|
|||||||
"city": "城市",
|
"city": "城市",
|
||||||
"cleanup_confirm_description": "Immich 發現有 {count} 個項目(建立於 {date} 之前)已安全備份至伺服器。是否要從此裝置中刪除本機副本?",
|
"cleanup_confirm_description": "Immich 發現有 {count} 個項目(建立於 {date} 之前)已安全備份至伺服器。是否要從此裝置中刪除本機副本?",
|
||||||
"cleanup_confirm_prompt_title": "從此裝置刪除?",
|
"cleanup_confirm_prompt_title": "從此裝置刪除?",
|
||||||
"cleanup_deleted_assets": "已將 {count} 個項目移到裝置的垃圾桶裡",
|
"cleanup_deleted_assets": "已將{count}項目移到裝置的垃圾桶裡",
|
||||||
"cleanup_deleting": "正在移動到垃圾桶...",
|
"cleanup_deleting": "正在移動到垃圾桶...",
|
||||||
"cleanup_found_assets": "找到 {count} 件已上傳的項目",
|
"cleanup_found_assets": "找到{count}件已上傳的項目",
|
||||||
"cleanup_found_assets_with_size": "找到 {count} 件,總共 ({size}) 已上傳的項目",
|
"cleanup_found_assets_with_size": "找到{count}件,總共({size})已上傳的項目",
|
||||||
"cleanup_icloud_shared_albums_excluded": "iCloud 共享相簿被排除於搜尋之外",
|
"cleanup_icloud_shared_albums_excluded": "iCloud共享相簿被排除於搜尋之外",
|
||||||
"cleanup_no_assets_found": "找不到符合上述條件的項目。釋放空間功能僅能移除已備份至伺服器的項目",
|
"cleanup_no_assets_found": "找不到符合上述條件的項目。釋放空間功能僅能移除已備份至伺服器的項目",
|
||||||
"cleanup_preview_title": "{count} 項需要移除的項目",
|
"cleanup_preview_title": "{count} 項需要移除的項目",
|
||||||
"cleanup_step3_description": "掃描符合日期與儲存設定的已備份項目。",
|
"cleanup_step3_description": "掃描符合日期與儲存設定的已備份項目。",
|
||||||
@@ -782,8 +782,8 @@
|
|||||||
"client_cert_import": "匯入",
|
"client_cert_import": "匯入",
|
||||||
"client_cert_import_success_msg": "已匯入用戶端憑證",
|
"client_cert_import_success_msg": "已匯入用戶端憑證",
|
||||||
"client_cert_invalid_msg": "無效的憑證檔案或密碼錯誤",
|
"client_cert_invalid_msg": "無效的憑證檔案或密碼錯誤",
|
||||||
"client_cert_password_message": "請輸入此憑證的密碼",
|
"client_cert_password_message": "請輸入此證書的密碼",
|
||||||
"client_cert_password_title": "憑證密碼",
|
"client_cert_password_title": "證書密碼",
|
||||||
"client_cert_remove_msg": "用戶端憑證已移除",
|
"client_cert_remove_msg": "用戶端憑證已移除",
|
||||||
"client_cert_subtitle": "僅支援 PKCS12 (.p12, .pfx) 格式。憑證匯入與移除僅可在登入前進行",
|
"client_cert_subtitle": "僅支援 PKCS12 (.p12, .pfx) 格式。憑證匯入與移除僅可在登入前進行",
|
||||||
"client_cert_title": "SSL 用戶端憑證 [實驗性]",
|
"client_cert_title": "SSL 用戶端憑證 [實驗性]",
|
||||||
@@ -794,7 +794,7 @@
|
|||||||
"color": "顏色",
|
"color": "顏色",
|
||||||
"color_theme": "色彩主題",
|
"color_theme": "色彩主題",
|
||||||
"command": "命令",
|
"command": "命令",
|
||||||
"command_palette_prompt": "快速搜尋頁面、動作或指令",
|
"command_palette_prompt": "快速尋找頁面,動作或者指令",
|
||||||
"command_palette_to_close": "關閉",
|
"command_palette_to_close": "關閉",
|
||||||
"command_palette_to_navigate": "輸入",
|
"command_palette_to_navigate": "輸入",
|
||||||
"command_palette_to_select": "選擇",
|
"command_palette_to_select": "選擇",
|
||||||
@@ -837,7 +837,7 @@
|
|||||||
"copy_password": "複製密碼",
|
"copy_password": "複製密碼",
|
||||||
"copy_to_clipboard": "複製到剪貼簿",
|
"copy_to_clipboard": "複製到剪貼簿",
|
||||||
"country": "國家",
|
"country": "國家",
|
||||||
"cover": "填滿",
|
"cover": "封面",
|
||||||
"covers": "封面",
|
"covers": "封面",
|
||||||
"create": "建立",
|
"create": "建立",
|
||||||
"create_album": "建立相簿",
|
"create_album": "建立相簿",
|
||||||
@@ -849,12 +849,9 @@
|
|||||||
"create_link_to_share": "建立分享連結",
|
"create_link_to_share": "建立分享連結",
|
||||||
"create_link_to_share_description": "持有連結的人皆可檢視所選項目",
|
"create_link_to_share_description": "持有連結的人皆可檢視所選項目",
|
||||||
"create_new": "新增",
|
"create_new": "新增",
|
||||||
"create_new_face": "建立新臉孔",
|
|
||||||
"create_new_person": "建立新人物",
|
"create_new_person": "建立新人物",
|
||||||
"create_new_person_hint": "將選取的項目指派給新的人物",
|
"create_new_person_hint": "將選取的項目指派給新的人物",
|
||||||
"create_new_user": "建立新使用者",
|
"create_new_user": "建立新使用者",
|
||||||
"create_person": "建立人物",
|
|
||||||
"create_person_subtitle": "為所選臉孔新增名字以建立和標記新人物",
|
|
||||||
"create_shared_album_page_share_add_assets": "新增項目",
|
"create_shared_album_page_share_add_assets": "新增項目",
|
||||||
"create_shared_album_page_share_select_photos": "選取相片",
|
"create_shared_album_page_share_select_photos": "選取相片",
|
||||||
"create_shared_link": "建立分享連結",
|
"create_shared_link": "建立分享連結",
|
||||||
@@ -895,7 +892,7 @@
|
|||||||
"day": "日",
|
"day": "日",
|
||||||
"days": "日",
|
"days": "日",
|
||||||
"deduplicate_all": "刪除所有重複項目",
|
"deduplicate_all": "刪除所有重複項目",
|
||||||
"default_locale": "預設語言",
|
"default_locale": "默認語言",
|
||||||
"default_locale_description": "使用你的瀏覽器區域以格式日期和數字",
|
"default_locale_description": "使用你的瀏覽器區域以格式日期和數字",
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
"delete_action_confirmation_message": "您確定要刪除此項目嗎?此動作會將該項目移至伺服器的垃圾桶,並詢問您是否要在本機同步刪除",
|
"delete_action_confirmation_message": "您確定要刪除此項目嗎?此動作會將該項目移至伺服器的垃圾桶,並詢問您是否要在本機同步刪除",
|
||||||
@@ -968,7 +965,7 @@
|
|||||||
"download_waiting_to_retry": "等待重試",
|
"download_waiting_to_retry": "等待重試",
|
||||||
"downloading": "下載中",
|
"downloading": "下載中",
|
||||||
"downloading_asset_filename": "正在下載項目 {filename}",
|
"downloading_asset_filename": "正在下載項目 {filename}",
|
||||||
"downloading_from_icloud": "正從 iCloud 下載",
|
"downloading_from_icloud": "正從iCloud下載",
|
||||||
"downloading_media": "正在下載媒體",
|
"downloading_media": "正在下載媒體",
|
||||||
"drop_files_to_upload": "將檔案拖放到任何位置以上傳",
|
"drop_files_to_upload": "將檔案拖放到任何位置以上傳",
|
||||||
"duplicates": "重複項目",
|
"duplicates": "重複項目",
|
||||||
@@ -1013,8 +1010,8 @@
|
|||||||
"editor_handle_edge": "{edge, select, top {頂部} bottom {底部} left {左側} right {右側} other {某個}} 邊緣的控制手柄",
|
"editor_handle_edge": "{edge, select, top {頂部} bottom {底部} left {左側} right {右側} other {某個}} 邊緣的控制手柄",
|
||||||
"editor_orientation": "方向",
|
"editor_orientation": "方向",
|
||||||
"editor_reset_all_changes": "重設變更",
|
"editor_reset_all_changes": "重設變更",
|
||||||
"editor_rotate_left": "逆時針旋轉 90 度",
|
"editor_rotate_left": "逆時針旋轉90度",
|
||||||
"editor_rotate_right": "順時針旋轉 90 度",
|
"editor_rotate_right": "順時針旋轉90度",
|
||||||
"email": "電子郵件",
|
"email": "電子郵件",
|
||||||
"email_notifications": "電子郵件通知",
|
"email_notifications": "電子郵件通知",
|
||||||
"empty_folder": "這個資料夾是空的",
|
"empty_folder": "這個資料夾是空的",
|
||||||
@@ -1025,7 +1022,7 @@
|
|||||||
"enable_biometric_auth_description": "輸入您的 PIN 碼以啟用生物辨識驗證",
|
"enable_biometric_auth_description": "輸入您的 PIN 碼以啟用生物辨識驗證",
|
||||||
"enabled": "已啟用",
|
"enabled": "已啟用",
|
||||||
"end_date": "結束日期",
|
"end_date": "結束日期",
|
||||||
"enqueued": "已排入佇列",
|
"enqueued": "已排入序列",
|
||||||
"enter_wifi_name": "輸入 Wi-Fi 名稱",
|
"enter_wifi_name": "輸入 Wi-Fi 名稱",
|
||||||
"enter_your_pin_code": "輸入您的 PIN 碼",
|
"enter_your_pin_code": "輸入您的 PIN 碼",
|
||||||
"enter_your_pin_code_subtitle": "輸入您的 PIN 碼以存取「已鎖定」資料夾",
|
"enter_your_pin_code_subtitle": "輸入您的 PIN 碼以存取「已鎖定」資料夾",
|
||||||
@@ -1347,11 +1344,11 @@
|
|||||||
"ios_debug_info_processing_ran_at": "於 {dateTime} 執行處理",
|
"ios_debug_info_processing_ran_at": "於 {dateTime} 執行處理",
|
||||||
"items_count": "{count, plural, one {# 個項目} other {# 個項目}}",
|
"items_count": "{count, plural, one {# 個項目} other {# 個項目}}",
|
||||||
"jobs": "任務",
|
"jobs": "任務",
|
||||||
"json_editor": "JSON 編輯器",
|
"json_editor": "JSON編輯器",
|
||||||
"json_error": "JSON 錯誤",
|
"json_error": "JSON錯誤",
|
||||||
"keep": "保留",
|
"keep": "保留",
|
||||||
"keep_albums": "保留相簿",
|
"keep_albums": "保留相簿",
|
||||||
"keep_albums_count": "保留{count} {count, plural, one {本相簿} other {本相簿}}",
|
"keep_albums_count": "保留{count} {count, plural, one {個相簿} other {個相簿}}",
|
||||||
"keep_all": "全部保留",
|
"keep_all": "全部保留",
|
||||||
"keep_description": "選擇執行釋放空間時要保留在裝置上的項目。",
|
"keep_description": "選擇執行釋放空間時要保留在裝置上的項目。",
|
||||||
"keep_favorites": "保留最愛的相片",
|
"keep_favorites": "保留最愛的相片",
|
||||||
@@ -1359,7 +1356,7 @@
|
|||||||
"keep_on_device_hint": "選擇保留在裝置上的相片",
|
"keep_on_device_hint": "選擇保留在裝置上的相片",
|
||||||
"keep_this_delete_others": "保留這個,刪除其他",
|
"keep_this_delete_others": "保留這個,刪除其他",
|
||||||
"keeping": "保留:{items}",
|
"keeping": "保留:{items}",
|
||||||
"kept_this_deleted_others": "保留這個項目並刪除{count, plural, one {# 個項目} other {# 個項目}}",
|
"kept_this_deleted_others": "保留這個項目並刪除{count, plural, one {# asset} other {# assets}}",
|
||||||
"keyboard_shortcuts": "鍵盤快捷鍵",
|
"keyboard_shortcuts": "鍵盤快捷鍵",
|
||||||
"language": "語言",
|
"language": "語言",
|
||||||
"language_no_results_subtitle": "試著調整您的搜尋詞彙",
|
"language_no_results_subtitle": "試著調整您的搜尋詞彙",
|
||||||
@@ -1393,7 +1390,7 @@
|
|||||||
"like": "喜歡",
|
"like": "喜歡",
|
||||||
"like_deleted": "已取消喜歡",
|
"like_deleted": "已取消喜歡",
|
||||||
"link_motion_video": "連結動態影片",
|
"link_motion_video": "連結動態影片",
|
||||||
"link_to_docs": "請參閱 <link>說明文件</link> 以獲取更多資訊。",
|
"link_to_docs": "請參閱 <link>文案</link> 以獲取更多信息。",
|
||||||
"link_to_oauth": "連結 OAuth",
|
"link_to_oauth": "連結 OAuth",
|
||||||
"linked_oauth_account": "已連結 OAuth 帳號",
|
"linked_oauth_account": "已連結 OAuth 帳號",
|
||||||
"list": "清單",
|
"list": "清單",
|
||||||
@@ -1402,7 +1399,7 @@
|
|||||||
"local": "本機",
|
"local": "本機",
|
||||||
"local_asset_cast_failed": "無法投放未上傳至伺服器的項目",
|
"local_asset_cast_failed": "無法投放未上傳至伺服器的項目",
|
||||||
"local_assets": "本機項目",
|
"local_assets": "本機項目",
|
||||||
"local_id": "本地 ID",
|
"local_id": "本地ID",
|
||||||
"local_media_summary": "本機媒體摘要",
|
"local_media_summary": "本機媒體摘要",
|
||||||
"local_network": "本機網路",
|
"local_network": "本機網路",
|
||||||
"local_network_sheet_info": "當使用指定的 Wi-Fi 網路時,應用程式將透過此網址連線至伺服器",
|
"local_network_sheet_info": "當使用指定的 Wi-Fi 網路時,應用程式將透過此網址連線至伺服器",
|
||||||
@@ -1491,14 +1488,14 @@
|
|||||||
"manage_your_devices": "管理已登入的裝置",
|
"manage_your_devices": "管理已登入的裝置",
|
||||||
"manage_your_oauth_connection": "管理您的 OAuth 連結",
|
"manage_your_oauth_connection": "管理您的 OAuth 連結",
|
||||||
"map": "地圖",
|
"map": "地圖",
|
||||||
"map_assets_in_bounds": "{count, plural, =0 {此區域沒有相片} one {# 張相片} other {# 張相片}}",
|
"map_assets_in_bounds": "{count, plural, one {# 張相片} other {# 張相片}}",
|
||||||
"map_cannot_get_user_location": "無法取得使用者位置",
|
"map_cannot_get_user_location": "無法取得使用者位置",
|
||||||
"map_location_dialog_yes": "確定",
|
"map_location_dialog_yes": "確定",
|
||||||
"map_location_picker_page_use_location": "使用此位置",
|
"map_location_picker_page_use_location": "使用此位置",
|
||||||
"map_location_service_disabled_content": "需要啟用定位服務才能顯示您目前位置相關的項目。要現在啟用嗎?",
|
"map_location_service_disabled_content": "需要啟用定位服務才能顯示您目前位置相關的項目。要現在啟用嗎?",
|
||||||
"map_location_service_disabled_title": "定位服務已停用",
|
"map_location_service_disabled_title": "定位服務已停用",
|
||||||
"map_marker_for_images": "在 {city}、{country} 拍攝影像的地圖標記",
|
"map_marker_for_images": "在 {city}、{country} 拍攝影像的地圖示記",
|
||||||
"map_marker_with_image": "帶有影像的地圖標記",
|
"map_marker_with_image": "帶有影像的地圖示記",
|
||||||
"map_no_location_permission_content": "需要位置權限才能顯示與您目前位置相關的項目。要現在就授予位置權限嗎?",
|
"map_no_location_permission_content": "需要位置權限才能顯示與您目前位置相關的項目。要現在就授予位置權限嗎?",
|
||||||
"map_no_location_permission_title": "沒有位置權限",
|
"map_no_location_permission_title": "沒有位置權限",
|
||||||
"map_settings": "地圖設定",
|
"map_settings": "地圖設定",
|
||||||
@@ -1556,7 +1553,7 @@
|
|||||||
"move_to_locked_folder_confirmation": "這些相片與影片將從所有相簿中移除,且僅能從「已鎖定」資料夾中檢視",
|
"move_to_locked_folder_confirmation": "這些相片與影片將從所有相簿中移除,且僅能從「已鎖定」資料夾中檢視",
|
||||||
"move_up": "向上移動",
|
"move_up": "向上移動",
|
||||||
"moved_to_archive": "已封存 {count, plural, one {# 個項目} other {# 個項目}}",
|
"moved_to_archive": "已封存 {count, plural, one {# 個項目} other {# 個項目}}",
|
||||||
"moved_to_library": "已移動 {count, plural, one {# 個項目} other {# 個項目}} 至媒體庫",
|
"moved_to_library": "已移動 {count, plural, one {# 個項目} other {# 個項目}} 至相簿",
|
||||||
"moved_to_trash": "已丟進垃圾桶",
|
"moved_to_trash": "已丟進垃圾桶",
|
||||||
"multiselect_grid_edit_date_time_err_read_only": "唯讀項目的日期無法編輯,已略過",
|
"multiselect_grid_edit_date_time_err_read_only": "唯讀項目的日期無法編輯,已略過",
|
||||||
"multiselect_grid_edit_gps_err_read_only": "唯讀項目的位置資訊無法編輯,已略過",
|
"multiselect_grid_edit_gps_err_read_only": "唯讀項目的位置資訊無法編輯,已略過",
|
||||||
@@ -1565,12 +1562,12 @@
|
|||||||
"name": "名稱",
|
"name": "名稱",
|
||||||
"name_or_nickname": "名稱或暱稱",
|
"name_or_nickname": "名稱或暱稱",
|
||||||
"name_required": "名稱是必填項",
|
"name_required": "名稱是必填項",
|
||||||
"navigate": "導覽",
|
"navigate": "導航",
|
||||||
"navigate_to_time": "跳轉至指定時間",
|
"navigate_to_time": "跳轉至指定時間",
|
||||||
"network_requirement_photos_upload": "使用行動網路流量備份相片",
|
"network_requirement_photos_upload": "使用行動網路流量備份相片",
|
||||||
"network_requirement_videos_upload": "使用行動網路流量備份影片",
|
"network_requirement_videos_upload": "使用行動網路流量備份影片",
|
||||||
"network_requirements": "網路要求",
|
"network_requirements": "網路要求",
|
||||||
"network_requirements_updated": "網路需求已變更,正在重設備份佇列",
|
"network_requirements_updated": "網路需求已變更,正在重設備份序列",
|
||||||
"networking_settings": "網路",
|
"networking_settings": "網路",
|
||||||
"networking_subtitle": "管理伺服器端點設定",
|
"networking_subtitle": "管理伺服器端點設定",
|
||||||
"never": "永不失效",
|
"never": "永不失效",
|
||||||
@@ -1594,7 +1591,7 @@
|
|||||||
"no_albums_message": "建立相簿來整理相片和影片",
|
"no_albums_message": "建立相簿來整理相片和影片",
|
||||||
"no_albums_with_name_yet": "看來還沒有這個名字的相簿。",
|
"no_albums_with_name_yet": "看來還沒有這個名字的相簿。",
|
||||||
"no_albums_yet": "看來您還沒有任何相簿。",
|
"no_albums_yet": "看來您還沒有任何相簿。",
|
||||||
"no_archived_assets_message": "將相片與影片封存後,就不會顯示在「相片」頁面中",
|
"no_archived_assets_message": "將相片與影片封存後,就不會顯示在「相片」視圖中",
|
||||||
"no_assets_message": "按這裡上傳您的第一張相片",
|
"no_assets_message": "按這裡上傳您的第一張相片",
|
||||||
"no_assets_to_show": "無項目展示",
|
"no_assets_to_show": "無項目展示",
|
||||||
"no_cast_devices_found": "找不到 Google Cast 裝置",
|
"no_cast_devices_found": "找不到 Google Cast 裝置",
|
||||||
@@ -1710,7 +1707,7 @@
|
|||||||
"permanent_deletion_warning_setting_description": "在永久刪除檔案時顯示警告",
|
"permanent_deletion_warning_setting_description": "在永久刪除檔案時顯示警告",
|
||||||
"permanently_delete": "永久刪除",
|
"permanently_delete": "永久刪除",
|
||||||
"permanently_delete_assets_count": "永久刪除 {count, plural, one {檔案} other {檔案}}",
|
"permanently_delete_assets_count": "永久刪除 {count, plural, one {檔案} other {檔案}}",
|
||||||
"permanently_delete_assets_prompt": "確定要永久刪除 {count, plural, one {這個檔案?} other {這 <b>#</b> 個檔案?}}這樣{count, plural, one {它} other {它們}}也會從自己所在的相簿中消失。",
|
"permanently_delete_assets_prompt": "確定要永久刪除 {count, plural, other {這 <b>#</b> 個檔案?}}這樣{count, plural, one {它} other {它們}}也會從自己所在的相簿中消失。",
|
||||||
"permanently_deleted_asset": "永久刪除的檔案",
|
"permanently_deleted_asset": "永久刪除的檔案",
|
||||||
"permanently_deleted_assets_count": "永久刪除的 {count, plural, one {# 個檔案} other {# 個檔案}}",
|
"permanently_deleted_assets_count": "永久刪除的 {count, plural, one {# 個檔案} other {# 個檔案}}",
|
||||||
"permission": "權限",
|
"permission": "權限",
|
||||||
@@ -1773,7 +1770,7 @@
|
|||||||
"profile_drawer_app_logs": "紀錄",
|
"profile_drawer_app_logs": "紀錄",
|
||||||
"profile_drawer_client_server_up_to_date": "用戶端與伺服器版本皆為最新",
|
"profile_drawer_client_server_up_to_date": "用戶端與伺服器版本皆為最新",
|
||||||
"profile_drawer_github": "GitHub",
|
"profile_drawer_github": "GitHub",
|
||||||
"profile_drawer_readonly_mode": "唯讀模式已啟用。長按使用者個人圖示即可關閉。",
|
"profile_drawer_readonly_mode": "唯讀模式已啟用。長按使用者個人圖示即可退出。",
|
||||||
"profile_image_of_user": "{user} 的個人資料圖片",
|
"profile_image_of_user": "{user} 的個人資料圖片",
|
||||||
"profile_picture_set": "已設定個人資料圖片。",
|
"profile_picture_set": "已設定個人資料圖片。",
|
||||||
"public_album": "公開相簿",
|
"public_album": "公開相簿",
|
||||||
@@ -1815,7 +1812,7 @@
|
|||||||
"rate_asset": "項目評分",
|
"rate_asset": "項目評分",
|
||||||
"rating": "評星",
|
"rating": "評星",
|
||||||
"rating_clear": "清除評等",
|
"rating_clear": "清除評等",
|
||||||
"rating_count": "{count, plural, =0 {未評分} one {# 星} other {# 星}}",
|
"rating_count": "{count, plural, =0 {Unrated} other {# 星}}",
|
||||||
"rating_description": "在資訊面板中顯示 EXIF 評等",
|
"rating_description": "在資訊面板中顯示 EXIF 評等",
|
||||||
"reaction_options": "反應選項",
|
"reaction_options": "反應選項",
|
||||||
"read_changelog": "閱覽更新紀錄",
|
"read_changelog": "閱覽更新紀錄",
|
||||||
@@ -1835,15 +1832,15 @@
|
|||||||
"recently_taken_page_title": "最近拍攝",
|
"recently_taken_page_title": "最近拍攝",
|
||||||
"refresh": "重新整理",
|
"refresh": "重新整理",
|
||||||
"refresh_encoded_videos": "重新整理已編碼的影片",
|
"refresh_encoded_videos": "重新整理已編碼的影片",
|
||||||
"refresh_faces": "重新整理臉孔資料",
|
"refresh_faces": "重整面部資料",
|
||||||
"refresh_metadata": "重新整理中繼資料",
|
"refresh_metadata": "重新整理中繼資料",
|
||||||
"refresh_thumbnails": "重新整理縮圖",
|
"refresh_thumbnails": "重新整理縮圖",
|
||||||
"refreshed": "重新整理完畢",
|
"refreshed": "重新整理完畢",
|
||||||
"refreshes_every_file": "重新讀取所有現有與新增檔案",
|
"refreshes_every_file": "重新讀取所有現有與新增檔案",
|
||||||
"refreshing_encoded_video": "正在重新整理已編碼的影片",
|
"refreshing_encoded_video": "正在重新整理已編碼的影片",
|
||||||
"refreshing_faces": "正在重新整理臉孔資料",
|
"refreshing_faces": "重整面部資料中",
|
||||||
"refreshing_metadata": "正在重新整理中繼資料",
|
"refreshing_metadata": "正在重新整理中繼資料",
|
||||||
"regenerating_thumbnails": "正在重新產生縮圖",
|
"regenerating_thumbnails": "重新產生縮圖中",
|
||||||
"remote": "遠端",
|
"remote": "遠端",
|
||||||
"remote_assets": "遠端項目",
|
"remote_assets": "遠端項目",
|
||||||
"remote_media_summary": "遠端媒體摘要",
|
"remote_media_summary": "遠端媒體摘要",
|
||||||
@@ -1872,8 +1869,8 @@
|
|||||||
"removed_memory": "已移除記憶",
|
"removed_memory": "已移除記憶",
|
||||||
"removed_photo_from_memory": "已從記憶中移除相片",
|
"removed_photo_from_memory": "已從記憶中移除相片",
|
||||||
"removed_tagged_assets": "已移除 {count, plural, one {# 個檔案} other {# 個檔案}}的標籤",
|
"removed_tagged_assets": "已移除 {count, plural, one {# 個檔案} other {# 個檔案}}的標籤",
|
||||||
"rename": "重新命名",
|
"rename": "改名",
|
||||||
"repair": "修復",
|
"repair": "糾正",
|
||||||
"repair_no_results_message": "未被追蹤及遺失的檔案會顯示在這裡",
|
"repair_no_results_message": "未被追蹤及遺失的檔案會顯示在這裡",
|
||||||
"replace_with_upload": "用上傳的檔案取代",
|
"replace_with_upload": "用上傳的檔案取代",
|
||||||
"repository": "儲存庫",
|
"repository": "儲存庫",
|
||||||
@@ -1889,9 +1886,9 @@
|
|||||||
"reset_pin_code_with_password": "您可隨時使用您的密碼來重設 PIN 碼",
|
"reset_pin_code_with_password": "您可隨時使用您的密碼來重設 PIN 碼",
|
||||||
"reset_sqlite": "重設 SQLite 資料庫",
|
"reset_sqlite": "重設 SQLite 資料庫",
|
||||||
"reset_sqlite_clear_app_data": "清除資料",
|
"reset_sqlite_clear_app_data": "清除資料",
|
||||||
"reset_sqlite_confirmation": "確定要重設所有資料嗎?你的所有設定將被重設,且你會被登出。",
|
"reset_sqlite_confirmation": "確定要重設所有資料嗎?你的所有設置將被重設,且你會被登出。",
|
||||||
"reset_sqlite_confirmation_note": "注意:你需要在清除資料後重新開啟 App。",
|
"reset_sqlite_confirmation_note": "注意:你需要在清除資料後重新開啟應用。",
|
||||||
"reset_sqlite_done": "資料已清除。請重啟 Immich 及重新登入。",
|
"reset_sqlite_done": "資料已清除。請重啟Immich及重新登入。",
|
||||||
"reset_sqlite_success": "已成功重設 SQLite 資料庫",
|
"reset_sqlite_success": "已成功重設 SQLite 資料庫",
|
||||||
"reset_to_default": "重設為預設值",
|
"reset_to_default": "重設為預設值",
|
||||||
"resolution": "解析度",
|
"resolution": "解析度",
|
||||||
@@ -1913,7 +1910,7 @@
|
|||||||
"running": "執行中",
|
"running": "執行中",
|
||||||
"save": "儲存",
|
"save": "儲存",
|
||||||
"save_to_gallery": "儲存到相簿",
|
"save_to_gallery": "儲存到相簿",
|
||||||
"saved": "已儲存",
|
"saved": "已保存",
|
||||||
"saved_api_key": "已儲存 API 金鑰",
|
"saved_api_key": "已儲存 API 金鑰",
|
||||||
"saved_profile": "已儲存個人資料",
|
"saved_profile": "已儲存個人資料",
|
||||||
"saved_settings": "已儲存設定",
|
"saved_settings": "已儲存設定",
|
||||||
@@ -1933,9 +1930,9 @@
|
|||||||
"search_by_description_example": "在沙壩的健行之日",
|
"search_by_description_example": "在沙壩的健行之日",
|
||||||
"search_by_filename": "依檔名或副檔名搜尋",
|
"search_by_filename": "依檔名或副檔名搜尋",
|
||||||
"search_by_filename_example": "如 IMG_1234.JPG 或 PNG",
|
"search_by_filename_example": "如 IMG_1234.JPG 或 PNG",
|
||||||
"search_by_ocr": "透過 OCR 搜尋",
|
"search_by_ocr": "透過OCR搜尋",
|
||||||
"search_by_ocr_example": "拿鐵",
|
"search_by_ocr_example": "拿鐵",
|
||||||
"search_camera_lens_model": "搜尋鏡頭型號...",
|
"search_camera_lens_model": "蒐索鏡頭型號...",
|
||||||
"search_camera_make": "搜尋相機製造商…",
|
"search_camera_make": "搜尋相機製造商…",
|
||||||
"search_camera_model": "搜尋相機型號…",
|
"search_camera_model": "搜尋相機型號…",
|
||||||
"search_city": "搜尋城市…",
|
"search_city": "搜尋城市…",
|
||||||
@@ -1952,7 +1949,7 @@
|
|||||||
"search_filter_location_title": "選擇位置",
|
"search_filter_location_title": "選擇位置",
|
||||||
"search_filter_media_type": "媒體類型",
|
"search_filter_media_type": "媒體類型",
|
||||||
"search_filter_media_type_title": "選擇媒體類型",
|
"search_filter_media_type_title": "選擇媒體類型",
|
||||||
"search_filter_ocr": "透過 OCR 搜尋",
|
"search_filter_ocr": "透過OCR搜尋",
|
||||||
"search_filter_people_title": "選擇人物",
|
"search_filter_people_title": "選擇人物",
|
||||||
"search_filter_star_rating": "評分",
|
"search_filter_star_rating": "評分",
|
||||||
"search_filter_tags_title": "選擇標籤",
|
"search_filter_tags_title": "選擇標籤",
|
||||||
@@ -1981,7 +1978,7 @@
|
|||||||
"search_settings": "搜尋設定",
|
"search_settings": "搜尋設定",
|
||||||
"search_state": "搜尋地區…",
|
"search_state": "搜尋地區…",
|
||||||
"search_suggestion_list_smart_search_hint_1": "智慧搜尋功能預設已啟用,如要搜尋中繼資料,請使用語法 ",
|
"search_suggestion_list_smart_search_hint_1": "智慧搜尋功能預設已啟用,如要搜尋中繼資料,請使用語法 ",
|
||||||
"search_suggestion_list_smart_search_hint_2": "m:您的搜尋關鍵字",
|
"search_suggestion_list_smart_search_hint_2": "m:您的搜尋關鍵詞",
|
||||||
"search_tags": "搜尋標籤...",
|
"search_tags": "搜尋標籤...",
|
||||||
"search_timezone": "搜尋時區…",
|
"search_timezone": "搜尋時區…",
|
||||||
"search_type": "搜尋類型",
|
"search_type": "搜尋類型",
|
||||||
@@ -2035,7 +2032,7 @@
|
|||||||
"set_profile_picture": "設定個人資料圖片",
|
"set_profile_picture": "設定個人資料圖片",
|
||||||
"set_slideshow_to_fullscreen": "以全螢幕放映幻燈片",
|
"set_slideshow_to_fullscreen": "以全螢幕放映幻燈片",
|
||||||
"set_stack_primary_asset": "設定堆疊的首要項目",
|
"set_stack_primary_asset": "設定堆疊的首要項目",
|
||||||
"setting_image_navigation_enable_subtitle": "開啟後以觸碰螢幕左/右邊緣區域的方式切換上/下圖片。",
|
"setting_image_navigation_enable_subtitle": "開啟後以觸碰屏幕左/右邊緣區域的方式切換上/下圖片。",
|
||||||
"setting_image_navigation_enable_title": "點擊切換",
|
"setting_image_navigation_enable_title": "點擊切換",
|
||||||
"setting_image_navigation_title": "圖片導引",
|
"setting_image_navigation_title": "圖片導引",
|
||||||
"setting_image_viewer_help": "詳細資訊檢視器會依序載入小型縮圖、中等尺寸預覽圖(若啟用),最後載入原始相片。",
|
"setting_image_viewer_help": "詳細資訊檢視器會依序載入小型縮圖、中等尺寸預覽圖(若啟用),最後載入原始相片。",
|
||||||
@@ -2135,7 +2132,7 @@
|
|||||||
"show_all_people": "顯示所有人物",
|
"show_all_people": "顯示所有人物",
|
||||||
"show_and_hide_people": "顯示與隱藏人物",
|
"show_and_hide_people": "顯示與隱藏人物",
|
||||||
"show_file_location": "顯示檔案位置",
|
"show_file_location": "顯示檔案位置",
|
||||||
"show_gallery": "顯示媒體庫",
|
"show_gallery": "顯示畫廊",
|
||||||
"show_hidden_people": "顯示隱藏的人物",
|
"show_hidden_people": "顯示隱藏的人物",
|
||||||
"show_in_timeline": "在時間軸中顯示",
|
"show_in_timeline": "在時間軸中顯示",
|
||||||
"show_in_timeline_setting_description": "在您的時間軸中顯示這位使用者的相片和影片",
|
"show_in_timeline_setting_description": "在您的時間軸中顯示這位使用者的相片和影片",
|
||||||
@@ -2152,7 +2149,7 @@
|
|||||||
"show_supporter_badge": "支持者徽章",
|
"show_supporter_badge": "支持者徽章",
|
||||||
"show_supporter_badge_description": "顯示支持者徽章",
|
"show_supporter_badge_description": "顯示支持者徽章",
|
||||||
"show_text_recognition": "顯示文字辨識",
|
"show_text_recognition": "顯示文字辨識",
|
||||||
"show_text_search_menu": "顯示文字搜尋選單",
|
"show_text_search_menu": "顯示文字蒐索選單",
|
||||||
"shuffle": "隨機排序",
|
"shuffle": "隨機排序",
|
||||||
"sidebar": "側邊欄",
|
"sidebar": "側邊欄",
|
||||||
"sidebar_display_description": "在側邊欄中顯示連結",
|
"sidebar_display_description": "在側邊欄中顯示連結",
|
||||||
@@ -2217,7 +2214,6 @@
|
|||||||
"tag": "標籤",
|
"tag": "標籤",
|
||||||
"tag_assets": "標記檔案",
|
"tag_assets": "標記檔案",
|
||||||
"tag_created": "已建立標籤:{tag}",
|
"tag_created": "已建立標籤:{tag}",
|
||||||
"tag_face": "標記臉孔",
|
|
||||||
"tag_feature_description": "以邏輯標記要旨分類瀏覽相片和影片",
|
"tag_feature_description": "以邏輯標記要旨分類瀏覽相片和影片",
|
||||||
"tag_not_found_question": "找不到標籤?<link>建立新標籤。</link>",
|
"tag_not_found_question": "找不到標籤?<link>建立新標籤。</link>",
|
||||||
"tag_people": "標籤人物",
|
"tag_people": "標籤人物",
|
||||||
@@ -2268,11 +2264,11 @@
|
|||||||
"trash_all": "全部丟掉",
|
"trash_all": "全部丟掉",
|
||||||
"trash_count": "丟掉 {count, number} 個檔案",
|
"trash_count": "丟掉 {count, number} 個檔案",
|
||||||
"trash_delete_asset": "將檔案丟進垃圾桶 / 刪除",
|
"trash_delete_asset": "將檔案丟進垃圾桶 / 刪除",
|
||||||
"trash_emptied": "已清空垃圾桶",
|
"trash_emptied": "已清空回收桶",
|
||||||
"trash_no_results_message": "垃圾桶中的相片和影片將顯示在這裡。",
|
"trash_no_results_message": "垃圾桶中的相片和影片將顯示在這裡。",
|
||||||
"trash_page_delete_all": "刪除全部",
|
"trash_page_delete_all": "刪除全部",
|
||||||
"trash_page_empty_trash_dialog_content": "是否清空垃圾桶?這些項目將被從 Immich 中永久刪除",
|
"trash_page_empty_trash_dialog_content": "是否清空回收桶?這些項目將被從 Immich 中永久刪除",
|
||||||
"trash_page_info": "垃圾桶中項目將在 {days} 天後永久刪除",
|
"trash_page_info": "回收桶中項目將在 {days} 天後永久刪除",
|
||||||
"trash_page_no_assets": "暫無已刪除項目",
|
"trash_page_no_assets": "暫無已刪除項目",
|
||||||
"trash_page_restore_all": "全部還原",
|
"trash_page_restore_all": "全部還原",
|
||||||
"trash_page_select_assets_btn": "選擇項目",
|
"trash_page_select_assets_btn": "選擇項目",
|
||||||
@@ -2285,7 +2281,7 @@
|
|||||||
"trigger_person_recognized": "已辨識人物",
|
"trigger_person_recognized": "已辨識人物",
|
||||||
"trigger_person_recognized_description": "偵測到人物時觸發",
|
"trigger_person_recognized_description": "偵測到人物時觸發",
|
||||||
"trigger_type": "觸發類型",
|
"trigger_type": "觸發類型",
|
||||||
"troubleshoot": "疑難排解",
|
"troubleshoot": "疑難解答",
|
||||||
"type": "類型",
|
"type": "類型",
|
||||||
"unable_to_change_pin_code": "無法變更 PIN 碼",
|
"unable_to_change_pin_code": "無法變更 PIN 碼",
|
||||||
"unable_to_check_version": "無法檢查應用程式或伺服器版本",
|
"unable_to_check_version": "無法檢查應用程式或伺服器版本",
|
||||||
@@ -2317,7 +2313,7 @@
|
|||||||
"unstack_action_prompt": "{count} 個取消堆疊",
|
"unstack_action_prompt": "{count} 個取消堆疊",
|
||||||
"unstacked_assets_count": "已解除堆疊 {count, plural, other {# 個檔案}}",
|
"unstacked_assets_count": "已解除堆疊 {count, plural, other {# 個檔案}}",
|
||||||
"unsupported_field_type": "不支援的欄位類型",
|
"unsupported_field_type": "不支援的欄位類型",
|
||||||
"unsupported_file_type": "不支援 {type} 類型的檔案,無法上傳 {file} 檔案。",
|
"unsupported_file_type": "不支持 {type} 類型的檔案,無法上傳 {file} 文件。",
|
||||||
"untagged": "無標籤",
|
"untagged": "無標籤",
|
||||||
"untitled_workflow": "未命名工作流程",
|
"untitled_workflow": "未命名工作流程",
|
||||||
"up_next": "下一個",
|
"up_next": "下一個",
|
||||||
@@ -2375,7 +2371,7 @@
|
|||||||
"version_history": "版本紀錄",
|
"version_history": "版本紀錄",
|
||||||
"version_history_item": "{date} 安裝了 {version}",
|
"version_history_item": "{date} 安裝了 {version}",
|
||||||
"video": "影片",
|
"video": "影片",
|
||||||
"video_hover_setting": "游標停留時播放影片縮圖",
|
"video_hover_setting": "遊標停留時播放影片縮圖",
|
||||||
"video_hover_setting_description": "當滑鼠停在項目上時播放影片縮圖。即使停用此功能,仍可透過將滑鼠停在播放圖示上來開始播放。",
|
"video_hover_setting_description": "當滑鼠停在項目上時播放影片縮圖。即使停用此功能,仍可透過將滑鼠停在播放圖示上來開始播放。",
|
||||||
"videos": "影片",
|
"videos": "影片",
|
||||||
"videos_count": "{count, plural, other {# 部影片}}",
|
"videos_count": "{count, plural, other {# 部影片}}",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "immich-ml"
|
name = "immich-ml"
|
||||||
version = "2.7.5"
|
version = "2.6.3"
|
||||||
description = ""
|
description = ""
|
||||||
authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }]
|
authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }]
|
||||||
requires-python = ">=3.11,<4.0"
|
requires-python = ">=3.11,<4.0"
|
||||||
@@ -11,10 +11,10 @@ dependencies = [
|
|||||||
"gunicorn>=21.1.0",
|
"gunicorn>=21.1.0",
|
||||||
"huggingface-hub>=0.20.1,<1.0",
|
"huggingface-hub>=0.20.1,<1.0",
|
||||||
"insightface>=0.7.3,<1.0",
|
"insightface>=0.7.3,<1.0",
|
||||||
"numpy<2.4.0",
|
"numpy>=2.3.4",
|
||||||
"opencv-python-headless>=4.7.0.72,<5.0",
|
"opencv-python-headless>=4.7.0.72,<5.0",
|
||||||
"orjson>=3.9.5",
|
"orjson>=3.9.5",
|
||||||
"pillow>=12.2,<12.3",
|
"pillow>=12.1.1,<12.2",
|
||||||
"pydantic>=2.0.0,<3",
|
"pydantic>=2.0.0,<3",
|
||||||
"pydantic-settings>=2.5.2,<3",
|
"pydantic-settings>=2.5.2,<3",
|
||||||
"python-multipart>=0.0.6,<1.0",
|
"python-multipart>=0.0.6,<1.0",
|
||||||
|
|||||||
Generated
+163
-165
@@ -898,7 +898,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "immich-ml"
|
name = "immich-ml"
|
||||||
version = "2.7.5"
|
version = "2.6.3"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "aiocache" },
|
{ name = "aiocache" },
|
||||||
@@ -987,7 +987,7 @@ requires-dist = [
|
|||||||
{ name = "gunicorn", specifier = ">=21.1.0" },
|
{ name = "gunicorn", specifier = ">=21.1.0" },
|
||||||
{ name = "huggingface-hub", specifier = ">=0.20.1,<1.0" },
|
{ name = "huggingface-hub", specifier = ">=0.20.1,<1.0" },
|
||||||
{ name = "insightface", specifier = ">=0.7.3,<1.0" },
|
{ name = "insightface", specifier = ">=0.7.3,<1.0" },
|
||||||
{ name = "numpy", specifier = "<2.4.0" },
|
{ name = "numpy", specifier = ">=2.3.4" },
|
||||||
{ name = "onnxruntime", marker = "extra == 'armnn'", specifier = ">=1.23.2,<2" },
|
{ name = "onnxruntime", marker = "extra == 'armnn'", specifier = ">=1.23.2,<2" },
|
||||||
{ name = "onnxruntime", marker = "extra == 'cpu'", specifier = ">=1.23.2,<2" },
|
{ name = "onnxruntime", marker = "extra == 'cpu'", specifier = ">=1.23.2,<2" },
|
||||||
{ name = "onnxruntime", marker = "extra == 'rknn'", specifier = ">=1.23.2,<2" },
|
{ name = "onnxruntime", marker = "extra == 'rknn'", specifier = ">=1.23.2,<2" },
|
||||||
@@ -996,7 +996,7 @@ requires-dist = [
|
|||||||
{ name = "onnxruntime-openvino", marker = "extra == 'openvino'", specifier = ">=1.24.1,<2" },
|
{ name = "onnxruntime-openvino", marker = "extra == 'openvino'", specifier = ">=1.24.1,<2" },
|
||||||
{ name = "opencv-python-headless", specifier = ">=4.7.0.72,<5.0" },
|
{ name = "opencv-python-headless", specifier = ">=4.7.0.72,<5.0" },
|
||||||
{ name = "orjson", specifier = ">=3.9.5" },
|
{ name = "orjson", specifier = ">=3.9.5" },
|
||||||
{ name = "pillow", specifier = ">=12.2,<12.3" },
|
{ name = "pillow", specifier = ">=12.1.1,<12.2" },
|
||||||
{ name = "pydantic", specifier = ">=2.0.0,<3" },
|
{ name = "pydantic", specifier = ">=2.0.0,<3" },
|
||||||
{ name = "pydantic-settings", specifier = ">=2.5.2,<3" },
|
{ name = "pydantic-settings", specifier = ">=2.5.2,<3" },
|
||||||
{ name = "python-multipart", specifier = ">=0.0.6,<1.0" },
|
{ name = "python-multipart", specifier = ">=0.0.6,<1.0" },
|
||||||
@@ -1519,83 +1519,81 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "numpy"
|
name = "numpy"
|
||||||
version = "2.3.5"
|
version = "2.4.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" },
|
{ url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" },
|
{ url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" },
|
{ url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" },
|
{ url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" },
|
{ url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" },
|
{ url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" },
|
{ url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" },
|
{ url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" },
|
{ url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" },
|
{ url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" },
|
{ url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" },
|
{ url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" },
|
{ url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" },
|
{ url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" },
|
{ url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" },
|
{ url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" },
|
{ url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" },
|
{ url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" },
|
{ url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" },
|
{ url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" },
|
{ url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" },
|
{ url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" },
|
{ url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" },
|
{ url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" },
|
{ url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" },
|
{ url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" },
|
{ url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" },
|
{ url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" },
|
{ url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" },
|
{ url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" },
|
{ url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" },
|
{ url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" },
|
{ url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" },
|
{ url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" },
|
{ url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" },
|
{ url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" },
|
{ url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" },
|
{ url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" },
|
{ url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" },
|
{ url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" },
|
{ url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" },
|
{ url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" },
|
{ url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" },
|
{ url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" },
|
{ url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" },
|
{ url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" },
|
{ url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" },
|
{ url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" },
|
{ url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" },
|
{ url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" },
|
{ url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" },
|
{ url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" },
|
{ url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" },
|
{ url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" },
|
{ url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" },
|
{ url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1867,89 +1865,89 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pillow"
|
name = "pillow"
|
||||||
version = "12.2.0"
|
version = "12.1.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" },
|
{ url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" },
|
{ url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" },
|
{ url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" },
|
{ url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" },
|
{ url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" },
|
{ url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" },
|
{ url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" },
|
{ url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" },
|
{ url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" },
|
{ url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" },
|
{ url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" },
|
{ url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" },
|
{ url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" },
|
{ url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" },
|
{ url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" },
|
{ url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" },
|
{ url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" },
|
{ url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" },
|
{ url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" },
|
{ url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" },
|
{ url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" },
|
{ url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" },
|
{ url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" },
|
{ url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" },
|
{ url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" },
|
{ url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" },
|
{ url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" },
|
{ url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" },
|
{ url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" },
|
{ url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" },
|
{ url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" },
|
{ url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" },
|
{ url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" },
|
{ url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" },
|
{ url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" },
|
{ url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" },
|
{ url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" },
|
{ url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" },
|
{ url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" },
|
{ url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" },
|
{ url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" },
|
{ url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" },
|
{ url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" },
|
{ url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" },
|
{ url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" },
|
{ url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" },
|
{ url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" },
|
{ url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" },
|
{ url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" },
|
{ url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" },
|
{ url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" },
|
{ url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" },
|
{ url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" },
|
{ url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" },
|
{ url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" },
|
{ url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" },
|
{ url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" },
|
{ url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" },
|
{ url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" },
|
{ url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" },
|
{ url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" },
|
{ url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" },
|
{ url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" },
|
{ url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" },
|
{ url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" },
|
{ url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" },
|
{ url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" },
|
{ url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" },
|
{ url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" },
|
{ url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" },
|
{ url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" },
|
{ url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2183,7 +2181,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest"
|
name = "pytest"
|
||||||
version = "9.0.3"
|
version = "9.0.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||||
@@ -2192,9 +2190,9 @@ dependencies = [
|
|||||||
{ name = "pluggy" },
|
{ name = "pluggy" },
|
||||||
{ name = "pygments" },
|
{ name = "pygments" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2271,11 +2269,11 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "python-multipart"
|
name = "python-multipart"
|
||||||
version = "0.0.26"
|
version = "0.0.22"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/88/71/b145a380824a960ebd60e1014256dbb7d2253f2316ff2d73dfd8928ec2c3/python_multipart-0.0.26.tar.gz", hash = "sha256:08fadc45918cd615e26846437f50c5d6d23304da32c341f289a617127b081f17", size = 43501, upload-time = "2026-04-10T14:09:59.473Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/9a/22/f1925cdda983ab66fc8ec6ec8014b959262747e58bdca26a4e3d1da29d56/python_multipart-0.0.26-py3-none-any.whl", hash = "sha256:c0b169f8c4484c13b0dcf2ef0ec3a4adb255c4b7d18d8e420477d2b1dd03f185", size = 28847, upload-time = "2026-04-10T14:09:58.131Z" },
|
{ url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ config_roots = [
|
|||||||
[tools]
|
[tools]
|
||||||
node = "24.14.1"
|
node = "24.14.1"
|
||||||
flutter = "3.35.7"
|
flutter = "3.35.7"
|
||||||
pnpm = "10.33.0"
|
pnpm = "10.32.1"
|
||||||
terragrunt = "0.99.5"
|
terragrunt = "0.99.4"
|
||||||
opentofu = "1.11.5"
|
opentofu = "1.11.5"
|
||||||
java = "21.0.2"
|
java = "21.0.2"
|
||||||
|
|
||||||
|
|||||||
@@ -113,8 +113,8 @@ dependencies {
|
|||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
||||||
implementation 'org.chromium.net:cronet-embedded:143.7445.0'
|
implementation 'org.chromium.net:cronet-embedded:143.7445.0'
|
||||||
implementation("androidx.media3:media3-datasource-okhttp:1.10.0")
|
implementation("androidx.media3:media3-datasource-okhttp:1.9.2")
|
||||||
implementation("androidx.media3:media3-datasource-cronet:1.10.0")
|
implementation("androidx.media3:media3-datasource-cronet:1.9.2")
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
||||||
implementation "androidx.work:work-runtime-ktx:$work_version"
|
implementation "androidx.work:work-runtime-ktx:$work_version"
|
||||||
implementation "androidx.concurrent:concurrent-futures:$concurrent_version"
|
implementation "androidx.concurrent:concurrent-futures:$concurrent_version"
|
||||||
|
|||||||
@@ -0,0 +1,389 @@
|
|||||||
|
package app.alextran.immich
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.ContentResolver
|
||||||
|
import android.content.ContentUris
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.provider.MediaStore
|
||||||
|
import android.provider.Settings
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import io.flutter.embedding.engine.plugins.FlutterPlugin
|
||||||
|
import io.flutter.embedding.engine.plugins.activity.ActivityAware
|
||||||
|
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
|
||||||
|
import io.flutter.plugin.common.BinaryMessenger
|
||||||
|
import io.flutter.plugin.common.MethodCall
|
||||||
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
import io.flutter.plugin.common.MethodChannel.Result
|
||||||
|
import io.flutter.plugin.common.PluginRegistry
|
||||||
|
import java.security.MessageDigest
|
||||||
|
import java.io.FileInputStream
|
||||||
|
import kotlinx.coroutines.*
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Android plugin for Dart `BackgroundService` and file trash operations
|
||||||
|
*/
|
||||||
|
class BackgroundServicePlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAware, PluginRegistry.ActivityResultListener {
|
||||||
|
|
||||||
|
private var methodChannel: MethodChannel? = null
|
||||||
|
private var fileTrashChannel: MethodChannel? = null
|
||||||
|
private var context: Context? = null
|
||||||
|
private var pendingResult: Result? = null
|
||||||
|
private val permissionRequestCode = 1001
|
||||||
|
private val trashRequestCode = 1002
|
||||||
|
private var activityBinding: ActivityPluginBinding? = null
|
||||||
|
|
||||||
|
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
|
||||||
|
onAttachedToEngine(binding.applicationContext, binding.binaryMessenger)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onAttachedToEngine(ctx: Context, messenger: BinaryMessenger) {
|
||||||
|
context = ctx
|
||||||
|
methodChannel = MethodChannel(messenger, "immich/foregroundChannel")
|
||||||
|
methodChannel?.setMethodCallHandler(this)
|
||||||
|
|
||||||
|
// Add file trash channel
|
||||||
|
fileTrashChannel = MethodChannel(messenger, "file_trash")
|
||||||
|
fileTrashChannel?.setMethodCallHandler(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
|
||||||
|
onDetachedFromEngine()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onDetachedFromEngine() {
|
||||||
|
methodChannel?.setMethodCallHandler(null)
|
||||||
|
methodChannel = null
|
||||||
|
fileTrashChannel?.setMethodCallHandler(null)
|
||||||
|
fileTrashChannel = null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onMethodCall(call: MethodCall, result: Result) {
|
||||||
|
val ctx = context!!
|
||||||
|
when (call.method) {
|
||||||
|
// Existing BackgroundService methods
|
||||||
|
"enable" -> {
|
||||||
|
val args = call.arguments<ArrayList<*>>()!!
|
||||||
|
ctx.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
.edit()
|
||||||
|
.putBoolean(ContentObserverWorker.SHARED_PREF_SERVICE_ENABLED, true)
|
||||||
|
.putLong(BackupWorker.SHARED_PREF_CALLBACK_KEY, args[0] as Long)
|
||||||
|
.putString(BackupWorker.SHARED_PREF_NOTIFICATION_TITLE, args[1] as String)
|
||||||
|
.apply()
|
||||||
|
ContentObserverWorker.enable(ctx, immediate = args[2] as Boolean)
|
||||||
|
result.success(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
"configure" -> {
|
||||||
|
val args = call.arguments<ArrayList<*>>()!!
|
||||||
|
val requireUnmeteredNetwork = args[0] as Boolean
|
||||||
|
val requireCharging = args[1] as Boolean
|
||||||
|
val triggerUpdateDelay = (args[2] as Number).toLong()
|
||||||
|
val triggerMaxDelay = (args[3] as Number).toLong()
|
||||||
|
ContentObserverWorker.configureWork(
|
||||||
|
ctx,
|
||||||
|
requireUnmeteredNetwork,
|
||||||
|
requireCharging,
|
||||||
|
triggerUpdateDelay,
|
||||||
|
triggerMaxDelay
|
||||||
|
)
|
||||||
|
result.success(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
"disable" -> {
|
||||||
|
ContentObserverWorker.disable(ctx)
|
||||||
|
BackupWorker.stopWork(ctx)
|
||||||
|
result.success(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
"isEnabled" -> {
|
||||||
|
result.success(ContentObserverWorker.isEnabled(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
"isIgnoringBatteryOptimizations" -> {
|
||||||
|
result.success(BackupWorker.isIgnoringBatteryOptimizations(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
"digestFiles" -> {
|
||||||
|
val args = call.arguments<ArrayList<String>>()!!
|
||||||
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
val buf = ByteArray(BUFFER_SIZE)
|
||||||
|
val digest: MessageDigest = MessageDigest.getInstance("SHA-1")
|
||||||
|
val hashes = arrayOfNulls<ByteArray>(args.size)
|
||||||
|
for (i in args.indices) {
|
||||||
|
val path = args[i]
|
||||||
|
var len = 0
|
||||||
|
try {
|
||||||
|
val file = FileInputStream(path)
|
||||||
|
file.use { assetFile ->
|
||||||
|
while (true) {
|
||||||
|
len = assetFile.read(buf)
|
||||||
|
if (len != BUFFER_SIZE) break
|
||||||
|
digest.update(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
digest.update(buf, 0, len)
|
||||||
|
hashes[i] = digest.digest()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// skip this file
|
||||||
|
Log.w(TAG, "Failed to hash file ${args[i]}: $e")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.success(hashes.asList())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// File Trash methods moved from MainActivity
|
||||||
|
"moveToTrash" -> {
|
||||||
|
val mediaUrls = call.argument<List<String>>("mediaUrls")
|
||||||
|
if (mediaUrls != null) {
|
||||||
|
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) && hasManageMediaPermission()) {
|
||||||
|
moveToTrash(mediaUrls, result)
|
||||||
|
} else {
|
||||||
|
result.error("PERMISSION_DENIED", "Media permission required", null)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.error("INVALID_NAME", "The mediaUrls is not specified.", null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"restoreFromTrash" -> {
|
||||||
|
val fileName = call.argument<String>("fileName")
|
||||||
|
val type = call.argument<Int>("type")
|
||||||
|
val mediaId = call.argument<String>("mediaId")
|
||||||
|
if (fileName != null && type != null) {
|
||||||
|
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) && hasManageMediaPermission()) {
|
||||||
|
restoreFromTrash(fileName, type, result)
|
||||||
|
} else {
|
||||||
|
result.error("PERMISSION_DENIED", "Media permission required", null)
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
if (mediaId != null && type != null) {
|
||||||
|
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) && hasManageMediaPermission()) {
|
||||||
|
restoreFromTrashById(mediaId, type, result)
|
||||||
|
} else {
|
||||||
|
result.error("PERMISSION_DENIED", "Media permission required", null)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.error("INVALID_PARAMS", "Required params are not specified.", null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"requestManageMediaPermission" -> {
|
||||||
|
if (!hasManageMediaPermission()) {
|
||||||
|
requestManageMediaPermission(result)
|
||||||
|
} else {
|
||||||
|
Log.e("Manage storage permission", "Permission already granted")
|
||||||
|
result.success(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"hasManageMediaPermission" -> {
|
||||||
|
if (hasManageMediaPermission()) {
|
||||||
|
Log.i("Manage storage permission", "Permission already granted")
|
||||||
|
result.success(true)
|
||||||
|
} else {
|
||||||
|
result.success(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"manageMediaPermission" -> requestManageMediaPermission(result)
|
||||||
|
|
||||||
|
else -> result.notImplemented()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasManageMediaPermission(): Boolean {
|
||||||
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
MediaStore.canManageMedia(context!!);
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requestManageMediaPermission(result: Result) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
pendingResult = result // Store the result callback
|
||||||
|
val activity = activityBinding?.activity ?: return
|
||||||
|
|
||||||
|
val intent = Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA)
|
||||||
|
intent.data = "package:${activity.packageName}".toUri()
|
||||||
|
activity.startActivityForResult(intent, permissionRequestCode)
|
||||||
|
} else {
|
||||||
|
result.success(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun moveToTrash(mediaUrls: List<String>, result: Result) {
|
||||||
|
val urisToTrash = mediaUrls.map { it.toUri() }
|
||||||
|
if (urisToTrash.isEmpty()) {
|
||||||
|
result.error("INVALID_ARGS", "No valid URIs provided", null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleTrash(urisToTrash, true, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun restoreFromTrash(name: String, type: Int, result: Result) {
|
||||||
|
val uri = getTrashedFileUri(name, type)
|
||||||
|
if (uri == null) {
|
||||||
|
Log.e("TrashError", "Asset Uri cannot be found obtained")
|
||||||
|
result.error("TrashError", "Asset Uri cannot be found obtained", null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Log.e("FILE_URI", uri.toString())
|
||||||
|
uri.let { toggleTrash(listOf(it), false, result) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun restoreFromTrashById(mediaId: String, type: Int, result: Result) {
|
||||||
|
val id = mediaId.toLongOrNull()
|
||||||
|
if (id == null) {
|
||||||
|
result.error("INVALID_ID", "The file id is not a valid number: $mediaId", null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!isInTrash(id)) {
|
||||||
|
result.error("TrashNotFound", "Item with id=$id not found in trash", null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val uri = ContentUris.withAppendedId(contentUriForType(type), id)
|
||||||
|
|
||||||
|
try {
|
||||||
|
Log.i(TAG, "restoreFromTrashById: uri=$uri (type=$type,id=$id)")
|
||||||
|
restoreUris(listOf(uri), result)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.w(TAG, "restoreFromTrashById failed", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun toggleTrash(contentUris: List<Uri>, isTrashed: Boolean, result: Result) {
|
||||||
|
val activity = activityBinding?.activity
|
||||||
|
val contentResolver = context?.contentResolver
|
||||||
|
if (activity == null || contentResolver == null) {
|
||||||
|
result.error("TrashError", "Activity or ContentResolver not available", null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
val pendingIntent = MediaStore.createTrashRequest(contentResolver, contentUris, isTrashed)
|
||||||
|
pendingResult = result // Store for onActivityResult
|
||||||
|
activity.startIntentSenderForResult(
|
||||||
|
pendingIntent.intentSender,
|
||||||
|
trashRequestCode,
|
||||||
|
null, 0, 0, 0
|
||||||
|
)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e("TrashError", "Error creating or starting trash request", e)
|
||||||
|
result.error("TrashError", "Error creating or starting trash request", null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun getTrashedFileUri(fileName: String, type: Int): Uri? {
|
||||||
|
val contentResolver = context?.contentResolver ?: return null
|
||||||
|
val queryUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
|
||||||
|
val projection = arrayOf(MediaStore.Files.FileColumns._ID)
|
||||||
|
|
||||||
|
val queryArgs = Bundle().apply {
|
||||||
|
putString(
|
||||||
|
ContentResolver.QUERY_ARG_SQL_SELECTION,
|
||||||
|
"${MediaStore.Files.FileColumns.DISPLAY_NAME} = ?"
|
||||||
|
)
|
||||||
|
putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, arrayOf(fileName))
|
||||||
|
putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_ONLY)
|
||||||
|
}
|
||||||
|
|
||||||
|
contentResolver.query(queryUri, projection, queryArgs, null)?.use { cursor ->
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
val id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID))
|
||||||
|
return ContentUris.withAppendedId(contentUriForType(type), id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// ActivityAware implementation
|
||||||
|
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
|
||||||
|
activityBinding = binding
|
||||||
|
binding.addActivityResultListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDetachedFromActivityForConfigChanges() {
|
||||||
|
activityBinding?.removeActivityResultListener(this)
|
||||||
|
activityBinding = null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
|
||||||
|
activityBinding = binding
|
||||||
|
binding.addActivityResultListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDetachedFromActivity() {
|
||||||
|
activityBinding?.removeActivityResultListener(this)
|
||||||
|
activityBinding = null
|
||||||
|
}
|
||||||
|
|
||||||
|
// ActivityResultListener implementation
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
|
||||||
|
if (requestCode == permissionRequestCode) {
|
||||||
|
val granted = hasManageMediaPermission()
|
||||||
|
pendingResult?.success(granted)
|
||||||
|
pendingResult = null
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestCode == trashRequestCode) {
|
||||||
|
val approved = resultCode == Activity.RESULT_OK
|
||||||
|
pendingResult?.success(approved)
|
||||||
|
pendingResult = null
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun isInTrash(id: Long): Boolean {
|
||||||
|
val contentResolver = context?.contentResolver ?: return false
|
||||||
|
val filesUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
|
||||||
|
val args = Bundle().apply {
|
||||||
|
putString(ContentResolver.QUERY_ARG_SQL_SELECTION, "${MediaStore.Files.FileColumns._ID}=?")
|
||||||
|
putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, arrayOf(id.toString()))
|
||||||
|
putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_ONLY)
|
||||||
|
putInt(ContentResolver.QUERY_ARG_LIMIT, 1)
|
||||||
|
}
|
||||||
|
return contentResolver.query(filesUri, arrayOf(MediaStore.Files.FileColumns._ID), args, null)
|
||||||
|
?.use { it.moveToFirst() } == true
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
private fun restoreUris(uris: List<Uri>, result: Result) {
|
||||||
|
if (uris.isEmpty()) {
|
||||||
|
result.error("TrashError", "No URIs to restore", null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Log.i(TAG, "restoreUris: count=${uris.size}, first=${uris.first()}")
|
||||||
|
toggleTrash(uris, false, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.Q)
|
||||||
|
private fun contentUriForType(type: Int): Uri =
|
||||||
|
when (type) {
|
||||||
|
// same order as AssetType from dart
|
||||||
|
1 -> MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
||||||
|
2 -> MediaStore.Video.Media.EXTERNAL_CONTENT_URI
|
||||||
|
3 -> MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
|
||||||
|
else -> MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private const val TAG = "BackgroundServicePlugin"
|
||||||
|
private const val BUFFER_SIZE = 2 * 1024 * 1024
|
||||||
@@ -0,0 +1,394 @@
|
|||||||
|
package app.alextran.immich
|
||||||
|
|
||||||
|
import android.app.Notification
|
||||||
|
import android.app.NotificationChannel
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.os.SystemClock
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.concurrent.futures.ResolvableFuture
|
||||||
|
import androidx.work.BackoffPolicy
|
||||||
|
import androidx.work.Constraints
|
||||||
|
import androidx.work.ForegroundInfo
|
||||||
|
import androidx.work.ListenableWorker
|
||||||
|
import androidx.work.NetworkType
|
||||||
|
import androidx.work.WorkerParameters
|
||||||
|
import androidx.work.ExistingWorkPolicy
|
||||||
|
import androidx.work.OneTimeWorkRequest
|
||||||
|
import androidx.work.WorkManager
|
||||||
|
import androidx.work.WorkInfo
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture
|
||||||
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
|
import io.flutter.embedding.engine.dart.DartExecutor
|
||||||
|
import io.flutter.embedding.engine.loader.FlutterLoader
|
||||||
|
import io.flutter.plugin.common.MethodCall
|
||||||
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
import io.flutter.view.FlutterCallbackInformation
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Worker executed by Android WorkManager to perform backup in background
|
||||||
|
*
|
||||||
|
* Starts the Dart runtime/engine and calls `_nativeEntry` function in
|
||||||
|
* `background.service.dart` to run the actual backup logic.
|
||||||
|
* Called by Android WorkManager when all constraints for the work are met,
|
||||||
|
* i.e. battery is not low and optionally Wifi and charging are active.
|
||||||
|
*/
|
||||||
|
class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ctx, params),
|
||||||
|
MethodChannel.MethodCallHandler {
|
||||||
|
|
||||||
|
private val resolvableFuture = ResolvableFuture.create<Result>()
|
||||||
|
private var engine: FlutterEngine? = null
|
||||||
|
private lateinit var backgroundChannel: MethodChannel
|
||||||
|
private val notificationManager =
|
||||||
|
ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||||
|
private val isIgnoringBatteryOptimizations = isIgnoringBatteryOptimizations(applicationContext)
|
||||||
|
private var timeBackupStarted: Long = 0L
|
||||||
|
private var notificationBuilder: NotificationCompat.Builder? = null
|
||||||
|
private var notificationDetailBuilder: NotificationCompat.Builder? = null
|
||||||
|
private var fgFuture: ListenableFuture<Void>? = null
|
||||||
|
|
||||||
|
override fun startWork(): ListenableFuture<ListenableWorker.Result> {
|
||||||
|
|
||||||
|
Log.d(TAG, "startWork")
|
||||||
|
|
||||||
|
val ctx = applicationContext
|
||||||
|
|
||||||
|
if (!flutterLoader.initialized()) {
|
||||||
|
flutterLoader.startInitialization(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a Notification channel
|
||||||
|
createChannel()
|
||||||
|
|
||||||
|
Log.d(TAG, "isIgnoringBatteryOptimizations $isIgnoringBatteryOptimizations")
|
||||||
|
if (isIgnoringBatteryOptimizations) {
|
||||||
|
// normal background services can only up to 10 minutes
|
||||||
|
// foreground services are allowed to run indefinitely
|
||||||
|
// requires battery optimizations to be disabled (either manually by the user
|
||||||
|
// or by the system learning that immich is important to the user)
|
||||||
|
val title = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
.getString(SHARED_PREF_NOTIFICATION_TITLE, NOTIFICATION_DEFAULT_TITLE)!!
|
||||||
|
showInfo(getInfoBuilder(title, indeterminate = true).build())
|
||||||
|
}
|
||||||
|
|
||||||
|
engine = FlutterEngine(ctx)
|
||||||
|
|
||||||
|
flutterLoader.ensureInitializationCompleteAsync(ctx, null, Handler(Looper.getMainLooper())) {
|
||||||
|
runDart()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolvableFuture
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the Dart runtime/engine and calls `_nativeEntry` function in
|
||||||
|
* `background.service.dart` to run the actual backup logic.
|
||||||
|
*/
|
||||||
|
private fun runDart() {
|
||||||
|
val callbackDispatcherHandle = applicationContext.getSharedPreferences(
|
||||||
|
SHARED_PREF_NAME, Context.MODE_PRIVATE
|
||||||
|
).getLong(SHARED_PREF_CALLBACK_KEY, 0L)
|
||||||
|
val callbackInformation =
|
||||||
|
FlutterCallbackInformation.lookupCallbackInformation(callbackDispatcherHandle)
|
||||||
|
val appBundlePath = flutterLoader.findAppBundlePath()
|
||||||
|
|
||||||
|
engine?.let { engine ->
|
||||||
|
backgroundChannel = MethodChannel(engine.dartExecutor, "immich/backgroundChannel")
|
||||||
|
backgroundChannel.setMethodCallHandler(this@BackupWorker)
|
||||||
|
engine.dartExecutor.executeDartCallback(
|
||||||
|
DartExecutor.DartCallback(
|
||||||
|
applicationContext.assets,
|
||||||
|
appBundlePath,
|
||||||
|
callbackInformation
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStopped() {
|
||||||
|
Log.d(TAG, "onStopped")
|
||||||
|
// called when the system has to stop this worker because constraints are
|
||||||
|
// no longer met or the system needs resources for more important tasks
|
||||||
|
Handler(Looper.getMainLooper()).postAtFrontOfQueue {
|
||||||
|
if (::backgroundChannel.isInitialized) {
|
||||||
|
backgroundChannel.invokeMethod("systemStop", null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
waitOnSetForegroundAsync()
|
||||||
|
// cannot await/get(block) on resolvableFuture as its already cancelled (would throw CancellationException)
|
||||||
|
// instead, wait for 5 seconds until forcefully stopping backup work
|
||||||
|
Handler(Looper.getMainLooper()).postDelayed({
|
||||||
|
stopEngine(null)
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun waitOnSetForegroundAsync() {
|
||||||
|
val fgFuture = this.fgFuture
|
||||||
|
if (fgFuture != null && !fgFuture.isCancelled && !fgFuture.isDone) {
|
||||||
|
try {
|
||||||
|
fgFuture.get(500, TimeUnit.MILLISECONDS)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// ignored, there is nothing to be done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun stopEngine(result: Result?) {
|
||||||
|
clearBackgroundNotification()
|
||||||
|
engine?.destroy()
|
||||||
|
engine = null
|
||||||
|
if (result != null) {
|
||||||
|
Log.d(TAG, "stopEngine result=${result}")
|
||||||
|
resolvableFuture.set(result)
|
||||||
|
}
|
||||||
|
waitOnSetForegroundAsync()
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
|
||||||
|
override fun onMethodCall(call: MethodCall, r: MethodChannel.Result) {
|
||||||
|
when (call.method) {
|
||||||
|
"initialized" -> {
|
||||||
|
timeBackupStarted = SystemClock.uptimeMillis()
|
||||||
|
backgroundChannel.invokeMethod(
|
||||||
|
"onAssetsChanged",
|
||||||
|
null,
|
||||||
|
object : MethodChannel.Result {
|
||||||
|
override fun notImplemented() {
|
||||||
|
stopEngine(Result.failure())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
|
||||||
|
stopEngine(Result.failure())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun success(receivedResult: Any?) {
|
||||||
|
val success = receivedResult as Boolean
|
||||||
|
stopEngine(if (success) Result.success() else Result.retry())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
"updateNotification" -> {
|
||||||
|
val args = call.arguments<ArrayList<*>>()!!
|
||||||
|
val title = args[0] as String?
|
||||||
|
val content = args[1] as String?
|
||||||
|
val progress = args[2] as Int
|
||||||
|
val max = args[3] as Int
|
||||||
|
val indeterminate = args[4] as Boolean
|
||||||
|
val isDetail = args[5] as Boolean
|
||||||
|
val onlyIfFG = args[6] as Boolean
|
||||||
|
if (!onlyIfFG || isIgnoringBatteryOptimizations) {
|
||||||
|
showInfo(
|
||||||
|
getInfoBuilder(title, content, isDetail, progress, max, indeterminate).build(),
|
||||||
|
isDetail
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"showError" -> {
|
||||||
|
val args = call.arguments<ArrayList<*>>()!!
|
||||||
|
val title = args[0] as String
|
||||||
|
val content = args[1] as String?
|
||||||
|
val individualTag = args[2] as String?
|
||||||
|
showError(title, content, individualTag)
|
||||||
|
}
|
||||||
|
|
||||||
|
"clearErrorNotifications" -> clearErrorNotifications()
|
||||||
|
"hasContentChanged" -> {
|
||||||
|
val lastChange = applicationContext
|
||||||
|
.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
.getLong(SHARED_PREF_LAST_CHANGE, timeBackupStarted)
|
||||||
|
val hasContentChanged = lastChange > timeBackupStarted;
|
||||||
|
timeBackupStarted = SystemClock.uptimeMillis()
|
||||||
|
r.success(hasContentChanged)
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> r.notImplemented()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showError(title: String, content: String?, individualTag: String?) {
|
||||||
|
val notification = NotificationCompat.Builder(applicationContext, NOTIFICATION_CHANNEL_ERROR_ID)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setTicker(title)
|
||||||
|
.setContentText(content)
|
||||||
|
.setSmallIcon(R.drawable.notification_icon)
|
||||||
|
.build()
|
||||||
|
notificationManager.notify(individualTag, NOTIFICATION_ERROR_ID, notification)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun clearErrorNotifications() {
|
||||||
|
notificationManager.cancel(NOTIFICATION_ERROR_ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun clearBackgroundNotification() {
|
||||||
|
notificationManager.cancel(NOTIFICATION_ID)
|
||||||
|
notificationManager.cancel(NOTIFICATION_DETAIL_ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showInfo(notification: Notification, isDetail: Boolean = false) {
|
||||||
|
val id = if (isDetail) NOTIFICATION_DETAIL_ID else NOTIFICATION_ID
|
||||||
|
|
||||||
|
if (isIgnoringBatteryOptimizations && !isDetail) {
|
||||||
|
fgFuture = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
setForegroundAsync(ForegroundInfo(id, notification, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE))
|
||||||
|
} else {
|
||||||
|
setForegroundAsync(ForegroundInfo(id, notification))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notificationManager.notify(id, notification)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getInfoBuilder(
|
||||||
|
title: String? = null,
|
||||||
|
content: String? = null,
|
||||||
|
isDetail: Boolean = false,
|
||||||
|
progress: Int = 0,
|
||||||
|
max: Int = 0,
|
||||||
|
indeterminate: Boolean = false,
|
||||||
|
): NotificationCompat.Builder {
|
||||||
|
var builder = if (isDetail) notificationDetailBuilder else notificationBuilder
|
||||||
|
if (builder == null) {
|
||||||
|
builder = NotificationCompat.Builder(applicationContext, NOTIFICATION_CHANNEL_ID)
|
||||||
|
.setSmallIcon(R.drawable.notification_icon)
|
||||||
|
.setOnlyAlertOnce(true)
|
||||||
|
.setOngoing(true)
|
||||||
|
if (isDetail) {
|
||||||
|
notificationDetailBuilder = builder
|
||||||
|
} else {
|
||||||
|
notificationBuilder = builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (title != null) {
|
||||||
|
builder.setTicker(title).setContentTitle(title)
|
||||||
|
}
|
||||||
|
if (content != null) {
|
||||||
|
builder.setContentText(content)
|
||||||
|
}
|
||||||
|
return builder.setProgress(max, progress, indeterminate)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createChannel() {
|
||||||
|
val foreground = NotificationChannel(
|
||||||
|
NOTIFICATION_CHANNEL_ID,
|
||||||
|
NOTIFICATION_CHANNEL_ID,
|
||||||
|
NotificationManager.IMPORTANCE_LOW
|
||||||
|
)
|
||||||
|
notificationManager.createNotificationChannel(foreground)
|
||||||
|
val error = NotificationChannel(
|
||||||
|
NOTIFICATION_CHANNEL_ERROR_ID,
|
||||||
|
NOTIFICATION_CHANNEL_ERROR_ID,
|
||||||
|
NotificationManager.IMPORTANCE_HIGH
|
||||||
|
)
|
||||||
|
notificationManager.createNotificationChannel(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val SHARED_PREF_NAME = "immichBackgroundService"
|
||||||
|
const val SHARED_PREF_CALLBACK_KEY = "callbackDispatcherHandle"
|
||||||
|
const val SHARED_PREF_NOTIFICATION_TITLE = "notificationTitle"
|
||||||
|
const val SHARED_PREF_LAST_CHANGE = "lastChange"
|
||||||
|
|
||||||
|
private const val TASK_NAME_BACKUP = "immich/BackupWorker"
|
||||||
|
private const val NOTIFICATION_CHANNEL_ID = "immich/backgroundService"
|
||||||
|
private const val NOTIFICATION_CHANNEL_ERROR_ID = "immich/backgroundServiceError"
|
||||||
|
private const val NOTIFICATION_DEFAULT_TITLE = "Immich"
|
||||||
|
private const val NOTIFICATION_ID = 1
|
||||||
|
private const val NOTIFICATION_ERROR_ID = 2
|
||||||
|
private const val NOTIFICATION_DETAIL_ID = 3
|
||||||
|
private const val ONE_MINUTE = 60000L
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enqueues the BackupWorker to run once the constraints are met
|
||||||
|
*/
|
||||||
|
fun enqueueBackupWorker(
|
||||||
|
context: Context,
|
||||||
|
requireWifi: Boolean = false,
|
||||||
|
requireCharging: Boolean = false,
|
||||||
|
delayMilliseconds: Long = 0L
|
||||||
|
) {
|
||||||
|
val workRequest = buildWorkRequest(requireWifi, requireCharging, delayMilliseconds)
|
||||||
|
WorkManager.getInstance(context)
|
||||||
|
.enqueueUniqueWork(TASK_NAME_BACKUP, ExistingWorkPolicy.KEEP, workRequest)
|
||||||
|
Log.d(TAG, "enqueueBackupWorker: BackupWorker enqueued")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the constraints of an already enqueued BackupWorker
|
||||||
|
*/
|
||||||
|
fun updateBackupWorker(
|
||||||
|
context: Context,
|
||||||
|
requireWifi: Boolean = false,
|
||||||
|
requireCharging: Boolean = false
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
val wm = WorkManager.getInstance(context)
|
||||||
|
val workInfoFuture = wm.getWorkInfosForUniqueWork(TASK_NAME_BACKUP)
|
||||||
|
val workInfoList = workInfoFuture.get(1000, TimeUnit.MILLISECONDS)
|
||||||
|
if (workInfoList != null) {
|
||||||
|
for (workInfo in workInfoList) {
|
||||||
|
if (workInfo.state == WorkInfo.State.ENQUEUED) {
|
||||||
|
val workRequest = buildWorkRequest(requireWifi, requireCharging)
|
||||||
|
wm.enqueueUniqueWork(TASK_NAME_BACKUP, ExistingWorkPolicy.REPLACE, workRequest)
|
||||||
|
Log.d(TAG, "updateBackupWorker updated BackupWorker constraints")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.d(TAG, "updateBackupWorker: BackupWorker not enqueued")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.d(TAG, "updateBackupWorker failed: $e")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the currently running worker (if any) and removes it from the work queue
|
||||||
|
*/
|
||||||
|
fun stopWork(context: Context) {
|
||||||
|
WorkManager.getInstance(context).cancelUniqueWork(TASK_NAME_BACKUP)
|
||||||
|
Log.d(TAG, "stopWork: BackupWorker cancelled")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns `true` if the app is ignoring battery optimizations
|
||||||
|
*/
|
||||||
|
fun isIgnoringBatteryOptimizations(ctx: Context): Boolean {
|
||||||
|
val powerManager = ctx.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||||
|
return powerManager.isIgnoringBatteryOptimizations(ctx.packageName)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildWorkRequest(
|
||||||
|
requireWifi: Boolean = false,
|
||||||
|
requireCharging: Boolean = false,
|
||||||
|
delayMilliseconds: Long = 0L
|
||||||
|
): OneTimeWorkRequest {
|
||||||
|
val constraints = Constraints.Builder()
|
||||||
|
.setRequiredNetworkType(if (requireWifi) NetworkType.UNMETERED else NetworkType.CONNECTED)
|
||||||
|
.setRequiresBatteryNotLow(true)
|
||||||
|
.setRequiresCharging(requireCharging)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
val work = OneTimeWorkRequest.Builder(BackupWorker::class.java)
|
||||||
|
.setConstraints(constraints)
|
||||||
|
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, ONE_MINUTE, TimeUnit.MILLISECONDS)
|
||||||
|
.setInitialDelay(delayMilliseconds, TimeUnit.MILLISECONDS)
|
||||||
|
.build()
|
||||||
|
return work
|
||||||
|
}
|
||||||
|
|
||||||
|
private val flutterLoader = FlutterLoader()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private const val TAG = "BackupWorker"
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package app.alextran.immich
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.SystemClock
|
||||||
|
import android.provider.MediaStore
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.work.Constraints
|
||||||
|
import androidx.work.Worker
|
||||||
|
import androidx.work.WorkerParameters
|
||||||
|
import androidx.work.ExistingWorkPolicy
|
||||||
|
import androidx.work.OneTimeWorkRequest
|
||||||
|
import androidx.work.WorkManager
|
||||||
|
import androidx.work.Operation
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Worker executed by Android WorkManager observing content changes (new photos/videos)
|
||||||
|
*
|
||||||
|
* Immediately enqueues the BackupWorker when running.
|
||||||
|
* As this work is not triggered periodically, but on content change, the
|
||||||
|
* worker enqueues itself again after each run.
|
||||||
|
*/
|
||||||
|
class ContentObserverWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
|
||||||
|
|
||||||
|
override fun doWork(): Result {
|
||||||
|
if (!isEnabled(applicationContext)) {
|
||||||
|
return Result.failure()
|
||||||
|
}
|
||||||
|
if (triggeredContentUris.size > 0) {
|
||||||
|
startBackupWorker(applicationContext, delayMilliseconds = 0)
|
||||||
|
}
|
||||||
|
enqueueObserverWorker(applicationContext, ExistingWorkPolicy.REPLACE)
|
||||||
|
return Result.success()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val SHARED_PREF_SERVICE_ENABLED = "serviceEnabled"
|
||||||
|
private const val SHARED_PREF_REQUIRE_WIFI = "requireWifi"
|
||||||
|
private const val SHARED_PREF_REQUIRE_CHARGING = "requireCharging"
|
||||||
|
private const val SHARED_PREF_TRIGGER_UPDATE_DELAY = "triggerUpdateDelay"
|
||||||
|
private const val SHARED_PREF_TRIGGER_MAX_DELAY = "triggerMaxDelay"
|
||||||
|
|
||||||
|
private const val TASK_NAME_OBSERVER = "immich/ContentObserver"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enqueues the `ContentObserverWorker`.
|
||||||
|
*
|
||||||
|
* @param context Android Context
|
||||||
|
*/
|
||||||
|
fun enable(context: Context, immediate: Boolean = false) {
|
||||||
|
enqueueObserverWorker(context, ExistingWorkPolicy.KEEP)
|
||||||
|
Log.d(TAG, "enabled ContentObserverWorker")
|
||||||
|
if (immediate) {
|
||||||
|
startBackupWorker(context, delayMilliseconds = 5000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the `BackupWorker` to run when all constraints are met.
|
||||||
|
*
|
||||||
|
* @param context Android Context
|
||||||
|
* @param requireWifi if true, task only runs if connected to wifi
|
||||||
|
* @param requireCharging if true, task only runs if device is charging
|
||||||
|
*/
|
||||||
|
fun configureWork(context: Context,
|
||||||
|
requireWifi: Boolean = false,
|
||||||
|
requireCharging: Boolean = false,
|
||||||
|
triggerUpdateDelay: Long = 5000,
|
||||||
|
triggerMaxDelay: Long = 50000) {
|
||||||
|
context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
.edit()
|
||||||
|
.putBoolean(SHARED_PREF_SERVICE_ENABLED, true)
|
||||||
|
.putBoolean(SHARED_PREF_REQUIRE_WIFI, requireWifi)
|
||||||
|
.putBoolean(SHARED_PREF_REQUIRE_CHARGING, requireCharging)
|
||||||
|
.putLong(SHARED_PREF_TRIGGER_UPDATE_DELAY, triggerUpdateDelay)
|
||||||
|
.putLong(SHARED_PREF_TRIGGER_MAX_DELAY, triggerMaxDelay)
|
||||||
|
.apply()
|
||||||
|
BackupWorker.updateBackupWorker(context, requireWifi, requireCharging)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the currently running worker (if any) and removes it from the work queue
|
||||||
|
*/
|
||||||
|
fun disable(context: Context) {
|
||||||
|
context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
.edit().putBoolean(SHARED_PREF_SERVICE_ENABLED, false).apply()
|
||||||
|
WorkManager.getInstance(context).cancelUniqueWork(TASK_NAME_OBSERVER)
|
||||||
|
Log.d(TAG, "disabled ContentObserverWorker")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the user has enabled the background backup service
|
||||||
|
*/
|
||||||
|
fun isEnabled(ctx: Context): Boolean {
|
||||||
|
return ctx.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
.getBoolean(SHARED_PREF_SERVICE_ENABLED, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enqueue and replace the worker without the content trigger but with a short delay
|
||||||
|
*/
|
||||||
|
fun workManagerAppClearedWorkaround(context: Context) {
|
||||||
|
val work = OneTimeWorkRequest.Builder(ContentObserverWorker::class.java)
|
||||||
|
.setInitialDelay(500, TimeUnit.MILLISECONDS)
|
||||||
|
.build()
|
||||||
|
WorkManager
|
||||||
|
.getInstance(context)
|
||||||
|
.enqueueUniqueWork(TASK_NAME_OBSERVER, ExistingWorkPolicy.REPLACE, work)
|
||||||
|
.result
|
||||||
|
.get()
|
||||||
|
Log.d(TAG, "workManagerAppClearedWorkaround")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun enqueueObserverWorker(context: Context, policy: ExistingWorkPolicy) {
|
||||||
|
val sp = context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
val constraints = Constraints.Builder()
|
||||||
|
.addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true)
|
||||||
|
.addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true)
|
||||||
|
.addContentUriTrigger(MediaStore.Video.Media.INTERNAL_CONTENT_URI, true)
|
||||||
|
.addContentUriTrigger(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true)
|
||||||
|
.setTriggerContentUpdateDelay(sp.getLong(SHARED_PREF_TRIGGER_UPDATE_DELAY, 5000), TimeUnit.MILLISECONDS)
|
||||||
|
.setTriggerContentMaxDelay(sp.getLong(SHARED_PREF_TRIGGER_MAX_DELAY, 50000), TimeUnit.MILLISECONDS)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val work = OneTimeWorkRequest.Builder(ContentObserverWorker::class.java)
|
||||||
|
.setConstraints(constraints)
|
||||||
|
.build()
|
||||||
|
WorkManager.getInstance(context).enqueueUniqueWork(TASK_NAME_OBSERVER, policy, work)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun startBackupWorker(context: Context, delayMilliseconds: Long) {
|
||||||
|
val sp = context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
if (!sp.getBoolean(SHARED_PREF_SERVICE_ENABLED, false))
|
||||||
|
return
|
||||||
|
val requireWifi = sp.getBoolean(SHARED_PREF_REQUIRE_WIFI, true)
|
||||||
|
val requireCharging = sp.getBoolean(SHARED_PREF_REQUIRE_CHARGING, false)
|
||||||
|
BackupWorker.enqueueBackupWorker(context, requireWifi, requireCharging, delayMilliseconds)
|
||||||
|
sp.edit().putLong(BackupWorker.SHARED_PREF_LAST_CHANGE, SystemClock.uptimeMillis()).apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private const val TAG = "ContentObserverWorker"
|
||||||
@@ -18,6 +18,8 @@ class ImmichApp : Application() {
|
|||||||
// Thus, the BackupWorker is not started. If the system kills the process after each initialization
|
// 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.
|
// (because of low memory etc.), the backup is never performed.
|
||||||
// As a workaround, we also run a backup check when initializing the application
|
// As a workaround, we also run a backup check when initializing the application
|
||||||
|
|
||||||
|
ContentObserverWorker.startBackupWorker(context = this, delayMilliseconds = 0)
|
||||||
Handler(Looper.getMainLooper()).postDelayed({
|
Handler(Looper.getMainLooper()).postDelayed({
|
||||||
// We can only check the engine count and not the status of the lock here,
|
// We can only check the engine count and not the status of the lock here,
|
||||||
// as the previous start might have been killed without unlocking.
|
// as the previous start might have been killed without unlocking.
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ class MainActivity : FlutterFragmentActivity() {
|
|||||||
BackgroundWorkerFgHostApi.setUp(messenger, BackgroundWorkerApiImpl(ctx))
|
BackgroundWorkerFgHostApi.setUp(messenger, BackgroundWorkerApiImpl(ctx))
|
||||||
ConnectivityApi.setUp(messenger, ConnectivityApiImpl(ctx))
|
ConnectivityApi.setUp(messenger, ConnectivityApiImpl(ctx))
|
||||||
|
|
||||||
|
flutterEngine.plugins.add(BackgroundServicePlugin())
|
||||||
flutterEngine.plugins.add(backgroundEngineLockImpl)
|
flutterEngine.plugins.add(backgroundEngineLockImpl)
|
||||||
flutterEngine.plugins.add(nativeSyncApiImpl)
|
flutterEngine.plugins.add(nativeSyncApiImpl)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ platform :android do
|
|||||||
task: 'bundle',
|
task: 'bundle',
|
||||||
build_type: 'Release',
|
build_type: 'Release',
|
||||||
properties: {
|
properties: {
|
||||||
"android.injected.version.code" => 3046,
|
"android.injected.version.code" => 3041,
|
||||||
"android.injected.version.name" => "2.7.5",
|
"android.injected.version.name" => "2.6.3",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab')
|
upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab')
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:flutter_test/flutter_test.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/entities/store.entity.dart';
|
import 'package:immich_mobile/entities/store.entity.dart';
|
||||||
import 'package:immich_mobile/main.dart' as app;
|
import 'package:immich_mobile/main.dart' as app;
|
||||||
|
import 'package:immich_mobile/providers/db.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||||
import 'package:immich_mobile/utils/bootstrap.dart';
|
import 'package:immich_mobile/utils/bootstrap.dart';
|
||||||
import 'package:integration_test/integration_test.dart';
|
import 'package:integration_test/integration_test.dart';
|
||||||
@@ -38,11 +39,20 @@ class ImmichTestHelper {
|
|||||||
static Future<void> loadApp(WidgetTester tester) async {
|
static Future<void> loadApp(WidgetTester tester) async {
|
||||||
await EasyLocalization.ensureInitialized();
|
await EasyLocalization.ensureInitialized();
|
||||||
// Clear all data from Isar (reuse existing instance if available)
|
// Clear all data from Isar (reuse existing instance if available)
|
||||||
final (drift, _) = await Bootstrap.initDomain();
|
final (isar, drift, logDb) = await Bootstrap.initDB();
|
||||||
|
await Bootstrap.initDomain(isar, drift, logDb);
|
||||||
await Store.clear();
|
await Store.clear();
|
||||||
|
await isar.writeTxn(() => isar.clear());
|
||||||
// Load main Widget
|
// Load main Widget
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
ProviderScope(overrides: [driftProvider.overrideWith(driftOverride(drift))], child: const app.MainWidget()),
|
ProviderScope(
|
||||||
|
overrides: [
|
||||||
|
dbProvider.overrideWithValue(isar),
|
||||||
|
isarProvider.overrideWithValue(isar),
|
||||||
|
driftProvider.overrideWith(driftOverride(drift)),
|
||||||
|
],
|
||||||
|
child: const app.MainWidget(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
// Post run tasks
|
// Post run tasks
|
||||||
await EasyLocalization.ensureInitialized();
|
await EasyLocalization.ensureInitialized();
|
||||||
|
|||||||
+14
-8
@@ -33,6 +33,8 @@ PODS:
|
|||||||
- Flutter
|
- Flutter
|
||||||
- integration_test (0.0.1):
|
- integration_test (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- isar_community_flutter_libs (1.0.0):
|
||||||
|
- Flutter
|
||||||
- local_auth_darwin (0.0.1):
|
- local_auth_darwin (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
@@ -73,16 +75,16 @@ PODS:
|
|||||||
- sqflite_darwin (0.0.4):
|
- sqflite_darwin (0.0.4):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- sqlite3 (3.49.2):
|
- sqlite3 (3.49.1):
|
||||||
- sqlite3/common (= 3.49.2)
|
- sqlite3/common (= 3.49.1)
|
||||||
- sqlite3/common (3.49.2)
|
- sqlite3/common (3.49.1)
|
||||||
- sqlite3/dbstatvtab (3.49.2):
|
- sqlite3/dbstatvtab (3.49.1):
|
||||||
- sqlite3/common
|
- sqlite3/common
|
||||||
- sqlite3/fts5 (3.49.2):
|
- sqlite3/fts5 (3.49.1):
|
||||||
- sqlite3/common
|
- sqlite3/common
|
||||||
- sqlite3/perf-threadsafe (3.49.2):
|
- sqlite3/perf-threadsafe (3.49.1):
|
||||||
- sqlite3/common
|
- sqlite3/common
|
||||||
- sqlite3/rtree (3.49.2):
|
- sqlite3/rtree (3.49.1):
|
||||||
- sqlite3/common
|
- sqlite3/common
|
||||||
- sqlite3_flutter_libs (0.0.1):
|
- sqlite3_flutter_libs (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
@@ -114,6 +116,7 @@ DEPENDENCIES:
|
|||||||
- home_widget (from `.symlinks/plugins/home_widget/ios`)
|
- home_widget (from `.symlinks/plugins/home_widget/ios`)
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- integration_test (from `.symlinks/plugins/integration_test/ios`)
|
- integration_test (from `.symlinks/plugins/integration_test/ios`)
|
||||||
|
- isar_community_flutter_libs (from `.symlinks/plugins/isar_community_flutter_libs/ios`)
|
||||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||||
- maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`)
|
- maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`)
|
||||||
- native_video_player (from `.symlinks/plugins/native_video_player/ios`)
|
- native_video_player (from `.symlinks/plugins/native_video_player/ios`)
|
||||||
@@ -171,6 +174,8 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
integration_test:
|
integration_test:
|
||||||
:path: ".symlinks/plugins/integration_test/ios"
|
:path: ".symlinks/plugins/integration_test/ios"
|
||||||
|
isar_community_flutter_libs:
|
||||||
|
:path: ".symlinks/plugins/isar_community_flutter_libs/ios"
|
||||||
local_auth_darwin:
|
local_auth_darwin:
|
||||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||||
maplibre_gl:
|
maplibre_gl:
|
||||||
@@ -223,6 +228,7 @@ SPEC CHECKSUMS:
|
|||||||
home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
|
home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
|
||||||
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||||
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
|
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
|
||||||
|
isar_community_flutter_libs: bede843185a61a05ff364a05c9b23209523f7e0d
|
||||||
local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
|
local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
|
||||||
MapLibre: 69e572367f4ef6287e18246cfafc39c80cdcabcd
|
MapLibre: 69e572367f4ef6287e18246cfafc39c80cdcabcd
|
||||||
maplibre_gl: 3c924e44725147b03dda33430ad216005b40555f
|
maplibre_gl: 3c924e44725147b03dda33430ad216005b40555f
|
||||||
@@ -239,7 +245,7 @@ SPEC CHECKSUMS:
|
|||||||
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||||
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
||||||
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||||
sqlite3: 3c950dc86011117c307eb0b28c4a7bb449dce9f1
|
sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983
|
||||||
sqlite3_flutter_libs: f8fc13346870e73fe35ebf6dbb997fbcd156b241
|
sqlite3_flutter_libs: f8fc13346870e73fe35ebf6dbb997fbcd156b241
|
||||||
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
|
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
|
||||||
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
||||||
|
|||||||
@@ -3,18 +3,19 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 77;
|
objectVersion = 54;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
3B6A31FED0FC846D6BD69BBC /* Pods_ShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 357FC57E54FD0F51795CF28A /* Pods_ShareExtension.framework */; };
|
3B6A31FED0FC846D6BD69BBC /* Pods_ShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 357FC57E54FD0F51795CF28A /* Pods_ShareExtension.framework */; };
|
||||||
|
65F32F31299BD2F800CE9261 /* BackgroundServicePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F32F30299BD2F800CE9261 /* BackgroundServicePlugin.swift */; };
|
||||||
|
65F32F33299D349D00CE9261 /* BackgroundSyncWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F32F32299D349D00CE9261 /* BackgroundSyncWorker.swift */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
A01DD69B2F7F43B40049AB63 /* ImageRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A01DD6982F7F43B40049AB63 /* ImageRequest.swift */; };
|
|
||||||
B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */; };
|
B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */; };
|
||||||
B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */; };
|
B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */; };
|
||||||
B25D377A2E72CA15008B6CA7 /* Connectivity.g.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25D37782E72CA15008B6CA7 /* Connectivity.g.swift */; };
|
B25D377A2E72CA15008B6CA7 /* Connectivity.g.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25D37782E72CA15008B6CA7 /* Connectivity.g.swift */; };
|
||||||
@@ -88,6 +89,8 @@
|
|||||||
357FC57E54FD0F51795CF28A /* Pods_ShareExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShareExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
357FC57E54FD0F51795CF28A /* Pods_ShareExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShareExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||||
571EAA93D77181C7C98C2EA6 /* Pods-ShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.release.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.release.xcconfig"; sourceTree = "<group>"; };
|
571EAA93D77181C7C98C2EA6 /* Pods-ShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.release.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
65F32F30299BD2F800CE9261 /* BackgroundServicePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundServicePlugin.swift; sourceTree = "<group>"; };
|
||||||
|
65F32F32299D349D00CE9261 /* BackgroundSyncWorker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundSyncWorker.swift; sourceTree = "<group>"; };
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
@@ -99,7 +102,6 @@
|
|||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
A01DD6982F7F43B40049AB63 /* ImageRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRequest.swift; sourceTree = "<group>"; };
|
|
||||||
B1FBA9EE014DE20271B0FE77 /* Pods-ShareExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.profile.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.profile.xcconfig"; sourceTree = "<group>"; };
|
B1FBA9EE014DE20271B0FE77 /* Pods-ShareExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.profile.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorkerApiImpl.swift; sourceTree = "<group>"; };
|
B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorkerApiImpl.swift; sourceTree = "<group>"; };
|
||||||
B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorker.swift; sourceTree = "<group>"; };
|
B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorker.swift; sourceTree = "<group>"; };
|
||||||
@@ -135,13 +137,6 @@
|
|||||||
);
|
);
|
||||||
target = F0B57D372DF764BD00DC5BCC /* WidgetExtension */;
|
target = F0B57D372DF764BD00DC5BCC /* WidgetExtension */;
|
||||||
};
|
};
|
||||||
FE1BB4572F83196E0087DBF9 /* Exceptions for "Utility" folder in "Runner" target */ = {
|
|
||||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
|
||||||
membershipExceptions = (
|
|
||||||
Mutex.swift,
|
|
||||||
);
|
|
||||||
target = 97C146ED1CF9000F007C117D /* Runner */;
|
|
||||||
};
|
|
||||||
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
|
||||||
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||||
@@ -167,14 +162,6 @@
|
|||||||
path = WidgetExtension;
|
path = WidgetExtension;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
FE1BB4562F8319560087DBF9 /* Utility */ = {
|
|
||||||
isa = PBXFileSystemSynchronizedRootGroup;
|
|
||||||
exceptions = (
|
|
||||||
FE1BB4572F83196E0087DBF9 /* Exceptions for "Utility" folder in "Runner" target */,
|
|
||||||
);
|
|
||||||
path = Utility;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
FEE084F22EC172080045228E /* Schemas */ = {
|
FEE084F22EC172080045228E /* Schemas */ = {
|
||||||
isa = PBXFileSystemSynchronizedRootGroup;
|
isa = PBXFileSystemSynchronizedRootGroup;
|
||||||
exceptions = (
|
exceptions = (
|
||||||
@@ -240,6 +227,15 @@
|
|||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
65DD438629917FAD0047FFA8 /* BackgroundSync */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
65F32F32299D349D00CE9261 /* BackgroundSyncWorker.swift */,
|
||||||
|
65F32F30299BD2F800CE9261 /* BackgroundServicePlugin.swift */,
|
||||||
|
);
|
||||||
|
path = BackgroundSync;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -277,13 +273,13 @@
|
|||||||
97C146F01CF9000F007C117D /* Runner */ = {
|
97C146F01CF9000F007C117D /* Runner */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
FE1BB4562F8319560087DBF9 /* Utility */,
|
|
||||||
FEE084F22EC172080045228E /* Schemas */,
|
FEE084F22EC172080045228E /* Schemas */,
|
||||||
B231F52D2E93A44A00BC45D1 /* Core */,
|
B231F52D2E93A44A00BC45D1 /* Core */,
|
||||||
B25D37792E72CA15008B6CA7 /* Connectivity */,
|
B25D37792E72CA15008B6CA7 /* Connectivity */,
|
||||||
B21E34A62E5AF9760031FDB9 /* Background */,
|
B21E34A62E5AF9760031FDB9 /* Background */,
|
||||||
B2CF7F8C2DDE4EBB00744BF6 /* Sync */,
|
B2CF7F8C2DDE4EBB00744BF6 /* Sync */,
|
||||||
FA9973382CF6DF4B000EF859 /* Runner.entitlements */,
|
FA9973382CF6DF4B000EF859 /* Runner.entitlements */,
|
||||||
|
65DD438629917FAD0047FFA8 /* BackgroundSync */,
|
||||||
FAC7416727DB9F5500C668D8 /* RunnerProfile.entitlements */,
|
FAC7416727DB9F5500C668D8 /* RunnerProfile.entitlements */,
|
||||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||||
@@ -331,7 +327,6 @@
|
|||||||
FED3B1952E253E9B0030FD97 /* Images */ = {
|
FED3B1952E253E9B0030FD97 /* Images */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
A01DD6982F7F43B40049AB63 /* ImageRequest.swift */,
|
|
||||||
FE5FE4AD2F30FBC000A71243 /* ImageProcessing.swift */,
|
FE5FE4AD2F30FBC000A71243 /* ImageProcessing.swift */,
|
||||||
FE5499F72F1198DE006016CB /* RemoteImagesImpl.swift */,
|
FE5499F72F1198DE006016CB /* RemoteImagesImpl.swift */,
|
||||||
FE5499F52F11980E006016CB /* LocalImagesImpl.swift */,
|
FE5499F52F11980E006016CB /* LocalImagesImpl.swift */,
|
||||||
@@ -611,8 +606,8 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
65F32F31299BD2F800CE9261 /* BackgroundServicePlugin.swift in Sources */,
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
||||||
A01DD69B2F7F43B40049AB63 /* ImageRequest.swift in Sources */,
|
|
||||||
B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */,
|
B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */,
|
||||||
FE5499F32F1197D8006016CB /* LocalImages.g.swift in Sources */,
|
FE5499F32F1197D8006016CB /* LocalImages.g.swift in Sources */,
|
||||||
FE5499F62F11980E006016CB /* LocalImagesImpl.swift in Sources */,
|
FE5499F62F11980E006016CB /* LocalImagesImpl.swift in Sources */,
|
||||||
@@ -625,6 +620,7 @@
|
|||||||
B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */,
|
B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */,
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
||||||
B2BE315F2E5E5229006EEF88 /* BackgroundWorker.g.swift in Sources */,
|
B2BE315F2E5E5229006EEF88 /* BackgroundWorker.g.swift in Sources */,
|
||||||
|
65F32F33299D349D00CE9261 /* BackgroundSyncWorker.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -1243,7 +1239,7 @@
|
|||||||
repositoryURL = "https://github.com/pointfreeco/sqlite-data";
|
repositoryURL = "https://github.com/pointfreeco/sqlite-data";
|
||||||
requirement = {
|
requirement = {
|
||||||
kind = upToNextMajorVersion;
|
kind = upToNextMajorVersion;
|
||||||
minimumVersion = 1.6.1;
|
minimumVersion = 1.3.0;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
FEE084F92EC1725A0045228E /* XCRemoteSwiftPackageReference "swift-http-structured-headers" */ = {
|
FEE084F92EC1725A0045228E /* XCRemoteSwiftPackageReference "swift-http-structured-headers" */ = {
|
||||||
@@ -1251,7 +1247,7 @@
|
|||||||
repositoryURL = "https://github.com/apple/swift-http-structured-headers.git";
|
repositoryURL = "https://github.com/apple/swift-http-structured-headers.git";
|
||||||
requirement = {
|
requirement = {
|
||||||
kind = upToNextMajorVersion;
|
kind = upToNextMajorVersion;
|
||||||
minimumVersion = 1.6.0;
|
minimumVersion = 1.5.0;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|||||||
@@ -24,8 +24,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/pointfreeco/sqlite-data",
|
"location" : "https://github.com/pointfreeco/sqlite-data",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "da3a94ed49c7a30d82853de551c07a93196e8cab",
|
"revision" : "05704b563ecb7f0bd7e49b6f360a6383a3e53e7d",
|
||||||
"version" : "1.6.1"
|
"version" : "1.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -78,8 +78,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/apple/swift-http-structured-headers.git",
|
"location" : "https://github.com/apple/swift-http-structured-headers.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "76d7627bd88b47bf5a0f8497dd244885960dde0b",
|
"revision" : "a9f3c352f4d46afd155e00b3c6e85decae6bcbeb",
|
||||||
"version" : "1.6.0"
|
"version" : "1.5.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -123,8 +123,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/pointfreeco/swift-structured-queries",
|
"location" : "https://github.com/pointfreeco/swift-structured-queries",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "8da8818fccd9959bd683934ddc62cf45bb65b3c8",
|
"revision" : "d8163b3a98f3c8434c4361e85126db449d84bc66",
|
||||||
"version" : "0.31.1"
|
"version" : "0.30.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user