Merge branch 'main' into main

This commit is contained in:
Alex 2024-09-02 19:51:11 -05:00 committed by GitHub
commit 83500dac80
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
542 changed files with 21592 additions and 12148 deletions

View File

@ -22,6 +22,7 @@ open-api/typescript-sdk/node_modules/
server/coverage/ server/coverage/
server/node_modules/ server/node_modules/
server/upload/ server/upload/
server/src/queries
server/dist/ server/dist/
server/www/ server/www/

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
custom: ['https://buy.immich.app']

View File

@ -83,7 +83,6 @@ body:
2. 2.
3. 3.
... ...
render: bash
validations: validations:
required: true required: true

14
.github/release.yml vendored
View File

@ -2,28 +2,28 @@ changelog:
categories: categories:
- title: 🚨 Breaking Changes - title: 🚨 Breaking Changes
labels: labels:
- breaking-change - changelog:breaking-change
- title: 🔒 Security - title: 🔒 Security
labels: labels:
- security - changelog:security
- title: 🚀 Features - title: 🚀 Features
labels: labels:
- feature - changelog:feature
- title: 🌟 Enhancements - title: 🌟 Enhancements
labels: labels:
- enhancement - changelog:enhancement
- title: 🐛 Bug fixes - title: 🐛 Bug fixes
labels: labels:
- bugfix - changelog:bugfix
- title: 📚 Documentation - title: 📚 Documentation
labels: labels:
- documentation - changelog:documentation
- title: 🌐 Translations - title: 🌐 Translations
labels: labels:
- translation - changelog:translation

View File

@ -0,0 +1,21 @@
name: PR Label Validation
on:
pull_request_target:
types: [opened, labeled, unlabeled, synchronize]
jobs:
validate-release-label:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: read
steps:
- name: Require PR to have a changelog label
uses: mheap/github-action-required-labels@v5
with:
mode: exactly
count: 1
use_regex: true
labels: "changelog:.*"
add_comment: true

View File

@ -29,10 +29,17 @@ jobs:
ref: ${{ steps.push-tag.outputs.commit_long_sha }} ref: ${{ steps.push-tag.outputs.commit_long_sha }}
steps: steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
token: ${{ secrets.ORG_RELEASE_TOKEN }} token: ${{ steps.generate-token.outputs.token }}
- name: Install Poetry - name: Install Poetry
run: pipx install poetry run: pipx install poetry
@ -44,10 +51,8 @@ jobs:
id: push-tag id: push-tag
uses: EndBug/add-and-commit@v9 uses: EndBug/add-and-commit@v9
with: with:
author_name: Alex The Bot default_author: github_actions
author_email: alex.tran1502@gmail.com message: 'chore: version ${{ env.IMMICH_VERSION }}'
default_author: user_info
message: 'Version ${{ env.IMMICH_VERSION }}'
tag: ${{ env.IMMICH_VERSION }} tag: ${{ env.IMMICH_VERSION }}
push: true push: true

View File

@ -1 +1 @@
20.16.0 20.17.0

View File

@ -1,4 +1,4 @@
FROM node:20.16.0-alpine3.20@sha256:eb8101caae9ac02229bd64c024919fe3d4504ff7f329da79ca60a04db08cef52 AS core FROM node:20.17.0-alpine3.20@sha256:1a526b97cace6b4006256570efa1a29cd1fe4b96a5301f8d48e87c5139438a45 AS core
WORKDIR /usr/src/open-api/typescript-sdk WORKDIR /usr/src/open-api/typescript-sdk
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./ COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./

View File

@ -4,8 +4,18 @@ Please see the [Immich CLI documentation](https://immich.app/docs/features/comma
# For developers # For developers
Before building the CLI, you must build the immich server and the open-api client. To build the server run the following in the server folder:
$ npm install
$ npm run build
Then, to build the open-api client run the following in the open-api folder:
$ ./bin/generate-open-api.sh
To run the Immich CLI from source, run the following in the cli folder: To run the Immich CLI from source, run the following in the cli folder:
$ npm install
$ npm run build $ npm run build
$ ts-node . $ ts-node .
@ -17,3 +27,4 @@ You can also build and install the CLI using
$ npm run build $ npm run build
$ npm install -g . $ npm install -g .
****

View File

@ -55,6 +55,7 @@ export default [
'unicorn/import-style': 'off', 'unicorn/import-style': 'off',
curly: 2, curly: 2,
'prettier/prettier': 0, 'prettier/prettier': 0,
'object-shorthand': ['error', 'always'],
}, },
}, },
]; ];

312
cli/package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.15", "version": "2.2.16",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.15", "version": "2.2.16",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"fast-glob": "^3.3.2", "fast-glob": "^3.3.2",
@ -24,7 +24,7 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "^2.0.5", "@vitest/coverage-v8": "^2.0.5",
@ -52,14 +52,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.112.1", "version": "1.113.0",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@ -825,9 +825,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.8.0", "version": "9.9.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz",
"integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1054,169 +1054,224 @@
} }
}, },
"node_modules/@rollup/rollup-android-arm-eabi": { "node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz",
"integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"android" "android"
] ]
}, },
"node_modules/@rollup/rollup-android-arm64": { "node_modules/@rollup/rollup-android-arm64": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz",
"integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"android" "android"
] ]
}, },
"node_modules/@rollup/rollup-darwin-arm64": { "node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz",
"integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
] ]
}, },
"node_modules/@rollup/rollup-darwin-x64": { "node_modules/@rollup/rollup-darwin-x64": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz",
"integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
] ]
}, },
"node_modules/@rollup/rollup-linux-arm-gnueabihf": { "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz",
"integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz",
"integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
] ]
}, },
"node_modules/@rollup/rollup-linux-arm64-gnu": { "node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz",
"integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
] ]
}, },
"node_modules/@rollup/rollup-linux-arm64-musl": { "node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz",
"integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz",
"integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
] ]
}, },
"node_modules/@rollup/rollup-linux-riscv64-gnu": { "node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz",
"integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz",
"integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==",
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
] ]
}, },
"node_modules/@rollup/rollup-linux-x64-gnu": { "node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz",
"integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
] ]
}, },
"node_modules/@rollup/rollup-linux-x64-musl": { "node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz",
"integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
] ]
}, },
"node_modules/@rollup/rollup-win32-arm64-msvc": { "node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz",
"integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
] ]
}, },
"node_modules/@rollup/rollup-win32-ia32-msvc": { "node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz",
"integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
] ]
}, },
"node_modules/@rollup/rollup-win32-x64-msvc": { "node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz",
"integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@ -1269,13 +1324,13 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.14.15", "version": "20.16.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz",
"integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~6.19.2"
} }
}, },
"node_modules/@types/normalize-package-data": { "node_modules/@types/normalize-package-data": {
@ -1285,17 +1340,17 @@
"dev": true "dev": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz",
"integrity": "sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==", "integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.0.1", "@typescript-eslint/scope-manager": "8.2.0",
"@typescript-eslint/type-utils": "8.0.1", "@typescript-eslint/type-utils": "8.2.0",
"@typescript-eslint/utils": "8.0.1", "@typescript-eslint/utils": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1", "@typescript-eslint/visitor-keys": "8.2.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@ -1319,16 +1374,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz",
"integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==", "integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.0.1", "@typescript-eslint/scope-manager": "8.2.0",
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/typescript-estree": "8.0.1", "@typescript-eslint/typescript-estree": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1", "@typescript-eslint/visitor-keys": "8.2.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -1348,14 +1403,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz",
"integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1" "@typescript-eslint/visitor-keys": "8.2.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1366,14 +1421,14 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz",
"integrity": "sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==", "integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.0.1", "@typescript-eslint/typescript-estree": "8.2.0",
"@typescript-eslint/utils": "8.0.1", "@typescript-eslint/utils": "8.2.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@ -1391,9 +1446,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz",
"integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1405,14 +1460,14 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz",
"integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1", "@typescript-eslint/visitor-keys": "8.2.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -1434,16 +1489,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz",
"integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", "integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.0.1", "@typescript-eslint/scope-manager": "8.2.0",
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/typescript-estree": "8.0.1" "@typescript-eslint/typescript-estree": "8.2.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1457,13 +1512,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz",
"integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@ -2080,9 +2135,9 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.8.0", "version": "9.9.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz",
"integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -2090,7 +2145,7 @@
"@eslint-community/regexpp": "^4.11.0", "@eslint-community/regexpp": "^4.11.0",
"@eslint/config-array": "^0.17.1", "@eslint/config-array": "^0.17.1",
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.1.0",
"@eslint/js": "9.8.0", "@eslint/js": "9.9.0",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.3.0", "@humanwhocodes/retry": "^0.3.0",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
@ -2129,6 +2184,14 @@
}, },
"funding": { "funding": {
"url": "https://eslint.org/donate" "url": "https://eslint.org/donate"
},
"peerDependencies": {
"jiti": "*"
},
"peerDependenciesMeta": {
"jiti": {
"optional": true
}
} }
}, },
"node_modules/eslint-config-prettier": { "node_modules/eslint-config-prettier": {
@ -3709,10 +3772,11 @@
} }
}, },
"node_modules/rollup": { "node_modules/rollup": {
"version": "4.13.0", "version": "4.21.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz",
"integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@types/estree": "1.0.5" "@types/estree": "1.0.5"
}, },
@ -3724,19 +3788,22 @@
"npm": ">=8.0.0" "npm": ">=8.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.13.0", "@rollup/rollup-android-arm-eabi": "4.21.1",
"@rollup/rollup-android-arm64": "4.13.0", "@rollup/rollup-android-arm64": "4.21.1",
"@rollup/rollup-darwin-arm64": "4.13.0", "@rollup/rollup-darwin-arm64": "4.21.1",
"@rollup/rollup-darwin-x64": "4.13.0", "@rollup/rollup-darwin-x64": "4.21.1",
"@rollup/rollup-linux-arm-gnueabihf": "4.13.0", "@rollup/rollup-linux-arm-gnueabihf": "4.21.1",
"@rollup/rollup-linux-arm64-gnu": "4.13.0", "@rollup/rollup-linux-arm-musleabihf": "4.21.1",
"@rollup/rollup-linux-arm64-musl": "4.13.0", "@rollup/rollup-linux-arm64-gnu": "4.21.1",
"@rollup/rollup-linux-riscv64-gnu": "4.13.0", "@rollup/rollup-linux-arm64-musl": "4.21.1",
"@rollup/rollup-linux-x64-gnu": "4.13.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1",
"@rollup/rollup-linux-x64-musl": "4.13.0", "@rollup/rollup-linux-riscv64-gnu": "4.21.1",
"@rollup/rollup-win32-arm64-msvc": "4.13.0", "@rollup/rollup-linux-s390x-gnu": "4.21.1",
"@rollup/rollup-win32-ia32-msvc": "4.13.0", "@rollup/rollup-linux-x64-gnu": "4.21.1",
"@rollup/rollup-win32-x64-msvc": "4.13.0", "@rollup/rollup-linux-x64-musl": "4.21.1",
"@rollup/rollup-win32-arm64-msvc": "4.21.1",
"@rollup/rollup-win32-ia32-msvc": "4.21.1",
"@rollup/rollup-win32-x64-msvc": "4.21.1",
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
} }
}, },
@ -4151,10 +4218,11 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "5.26.5", "version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.0.13", "version": "1.0.13",
@ -4206,15 +4274,15 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "5.4.0", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz",
"integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"esbuild": "^0.21.3", "esbuild": "^0.21.3",
"postcss": "^8.4.40", "postcss": "^8.4.41",
"rollup": "^4.13.0" "rollup": "^4.20.0"
}, },
"bin": { "bin": {
"vite": "bin/vite.js" "vite": "bin/vite.js"

View File

@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.15", "version": "2.2.16",
"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/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "^2.0.5", "@vitest/coverage-v8": "^2.0.5",
@ -67,6 +67,6 @@
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"volta": { "volta": {
"node": "20.16.0" "node": "20.17.0"
} }
} }

View File

@ -2,37 +2,37 @@
# Manual edits may be lost in future updates. # Manual edits may be lost in future updates.
provider "registry.opentofu.org/cloudflare/cloudflare" { provider "registry.opentofu.org/cloudflare/cloudflare" {
version = "4.38.0" version = "4.40.0"
constraints = "4.38.0" constraints = "4.40.0"
hashes = [ hashes = [
"h1:+27KAHKHBDvv3dqyJv5vhtdKQZJzoZXoMqIyronlHNw=", "h1:GP2N1tXrmpxu+qEDvFAmkfv9aeZNhag3bchyJpGpYbU=",
"h1:/uV9RgOUhkxElkHhWs8fs5ZbX9vj6RCBfP0oJO0JF30=", "h1:HDJKZBQkVU0kQl4gViQ5L7EcFLn9hB0iuvO+ORJiDS4=",
"h1:1DNAdMugJJOAWD/XYiZenYYZLy7fw2ctjT4YZmkRCVQ=", "h1:KrbeEsZoCJOnnX68yNI5h3QhMjc5bBCQW4yvYaEFq3s=",
"h1:1wn4PmCLdT7mvd74JkCGmJDJxTQDkcxc+1jNbmwnMHA=", "h1:LelwnzU0OVn6g2+T9Ub9XdpC+vbheraIL/qgXhWBs/k=",
"h1:BIHB4fBxHg2bA9KbL92njhyctxKC8b6hNDp60y5QBss=", "h1:TIq9CynfWrKgCxKL97Akj89cYlvJKn/AL4UXogd8/FM=",
"h1:HCQpvKPsMsR4HO5eDqt+Kao7T7CYeEH7KZIO7xMcC6M=", "h1:Uoy5oPdm1ipDG7yIMCUN1IXMpsTGXahPw3I0rVA/6wA=",
"h1:HTomuzocukpNLwtWzeSF3yteCVsyVKbwKmN66u9iPac=", "h1:Wunfpm+IZhENdoimrh4iXiakVnCsfKOHo80yJUjMQXM=",
"h1:YDxsUBhBAwHSXLzVwrSlSBOwv1NvLyry7s5SfCV7VqQ=", "h1:cRdCuahMOFrNyldnCInqGQRBT1DTkRPSfPnaf5r05iw=",
"h1:dchVhxo+Acd1l2RuZ88tW9lWj4422QMfgtxKvKCjYrw=", "h1:k+zpXg8BO7gdbTIfSGyQisHhs5aVWQVbPLa5uUdr2UA=",
"h1:eypa+P4ZpsEGMPFuCE+6VkRefu0TZRFmVBOpK+PDOPY=", "h1:kWNrzZ8Rh0OpHikexkmwJIIucD6SMZPi4oGyDsKJitw=",
"h1:f3yjse2OsRZj7ZhR7BLintJMlI4fpyt8HyDP/zcEavw=", "h1:lomfTTjK78BdSEVTFcJUBQRy7IQHuGQImMaPWaYpfgQ=",
"h1:mSJ7xj8K+xcnEmGg7lH0jjzyQb157wH94ULTAlIV+HQ=", "h1:oWcWlZe52ZRyLQciNe94RaWzhHifSTu03nlK0uL7rlM=",
"h1:tt+2J2Ze8VIdDq2Hr6uHlTJzAMBRpErBwTYx0uD5ilE=", "h1:p3JJrhGEPlPQP7Uwy9FNMdvqCyD8tuT4lnXuJ+pSF/M=",
"h1:uQW8SKxmulqrAisO+365mIf2FueINAp5PY28bqCPCug=", "h1:wtB0sKxG2K/H41hWJI4uJdImWquuaP34Sip5LmfE410=",
"zh:171ab67cccceead4514fafb2d39e4e708a90cce79000aaf3c29aab7ed4457071", "zh:01742e5946f936548f8e42120287ffc757abf97e7cbbe34e25c266a438fb54fd",
"zh:18aa7228447baaaefc49a43e8eff970817a7491a63d8937e796357a3829dd979", "zh:08d81f5a5aab4cc269f983b8c6b5be0e278105136aca9681740802619577371f",
"zh:2cbaab6092e81ba6f41fa60a50f14e980c8ec327ee11d0b21f16a478be4b7567", "zh:0d75131ba70902cfc94a7a5900369bdde56528b2aad6e10b164449cc97d57396",
"zh:53b8e49c06f5b31a8c681f8c0669cf43e78abe71657b8182a221d096bb514965", "zh:3890a715a012e197541daacdacb8cceec6d364814daa4640ddfe98a8ba9036cb",
"zh:6037cfc60b4b647aabae155fcb46d649ed7c650e0287f05db52b2068f1e27c8a", "zh:58254ce5ebe1faed4664df86210c39d660bcdc60280f17b25fe4d4dbea21ea8c",
"zh:62460982ce1a869eebfca675603fbbd50416cf6b69459fb855bfbe5ae2b97607", "zh:6b0abc1adbc2edee79368ce9f7338ebcb5d0bf941e8d7d9ac505b750f20f80a2",
"zh:65f6f3a8470917b6398baa5eb4f74b3932b213eac7c0202798bfad6fd1ee17df", "zh:81cc415d1477174a1ca288d25fdb57e5ee488c2d7f61f265ef995b255a53b0ce",
"zh:8680140c7fe5beaefe61c5cfa471bf88422dc0c0f05dad6d3cb482d4ffd22be4",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:8b5cebe64bf04105a49178a165b6a8800a9a33bae6767143a47fe4977755f805", "zh:a491d26236122ccb83dac8cb490d2c0aa1f4d3a0b4abe99300fd49b1a624f42f",
"zh:a5596635db0993ee3c3060fbc2227d91b239466e96d2d82642625a5aa2486988", "zh:a70d9c469dc8d55715ba77c9d1a4ede1fdebf79e60ee18438a0844868db54e0d",
"zh:b3a9c63038441f13c311fd4b2c7e69e571445e5a7365a20c7cc9046b7e6c8aba", "zh:a7fcb7d5c4222e14ec6d9a15adf8b9a083d84b102c3d0e4a0d102df5a1360b62",
"zh:b585e7e4d7648a540b14b9182819214896ca9337729eeb1f2034833b17db754d", "zh:b4f9677174fabd199c8ebd2e9e5eb3528cf887e700569a4fb61eef4e070cec5e",
"zh:d2c3c545318ac8542369e9fc8228e29ee585febdf203a450fad3e0eded71ce02", "zh:c27f0f7519221d75dae4a3787a59e05acd5cc9a0d30a390eff349a77d20d52e6",
"zh:e95dd2d6c3525073af47d47b763cb81b6a51b20cabf76f789c69328922da9ecf", "zh:db00d8605dbf43ca42fe1481a6c67fdcaa73debb7d2a0f613cb95ae5c5e7150e",
"zh:eee6e590b36d6c6168a7daae8afa74a8721fd7aa9f62a710f04a311975100722",
] ]
} }

View File

@ -5,7 +5,7 @@ terraform {
required_providers { required_providers {
cloudflare = { cloudflare = {
source = "cloudflare/cloudflare" source = "cloudflare/cloudflare"
version = "4.38.0" version = "4.40.0"
} }
} }
} }

View File

@ -2,37 +2,37 @@
# Manual edits may be lost in future updates. # Manual edits may be lost in future updates.
provider "registry.opentofu.org/cloudflare/cloudflare" { provider "registry.opentofu.org/cloudflare/cloudflare" {
version = "4.38.0" version = "4.40.0"
constraints = "4.38.0" constraints = "4.40.0"
hashes = [ hashes = [
"h1:+27KAHKHBDvv3dqyJv5vhtdKQZJzoZXoMqIyronlHNw=", "h1:GP2N1tXrmpxu+qEDvFAmkfv9aeZNhag3bchyJpGpYbU=",
"h1:/uV9RgOUhkxElkHhWs8fs5ZbX9vj6RCBfP0oJO0JF30=", "h1:HDJKZBQkVU0kQl4gViQ5L7EcFLn9hB0iuvO+ORJiDS4=",
"h1:1DNAdMugJJOAWD/XYiZenYYZLy7fw2ctjT4YZmkRCVQ=", "h1:KrbeEsZoCJOnnX68yNI5h3QhMjc5bBCQW4yvYaEFq3s=",
"h1:1wn4PmCLdT7mvd74JkCGmJDJxTQDkcxc+1jNbmwnMHA=", "h1:LelwnzU0OVn6g2+T9Ub9XdpC+vbheraIL/qgXhWBs/k=",
"h1:BIHB4fBxHg2bA9KbL92njhyctxKC8b6hNDp60y5QBss=", "h1:TIq9CynfWrKgCxKL97Akj89cYlvJKn/AL4UXogd8/FM=",
"h1:HCQpvKPsMsR4HO5eDqt+Kao7T7CYeEH7KZIO7xMcC6M=", "h1:Uoy5oPdm1ipDG7yIMCUN1IXMpsTGXahPw3I0rVA/6wA=",
"h1:HTomuzocukpNLwtWzeSF3yteCVsyVKbwKmN66u9iPac=", "h1:Wunfpm+IZhENdoimrh4iXiakVnCsfKOHo80yJUjMQXM=",
"h1:YDxsUBhBAwHSXLzVwrSlSBOwv1NvLyry7s5SfCV7VqQ=", "h1:cRdCuahMOFrNyldnCInqGQRBT1DTkRPSfPnaf5r05iw=",
"h1:dchVhxo+Acd1l2RuZ88tW9lWj4422QMfgtxKvKCjYrw=", "h1:k+zpXg8BO7gdbTIfSGyQisHhs5aVWQVbPLa5uUdr2UA=",
"h1:eypa+P4ZpsEGMPFuCE+6VkRefu0TZRFmVBOpK+PDOPY=", "h1:kWNrzZ8Rh0OpHikexkmwJIIucD6SMZPi4oGyDsKJitw=",
"h1:f3yjse2OsRZj7ZhR7BLintJMlI4fpyt8HyDP/zcEavw=", "h1:lomfTTjK78BdSEVTFcJUBQRy7IQHuGQImMaPWaYpfgQ=",
"h1:mSJ7xj8K+xcnEmGg7lH0jjzyQb157wH94ULTAlIV+HQ=", "h1:oWcWlZe52ZRyLQciNe94RaWzhHifSTu03nlK0uL7rlM=",
"h1:tt+2J2Ze8VIdDq2Hr6uHlTJzAMBRpErBwTYx0uD5ilE=", "h1:p3JJrhGEPlPQP7Uwy9FNMdvqCyD8tuT4lnXuJ+pSF/M=",
"h1:uQW8SKxmulqrAisO+365mIf2FueINAp5PY28bqCPCug=", "h1:wtB0sKxG2K/H41hWJI4uJdImWquuaP34Sip5LmfE410=",
"zh:171ab67cccceead4514fafb2d39e4e708a90cce79000aaf3c29aab7ed4457071", "zh:01742e5946f936548f8e42120287ffc757abf97e7cbbe34e25c266a438fb54fd",
"zh:18aa7228447baaaefc49a43e8eff970817a7491a63d8937e796357a3829dd979", "zh:08d81f5a5aab4cc269f983b8c6b5be0e278105136aca9681740802619577371f",
"zh:2cbaab6092e81ba6f41fa60a50f14e980c8ec327ee11d0b21f16a478be4b7567", "zh:0d75131ba70902cfc94a7a5900369bdde56528b2aad6e10b164449cc97d57396",
"zh:53b8e49c06f5b31a8c681f8c0669cf43e78abe71657b8182a221d096bb514965", "zh:3890a715a012e197541daacdacb8cceec6d364814daa4640ddfe98a8ba9036cb",
"zh:6037cfc60b4b647aabae155fcb46d649ed7c650e0287f05db52b2068f1e27c8a", "zh:58254ce5ebe1faed4664df86210c39d660bcdc60280f17b25fe4d4dbea21ea8c",
"zh:62460982ce1a869eebfca675603fbbd50416cf6b69459fb855bfbe5ae2b97607", "zh:6b0abc1adbc2edee79368ce9f7338ebcb5d0bf941e8d7d9ac505b750f20f80a2",
"zh:65f6f3a8470917b6398baa5eb4f74b3932b213eac7c0202798bfad6fd1ee17df", "zh:81cc415d1477174a1ca288d25fdb57e5ee488c2d7f61f265ef995b255a53b0ce",
"zh:8680140c7fe5beaefe61c5cfa471bf88422dc0c0f05dad6d3cb482d4ffd22be4",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:8b5cebe64bf04105a49178a165b6a8800a9a33bae6767143a47fe4977755f805", "zh:a491d26236122ccb83dac8cb490d2c0aa1f4d3a0b4abe99300fd49b1a624f42f",
"zh:a5596635db0993ee3c3060fbc2227d91b239466e96d2d82642625a5aa2486988", "zh:a70d9c469dc8d55715ba77c9d1a4ede1fdebf79e60ee18438a0844868db54e0d",
"zh:b3a9c63038441f13c311fd4b2c7e69e571445e5a7365a20c7cc9046b7e6c8aba", "zh:a7fcb7d5c4222e14ec6d9a15adf8b9a083d84b102c3d0e4a0d102df5a1360b62",
"zh:b585e7e4d7648a540b14b9182819214896ca9337729eeb1f2034833b17db754d", "zh:b4f9677174fabd199c8ebd2e9e5eb3528cf887e700569a4fb61eef4e070cec5e",
"zh:d2c3c545318ac8542369e9fc8228e29ee585febdf203a450fad3e0eded71ce02", "zh:c27f0f7519221d75dae4a3787a59e05acd5cc9a0d30a390eff349a77d20d52e6",
"zh:e95dd2d6c3525073af47d47b763cb81b6a51b20cabf76f789c69328922da9ecf", "zh:db00d8605dbf43ca42fe1481a6c67fdcaa73debb7d2a0f613cb95ae5c5e7150e",
"zh:eee6e590b36d6c6168a7daae8afa74a8721fd7aa9f62a710f04a311975100722",
] ]
} }

View File

@ -5,7 +5,7 @@ terraform {
required_providers { required_providers {
cloudflare = { cloudflare = {
source = "cloudflare/cloudflare" source = "cloudflare/cloudflare"
version = "4.38.0" version = "4.40.0"
} }
} }
} }

View File

@ -79,7 +79,7 @@ services:
container_name: immich_prometheus container_name: immich_prometheus
ports: ports:
- 9090:9090 - 9090:9090
image: prom/prometheus@sha256:cafe963e591c872d38f3ea41ff8eb22cee97917b7c97b5c0ccd43a419f11f613 image: prom/prometheus@sha256:f6639335d34a77d9d9db382b92eeb7fc00934be8eae81dbc03b31cfe90411a94
volumes: volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus - prometheus-data:/prometheus
@ -91,7 +91,7 @@ services:
command: ['./run.sh', '-disable-reporting'] command: ['./run.sh', '-disable-reporting']
ports: ports:
- 3000:3000 - 3000:3000
image: grafana/grafana:11.1.3-ubuntu@sha256:e10453733015f31103cb530425f32c994816b50102886fa885dafea2c50a711c image: grafana/grafana:11.1.4-ubuntu@sha256:8e74fb7eed4d59fb5595acd0576c21411167f6b6401426ae29f2e8f9f71b68f6
volumes: volumes:
- grafana-data:/var/lib/grafana - grafana-data:/var/lib/grafana

View File

@ -1 +1 @@
20.16.0 20.17.0

View File

@ -52,14 +52,25 @@ On iOS (iPhone and iPad), the operating system determines if a particular app ca
- Disable Background App Refresh for apps that don't need background tasks to run. This will reduce the competition for background task invocation for Immich. - Disable Background App Refresh for apps that don't need background tasks to run. This will reduce the competition for background task invocation for Immich.
- Use the Immich app more often. - Use the Immich app more often.
### Why are features not working with a self-signed cert or mTLS?
Due to limitations in the upstream app/video library, using a self-signed TLS certificate or mutual TLS may break video playback or asset upload (both foreground and/or background).
We recommend using a real SSL certificate from a free provider, for example [Let's Encrypt](https://letsencrypt.org/).
--- ---
## Assets ## Assets
### Does Immich change the file? ### Does Immich change the file?
No, Immich does not touch the original file under any circumstances, No, Immich does not modify the original files.
all edited metadata are saved in the companion sidecar file and the database. All edited metadata is saved in companion `.xmp` sidecar files and the database.
However, Immich will delete original files that have been trashed when the trash is emptied in the Immich UI.
### Why do my file names appear as a random string in the file manager?
When Storage Template is off (default) Immich saves the file names in a random string (also known as random UUIDs) to prevent duplicate file names. To retrieve the original file names, you must enable the Storage Template and then run the STORAGE TEMPLATE MIGRATION job.
It is recommended to read about [Storage Template](https://immich.app/docs/administration/storage-template) before activation.
### Can I add my existing photo library? ### Can I add my existing photo library?
@ -157,6 +168,19 @@ We haven't implemented an official mechanism for creating albums from external l
Duplicate checking only exists for upload libraries, using the file hash. Furthermore, duplicate checking is not global, but _per library_. Therefore, a situation where the same file appears twice in the timeline is possible, especially for external libraries. Duplicate checking only exists for upload libraries, using the file hash. Furthermore, duplicate checking is not global, but _per library_. Therefore, a situation where the same file appears twice in the timeline is possible, especially for external libraries.
### Why are my edits to files not being saved in read-only external libraries?
Images in read-write external libraries (the default) can be edited as normal.
In read-only libraries (`:ro` in the `docker-compose.yml`), Immich is unable to create the `.xmp` sidecar files to store edited file metadata.
For this reason, the metadata (timestamp, location, description, star rating, etc.) cannot be edited for files in read-only external libraries.
### How are deletions of files handled in external libraries?
Immich will attempt to delete original files that have been trashed when the trash is emptied.
In read-write external libraries (the default), Immich will delete the original file.
In read-only libraries (`:ro` in the `docker-compose.yml`), files can still be trashed in the UI.
However, when the trash is emptied, the files will re-appear in the main timeline since Immich is unable to delete the original file.
--- ---
## Machine Learning ## Machine Learning

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -52,4 +52,4 @@ Additionally, some jobs run on a schedule, which is every night at midnight. Thi
Storage Migration job can be run after changing the [Storage Template](/docs/administration/storage-template.mdx), in order to apply the change to the existing library. Storage Migration job can be run after changing the [Storage Template](/docs/administration/storage-template.mdx), in order to apply the change to the existing library.
::: :::
<img src={require('./img/admin-jobs.png').default} width="80%" title="Admin jobs" /> <img src={require('./img/admin-jobs.webp').default} width="60%" title="Admin jobs" />

View File

@ -3,7 +3,7 @@
This page contains details about using OAuth in Immich. This page contains details about using OAuth in Immich.
:::tip :::tip
Unable to set `app.immich:/` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution. Unable to set `app.immich:///oauth-callback` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution.
::: :::
## Overview ## Overview
@ -30,7 +30,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured
The **Sign-in redirect URIs** should include: The **Sign-in redirect URIs** should include:
- `app.immich:/` - for logging in with OAuth from the [Mobile App](/docs/features/mobile-app.mdx) - `app.immich:///oauth-callback` - for logging in with OAuth from the [Mobile App](/docs/features/mobile-app.mdx)
- `http://DOMAIN:PORT/auth/login` - for logging in with OAuth from the Web Client - `http://DOMAIN:PORT/auth/login` - for logging in with OAuth from the Web Client
- `http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client - `http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client
@ -38,7 +38,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured
Mobile Mobile
- `app.immich:/` (You **MUST** include this for iOS and Android mobile apps to work properly) - `app.immich:///oauth-callback` (You **MUST** include this for iOS and Android mobile apps to work properly)
Localhost Localhost
@ -96,16 +96,16 @@ When Auto Launch is enabled, the login page will automatically redirect the user
## Mobile Redirect URI ## Mobile Redirect URI
The redirect URI for the mobile app is `app.immich:/`, which is a [Custom Scheme](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app). If this custom scheme is an invalid redirect URI for your OAuth Provider, you can work around this by doing the following: The redirect URI for the mobile app is `app.immich:///oauth-callback`, which is a [Custom Scheme](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app). If this custom scheme is an invalid redirect URI for your OAuth Provider, you can work around this by doing the following:
1. Configure an http(s) endpoint to forwards requests to `app.immich:/` 1. Configure an http(s) endpoint to forwards requests to `app.immich:///oauth-callback`
2. Whitelist the new endpoint as a valid redirect URI with your provider. 2. Whitelist the new endpoint as a valid redirect URI with your provider.
3. Specify the new endpoint as the `Mobile Redirect URI Override`, in the OAuth settings. 3. Specify the new endpoint as the `Mobile Redirect URI Override`, in the OAuth settings.
With these steps in place, you should be able to use OAuth from the [Mobile App](/docs/features/mobile-app.mdx) without a custom scheme redirect URI. With these steps in place, you should be able to use OAuth from the [Mobile App](/docs/features/mobile-app.mdx) without a custom scheme redirect URI.
:::info :::info
Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:/`, and can be used for step 1. Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:///oauth-callback`, and can be used for step 1.
::: :::
## Example Configuration ## Example Configuration
@ -154,21 +154,21 @@ Configuration of Authorised redirect URIs (Google Console)
Configuration of OAuth in Immich System Settings Configuration of OAuth in Immich System Settings
| Setting | Value | | Setting | Value |
| ---------------------------- | ------------------------------------------------------------------------------------------------------ | | ---------------------------- | ---------------------------------------------------------------------------------------------------- |
| Issuer URL | [https://accounts.google.com](https://accounts.google.com) | | Issuer URL | `https://accounts.google.com` |
| Client ID | 7\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***vuls.apps.googleusercontent.com | | Client ID | 7\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***vuls.apps.googleusercontent.com |
| Client Secret | G\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***OO | | Client Secret | G\***\*\*\*\*\*\*\***\*\*\***\*\*\*\*\*\*\***OO |
| Scope | openid email profile | | Scope | openid email profile |
| Signing Algorithm | RS256 | | Signing Algorithm | RS256 |
| Storage Label Claim | preferred_username | | Storage Label Claim | preferred_username |
| Storage Quota Claim | immich_quota | | Storage Quota Claim | immich_quota |
| Default Storage Quota (GiB) | 0 (0 for unlimited quota) | | Default Storage Quota (GiB) | 0 (0 for unlimited quota) |
| Button Text | Sign in with Google (optional) | | Button Text | Sign in with Google (optional) |
| Auto Register | Enabled (optional) | | Auto Register | Enabled (optional) |
| Auto Launch | Enabled | | Auto Launch | Enabled |
| Mobile Redirect URI Override | Enabled (required) | | Mobile Redirect URI Override | Enabled (required) |
| Mobile Redirect URI | [https://demo.immich.app/api/oauth/mobile-redirect](https://demo.immich.app/api/oauth/mobile-redirect) | | Mobile Redirect URI | `https://example.immich.app/api/oauth/mobile-redirect` |
</details> </details>

View File

@ -104,7 +104,7 @@ You can choose to disable a certain type of machine learning, for example smart
### Smart Search ### Smart Search
The smart search settings are designed to allow the search tool to be used using [CLIP](https://openai.com/research/clip) models that [can be changed](/docs/FAQ#can-i-use-a-custom-clip-model), different models will necessarily give better results but may consume more processing power, when changing a model it is mandatory to re-run the The [smart search](/docs/features/smart-search) settings are designed to allow the search tool to be used using [CLIP](https://openai.com/research/clip) models that [can be changed](/docs/FAQ#can-i-use-a-custom-clip-model), different models will necessarily give better results but may consume more processing power, when changing a model it is mandatory to re-run the
Smart Search job on all images to fully apply the change. Smart Search job on all images to fully apply the change.
:::info Internet connection :::info Internet connection
@ -113,15 +113,23 @@ After downloading, there is no need for Immich to connect to the network
Unless version checking has been enabled in the settings. Unless version checking has been enabled in the settings.
::: :::
### Duplicate Detection
Use CLIP embeddings to find likely duplicates. The maximum detection distance can be configured in order to improve / reduce the level of accuracy.
- **Maximum detection distance -** Maximum distance between two images to consider them duplicates, ranging from 0.001-0.1. Higher values will detect more duplicates, but may result in false positives.
### Facial Recognition ### Facial Recognition
Under these settings, you can change the facial recognition settings Under these settings, you can change the facial recognition settings
Editable settings: Editable settings:
- **Facial Recognition Model -** Models are listed in descending order of size. Larger models are slower and use more memory, but produce better results. Note that you must re-run the Face Detection job for all images upon changing a model. - **Facial Recognition Model**
- **Min Detection Score -** Minimum confidence score for a face to be detected from 0-1. Lower values will detect more faces but may result in false positives. - **Min Detection Score**
- **Max Recognition Distance -** Maximum distance between two faces to be considered the same person, ranging from 0-2. Lowering this can prevent labeling two people as the same person, while raising it can prevent labeling the same person as two different people. Note that it is easier to merge two people than to split one person in two, so err on the side of a lower threshold when possible. - **Max Recognition Distance**
- **Min Recognized Faces -** The minimum number of recognized faces for a person to be created (AKA: Core face). Increasing this makes Facial Recognition more precise at the cost of increasing the chance that a face is not assigned to a person. - **Min Recognized Faces**
You can learn more about these options on the [Facial Recognition page](/docs/features/facial-recognition#how-face-detection-works)
:::info :::info
When changing the values in Min Detection Score, Max Recognition Distance, and Min Recognized Faces. When changing the values in Min Detection Score, Max Recognition Distance, and Min Recognized Faces.
@ -153,7 +161,7 @@ SMTP server setup, for user creation notifications, new albums, etc. More inform
### External Domain ### External Domain
When set, will override the domain name used when viewing and copying a shared link. Overrides the domain name in shared links and email notifications. The URL should not include a trailing slash.
### Welcome Message ### Welcome Message

View File

@ -104,8 +104,8 @@ The `immich-server` container will need access to the gallery. Modify your docke
immich-server: immich-server:
volumes: volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload - ${UPLOAD_LOCATION}:/usr/src/app/upload
+ - /mnt/nas/christmas-trip:/mnt/nas/christmas-trip:ro + - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
+ - /home/user/old-pics:/home/user/old-pics:ro + - /home/user/old-pics:/mnt/media/old-pics:ro
+ - /mnt/media/videos:/mnt/media/videos:ro + - /mnt/media/videos:/mnt/media/videos:ro
+ - /mnt/media/videos2:/mnt/media/videos2 # the files in this folder can be deleted, as it does not end with :ro + - /mnt/media/videos2:/mnt/media/videos2 # the files in this folder can be deleted, as it does not end with :ro
+ - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system. + - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system.

View File

@ -16,7 +16,7 @@ When sharing shared albums, whats shared is:
- Download all assets as zip file (Web only). - Download all assets as zip file (Web only).
:::info Archive size limited. :::info Archive size limited.
If the size of the album exceeds 4GB, the archive files will be divided into 4GB each. If the size of the album exceeds 4GB, the archive files will by default be divided into 4GB each. This can be changed on the user settings page.
::: :::
- Add a description to the album (Web only). - Add a description to the album (Web only).
- Slideshow view (Web only). - Slideshow view (Web only).
@ -152,7 +152,7 @@ Some of the features are not available on mobile, to understand what the full fe
## Sharing Between Users ## Sharing Between Users
#### Add or remove users from the album. #### Add or remove users from the album
:::info remove user(s) :::info remove user(s)
When a user is removed from the album, the photos he uploaded will still appear in the album. When a user is removed from the album, the photos he uploaded will still appear in the album.

View File

@ -23,7 +23,7 @@ SELECT * FROM "assets" WHERE "originalFileName" LIKE '%_2023_%'; -- all files wi
``` ```
```sql title="Find by path" ```sql title="Find by path"
SELECT * FROM "assets" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_20230903_232542848.jpg'; SELECT * FROM "assets" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
SELECT * FROM "assets" WHERE "originalPath" LIKE 'upload/library/admin/2023/%'; SELECT * FROM "assets" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
``` ```
@ -37,6 +37,12 @@ SELECT * FROM "assets" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e
SELECT * FROM "assets" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation SELECT * FROM "assets" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- alternate notation
``` ```
```sql title="Find duplicate assets with identical checksum (SHA-1) (excluding trashed files)"
SELECT T1."checksum", array_agg(T2."id") ids FROM "assets" T1
INNER JOIN "assets" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
WHERE T1."deletedAt" IS NULL GROUP BY T1."checksum";
```
```sql title="Live photos" ```sql title="Live photos"
SELECT * FROM "assets" WHERE "livePhotoVideoId" IS NOT NULL; SELECT * FROM "assets" WHERE "livePhotoVideoId" IS NOT NULL;
``` ```
@ -79,8 +85,7 @@ SELECT "assets"."type", COUNT(*) FROM "assets" GROUP BY "assets"."type";
```sql title="Count by type (per user)" ```sql title="Count by type (per user)"
SELECT "users"."email", "assets"."type", COUNT(*) FROM "assets" SELECT "users"."email", "assets"."type", COUNT(*) FROM "assets"
JOIN "users" ON "assets"."ownerId" = "users"."id" JOIN "users" ON "assets"."ownerId" = "users"."id"
GROUP BY "assets"."type", "users"."email" GROUP BY "assets"."type", "users"."email" ORDER BY "users"."email";
ORDER BY "users"."email";
``` ```
```sql title="Failed file movements" ```sql title="Failed file movements"

View File

@ -11,13 +11,13 @@ Never forward port 2283 directly to the internet without additional configuratio
You may use a VPN service to open an encrypted connection to your Immich instance. OpenVPN and Wireguard are two popular VPN solutions. Here is a guide on setting up VPN access to your server - [Pihole documentation](https://docs.pi-hole.net/guides/vpn/wireguard/overview/) You may use a VPN service to open an encrypted connection to your Immich instance. OpenVPN and Wireguard are two popular VPN solutions. Here is a guide on setting up VPN access to your server - [Pihole documentation](https://docs.pi-hole.net/guides/vpn/wireguard/overview/)
### Pros: ### Pros
- Simple to set up and very secure. - Simple to set up and very secure.
- Single point of potential failure, i.e., the VPN software itself. Even if there is a zero-day vulnerability on Immich, you will not be at risk. - Single point of potential failure, i.e., the VPN software itself. Even if there is a zero-day vulnerability on Immich, you will not be at risk.
- Both Wireguard and OpenVPN are independently security-audited, so the risk of serious zero-day exploits are minimal. - Both Wireguard and OpenVPN are independently security-audited, so the risk of serious zero-day exploits are minimal.
### Cons: ### Cons
- If you don't have a static IP address, you would need to set up a [Dynamic DNS](https://www.cloudflare.com/learning/dns/glossary/dynamic-dns/). [DuckDNS](https://www.duckdns.org/) is a free DDNS provider. - If you don't have a static IP address, you would need to set up a [Dynamic DNS](https://www.cloudflare.com/learning/dns/glossary/dynamic-dns/). [DuckDNS](https://www.duckdns.org/) is a free DDNS provider.
- VPN software needs to be installed and active on both server-side and client-side. - VPN software needs to be installed and active on both server-side and client-side.
@ -27,6 +27,10 @@ You may use a VPN service to open an encrypted connection to your Immich instanc
If you are unable to open a port on your router for Wireguard or OpenVPN to your server, [Tailscale](https://tailscale.com/) is a good option. Tailscale mediates a peer-to-peer wireguard tunnel between your server and remote device, even if one or both of them are behind a [NAT firewall](https://en.wikipedia.org/wiki/Network_address_translation). If you are unable to open a port on your router for Wireguard or OpenVPN to your server, [Tailscale](https://tailscale.com/) is a good option. Tailscale mediates a peer-to-peer wireguard tunnel between your server and remote device, even if one or both of them are behind a [NAT firewall](https://en.wikipedia.org/wiki/Network_address_translation).
:::tip Video toturial
You can learn how to set up Tailscale together with Immich with the [tutorial video](https://www.youtube.com/watch?v=Vt4PDUXB_fg) they created.
:::
### Pros ### Pros
- Minimal configuration needed on server and client sides. - Minimal configuration needed on server and client sides.
@ -44,7 +48,7 @@ A reverse proxy is a service that sits between web servers and clients. A revers
If you're hosting your own reverse proxy, [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) is a great option. An example configuration for Nginx is provided [here](/docs/administration/reverse-proxy.md). If you're hosting your own reverse proxy, [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) is a great option. An example configuration for Nginx is provided [here](/docs/administration/reverse-proxy.md).
You'll also need your own certificate to authenticate https connections. If you're making Immich publicly accesible, [Let's Encrypt](https://letsencrypt.org/) can provide a free certificate for your domain and is the recommended option. Alternatively, a [self-signed certificate](https://en.wikipedia.org/wiki/Self-signed_certificate) allows you to encrypt your connection to Immich, but it raises a security warning on the client's browser. You'll also need your own certificate to authenticate https connections. If you're making Immich publicly accessible, [Let's Encrypt](https://letsencrypt.org/) can provide a free certificate for your domain and is the recommended option. Alternatively, a [self-signed certificate](https://en.wikipedia.org/wiki/Self-signed_certificate) allows you to encrypt your connection to Immich, but it raises a security warning on the client's browser.
A remote reverse proxy like [Cloudflare](https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/) increases security by hiding the server IP address, which makes targeted attacks like [DDoS](https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/) harder. A remote reverse proxy like [Cloudflare](https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/) increases security by hiding the server IP address, which makes targeted attacks like [DDoS](https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/) harder.

View File

@ -11,6 +11,10 @@ To alleviate [performance issues on low-memory systems](/docs/FAQ.mdx#why-is-imm
Smart Search and Face Detection will use this feature, but Facial Recognition is handled in the server. Smart Search and Face Detection will use this feature, but Facial Recognition is handled in the server.
::: :::
:::danger
When using remote machine learning, the thumbnails are sent to the remote machine learning container. Use this option carefully when running this on a public computer or a paid processing cloud.
:::
```yaml ```yaml
name: immich_remote_ml name: immich_remote_ml

View File

@ -109,7 +109,7 @@ Immich is currently under heavy development, which means you can expect [breakin
[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml [compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env [env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env
[watchtower]: https://containrrr.dev/watchtower/ [watchtower]: https://containrrr.dev/watchtower/
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Abreaking-change+sort%3Adate_created [breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
[container-auth]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry [container-auth]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry
[releases]: https://github.com/immich-app/immich/releases [releases]: https://github.com/immich-app/immich/releases
[docker-repo]: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository [docker-repo]: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

View File

@ -159,26 +159,29 @@ Redis (Sentinel) URL example JSON before encoding:
## Machine Learning ## Machine Learning
| Variable | Description | Default | Containers | | Variable | Description | Default | Containers |
| :----------------------------------------------- | :-------------------------------------------------------------------------------------------------- | :-----------------------------------: | :--------------- | | :-------------------------------------------------------- | :-------------------------------------------------------------------------------------------------- | :-----------------------------------: | :--------------- |
| `MACHINE_LEARNING_MODEL_TTL` | Inactivity time (s) before a model is unloaded (disabled if \<= 0) | `300` | machine learning | | `MACHINE_LEARNING_MODEL_TTL` | Inactivity time (s) before a model is unloaded (disabled if \<= 0) | `300` | machine learning |
| `MACHINE_LEARNING_MODEL_TTL_POLL_S` | Interval (s) between checks for the model TTL (disabled if \<= 0) | `10` | machine learning | | `MACHINE_LEARNING_MODEL_TTL_POLL_S` | Interval (s) between checks for the model TTL (disabled if \<= 0) | `10` | machine learning |
| `MACHINE_LEARNING_CACHE_FOLDER` | Directory where models are downloaded | `/cache` | machine learning | | `MACHINE_LEARNING_CACHE_FOLDER` | Directory where models are downloaded | `/cache` | machine learning |
| `MACHINE_LEARNING_REQUEST_THREADS`<sup>\*1</sup> | Thread count of the request thread pool (disabled if \<= 0) | number of CPU cores | machine learning | | `MACHINE_LEARNING_REQUEST_THREADS`<sup>\*1</sup> | Thread count of the request thread pool (disabled if \<= 0) | number of CPU cores | machine learning |
| `MACHINE_LEARNING_MODEL_INTER_OP_THREADS` | Number of parallel model operations | `1` | machine learning | | `MACHINE_LEARNING_MODEL_INTER_OP_THREADS` | Number of parallel model operations | `1` | machine learning |
| `MACHINE_LEARNING_MODEL_INTRA_OP_THREADS` | Number of threads for each model operation | `2` | machine learning | | `MACHINE_LEARNING_MODEL_INTRA_OP_THREADS` | Number of threads for each model operation | `2` | machine learning |
| `MACHINE_LEARNING_WORKERS`<sup>\*2</sup> | Number of worker processes to spawn | `1` | machine learning | | `MACHINE_LEARNING_WORKERS`<sup>\*2</sup> | Number of worker processes to spawn | `1` | machine learning |
| `MACHINE_LEARNING_WORKER_TIMEOUT` | Maximum time (s) of unresponsiveness before a worker is killed | `120` (`300` if using OpenVINO image) | machine learning | | `MACHINE_LEARNING_HTTP_KEEPALIVE_TIMEOUT_S`<sup>\*3</sup> | HTTP Keep-alive time in seconds | `2` | machine learning |
| `MACHINE_LEARNING_PRELOAD__CLIP` | Name of a CLIP model to be preloaded and kept in cache | | machine learning | | `MACHINE_LEARNING_WORKER_TIMEOUT` | Maximum time (s) of unresponsiveness before a worker is killed | `120` (`300` if using OpenVINO image) | machine learning |
| `MACHINE_LEARNING_PRELOAD__FACIAL_RECOGNITION` | Name of a facial recognition model to be preloaded and kept in cache | | machine learning | | `MACHINE_LEARNING_PRELOAD__CLIP` | Name of a CLIP model to be preloaded and kept in cache | | machine learning |
| `MACHINE_LEARNING_ANN` | Enable ARM-NN hardware acceleration if supported | `True` | machine learning | | `MACHINE_LEARNING_PRELOAD__FACIAL_RECOGNITION` | Name of a facial recognition model to be preloaded and kept in cache | | machine learning |
| `MACHINE_LEARNING_ANN_FP16_TURBO` | Execute operations in FP16 precision: increasing speed, reducing precision (applies only to ARM-NN) | `False` | machine learning | | `MACHINE_LEARNING_ANN` | Enable ARM-NN hardware acceleration if supported | `True` | machine learning |
| `MACHINE_LEARNING_ANN_TUNING_LEVEL` | ARM-NN GPU tuning level (1: rapid, 2: normal, 3: exhaustive) | `2` | machine learning | | `MACHINE_LEARNING_ANN_FP16_TURBO` | Execute operations in FP16 precision: increasing speed, reducing precision (applies only to ARM-NN) | `False` | machine learning |
| `MACHINE_LEARNING_ANN_TUNING_LEVEL` | ARM-NN GPU tuning level (1: rapid, 2: normal, 3: exhaustive) | `2` | machine learning |
\*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones. \*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones.
\*2: Since each process duplicates models in memory, changing this is not recommended unless you have abundant memory to go around. \*2: Since each process duplicates models in memory, changing this is not recommended unless you have abundant memory to go around.
\*3: For scenarios like HPA in K8S. https://github.com/immich-app/immich/discussions/12064
:::info :::info
Other machine learning parameters can be tuned from the admin UI. Other machine learning parameters can be tuned from the admin UI.

466
docs/package-lock.json generated
View File

@ -2155,9 +2155,9 @@
} }
}, },
"node_modules/@docusaurus/core": { "node_modules/@docusaurus/core": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz",
"integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/core": "^7.23.3", "@babel/core": "^7.23.3",
@ -2170,12 +2170,12 @@
"@babel/runtime": "^7.22.6", "@babel/runtime": "^7.22.6",
"@babel/runtime-corejs3": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6",
"@babel/traverse": "^7.22.8", "@babel/traverse": "^7.22.8",
"@docusaurus/cssnano-preset": "3.4.0", "@docusaurus/cssnano-preset": "3.5.2",
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/mdx-loader": "3.4.0", "@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"babel-loader": "^9.1.3", "babel-loader": "^9.1.3",
"babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-dynamic-import-node": "^2.3.3",
@ -2236,14 +2236,15 @@
"node": ">=18.0" "node": ">=18.0"
}, },
"peerDependencies": { "peerDependencies": {
"@mdx-js/react": "^3.0.0",
"react": "^18.0.0", "react": "^18.0.0",
"react-dom": "^18.0.0" "react-dom": "^18.0.0"
} }
}, },
"node_modules/@docusaurus/cssnano-preset": { "node_modules/@docusaurus/cssnano-preset": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz",
"integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cssnano-preset-advanced": "^6.1.2", "cssnano-preset-advanced": "^6.1.2",
@ -2256,9 +2257,9 @@
} }
}, },
"node_modules/@docusaurus/logger": { "node_modules/@docusaurus/logger": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz",
"integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"chalk": "^4.1.2", "chalk": "^4.1.2",
@ -2269,14 +2270,14 @@
} }
}, },
"node_modules/@docusaurus/mdx-loader": { "node_modules/@docusaurus/mdx-loader": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz",
"integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"@mdx-js/mdx": "^3.0.0", "@mdx-js/mdx": "^3.0.0",
"@slorber/remark-comment": "^1.0.0", "@slorber/remark-comment": "^1.0.0",
"escape-html": "^1.0.3", "escape-html": "^1.0.3",
@ -2308,12 +2309,12 @@
} }
}, },
"node_modules/@docusaurus/module-type-aliases": { "node_modules/@docusaurus/module-type-aliases": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz",
"integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@types/history": "^4.7.11", "@types/history": "^4.7.11",
"@types/react": "*", "@types/react": "*",
"@types/react-router-config": "*", "@types/react-router-config": "*",
@ -2326,52 +2327,21 @@
"react-dom": "*" "react-dom": "*"
} }
}, },
"node_modules/@docusaurus/plugin-content-blog": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz",
"integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==",
"license": "MIT",
"dependencies": {
"@docusaurus/core": "3.4.0",
"@docusaurus/logger": "3.4.0",
"@docusaurus/mdx-loader": "3.4.0",
"@docusaurus/types": "3.4.0",
"@docusaurus/utils": "3.4.0",
"@docusaurus/utils-common": "3.4.0",
"@docusaurus/utils-validation": "3.4.0",
"cheerio": "^1.0.0-rc.12",
"feed": "^4.2.2",
"fs-extra": "^11.1.1",
"lodash": "^4.17.21",
"reading-time": "^1.5.0",
"srcset": "^4.0.0",
"tslib": "^2.6.0",
"unist-util-visit": "^5.0.0",
"utility-types": "^3.10.0",
"webpack": "^5.88.1"
},
"engines": {
"node": ">=18.0"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@docusaurus/plugin-content-docs": { "node_modules/@docusaurus/plugin-content-docs": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz",
"integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/mdx-loader": "3.4.0", "@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/module-type-aliases": "3.4.0", "@docusaurus/module-type-aliases": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/theme-common": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"@docusaurus/utils-validation": "3.5.2",
"@types/react-router-config": "^5.0.7", "@types/react-router-config": "^5.0.7",
"combine-promises": "^1.1.0", "combine-promises": "^1.1.0",
"fs-extra": "^11.1.1", "fs-extra": "^11.1.1",
@ -2389,38 +2359,15 @@
"react-dom": "^18.0.0" "react-dom": "^18.0.0"
} }
}, },
"node_modules/@docusaurus/plugin-content-pages": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz",
"integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==",
"license": "MIT",
"dependencies": {
"@docusaurus/core": "3.4.0",
"@docusaurus/mdx-loader": "3.4.0",
"@docusaurus/types": "3.4.0",
"@docusaurus/utils": "3.4.0",
"@docusaurus/utils-validation": "3.4.0",
"fs-extra": "^11.1.1",
"tslib": "^2.6.0",
"webpack": "^5.88.1"
},
"engines": {
"node": ">=18.0"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@docusaurus/plugin-debug": { "node_modules/@docusaurus/plugin-debug": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz",
"integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"fs-extra": "^11.1.1", "fs-extra": "^11.1.1",
"react-json-view-lite": "^1.2.0", "react-json-view-lite": "^1.2.0",
"tslib": "^2.6.0" "tslib": "^2.6.0"
@ -2434,14 +2381,14 @@
} }
}, },
"node_modules/@docusaurus/plugin-google-analytics": { "node_modules/@docusaurus/plugin-google-analytics": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz",
"integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"tslib": "^2.6.0" "tslib": "^2.6.0"
}, },
"engines": { "engines": {
@ -2453,14 +2400,14 @@
} }
}, },
"node_modules/@docusaurus/plugin-google-gtag": { "node_modules/@docusaurus/plugin-google-gtag": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz",
"integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"@types/gtag.js": "^0.0.12", "@types/gtag.js": "^0.0.12",
"tslib": "^2.6.0" "tslib": "^2.6.0"
}, },
@ -2473,14 +2420,14 @@
} }
}, },
"node_modules/@docusaurus/plugin-google-tag-manager": { "node_modules/@docusaurus/plugin-google-tag-manager": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz",
"integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"tslib": "^2.6.0" "tslib": "^2.6.0"
}, },
"engines": { "engines": {
@ -2492,17 +2439,17 @@
} }
}, },
"node_modules/@docusaurus/plugin-sitemap": { "node_modules/@docusaurus/plugin-sitemap": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz",
"integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"fs-extra": "^11.1.1", "fs-extra": "^11.1.1",
"sitemap": "^7.1.1", "sitemap": "^7.1.1",
"tslib": "^2.6.0" "tslib": "^2.6.0"
@ -2516,24 +2463,81 @@
} }
}, },
"node_modules/@docusaurus/preset-classic": { "node_modules/@docusaurus/preset-classic": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz",
"integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/plugin-content-blog": "3.4.0", "@docusaurus/plugin-content-blog": "3.5.2",
"@docusaurus/plugin-content-docs": "3.4.0", "@docusaurus/plugin-content-docs": "3.5.2",
"@docusaurus/plugin-content-pages": "3.4.0", "@docusaurus/plugin-content-pages": "3.5.2",
"@docusaurus/plugin-debug": "3.4.0", "@docusaurus/plugin-debug": "3.5.2",
"@docusaurus/plugin-google-analytics": "3.4.0", "@docusaurus/plugin-google-analytics": "3.5.2",
"@docusaurus/plugin-google-gtag": "3.4.0", "@docusaurus/plugin-google-gtag": "3.5.2",
"@docusaurus/plugin-google-tag-manager": "3.4.0", "@docusaurus/plugin-google-tag-manager": "3.5.2",
"@docusaurus/plugin-sitemap": "3.4.0", "@docusaurus/plugin-sitemap": "3.5.2",
"@docusaurus/theme-classic": "3.4.0", "@docusaurus/theme-classic": "3.5.2",
"@docusaurus/theme-common": "3.4.0", "@docusaurus/theme-common": "3.5.2",
"@docusaurus/theme-search-algolia": "3.4.0", "@docusaurus/theme-search-algolia": "3.5.2",
"@docusaurus/types": "3.4.0" "@docusaurus/types": "3.5.2"
},
"engines": {
"node": ">=18.0"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/plugin-content-blog": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz",
"integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==",
"license": "MIT",
"dependencies": {
"@docusaurus/core": "3.5.2",
"@docusaurus/logger": "3.5.2",
"@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/theme-common": "3.5.2",
"@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.5.2",
"@docusaurus/utils-validation": "3.5.2",
"cheerio": "1.0.0-rc.12",
"feed": "^4.2.2",
"fs-extra": "^11.1.1",
"lodash": "^4.17.21",
"reading-time": "^1.5.0",
"srcset": "^4.0.0",
"tslib": "^2.6.0",
"unist-util-visit": "^5.0.0",
"utility-types": "^3.10.0",
"webpack": "^5.88.1"
},
"engines": {
"node": ">=18.0"
},
"peerDependencies": {
"@docusaurus/plugin-content-docs": "*",
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/plugin-content-pages": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz",
"integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==",
"license": "MIT",
"dependencies": {
"@docusaurus/core": "3.5.2",
"@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.5.2",
"@docusaurus/utils-validation": "3.5.2",
"fs-extra": "^11.1.1",
"tslib": "^2.6.0",
"webpack": "^5.88.1"
}, },
"engines": { "engines": {
"node": ">=18.0" "node": ">=18.0"
@ -2544,27 +2548,27 @@
} }
}, },
"node_modules/@docusaurus/theme-classic": { "node_modules/@docusaurus/theme-classic": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz",
"integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/mdx-loader": "3.4.0", "@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/module-type-aliases": "3.4.0", "@docusaurus/module-type-aliases": "3.5.2",
"@docusaurus/plugin-content-blog": "3.4.0", "@docusaurus/plugin-content-blog": "3.5.2",
"@docusaurus/plugin-content-docs": "3.4.0", "@docusaurus/plugin-content-docs": "3.5.2",
"@docusaurus/plugin-content-pages": "3.4.0", "@docusaurus/plugin-content-pages": "3.5.2",
"@docusaurus/theme-common": "3.4.0", "@docusaurus/theme-common": "3.5.2",
"@docusaurus/theme-translations": "3.4.0", "@docusaurus/theme-translations": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"@mdx-js/react": "^3.0.0", "@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"copy-text-to-clipboard": "^3.2.0", "copy-text-to-clipboard": "^3.2.0",
"infima": "0.2.0-alpha.43", "infima": "0.2.0-alpha.44",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"postcss": "^8.4.26", "postcss": "^8.4.26",
@ -2583,19 +2587,73 @@
"react-dom": "^18.0.0" "react-dom": "^18.0.0"
} }
}, },
"node_modules/@docusaurus/theme-common": { "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/plugin-content-blog": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz",
"integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/mdx-loader": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/module-type-aliases": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/plugin-content-blog": "3.4.0", "@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/plugin-content-docs": "3.4.0", "@docusaurus/theme-common": "3.5.2",
"@docusaurus/plugin-content-pages": "3.4.0", "@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"@docusaurus/utils-validation": "3.5.2",
"cheerio": "1.0.0-rc.12",
"feed": "^4.2.2",
"fs-extra": "^11.1.1",
"lodash": "^4.17.21",
"reading-time": "^1.5.0",
"srcset": "^4.0.0",
"tslib": "^2.6.0",
"unist-util-visit": "^5.0.0",
"utility-types": "^3.10.0",
"webpack": "^5.88.1"
},
"engines": {
"node": ">=18.0"
},
"peerDependencies": {
"@docusaurus/plugin-content-docs": "*",
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/plugin-content-pages": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz",
"integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==",
"license": "MIT",
"dependencies": {
"@docusaurus/core": "3.5.2",
"@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/types": "3.5.2",
"@docusaurus/utils": "3.5.2",
"@docusaurus/utils-validation": "3.5.2",
"fs-extra": "^11.1.1",
"tslib": "^2.6.0",
"webpack": "^5.88.1"
},
"engines": {
"node": ">=18.0"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@docusaurus/theme-common": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz",
"integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==",
"license": "MIT",
"dependencies": {
"@docusaurus/mdx-loader": "3.5.2",
"@docusaurus/module-type-aliases": "3.5.2",
"@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.5.2",
"@types/history": "^4.7.11", "@types/history": "^4.7.11",
"@types/react": "*", "@types/react": "*",
"@types/react-router-config": "*", "@types/react-router-config": "*",
@ -2609,24 +2667,25 @@
"node": ">=18.0" "node": ">=18.0"
}, },
"peerDependencies": { "peerDependencies": {
"@docusaurus/plugin-content-docs": "*",
"react": "^18.0.0", "react": "^18.0.0",
"react-dom": "^18.0.0" "react-dom": "^18.0.0"
} }
}, },
"node_modules/@docusaurus/theme-search-algolia": { "node_modules/@docusaurus/theme-search-algolia": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz",
"integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docsearch/react": "^3.5.2", "@docsearch/react": "^3.5.2",
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/plugin-content-docs": "3.4.0", "@docusaurus/plugin-content-docs": "3.5.2",
"@docusaurus/theme-common": "3.4.0", "@docusaurus/theme-common": "3.5.2",
"@docusaurus/theme-translations": "3.4.0", "@docusaurus/theme-translations": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-validation": "3.4.0", "@docusaurus/utils-validation": "3.5.2",
"algoliasearch": "^4.18.0", "algoliasearch": "^4.18.0",
"algoliasearch-helper": "^3.13.3", "algoliasearch-helper": "^3.13.3",
"clsx": "^2.0.0", "clsx": "^2.0.0",
@ -2645,9 +2704,9 @@
} }
}, },
"node_modules/@docusaurus/theme-translations": { "node_modules/@docusaurus/theme-translations": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz",
"integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fs-extra": "^11.1.1", "fs-extra": "^11.1.1",
@ -2658,9 +2717,9 @@
} }
}, },
"node_modules/@docusaurus/types": { "node_modules/@docusaurus/types": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz",
"integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@mdx-js/mdx": "^3.0.0", "@mdx-js/mdx": "^3.0.0",
@ -2679,13 +2738,13 @@
} }
}, },
"node_modules/@docusaurus/utils": { "node_modules/@docusaurus/utils": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz",
"integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "^8.1.0",
"escape-string-regexp": "^4.0.0", "escape-string-regexp": "^4.0.0",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
@ -2718,9 +2777,9 @@
} }
}, },
"node_modules/@docusaurus/utils-common": { "node_modules/@docusaurus/utils-common": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz",
"integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"tslib": "^2.6.0" "tslib": "^2.6.0"
@ -2738,14 +2797,14 @@
} }
}, },
"node_modules/@docusaurus/utils-validation": { "node_modules/@docusaurus/utils-validation": {
"version": "3.4.0", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz",
"integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.5.2",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.5.2",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.5.2",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"joi": "^17.9.2", "joi": "^17.9.2",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -8767,9 +8826,10 @@
} }
}, },
"node_modules/infima": { "node_modules/infima": {
"version": "0.2.0-alpha.43", "version": "0.2.0-alpha.44",
"resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz",
"integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==",
"license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@ -16020,9 +16080,9 @@
} }
}, },
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "3.4.9", "version": "3.4.10",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz",
"integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==", "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@alloc/quick-lru": "^5.2.0", "@alloc/quick-lru": "^5.2.0",

View File

@ -56,6 +56,6 @@
"node": ">=20" "node": ">=20"
}, },
"volta": { "volta": {
"node": "20.16.0" "node": "20.17.0"
} }
} }

View File

@ -43,6 +43,11 @@ const guides: CommunityGuidesProps[] = [
description: 'Access your local Immich installation over the internet using your own domain', description: 'Access your local Immich installation over the internet using your own domain',
url: 'https://github.com/ppr88/immich-guides/blob/main/open-immich-custom-domain.md', url: 'https://github.com/ppr88/immich-guides/blob/main/open-immich-custom-domain.md',
}, },
{
title: 'Nginx caching map server',
description: 'Increase privacy by using nginx as a caching proxy in front of a map tile server',
url: 'https://github.com/pcouy/pcouy.github.io/blob/main/_posts/2024-08-30-proxying-a-map-tile-server-for-increased-privacy.md',
},
]; ];
function CommunityGuide({ title, description, url }: CommunityGuidesProps): JSX.Element { function CommunityGuide({ title, description, url }: CommunityGuidesProps): JSX.Element {

View File

@ -28,11 +28,6 @@ const projects: CommunityProjectProps[] = [
description: 'A simple way to remove orphaned offline assets from the Immich database', description: 'A simple way to remove orphaned offline assets from the Immich database',
url: 'https://github.com/Thoroslives/immich_remove_offline_files', url: 'https://github.com/Thoroslives/immich_remove_offline_files',
}, },
{
title: 'Create albums from folders',
description: 'A Python script to create albums based on the folder structure of an external library.',
url: 'https://github.com/Salvoxia/immich-folder-album-creator',
},
{ {
title: 'Immich-Tools', title: 'Immich-Tools',
description: 'Provides scripts for handling problems on the repair page.', description: 'Provides scripts for handling problems on the repair page.',
@ -43,6 +38,11 @@ const projects: CommunityProjectProps[] = [
description: 'Lightroom plugin to publish photos from Lightroom collections to Immich albums.', description: 'Lightroom plugin to publish photos from Lightroom collections to Immich albums.',
url: 'https://github.com/midzelis/mi.Immich.Publisher', url: 'https://github.com/midzelis/mi.Immich.Publisher',
}, },
{
title: 'Lightroom Immich Plugin: lrc-immich-plugin',
description: 'Another Lightroom plugin to publish or export photos from Lightroom to Immich.',
url: 'https://github.com/bmachek/lrc-immich-plugin',
},
{ {
title: 'Immich Duplicate Finder', title: 'Immich Duplicate Finder',
description: 'Webapp that uses machine learning to identify near-duplicate images.', description: 'Webapp that uses machine learning to identify near-duplicate images.',
@ -58,6 +58,11 @@ const projects: CommunityProjectProps[] = [
description: 'Unofficial Immich Android TV app.', description: 'Unofficial Immich Android TV app.',
url: 'https://github.com/giejay/Immich-Android-TV', url: 'https://github.com/giejay/Immich-Android-TV',
}, },
{
title: 'Create albums from folders',
description: 'A Python script to create albums based on the folder structure of an external library.',
url: 'https://github.com/Salvoxia/immich-folder-album-creator',
},
{ {
title: 'Powershell Module PSImmich', title: 'Powershell Module PSImmich',
description: 'Powershell Module for the Immich API', description: 'Powershell Module for the Immich API',
@ -68,6 +73,16 @@ const projects: CommunityProjectProps[] = [
description: 'Snap package for easy install and zero-care auto updates of Immich. Self-hosted photo management.', description: 'Snap package for easy install and zero-care auto updates of Immich. Self-hosted photo management.',
url: 'https://immich-distribution.nsg.cc', url: 'https://immich-distribution.nsg.cc',
}, },
{
title: 'Immich Kiosk',
description: 'Lightweight slideshow to run on kiosk devices and browsers.',
url: 'https://github.com/damongolding/immich-kiosk',
},
{
title: 'Immich Power Tools',
description: 'Power tools for organizing your immich library.',
url: 'https://github.com/varun-raj/immich-power-tools',
},
]; ];
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element { function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {

View File

@ -1,4 +1,3 @@
import '@docusaurus/theme-classic/lib/theme/Unlisted/index';
import { useWindowSize } from '@docusaurus/theme-common'; import { useWindowSize } from '@docusaurus/theme-common';
import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';

View File

@ -15,6 +15,7 @@ import {
mdiCloudUploadOutline, mdiCloudUploadOutline,
mdiCollage, mdiCollage,
mdiContentDuplicate, mdiContentDuplicate,
mdiCrop,
mdiDevices, mdiDevices,
mdiEmailOutline, mdiEmailOutline,
mdiExpansionCard, mdiExpansionCard,
@ -26,6 +27,7 @@ import {
mdiFileSearch, mdiFileSearch,
mdiFlash, mdiFlash,
mdiFolder, mdiFolder,
mdiFolderMultiple,
mdiForum, mdiForum,
mdiHandshakeOutline, mdiHandshakeOutline,
mdiHeart, mdiHeart,
@ -36,6 +38,7 @@ import {
mdiImageMultipleOutline, mdiImageMultipleOutline,
mdiImageSearch, mdiImageSearch,
mdiKeyboardSettingsOutline, mdiKeyboardSettingsOutline,
mdiLicense,
mdiLockOutline, mdiLockOutline,
mdiMagnify, mdiMagnify,
mdiMagnifyScan, mdiMagnifyScan,
@ -55,25 +58,29 @@ import {
mdiScaleBalance, mdiScaleBalance,
mdiSecurity, mdiSecurity,
mdiServer, mdiServer,
mdiShare,
mdiShareAll, mdiShareAll,
mdiShareCircle, mdiShareCircle,
mdiStar, mdiStar,
mdiStarOutline,
mdiTableKey, mdiTableKey,
mdiTag, mdiTag,
mdiTagMultiple,
mdiText, mdiText,
mdiThemeLightDark, mdiThemeLightDark,
mdiTrashCanOutline, mdiTrashCanOutline,
mdiVectorCombine, mdiVectorCombine,
mdiVideo, mdiVideo,
mdiWeb, mdiWeb,
mdiLicense,
} from '@mdi/js'; } from '@mdi/js';
import Layout from '@theme/Layout'; import Layout from '@theme/Layout';
import React from 'react'; import React from 'react';
import { Item, Timeline } from '../components/timeline'; import { Item, Timeline } from '../components/timeline';
const releases = { const releases = {
// TODO 'v1.113.0': new Date(2024, 7, 30),
'v1.112.0': new Date(2024, 7, 14),
'v1.111.0': new Date(2024, 6, 26),
'v1.110.0': new Date(2024, 5, 11), 'v1.110.0': new Date(2024, 5, 11),
'v1.109.0': new Date(2024, 6, 18), 'v1.109.0': new Date(2024, 6, 18),
'v1.106.1': new Date(2024, 5, 11), 'v1.106.1': new Date(2024, 5, 11),
@ -224,6 +231,47 @@ const roadmap: Item[] = [
]; ];
const milestones: Item[] = [ const milestones: Item[] = [
withRelease({
icon: mdiTagMultiple,
iconColor: 'orange',
title: 'Tags',
description: 'Tag your photos and videos',
release: 'v1.113.0',
}),
withRelease({
icon: mdiFolderMultiple,
iconColor: 'brown',
title: 'Folders',
description: 'View your photos and videos in folders',
release: 'v1.113.0',
}),
withRelease({
icon: mdiPalette,
title: 'Theming (mobile)',
description: 'Pick a primary color for the mobile app',
release: 'v1.112.0',
}),
withRelease({
icon: mdiStarOutline,
iconColor: 'gold',
title: 'Star rating',
description: 'Rate your photos and videos',
release: 'v1.112.0',
}),
withRelease({
icon: mdiCrop,
iconColor: 'royalblue',
title: 'Editor (mobile)',
description: 'Crop and rotate on mobile',
release: 'v1.111.0',
}),
withRelease({
icon: mdiMap,
iconColor: 'green',
title: 'Deploy tiles.immich.cloud',
description: 'Dedicated tile server for Immich',
release: 'v1.111.0',
}),
{ {
icon: mdiStar, icon: mdiStar,
iconColor: 'gold', iconColor: 'gold',
@ -231,6 +279,12 @@ const milestones: Item[] = [
description: 'Reached 40K Stars on GitHub!', description: 'Reached 40K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2024, 6, 21)), getDateLabel: withLanguage(new Date(2024, 6, 21)),
}, },
withRelease({
icon: mdiShare,
title: 'Deploy my.immich.app',
description: 'Url router for immich links',
release: 'v1.109.0',
}),
withRelease({ withRelease({
icon: mdiLicense, icon: mdiLicense,
iconColor: 'gold', iconColor: 'gold',

View File

@ -1,4 +1,8 @@
[ [
{
"label": "v1.113.0",
"url": "https://v1.113.0.archive.immich.app"
},
{ {
"label": "v1.112.1", "label": "v1.112.1",
"url": "https://v1.112.1.archive.immich.app" "url": "https://v1.112.1.archive.immich.app"

View File

@ -4,7 +4,7 @@ module.exports = {
corePlugins: { corePlugins: {
preflight: false, // disable Tailwind's reset preflight: false, // disable Tailwind's reset
}, },
content: ['./src/**/*.{js,jsx,ts,tsx}', '../docs/**/*.mdx'], // my markdown stuff is in ../docs, not /src content: ['./src/**/*.{js,jsx,ts,tsx}', './{docs,blog}/**/*.{md,mdx}'], // my markdown stuff is in ../docs, not /src
darkMode: ['class', '[data-theme="dark"]'], // hooks into docusaurus' dark mode settigns darkMode: ['class', '[data-theme="dark"]'], // hooks into docusaurus' dark mode settigns
theme: { theme: {
extend: { extend: {

View File

@ -1 +1 @@
20.16.0 20.17.0

View File

@ -30,7 +30,7 @@ services:
- redis - redis
- database - database
ports: ports:
- 2283:3001 - 2285:3001
redis: redis:
image: redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e image: redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e
@ -43,7 +43,7 @@ services:
POSTGRES_USER: postgres POSTGRES_USER: postgres
POSTGRES_DB: immich POSTGRES_DB: immich
ports: ports:
- 5433:5432 - 5435:5432
volumes: volumes:
model-cache: model-cache:

View File

@ -59,6 +59,7 @@ export default [
'unicorn/prefer-top-level-await': 'off', 'unicorn/prefer-top-level-await': 'off',
'unicorn/prefer-event-target': 'off', 'unicorn/prefer-event-target': 'off',
'unicorn/no-thenable': 'off', 'unicorn/no-thenable': 'off',
'object-shorthand': ['error', 'always'],
}, },
}, },
]; ];

187
e2e/package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.112.1", "version": "1.113.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.112.1", "version": "1.113.0",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.1.0",
@ -15,7 +15,7 @@
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"@types/oidc-provider": "^8.5.1", "@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0", "@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",
@ -45,7 +45,7 @@
}, },
"../cli": { "../cli": {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.15", "version": "2.2.16",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
@ -64,7 +64,7 @@
"@types/cli-progress": "^3.11.0", "@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "^2.0.5", "@vitest/coverage-v8": "^2.0.5",
@ -92,14 +92,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.112.1", "version": "1.113.0",
"dev": true, "dev": true,
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"dependencies": { "dependencies": {
"@oazapfts/runtime": "^1.0.2" "@oazapfts/runtime": "^1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@ -799,9 +799,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.8.0", "version": "9.9.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz",
"integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1113,13 +1113,13 @@
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
"version": "1.46.0", "version": "1.46.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz",
"integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"playwright": "1.46.0" "playwright": "1.46.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -1516,13 +1516,13 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.14.15", "version": "20.16.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz",
"integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~6.19.2"
} }
}, },
"node_modules/@types/normalize-package-data": { "node_modules/@types/normalize-package-data": {
@ -1532,10 +1532,11 @@
"dev": true "dev": true
}, },
"node_modules/@types/oidc-provider": { "node_modules/@types/oidc-provider": {
"version": "8.5.1", "version": "8.5.2",
"resolved": "https://registry.npmjs.org/@types/oidc-provider/-/oidc-provider-8.5.1.tgz", "resolved": "https://registry.npmjs.org/@types/oidc-provider/-/oidc-provider-8.5.2.tgz",
"integrity": "sha512-NS8tBPOj9GG6SxyrUHWBzglOtAYNDX41J4cRE45oeK0iSqI6V6tDW70aPWg25pJFNSC1evccXFm9evfwjxm7HQ==", "integrity": "sha512-NiD3VG49+cRCAAe8+uZLM4onOcX8y9+cwaml8JG1qlgc98rWoCRgsnOB4Ypx+ysays5jiwzfUgT0nWyXPB/9uQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@types/koa": "*", "@types/koa": "*",
"@types/node": "*" "@types/node": "*"
@ -1673,17 +1674,17 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz",
"integrity": "sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==", "integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.0.1", "@typescript-eslint/scope-manager": "8.2.0",
"@typescript-eslint/type-utils": "8.0.1", "@typescript-eslint/type-utils": "8.2.0",
"@typescript-eslint/utils": "8.0.1", "@typescript-eslint/utils": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1", "@typescript-eslint/visitor-keys": "8.2.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@ -1707,16 +1708,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz",
"integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==", "integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.0.1", "@typescript-eslint/scope-manager": "8.2.0",
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/typescript-estree": "8.0.1", "@typescript-eslint/typescript-estree": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1", "@typescript-eslint/visitor-keys": "8.2.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -1736,14 +1737,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz",
"integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1" "@typescript-eslint/visitor-keys": "8.2.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1754,14 +1755,14 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz",
"integrity": "sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==", "integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.0.1", "@typescript-eslint/typescript-estree": "8.2.0",
"@typescript-eslint/utils": "8.0.1", "@typescript-eslint/utils": "8.2.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@ -1779,9 +1780,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz",
"integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1793,14 +1794,14 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz",
"integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/visitor-keys": "8.0.1", "@typescript-eslint/visitor-keys": "8.2.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -1848,16 +1849,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz",
"integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", "integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.0.1", "@typescript-eslint/scope-manager": "8.2.0",
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"@typescript-eslint/typescript-estree": "8.0.1" "@typescript-eslint/typescript-estree": "8.2.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1871,13 +1872,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.0.1", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz",
"integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.0.1", "@typescript-eslint/types": "8.2.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@ -2888,9 +2889,9 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.8.0", "version": "9.9.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz",
"integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -2898,7 +2899,7 @@
"@eslint-community/regexpp": "^4.11.0", "@eslint-community/regexpp": "^4.11.0",
"@eslint/config-array": "^0.17.1", "@eslint/config-array": "^0.17.1",
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.1.0",
"@eslint/js": "9.8.0", "@eslint/js": "9.9.0",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.3.0", "@humanwhocodes/retry": "^0.3.0",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
@ -2937,6 +2938,14 @@
}, },
"funding": { "funding": {
"url": "https://eslint.org/donate" "url": "https://eslint.org/donate"
},
"peerDependencies": {
"jiti": "*"
},
"peerDependenciesMeta": {
"jiti": {
"optional": true
}
} }
}, },
"node_modules/eslint-config-prettier": { "node_modules/eslint-config-prettier": {
@ -3176,9 +3185,9 @@
} }
}, },
"node_modules/exiftool-vendored": { "node_modules/exiftool-vendored": {
"version": "28.2.0", "version": "28.2.1",
"resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-28.2.0.tgz", "resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-28.2.1.tgz",
"integrity": "sha512-s2k92EB8LSeYjXv4agtpANeH8y1CsEThYqMm7AF1jP64PyFb40AoD0RGf69j28G6RqXkT5JGl4Xwk9kOy3IkjQ==", "integrity": "sha512-D3YsKErr3BbjKeJzUVsv6CVZ+SQNgAJKPFWVLXu0CBtr24FNuE3CZBXWKWysGu0MjzeDCNwQrQI5+bXUFeiYVA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -3186,7 +3195,7 @@
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"batch-cluster": "^13.0.0", "batch-cluster": "^13.0.0",
"he": "^1.2.0", "he": "^1.2.0",
"luxon": "^3.4.4" "luxon": "^3.5.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"exiftool-vendored.exe": "12.91.0", "exiftool-vendored.exe": "12.91.0",
@ -4125,10 +4134,11 @@
} }
}, },
"node_modules/jose": { "node_modules/jose": {
"version": "5.6.3", "version": "5.7.0",
"resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", "resolved": "https://registry.npmjs.org/jose/-/jose-5.7.0.tgz",
"integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", "integrity": "sha512-3P9qfTYDVnNn642LCAqIKbTGb9a1TBxZ9ti5zEVEr48aDdflgRjhspWFb6WM4PzAfFbGMJYC4+803v8riCRAKw==",
"dev": true, "dev": true,
"license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/panva" "url": "https://github.com/sponsors/panva"
} }
@ -4436,9 +4446,9 @@
} }
}, },
"node_modules/micromatch": { "node_modules/micromatch": {
"version": "4.0.7", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -5178,13 +5188,13 @@
} }
}, },
"node_modules/playwright": { "node_modules/playwright": {
"version": "1.46.0", "version": "1.46.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz",
"integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"playwright-core": "1.46.0" "playwright-core": "1.46.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -5197,9 +5207,9 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.46.0", "version": "1.46.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz",
"integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"bin": { "bin": {
@ -6339,10 +6349,11 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "5.26.5", "version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/unpipe": { "node_modules/unpipe": {
"version": "1.0.0", "version": "1.0.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.112.1", "version": "1.113.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@ -25,7 +25,7 @@
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^20.14.14", "@types/node": "^20.16.1",
"@types/oidc-provider": "^8.5.1", "@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0", "@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",
@ -53,6 +53,6 @@
"vitest": "^2.0.5" "vitest": "^2.0.5"
}, },
"volta": { "volta": {
"node": "20.16.0" "node": "20.17.0"
} }
} }

View File

@ -8,7 +8,7 @@ export default defineConfig({
workers: 1, workers: 1,
reporter: 'html', reporter: 'html',
use: { use: {
baseURL: 'http://127.0.0.1:2283', baseURL: 'http://127.0.0.1:2285',
trace: 'on-first-retry', trace: 'on-first-retry',
}, },
@ -54,7 +54,7 @@ export default defineConfig({
/* Run your local dev server before starting the tests */ /* Run your local dev server before starting the tests */
webServer: { webServer: {
command: 'docker compose up --build -V --remove-orphans', command: 'docker compose up --build -V --remove-orphans',
url: 'http://127.0.0.1:2283', url: 'http://127.0.0.1:2285',
reuseExistingServer: true, reuseExistingServer: true,
}, },
}); });

View File

@ -344,16 +344,16 @@ describe('/albums', () => {
}); });
}); });
describe('GET /albums/count', () => { describe('GET /albums/statistics', () => {
it('should require authentication', async () => { it('should require authentication', async () => {
const { status, body } = await request(app).get('/albums/count'); const { status, body } = await request(app).get('/albums/statistics');
expect(status).toBe(401); expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized); expect(body).toEqual(errorDto.unauthorized);
}); });
it('should return total count of albums the user has access to', async () => { it('should return total count of albums the user has access to', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.get('/albums/count') .get('/albums/statistics')
.set('Authorization', `Bearer ${user1.accessToken}`); .set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200); expect(status).toBe(200);

View File

@ -7,7 +7,6 @@ import {
SharedLinkType, SharedLinkType,
getAssetInfo, getAssetInfo,
getMyUser, getMyUser,
updateAssets,
} from '@immich/sdk'; } from '@immich/sdk';
import { exiftool } from 'exiftool-vendored'; import { exiftool } from 'exiftool-vendored';
import { DateTime } from 'luxon'; import { DateTime } from 'luxon';
@ -67,11 +66,9 @@ describe('/asset', () => {
let timeBucketUser: LoginResponseDto; let timeBucketUser: LoginResponseDto;
let quotaUser: LoginResponseDto; let quotaUser: LoginResponseDto;
let statsUser: LoginResponseDto; let statsUser: LoginResponseDto;
let stackUser: LoginResponseDto;
let user1Assets: AssetMediaResponseDto[]; let user1Assets: AssetMediaResponseDto[];
let user2Assets: AssetMediaResponseDto[]; let user2Assets: AssetMediaResponseDto[];
let stackAssets: AssetMediaResponseDto[];
let locationAsset: AssetMediaResponseDto; let locationAsset: AssetMediaResponseDto;
let ratingAsset: AssetMediaResponseDto; let ratingAsset: AssetMediaResponseDto;
@ -79,14 +76,13 @@ describe('/asset', () => {
await utils.resetDatabase(); await utils.resetDatabase();
admin = await utils.adminSetup({ onboarding: false }); admin = await utils.adminSetup({ onboarding: false });
[websocket, user1, user2, statsUser, quotaUser, timeBucketUser, stackUser] = await Promise.all([ [websocket, user1, user2, statsUser, quotaUser, timeBucketUser] = await Promise.all([
utils.connectWebsocket(admin.accessToken), utils.connectWebsocket(admin.accessToken),
utils.userSetup(admin.accessToken, createUserDto.create('1')), utils.userSetup(admin.accessToken, createUserDto.create('1')),
utils.userSetup(admin.accessToken, createUserDto.create('2')), utils.userSetup(admin.accessToken, createUserDto.create('2')),
utils.userSetup(admin.accessToken, createUserDto.create('stats')), utils.userSetup(admin.accessToken, createUserDto.create('stats')),
utils.userSetup(admin.accessToken, createUserDto.userQuota), utils.userSetup(admin.accessToken, createUserDto.userQuota),
utils.userSetup(admin.accessToken, createUserDto.create('time-bucket')), utils.userSetup(admin.accessToken, createUserDto.create('time-bucket')),
utils.userSetup(admin.accessToken, createUserDto.create('stack')),
]); ]);
await utils.createPartner(user1.accessToken, user2.userId); await utils.createPartner(user1.accessToken, user2.userId);
@ -149,20 +145,6 @@ describe('/asset', () => {
}), }),
]); ]);
// stacks
stackAssets = await Promise.all([
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
]);
await updateAssets(
{ assetBulkUpdateDto: { stackParentId: stackAssets[0].id, ids: [stackAssets[1].id, stackAssets[2].id] } },
{ headers: asBearerAuth(stackUser.accessToken) },
);
const person1 = await utils.createPerson(user1.accessToken, { const person1 = await utils.createPerson(user1.accessToken, {
name: 'Test Person', name: 'Test Person',
}); });
@ -381,6 +363,8 @@ describe('/asset', () => {
utils.createAsset(user1.accessToken), utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken), utils.createAsset(user1.accessToken),
]); ]);
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
}); });
it('should require authentication', async () => { it('should require authentication', async () => {
@ -417,17 +401,14 @@ describe('/asset', () => {
} }
}); });
it.each(TEN_TIMES)( it.skip('should return 1 asset if there are 10 assets in the database but user 2 only has 1', async () => {
'should return 1 asset if there are 10 assets in the database but user 2 only has 1', const { status, body } = await request(app)
async () => { .get('/assets/random')
const { status, body } = await request(app) .set('Authorization', `Bearer ${user2.accessToken}`);
.get('/assets/random')
.set('Authorization', `Bearer ${user2.accessToken}`);
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]); expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]);
}, });
);
it('should return error', async () => { it('should return error', async () => {
const { status } = await request(app) const { status } = await request(app)
@ -826,145 +807,8 @@ describe('/asset', () => {
expect(status).toBe(401); expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized); expect(body).toEqual(errorDto.unauthorized);
}); });
it('should require a valid parent id', async () => {
const { status, body } = await request(app)
.put('/assets')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ stackParentId: uuidDto.invalid, ids: [stackAssets[0].id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['stackParentId must be a UUID']));
});
it('should require access to the parent', async () => {
const { status, body } = await request(app)
.put('/assets')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ stackParentId: stackAssets[3].id, ids: [user1Assets[0].id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should add stack children', async () => {
const { status } = await request(app)
.put('/assets')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ stackParentId: stackAssets[0].id, ids: [stackAssets[3].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(expect.arrayContaining([expect.objectContaining({ id: stackAssets[3].id })]));
});
it('should remove stack children', async () => {
const { status } = await request(app)
.put('/assets')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ removeParent: true, ids: [stackAssets[1].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[2].id }),
expect.objectContaining({ id: stackAssets[3].id }),
]),
);
});
it('should remove all stack children', async () => {
const { status } = await request(app)
.put('/assets')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ removeParent: true, ids: [stackAssets[2].id, stackAssets[3].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).toBeUndefined();
});
it('should merge stack children', async () => {
// create stack after previous test removed stack children
await updateAssets(
{ assetBulkUpdateDto: { stackParentId: stackAssets[0].id, ids: [stackAssets[1].id, stackAssets[2].id] } },
{ headers: asBearerAuth(stackUser.accessToken) },
);
const { status } = await request(app)
.put('/assets')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ stackParentId: stackAssets[3].id, ids: [stackAssets[0].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[3].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[0].id }),
expect.objectContaining({ id: stackAssets[1].id }),
expect.objectContaining({ id: stackAssets[2].id }),
]),
);
});
}); });
describe('PUT /assets/stack/parent', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put('/assets/stack/parent');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid id', async () => {
const { status, body } = await request(app)
.put('/assets/stack/parent')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ oldParentId: uuidDto.invalid, newParentId: uuidDto.invalid });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
it('should require access', async () => {
const { status, body } = await request(app)
.put('/assets/stack/parent')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ oldParentId: stackAssets[3].id, newParentId: stackAssets[0].id });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should make old parent child of new parent', async () => {
const { status } = await request(app)
.put('/assets/stack/parent')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ oldParentId: stackAssets[3].id, newParentId: stackAssets[0].id });
expect(status).toBe(200);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
// new parent
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[1].id }),
expect.objectContaining({ id: stackAssets[2].id }),
expect.objectContaining({ id: stackAssets[3].id }),
]),
);
});
});
describe('POST /assets', () => { describe('POST /assets', () => {
beforeAll(setupTests, 30_000); beforeAll(setupTests, 30_000);
@ -999,7 +843,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: '8bit-sRGB.avif', originalFileName: '8bit-sRGB.avif',
resized: true,
exifInfo: { exifInfo: {
description: '', description: '',
exifImageHeight: 1080, exifImageHeight: 1080,
@ -1015,7 +858,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: 'el_torcal_rocks.jpg', originalFileName: 'el_torcal_rocks.jpg',
resized: true,
exifInfo: { exifInfo: {
dateTimeOriginal: '2012-08-05T11:39:59.000Z', dateTimeOriginal: '2012-08-05T11:39:59.000Z',
exifImageWidth: 512, exifImageWidth: 512,
@ -1039,7 +881,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: '8bit-sRGB.jxl', originalFileName: '8bit-sRGB.jxl',
resized: true,
exifInfo: { exifInfo: {
description: '', description: '',
exifImageHeight: 1080, exifImageHeight: 1080,
@ -1055,7 +896,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: 'IMG_2682.heic', originalFileName: 'IMG_2682.heic',
resized: true,
fileCreatedAt: '2019-03-21T16:04:22.348Z', fileCreatedAt: '2019-03-21T16:04:22.348Z',
exifInfo: { exifInfo: {
dateTimeOriginal: '2019-03-21T16:04:22.348Z', dateTimeOriginal: '2019-03-21T16:04:22.348Z',
@ -1080,7 +920,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: 'density_plot.png', originalFileName: 'density_plot.png',
resized: true,
exifInfo: { exifInfo: {
exifImageWidth: 800, exifImageWidth: 800,
exifImageHeight: 800, exifImageHeight: 800,
@ -1095,7 +934,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: 'glarus.nef', originalFileName: 'glarus.nef',
resized: true,
fileCreatedAt: '2010-07-20T17:27:12.000Z', fileCreatedAt: '2010-07-20T17:27:12.000Z',
exifInfo: { exifInfo: {
make: 'NIKON CORPORATION', make: 'NIKON CORPORATION',
@ -1117,7 +955,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: 'philadelphia.nef', originalFileName: 'philadelphia.nef',
resized: true,
fileCreatedAt: '2016-09-22T22:10:29.060Z', fileCreatedAt: '2016-09-22T22:10:29.060Z',
exifInfo: { exifInfo: {
make: 'NIKON CORPORATION', make: 'NIKON CORPORATION',
@ -1140,7 +977,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: '4_3.rw2', originalFileName: '4_3.rw2',
resized: true,
fileCreatedAt: '2018-05-10T08:42:37.842Z', fileCreatedAt: '2018-05-10T08:42:37.842Z',
exifInfo: { exifInfo: {
make: 'Panasonic', make: 'Panasonic',
@ -1164,7 +1000,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: '12bit-compressed-(3_2).arw', originalFileName: '12bit-compressed-(3_2).arw',
resized: true,
fileCreatedAt: '2016-09-27T10:51:44.000Z', fileCreatedAt: '2016-09-27T10:51:44.000Z',
exifInfo: { exifInfo: {
make: 'SONY', make: 'SONY',
@ -1189,7 +1024,6 @@ describe('/asset', () => {
expected: { expected: {
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalFileName: '14bit-uncompressed-(3_2).arw', originalFileName: '14bit-uncompressed-(3_2).arw',
resized: true,
fileCreatedAt: '2016-01-08T14:08:01.000Z', fileCreatedAt: '2016-01-08T14:08:01.000Z',
exifInfo: { exifInfo: {
make: 'SONY', make: 'SONY',

View File

@ -353,7 +353,7 @@ describe('/libraries', () => {
expect(assets.count).toBe(2); expect(assets.count).toBe(2);
utils.createImageFile(`${testAssetDir}/temp/directoryA/assetB.png`); utils.createImageFile(`${testAssetDir}/temp/directoryA/assetC.png`);
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForWebsocketEvent({ event: 'assetUpload', total: 3 }); await utils.waitForWebsocketEvent({ event: 'assetUpload', total: 3 });
@ -361,11 +361,11 @@ describe('/libraries', () => {
const { assets: newAssets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id }); const { assets: newAssets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(newAssets.count).toBe(3); expect(newAssets.count).toBe(3);
utils.removeImageFile(`${testAssetDir}/temp/directoryA/assetB.png`); utils.removeImageFile(`${testAssetDir}/temp/directoryA/assetC.png`);
}); });
it('should offline missing files', async () => { it('should offline a file missing from disk', async () => {
utils.createImageFile(`${testAssetDir}/temp/directoryA/assetB.png`); utils.createImageFile(`${testAssetDir}/temp/directoryA/assetC.png`);
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
@ -374,7 +374,40 @@ describe('/libraries', () => {
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
utils.removeImageFile(`${testAssetDir}/temp/directoryA/assetB.png`); const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(3);
utils.removeImageFile(`${testAssetDir}/temp/directoryA/assetC.png`);
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
const { assets: newAssets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(newAssets.count).toBe(3);
expect(newAssets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({
isOffline: true,
originalFileName: 'assetC.png',
}),
]),
);
});
it('should offline a file outside of import paths', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp`],
});
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
await request(app)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ importPaths: [`${testAssetDirInternal}/temp/directoryA`] });
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
@ -383,6 +416,45 @@ describe('/libraries', () => {
expect(assets.items).toEqual( expect(assets.items).toEqual(
expect.arrayContaining([ expect.arrayContaining([
expect.objectContaining({
isOffline: false,
originalFileName: 'assetA.png',
}),
expect.objectContaining({
isOffline: true,
originalFileName: 'assetB.png',
}),
]),
);
});
it('should offline a file covered by an exclusion pattern', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp`],
});
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
await request(app)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ exclusionPatterns: ['**/directoryB/**'] });
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(2);
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({
isOffline: false,
originalFileName: 'assetA.png',
}),
expect.objectContaining({ expect.objectContaining({
isOffline: true, isOffline: true,
originalFileName: 'assetB.png', originalFileName: 'assetB.png',
@ -434,6 +506,8 @@ describe('/libraries', () => {
await utils.waitForWebsocketEvent({ event: 'assetDelete', total: 1 }); await utils.waitForWebsocketEvent({ event: 'assetDelete', total: 1 });
expect(existsSync(`${testAssetDir}/temp/offline1/assetA.png`)).toBe(true); expect(existsSync(`${testAssetDir}/temp/offline1/assetA.png`)).toBe(true);
utils.removeImageFile(`${testAssetDir}/temp/offline1/assetA.png`);
}); });
it('should scan new files', async () => { it('should scan new files', async () => {
@ -445,14 +519,14 @@ describe('/libraries', () => {
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
utils.createImageFile(`${testAssetDir}/temp/directoryA/assetC.png`); utils.createImageFile(`${testAssetDir}/temp/directoryC/assetC.png`);
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
utils.removeImageFile(`${testAssetDir}/temp/directoryA/assetC.png`);
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id }); const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(3);
expect(assets.items).toEqual( expect(assets.items).toEqual(
expect.arrayContaining([ expect.arrayContaining([
expect.objectContaining({ expect.objectContaining({
@ -460,6 +534,8 @@ describe('/libraries', () => {
}), }),
]), ]),
); );
utils.removeImageFile(`${testAssetDir}/temp/directoryC/assetC.png`);
}); });
describe('with refreshModifiedFiles=true', () => { describe('with refreshModifiedFiles=true', () => {
@ -559,10 +635,11 @@ describe('/libraries', () => {
it('should remove offline files', async () => { it('should remove offline files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/offline2`], importPaths: [`${testAssetDirInternal}/temp/offline`],
}); });
utils.createImageFile(`${testAssetDir}/temp/offline2/assetA.png`); utils.createImageFile(`${testAssetDir}/temp/offline/online.png`);
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
@ -570,9 +647,9 @@ describe('/libraries', () => {
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, { const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
libraryId: library.id, libraryId: library.id,
}); });
expect(initialAssets.count).toBe(1); expect(initialAssets.count).toBe(2);
utils.removeImageFile(`${testAssetDir}/temp/offline2/assetA.png`); utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id); await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library'); await utils.waitForQueueFinish(admin.accessToken, 'library');
@ -593,7 +670,54 @@ describe('/libraries', () => {
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id }); const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(0); expect(assets.count).toBe(1);
utils.removeImageFile(`${testAssetDir}/temp/offline/online.png`);
});
it('should remove offline files from trash', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/offline`],
});
utils.createImageFile(`${testAssetDir}/temp/offline/online.png`);
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
libraryId: library.id,
});
expect(initialAssets.count).toBe(2);
utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
await scan(admin.accessToken, library.id);
await utils.waitForQueueFinish(admin.accessToken, 'library');
const { assets: offlineAssets } = await utils.metadataSearch(admin.accessToken, {
libraryId: library.id,
isOffline: true,
});
expect(offlineAssets.count).toBe(1);
const { status } = await request(app)
.post(`/libraries/${library.id}/removeOffline`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send();
expect(status).toBe(204);
await utils.waitForQueueFinish(admin.accessToken, 'library');
await utils.waitForQueueFinish(admin.accessToken, 'backgroundTask');
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(1);
expect(assets.items[0].isOffline).toBe(false);
expect(assets.items[0].originalPath).toEqual(`${testAssetDirInternal}/temp/offline/online.png`);
utils.removeImageFile(`${testAssetDir}/temp/offline/online.png`);
}); });
it('should not remove online files', async () => { it('should not remove online files', async () => {

View File

@ -92,14 +92,14 @@ describe(`/oauth`, () => {
it('should return a redirect uri', async () => { it('should return a redirect uri', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.post('/oauth/authorize') .post('/oauth/authorize')
.send({ redirectUri: 'http://127.0.0.1:2283/auth/login' }); .send({ redirectUri: 'http://127.0.0.1:2285/auth/login' });
expect(status).toBe(201); expect(status).toBe(201);
expect(body).toEqual({ url: expect.stringContaining(`${authServer.internal}/auth?`) }); expect(body).toEqual({ url: expect.stringContaining(`${authServer.internal}/auth?`) });
const params = new URL(body.url).searchParams; const params = new URL(body.url).searchParams;
expect(params.get('client_id')).toBe('client-default'); expect(params.get('client_id')).toBe('client-default');
expect(params.get('response_type')).toBe('code'); expect(params.get('response_type')).toBe('code');
expect(params.get('redirect_uri')).toBe('http://127.0.0.1:2283/auth/login'); expect(params.get('redirect_uri')).toBe('http://127.0.0.1:2285/auth/login');
expect(params.get('state')).toBeDefined(); expect(params.get('state')).toBeDefined();
}); });
}); });

View File

@ -0,0 +1,211 @@
import { AssetMediaResponseDto, LoginResponseDto, searchStacks } from '@immich/sdk';
import { createUserDto, uuidDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, describe, expect, it } from 'vitest';
describe('/stacks', () => {
let admin: LoginResponseDto;
let user1: LoginResponseDto;
let user2: LoginResponseDto;
let asset: AssetMediaResponseDto;
beforeAll(async () => {
await utils.resetDatabase();
admin = await utils.adminSetup();
[user1, user2] = await Promise.all([
utils.userSetup(admin.accessToken, createUserDto.user1),
utils.userSetup(admin.accessToken, createUserDto.user2),
]);
asset = await utils.createAsset(user1.accessToken);
});
describe('POST /stacks', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.post('/stacks')
.send({ assetIds: [asset.id] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require at least two assets', async () => {
const { status, body } = await request(app)
.post('/stacks')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset.id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
it('should require a valid id', async () => {
const { status, body } = await request(app)
.post('/stacks')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [uuidDto.invalid, uuidDto.invalid] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
it('should require access', async () => {
const user2Asset = await utils.createAsset(user2.accessToken);
const { status, body } = await request(app)
.post('/stacks')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset.id, user2Asset.id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should create a stack', async () => {
const [asset1, asset2] = await Promise.all([
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
]);
const { status, body } = await request(app)
.post('/stacks')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset1.id, asset2.id] });
expect(status).toBe(201);
expect(body).toEqual({
id: expect.any(String),
primaryAssetId: asset1.id,
assets: [expect.objectContaining({ id: asset1.id }), expect.objectContaining({ id: asset2.id })],
});
});
it('should merge an existing stack', async () => {
const [asset1, asset2, asset3] = await Promise.all([
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
]);
const response1 = await request(app)
.post('/stacks')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset1.id, asset2.id] });
expect(response1.status).toBe(201);
const stacksBefore = await searchStacks({}, { headers: asBearerAuth(user1.accessToken) });
const { status, body } = await request(app)
.post('/stacks')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset1.id, asset3.id] });
expect(status).toBe(201);
expect(body).toEqual({
id: expect.any(String),
primaryAssetId: asset1.id,
assets: expect.arrayContaining([
expect.objectContaining({ id: asset1.id }),
expect.objectContaining({ id: asset2.id }),
expect.objectContaining({ id: asset3.id }),
]),
});
const stacksAfter = await searchStacks({}, { headers: asBearerAuth(user1.accessToken) });
expect(stacksAfter.length).toBe(stacksBefore.length);
});
// it('should require a valid parent id', async () => {
// const { status, body } = await request(app)
// .put('/assets')
// .set('Authorization', `Bearer ${user1.accessToken}`)
// .send({ stackParentId: uuidDto.invalid, ids: [stackAssets[0].id] });
// expect(status).toBe(400);
// expect(body).toEqual(errorDto.badRequest(['stackParentId must be a UUID']));
// });
});
// it('should require access to the parent', async () => {
// const { status, body } = await request(app)
// .put('/assets')
// .set('Authorization', `Bearer ${user1.accessToken}`)
// .send({ stackParentId: stackAssets[3].id, ids: [user1Assets[0].id] });
// expect(status).toBe(400);
// expect(body).toEqual(errorDto.noPermission);
// });
// it('should add stack children', async () => {
// const { status } = await request(app)
// .put('/assets')
// .set('Authorization', `Bearer ${stackUser.accessToken}`)
// .send({ stackParentId: stackAssets[0].id, ids: [stackAssets[3].id] });
// expect(status).toBe(204);
// const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
// expect(asset.stack).not.toBeUndefined();
// expect(asset.stack).toEqual(expect.arrayContaining([expect.objectContaining({ id: stackAssets[3].id })]));
// });
// it('should remove stack children', async () => {
// const { status } = await request(app)
// .put('/assets')
// .set('Authorization', `Bearer ${stackUser.accessToken}`)
// .send({ removeParent: true, ids: [stackAssets[1].id] });
// expect(status).toBe(204);
// const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
// expect(asset.stack).not.toBeUndefined();
// expect(asset.stack).toEqual(
// expect.arrayContaining([
// expect.objectContaining({ id: stackAssets[2].id }),
// expect.objectContaining({ id: stackAssets[3].id }),
// ]),
// );
// });
// it('should remove all stack children', async () => {
// const { status } = await request(app)
// .put('/assets')
// .set('Authorization', `Bearer ${stackUser.accessToken}`)
// .send({ removeParent: true, ids: [stackAssets[2].id, stackAssets[3].id] });
// expect(status).toBe(204);
// const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
// expect(asset.stack).toBeUndefined();
// });
// it('should merge stack children', async () => {
// // create stack after previous test removed stack children
// await updateAssets(
// { assetBulkUpdateDto: { stackParentId: stackAssets[0].id, ids: [stackAssets[1].id, stackAssets[2].id] } },
// { headers: asBearerAuth(stackUser.accessToken) },
// );
// const { status } = await request(app)
// .put('/assets')
// .set('Authorization', `Bearer ${stackUser.accessToken}`)
// .send({ stackParentId: stackAssets[3].id, ids: [stackAssets[0].id] });
// expect(status).toBe(204);
// const asset = await getAssetInfo({ id: stackAssets[3].id }, { headers: asBearerAuth(stackUser.accessToken) });
// expect(asset.stack).not.toBeUndefined();
// expect(asset.stack).toEqual(
// expect.arrayContaining([
// expect.objectContaining({ id: stackAssets[0].id }),
// expect.objectContaining({ id: stackAssets[1].id }),
// expect.objectContaining({ id: stackAssets[2].id }),
// ]),
// );
// });
});

View File

@ -0,0 +1,603 @@
import {
AssetMediaResponseDto,
LoginResponseDto,
Permission,
TagCreateDto,
TagResponseDto,
createTag,
getAllTags,
tagAssets,
upsertTags,
} from '@immich/sdk';
import { createUserDto, uuidDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
const create = (accessToken: string, dto: TagCreateDto) =>
createTag({ tagCreateDto: dto }, { headers: asBearerAuth(accessToken) });
const upsert = (accessToken: string, tags: string[]) =>
upsertTags({ tagUpsertDto: { tags } }, { headers: asBearerAuth(accessToken) });
describe('/tags', () => {
let admin: LoginResponseDto;
let user: LoginResponseDto;
let userAsset: AssetMediaResponseDto;
beforeAll(async () => {
await utils.resetDatabase();
admin = await utils.adminSetup();
user = await utils.userSetup(admin.accessToken, createUserDto.user1);
userAsset = await utils.createAsset(user.accessToken);
});
beforeEach(async () => {
// tagging assets eventually triggers metadata extraction which can impact other tests
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
await utils.resetDatabase(['tags']);
});
describe('POST /tags', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/tags').send({ name: 'TagA' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization (api key)', async () => {
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app).post('/tags').set('x-api-key', secret).send({ name: 'TagA' });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.create'));
});
it('should work with tag.create', async () => {
const { secret } = await utils.createApiKey(user.accessToken, [Permission.TagCreate]);
const { status, body } = await request(app).post('/tags').set('x-api-key', secret).send({ name: 'TagA' });
expect(body).toEqual({
id: expect.any(String),
name: 'TagA',
value: 'TagA',
createdAt: expect.any(String),
updatedAt: expect.any(String),
});
expect(status).toBe(201);
});
it('should create a tag', async () => {
const { status, body } = await request(app)
.post('/tags')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ name: 'TagA' });
expect(body).toEqual({
id: expect.any(String),
name: 'TagA',
value: 'TagA',
createdAt: expect.any(String),
updatedAt: expect.any(String),
});
expect(status).toBe(201);
});
it('should allow multiple users to create tags with the same value', async () => {
await create(admin.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.post('/tags')
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ name: 'TagA' });
expect(body).toEqual({
id: expect.any(String),
name: 'TagA',
value: 'TagA',
createdAt: expect.any(String),
updatedAt: expect.any(String),
});
expect(status).toBe(201);
});
it('should create a nested tag', async () => {
const parent = await create(admin.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.post('/tags')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ name: 'TagB', parentId: parent.id });
expect(body).toEqual({
id: expect.any(String),
parentId: parent.id,
name: 'TagB',
value: 'TagA/TagB',
createdAt: expect.any(String),
updatedAt: expect.any(String),
});
expect(status).toBe(201);
});
});
describe('GET /tags', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/tags');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization (api key)', async () => {
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app).get('/tags').set('x-api-key', secret);
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.read'));
});
it('should start off empty', async () => {
const { status, body } = await request(app).get('/tags').set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([]);
expect(status).toEqual(200);
});
it('should return a list of tags', async () => {
const [tagA, tagB, tagC] = await Promise.all([
create(admin.accessToken, { name: 'TagA' }),
create(admin.accessToken, { name: 'TagB' }),
create(admin.accessToken, { name: 'TagC' }),
]);
const { status, body } = await request(app).get('/tags').set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toHaveLength(3);
expect(body).toEqual([tagA, tagB, tagC]);
expect(status).toEqual(200);
});
it('should return a nested tags', async () => {
await upsert(admin.accessToken, ['TagA/TagB/TagC', 'TagD']);
const { status, body } = await request(app).get('/tags').set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toHaveLength(4);
expect(status).toEqual(200);
const tags = body as TagResponseDto[];
const tagA = tags.find((tag) => tag.value === 'TagA') as TagResponseDto;
const tagB = tags.find((tag) => tag.value === 'TagA/TagB') as TagResponseDto;
const tagC = tags.find((tag) => tag.value === 'TagA/TagB/TagC') as TagResponseDto;
const tagD = tags.find((tag) => tag.value === 'TagD') as TagResponseDto;
expect(tagA).toEqual(expect.objectContaining({ name: 'TagA', value: 'TagA' }));
expect(tagB).toEqual(expect.objectContaining({ name: 'TagB', value: 'TagA/TagB', parentId: tagA.id }));
expect(tagC).toEqual(expect.objectContaining({ name: 'TagC', value: 'TagA/TagB/TagC', parentId: tagB.id }));
expect(tagD).toEqual(expect.objectContaining({ name: 'TagD', value: 'TagD' }));
});
});
describe('PUT /tags', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/tags`).send({ name: 'TagA/TagB' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization (api key)', async () => {
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app).put('/tags').set('x-api-key', secret).send({ name: 'TagA' });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.create'));
});
it('should upsert tags', async () => {
const { status, body } = await request(app)
.put(`/tags`)
.send({ tags: ['TagA/TagB/TagC/TagD'] })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual([expect.objectContaining({ name: 'TagD', value: 'TagA/TagB/TagC/TagD' })]);
});
it('should upsert tags in parallel without conflicts', async () => {
const [[tag1], [tag2], [tag3], [tag4]] = await Promise.all([
upsert(admin.accessToken, ['TagA/TagB/TagC/TagD']),
upsert(admin.accessToken, ['TagA/TagB/TagC/TagD']),
upsert(admin.accessToken, ['TagA/TagB/TagC/TagD']),
upsert(admin.accessToken, ['TagA/TagB/TagC/TagD']),
]);
const { id, parentId, createdAt } = tag1;
for (const tag of [tag1, tag2, tag3, tag4]) {
expect(tag).toMatchObject({
id,
parentId,
createdAt,
name: 'TagD',
value: 'TagA/TagB/TagC/TagD',
});
}
});
});
describe('PUT /tags/assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/tags/assets`).send({ tagIds: [], assetIds: [] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization (api key)', async () => {
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app)
.put('/tags/assets')
.set('x-api-key', secret)
.send({ assetIds: [], tagIds: [] });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.asset'));
});
it('should skip assets that are not owned by the user', async () => {
const [tagA, tagB, tagC, assetA, assetB] = await Promise.all([
create(user.accessToken, { name: 'TagA' }),
create(user.accessToken, { name: 'TagB' }),
create(user.accessToken, { name: 'TagC' }),
utils.createAsset(user.accessToken),
utils.createAsset(admin.accessToken),
]);
const { status, body } = await request(app)
.put(`/tags/assets`)
.send({ tagIds: [tagA.id, tagB.id, tagC.id], assetIds: [assetA.id, assetB.id] })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({ count: 3 });
});
it('should skip tags that are not owned by the user', async () => {
const [tagA, tagB, tagC, assetA, assetB] = await Promise.all([
create(user.accessToken, { name: 'TagA' }),
create(user.accessToken, { name: 'TagB' }),
create(admin.accessToken, { name: 'TagC' }),
utils.createAsset(user.accessToken),
utils.createAsset(user.accessToken),
]);
const { status, body } = await request(app)
.put(`/tags/assets`)
.send({ tagIds: [tagA.id, tagB.id, tagC.id], assetIds: [assetA.id, assetB.id] })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({ count: 4 });
});
it('should bulk tag assets', async () => {
const [tagA, tagB, tagC, assetA, assetB] = await Promise.all([
create(user.accessToken, { name: 'TagA' }),
create(user.accessToken, { name: 'TagB' }),
create(user.accessToken, { name: 'TagC' }),
utils.createAsset(user.accessToken),
utils.createAsset(user.accessToken),
]);
const { status, body } = await request(app)
.put(`/tags/assets`)
.send({ tagIds: [tagA.id, tagB.id, tagC.id], assetIds: [assetA.id, assetB.id] })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({ count: 6 });
});
});
describe('GET /tags/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/tags/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.get(`/tags/${tag.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should require authorization (api key)', async () => {
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app)
.get(`/tags/${uuidDto.notFound}`)
.set('x-api-key', secret)
.send({ assetIds: [], tagIds: [] });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.read'));
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.get(`/tags/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should get tag details', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.get(`/tags/${tag.id}`)
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({
id: expect.any(String),
name: 'TagA',
value: 'TagA',
createdAt: expect.any(String),
updatedAt: expect.any(String),
});
});
it('should get nested tag details', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
const tagB = await create(user.accessToken, { name: 'TagB', parentId: tagA.id });
const tagC = await create(user.accessToken, { name: 'TagC', parentId: tagB.id });
const tagD = await create(user.accessToken, { name: 'TagD', parentId: tagC.id });
const { status, body } = await request(app)
.get(`/tags/${tagD.id}`)
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({
id: expect.any(String),
parentId: tagC.id,
name: 'TagD',
value: 'TagA/TagB/TagC/TagD',
createdAt: expect.any(String),
updatedAt: expect.any(String),
});
});
});
describe('PUT /tags/:id', () => {
it('should require authentication', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app).put(`/tags/${tag.id}`).send({ color: '#000000' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const tag = await create(admin.accessToken, { name: 'tagA' });
const { status, body } = await request(app)
.put(`/tags/${tag.id}`)
.send({ color: '#000000' })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should require authorization (api key)', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app)
.put(`/tags/${tag.id}`)
.set('x-api-key', secret)
.send({ color: '#000000' });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.update'));
});
it('should update a tag', async () => {
const tag = await create(user.accessToken, { name: 'tagA' });
const { status, body } = await request(app)
.put(`/tags/${tag.id}`)
.send({ color: '#000000' })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual(expect.objectContaining({ color: `#000000` }));
});
it('should update a tag color without a # prefix', async () => {
const tag = await create(user.accessToken, { name: 'tagA' });
const { status, body } = await request(app)
.put(`/tags/${tag.id}`)
.send({ color: '000000' })
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual(expect.objectContaining({ color: `#000000` }));
});
});
describe('DELETE /tags/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/tags/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.delete(`/tags/${tag.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should require authorization (api key)', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app).delete(`/tags/${tag.id}`).set('x-api-key', secret);
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.delete'));
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.delete(`/tags/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should delete a tag', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { status } = await request(app)
.delete(`/tags/${tag.id}`)
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(204);
});
it('should delete a nested tag (root)', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
await create(user.accessToken, { name: 'TagB', parentId: tagA.id });
const { status } = await request(app)
.delete(`/tags/${tagA.id}`)
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(204);
const tags = await getAllTags({ headers: asBearerAuth(user.accessToken) });
expect(tags.length).toBe(0);
});
it('should delete a nested tag (leaf)', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
const tagB = await create(user.accessToken, { name: 'TagB', parentId: tagA.id });
const { status } = await request(app)
.delete(`/tags/${tagB.id}`)
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(204);
const tags = await getAllTags({ headers: asBearerAuth(user.accessToken) });
expect(tags.length).toBe(1);
expect(tags[0]).toEqual(tagA);
});
});
describe('PUT /tags/:id/assets', () => {
it('should require authentication', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.put(`/tags/${tagA.id}/assets`)
.send({ ids: [userAsset.id] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.put(`/tags/${tag.id}/assets`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ids: [userAsset.id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should require authorization (api key)', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app)
.put(`/tags/${tag.id}/assets`)
.set('x-api-key', secret)
.send({ ids: [userAsset.id] });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.asset'));
});
it('should be able to tag own asset', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.put(`/tags/${tagA.id}/assets`)
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ ids: [userAsset.id] });
expect(status).toBe(200);
expect(body).toEqual([expect.objectContaining({ id: userAsset.id, success: true })]);
});
it("should not be able to add assets to another user's tag", async () => {
const tagA = await create(admin.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.put(`/tags/${tagA.id}/assets`)
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ ids: [userAsset.id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Not found or no tag.asset access'));
});
it('should add duplicate assets only once', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.put(`/tags/${tagA.id}/assets`)
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ ids: [userAsset.id, userAsset.id] });
expect(status).toBe(200);
expect(body).toEqual([
expect.objectContaining({ id: userAsset.id, success: true }),
expect.objectContaining({ id: userAsset.id, success: false, error: 'duplicate' }),
]);
});
});
describe('DELETE /tags/:id/assets', () => {
it('should require authentication', async () => {
const tagA = await create(admin.accessToken, { name: 'TagA' });
const { status, body } = await request(app)
.delete(`/tags/${tagA}/assets`)
.send({ ids: [userAsset.id] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
await tagAssets(
{ id: tagA.id, bulkIdsDto: { ids: [userAsset.id] } },
{ headers: asBearerAuth(user.accessToken) },
);
const { status, body } = await request(app)
.delete(`/tags/${tagA.id}/assets`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ids: [userAsset.id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should require authorization (api key)', async () => {
const tag = await create(user.accessToken, { name: 'TagA' });
const { secret } = await utils.createApiKey(user.accessToken, [Permission.AssetRead]);
const { status, body } = await request(app)
.delete(`/tags/${tag.id}/assets`)
.set('x-api-key', secret)
.send({ ids: [userAsset.id] });
expect(status).toBe(403);
expect(body).toEqual(errorDto.missingPermission('tag.asset'));
});
it('should be able to remove own asset from own tag', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
await tagAssets(
{ id: tagA.id, bulkIdsDto: { ids: [userAsset.id] } },
{ headers: asBearerAuth(user.accessToken) },
);
const { status, body } = await request(app)
.delete(`/tags/${tagA.id}/assets`)
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ ids: [userAsset.id] });
expect(status).toBe(200);
expect(body).toEqual([expect.objectContaining({ id: userAsset.id, success: true })]);
});
it('should remove duplicate assets only once', async () => {
const tagA = await create(user.accessToken, { name: 'TagA' });
await tagAssets(
{ id: tagA.id, bulkIdsDto: { ids: [userAsset.id] } },
{ headers: asBearerAuth(user.accessToken) },
);
const { status, body } = await request(app)
.delete(`/tags/${tagA.id}/assets`)
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ ids: [userAsset.id, userAsset.id] });
expect(status).toBe(200);
expect(body).toEqual([
expect.objectContaining({ id: userAsset.id, success: true }),
expect.objectContaining({ id: userAsset.id, success: false, error: 'not_found' }),
]);
});
});
});

View File

@ -1,11 +1,11 @@
import { import {
LoginResponseDto, LoginResponseDto,
createStack,
deleteUserAdmin, deleteUserAdmin,
getMyUser, getMyUser,
getUserAdmin, getUserAdmin,
getUserPreferencesAdmin, getUserPreferencesAdmin,
login, login,
updateAssets,
} from '@immich/sdk'; } from '@immich/sdk';
import { Socket } from 'socket.io-client'; import { Socket } from 'socket.io-client';
import { createUserDto, uuidDto } from 'src/fixtures'; import { createUserDto, uuidDto } from 'src/fixtures';
@ -321,8 +321,8 @@ describe('/admin/users', () => {
utils.createAsset(user.accessToken), utils.createAsset(user.accessToken),
]); ]);
await updateAssets( await createStack(
{ assetBulkUpdateDto: { stackParentId: asset1.id, ids: [asset2.id] } }, { stackCreateDto: { assetIds: [asset1.id, asset2.id] } },
{ headers: asBearerAuth(user.accessToken) }, { headers: asBearerAuth(user.accessToken) },
); );

View File

@ -33,7 +33,7 @@ describe(`immich login`, () => {
const key = await utils.createApiKey(admin.accessToken, [Permission.All]); const key = await utils.createApiKey(admin.accessToken, [Permission.All]);
const { stdout, stderr, exitCode } = await immichCli(['login', app, `${key.secret}`]); const { stdout, stderr, exitCode } = await immichCli(['login', app, `${key.secret}`]);
expect(stdout.split('\n')).toEqual([ expect(stdout.split('\n')).toEqual([
'Logging in to http://127.0.0.1:2283/api', 'Logging in to http://127.0.0.1:2285/api',
'Logged in as admin@immich.cloud', 'Logged in as admin@immich.cloud',
'Wrote auth info to /tmp/immich/auth.yml', 'Wrote auth info to /tmp/immich/auth.yml',
]); ]);
@ -50,8 +50,8 @@ describe(`immich login`, () => {
const key = await utils.createApiKey(admin.accessToken, [Permission.All]); const key = await utils.createApiKey(admin.accessToken, [Permission.All]);
const { stdout, stderr, exitCode } = await immichCli(['login', app.replaceAll('/api', ''), `${key.secret}`]); const { stdout, stderr, exitCode } = await immichCli(['login', app.replaceAll('/api', ''), `${key.secret}`]);
expect(stdout.split('\n')).toEqual([ expect(stdout.split('\n')).toEqual([
'Logging in to http://127.0.0.1:2283', 'Logging in to http://127.0.0.1:2285',
'Discovered API at http://127.0.0.1:2283/api', 'Discovered API at http://127.0.0.1:2285/api',
'Logged in as admin@immich.cloud', 'Logged in as admin@immich.cloud',
'Wrote auth info to /tmp/immich/auth.yml', 'Wrote auth info to /tmp/immich/auth.yml',
]); ]);

View File

@ -12,7 +12,7 @@ describe(`immich server-info`, () => {
const { stderr, stdout, exitCode } = await immichCli(['server-info']); const { stderr, stdout, exitCode } = await immichCli(['server-info']);
expect(stdout.split('\n')).toEqual([ expect(stdout.split('\n')).toEqual([
expect.stringContaining('Server Info (via admin@immich.cloud'), expect.stringContaining('Server Info (via admin@immich.cloud'),
' Url: http://127.0.0.1:2283/api', ' Url: http://127.0.0.1:2285/api',
expect.stringContaining('Version:'), expect.stringContaining('Version:'),
' Formats:', ' Formats:',
expect.stringContaining('Images:'), expect.stringContaining('Images:'),

View File

@ -86,14 +86,14 @@ const setup = async () => {
{ {
client_id: OAuthClient.DEFAULT, client_id: OAuthClient.DEFAULT,
client_secret: OAuthClient.DEFAULT, client_secret: OAuthClient.DEFAULT,
redirect_uris: ['http://127.0.0.1:2283/auth/login'], redirect_uris: ['http://127.0.0.1:2285/auth/login'],
grant_types: ['authorization_code'], grant_types: ['authorization_code'],
response_types: ['code'], response_types: ['code'],
}, },
{ {
client_id: OAuthClient.RS256_TOKENS, client_id: OAuthClient.RS256_TOKENS,
client_secret: OAuthClient.RS256_TOKENS, client_secret: OAuthClient.RS256_TOKENS,
redirect_uris: ['http://127.0.0.1:2283/auth/login'], redirect_uris: ['http://127.0.0.1:2285/auth/login'],
grant_types: ['authorization_code'], grant_types: ['authorization_code'],
id_token_signed_response_alg: 'RS256', id_token_signed_response_alg: 'RS256',
jwks: { keys: [await exportJWK(publicKey)] }, jwks: { keys: [await exportJWK(publicKey)] },
@ -101,7 +101,7 @@ const setup = async () => {
{ {
client_id: OAuthClient.RS256_PROFILE, client_id: OAuthClient.RS256_PROFILE,
client_secret: OAuthClient.RS256_PROFILE, client_secret: OAuthClient.RS256_PROFILE,
redirect_uris: ['http://127.0.0.1:2283/auth/login'], redirect_uris: ['http://127.0.0.1:2285/auth/login'],
grant_types: ['authorization_code'], grant_types: ['authorization_code'],
userinfo_signed_response_alg: 'RS256', userinfo_signed_response_alg: 'RS256',
jwks: { keys: [await exportJWK(publicKey)] }, jwks: { keys: [await exportJWK(publicKey)] },

View File

@ -53,8 +53,8 @@ type WaitOptions = { event: EventType; id?: string; total?: number; timeout?: nu
type AdminSetupOptions = { onboarding?: boolean }; type AdminSetupOptions = { onboarding?: boolean };
type FileData = { bytes?: Buffer; filename: string }; type FileData = { bytes?: Buffer; filename: string };
const dbUrl = 'postgres://postgres:postgres@127.0.0.1:5433/immich'; const dbUrl = 'postgres://postgres:postgres@127.0.0.1:5435/immich';
export const baseUrl = 'http://127.0.0.1:2283'; export const baseUrl = 'http://127.0.0.1:2285';
export const shareUrl = `${baseUrl}/share`; export const shareUrl = `${baseUrl}/share`;
export const app = `${baseUrl}/api`; export const app = `${baseUrl}/api`;
// TODO move test assets into e2e/assets // TODO move test assets into e2e/assets
@ -148,6 +148,7 @@ export const utils = {
'sessions', 'sessions',
'users', 'users',
'system_metadata', 'system_metadata',
'tags',
]; ];
const sql: string[] = []; const sql: string[] = [];

View File

@ -0,0 +1,25 @@
import { LoginResponseDto } from '@immich/sdk';
import { test } from '@playwright/test';
import { utils } from 'src/utils';
test.describe('Album', () => {
let admin: LoginResponseDto;
test.beforeAll(async () => {
utils.initSdk();
await utils.resetDatabase();
admin = await utils.adminSetup();
});
test(`doesn't delete album after canceling add assets`, async ({ context, page }) => {
await utils.setAuthCookies(context, admin.accessToken);
await page.goto('/albums');
await page.getByRole('button', { name: 'Create album' }).click();
await page.getByRole('button', { name: 'Select photos' }).click();
await page.getByRole('button', { name: 'Close' }).click();
await page.reload();
await page.getByRole('button', { name: 'Select photos' }).waitFor();
});
});

View File

@ -33,7 +33,7 @@ test.describe('Photo Viewer', () => {
await page.waitForLoadState('load'); await page.waitForLoadState('load');
// this is the spinner // this is the spinner
await page.waitForSelector('svg[role=status]'); await page.waitForSelector('svg[role=status]');
await expect(page.getByRole('status')).toBeVisible(); await expect(page.getByTestId('loading-spinner')).toBeVisible();
}); });
test('loads high resolution photo when zoomed', async ({ page }) => { test('loads high resolution photo when zoomed', async ({ page }) => {

View File

@ -44,7 +44,7 @@ test.describe('Shared Links', () => {
test('download from a shared link', async ({ page }) => { test('download from a shared link', async ({ page }) => {
await page.goto(`/share/${sharedLink.key}`); await page.goto(`/share/${sharedLink.key}`);
await page.getByRole('heading', { name: 'Test Album' }).waitFor(); await page.getByRole('heading', { name: 'Test Album' }).waitFor();
await page.locator('.group > div').first().hover(); await page.locator('.group').first().hover();
await page.waitForSelector('#asset-group-by-date svg'); await page.waitForSelector('#asset-group-by-date svg');
await page.getByRole('checkbox').click(); await page.getByRole('checkbox').click();
await page.getByRole('button', { name: 'Download' }).click(); await page.getByRole('button', { name: 'Download' }).click();

View File

@ -13,13 +13,13 @@ test.describe('Websocket', () => {
test('connects using ipv4', async ({ page, context }) => { test('connects using ipv4', async ({ page, context }) => {
await utils.setAuthCookies(context, admin.accessToken); await utils.setAuthCookies(context, admin.accessToken);
await page.goto('http://127.0.0.1:2283/'); await page.goto('http://127.0.0.1:2285/');
await expect(page.locator('#sidebar')).toContainText('Server Online'); await expect(page.locator('#sidebar')).toContainText('Server Online');
}); });
test('connects using ipv6', async ({ page, context }) => { test('connects using ipv6', async ({ page, context }) => {
await utils.setAuthCookies(context, admin.accessToken, '[::1]'); await utils.setAuthCookies(context, admin.accessToken, '[::1]');
await page.goto('http://[::1]:2283/'); await page.goto('http://[::1]:2285/');
await expect(page.locator('#sidebar')).toContainText('Server Online'); await expect(page.locator('#sidebar')).toContainText('Server Online');
}); });
}); });

View File

@ -3,7 +3,7 @@ import { defineConfig } from 'vitest/config';
// skip `docker compose up` if `make e2e` was already run // skip `docker compose up` if `make e2e` was already run
const globalSetup: string[] = ['src/setup/auth-server.ts']; const globalSetup: string[] = ['src/setup/auth-server.ts'];
try { try {
await fetch('http://127.0.0.1:2283/api/server-info/ping'); await fetch('http://127.0.0.1:2285/api/server-info/ping');
} catch { } catch {
globalSetup.push('src/setup/docker-compose.ts'); globalSetup.push('src/setup/docker-compose.ts');
} }

View File

@ -1,6 +1,6 @@
ARG DEVICE=cpu ARG DEVICE=cpu
FROM python:3.11-bookworm@sha256:add76c758e402c3acf53b8251da50d8ae67989a81ca96ff4331e296773df853d AS builder-cpu FROM python:3.11-bookworm@sha256:f7543d9969bdc112dd9819ca642e14433fdacfe857f170f6b803392fc7e451ad AS builder-cpu
FROM builder-cpu AS builder-openvino FROM builder-cpu AS builder-openvino
@ -34,7 +34,7 @@ RUN python3 -m venv /opt/venv
COPY poetry.lock pyproject.toml ./ COPY poetry.lock pyproject.toml ./
RUN poetry install --sync --no-interaction --no-ansi --no-root --with ${DEVICE} --without dev RUN poetry install --sync --no-interaction --no-ansi --no-root --with ${DEVICE} --without dev
FROM python:3.11-slim-bookworm@sha256:1c0c54195c7c7b46e61a2f3b906e9b55a8165f20388a0eeb4af4c6f8579988ac AS prod-cpu FROM python:3.11-slim-bookworm@sha256:ad5dadd957a398226996bc4846e522c39f2a77340b531b28aaab85b2d361210b AS prod-cpu
FROM prod-cpu AS prod-openvino FROM prod-cpu AS prod-openvino

View File

@ -10,6 +10,7 @@ from tokenizers import Encoding, Tokenizer
from app.config import log from app.config import log
from app.models.base import InferenceModel from app.models.base import InferenceModel
from app.models.transforms import clean_text
from app.schemas import ModelSession, ModelTask, ModelType from app.schemas import ModelSession, ModelTask, ModelType
@ -25,6 +26,8 @@ class BaseCLIPTextualEncoder(InferenceModel):
session = super()._load() session = super()._load()
log.debug(f"Loading tokenizer for CLIP model '{self.model_name}'") log.debug(f"Loading tokenizer for CLIP model '{self.model_name}'")
self.tokenizer = self._load_tokenizer() self.tokenizer = self._load_tokenizer()
tokenizer_kwargs: dict[str, Any] | None = self.text_cfg.get("tokenizer_kwargs")
self.canonicalize = tokenizer_kwargs is not None and tokenizer_kwargs.get("clean") == "canonicalize"
log.debug(f"Loaded tokenizer for CLIP model '{self.model_name}'") log.debug(f"Loaded tokenizer for CLIP model '{self.model_name}'")
return session return session
@ -56,6 +59,11 @@ class BaseCLIPTextualEncoder(InferenceModel):
log.debug(f"Loaded model config for CLIP model '{self.model_name}'") log.debug(f"Loaded model config for CLIP model '{self.model_name}'")
return model_cfg return model_cfg
@property
def text_cfg(self) -> dict[str, Any]:
text_cfg: dict[str, Any] = self.model_cfg["text_cfg"]
return text_cfg
@cached_property @cached_property
def tokenizer_file(self) -> dict[str, Any]: def tokenizer_file(self) -> dict[str, Any]:
log.debug(f"Loading tokenizer file for CLIP model '{self.model_name}'") log.debug(f"Loading tokenizer file for CLIP model '{self.model_name}'")
@ -73,8 +81,7 @@ class BaseCLIPTextualEncoder(InferenceModel):
class OpenClipTextualEncoder(BaseCLIPTextualEncoder): class OpenClipTextualEncoder(BaseCLIPTextualEncoder):
def _load_tokenizer(self) -> Tokenizer: def _load_tokenizer(self) -> Tokenizer:
text_cfg: dict[str, Any] = self.model_cfg["text_cfg"] context_length: int = self.text_cfg.get("context_length", 77)
context_length: int = text_cfg.get("context_length", 77)
pad_token: str = self.tokenizer_cfg["pad_token"] pad_token: str = self.tokenizer_cfg["pad_token"]
tokenizer: Tokenizer = Tokenizer.from_file(self.tokenizer_file_path.as_posix()) tokenizer: Tokenizer = Tokenizer.from_file(self.tokenizer_file_path.as_posix())
@ -86,12 +93,14 @@ class OpenClipTextualEncoder(BaseCLIPTextualEncoder):
return tokenizer return tokenizer
def tokenize(self, text: str) -> dict[str, NDArray[np.int32]]: def tokenize(self, text: str) -> dict[str, NDArray[np.int32]]:
text = clean_text(text, canonicalize=self.canonicalize)
tokens: Encoding = self.tokenizer.encode(text) tokens: Encoding = self.tokenizer.encode(text)
return {"text": np.array([tokens.ids], dtype=np.int32)} return {"text": np.array([tokens.ids], dtype=np.int32)}
class MClipTextualEncoder(OpenClipTextualEncoder): class MClipTextualEncoder(OpenClipTextualEncoder):
def tokenize(self, text: str) -> dict[str, NDArray[np.int32]]: def tokenize(self, text: str) -> dict[str, NDArray[np.int32]]:
text = clean_text(text, canonicalize=self.canonicalize)
tokens: Encoding = self.tokenizer.encode(text) tokens: Encoding = self.tokenizer.encode(text)
return { return {
"input_ids": np.array([tokens.ids], dtype=np.int32), "input_ids": np.array([tokens.ids], dtype=np.int32),

View File

@ -1,3 +1,4 @@
import string
from io import BytesIO from io import BytesIO
from typing import IO from typing import IO
@ -7,6 +8,7 @@ from numpy.typing import NDArray
from PIL import Image from PIL import Image
_PIL_RESAMPLING_METHODS = {resampling.name.lower(): resampling for resampling in Image.Resampling} _PIL_RESAMPLING_METHODS = {resampling.name.lower(): resampling for resampling in Image.Resampling}
_PUNCTUATION_TRANS = str.maketrans("", "", string.punctuation)
def resize_pil(img: Image.Image, size: int) -> Image.Image: def resize_pil(img: Image.Image, size: int) -> Image.Image:
@ -60,3 +62,10 @@ def decode_cv2(image_bytes: NDArray[np.uint8] | bytes | Image.Image) -> NDArray[
if isinstance(image_bytes, Image.Image): if isinstance(image_bytes, Image.Image):
return pil_to_cv2(image_bytes) return pil_to_cv2(image_bytes)
return image_bytes return image_bytes
def clean_text(text: str, canonicalize: bool = False) -> str:
text = " ".join(text.split())
if canonicalize:
text = text.translate(_PUNCTUATION_TRANS).lower()
return text

View File

@ -379,13 +379,40 @@ class TestCLIP:
clip_encoder = OpenClipTextualEncoder("ViT-B-32__openai", cache_dir="test_cache") clip_encoder = OpenClipTextualEncoder("ViT-B-32__openai", cache_dir="test_cache")
clip_encoder._load() clip_encoder._load()
tokens = clip_encoder.tokenize("test search query") tokens = clip_encoder.tokenize("test search query")
assert "text" in tokens assert "text" in tokens
assert isinstance(tokens["text"], np.ndarray) assert isinstance(tokens["text"], np.ndarray)
assert tokens["text"].shape == (1, 77) assert tokens["text"].shape == (1, 77)
assert tokens["text"].dtype == np.int32 assert tokens["text"].dtype == np.int32
assert np.allclose(tokens["text"], np.array([mock_ids], dtype=np.int32), atol=0) assert np.allclose(tokens["text"], np.array([mock_ids], dtype=np.int32), atol=0)
mock_tokenizer.encode.assert_called_once_with("test search query")
def test_openclip_tokenizer_canonicalizes_text(
self,
mocker: MockerFixture,
clip_model_cfg: dict[str, Any],
clip_tokenizer_cfg: Callable[[Path], dict[str, Any]],
) -> None:
clip_model_cfg["text_cfg"]["tokenizer_kwargs"] = {"clean": "canonicalize"}
mocker.patch.object(OpenClipTextualEncoder, "download")
mocker.patch.object(OpenClipTextualEncoder, "model_cfg", clip_model_cfg)
mocker.patch.object(OpenClipTextualEncoder, "tokenizer_cfg", clip_tokenizer_cfg)
mocker.patch.object(InferenceModel, "_make_session", autospec=True).return_value
mock_tokenizer = mocker.patch("app.models.clip.textual.Tokenizer.from_file", autospec=True).return_value
mock_ids = [randint(0, 50000) for _ in range(77)]
mock_tokenizer.encode.return_value = SimpleNamespace(ids=mock_ids)
clip_encoder = OpenClipTextualEncoder("ViT-B-32__openai", cache_dir="test_cache")
clip_encoder._load()
tokens = clip_encoder.tokenize("Test Search Query!")
assert "text" in tokens
assert isinstance(tokens["text"], np.ndarray)
assert tokens["text"].shape == (1, 77)
assert tokens["text"].dtype == np.int32
assert np.allclose(tokens["text"], np.array([mock_ids], dtype=np.int32), atol=0)
mock_tokenizer.encode.assert_called_once_with("test search query")
def test_mclip_tokenizer( def test_mclip_tokenizer(
self, self,

View File

@ -1,4 +1,4 @@
FROM mambaorg/micromamba:bookworm-slim@sha256:e37ec9f3f7dea01ef9958d3d924d46077911f7e29c4faed40cd6b37a9ac239fc AS builder FROM mambaorg/micromamba:bookworm-slim@sha256:475730daef12ff9c0733e70092aeeefdf4c373a584c952dac3f7bdb739601990 AS builder
ENV TRANSFORMERS_CACHE=/cache \ ENV TRANSFORMERS_CACHE=/cache \
PYTHONDONTWRITEBYTECODE=1 \ PYTHONDONTWRITEBYTECODE=1 \

View File

@ -680,18 +680,18 @@ test = ["pytest (>=6)"]
[[package]] [[package]]
name = "fastapi-slim" name = "fastapi-slim"
version = "0.112.0" version = "0.112.1"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "fastapi_slim-0.112.0-py3-none-any.whl", hash = "sha256:7663edfbb5036d641aa45b4f5dad341cf78d98885216e78743a8cdd39a38883e"}, {file = "fastapi_slim-0.112.1-py3-none-any.whl", hash = "sha256:cc227cf9402d0ba54a24f80eb205c33bcb25d3ea18d53fdac3fd76ea5af8e76d"},
{file = "fastapi_slim-0.112.0.tar.gz", hash = "sha256:2420f700b7dc2d1a6d02c7230f7aa2ae9fa0320d8d481094062ff717659c0843"}, {file = "fastapi_slim-0.112.1.tar.gz", hash = "sha256:876ebd24e72273986709db2d469b75dc18f04c3ab9140ffd78b29d7785d26687"},
] ]
[package.dependencies] [package.dependencies]
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
starlette = ">=0.37.2,<0.38.0" starlette = ">=0.37.2,<0.39.0"
typing-extensions = ">=4.8.0" typing-extensions = ">=4.8.0"
[package.extras] [package.extras]
@ -1111,13 +1111,13 @@ test = ["objgraph", "psutil"]
[[package]] [[package]]
name = "gunicorn" name = "gunicorn"
version = "22.0.0" version = "23.0.0"
description = "WSGI HTTP Server for UNIX" description = "WSGI HTTP Server for UNIX"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "gunicorn-22.0.0-py3-none-any.whl", hash = "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9"}, {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"},
{file = "gunicorn-22.0.0.tar.gz", hash = "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"},
] ]
[package.dependencies] [package.dependencies]
@ -1236,13 +1236,13 @@ socks = ["socksio (==1.*)"]
[[package]] [[package]]
name = "huggingface-hub" name = "huggingface-hub"
version = "0.24.5" version = "0.24.6"
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
optional = false optional = false
python-versions = ">=3.8.0" python-versions = ">=3.8.0"
files = [ files = [
{file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"},
{file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"},
] ]
[package.dependencies] [package.dependencies]
@ -1530,13 +1530,13 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"]
[[package]] [[package]]
name = "locust" name = "locust"
version = "2.31.2" version = "2.31.3"
description = "Developer-friendly load testing framework" description = "Developer-friendly load testing framework"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "locust-2.31.2-py3-none-any.whl", hash = "sha256:9bcb8b777d9844ac9498d6eebe17a0afa21712419c42da27b1d1cac5895cd182"}, {file = "locust-2.31.3-py3-none-any.whl", hash = "sha256:03122e007519b371a5a553d578af502826755de83551d79ea8a412ea1c660115"},
{file = "locust-2.31.2.tar.gz", hash = "sha256:a31f8e1d24535494eb809bd8dfd545ada9514df4581b69bdc2ecf3e109b7a1dd"}, {file = "locust-2.31.3.tar.gz", hash = "sha256:25f4603f24afa11ef1ee1f26b1c86a232eb9a1140be30b2a4642c12d7a7af8ae"},
] ]
[package.dependencies] [package.dependencies]
@ -1962,42 +1962,42 @@ reference = ["Pillow", "google-re2"]
[[package]] [[package]]
name = "onnxruntime" name = "onnxruntime"
version = "1.18.1" version = "1.19.0"
description = "ONNX Runtime is a runtime accelerator for Machine Learning models" description = "ONNX Runtime is a runtime accelerator for Machine Learning models"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "onnxruntime-1.18.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ef7683312393d4ba04252f1b287d964bd67d5e6048b94d2da3643986c74d80"}, {file = "onnxruntime-1.19.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:6ce22a98dfec7b646ae305f52d0ce14a189a758b02ea501860ca719f4b0ae04b"},
{file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc706eb1df06ddf55776e15a30519fb15dda7697f987a2bbda4962845e3cec05"}, {file = "onnxruntime-1.19.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19019c72873f26927aa322c54cf2bf7312b23451b27451f39b88f57016c94f8b"},
{file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7de69f5ced2a263531923fa68bbec52a56e793b802fcd81a03487b5e292bc3a"}, {file = "onnxruntime-1.19.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8eaa16df99171dc636e30108d15597aed8c4c2dd9dbfdd07cc464d57d73fb275"},
{file = "onnxruntime-1.18.1-cp310-cp310-win32.whl", hash = "sha256:221e5b16173926e6c7de2cd437764492aa12b6811f45abd37024e7cf2ae5d7e3"}, {file = "onnxruntime-1.19.0-cp310-cp310-win32.whl", hash = "sha256:0eb0f8dbe596fd0f4737fe511fdbb17603853a7d204c5b2ca38d3c7808fc556b"},
{file = "onnxruntime-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:75211b619275199c861ee94d317243b8a0fcde6032e5a80e1aa9ded8ab4c6060"}, {file = "onnxruntime-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:616092d54ba8023b7bc0a5f6d900a07a37cc1cfcc631873c15f8c1d6e9e184d4"},
{file = "onnxruntime-1.18.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f26582882f2dc581b809cfa41a125ba71ad9e715738ec6402418df356969774a"}, {file = "onnxruntime-1.19.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a2b53b3c287cd933e5eb597273926e899082d8c84ab96e1b34035764a1627e17"},
{file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef36f3a8b768506d02be349ac303fd95d92813ba3ba70304d40c3cd5c25d6a4c"}, {file = "onnxruntime-1.19.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e94984663963e74fbb468bde9ec6f19dcf890b594b35e249c4dc8789d08993c5"},
{file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170e711393e0618efa8ed27b59b9de0ee2383bd2a1f93622a97006a5ad48e434"}, {file = "onnxruntime-1.19.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f379d1f050cfb55ce015d53727b78ee362febc065c38eed81512b22b757da73"},
{file = "onnxruntime-1.18.1-cp311-cp311-win32.whl", hash = "sha256:9b6a33419b6949ea34e0dc009bc4470e550155b6da644571ecace4b198b0d88f"}, {file = "onnxruntime-1.19.0-cp311-cp311-win32.whl", hash = "sha256:4ccb48faea02503275ae7e79e351434fc43c294c4cb5c4d8bcb7479061396614"},
{file = "onnxruntime-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c1380a9f1b7788da742c759b6a02ba771fe1ce620519b2b07309decbd1a2fe1"}, {file = "onnxruntime-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:9cdc8d311289a84e77722de68bd22b8adfb94eea26f4be6f9e017350faac8b18"},
{file = "onnxruntime-1.18.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31bd57a55e3f983b598675dfc7e5d6f0877b70ec9864b3cc3c3e1923d0a01919"}, {file = "onnxruntime-1.19.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:1b59eaec1be9a8613c5fdeaafe67f73a062edce3ac03bbbdc9e2d98b58a30617"},
{file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9e03c4ba9f734500691a4d7d5b381cd71ee2f3ce80a1154ac8f7aed99d1ecaa"}, {file = "onnxruntime-1.19.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be4144d014a4b25184e63ce7a463a2e7796e2f3df931fccc6a6aefa6f1365dc5"},
{file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:781aa9873640f5df24524f96f6070b8c550c66cb6af35710fd9f92a20b4bfbf6"}, {file = "onnxruntime-1.19.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10d7e7d4ca7021ce7f29a66dbc6071addf2de5839135339bd855c6d9c2bba371"},
{file = "onnxruntime-1.18.1-cp312-cp312-win32.whl", hash = "sha256:3a2d9ab6254ca62adbb448222e630dc6883210f718065063518c8f93a32432be"}, {file = "onnxruntime-1.19.0-cp312-cp312-win32.whl", hash = "sha256:87f2c58b577a1fb31dc5d92b647ecc588fd5f1ea0c3ad4526f5f80a113357c8d"},
{file = "onnxruntime-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ad93c560b1c38c27c0275ffd15cd7f45b3ad3fc96653c09ce2931179982ff204"}, {file = "onnxruntime-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:8a1f50d49676d7b69566536ff039d9e4e95fc482a55673719f46528218ecbb94"},
{file = "onnxruntime-1.18.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3b55dc9d3c67626388958a3eb7ad87eb7c70f75cb0f7ff4908d27b8b42f2475c"}, {file = "onnxruntime-1.19.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:71423c8c4b2d7a58956271534302ec72721c62a41efd0c4896343249b8399ab0"},
{file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f80dbcfb6763cc0177a31168b29b4bd7662545b99a19e211de8c734b657e0669"}, {file = "onnxruntime-1.19.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d63630d45e9498f96e75bbeb7fd4a56acb10155de0de4d0e18d1b6cbb0b358a"},
{file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1ff2c61a16d6c8631796c54139bafea41ee7736077a0fc64ee8ae59432f5c58"}, {file = "onnxruntime-1.19.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3bfd15db1e8794d379a86c1a9116889f47f2cca40cc82208fc4f7e8c38e8522"},
{file = "onnxruntime-1.18.1-cp38-cp38-win32.whl", hash = "sha256:219855bd272fe0c667b850bf1a1a5a02499269a70d59c48e6f27f9c8bcb25d02"}, {file = "onnxruntime-1.19.0-cp38-cp38-win32.whl", hash = "sha256:3b098003b6b4cb37cc84942e5f1fe27f945dd857cbd2829c824c26b0ba4a247e"},
{file = "onnxruntime-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdf16aa607eb9a2c60d5ca2d5abf9f448e90c345b6b94c3ed14f4fb7e6a2d07"}, {file = "onnxruntime-1.19.0-cp38-cp38-win_amd64.whl", hash = "sha256:cea067a6541d6787d903ee6843401c5b1332a266585160d9700f9f0939443886"},
{file = "onnxruntime-1.18.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:128df253ade673e60cea0955ec9d0e89617443a6d9ce47c2d79eb3f72a3be3de"}, {file = "onnxruntime-1.19.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:c4fcff12dc5ca963c5f76b9822bb404578fa4a98c281e8c666b429192799a099"},
{file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9839491e77e5c5a175cab3621e184d5a88925ee297ff4c311b68897197f4cde9"}, {file = "onnxruntime-1.19.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6dcad8a4db908fbe70b98c79cea1c8b6ac3316adf4ce93453136e33a524ac59"},
{file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad3187c1faff3ac15f7f0e7373ef4788c582cafa655a80fdbb33eaec88976c66"}, {file = "onnxruntime-1.19.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bc449907c6e8d99eee5ae5cc9c8fdef273d801dcd195393d3f9ab8ad3f49522"},
{file = "onnxruntime-1.18.1-cp39-cp39-win32.whl", hash = "sha256:34657c78aa4e0b5145f9188b550ded3af626651b15017bf43d280d7e23dbf195"}, {file = "onnxruntime-1.19.0-cp39-cp39-win32.whl", hash = "sha256:947febd48405afcf526e45ccff97ff23b15e530434705f734870d22ae7fcf236"},
{file = "onnxruntime-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c14fd97c3ddfa97da5feef595e2c73f14c2d0ec1d4ecbea99c8d96603c89589"}, {file = "onnxruntime-1.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:f60be47eff5ee77fd28a466b0fd41d7debc42a32179d1ddb21e05d6067d7b48b"},
] ]
[package.dependencies] [package.dependencies]
coloredlogs = "*" coloredlogs = "*"
flatbuffers = "*" flatbuffers = "*"
numpy = ">=1.21.6,<2.0" numpy = ">=1.21.6"
packaging = "*" packaging = "*"
protobuf = "*" protobuf = "*"
sympy = "*" sympy = "*"
@ -2082,64 +2082,68 @@ numpy = [
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.10.6" version = "3.10.7"
description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"},
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"},
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"},
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"},
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"},
{file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"},
{file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"},
{file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"},
{file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"},
{file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"},
{file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"},
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"},
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"},
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"},
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"},
{file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"},
{file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"},
{file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"},
{file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"},
{file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"},
{file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"},
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"},
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"},
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"},
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"},
{file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"},
{file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"},
{file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"},
{file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"},
{file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"},
{file = "orjson-3.10.6-cp313-none-win32.whl", hash = "sha256:efdf2c5cde290ae6b83095f03119bdc00303d7a03b42b16c54517baa3c4ca3d0"}, {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"},
{file = "orjson-3.10.6-cp313-none-win_amd64.whl", hash = "sha256:8e190fe7888e2e4392f52cafb9626113ba135ef53aacc65cd13109eb9746c43e"}, {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"},
{file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"},
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"},
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"},
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"},
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"},
{file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"},
{file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"},
{file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"},
{file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"},
{file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"},
{file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"},
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"},
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"},
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"},
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"},
{file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"},
{file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"},
{file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"},
{file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"},
{file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"},
{file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"},
{file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"},
{file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"},
{file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"},
{file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"},
] ]
[[package]] [[package]]
@ -2369,54 +2373,54 @@ files = [
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "1.10.17" version = "1.10.18"
description = "Data validation and settings management using python type hints" description = "Data validation and settings management using python type hints"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "pydantic-1.10.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fa51175313cc30097660b10eec8ca55ed08bfa07acbfe02f7a42f6c242e9a4b"}, {file = "pydantic-1.10.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e405ffcc1254d76bb0e760db101ee8916b620893e6edfbfee563b3c6f7a67c02"},
{file = "pydantic-1.10.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7e8988bb16988890c985bd2093df9dd731bfb9d5e0860db054c23034fab8f7a"}, {file = "pydantic-1.10.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e306e280ebebc65040034bff1a0a81fd86b2f4f05daac0131f29541cafd80b80"},
{file = "pydantic-1.10.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:371dcf1831f87c9e217e2b6a0c66842879a14873114ebb9d0861ab22e3b5bb1e"}, {file = "pydantic-1.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11d9d9b87b50338b1b7de4ebf34fd29fdb0d219dc07ade29effc74d3d2609c62"},
{file = "pydantic-1.10.17-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4866a1579c0c3ca2c40575398a24d805d4db6cb353ee74df75ddeee3c657f9a7"}, {file = "pydantic-1.10.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b661ce52c7b5e5f600c0c3c5839e71918346af2ef20062705ae76b5c16914cab"},
{file = "pydantic-1.10.17-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:543da3c6914795b37785703ffc74ba4d660418620cc273490d42c53949eeeca6"}, {file = "pydantic-1.10.18-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c20f682defc9ef81cd7eaa485879ab29a86a0ba58acf669a78ed868e72bb89e0"},
{file = "pydantic-1.10.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7623b59876f49e61c2e283551cc3647616d2fbdc0b4d36d3d638aae8547ea681"}, {file = "pydantic-1.10.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c5ae6b7c8483b1e0bf59e5f1843e4fd8fd405e11df7de217ee65b98eb5462861"},
{file = "pydantic-1.10.17-cp310-cp310-win_amd64.whl", hash = "sha256:409b2b36d7d7d19cd8310b97a4ce6b1755ef8bd45b9a2ec5ec2b124db0a0d8f3"}, {file = "pydantic-1.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:74fe19dda960b193b0eb82c1f4d2c8e5e26918d9cda858cbf3f41dd28549cb70"},
{file = "pydantic-1.10.17-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fa43f362b46741df8f201bf3e7dff3569fa92069bcc7b4a740dea3602e27ab7a"}, {file = "pydantic-1.10.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72fa46abace0a7743cc697dbb830a41ee84c9db8456e8d77a46d79b537efd7ec"},
{file = "pydantic-1.10.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2a72d2a5ff86a3075ed81ca031eac86923d44bc5d42e719d585a8eb547bf0c9b"}, {file = "pydantic-1.10.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef0fe7ad7cbdb5f372463d42e6ed4ca9c443a52ce544472d8842a0576d830da5"},
{file = "pydantic-1.10.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4ad32aed3bf5eea5ca5decc3d1bbc3d0ec5d4fbcd72a03cdad849458decbc63"}, {file = "pydantic-1.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a00e63104346145389b8e8f500bc6a241e729feaf0559b88b8aa513dd2065481"},
{file = "pydantic-1.10.17-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb4e741782e236ee7dc1fb11ad94dc56aabaf02d21df0e79e0c21fe07c95741"}, {file = "pydantic-1.10.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae6fa2008e1443c46b7b3a5eb03800121868d5ab6bc7cda20b5df3e133cde8b3"},
{file = "pydantic-1.10.17-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d2f89a719411cb234105735a520b7c077158a81e0fe1cb05a79c01fc5eb59d3c"}, {file = "pydantic-1.10.18-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9f463abafdc92635da4b38807f5b9972276be7c8c5121989768549fceb8d2588"},
{file = "pydantic-1.10.17-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db3b48d9283d80a314f7a682f7acae8422386de659fffaba454b77a083c3937d"}, {file = "pydantic-1.10.18-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3445426da503c7e40baccefb2b2989a0c5ce6b163679dd75f55493b460f05a8f"},
{file = "pydantic-1.10.17-cp311-cp311-win_amd64.whl", hash = "sha256:9c803a5113cfab7bbb912f75faa4fc1e4acff43e452c82560349fff64f852e1b"}, {file = "pydantic-1.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:467a14ee2183bc9c902579bb2f04c3d3dac00eff52e252850509a562255b2a33"},
{file = "pydantic-1.10.17-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:820ae12a390c9cbb26bb44913c87fa2ff431a029a785642c1ff11fed0a095fcb"}, {file = "pydantic-1.10.18-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:efbc8a7f9cb5fe26122acba1852d8dcd1e125e723727c59dcd244da7bdaa54f2"},
{file = "pydantic-1.10.17-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c1e51d1af306641b7d1574d6d3307eaa10a4991542ca324f0feb134fee259815"}, {file = "pydantic-1.10.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24a4a159d0f7a8e26bf6463b0d3d60871d6a52eac5bb6a07a7df85c806f4c048"},
{file = "pydantic-1.10.17-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e53fb834aae96e7b0dadd6e92c66e7dd9cdf08965340ed04c16813102a47fab"}, {file = "pydantic-1.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b74be007703547dc52e3c37344d130a7bfacca7df112a9e5ceeb840a9ce195c7"},
{file = "pydantic-1.10.17-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2495309b1266e81d259a570dd199916ff34f7f51f1b549a0d37a6d9b17b4dc"}, {file = "pydantic-1.10.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcb20d4cb355195c75000a49bb4a31d75e4295200df620f454bbc6bdf60ca890"},
{file = "pydantic-1.10.17-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:098ad8de840c92ea586bf8efd9e2e90c6339d33ab5c1cfbb85be66e4ecf8213f"}, {file = "pydantic-1.10.18-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46f379b8cb8a3585e3f61bf9ae7d606c70d133943f339d38b76e041ec234953f"},
{file = "pydantic-1.10.17-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:525bbef620dac93c430d5d6bdbc91bdb5521698d434adf4434a7ef6ffd5c4b7f"}, {file = "pydantic-1.10.18-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbfbca662ed3729204090c4d09ee4beeecc1a7ecba5a159a94b5a4eb24e3759a"},
{file = "pydantic-1.10.17-cp312-cp312-win_amd64.whl", hash = "sha256:6654028d1144df451e1da69a670083c27117d493f16cf83da81e1e50edce72ad"}, {file = "pydantic-1.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:c6d0a9f9eccaf7f438671a64acf654ef0d045466e63f9f68a579e2383b63f357"},
{file = "pydantic-1.10.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c87cedb4680d1614f1d59d13fea353faf3afd41ba5c906a266f3f2e8c245d655"}, {file = "pydantic-1.10.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d5492dbf953d7d849751917e3b2433fb26010d977aa7a0765c37425a4026ff1"},
{file = "pydantic-1.10.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11289fa895bcbc8f18704efa1d8020bb9a86314da435348f59745473eb042e6b"}, {file = "pydantic-1.10.18-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe734914977eed33033b70bfc097e1baaffb589517863955430bf2e0846ac30f"},
{file = "pydantic-1.10.17-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94833612d6fd18b57c359a127cbfd932d9150c1b72fea7c86ab58c2a77edd7c7"}, {file = "pydantic-1.10.18-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15fdbe568beaca9aacfccd5ceadfb5f1a235087a127e8af5e48df9d8a45ae85c"},
{file = "pydantic-1.10.17-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d4ecb515fa7cb0e46e163ecd9d52f9147ba57bc3633dca0e586cdb7a232db9e3"}, {file = "pydantic-1.10.18-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c3e742f62198c9eb9201781fbebe64533a3bbf6a76a91b8d438d62b813079dbc"},
{file = "pydantic-1.10.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7017971ffa7fd7808146880aa41b266e06c1e6e12261768a28b8b41ba55c8076"}, {file = "pydantic-1.10.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:19a3bd00b9dafc2cd7250d94d5b578edf7a0bd7daf102617153ff9a8fa37871c"},
{file = "pydantic-1.10.17-cp37-cp37m-win_amd64.whl", hash = "sha256:e840e6b2026920fc3f250ea8ebfdedf6ea7a25b77bf04c6576178e681942ae0f"}, {file = "pydantic-1.10.18-cp37-cp37m-win_amd64.whl", hash = "sha256:2ce3fcf75b2bae99aa31bd4968de0474ebe8c8258a0110903478bd83dfee4e3b"},
{file = "pydantic-1.10.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bfbb18b616abc4df70591b8c1ff1b3eabd234ddcddb86b7cac82657ab9017e33"}, {file = "pydantic-1.10.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:335a32d72c51a313b33fa3a9b0fe283503272ef6467910338e123f90925f0f03"},
{file = "pydantic-1.10.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb249096d873593e014535ab07145498957091aa6ae92759a32d40cb9998e2e"}, {file = "pydantic-1.10.18-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34a3613c7edb8c6fa578e58e9abe3c0f5e7430e0fc34a65a415a1683b9c32d9a"},
{file = "pydantic-1.10.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c209af63ccd7b22fba94b9024e8b7fd07feffee0001efae50dd99316b27768"}, {file = "pydantic-1.10.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9ee4e6ca1d9616797fa2e9c0bfb8815912c7d67aca96f77428e316741082a1b"},
{file = "pydantic-1.10.17-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b40c9e13a0b61583e5599e7950490c700297b4a375b55b2b592774332798b7"}, {file = "pydantic-1.10.18-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23e8ec1ce4e57b4f441fc91e3c12adba023fedd06868445a5b5f1d48f0ab3682"},
{file = "pydantic-1.10.17-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c31d281c7485223caf6474fc2b7cf21456289dbaa31401844069b77160cab9c7"}, {file = "pydantic-1.10.18-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:44ae8a3e35a54d2e8fa88ed65e1b08967a9ef8c320819a969bfa09ce5528fafe"},
{file = "pydantic-1.10.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae5184e99a060a5c80010a2d53c99aee76a3b0ad683d493e5f0620b5d86eeb75"}, {file = "pydantic-1.10.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5389eb3b48a72da28c6e061a247ab224381435256eb541e175798483368fdd3"},
{file = "pydantic-1.10.17-cp38-cp38-win_amd64.whl", hash = "sha256:ad1e33dc6b9787a6f0f3fd132859aa75626528b49cc1f9e429cdacb2608ad5f0"}, {file = "pydantic-1.10.18-cp38-cp38-win_amd64.whl", hash = "sha256:069b9c9fc645474d5ea3653788b544a9e0ccd3dca3ad8c900c4c6eac844b4620"},
{file = "pydantic-1.10.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17c0ee7192e54a10943f245dc79e36d9fe282418ea05b886e1c666063a7b54"}, {file = "pydantic-1.10.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80b982d42515632eb51f60fa1d217dfe0729f008e81a82d1544cc392e0a50ddf"},
{file = "pydantic-1.10.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cafb9c938f61d1b182dfc7d44a7021326547b7b9cf695db5b68ec7b590214773"}, {file = "pydantic-1.10.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aad8771ec8dbf9139b01b56f66386537c6fe4e76c8f7a47c10261b69ad25c2c9"},
{file = "pydantic-1.10.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95ef534e3c22e5abbdbdd6f66b6ea9dac3ca3e34c5c632894f8625d13d084cbe"}, {file = "pydantic-1.10.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941a2eb0a1509bd7f31e355912eb33b698eb0051730b2eaf9e70e2e1589cae1d"},
{file = "pydantic-1.10.17-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d96b8799ae3d782df7ec9615cb59fc32c32e1ed6afa1b231b0595f6516e8ab"}, {file = "pydantic-1.10.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65f7361a09b07915a98efd17fdec23103307a54db2000bb92095457ca758d485"},
{file = "pydantic-1.10.17-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ab2f976336808fd5d539fdc26eb51f9aafc1f4b638e212ef6b6f05e753c8011d"}, {file = "pydantic-1.10.18-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6951f3f47cb5ca4da536ab161ac0163cab31417d20c54c6de5ddcab8bc813c3f"},
{file = "pydantic-1.10.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8ad363330557beac73159acfbeed220d5f1bfcd6b930302a987a375e02f74fd"}, {file = "pydantic-1.10.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a4c5eec138a9b52c67f664c7d51d4c7234c5ad65dd8aacd919fb47445a62c86"},
{file = "pydantic-1.10.17-cp39-cp39-win_amd64.whl", hash = "sha256:48db882e48575ce4b39659558b2f9f37c25b8d348e37a2b4e32971dd5a7d6227"}, {file = "pydantic-1.10.18-cp39-cp39-win_amd64.whl", hash = "sha256:49e26c51ca854286bffc22b69787a8d4063a62bf7d83dc21d44d2ff426108518"},
{file = "pydantic-1.10.17-py3-none-any.whl", hash = "sha256:e41b5b973e5c64f674b3b4720286ded184dcc26a691dd55f34391c62c6934688"}, {file = "pydantic-1.10.18-py3-none-any.whl", hash = "sha256:06a189b81ffc52746ec9c8c007f16e5167c8b0a696e1a726369327e3db7b2a82"},
{file = "pydantic-1.10.17.tar.gz", hash = "sha256:f434160fb14b353caf634149baaf847206406471ba70e64657c1e8330277a991"}, {file = "pydantic-1.10.18.tar.gz", hash = "sha256:baebdff1907d1d96a139c25136a9bb7d17e118f133a76a2ef3b845e831e3403a"},
] ]
[package.dependencies] [package.dependencies]
@ -2490,17 +2494,17 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
version = "0.23.8" version = "0.24.0"
description = "Pytest support for asyncio" description = "Pytest support for asyncio"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"},
{file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"},
] ]
[package.dependencies] [package.dependencies]
pytest = ">=7.0.0,<9" pytest = ">=8.2,<9"
[package.extras] [package.extras]
docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"]
@ -2508,13 +2512,13 @@ testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
[[package]] [[package]]
name = "pytest-cov" name = "pytest-cov"
version = "4.1.0" version = "5.0.0"
description = "Pytest plugin for measuring coverage." description = "Pytest plugin for measuring coverage."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"},
{file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"},
] ]
[package.dependencies] [package.dependencies]
@ -2522,7 +2526,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]}
pytest = ">=4.6" pytest = ">=4.6"
[package.extras] [package.extras]
testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
[[package]] [[package]]
name = "pytest-mock" name = "pytest-mock"
@ -2829,29 +2833,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.5.7" version = "0.6.2"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, {file = "ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c"},
{file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, {file = "ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570"},
{file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"}, {file = "ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1"},
{file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"}, {file = "ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1"},
{file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"}, {file = "ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23"},
{file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"}, {file = "ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a"},
{file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"}, {file = "ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c"},
{file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"}, {file = "ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56"},
{file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"}, {file = "ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da"},
{file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"}, {file = "ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2"},
{file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"}, {file = "ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9"},
{file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"}, {file = "ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be"},
] ]
[[package]] [[package]]
@ -3264,13 +3268,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]] [[package]]
name = "uvicorn" name = "uvicorn"
version = "0.30.5" version = "0.30.6"
description = "The lightning-fast ASGI server." description = "The lightning-fast ASGI server."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835"}, {file = "uvicorn-0.30.6-py3-none-any.whl", hash = "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"},
{file = "uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee"}, {file = "uvicorn-0.30.6.tar.gz", hash = "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788"},
] ]
[package.dependencies] [package.dependencies]

View File

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "machine-learning" name = "machine-learning"
version = "1.112.1" version = "1.113.0"
description = "" description = ""
authors = ["Hau Tran <alex.tran1502@gmail.com>"] authors = ["Hau Tran <alex.tran1502@gmail.com>"]
readme = "README.md" readme = "README.md"

View File

@ -13,6 +13,7 @@ fi
: "${IMMICH_HOST:=[::]}" : "${IMMICH_HOST:=[::]}"
: "${IMMICH_PORT:=3003}" : "${IMMICH_PORT:=3003}"
: "${MACHINE_LEARNING_WORKERS:=1}" : "${MACHINE_LEARNING_WORKERS:=1}"
: "${MACHINE_LEARNING_HTTP_KEEPALIVE_TIMEOUT_S:=2}"
gunicorn app.main:app \ gunicorn app.main:app \
-k app.config.CustomUvicornWorker \ -k app.config.CustomUvicornWorker \
@ -20,4 +21,5 @@ gunicorn app.main:app \
-w "$MACHINE_LEARNING_WORKERS" \ -w "$MACHINE_LEARNING_WORKERS" \
-t "$MACHINE_LEARNING_WORKER_TIMEOUT" \ -t "$MACHINE_LEARNING_WORKER_TIMEOUT" \
--log-config-json log_conf.json \ --log-config-json log_conf.json \
--keep-alive "$MACHINE_LEARNING_HTTP_KEEPALIVE_TIMEOUT_S" \
--graceful-timeout 0 --graceful-timeout 0

View File

@ -24,7 +24,7 @@
<application android:label="Immich" android:name=".ImmichApp" android:usesCleartextTraffic="true" <application android:label="Immich" android:name=".ImmichApp" android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true" android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true"
android:largeHeap="true" android:enableOnBackInvokedCallback="true"> android:largeHeap="true" android:enableOnBackInvokedCallback="false">
<service <service
android:name="androidx.work.impl.foreground.SystemForegroundService" android:name="androidx.work.impl.foreground.SystemForegroundService"
@ -35,7 +35,7 @@
<meta-data <meta-data
android:name="io.flutter.embedding.android.EnableImpeller" android:name="io.flutter.embedding.android.EnableImpeller"
android:value="true" /> android:value="false" />
<meta-data <meta-data
android:name="com.google.firebase.messaging.default_notification_icon" android:name="com.google.firebase.messaging.default_notification_icon"
@ -69,7 +69,7 @@
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="app.immich" /> <data android:scheme="app.immich" android:pathPrefix="/oauth-callback" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
@ -94,4 +94,4 @@
<data android:scheme="geo" /> <data android:scheme="geo" />
</intent> </intent>
</queries> </queries>
</manifest> </manifest>

View File

@ -35,8 +35,8 @@ platform :android do
task: 'bundle', task: 'bundle',
build_type: 'Release', build_type: 'Release',
properties: { properties: {
"android.injected.version.code" => 154, "android.injected.version.code" => 156,
"android.injected.version.name" => "1.112.1", "android.injected.version.name" => "1.113.0",
} }
) )
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')

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "يمسح", "control_bottom_app_bar_delete": "يمسح",
"control_bottom_app_bar_delete_from_immich": " حذف منال تطبيق", "control_bottom_app_bar_delete_from_immich": " حذف منال تطبيق",
"control_bottom_app_bar_delete_from_local": "حذف من الجهاز", "control_bottom_app_bar_delete_from_local": "حذف من الجهاز",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "تحديد الوجهة", "control_bottom_app_bar_edit_location": "تحديد الوجهة",
"control_bottom_app_bar_edit_time": "تحرير التاريخ والوقت", "control_bottom_app_bar_edit_time": "تحرير التاريخ والوقت",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "يشارك", "create_shared_album_page_share": "يشارك",
"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": "حدد الصور",
"crop": "Crop",
"curated_location_page_title": "أماكن", "curated_location_page_title": "أماكن",
"curated_object_page_title": "أشياء", "curated_object_page_title": "أشياء",
"daily_title_text_date": "E ، MMM DD", "daily_title_text_date": "E ، MMM DD",
@ -210,7 +212,9 @@
"description_input_submit_error": "خطأ تحديث الوصف ، تحقق من السجل لمزيد من التفاصيل", "description_input_submit_error": "خطأ تحديث الوصف ، تحقق من السجل لمزيد من التفاصيل",
"edit_date_time_dialog_date_time": "التاريخ و الوقت", "edit_date_time_dialog_date_time": "التاريخ و الوقت",
"edit_date_time_dialog_timezone": "وحدة زمنية", "edit_date_time_dialog_timezone": "وحدة زمنية",
"edit_image_title": "Edit",
"edit_location_dialog_title": "موقع", "edit_location_dialog_title": "موقع",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "اضف وصفا...", "exif_bottom_sheet_description": "اضف وصفا...",
"exif_bottom_sheet_details": "تفاصيل", "exif_bottom_sheet_details": "تفاصيل",
"exif_bottom_sheet_location": "موقع", "exif_bottom_sheet_location": "موقع",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "إذا كانت هذه هي المرة الأولى التي تستخدم فيها التطبيق، فيرجى التأكد من اختيار ألبوم (ألبومات) احتياطية حتى يتمكن المخطط الزمني من ملء الصور ومقاطع الفيديو في الألبوم (الألبومات).", "home_page_first_time_notice": "إذا كانت هذه هي المرة الأولى التي تستخدم فيها التطبيق، فيرجى التأكد من اختيار ألبوم (ألبومات) احتياطية حتى يتمكن المخطط الزمني من ملء الصور ومقاطع الفيديو في الألبوم (الألبومات).",
"home_page_share_err_local": "لا يمكن مشاركة الأصول المحلية عبر الرابط ، سوف يتخطى", "home_page_share_err_local": "لا يمكن مشاركة الأصول المحلية عبر الرابط ، سوف يتخطى",
"home_page_upload_err_limit": "لا يمكن إلا تحميل 30 أحد الأصول في وقت واحد ، سوف يتخطى", "home_page_upload_err_limit": "لا يمكن إلا تحميل 30 أحد الأصول في وقت واحد ، سوف يتخطى",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "خطا في التحميل", "image_viewer_page_state_provider_download_error": "خطا في التحميل",
"image_viewer_page_state_provider_download_started": "بدأ التنزيل", "image_viewer_page_state_provider_download_started": "بدأ التنزيل",
"image_viewer_page_state_provider_download_success": "تم التنزيل بنجاح", "image_viewer_page_state_provider_download_success": "تم التنزيل بنجاح",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "خروج", "profile_drawer_sign_out": "خروج",
"profile_drawer_trash": "نفايات", "profile_drawer_trash": "نفايات",
"recently_added_page_title": "أضيف مؤخرا", "recently_added_page_title": "أضيف مؤخرا",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "حدث خطأ", "scaffold_body_error_occurred": "حدث خطأ",
"search_bar_hint": "ابحث عن صورك", "search_bar_hint": "ابحث عن صورك",
"search_filter_apply": "اختار الفلتر ", "search_filter_apply": "اختار الفلتر ",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "ألبوم مشترك جديد", "sharing_silver_appbar_create_shared_album": "ألبوم مشترك جديد",
"sharing_silver_appbar_shared_links": "روابط مشتركة", "sharing_silver_appbar_shared_links": "روابط مشتركة",
"sharing_silver_appbar_share_partner": "شارك مع الشريك", "sharing_silver_appbar_share_partner": "شارك مع الشريك",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "مكتبة", "tab_controller_nav_library": "مكتبة",
"tab_controller_nav_photos": "الصور", "tab_controller_nav_photos": "الصور",
"tab_controller_nav_search": "يبحث", "tab_controller_nav_search": "يبحث",

View File

@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "Rozložení", "asset_list_layout_sub_title": "Rozložení",
"asset_list_settings_subtitle": "Nastavení rozložení mřížky fotografií", "asset_list_settings_subtitle": "Nastavení rozložení mřížky fotografií",
"asset_list_settings_title": "Fotografická mřížka", "asset_list_settings_title": "Fotografická mřížka",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Položka úspěšně obnovena",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} položek trvale odstraněno",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} položek trvale odstraněno z Immich serveru",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} položek trvale odstraněno z vašeho zařízení",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} položek úspěšně obnoveno",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} položek vyhozeno do koše",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} položek vyhozeno do koše na Immich serveru",
"asset_viewer_settings_title": "Prohlížeč", "asset_viewer_settings_title": "Prohlížeč",
"backup_album_selection_page_albums_device": "Alba v zařízení ({})", "backup_album_selection_page_albums_device": "Alba v zařízení ({})",
"backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, dvojím klepnutím ji vyloučíte", "backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, dvojím klepnutím ji vyloučíte",
@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Smazat", "control_bottom_app_bar_delete": "Smazat",
"control_bottom_app_bar_delete_from_immich": "Smazat ze serveru Immich", "control_bottom_app_bar_delete_from_immich": "Smazat ze serveru Immich",
"control_bottom_app_bar_delete_from_local": "Smazat ze zařízení", "control_bottom_app_bar_delete_from_local": "Smazat ze zařízení",
"control_bottom_app_bar_download": "Stáhnout",
"control_bottom_app_bar_edit": "Upravit", "control_bottom_app_bar_edit": "Upravit",
"control_bottom_app_bar_edit_location": "Upravit polohu", "control_bottom_app_bar_edit_location": "Upravit polohu",
"control_bottom_app_bar_edit_time": "Upravit datum a čas", "control_bottom_app_bar_edit_time": "Upravit datum a čas",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Sdílet", "create_shared_album_page_share": "Sdílet",
"create_shared_album_page_share_add_assets": "PŘIDAT POLOŽKY", "create_shared_album_page_share_add_assets": "PŘIDAT POLOŽKY",
"create_shared_album_page_share_select_photos": "Vybrat fotografie", "create_shared_album_page_share_select_photos": "Vybrat fotografie",
"crop": "Oříznout",
"curated_location_page_title": "Místa", "curated_location_page_title": "Místa",
"curated_object_page_title": "Věci", "curated_object_page_title": "Věci",
"daily_title_text_date": "EEEE, d. MMMM", "daily_title_text_date": "EEEE, d. MMMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Chyba aktualizace popisu, další podrobnosti najdete v logu", "description_input_submit_error": "Chyba aktualizace popisu, další podrobnosti najdete v logu",
"edit_date_time_dialog_date_time": "Datum a čas", "edit_date_time_dialog_date_time": "Datum a čas",
"edit_date_time_dialog_timezone": "Časové pásmo", "edit_date_time_dialog_timezone": "Časové pásmo",
"edit_image_title": "Upravit",
"edit_location_dialog_title": "Poloha", "edit_location_dialog_title": "Poloha",
"error_saving_image": "Chyba: {}",
"exif_bottom_sheet_description": "Přidat popis...", "exif_bottom_sheet_description": "Přidat popis...",
"exif_bottom_sheet_details": "PODROBNOSTI", "exif_bottom_sheet_details": "PODROBNOSTI",
"exif_bottom_sheet_location": "POLOHA", "exif_bottom_sheet_location": "POLOHA",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Pokud aplikaci používáte poprvé, nezapomeňte si vybrat zálohovaná alba, aby se na časové ose mohly nacházet fotografie a videa z vybraných alb.", "home_page_first_time_notice": "Pokud aplikaci používáte poprvé, nezapomeňte si vybrat zálohovaná alba, aby se na časové ose mohly nacházet fotografie a videa z vybraných alb.",
"home_page_share_err_local": "Nelze sdílet místní položky prostřednictvím odkazu, přeskakuji", "home_page_share_err_local": "Nelze sdílet místní položky prostřednictvím odkazu, přeskakuji",
"home_page_upload_err_limit": "Lze nahrát nejvýše 30 položek najednou, přeskakuji", "home_page_upload_err_limit": "Lze nahrát nejvýše 30 položek najednou, přeskakuji",
"image_saved_successfully": "Obrázek uložen",
"image_viewer_page_state_provider_download_error": "Chyba stahování", "image_viewer_page_state_provider_download_error": "Chyba stahování",
"image_viewer_page_state_provider_download_started": "Stahování zahájeno", "image_viewer_page_state_provider_download_started": "Stahování zahájeno",
"image_viewer_page_state_provider_download_success": "Stahování bylo úspěšné", "image_viewer_page_state_provider_download_success": "Stahování bylo úspěšné",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Odhlásit se", "profile_drawer_sign_out": "Odhlásit se",
"profile_drawer_trash": "Vyhodit", "profile_drawer_trash": "Vyhodit",
"recently_added_page_title": "Nedávno přidané", "recently_added_page_title": "Nedávno přidané",
"save_to_gallery": "Uložit do galerie",
"scaffold_body_error_occurred": "Došlo k chybě", "scaffold_body_error_occurred": "Došlo k chybě",
"search_bar_hint": "Prohledejte své fotky", "search_bar_hint": "Prohledejte své fotky",
"search_filter_apply": "Použít filtr", "search_filter_apply": "Použít filtr",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Vytvořit sdílené album", "sharing_silver_appbar_create_shared_album": "Vytvořit sdílené album",
"sharing_silver_appbar_shared_links": "Sdílené odkazy", "sharing_silver_appbar_shared_links": "Sdílené odkazy",
"sharing_silver_appbar_share_partner": "Sdílet s partnerem", "sharing_silver_appbar_share_partner": "Sdílet s partnerem",
"sync": "Synchronizace",
"sync_albums": "Synchronizovat alba",
"sync_albums_manual_subtitle": "Synchronizovat všechna nahraná videa a fotografie do vybraných záložních alb",
"sync_upload_album_setting_subtitle": "Vytvořit a nahrát fotografie a videa do vybraných alb na Immich",
"tab_controller_nav_library": "Knihovna", "tab_controller_nav_library": "Knihovna",
"tab_controller_nav_photos": "Fotografie", "tab_controller_nav_photos": "Fotografie",
"tab_controller_nav_search": "Vyhledávání", "tab_controller_nav_search": "Vyhledávání",
@ -549,7 +559,7 @@
"theme_setting_three_stage_loading_subtitle": "Třístupňové načítání může zvýšit výkonnost načítání, ale vede k výrazně vyššímu zatížení sítě.", "theme_setting_three_stage_loading_subtitle": "Třístupňové načítání může zvýšit výkonnost načítání, ale vede k výrazně vyššímu zatížení sítě.",
"theme_setting_three_stage_loading_title": "Povolení třístupňového načítání", "theme_setting_three_stage_loading_title": "Povolení třístupňového načítání",
"translated_text_options": "Možnosti", "translated_text_options": "Možnosti",
"trash_emptied": "Emptied trash", "trash_emptied": "Koš vyprázdněn",
"trash_page_delete": "Smazat", "trash_page_delete": "Smazat",
"trash_page_delete_all": "Smazat všechny", "trash_page_delete_all": "Smazat všechny",
"trash_page_empty_trash_btn": "Vysypat koš", "trash_page_empty_trash_btn": "Vysypat koš",

View File

@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "Layout", "asset_list_layout_sub_title": "Layout",
"asset_list_settings_subtitle": "Indstillinger for billedgitterlayout", "asset_list_settings_subtitle": "Indstillinger for billedgitterlayout",
"asset_list_settings_title": "Billedgitter", "asset_list_settings_title": "Billedgitter",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Elementet blev gendannet succesfuldt",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} element(er) blev fjernet permanent",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} element(er) blev fjernet permanent fra serveren",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} element(er) blev fjernet permanent fra din enhed",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} element(er) blev gendannet succesfuldt",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} element(er) blev smidt i papirkurven",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} element(er) blev smidt i serverens papirkurv",
"asset_viewer_settings_title": "Billedviser", "asset_viewer_settings_title": "Billedviser",
"backup_album_selection_page_albums_device": "Albummer på enhed ({})", "backup_album_selection_page_albums_device": "Albummer på enhed ({})",
"backup_album_selection_page_albums_tap": "Tryk en gang for at inkludere, tryk to gange for at ekskludere", "backup_album_selection_page_albums_tap": "Tryk en gang for at inkludere, tryk to gange for at ekskludere",
@ -173,7 +173,8 @@
"control_bottom_app_bar_delete": "Slet", "control_bottom_app_bar_delete": "Slet",
"control_bottom_app_bar_delete_from_immich": "Slet fra Immich", "control_bottom_app_bar_delete_from_immich": "Slet fra Immich",
"control_bottom_app_bar_delete_from_local": "Slet fra enhed", "control_bottom_app_bar_delete_from_local": "Slet fra enhed",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_download": "Hent",
"control_bottom_app_bar_edit": "Rediger",
"control_bottom_app_bar_edit_location": "Rediger placering", "control_bottom_app_bar_edit_location": "Rediger placering",
"control_bottom_app_bar_edit_time": "Rediger tid og dato", "control_bottom_app_bar_edit_time": "Rediger tid og dato",
"control_bottom_app_bar_favorite": "Favorit", "control_bottom_app_bar_favorite": "Favorit",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Del", "create_shared_album_page_share": "Del",
"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",
"crop": "Beskær",
"curated_location_page_title": "Steder", "curated_location_page_title": "Steder",
"curated_object_page_title": "Ting", "curated_object_page_title": "Ting",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Fejl med at opdatere beskrivelsen. Tjek loggen for flere detaljer", "description_input_submit_error": "Fejl med at opdatere beskrivelsen. Tjek loggen for flere detaljer",
"edit_date_time_dialog_date_time": "Dato og klokkeslæt", "edit_date_time_dialog_date_time": "Dato og klokkeslæt",
"edit_date_time_dialog_timezone": "Tidszone", "edit_date_time_dialog_timezone": "Tidszone",
"edit_image_title": "Rediger",
"edit_location_dialog_title": "Placering", "edit_location_dialog_title": "Placering",
"error_saving_image": "Fejl: {}",
"exif_bottom_sheet_description": "Tilføj beskrivelse...", "exif_bottom_sheet_description": "Tilføj beskrivelse...",
"exif_bottom_sheet_details": "DETALJER", "exif_bottom_sheet_details": "DETALJER",
"exif_bottom_sheet_location": "LOKATION", "exif_bottom_sheet_location": "LOKATION",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Hvis det er din første gang i appen, bedes du vælge en sikkerhedskopi af albummer så tidlinjen kan blive fyldt med billeder og videoer fra albummerne.", "home_page_first_time_notice": "Hvis det er din første gang i appen, bedes du vælge en sikkerhedskopi af albummer så tidlinjen kan blive fyldt med billeder og videoer fra albummerne.",
"home_page_share_err_local": "Kan ikke dele lokale elementer via link, springer over", "home_page_share_err_local": "Kan ikke dele lokale elementer via link, springer over",
"home_page_upload_err_limit": "Det er kun muligt at lave sikkerhedskopi af 30 elementer ad gangen. Springer over", "home_page_upload_err_limit": "Det er kun muligt at lave sikkerhedskopi af 30 elementer ad gangen. Springer over",
"image_saved_successfully": "Billede gemt",
"image_viewer_page_state_provider_download_error": "Fejl ved download", "image_viewer_page_state_provider_download_error": "Fejl ved download",
"image_viewer_page_state_provider_download_started": "Download startet", "image_viewer_page_state_provider_download_started": "Download startet",
"image_viewer_page_state_provider_download_success": "Download succesfuld", "image_viewer_page_state_provider_download_success": "Download succesfuld",
@ -334,7 +339,7 @@
"multiselect_grid_edit_date_time_err_read_only": "Kan ikke redigere datoen på kun læselige elementer. Springer over", "multiselect_grid_edit_date_time_err_read_only": "Kan ikke redigere datoen på kun læselige elementer. Springer over",
"multiselect_grid_edit_gps_err_read_only": "Kan ikke redigere lokation af kun læselige elementer. Springer over", "multiselect_grid_edit_gps_err_read_only": "Kan ikke redigere lokation af kun læselige elementer. Springer over",
"no_assets_to_show": "Ingen elementer at vise", "no_assets_to_show": "Ingen elementer at vise",
"no_name": "No name", "no_name": "Intet navn",
"notification_permission_dialog_cancel": "Annuller", "notification_permission_dialog_cancel": "Annuller",
"notification_permission_dialog_content": "Gå til indstillinger for at slå notifikationer til.", "notification_permission_dialog_content": "Gå til indstillinger for at slå notifikationer til.",
"notification_permission_dialog_settings": "Indstillinger", "notification_permission_dialog_settings": "Indstillinger",
@ -375,33 +380,34 @@
"profile_drawer_sign_out": "Log ud", "profile_drawer_sign_out": "Log ud",
"profile_drawer_trash": "Papirkurv", "profile_drawer_trash": "Papirkurv",
"recently_added_page_title": "Nyligt tilføjet", "recently_added_page_title": "Nyligt tilføjet",
"save_to_gallery": "Gem til galleri",
"scaffold_body_error_occurred": "Der opstod en fejl", "scaffold_body_error_occurred": "Der opstod en fejl",
"search_bar_hint": "Søg i dine billeder", "search_bar_hint": "Søg i dine billeder",
"search_filter_apply": "Tilføj filter", "search_filter_apply": "Tilføj filter",
"search_filter_camera": "Camera", "search_filter_camera": "Kamera",
"search_filter_camera_make": "Producent", "search_filter_camera_make": "Producent",
"search_filter_camera_model": "Model", "search_filter_camera_model": "Model",
"search_filter_camera_title": "Select camera type", "search_filter_camera_title": "Vælg type af kamera",
"search_filter_date": "Date", "search_filter_date": "Dato",
"search_filter_date_interval": "{start} to {end}", "search_filter_date_interval": "{start} til { slut}",
"search_filter_date_title": "Select a date range", "search_filter_date_title": "Vælg et datointerval",
"search_filter_display_option_archive": "Arkiv", "search_filter_display_option_archive": "Arkiv",
"search_filter_display_option_favorite": "Favorit", "search_filter_display_option_favorite": "Favorit",
"search_filter_display_option_not_in_album": "Ikke i album", "search_filter_display_option_not_in_album": "Ikke i album",
"search_filter_display_options": "Display Options", "search_filter_display_options": "Visningsindstillinger",
"search_filter_display_options_title": "Display options", "search_filter_display_options_title": "Visningsindstillinger",
"search_filter_location": "Location", "search_filter_location": "Lokation",
"search_filter_location_city": "By", "search_filter_location_city": "By",
"search_filter_location_country": "Land", "search_filter_location_country": "Land",
"search_filter_location_state": "Stat", "search_filter_location_state": "Stat",
"search_filter_location_title": "Select location", "search_filter_location_title": "Vælg lokation",
"search_filter_media_type": "Media Type", "search_filter_media_type": "Medietype",
"search_filter_media_type_all": "Alle", "search_filter_media_type_all": "Alle",
"search_filter_media_type_image": "Billede", "search_filter_media_type_image": "Billede",
"search_filter_media_type_title": "Select media type", "search_filter_media_type_title": "Vælg medietype",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_filter_people": "People", "search_filter_people": "Personer",
"search_filter_people_title": "Select people", "search_filter_people_title": "Vælg personer",
"search_page_categories": "Kategorier", "search_page_categories": "Kategorier",
"search_page_favorites": "Favoritter", "search_page_favorites": "Favoritter",
"search_page_motion_photos": "Bevægelsesbilleder", "search_page_motion_photos": "Bevægelsesbilleder",
@ -529,27 +535,31 @@
"sharing_silver_appbar_create_shared_album": "Opret delt album", "sharing_silver_appbar_create_shared_album": "Opret delt album",
"sharing_silver_appbar_shared_links": "Delte links", "sharing_silver_appbar_shared_links": "Delte links",
"sharing_silver_appbar_share_partner": "Del med partner", "sharing_silver_appbar_share_partner": "Del med partner",
"sync": "Synkroniser",
"sync_albums": "Synkroniser albummer",
"sync_albums_manual_subtitle": "Synkroniser alle uploadet billeder og videoer til de valgte backupalbummer",
"sync_upload_album_setting_subtitle": "Opret og upload dine billeder og videoer til de valgte albummer i Immich",
"tab_controller_nav_library": "Bibliotek", "tab_controller_nav_library": "Bibliotek",
"tab_controller_nav_photos": "Billeder", "tab_controller_nav_photos": "Billeder",
"tab_controller_nav_search": "Søg", "tab_controller_nav_search": "Søg",
"tab_controller_nav_sharing": "Deling", "tab_controller_nav_sharing": "Deling",
"theme_setting_asset_list_storage_indicator_title": "Vis opbevaringsindikator på filer", "theme_setting_asset_list_storage_indicator_title": "Vis opbevaringsindikator på filer",
"theme_setting_asset_list_tiles_per_row_title": "Antal elementer per række ({})", "theme_setting_asset_list_tiles_per_row_title": "Antal elementer per række ({})",
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", "theme_setting_colorful_interface_subtitle": "Tilføj primær farve til baggrundsoverflader.",
"theme_setting_colorful_interface_title": "Colorful interface", "theme_setting_colorful_interface_title": "Farverig grænseflade",
"theme_setting_dark_mode_switch": "Mørk tilstand", "theme_setting_dark_mode_switch": "Mørk tilstand",
"theme_setting_image_viewer_quality_subtitle": "Juster kvaliteten i billedfremviseren", "theme_setting_image_viewer_quality_subtitle": "Juster kvaliteten i billedfremviseren",
"theme_setting_image_viewer_quality_title": "Billedfremviserkvalitet", "theme_setting_image_viewer_quality_title": "Billedfremviserkvalitet",
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.", "theme_setting_primary_color_subtitle": "Vælg en farve til primære handlinger og accenter.",
"theme_setting_primary_color_title": "Primary color", "theme_setting_primary_color_title": "Primær farve",
"theme_setting_system_primary_color_title": "Use system color", "theme_setting_system_primary_color_title": "Brug systemfarver",
"theme_setting_system_theme_switch": "Automatisk (Følg systemindstillinger)", "theme_setting_system_theme_switch": "Automatisk (Følg systemindstillinger)",
"theme_setting_theme_subtitle": "Vælg appens temaindstilling", "theme_setting_theme_subtitle": "Vælg appens temaindstilling",
"theme_setting_theme_title": "Tema", "theme_setting_theme_title": "Tema",
"theme_setting_three_stage_loading_subtitle": "Tre-trins indlæsning kan øge ydeevnen, men kan ligeledes føre til højere netværksbelastning", "theme_setting_three_stage_loading_subtitle": "Tre-trins indlæsning kan øge ydeevnen, men kan ligeledes føre til højere netværksbelastning",
"theme_setting_three_stage_loading_title": "Slå tre-trins indlæsning til", "theme_setting_three_stage_loading_title": "Slå tre-trins indlæsning til",
"translated_text_options": "Handlinger", "translated_text_options": "Handlinger",
"trash_emptied": "Emptied trash", "trash_emptied": "Tømte papirkurven",
"trash_page_delete": "Slet", "trash_page_delete": "Slet",
"trash_page_delete_all": "Slet alt", "trash_page_delete_all": "Slet alt",
"trash_page_empty_trash_btn": "Tøm papirkurv", "trash_page_empty_trash_btn": "Tøm papirkurv",

View File

@ -9,14 +9,14 @@
"add_to_album_bottom_sheet_added": "Zu {album} hinzugefügt", "add_to_album_bottom_sheet_added": "Zu {album} hinzugefügt",
"add_to_album_bottom_sheet_already_exists": "Bereits in {album}", "add_to_album_bottom_sheet_already_exists": "Bereits in {album}",
"advanced_settings_log_level_title": "Log-Level: {}", "advanced_settings_log_level_title": "Log-Level: {}",
"advanced_settings_prefer_remote_subtitle": "Manche Endgeräte laden Vorschaubilder von lokalen Bilder sehr langsam. Durch diese Einstellung werden diese stattdessen direkt vom Server geladen.", "advanced_settings_prefer_remote_subtitle": "Einige Geräte sind sehr langsam beim Laden von Miniaturbildern direkt aus dem Gerät. Aktivieren Sie diese Einstellung, um stattdessen die Server-Bilder zu laden.",
"advanced_settings_prefer_remote_title": "Server-Bilder bevorzugen", "advanced_settings_prefer_remote_title": "Server-Bilder bevorzugen",
"advanced_settings_proxy_headers_subtitle": "Definiere einen Proxy-Header, den Immich bei jeder Netzwerkanfrage mitschicken soll", "advanced_settings_proxy_headers_subtitle": "Definiere einen Proxy-Header, den Immich bei jeder Netzwerkanfrage mitschicken soll",
"advanced_settings_proxy_headers_title": "Proxy-Headers", "advanced_settings_proxy_headers_title": "Proxy-Headers",
"advanced_settings_self_signed_ssl_subtitle": "Verifizierung von SSL-Zertifikaten vom Server überspringen. Notwendig bei selbstsignierten Zertifikaten.", "advanced_settings_self_signed_ssl_subtitle": "Verifizierung von SSL-Zertifikaten vom Server überspringen. Notwendig bei selbstsignierten Zertifikaten.",
"advanced_settings_self_signed_ssl_title": "Selbstsignierte SSL-Zertifikate erlauben", "advanced_settings_self_signed_ssl_title": "Selbstsignierte SSL-Zertifikate erlauben",
"advanced_settings_tile_subtitle": "Erweiterte Benutzereinstellungen", "advanced_settings_tile_subtitle": "Erweiterte Benutzereinstellungen",
"advanced_settings_tile_title": "Sonstige", "advanced_settings_tile_title": "Sonstiges",
"advanced_settings_troubleshooting_subtitle": "Erweiterte Funktionen zur Fehlersuche aktivieren", "advanced_settings_troubleshooting_subtitle": "Erweiterte Funktionen zur Fehlersuche aktivieren",
"advanced_settings_troubleshooting_title": "Fehlersuche", "advanced_settings_troubleshooting_title": "Fehlersuche",
"album_info_card_backup_album_excluded": "AUSGESCHLOSSEN", "album_info_card_backup_album_excluded": "AUSGESCHLOSSEN",
@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "Layout", "asset_list_layout_sub_title": "Layout",
"asset_list_settings_subtitle": "Einstellungen für das Fotogitter-Layout", "asset_list_settings_subtitle": "Einstellungen für das Fotogitter-Layout",
"asset_list_settings_title": "Fotogitter", "asset_list_settings_title": "Fotogitter",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Datei erfolgreich wiederhergestellt",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} Datei/en permanent gelöscht",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} Datei/en wurden permanent vom Immich Server gelöscht",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} Datei/en wurden permanent vom Gerät gelöscht",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} Datei/en erfolgreich wiederhergestellt",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} Datei/en gelöscht",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} Datei/en vom Immich-Server gelöscht",
"asset_viewer_settings_title": "Fotoanzeige", "asset_viewer_settings_title": "Fotoanzeige",
"backup_album_selection_page_albums_device": "Alben auf dem Gerät ({})", "backup_album_selection_page_albums_device": "Alben auf dem Gerät ({})",
"backup_album_selection_page_albums_tap": "Einmalig das Album antippen um es zu sichern, doppelt antippen um es nicht mehr zu sichern.", "backup_album_selection_page_albums_tap": "Einmalig das Album antippen um es zu sichern, doppelt antippen um es nicht mehr zu sichern.",
@ -131,7 +131,7 @@
"cache_settings_clear_cache_button": "Zwischenspeicher löschen", "cache_settings_clear_cache_button": "Zwischenspeicher löschen",
"cache_settings_clear_cache_button_title": "Löscht den Zwischenspeicher der App. Dies wird die Leistungsfähigkeit der App deutlich einschränken, bis der Zwischenspeicher wieder aufgebaut wurde.", "cache_settings_clear_cache_button_title": "Löscht den Zwischenspeicher der App. Dies wird die Leistungsfähigkeit der App deutlich einschränken, bis der Zwischenspeicher wieder aufgebaut wurde.",
"cache_settings_duplicated_assets_clear_button": "LEEREN", "cache_settings_duplicated_assets_clear_button": "LEEREN",
"cache_settings_duplicated_assets_subtitle": "Inhalte, die von der App versteckt werden", "cache_settings_duplicated_assets_subtitle": "Fotos und Videos, die von der App blockiert werden",
"cache_settings_duplicated_assets_title": "Duplikate ({})", "cache_settings_duplicated_assets_title": "Duplikate ({})",
"cache_settings_image_cache_size": "{} Bilder im Zwischenspeicher", "cache_settings_image_cache_size": "{} Bilder im Zwischenspeicher",
"cache_settings_statistics_album": "Vorschaubilder der Bibliothek", "cache_settings_statistics_album": "Vorschaubilder der Bibliothek",
@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Löschen", "control_bottom_app_bar_delete": "Löschen",
"control_bottom_app_bar_delete_from_immich": "Aus Immich löschen", "control_bottom_app_bar_delete_from_immich": "Aus Immich löschen",
"control_bottom_app_bar_delete_from_local": "Vom Gerät löschen", "control_bottom_app_bar_delete_from_local": "Vom Gerät löschen",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Bearbeiten", "control_bottom_app_bar_edit": "Bearbeiten",
"control_bottom_app_bar_edit_location": "Ort bearbeiten", "control_bottom_app_bar_edit_location": "Ort bearbeiten",
"control_bottom_app_bar_edit_time": "Datum und Uhrzeit bearbeiten", "control_bottom_app_bar_edit_time": "Datum und Uhrzeit bearbeiten",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Teilen", "create_shared_album_page_share": "Teilen",
"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",
"crop": "Zuschneiden",
"curated_location_page_title": "Orte", "curated_location_page_title": "Orte",
"curated_object_page_title": "Dinge", "curated_object_page_title": "Dinge",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Beschreibung konnte nicht geändert werden, bitte im Log für mehr Details nachsehen.", "description_input_submit_error": "Beschreibung konnte nicht geändert werden, bitte im Log für mehr Details nachsehen.",
"edit_date_time_dialog_date_time": "Datum und Uhrzeit", "edit_date_time_dialog_date_time": "Datum und Uhrzeit",
"edit_date_time_dialog_timezone": "Zeitzone", "edit_date_time_dialog_timezone": "Zeitzone",
"edit_image_title": "Bearbeiten",
"edit_location_dialog_title": "Ort bearbeiten", "edit_location_dialog_title": "Ort bearbeiten",
"error_saving_image": "Fehler: {}",
"exif_bottom_sheet_description": "Beschreibung hinzufügen...", "exif_bottom_sheet_description": "Beschreibung hinzufügen...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "STANDORT", "exif_bottom_sheet_location": "STANDORT",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Wenn dies das erste Mal ist dass Du Immich nutzt, stelle bitte sicher, dass mindestens ein Album zur Sicherung ausgewählt ist, sodass die Zeitachse mit Fotos und Videos gefüllt werden kann.", "home_page_first_time_notice": "Wenn dies das erste Mal ist dass Du Immich nutzt, stelle bitte sicher, dass mindestens ein Album zur Sicherung ausgewählt ist, sodass die Zeitachse mit Fotos und Videos gefüllt werden kann.",
"home_page_share_err_local": "Lokale Inhalte können nicht per Link geteilt werden, überspringe", "home_page_share_err_local": "Lokale Inhalte können nicht per Link geteilt werden, überspringe",
"home_page_upload_err_limit": "Es können max. 30 Elemente gleichzeitig hochgeladen werden, überspringen...", "home_page_upload_err_limit": "Es können max. 30 Elemente gleichzeitig hochgeladen werden, überspringen...",
"image_saved_successfully": "Bild gespeichert",
"image_viewer_page_state_provider_download_error": "Fehler beim Herunterladen", "image_viewer_page_state_provider_download_error": "Fehler beim Herunterladen",
"image_viewer_page_state_provider_download_started": "Download gestartet", "image_viewer_page_state_provider_download_started": "Download gestartet",
"image_viewer_page_state_provider_download_success": "Erfolgreich heruntergeladen", "image_viewer_page_state_provider_download_success": "Erfolgreich heruntergeladen",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Abmelden", "profile_drawer_sign_out": "Abmelden",
"profile_drawer_trash": "Papierkorb", "profile_drawer_trash": "Papierkorb",
"recently_added_page_title": "Zuletzt hinzugefügt", "recently_added_page_title": "Zuletzt hinzugefügt",
"save_to_gallery": "In Galerie speichern",
"scaffold_body_error_occurred": "Ein Fehler ist aufgetreten", "scaffold_body_error_occurred": "Ein Fehler ist aufgetreten",
"search_bar_hint": "Durchsuche deine Fotos", "search_bar_hint": "Durchsuche deine Fotos",
"search_filter_apply": "Filter anwenden", "search_filter_apply": "Filter anwenden",
@ -449,11 +455,11 @@
"setting_notifications_notify_never": "niemals", "setting_notifications_notify_never": "niemals",
"setting_notifications_notify_seconds": "{} Sekunden", "setting_notifications_notify_seconds": "{} Sekunden",
"setting_notifications_single_progress_subtitle": "Detaillierter Upload-Fortschritt für jedes Element.", "setting_notifications_single_progress_subtitle": "Detaillierter Upload-Fortschritt für jedes Element.",
"setting_notifications_single_progress_title": "Zeige detaillierten Fortschritt bei der Hintergrundsicherung", "setting_notifications_single_progress_title": "Zeige den detaillierten Fortschritt der Hintergrundsicherung",
"setting_notifications_subtitle": "Benachrichtigungen anpassen", "setting_notifications_subtitle": "Benachrichtigungen anpassen",
"setting_notifications_title": "Benachrichtigungen", "setting_notifications_title": "Benachrichtigungen",
"setting_notifications_total_progress_subtitle": "Gesamter Upload-Fortschritt (abgeschlossen/Anzahl Elemente)", "setting_notifications_total_progress_subtitle": "Gesamter Upload-Fortschritt (abgeschlossen/Anzahl Elemente)",
"setting_notifications_total_progress_title": "Zeige Gesamtfortschritt bei der Hintergrundsicherung", "setting_notifications_total_progress_title": "Zeige den Gesamtfortschritt der Hintergrundsicherung",
"setting_pages_app_bar_settings": "Einstellungen", "setting_pages_app_bar_settings": "Einstellungen",
"settings_require_restart": "Bitte starte Immich neu, um diese Einstellung anzuwenden.", "settings_require_restart": "Bitte starte Immich neu, um diese Einstellung anzuwenden.",
"setting_video_viewer_looping_subtitle": "Aktiviere diese Option, um ein Video in der Detailansicht automatisch in einer Schleife anzuzeigen.", "setting_video_viewer_looping_subtitle": "Aktiviere diese Option, um ein Video in der Detailansicht automatisch in einer Schleife anzuzeigen.",
@ -529,18 +535,22 @@
"sharing_silver_appbar_create_shared_album": "Neues geteiltes Album", "sharing_silver_appbar_create_shared_album": "Neues geteiltes Album",
"sharing_silver_appbar_shared_links": "Geteilte Links", "sharing_silver_appbar_shared_links": "Geteilte Links",
"sharing_silver_appbar_share_partner": "Mit Partner teilen", "sharing_silver_appbar_share_partner": "Mit Partner teilen",
"sync": "Synchronisieren",
"sync_albums": "Alben synchronisieren",
"sync_albums_manual_subtitle": "Synchronisiere alle hochgeladenen Videos und Fotos in die ausgewählten Backup-Alben",
"sync_upload_album_setting_subtitle": "Erstelle deine ausgewählten Alben in Immich und lade die Fotos und Videos dort hoch",
"tab_controller_nav_library": "Bibliothek", "tab_controller_nav_library": "Bibliothek",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Suche", "tab_controller_nav_search": "Suche",
"tab_controller_nav_sharing": "Teilen", "tab_controller_nav_sharing": "Teilen",
"theme_setting_asset_list_storage_indicator_title": "Zeige Sicherungsstatus auf Vorschaubild", "theme_setting_asset_list_storage_indicator_title": "Forschrittsbalken der Sicherung auf dem Vorschaubild",
"theme_setting_asset_list_tiles_per_row_title": "Anzahl der Elemente pro Reihe ({})", "theme_setting_asset_list_tiles_per_row_title": "Anzahl der Elemente pro Reihe ({})",
"theme_setting_colorful_interface_subtitle": "Primärfarbe auf Hintergrundflächen verwenden", "theme_setting_colorful_interface_subtitle": "Primärfarbe auf App-Hintergrund anwenden",
"theme_setting_colorful_interface_title": "Bunte Oberfläche ", "theme_setting_colorful_interface_title": "Farbige UI-Oberfläche",
"theme_setting_dark_mode_switch": "Dunkler Modus", "theme_setting_dark_mode_switch": "Dunkler Modus",
"theme_setting_image_viewer_quality_subtitle": "Einstellen der Qualität des Detailbildbetrachters", "theme_setting_image_viewer_quality_subtitle": "Einstellen der Qualität des Detailbildbetrachters",
"theme_setting_image_viewer_quality_title": "Qualität des Bildbetrachters", "theme_setting_image_viewer_quality_title": "Qualität des Bildbetrachters",
"theme_setting_primary_color_subtitle": "Wähle eine Farbe für primäre Aktionen und Akzente", "theme_setting_primary_color_subtitle": "Farbauswahl für primäre Aktionen und Akzente",
"theme_setting_primary_color_title": "Primärfarbe", "theme_setting_primary_color_title": "Primärfarbe",
"theme_setting_system_primary_color_title": "Systemfarbe verwenden", "theme_setting_system_primary_color_title": "Systemfarbe verwenden",
"theme_setting_system_theme_switch": "Automatisch (Systemeinstellung)", "theme_setting_system_theme_switch": "Automatisch (Systemeinstellung)",
@ -549,7 +559,7 @@
"theme_setting_three_stage_loading_subtitle": "Das dreistufige Ladeverfahren kann die Performance beim Laden verbessern, erhöht allerdings den Datenverbrauch deutlich", "theme_setting_three_stage_loading_subtitle": "Das dreistufige Ladeverfahren kann die Performance beim Laden verbessern, erhöht allerdings den Datenverbrauch deutlich",
"theme_setting_three_stage_loading_title": "Dreistufiges Laden aktivieren", "theme_setting_three_stage_loading_title": "Dreistufiges Laden aktivieren",
"translated_text_options": "Optionen", "translated_text_options": "Optionen",
"trash_emptied": "Emptied trash", "trash_emptied": "Geleerter Papierkorb",
"trash_page_delete": "Löschen", "trash_page_delete": "Löschen",
"trash_page_delete_all": "Alle löschen", "trash_page_delete_all": "Alle löschen",
"trash_page_empty_trash_btn": "Papierkorb leeren", "trash_page_empty_trash_btn": "Papierkorb leeren",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Διαγραφή", "control_bottom_app_bar_delete": "Διαγραφή",
"control_bottom_app_bar_delete_from_immich": "Διαγραφή από το Immich", "control_bottom_app_bar_delete_from_immich": "Διαγραφή από το Immich",
"control_bottom_app_bar_delete_from_local": "Διαγραφή από τη συσκευή", "control_bottom_app_bar_delete_from_local": "Διαγραφή από τη συσκευή",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Επεξεργασία Τοποθεσίας", "control_bottom_app_bar_edit_location": "Επεξεργασία Τοποθεσίας",
"control_bottom_app_bar_edit_time": "Επεξεργασία Ημερομηνίας & Ώρας", "control_bottom_app_bar_edit_time": "Επεξεργασία Ημερομηνίας & Ώρας",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Κοινοποίηση", "create_shared_album_page_share": "Κοινοποίηση",
"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": "Επιλέξτε Φωτογραφίες",
"crop": "Crop",
"curated_location_page_title": "Τοποθεσίες", "curated_location_page_title": "Τοποθεσίες",
"curated_object_page_title": "Πράγματα", "curated_object_page_title": "Πράγματα",
"daily_title_text_date": "Ε, MMM dd", "daily_title_text_date": "Ε, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Σφάλμα κατά την ενημέρωση της περιγραφής, ελέγξτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες", "description_input_submit_error": "Σφάλμα κατά την ενημέρωση της περιγραφής, ελέγξτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες",
"edit_date_time_dialog_date_time": "Ημερομηνία και Ώρα", "edit_date_time_dialog_date_time": "Ημερομηνία και Ώρα",
"edit_date_time_dialog_timezone": "Ζώνη ώρας", "edit_date_time_dialog_timezone": "Ζώνη ώρας",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Τοποθεσία", "edit_location_dialog_title": "Τοποθεσία",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Προσθήκη Περιγραφής...", "exif_bottom_sheet_description": "Προσθήκη Περιγραφής...",
"exif_bottom_sheet_details": "ΛΕΠΤΟΜΕΡΕΙΕΣ", "exif_bottom_sheet_details": "ΛΕΠΤΟΜΕΡΕΙΕΣ",
"exif_bottom_sheet_location": "ΤΟΠΟΘΕΣΙΑ", "exif_bottom_sheet_location": "ΤΟΠΟΘΕΣΙΑ",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).", "home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Download Error", "image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download Success", "image_viewer_page_state_provider_download_success": "Download Success",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Sign Out", "profile_drawer_sign_out": "Sign Out",
"profile_drawer_trash": "Trash", "profile_drawer_trash": "Trash",
"recently_added_page_title": "Recently Added", "recently_added_page_title": "Recently Added",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Search your photos", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "New shared album", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_shared_links": "Shared links", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Share with partner", "sharing_silver_appbar_share_partner": "Share with partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Search", "tab_controller_nav_search": "Search",

View File

@ -55,13 +55,13 @@
"asset_list_settings_subtitle": "Photo grid layout settings", "asset_list_settings_subtitle": "Photo grid layout settings",
"asset_list_settings_title": "Photo Grid", "asset_list_settings_title": "Photo Grid",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Asset restored successfully",
"asset_viewer_settings_title": "Asset Viewer",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} asset(s) deleted permanently",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} asset(s) restored successfully",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} asset(s) trashed",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} asset(s) trashed from the Immich server",
"asset_viewer_settings_title": "Asset Viewer",
"backup_album_selection_page_albums_device": "Albums on device ({})", "backup_album_selection_page_albums_device": "Albums on device ({})",
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude", "backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.", "backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
@ -190,6 +190,7 @@
"create_shared_album_page_share": "Share", "create_shared_album_page_share": "Share",
"create_shared_album_page_share_add_assets": "ADD ASSETS", "create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos", "create_shared_album_page_share_select_photos": "Select Photos",
"crop": "Crop",
"curated_location_page_title": "Places", "curated_location_page_title": "Places",
"curated_object_page_title": "Things", "curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -211,7 +212,9 @@
"description_input_submit_error": "Error updating description, check the log for more details", "description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Add Description...", "exif_bottom_sheet_description": "Add Description...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION", "exif_bottom_sheet_location": "LOCATION",
@ -248,6 +251,7 @@
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).", "home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Download Error", "image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download Success", "image_viewer_page_state_provider_download_success": "Download Success",
@ -376,6 +380,7 @@
"profile_drawer_sign_out": "Sign Out", "profile_drawer_sign_out": "Sign Out",
"profile_drawer_trash": "Trash", "profile_drawer_trash": "Trash",
"recently_added_page_title": "Recently Added", "recently_added_page_title": "Recently Added",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Search your photos", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -456,18 +461,15 @@
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)", "setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_total_progress_title": "Show background backup total progress", "setting_notifications_total_progress_title": "Show background backup total progress",
"setting_pages_app_bar_settings": "Settings", "setting_pages_app_bar_settings": "Settings",
"settings_require_restart": "Please restart Immich to apply this setting",
"setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.", "setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.",
"setting_video_viewer_looping_title": "Looping", "setting_video_viewer_looping_title": "Looping",
"setting_video_viewer_title": "Videos", "setting_video_viewer_title": "Videos",
"settings_require_restart": "Please restart Immich to apply this setting",
"share_add": "Add", "share_add": "Add",
"share_add_photos": "Add photos", "share_add_photos": "Add photos",
"share_add_title": "Add a title", "share_add_title": "Add a title",
"share_assets_selected": "{} selected", "share_assets_selected": "{} selected",
"share_create_album": "Create album", "share_create_album": "Create album",
"share_dialog_preparing": "Preparing...",
"share_done": "Done",
"share_invite": "Invite to album",
"shared_album_activities_input_disable": "Comment is disabled", "shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_hint": "Say something", "shared_album_activities_input_hint": "Say something",
"shared_album_activity_remove_content": "Do you want to delete this activity?", "shared_album_activity_remove_content": "Do you want to delete this activity?",
@ -479,6 +481,7 @@
"shared_album_section_people_action_remove_user": "Remove user from album", "shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner", "shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE", "shared_album_section_people_title": "PEOPLE",
"share_dialog_preparing": "Preparing...",
"shared_link_app_bar_title": "Shared Links", "shared_link_app_bar_title": "Shared Links",
"shared_link_clipboard_copied_massage": "Copied to clipboard", "shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}", "shared_link_clipboard_text": "Link: {}\nPassword: {}",
@ -524,12 +527,18 @@
"shared_link_info_chip_upload": "Upload", "shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Manage Shared links", "shared_link_manage_links": "Manage Shared links",
"shared_link_public_album": "Public album", "shared_link_public_album": "Public album",
"share_done": "Done",
"share_invite": "Invite to album",
"sharing_page_album": "Shared albums", "sharing_page_album": "Shared albums",
"sharing_page_description": "Create shared albums to share photos and videos with people in your network.", "sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
"sharing_page_empty_list": "EMPTY LIST", "sharing_page_empty_list": "EMPTY LIST",
"sharing_silver_appbar_create_shared_album": "New shared album", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_share_partner": "Share with partner",
"sharing_silver_appbar_shared_links": "Shared links", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Share with partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Search", "tab_controller_nav_search": "Search",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Eliminar", "control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_delete_from_immich": "Borrar de Immich", "control_bottom_app_bar_delete_from_immich": "Borrar de Immich",
"control_bottom_app_bar_delete_from_local": "Borrar del dispositivo", "control_bottom_app_bar_delete_from_local": "Borrar del dispositivo",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Editar ubicación", "control_bottom_app_bar_edit_location": "Editar ubicación",
"control_bottom_app_bar_edit_time": "Editar fecha y hora", "control_bottom_app_bar_edit_time": "Editar fecha y hora",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Compartir", "create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AGREGAR ELEMENTOS", "create_shared_album_page_share_add_assets": "AGREGAR ELEMENTOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos", "create_shared_album_page_share_select_photos": "Seleccionar Fotos",
"crop": "Crop",
"curated_location_page_title": "Lugares", "curated_location_page_title": "Lugares",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
"daily_title_text_date": "E dd, MMM", "daily_title_text_date": "E dd, MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles", "description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"edit_date_time_dialog_date_time": "Fecha y Hora", "edit_date_time_dialog_date_time": "Fecha y Hora",
"edit_date_time_dialog_timezone": "Zona horaria", "edit_date_time_dialog_timezone": "Zona horaria",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Ubicación", "edit_location_dialog_title": "Ubicación",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Agregar Descripción...", "exif_bottom_sheet_description": "Agregar Descripción...",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN", "exif_bottom_sheet_location": "UBICACIÓN",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.", "home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.",
"home_page_share_err_local": "No se pueden compartir elementos locales a través de un enlace, omitiendo", "home_page_share_err_local": "No se pueden compartir elementos locales a través de un enlace, omitiendo",
"home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo", "home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Error de descarga", "image_viewer_page_state_provider_download_error": "Error de descarga",
"image_viewer_page_state_provider_download_started": "Descarga Iniciada", "image_viewer_page_state_provider_download_started": "Descarga Iniciada",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Cerrar Sesión", "profile_drawer_sign_out": "Cerrar Sesión",
"profile_drawer_trash": "Papelera", "profile_drawer_trash": "Papelera",
"recently_added_page_title": "Recién Agregadas", "recently_added_page_title": "Recién Agregadas",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Ha ocurrido un error", "scaffold_body_error_occurred": "Ha ocurrido un error",
"search_bar_hint": "Busca tus fotos", "search_bar_hint": "Busca tus fotos",
"search_filter_apply": "Aplicar filtros", "search_filter_apply": "Aplicar filtros",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Crear un álbum compartido", "sharing_silver_appbar_create_shared_album": "Crear un álbum compartido",
"sharing_silver_appbar_shared_links": "Enlaces compartidos", "sharing_silver_appbar_shared_links": "Enlaces compartidos",
"sharing_silver_appbar_share_partner": "Compartir con el compañero", "sharing_silver_appbar_share_partner": "Compartir con el compañero",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Biblioteca", "tab_controller_nav_library": "Biblioteca",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Buscar", "tab_controller_nav_search": "Buscar",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Eliminar", "control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Compartir", "create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AGREGAR ARCHIVOS", "create_shared_album_page_share_add_assets": "AGREGAR ARCHIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar fotos", "create_shared_album_page_share_select_photos": "Seleccionar fotos",
"crop": "Crop",
"curated_location_page_title": "Lugares", "curated_location_page_title": "Lugares",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles", "description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Agregar Descripción...", "exif_bottom_sheet_description": "Agregar Descripción...",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN", "exif_bottom_sheet_location": "UBICACIÓN",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.", "home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.",
"home_page_share_err_local": "No se pueden compartir activos locales a través de un enlace, omitiendo", "home_page_share_err_local": "No se pueden compartir activos locales a través de un enlace, omitiendo",
"home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo", "home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Error de descarga", "image_viewer_page_state_provider_download_error": "Error de descarga",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Cerrar sesión", "profile_drawer_sign_out": "Cerrar sesión",
"profile_drawer_trash": "Papelera", "profile_drawer_trash": "Papelera",
"recently_added_page_title": "Recién Agregadas", "recently_added_page_title": "Recién Agregadas",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Busca tus fotos", "search_bar_hint": "Busca tus fotos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Crear álbum compartido", "sharing_silver_appbar_create_shared_album": "Crear álbum compartido",
"sharing_silver_appbar_shared_links": "Enlaces compartidos", "sharing_silver_appbar_shared_links": "Enlaces compartidos",
"sharing_silver_appbar_share_partner": "Compartir con compañero", "sharing_silver_appbar_share_partner": "Compartir con compañero",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Biblioteca", "tab_controller_nav_library": "Biblioteca",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Buscar", "tab_controller_nav_search": "Buscar",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Eliminar", "control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Compartir", "create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AGREGAR ARCHIVOS", "create_shared_album_page_share_add_assets": "AGREGAR ARCHIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar fotos", "create_shared_album_page_share_select_photos": "Seleccionar fotos",
"crop": "Crop",
"curated_location_page_title": "Lugares", "curated_location_page_title": "Lugares",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles", "description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Agregar Descripción...", "exif_bottom_sheet_description": "Agregar Descripción...",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN", "exif_bottom_sheet_location": "UBICACIÓN",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.", "home_page_first_time_notice": "Si esta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.",
"home_page_share_err_local": "No se pueden compartir activos locales a través de un enlace, omitiendo", "home_page_share_err_local": "No se pueden compartir activos locales a través de un enlace, omitiendo",
"home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo", "home_page_upload_err_limit": "Solo se pueden subir 30 elementos simultáneamente, omitiendo",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Error de descarga", "image_viewer_page_state_provider_download_error": "Error de descarga",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Cerrar sesión", "profile_drawer_sign_out": "Cerrar sesión",
"profile_drawer_trash": "Papelera", "profile_drawer_trash": "Papelera",
"recently_added_page_title": "Recién Agregadas", "recently_added_page_title": "Recién Agregadas",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Busca tus fotos", "search_bar_hint": "Busca tus fotos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Crear álbum compartido", "sharing_silver_appbar_create_shared_album": "Crear álbum compartido",
"sharing_silver_appbar_shared_links": "Enlaces compartidos", "sharing_silver_appbar_shared_links": "Enlaces compartidos",
"sharing_silver_appbar_share_partner": "Compartir con compañero", "sharing_silver_appbar_share_partner": "Compartir con compañero",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Biblioteca", "tab_controller_nav_library": "Biblioteca",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Buscar", "tab_controller_nav_search": "Buscar",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Eliminar", "control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Compartir", "create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AGREGAR RECURSOS", "create_shared_album_page_share_add_assets": "AGREGAR RECURSOS",
"create_shared_album_page_share_select_photos": "Seleccionar fotos", "create_shared_album_page_share_select_photos": "Seleccionar fotos",
"crop": "Crop",
"curated_location_page_title": "Lugares", "curated_location_page_title": "Lugares",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles", "description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Agregar Descripción...", "exif_bottom_sheet_description": "Agregar Descripción...",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN", "exif_bottom_sheet_location": "UBICACIÓN",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Si ésta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.", "home_page_first_time_notice": "Si ésta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.",
"home_page_share_err_local": "No se pueden compartir activos locales a través de un enlace, omitiendo", "home_page_share_err_local": "No se pueden compartir activos locales a través de un enlace, omitiendo",
"home_page_upload_err_limit": "Sólo se pueden subir un máximo de 30 recursos a la vez, omitiendo", "home_page_upload_err_limit": "Sólo se pueden subir un máximo de 30 recursos a la vez, omitiendo",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Error de descarga", "image_viewer_page_state_provider_download_error": "Error de descarga",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Cerrar sesión", "profile_drawer_sign_out": "Cerrar sesión",
"profile_drawer_trash": "Papelera", "profile_drawer_trash": "Papelera",
"recently_added_page_title": "Recién Agregados", "recently_added_page_title": "Recién Agregados",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Busca tus fotos", "search_bar_hint": "Busca tus fotos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Crear álbum compartido", "sharing_silver_appbar_create_shared_album": "Crear álbum compartido",
"sharing_silver_appbar_shared_links": "Enlaces compartidos", "sharing_silver_appbar_shared_links": "Enlaces compartidos",
"sharing_silver_appbar_share_partner": "Compartir con compañero", "sharing_silver_appbar_share_partner": "Compartir con compañero",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Biblioteca", "tab_controller_nav_library": "Biblioteca",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Buscar", "tab_controller_nav_search": "Buscar",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Poista", "control_bottom_app_bar_delete": "Poista",
"control_bottom_app_bar_delete_from_immich": "Poista Immichistä", "control_bottom_app_bar_delete_from_immich": "Poista Immichistä",
"control_bottom_app_bar_delete_from_local": "Poista laitteelta", "control_bottom_app_bar_delete_from_local": "Poista laitteelta",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Muokkaa sijaintia", "control_bottom_app_bar_edit_location": "Muokkaa sijaintia",
"control_bottom_app_bar_edit_time": "Muokkaa aikaa", "control_bottom_app_bar_edit_time": "Muokkaa aikaa",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Jaa", "create_shared_album_page_share": "Jaa",
"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",
"crop": "Crop",
"curated_location_page_title": "Paikat", "curated_location_page_title": "Paikat",
"curated_object_page_title": "Asiat", "curated_object_page_title": "Asiat",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Virhe kuvauksen päivittämisessä, tarkista lisätiedot lokista", "description_input_submit_error": "Virhe kuvauksen päivittämisessä, tarkista lisätiedot lokista",
"edit_date_time_dialog_date_time": "Päivämäärä ja aika", "edit_date_time_dialog_date_time": "Päivämäärä ja aika",
"edit_date_time_dialog_timezone": "Aikavyöhyke", "edit_date_time_dialog_timezone": "Aikavyöhyke",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Sijainti", "edit_location_dialog_title": "Sijainti",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Lisää kuvaus…", "exif_bottom_sheet_description": "Lisää kuvaus…",
"exif_bottom_sheet_details": "TIEDOT", "exif_bottom_sheet_details": "TIEDOT",
"exif_bottom_sheet_location": "SIJAINTI", "exif_bottom_sheet_location": "SIJAINTI",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Jos käytät sovellusta ensimmäistä kertaa, muista valita varmuuskopioitavat albumi(t), jotta aikajanalla voi olla kuvia ja videoita.", "home_page_first_time_notice": "Jos käytät sovellusta ensimmäistä kertaa, muista valita varmuuskopioitavat albumi(t), jotta aikajanalla voi olla kuvia ja videoita.",
"home_page_share_err_local": "Paikallisia kohteita ei voitu jakaa linkkien avulla. Hypätään yli", "home_page_share_err_local": "Paikallisia kohteita ei voitu jakaa linkkien avulla. Hypätään yli",
"home_page_upload_err_limit": "Voit lähettää palvelimelle enintään 30 kohdetta kerrallaan, ohitetaan", "home_page_upload_err_limit": "Voit lähettää palvelimelle enintään 30 kohdetta kerrallaan, ohitetaan",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Lataus epäonnistui", "image_viewer_page_state_provider_download_error": "Lataus epäonnistui",
"image_viewer_page_state_provider_download_started": "Lataaminen aloitettu", "image_viewer_page_state_provider_download_started": "Lataaminen aloitettu",
"image_viewer_page_state_provider_download_success": "Lataus onnistui", "image_viewer_page_state_provider_download_success": "Lataus onnistui",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Kirjaudu ulos", "profile_drawer_sign_out": "Kirjaudu ulos",
"profile_drawer_trash": "Roskakori", "profile_drawer_trash": "Roskakori",
"recently_added_page_title": "Viimeksi lisätyt", "recently_added_page_title": "Viimeksi lisätyt",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Tapahtui virhe", "scaffold_body_error_occurred": "Tapahtui virhe",
"search_bar_hint": "Etsi kuvia", "search_bar_hint": "Etsi kuvia",
"search_filter_apply": "Käytä", "search_filter_apply": "Käytä",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Luo jaettu albumi", "sharing_silver_appbar_create_shared_album": "Luo jaettu albumi",
"sharing_silver_appbar_shared_links": "Jaetut linkit", "sharing_silver_appbar_shared_links": "Jaetut linkit",
"sharing_silver_appbar_share_partner": "Jaa kumppanille", "sharing_silver_appbar_share_partner": "Jaa kumppanille",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Kirjasto", "tab_controller_nav_library": "Kirjasto",
"tab_controller_nav_photos": "Kuvat", "tab_controller_nav_photos": "Kuvat",
"tab_controller_nav_search": "Haku", "tab_controller_nav_search": "Haku",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Supprimer", "control_bottom_app_bar_delete": "Supprimer",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Partager", "create_shared_album_page_share": "Partager",
"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",
"crop": "Crop",
"curated_location_page_title": "Places", "curated_location_page_title": "Places",
"curated_object_page_title": "Objets", "curated_object_page_title": "Objets",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Erreur de mise à jour de la description, vérifier le journal pour plus de détails", "description_input_submit_error": "Erreur de mise à jour de la description, vérifier le journal pour plus de détails",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Ajouter une description...", "exif_bottom_sheet_description": "Ajouter une description...",
"exif_bottom_sheet_details": "DÉTAILS", "exif_bottom_sheet_details": "DÉTAILS",
"exif_bottom_sheet_location": "LOCALISATION", "exif_bottom_sheet_location": "LOCALISATION",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums.", "home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums.",
"home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Limite de téléchargement de 30 éléments en même temps, demande ignorée", "home_page_upload_err_limit": "Limite de téléchargement de 30 éléments en même temps, demande ignorée",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Erreur de téléchargement", "image_viewer_page_state_provider_download_error": "Erreur de téléchargement",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Téléchargement réussi", "image_viewer_page_state_provider_download_success": "Téléchargement réussi",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Se déconnecter", "profile_drawer_sign_out": "Se déconnecter",
"profile_drawer_trash": "Corbeille", "profile_drawer_trash": "Corbeille",
"recently_added_page_title": "Récemment ajouté", "recently_added_page_title": "Récemment ajouté",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Rechercher vos photos", "search_bar_hint": "Rechercher vos photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Créer un album partagé", "sharing_silver_appbar_create_shared_album": "Créer un album partagé",
"sharing_silver_appbar_shared_links": "Liens partagés", "sharing_silver_appbar_shared_links": "Liens partagés",
"sharing_silver_appbar_share_partner": "Partager avec un partenaire", "sharing_silver_appbar_share_partner": "Partager avec un partenaire",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Bibliothèque", "tab_controller_nav_library": "Bibliothèque",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Recherche", "tab_controller_nav_search": "Recherche",

View File

@ -3,16 +3,16 @@
"action_common_cancel": "Annuler", "action_common_cancel": "Annuler",
"action_common_clear": "Vider", "action_common_clear": "Vider",
"action_common_confirm": "Confirmer", "action_common_confirm": "Confirmer",
"action_common_save": "Save", "action_common_save": "Sauvegarder",
"action_common_select": "Select", "action_common_select": "Sélectionner",
"action_common_update": "Mise à jour", "action_common_update": "Mise à jour",
"add_to_album_bottom_sheet_added": "Ajouté à {album}", "add_to_album_bottom_sheet_added": "Ajouté à {album}",
"add_to_album_bottom_sheet_already_exists": "Déjà dans {album}", "add_to_album_bottom_sheet_already_exists": "Déjà dans {album}",
"advanced_settings_log_level_title": "Log level: {}", "advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Certains appareils sont terriblement lents à charger des miniatures à partir de ressources présentes sur l'appareil. Activez ce paramètre pour charger des images distantes à la place.", "advanced_settings_prefer_remote_subtitle": "Certains appareils sont terriblement lents à charger des miniatures à partir de ressources présentes sur l'appareil. Activez ce paramètre pour charger des images distantes à la place.",
"advanced_settings_prefer_remote_title": "Préférer les images distantes", "advanced_settings_prefer_remote_title": "Préférer les images distantes",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Ajoutez des en-têtes personnalisés à chaque requête réseau",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "En-têtes de proxy",
"advanced_settings_self_signed_ssl_subtitle": "Permet d'ignorer la vérification du certificat SSL pour le point d'extrémité du serveur. Requis pour les certificats auto-signés.", "advanced_settings_self_signed_ssl_subtitle": "Permet d'ignorer la vérification du certificat SSL pour le point d'extrémité du serveur. Requis pour les certificats auto-signés.",
"advanced_settings_self_signed_ssl_title": "Autoriser les certificats SSL auto-signés", "advanced_settings_self_signed_ssl_title": "Autoriser les certificats SSL auto-signés",
"advanced_settings_tile_subtitle": "Paramètres d'utilisateur avancés", "advanced_settings_tile_subtitle": "Paramètres d'utilisateur avancés",
@ -26,7 +26,7 @@
"album_thumbnail_card_shared": " · Partagé", "album_thumbnail_card_shared": " · Partagé",
"album_thumbnail_owned": "Possédé", "album_thumbnail_owned": "Possédé",
"album_thumbnail_shared_by": "Partagé par {}", "album_thumbnail_shared_by": "Partagé par {}",
"album_viewer_appbar_delete_confirm": "Êtes-vous sur de vouloir supprimer cet album de votre compte?", "album_viewer_appbar_delete_confirm": "Êtes-vous sur de vouloir supprimer cet album de votre compte ?",
"album_viewer_appbar_share_delete": "Supprimer l'album", "album_viewer_appbar_share_delete": "Supprimer l'album",
"album_viewer_appbar_share_err_delete": "Échec de la suppression de l'album", "album_viewer_appbar_share_err_delete": "Échec de la suppression de l'album",
"album_viewer_appbar_share_err_leave": "Impossible de quitter l'album", "album_viewer_appbar_share_err_leave": "Impossible de quitter l'album",
@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "Disposition", "asset_list_layout_sub_title": "Disposition",
"asset_list_settings_subtitle": "Paramètres de disposition de la grille de photos", "asset_list_settings_subtitle": "Paramètres de disposition de la grille de photos",
"asset_list_settings_title": "Grille de photos", "asset_list_settings_title": "Grille de photos",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Élément restauré avec succès",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} élément(s) supprimé(s) définitivement",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} élément(s) supprimé(s) définitivement du serveur Immich",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "\"{} élément(s) supprimé(s) définitivement de votre appareil",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "Élément restauré avec succès",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} élément(s) déplacé(s) vers la corbeill",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} élément(s) déplacé(s) vers la corbeille du serveur Immich",
"asset_viewer_settings_title": "Visualisateur d'éléments", "asset_viewer_settings_title": "Visualisateur d'éléments",
"backup_album_selection_page_albums_device": "Albums sur l'appareil ({})", "backup_album_selection_page_albums_device": "Albums sur l'appareil ({})",
"backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure", "backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure",
@ -150,21 +150,21 @@
"change_password_form_new_password": "Nouveau mot de passe", "change_password_form_new_password": "Nouveau mot de passe",
"change_password_form_password_mismatch": "Les mots de passe ne correspondent pas", "change_password_form_password_mismatch": "Les mots de passe ne correspondent pas",
"change_password_form_reenter_new_password": "Saisissez à nouveau le nouveau mot de passe", "change_password_form_reenter_new_password": "Saisissez à nouveau le nouveau mot de passe",
"client_cert_dialog_msg_confirm": "OK", "client_cert_dialog_msg_confirm": "Ok",
"client_cert_enter_password": "Enter Password", "client_cert_enter_password": "Entrer mot de passe",
"client_cert_import": "Import", "client_cert_import": "Imorted",
"client_cert_import_success_msg": "Client certificate is imported", "client_cert_import_success_msg": "Certificat importé",
"client_cert_invalid_msg": "Invalid certificate file or wrong password", "client_cert_invalid_msg": "Fichier de certificat invalide ou mot de passe incorrect",
"client_cert_remove": "Remove", "client_cert_remove": "Supprimer",
"client_cert_remove_msg": "Client certificate is removed", "client_cert_remove_msg": "Certificat supprimé",
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login", "client_cert_subtitle": "Prend en charge uniquement le format PKCS12 (.p12, .pfx). L'importation/suppression de certificats n'est possible qu'avant la connexion",
"client_cert_title": "SSL Client Certificate", "client_cert_title": "Certificat SSL",
"common_add_to_album": "Ajouter à l'album", "common_add_to_album": "Ajouter à l'album",
"common_change_password": "Modifier le mot de passe", "common_change_password": "Modifier le mot de passe",
"common_create_new_album": "Créer un nouvel album", "common_create_new_album": "Créer un nouvel album",
"common_server_error": "Veuillez vérifier votre connexion réseau, vous assurer que le serveur est accessible et que les versions de l'application et du serveur sont compatibles.", "common_server_error": "Veuillez vérifier votre connexion réseau, vous assurer que le serveur est accessible et que les versions de l'application et du serveur sont compatibles.",
"common_shared": "Partagé", "common_shared": "Partagé",
"contextual_search": "Sunrise on the beach", "contextual_search": "Lever de soleil sur la plage",
"control_bottom_app_bar_add_to_album": "Ajouter à l'album", "control_bottom_app_bar_add_to_album": "Ajouter à l'album",
"control_bottom_app_bar_album_info": "{} éléments", "control_bottom_app_bar_album_info": "{} éléments",
"control_bottom_app_bar_album_info_shared": "{} éléments - Partagés", "control_bottom_app_bar_album_info_shared": "{} éléments - Partagés",
@ -173,7 +173,8 @@
"control_bottom_app_bar_delete": "Supprimer", "control_bottom_app_bar_delete": "Supprimer",
"control_bottom_app_bar_delete_from_immich": "Supprimer de Immich", "control_bottom_app_bar_delete_from_immich": "Supprimer de Immich",
"control_bottom_app_bar_delete_from_local": "Supprimer de l'appareil", "control_bottom_app_bar_delete_from_local": "Supprimer de l'appareil",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_download": "Télécharger",
"control_bottom_app_bar_edit": "Modifier",
"control_bottom_app_bar_edit_location": "Modifier la localisation", "control_bottom_app_bar_edit_location": "Modifier la localisation",
"control_bottom_app_bar_edit_time": "Modifier la date et l'heure", "control_bottom_app_bar_edit_time": "Modifier la date et l'heure",
"control_bottom_app_bar_favorite": "Favoris", "control_bottom_app_bar_favorite": "Favoris",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Partager", "create_shared_album_page_share": "Partager",
"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",
"crop": "Crop",
"curated_location_page_title": "Lieux", "curated_location_page_title": "Lieux",
"curated_object_page_title": "Objets", "curated_object_page_title": "Objets",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Erreur de mise à jour de la description, vérifier le journal pour plus de détails", "description_input_submit_error": "Erreur de mise à jour de la description, vérifier le journal pour plus de détails",
"edit_date_time_dialog_date_time": "Date et heure", "edit_date_time_dialog_date_time": "Date et heure",
"edit_date_time_dialog_timezone": "Fuseau horaire", "edit_date_time_dialog_timezone": "Fuseau horaire",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Localisation", "edit_location_dialog_title": "Localisation",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Ajouter une description…", "exif_bottom_sheet_description": "Ajouter une description…",
"exif_bottom_sheet_details": "DÉTAILS", "exif_bottom_sheet_details": "DÉTAILS",
"exif_bottom_sheet_location": "LOCALISATION", "exif_bottom_sheet_location": "LOCALISATION",
@ -223,11 +227,11 @@
"experimental_settings_title": "Expérimental", "experimental_settings_title": "Expérimental",
"favorites_page_no_favorites": "Aucun élément favori n'a été trouvé", "favorites_page_no_favorites": "Aucun élément favori n'a été trouvé",
"favorites_page_title": "Favoris", "favorites_page_title": "Favoris",
"filename_search": "File name or extension", "filename_search": "Nom de fichier ou extension",
"haptic_feedback_switch": "Activer le retour haptique", "haptic_feedback_switch": "Activer le retour haptique",
"haptic_feedback_title": "Retour haptique", "haptic_feedback_title": "Retour haptique",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Ajouter un en-tête",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Cette valeur ne peut pas être vide",
"header_settings_header_name_input": "Nom de l'en-tête", "header_settings_header_name_input": "Nom de l'en-tête",
"header_settings_header_value_input": "Valeur de l'en-tête", "header_settings_header_value_input": "Valeur de l'en-tête",
"header_settings_page_title": "En-têtes de proxy", "header_settings_page_title": "En-têtes de proxy",
@ -247,12 +251,13 @@
"home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums.", "home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums.",
"home_page_share_err_local": "Impossible de partager par lien les médias locaux, cette opération est donc ignorée.", "home_page_share_err_local": "Impossible de partager par lien les médias locaux, cette opération est donc ignorée.",
"home_page_upload_err_limit": "Limite de téléchargement de 30 éléments en même temps, demande ignorée", "home_page_upload_err_limit": "Limite de téléchargement de 30 éléments en même temps, demande ignorée",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Erreur de téléchargement", "image_viewer_page_state_provider_download_error": "Erreur de téléchargement",
"image_viewer_page_state_provider_download_started": "Téléchargement Démarré", "image_viewer_page_state_provider_download_started": "Téléchargement démarré",
"image_viewer_page_state_provider_download_success": "Téléchargement réussi", "image_viewer_page_state_provider_download_success": "Téléchargement réussi",
"image_viewer_page_state_provider_share_error": "Erreur de partage", "image_viewer_page_state_provider_share_error": "Erreur de partage",
"invalid_date": "Invalid date", "invalid_date": "Date invalide",
"invalid_date_format": "Invalid date format", "invalid_date_format": "Format de date invalide",
"library_page_albums": "Albums", "library_page_albums": "Albums",
"library_page_archive": "Archive", "library_page_archive": "Archive",
"library_page_device_albums": "Albums sur l'appareil", "library_page_device_albums": "Albums sur l'appareil",
@ -334,7 +339,7 @@
"multiselect_grid_edit_date_time_err_read_only": "Impossible de modifier la date d'un élément d'actif en lecture seule.", "multiselect_grid_edit_date_time_err_read_only": "Impossible de modifier la date d'un élément d'actif en lecture seule.",
"multiselect_grid_edit_gps_err_read_only": "Impossible de modifier l'emplacement d'un élément en lecture seule.", "multiselect_grid_edit_gps_err_read_only": "Impossible de modifier l'emplacement d'un élément en lecture seule.",
"no_assets_to_show": "Aucuns éléments à afficher", "no_assets_to_show": "Aucuns éléments à afficher",
"no_name": "No name", "no_name": "Sans nom",
"notification_permission_dialog_cancel": "Annuler", "notification_permission_dialog_cancel": "Annuler",
"notification_permission_dialog_content": "Pour activer les notifications, allez dans Paramètres et sélectionnez Autoriser.", "notification_permission_dialog_content": "Pour activer les notifications, allez dans Paramètres et sélectionnez Autoriser.",
"notification_permission_dialog_settings": "Paramètres", "notification_permission_dialog_settings": "Paramètres",
@ -369,39 +374,40 @@
"profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour", "profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour",
"profile_drawer_documentation": "Documentation", "profile_drawer_documentation": "Documentation",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version majeure..", "profile_drawer_server_out_of_date_major": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version majeure.",
"profile_drawer_server_out_of_date_minor": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version majeure.", "profile_drawer_server_out_of_date_minor": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version mineure.",
"profile_drawer_settings": "Paramètres", "profile_drawer_settings": "Paramètres",
"profile_drawer_sign_out": "Se déconnecter", "profile_drawer_sign_out": "Se déconnecter",
"profile_drawer_trash": "Corbeille", "profile_drawer_trash": "Corbeille",
"recently_added_page_title": "Récemment ajouté", "recently_added_page_title": "Récemment ajouté",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Une erreur s'est produite", "scaffold_body_error_occurred": "Une erreur s'est produite",
"search_bar_hint": "Rechercher vos photos", "search_bar_hint": "Rechercher vos photos",
"search_filter_apply": "Appliquer le filtre", "search_filter_apply": "Appliquer le filtre",
"search_filter_camera": "Camera", "search_filter_camera": "Appareil",
"search_filter_camera_make": "Fabricant", "search_filter_camera_make": "Fabricant",
"search_filter_camera_model": "Modéle", "search_filter_camera_model": "Modéle",
"search_filter_camera_title": "Select camera type", "search_filter_camera_title": "Sélectionner le type d'appareil",
"search_filter_date": "Date", "search_filter_date": "Date",
"search_filter_date_interval": "{start} to {end}", "search_filter_date_interval": "{start} à {end}",
"search_filter_date_title": "Select a date range", "search_filter_date_title": "Sélectionner une période",
"search_filter_display_option_archive": "Achive", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Favoris", "search_filter_display_option_favorite": "Favoris",
"search_filter_display_option_not_in_album": "Pas dans un album", "search_filter_display_option_not_in_album": "Pas dans un album",
"search_filter_display_options": "Display Options", "search_filter_display_options": "Options d'affichage",
"search_filter_display_options_title": "Display options", "search_filter_display_options_title": "Options d'affichage",
"search_filter_location": "Location", "search_filter_location": "Lieu",
"search_filter_location_city": "Ville", "search_filter_location_city": "Ville",
"search_filter_location_country": "Pays", "search_filter_location_country": "Pays",
"search_filter_location_state": "Région", "search_filter_location_state": "Région",
"search_filter_location_title": "Select location", "search_filter_location_title": "Sélectionner un lieu",
"search_filter_media_type": "Media Type", "search_filter_media_type": "Type de média",
"search_filter_media_type_all": "Tous", "search_filter_media_type_all": "Tous",
"search_filter_media_type_image": "Image", "search_filter_media_type_image": "Image",
"search_filter_media_type_title": "Select media type", "search_filter_media_type_title": "Sélectionner type de média",
"search_filter_media_type_video": "Vidéo", "search_filter_media_type_video": "Vidéo",
"search_filter_people": "People", "search_filter_people": "Personnes",
"search_filter_people_title": "Select people", "search_filter_people_title": "Sélectionner une personne",
"search_page_categories": "Catégories", "search_page_categories": "Catégories",
"search_page_favorites": "Favoris", "search_page_favorites": "Favoris",
"search_page_motion_photos": "Photos animées", "search_page_motion_photos": "Photos animées",
@ -529,27 +535,31 @@
"sharing_silver_appbar_create_shared_album": "Créer un album partagé", "sharing_silver_appbar_create_shared_album": "Créer un album partagé",
"sharing_silver_appbar_shared_links": "Liens partagés", "sharing_silver_appbar_shared_links": "Liens partagés",
"sharing_silver_appbar_share_partner": "Partager avec un partenaire", "sharing_silver_appbar_share_partner": "Partager avec un partenaire",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Bibliothèque", "tab_controller_nav_library": "Bibliothèque",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Recherche", "tab_controller_nav_search": "Recherche",
"tab_controller_nav_sharing": "Partage", "tab_controller_nav_sharing": "Partage",
"theme_setting_asset_list_storage_indicator_title": "Afficher l'indicateur de stockage sur les tuiles des éléments", "theme_setting_asset_list_storage_indicator_title": "Afficher l'indicateur de stockage sur les tuiles des éléments",
"theme_setting_asset_list_tiles_per_row_title": "Nombre d'éléments par ligne ({})", "theme_setting_asset_list_tiles_per_row_title": "Nombre d'éléments par ligne ({})",
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", "theme_setting_colorful_interface_subtitle": "Appliquer la couleur principale sur les surfaces d'arrière-plan.",
"theme_setting_colorful_interface_title": "Colorful interface", "theme_setting_colorful_interface_title": "Interface colorée",
"theme_setting_dark_mode_switch": "Mode sombre", "theme_setting_dark_mode_switch": "Mode sombre",
"theme_setting_image_viewer_quality_subtitle": "Ajustez la qualité de la visionneuse d'images détaillées", "theme_setting_image_viewer_quality_subtitle": "Ajustez la qualité de la visionneuse d'images détaillées",
"theme_setting_image_viewer_quality_title": "Qualité de la visualisation des images", "theme_setting_image_viewer_quality_title": "Qualité de la visualisation des images",
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.", "theme_setting_primary_color_subtitle": "Choisissez une couleur pour les actions principales et les accentuations.",
"theme_setting_primary_color_title": "Primary color", "theme_setting_primary_color_title": "Couleur principale",
"theme_setting_system_primary_color_title": "Use system color", "theme_setting_system_primary_color_title": "Utiliser la couleur du système",
"theme_setting_system_theme_switch": "Automatique (suivre les paramètres du système)", "theme_setting_system_theme_switch": "Automatique (suivre les paramètres du système)",
"theme_setting_theme_subtitle": "Choisissez le thème de l'application", "theme_setting_theme_subtitle": "Choisissez le thème de l'application",
"theme_setting_theme_title": "Thème", "theme_setting_theme_title": "Thème",
"theme_setting_three_stage_loading_subtitle": "Le chargement en trois étapes peut améliorer les performances de chargement, mais entraîne une augmentation significative de la charge du réseau.", "theme_setting_three_stage_loading_subtitle": "Le chargement en trois étapes peut améliorer les performances de chargement, mais entraîne une augmentation significative de la charge du réseau.",
"theme_setting_three_stage_loading_title": "Activer le chargement en trois étapes", "theme_setting_three_stage_loading_title": "Activer le chargement en trois étapes",
"translated_text_options": "Options", "translated_text_options": "Options",
"trash_emptied": "Emptied trash", "trash_emptied": "Corbeille vidée",
"trash_page_delete": "Supprimer", "trash_page_delete": "Supprimer",
"trash_page_delete_all": "Tout supprimer", "trash_page_delete_all": "Tout supprimer",
"trash_page_empty_trash_btn": "Vider la corbeille", "trash_page_empty_trash_btn": "Vider la corbeille",

View File

@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "פריסה", "asset_list_layout_sub_title": "פריסה",
"asset_list_settings_subtitle": "הגדרות תבנית רשת תמונות", "asset_list_settings_subtitle": "הגדרות תבנית רשת תמונות",
"asset_list_settings_title": "רשת תמונות", "asset_list_settings_title": "רשת תמונות",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "נכס שוחזר בהצלחה",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} נכס(ים) נמחקו לצמיתות",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} נכס(ים) נמחקו לצמיתות משרת ה-Immich",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} נכס(ים) נמחקו לצמיתות מהמכשיר שלך",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} נכס(ים) שוחזרו בהצלחה",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} נכס(ים) הועברו לאשפה",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} נכס(ים) הועברו לאשפה משרת ה-Immich",
"asset_viewer_settings_title": "מציג הנכסים", "asset_viewer_settings_title": "מציג הנכסים",
"backup_album_selection_page_albums_device": "אלבומים במכשיר ({})", "backup_album_selection_page_albums_device": "אלבומים במכשיר ({})",
"backup_album_selection_page_albums_tap": "הקש כדי לכלול, הקש פעמיים כדי להחריג", "backup_album_selection_page_albums_tap": "הקש כדי לכלול, הקש פעמיים כדי להחריג",
@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "מחק", "control_bottom_app_bar_delete": "מחק",
"control_bottom_app_bar_delete_from_immich": "מחק מהשרת", "control_bottom_app_bar_delete_from_immich": "מחק מהשרת",
"control_bottom_app_bar_delete_from_local": "מחק מהמכשיר", "control_bottom_app_bar_delete_from_local": "מחק מהמכשיר",
"control_bottom_app_bar_download": "הורדה",
"control_bottom_app_bar_edit": "עריכה", "control_bottom_app_bar_edit": "עריכה",
"control_bottom_app_bar_edit_location": "ערוך מיקום", "control_bottom_app_bar_edit_location": "ערוך מיקום",
"control_bottom_app_bar_edit_time": "ערוך תאריך & זמן", "control_bottom_app_bar_edit_time": "ערוך תאריך & זמן",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "שתף", "create_shared_album_page_share": "שתף",
"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": "בחירת תמונות",
"crop": "Crop",
"curated_location_page_title": "מקומות", "curated_location_page_title": "מקומות",
"curated_object_page_title": "דברים", "curated_object_page_title": "דברים",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "שגיאה בעדכון תיאור, בדוק את היומן לפרטים נוספים", "description_input_submit_error": "שגיאה בעדכון תיאור, בדוק את היומן לפרטים נוספים",
"edit_date_time_dialog_date_time": "תאריך וזמן", "edit_date_time_dialog_date_time": "תאריך וזמן",
"edit_date_time_dialog_timezone": "אזור זמן", "edit_date_time_dialog_timezone": "אזור זמן",
"edit_image_title": "Edit",
"edit_location_dialog_title": "מיקום", "edit_location_dialog_title": "מיקום",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "הוסף תיאור...", "exif_bottom_sheet_description": "הוסף תיאור...",
"exif_bottom_sheet_details": "פרטים", "exif_bottom_sheet_details": "פרטים",
"exif_bottom_sheet_location": "מיקום", "exif_bottom_sheet_location": "מיקום",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "אם זאת הפעם הראשונה שאת/ה משתמש/ת ביישום, נא להקפיד לבחור אלבומ(ים) לגיבוי כך שציר הזמן יוכל לאכלס תמונות וסרטונים באלבומ(ים)", "home_page_first_time_notice": "אם זאת הפעם הראשונה שאת/ה משתמש/ת ביישום, נא להקפיד לבחור אלבומ(ים) לגיבוי כך שציר הזמן יוכל לאכלס תמונות וסרטונים באלבומ(ים)",
"home_page_share_err_local": "לא ניתן לשתף נכסים מקומיים על ידי קישור, מדלג", "home_page_share_err_local": "לא ניתן לשתף נכסים מקומיים על ידי קישור, מדלג",
"home_page_upload_err_limit": "ניתן להעלות רק מקסימום של 30 נכסים בכל פעם, מדלג", "home_page_upload_err_limit": "ניתן להעלות רק מקסימום של 30 נכסים בכל פעם, מדלג",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "שגיאת הורדה", "image_viewer_page_state_provider_download_error": "שגיאת הורדה",
"image_viewer_page_state_provider_download_started": "ההורדה החלה", "image_viewer_page_state_provider_download_started": "ההורדה החלה",
"image_viewer_page_state_provider_download_success": "הצלחת הורדה", "image_viewer_page_state_provider_download_success": "הצלחת הורדה",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "יציאה", "profile_drawer_sign_out": "יציאה",
"profile_drawer_trash": "אשפה", "profile_drawer_trash": "אשפה",
"recently_added_page_title": "נוסף לאחרונה", "recently_added_page_title": "נוסף לאחרונה",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "אירעה שגיאה", "scaffold_body_error_occurred": "אירעה שגיאה",
"search_bar_hint": "חפש/י בתמונות שלך", "search_bar_hint": "חפש/י בתמונות שלך",
"search_filter_apply": "החל סינון", "search_filter_apply": "החל סינון",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "אלבום משותף חדש", "sharing_silver_appbar_create_shared_album": "אלבום משותף חדש",
"sharing_silver_appbar_shared_links": "קישורים משותפים", "sharing_silver_appbar_shared_links": "קישורים משותפים",
"sharing_silver_appbar_share_partner": "שיתוף עם שותף", "sharing_silver_appbar_share_partner": "שיתוף עם שותף",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "ספרייה", "tab_controller_nav_library": "ספרייה",
"tab_controller_nav_photos": "תמונות", "tab_controller_nav_photos": "תמונות",
"tab_controller_nav_search": "חיפוש", "tab_controller_nav_search": "חיפוש",
@ -549,7 +559,7 @@
"theme_setting_three_stage_loading_subtitle": "טעינה בשלושה שלבים עשויה לשפר את ביצועי הטעינה אבל גורמת באופן משמעותי לעומס רשת גבוה יותר", "theme_setting_three_stage_loading_subtitle": "טעינה בשלושה שלבים עשויה לשפר את ביצועי הטעינה אבל גורמת באופן משמעותי לעומס רשת גבוה יותר",
"theme_setting_three_stage_loading_title": "אפשר טעינה בשלושה שלבים", "theme_setting_three_stage_loading_title": "אפשר טעינה בשלושה שלבים",
"translated_text_options": "אפשרויות", "translated_text_options": "אפשרויות",
"trash_emptied": "Emptied trash", "trash_emptied": "האשפה רוקנה",
"trash_page_delete": "מחק", "trash_page_delete": "מחק",
"trash_page_delete_all": "מחק הכל", "trash_page_delete_all": "מחק הכל",
"trash_page_empty_trash_btn": "רוקן אשפה", "trash_page_empty_trash_btn": "רוקן אשפה",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Delete", "control_bottom_app_bar_delete": "Delete",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Share", "create_shared_album_page_share": "Share",
"create_shared_album_page_share_add_assets": "ADD ASSETS", "create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos", "create_shared_album_page_share_select_photos": "Select Photos",
"crop": "Crop",
"curated_location_page_title": "Places", "curated_location_page_title": "Places",
"curated_object_page_title": "Things", "curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error updating description, check the log for more details", "description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Add Description...", "exif_bottom_sheet_description": "Add Description...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION", "exif_bottom_sheet_location": "LOCATION",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).", "home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_share_err_local": "लोकल एसेट्स को लिंक के जरिए शेयर नहीं कर सकते, स्किप कर रहे हैं", "home_page_share_err_local": "लोकल एसेट्स को लिंक के जरिए शेयर नहीं कर सकते, स्किप कर रहे हैं",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Download Error", "image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download Success", "image_viewer_page_state_provider_download_success": "Download Success",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Sign Out", "profile_drawer_sign_out": "Sign Out",
"profile_drawer_trash": "Trash", "profile_drawer_trash": "Trash",
"recently_added_page_title": "Recently Added", "recently_added_page_title": "Recently Added",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Search your photos", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "New shared album", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_shared_links": "Shared links", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Share with partner", "sharing_silver_appbar_share_partner": "Share with partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Search", "tab_controller_nav_search": "Search",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Törlés", "control_bottom_app_bar_delete": "Törlés",
"control_bottom_app_bar_delete_from_immich": "Törlés az Immich-ből", "control_bottom_app_bar_delete_from_immich": "Törlés az Immich-ből",
"control_bottom_app_bar_delete_from_local": "Törlés az eszközről", "control_bottom_app_bar_delete_from_local": "Törlés az eszközről",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Hely Módosítása", "control_bottom_app_bar_edit_location": "Hely Módosítása",
"control_bottom_app_bar_edit_time": "Dátum és Idő Módosítása", "control_bottom_app_bar_edit_time": "Dátum és Idő Módosítása",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Megosztás", "create_shared_album_page_share": "Megosztás",
"create_shared_album_page_share_add_assets": "ELEMEK HOZZÁADÁSA", "create_shared_album_page_share_add_assets": "ELEMEK HOZZÁADÁSA",
"create_shared_album_page_share_select_photos": "Fotók választása", "create_shared_album_page_share_select_photos": "Fotók választása",
"crop": "Crop",
"curated_location_page_title": "Helyek", "curated_location_page_title": "Helyek",
"curated_object_page_title": "Dolgok", "curated_object_page_title": "Dolgok",
"daily_title_text_date": "MMM dd (E)", "daily_title_text_date": "MMM dd (E)",
@ -210,7 +212,9 @@
"description_input_submit_error": "Nem sikerült frissíteni a leírást. További információért kérjük, nézd meg az eseménynaplót", "description_input_submit_error": "Nem sikerült frissíteni a leírást. További információért kérjük, nézd meg az eseménynaplót",
"edit_date_time_dialog_date_time": "Dátum és Idő", "edit_date_time_dialog_date_time": "Dátum és Idő",
"edit_date_time_dialog_timezone": "Időzóna", "edit_date_time_dialog_timezone": "Időzóna",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Hely", "edit_location_dialog_title": "Hely",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Leírás Hozzáadása...", "exif_bottom_sheet_description": "Leírás Hozzáadása...",
"exif_bottom_sheet_details": "RÉSZLETEK", "exif_bottom_sheet_details": "RÉSZLETEK",
"exif_bottom_sheet_location": "HELY", "exif_bottom_sheet_location": "HELY",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Ha most használod először az alkalmazást, akkor ahhoz, hogy megjelenjenek a fotók és a videók az idővonaladon, állítsd be, hogy melyik albumaidról készüljön biztonsági mentés.", "home_page_first_time_notice": "Ha most használod először az alkalmazást, akkor ahhoz, hogy megjelenjenek a fotók és a videók az idővonaladon, állítsd be, hogy melyik albumaidról készüljön biztonsági mentés.",
"home_page_share_err_local": "Helyi elemekről nem lehet megosztási linket készíteni, úgyhogy kihagyjuk", "home_page_share_err_local": "Helyi elemekről nem lehet megosztási linket készíteni, úgyhogy kihagyjuk",
"home_page_upload_err_limit": "Csak 30 elemet tudsz egyszerre feltölteni, úgyhogy kihagyjuk", "home_page_upload_err_limit": "Csak 30 elemet tudsz egyszerre feltölteni, úgyhogy kihagyjuk",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Letöltési Hiba", "image_viewer_page_state_provider_download_error": "Letöltési Hiba",
"image_viewer_page_state_provider_download_started": "Letöltés Megkezdődött", "image_viewer_page_state_provider_download_started": "Letöltés Megkezdődött",
"image_viewer_page_state_provider_download_success": "Letöltés Sikeres", "image_viewer_page_state_provider_download_success": "Letöltés Sikeres",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Kijelentkezés", "profile_drawer_sign_out": "Kijelentkezés",
"profile_drawer_trash": "Lomtár", "profile_drawer_trash": "Lomtár",
"recently_added_page_title": "Nemrég Hozzáadott", "recently_added_page_title": "Nemrég Hozzáadott",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Hiba történt", "scaffold_body_error_occurred": "Hiba történt",
"search_bar_hint": "Fotók keresése", "search_bar_hint": "Fotók keresése",
"search_filter_apply": "Szűrő alkalmazása", "search_filter_apply": "Szűrő alkalmazása",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Új megosztott album", "sharing_silver_appbar_create_shared_album": "Új megosztott album",
"sharing_silver_appbar_shared_links": "Megosztási linkek", "sharing_silver_appbar_shared_links": "Megosztási linkek",
"sharing_silver_appbar_share_partner": "Megosztás partnerrel", "sharing_silver_appbar_share_partner": "Megosztás partnerrel",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Képtár", "tab_controller_nav_library": "Képtár",
"tab_controller_nav_photos": "Képek", "tab_controller_nav_photos": "Képek",
"tab_controller_nav_search": "Keresés", "tab_controller_nav_search": "Keresés",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Elimina", "control_bottom_app_bar_delete": "Elimina",
"control_bottom_app_bar_delete_from_immich": "Elimina da Immich", "control_bottom_app_bar_delete_from_immich": "Elimina da Immich",
"control_bottom_app_bar_delete_from_local": "Elimina dal dispositivo", "control_bottom_app_bar_delete_from_local": "Elimina dal dispositivo",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Modifica posizione", "control_bottom_app_bar_edit_location": "Modifica posizione",
"control_bottom_app_bar_edit_time": "Modifica data e ora", "control_bottom_app_bar_edit_time": "Modifica data e ora",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Condividi", "create_shared_album_page_share": "Condividi",
"create_shared_album_page_share_add_assets": "AGGIUNGI OGGETTI", "create_shared_album_page_share_add_assets": "AGGIUNGI OGGETTI",
"create_shared_album_page_share_select_photos": "Seleziona foto", "create_shared_album_page_share_select_photos": "Seleziona foto",
"crop": "Crop",
"curated_location_page_title": "Location", "curated_location_page_title": "Location",
"curated_object_page_title": "Oggetti", "curated_object_page_title": "Oggetti",
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Errore modificare descrizione, controlli I log per maggiori dettagli", "description_input_submit_error": "Errore modificare descrizione, controlli I log per maggiori dettagli",
"edit_date_time_dialog_date_time": "Data e ora", "edit_date_time_dialog_date_time": "Data e ora",
"edit_date_time_dialog_timezone": "Fuso orario", "edit_date_time_dialog_timezone": "Fuso orario",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Posizione", "edit_location_dialog_title": "Posizione",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Aggiungi una descrizione...", "exif_bottom_sheet_description": "Aggiungi una descrizione...",
"exif_bottom_sheet_details": "DETTAGLI", "exif_bottom_sheet_details": "DETTAGLI",
"exif_bottom_sheet_location": "POSIZIONE", "exif_bottom_sheet_location": "POSIZIONE",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Se è la prima volta che utilizzi l'app, assicurati di scegliere uno o più album di backup, in modo che la timeline possa popolare le foto e i video presenti negli album.", "home_page_first_time_notice": "Se è la prima volta che utilizzi l'app, assicurati di scegliere uno o più album di backup, in modo che la timeline possa popolare le foto e i video presenti negli album.",
"home_page_share_err_local": "Non puoi condividere una risorsa locale tramite link, azione ignorata", "home_page_share_err_local": "Non puoi condividere una risorsa locale tramite link, azione ignorata",
"home_page_upload_err_limit": "Puoi caricare al massimo 30 file per volta, ignora quelli in eccesso", "home_page_upload_err_limit": "Puoi caricare al massimo 30 file per volta, ignora quelli in eccesso",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Errore nel Download", "image_viewer_page_state_provider_download_error": "Errore nel Download",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download con successo", "image_viewer_page_state_provider_download_success": "Download con successo",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Esci", "profile_drawer_sign_out": "Esci",
"profile_drawer_trash": "Cestino", "profile_drawer_trash": "Cestino",
"recently_added_page_title": "Aggiunti di recente", "recently_added_page_title": "Aggiunti di recente",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Si è verificato un errore.", "scaffold_body_error_occurred": "Si è verificato un errore.",
"search_bar_hint": "Cerca le tue foto", "search_bar_hint": "Cerca le tue foto",
"search_filter_apply": "Applica filtro", "search_filter_apply": "Applica filtro",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Crea album condiviso", "sharing_silver_appbar_create_shared_album": "Crea album condiviso",
"sharing_silver_appbar_shared_links": "Link condivisi", "sharing_silver_appbar_shared_links": "Link condivisi",
"sharing_silver_appbar_share_partner": "Condividi con partner", "sharing_silver_appbar_share_partner": "Condividi con partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Libreria", "tab_controller_nav_library": "Libreria",
"tab_controller_nav_photos": "Foto", "tab_controller_nav_photos": "Foto",
"tab_controller_nav_search": "Cerca", "tab_controller_nav_search": "Cerca",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "削除", "control_bottom_app_bar_delete": "削除",
"control_bottom_app_bar_delete_from_immich": "Immichから削除", "control_bottom_app_bar_delete_from_immich": "Immichから削除",
"control_bottom_app_bar_delete_from_local": "デバイスから削除", "control_bottom_app_bar_delete_from_local": "デバイスから削除",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "位置情報を編集", "control_bottom_app_bar_edit_location": "位置情報を編集",
"control_bottom_app_bar_edit_time": "日時を変更", "control_bottom_app_bar_edit_time": "日時を変更",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "共有", "create_shared_album_page_share": "共有",
"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": "写真を選択",
"crop": "Crop",
"curated_location_page_title": "撮影場所", "curated_location_page_title": "撮影場所",
"curated_object_page_title": "被写体", "curated_object_page_title": "被写体",
"daily_title_text_date": "MM月 DD日, EE", "daily_title_text_date": "MM月 DD日, EE",
@ -210,7 +212,9 @@
"description_input_submit_error": "説明の編集に失敗しました。詳細はログを確認してください。", "description_input_submit_error": "説明の編集に失敗しました。詳細はログを確認してください。",
"edit_date_time_dialog_date_time": "日付と時間", "edit_date_time_dialog_date_time": "日付と時間",
"edit_date_time_dialog_timezone": "タイムゾーン", "edit_date_time_dialog_timezone": "タイムゾーン",
"edit_image_title": "Edit",
"edit_location_dialog_title": "位置情報", "edit_location_dialog_title": "位置情報",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "説明を追加", "exif_bottom_sheet_description": "説明を追加",
"exif_bottom_sheet_details": "詳細", "exif_bottom_sheet_details": "詳細",
"exif_bottom_sheet_location": "撮影場所", "exif_bottom_sheet_location": "撮影場所",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "はじめてアプリを使う場合、タイムラインに写真を表示するためにアルバムを選択してください", "home_page_first_time_notice": "はじめてアプリを使う場合、タイムラインに写真を表示するためにアルバムを選択してください",
"home_page_share_err_local": "ローカルのみの項目をリンクで共有はできません。スキップします", "home_page_share_err_local": "ローカルのみの項目をリンクで共有はできません。スキップします",
"home_page_upload_err_limit": "1回でアップロードできる写真の数は30枚です。スキップします", "home_page_upload_err_limit": "1回でアップロードできる写真の数は30枚です。スキップします",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "ダウンロード失敗", "image_viewer_page_state_provider_download_error": "ダウンロード失敗",
"image_viewer_page_state_provider_download_started": "ダウンロードが始まります", "image_viewer_page_state_provider_download_started": "ダウンロードが始まります",
"image_viewer_page_state_provider_download_success": "ダウンロード成功", "image_viewer_page_state_provider_download_success": "ダウンロード成功",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "サインアウト", "profile_drawer_sign_out": "サインアウト",
"profile_drawer_trash": "ゴミ箱", "profile_drawer_trash": "ゴミ箱",
"recently_added_page_title": "最近", "recently_added_page_title": "最近",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "エラーが発生しました", "scaffold_body_error_occurred": "エラーが発生しました",
"search_bar_hint": "写真を検索", "search_bar_hint": "写真を検索",
"search_filter_apply": "フィルターを適用する", "search_filter_apply": "フィルターを適用する",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "共有アルバムを作成", "sharing_silver_appbar_create_shared_album": "共有アルバムを作成",
"sharing_silver_appbar_shared_links": "共有リンク", "sharing_silver_appbar_shared_links": "共有リンク",
"sharing_silver_appbar_share_partner": "パートナーと共有", "sharing_silver_appbar_share_partner": "パートナーと共有",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "ライブラリ", "tab_controller_nav_library": "ライブラリ",
"tab_controller_nav_photos": "写真", "tab_controller_nav_photos": "写真",
"tab_controller_nav_search": "検索", "tab_controller_nav_search": "検索",

View File

@ -20,7 +20,7 @@
"advanced_settings_troubleshooting_subtitle": "문제 해결을 위한 추가 기능 사용", "advanced_settings_troubleshooting_subtitle": "문제 해결을 위한 추가 기능 사용",
"advanced_settings_troubleshooting_title": "문제 해결", "advanced_settings_troubleshooting_title": "문제 해결",
"album_info_card_backup_album_excluded": "제외됨", "album_info_card_backup_album_excluded": "제외됨",
"album_info_card_backup_album_included": "포함됨", "album_info_card_backup_album_included": "선택됨",
"album_thumbnail_card_item": "1개 항목", "album_thumbnail_card_item": "1개 항목",
"album_thumbnail_card_items": "{}개 항목", "album_thumbnail_card_items": "{}개 항목",
"album_thumbnail_card_shared": " · 공유됨", "album_thumbnail_card_shared": " · 공유됨",
@ -54,19 +54,19 @@
"asset_list_layout_sub_title": "레이아웃", "asset_list_layout_sub_title": "레이아웃",
"asset_list_settings_subtitle": "사진 배열 레이아웃 설정", "asset_list_settings_subtitle": "사진 배열 레이아웃 설정",
"asset_list_settings_title": "사진 배열", "asset_list_settings_title": "사진 배열",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "항목이 성공적으로 복원되었습니다.",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} 미디어가 영구 삭제됨",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "Immich 서버에서 {} 미디어가 영구 삭제되었습니다.",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "장치에서 {} 미디어가 영구적으로 제거되었습니다.",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} 미디어가 성공적으로 복원되었습니다.",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} 미디어가 휴지통에 버려졌습니다.",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "Immich 서버에서 {} 미디어를 삭제했습니다.",
"asset_viewer_settings_title": "보기 옵션", "asset_viewer_settings_title": "보기 옵션",
"backup_album_selection_page_albums_device": "기기의 앨범 ({})", "backup_album_selection_page_albums_device": "기기의 앨범 ({})",
"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": "전체 항목",
"backup_all": "모두", "backup_all": "모두",
"backup_background_service_backup_failed_message": "백업하지 못했습니다. 다시 시도하는 중...", "backup_background_service_backup_failed_message": "백업하지 못했습니다. 다시 시도하는 중...",
@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "삭제", "control_bottom_app_bar_delete": "삭제",
"control_bottom_app_bar_delete_from_immich": "Immich에서 삭제", "control_bottom_app_bar_delete_from_immich": "Immich에서 삭제",
"control_bottom_app_bar_delete_from_local": "기기에서 삭제", "control_bottom_app_bar_delete_from_local": "기기에서 삭제",
"control_bottom_app_bar_download": "다운로드",
"control_bottom_app_bar_edit": "편집", "control_bottom_app_bar_edit": "편집",
"control_bottom_app_bar_edit_location": "위치 편집", "control_bottom_app_bar_edit_location": "위치 편집",
"control_bottom_app_bar_edit_time": "날짜 및 시간 변경", "control_bottom_app_bar_edit_time": "날짜 및 시간 변경",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "공유", "create_shared_album_page_share": "공유",
"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": "사진 선택",
"crop": "자르기",
"curated_location_page_title": "장소", "curated_location_page_title": "장소",
"curated_object_page_title": "사물", "curated_object_page_title": "사물",
"daily_title_text_date": "M월 d일 EEEE", "daily_title_text_date": "M월 d일 EEEE",
@ -210,7 +212,9 @@
"description_input_submit_error": "설명을 변경하는 중 문제가 발생했습니다. 자세한 내용은 로그를 참조하세요.", "description_input_submit_error": "설명을 변경하는 중 문제가 발생했습니다. 자세한 내용은 로그를 참조하세요.",
"edit_date_time_dialog_date_time": "날짜 및 시간", "edit_date_time_dialog_date_time": "날짜 및 시간",
"edit_date_time_dialog_timezone": "시간대", "edit_date_time_dialog_timezone": "시간대",
"edit_image_title": "편집",
"edit_location_dialog_title": "위치", "edit_location_dialog_title": "위치",
"error_saving_image": "오류입니다: {}",
"exif_bottom_sheet_description": "설명 추가...", "exif_bottom_sheet_description": "설명 추가...",
"exif_bottom_sheet_details": "상세 정보", "exif_bottom_sheet_details": "상세 정보",
"exif_bottom_sheet_location": "위치", "exif_bottom_sheet_location": "위치",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "앱을 처음 사용하는 경우 타임라인에 앨범의 사진과 동영상을 채울 수 있도록 백업할 앨범을 선택하세요.", "home_page_first_time_notice": "앱을 처음 사용하는 경우 타임라인에 앨범의 사진과 동영상을 채울 수 있도록 백업할 앨범을 선택하세요.",
"home_page_share_err_local": "기기의 항목은 링크로 공유할 수 없습니다. 건너뜁니다.", "home_page_share_err_local": "기기의 항목은 링크로 공유할 수 없습니다. 건너뜁니다.",
"home_page_upload_err_limit": "한 번에 최대 30개의 항목만 업로드할 수 있습니다.", "home_page_upload_err_limit": "한 번에 최대 30개의 항목만 업로드할 수 있습니다.",
"image_saved_successfully": "이미지 저장",
"image_viewer_page_state_provider_download_error": "다운로드 오류", "image_viewer_page_state_provider_download_error": "다운로드 오류",
"image_viewer_page_state_provider_download_started": "다운로드가 시작되었습니다.", "image_viewer_page_state_provider_download_started": "다운로드가 시작되었습니다.",
"image_viewer_page_state_provider_download_success": "다운로드 완료", "image_viewer_page_state_provider_download_success": "다운로드 완료",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "로그아웃", "profile_drawer_sign_out": "로그아웃",
"profile_drawer_trash": "휴지통", "profile_drawer_trash": "휴지통",
"recently_added_page_title": "최근 추가", "recently_added_page_title": "최근 추가",
"save_to_gallery": "갤러리에 저장",
"scaffold_body_error_occurred": "문제가 발생했습니다.", "scaffold_body_error_occurred": "문제가 발생했습니다.",
"search_bar_hint": "사진 검색", "search_bar_hint": "사진 검색",
"search_filter_apply": "필터 적용", "search_filter_apply": "필터 적용",
@ -435,7 +441,7 @@
"server_info_box_server_url": "서버 URL", "server_info_box_server_url": "서버 URL",
"server_info_box_server_version": "서버 버전", "server_info_box_server_version": "서버 버전",
"setting_image_viewer_help": "상세 보기는 먼저 작은 크기의 섬네일을 불러오며, 활성화된 경우 중간 크기의 이미지와 원본을 불러옵니다.", "setting_image_viewer_help": "상세 보기는 먼저 작은 크기의 섬네일을 불러오며, 활성화된 경우 중간 크기의 이미지와 원본을 불러옵니다.",
"setting_image_viewer_original_subtitle": "원본 해상도 이미지(고화질)를 로드합니다. 데이터 사용량을 줄이려면 비활성화하세요.", "setting_image_viewer_original_subtitle": "고해상도 원본 이미지를 불러옵니다. 데이터 사용량을 줄이려면 비활성화하세요.",
"setting_image_viewer_original_title": "원본 이미지 표시", "setting_image_viewer_original_title": "원본 이미지 표시",
"setting_image_viewer_preview_subtitle": "중간 크기의 이미지를 불러오려면 활성화하세요. 항상 원본을 불러오거나 섬네일만 불러오려면 비활성화하세요.", "setting_image_viewer_preview_subtitle": "중간 크기의 이미지를 불러오려면 활성화하세요. 항상 원본을 불러오거나 섬네일만 불러오려면 비활성화하세요.",
"setting_image_viewer_preview_title": "미리 보기 이미지 불러오기", "setting_image_viewer_preview_title": "미리 보기 이미지 불러오기",
@ -529,27 +535,31 @@
"sharing_silver_appbar_create_shared_album": "공유 앨범 생성", "sharing_silver_appbar_create_shared_album": "공유 앨범 생성",
"sharing_silver_appbar_shared_links": "공유 링크", "sharing_silver_appbar_shared_links": "공유 링크",
"sharing_silver_appbar_share_partner": "파트너와 공유", "sharing_silver_appbar_share_partner": "파트너와 공유",
"sync": "동기화",
"sync_albums": "앨범 동기화",
"sync_albums_manual_subtitle": "업로드한 모든 동영상과 사진을 선택한 백업 앨범에 동기화합니다.",
"sync_upload_album_setting_subtitle": "Immich에서 선택한 앨범에 사진 및 동영상을 만들고 업로드하세요.",
"tab_controller_nav_library": "라이브러리", "tab_controller_nav_library": "라이브러리",
"tab_controller_nav_photos": "사진", "tab_controller_nav_photos": "사진",
"tab_controller_nav_search": "검색", "tab_controller_nav_search": "검색",
"tab_controller_nav_sharing": "공유", "tab_controller_nav_sharing": "공유",
"theme_setting_asset_list_storage_indicator_title": "항목에 스토리지 동기화 여부 표시", "theme_setting_asset_list_storage_indicator_title": "항목에 스토리지 동기화 여부 표시",
"theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 항목 수 ({})", "theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 항목 수 ({})",
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", "theme_setting_colorful_interface_subtitle": "배경에 대표 색상을 적용합니다.",
"theme_setting_colorful_interface_title": "Colorful interface", "theme_setting_colorful_interface_title": "컬러풀 인터페이스",
"theme_setting_dark_mode_switch": "다크 모드", "theme_setting_dark_mode_switch": "다크 모드",
"theme_setting_image_viewer_quality_subtitle": "상세 보기 이미지 품질 조정", "theme_setting_image_viewer_quality_subtitle": "상세 보기 이미지 품질 조정",
"theme_setting_image_viewer_quality_title": "이미지 보기 품질", "theme_setting_image_viewer_quality_title": "이미지 보기 품질",
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.", "theme_setting_primary_color_subtitle": "주 기능 및 강조에 사용되는 색상 선택",
"theme_setting_primary_color_title": "Primary color", "theme_setting_primary_color_title": "대표 색상",
"theme_setting_system_primary_color_title": "Use system color", "theme_setting_system_primary_color_title": "시스템 색상 사용",
"theme_setting_system_theme_switch": "자동 (시스템 설정)", "theme_setting_system_theme_switch": "자동 (시스템 설정)",
"theme_setting_theme_subtitle": "앱 테마 선택", "theme_setting_theme_subtitle": "앱 테마 선택",
"theme_setting_theme_title": "테마", "theme_setting_theme_title": "테마",
"theme_setting_three_stage_loading_subtitle": "이 기능은 앱의 로드 성능을 향상시킬 수 있지만 더 많은 데이터를 사용합니다.", "theme_setting_three_stage_loading_subtitle": "이 기능은 앱의 로드 성능을 향상시킬 수 있지만 더 많은 데이터를 사용합니다.",
"theme_setting_three_stage_loading_title": "3단계 로드 활성화", "theme_setting_three_stage_loading_title": "3단계 로드 활성화",
"translated_text_options": "옵션", "translated_text_options": "옵션",
"trash_emptied": "Emptied trash", "trash_emptied": "휴지통 비우기",
"trash_page_delete": "삭제", "trash_page_delete": "삭제",
"trash_page_delete_all": "모두 삭제", "trash_page_delete_all": "모두 삭제",
"trash_page_empty_trash_btn": "휴지통 비우기", "trash_page_empty_trash_btn": "휴지통 비우기",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Delete", "control_bottom_app_bar_delete": "Delete",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Share", "create_shared_album_page_share": "Share",
"create_shared_album_page_share_add_assets": "ADD ASSETS", "create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos", "create_shared_album_page_share_select_photos": "Select Photos",
"crop": "Crop",
"curated_location_page_title": "Places", "curated_location_page_title": "Places",
"curated_object_page_title": "Things", "curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error updating description, check the log for more details", "description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Add Description...", "exif_bottom_sheet_description": "Add Description...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION", "exif_bottom_sheet_location": "LOCATION",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).", "home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Download Error", "image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download Success", "image_viewer_page_state_provider_download_success": "Download Success",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Sign Out", "profile_drawer_sign_out": "Sign Out",
"profile_drawer_trash": "Trash", "profile_drawer_trash": "Trash",
"recently_added_page_title": "Recently Added", "recently_added_page_title": "Recently Added",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Search your photos", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "New shared album", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_shared_links": "Shared links", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Share with partner", "sharing_silver_appbar_share_partner": "Share with partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Search", "tab_controller_nav_search": "Search",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Dzēst", "control_bottom_app_bar_delete": "Dzēst",
"control_bottom_app_bar_delete_from_immich": "Dzēst no Immich", "control_bottom_app_bar_delete_from_immich": "Dzēst no Immich",
"control_bottom_app_bar_delete_from_local": "Dzēst no ierīces", "control_bottom_app_bar_delete_from_local": "Dzēst no ierīces",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Rediģēt Atrašanās Vietu", "control_bottom_app_bar_edit_location": "Rediģēt Atrašanās Vietu",
"control_bottom_app_bar_edit_time": "Rediģēt Datumu un Laiku", "control_bottom_app_bar_edit_time": "Rediģēt Datumu un Laiku",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Kopīgot", "create_shared_album_page_share": "Kopīgot",
"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",
"crop": "Crop",
"curated_location_page_title": "Vietas", "curated_location_page_title": "Vietas",
"curated_object_page_title": "Lietas", "curated_object_page_title": "Lietas",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Atjauninot aprakstu, radās kļūda; papildinformāciju skatiet žurnālā", "description_input_submit_error": "Atjauninot aprakstu, radās kļūda; papildinformāciju skatiet žurnālā",
"edit_date_time_dialog_date_time": "Datums un Laiks", "edit_date_time_dialog_date_time": "Datums un Laiks",
"edit_date_time_dialog_timezone": "Laika zona", "edit_date_time_dialog_timezone": "Laika zona",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Atrašanās vieta", "edit_location_dialog_title": "Atrašanās vieta",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Pievienot Aprakstu...", "exif_bottom_sheet_description": "Pievienot Aprakstu...",
"exif_bottom_sheet_details": "INFORMĀCIJA", "exif_bottom_sheet_details": "INFORMĀCIJA",
"exif_bottom_sheet_location": "ATRAŠANĀS VIETA", "exif_bottom_sheet_location": "ATRAŠANĀS VIETA",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Ja šī ir pirmā reize, kad izmantojat aplikāciju, lūdzu, izvēlieties dublējuma albumu(s), lai laika skala varētu aizpildīt fotoattēlus un videoklipus albumā(os).", "home_page_first_time_notice": "Ja šī ir pirmā reize, kad izmantojat aplikāciju, lūdzu, izvēlieties dublējuma albumu(s), lai laika skala varētu aizpildīt fotoattēlus un videoklipus albumā(os).",
"home_page_share_err_local": "Caur saiti nevarēja kopīgot lokālos aktīvus, notiek izlaišana", "home_page_share_err_local": "Caur saiti nevarēja kopīgot lokālos aktīvus, notiek izlaišana",
"home_page_upload_err_limit": "Vienlaikus var augšupielādēt ne vairāk kā 30 aktīvus, notiek izlaišana", "home_page_upload_err_limit": "Vienlaikus var augšupielādēt ne vairāk kā 30 aktīvus, notiek izlaišana",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Lejupielādes Kļūda", "image_viewer_page_state_provider_download_error": "Lejupielādes Kļūda",
"image_viewer_page_state_provider_download_started": "Lejupielāde Uzsākta", "image_viewer_page_state_provider_download_started": "Lejupielāde Uzsākta",
"image_viewer_page_state_provider_download_success": "Lejupielāde Izdevās", "image_viewer_page_state_provider_download_success": "Lejupielāde Izdevās",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Izrakstīties", "profile_drawer_sign_out": "Izrakstīties",
"profile_drawer_trash": "Atkritne", "profile_drawer_trash": "Atkritne",
"recently_added_page_title": "Nesen Pievienotais", "recently_added_page_title": "Nesen Pievienotais",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Radās kļūda", "scaffold_body_error_occurred": "Radās kļūda",
"search_bar_hint": "Meklēt Jūsu fotoattēlus", "search_bar_hint": "Meklēt Jūsu fotoattēlus",
"search_filter_apply": "Lietot filtru", "search_filter_apply": "Lietot filtru",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Izveidot kopīgotu albumu", "sharing_silver_appbar_create_shared_album": "Izveidot kopīgotu albumu",
"sharing_silver_appbar_shared_links": "Kopīgotās saites", "sharing_silver_appbar_shared_links": "Kopīgotās saites",
"sharing_silver_appbar_share_partner": "Dalīties ar partneri", "sharing_silver_appbar_share_partner": "Dalīties ar partneri",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Bibliotēka", "tab_controller_nav_library": "Bibliotēka",
"tab_controller_nav_photos": "Fotoattēli", "tab_controller_nav_photos": "Fotoattēli",
"tab_controller_nav_search": "Meklēt", "tab_controller_nav_search": "Meklēt",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Delete", "control_bottom_app_bar_delete": "Delete",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_edit_time": "Edit Date & Time",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Share", "create_shared_album_page_share": "Share",
"create_shared_album_page_share_add_assets": "ADD ASSETS", "create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos", "create_shared_album_page_share_select_photos": "Select Photos",
"crop": "Crop",
"curated_location_page_title": "Places", "curated_location_page_title": "Places",
"curated_object_page_title": "Things", "curated_object_page_title": "Things",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Error updating description, check the log for more details", "description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "Date and Time", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone", "edit_date_time_dialog_timezone": "Timezone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Location", "edit_location_dialog_title": "Location",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Add Description...", "exif_bottom_sheet_description": "Add Description...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION", "exif_bottom_sheet_location": "LOCATION",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).", "home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Download Error", "image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Download Success", "image_viewer_page_state_provider_download_success": "Download Success",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Sign Out", "profile_drawer_sign_out": "Sign Out",
"profile_drawer_trash": "Trash", "profile_drawer_trash": "Trash",
"recently_added_page_title": "Recently Added", "recently_added_page_title": "Recently Added",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Error occurred", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "Search your photos", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "New shared album", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_shared_links": "Shared links", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Share with partner", "sharing_silver_appbar_share_partner": "Share with partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Search", "tab_controller_nav_search": "Search",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Slett", "control_bottom_app_bar_delete": "Slett",
"control_bottom_app_bar_delete_from_immich": "Slett fra Immich", "control_bottom_app_bar_delete_from_immich": "Slett fra Immich",
"control_bottom_app_bar_delete_from_local": "Slett fra enhet", "control_bottom_app_bar_delete_from_local": "Slett fra enhet",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Endre", "control_bottom_app_bar_edit": "Endre",
"control_bottom_app_bar_edit_location": "Endre lokasjon", "control_bottom_app_bar_edit_location": "Endre lokasjon",
"control_bottom_app_bar_edit_time": "Endre Dato og tid", "control_bottom_app_bar_edit_time": "Endre Dato og tid",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Del", "create_shared_album_page_share": "Del",
"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",
"crop": "Crop",
"curated_location_page_title": "Plasseringer", "curated_location_page_title": "Plasseringer",
"curated_object_page_title": "Ting", "curated_object_page_title": "Ting",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Feil ved oppdatering av beskrivelse, sjekk loggen for flere detaljer", "description_input_submit_error": "Feil ved oppdatering av beskrivelse, sjekk loggen for flere detaljer",
"edit_date_time_dialog_date_time": "Dato og tid", "edit_date_time_dialog_date_time": "Dato og tid",
"edit_date_time_dialog_timezone": "Tidssone", "edit_date_time_dialog_timezone": "Tidssone",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Lokasjon", "edit_location_dialog_title": "Lokasjon",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Legg til beskrivelse ...", "exif_bottom_sheet_description": "Legg til beskrivelse ...",
"exif_bottom_sheet_details": "DETALJER", "exif_bottom_sheet_details": "DETALJER",
"exif_bottom_sheet_location": "PLASSERING", "exif_bottom_sheet_location": "PLASSERING",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Hvis dette er første gangen du benytter appen, velg et album (eller flere) for sikkerhetskopiering, slik at tidslinjen kan fylles med dine bilder og videoer.", "home_page_first_time_notice": "Hvis dette er første gangen du benytter appen, velg et album (eller flere) for sikkerhetskopiering, slik at tidslinjen kan fylles med dine bilder og videoer.",
"home_page_share_err_local": "Kan ikke dele lokale objekter via link, hopper over", "home_page_share_err_local": "Kan ikke dele lokale objekter via link, hopper over",
"home_page_upload_err_limit": "Maksimalt 30 objekter kan lastes opp om gangen, hopper over", "home_page_upload_err_limit": "Maksimalt 30 objekter kan lastes opp om gangen, hopper over",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Nedlasting feilet", "image_viewer_page_state_provider_download_error": "Nedlasting feilet",
"image_viewer_page_state_provider_download_started": "Nedlasting startet", "image_viewer_page_state_provider_download_started": "Nedlasting startet",
"image_viewer_page_state_provider_download_success": "Nedlasting vellykket", "image_viewer_page_state_provider_download_success": "Nedlasting vellykket",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Logg ut", "profile_drawer_sign_out": "Logg ut",
"profile_drawer_trash": "Søppelbøtte", "profile_drawer_trash": "Søppelbøtte",
"recently_added_page_title": "Nylig lagt til", "recently_added_page_title": "Nylig lagt til",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Feil oppstått", "scaffold_body_error_occurred": "Feil oppstått",
"search_bar_hint": "Søk i dine bilder", "search_bar_hint": "Søk i dine bilder",
"search_filter_apply": "Aktiver filter", "search_filter_apply": "Aktiver filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Lag delt album", "sharing_silver_appbar_create_shared_album": "Lag delt album",
"sharing_silver_appbar_shared_links": "Delte linker", "sharing_silver_appbar_shared_links": "Delte linker",
"sharing_silver_appbar_share_partner": "Del med partner", "sharing_silver_appbar_share_partner": "Del med partner",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Bibliotek", "tab_controller_nav_library": "Bibliotek",
"tab_controller_nav_photos": "Bilder", "tab_controller_nav_photos": "Bilder",
"tab_controller_nav_search": "Søk", "tab_controller_nav_search": "Søk",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Verwijderen", "control_bottom_app_bar_delete": "Verwijderen",
"control_bottom_app_bar_delete_from_immich": "Verwijderen van Immich", "control_bottom_app_bar_delete_from_immich": "Verwijderen van Immich",
"control_bottom_app_bar_delete_from_local": "Verwijderen van apparaat", "control_bottom_app_bar_delete_from_local": "Verwijderen van apparaat",
"control_bottom_app_bar_download": "Downloaden",
"control_bottom_app_bar_edit": "Bewerken", "control_bottom_app_bar_edit": "Bewerken",
"control_bottom_app_bar_edit_location": "Locatie bewerken", "control_bottom_app_bar_edit_location": "Locatie bewerken",
"control_bottom_app_bar_edit_time": "Datum & tijd bewerken", "control_bottom_app_bar_edit_time": "Datum & tijd bewerken",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Delen", "create_shared_album_page_share": "Delen",
"create_shared_album_page_share_add_assets": "ASSETS TOEVOEGEN", "create_shared_album_page_share_add_assets": "ASSETS TOEVOEGEN",
"create_shared_album_page_share_select_photos": "Selecteer foto's", "create_shared_album_page_share_select_photos": "Selecteer foto's",
"crop": "Bijsnijden",
"curated_location_page_title": "Plaatsen", "curated_location_page_title": "Plaatsen",
"curated_object_page_title": "Dingen", "curated_object_page_title": "Dingen",
"daily_title_text_date": "E dd MMM", "daily_title_text_date": "E dd MMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Beschrijving bijwerken mislukt, controleer het logboek voor meer details", "description_input_submit_error": "Beschrijving bijwerken mislukt, controleer het logboek voor meer details",
"edit_date_time_dialog_date_time": "Datum en tijd", "edit_date_time_dialog_date_time": "Datum en tijd",
"edit_date_time_dialog_timezone": "Tijdzone", "edit_date_time_dialog_timezone": "Tijdzone",
"edit_image_title": "Bewerken",
"edit_location_dialog_title": "Locatie", "edit_location_dialog_title": "Locatie",
"error_saving_image": "Fout: {}",
"exif_bottom_sheet_description": "Beschrijving toevoegen...", "exif_bottom_sheet_description": "Beschrijving toevoegen...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATIE", "exif_bottom_sheet_location": "LOCATIE",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Als dit de eerste keer is dat je de app gebruikt, zorg er dan voor dat je een back-up album kiest, zodat de tijdlijn gevuld kan worden met foto's en video's uit het album.", "home_page_first_time_notice": "Als dit de eerste keer is dat je de app gebruikt, zorg er dan voor dat je een back-up album kiest, zodat de tijdlijn gevuld kan worden met foto's en video's uit het album.",
"home_page_share_err_local": "Lokale assets kunnen niet via een link gedeeld worden, overslaan", "home_page_share_err_local": "Lokale assets kunnen niet via een link gedeeld worden, overslaan",
"home_page_upload_err_limit": "Kan maximaal 30 assets tegelijk uploaden, overslaan", "home_page_upload_err_limit": "Kan maximaal 30 assets tegelijk uploaden, overslaan",
"image_saved_successfully": "Afbeelding opgeslagen",
"image_viewer_page_state_provider_download_error": "Download mislukt", "image_viewer_page_state_provider_download_error": "Download mislukt",
"image_viewer_page_state_provider_download_started": "Download gestart", "image_viewer_page_state_provider_download_started": "Download gestart",
"image_viewer_page_state_provider_download_success": "Download succesvol", "image_viewer_page_state_provider_download_success": "Download succesvol",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Uitloggen", "profile_drawer_sign_out": "Uitloggen",
"profile_drawer_trash": "Prullenbak", "profile_drawer_trash": "Prullenbak",
"recently_added_page_title": "Recent toegevoegd", "recently_added_page_title": "Recent toegevoegd",
"save_to_gallery": "Opslaan in galerij",
"scaffold_body_error_occurred": "Fout opgetreden", "scaffold_body_error_occurred": "Fout opgetreden",
"search_bar_hint": "Foto's doorzoeken", "search_bar_hint": "Foto's doorzoeken",
"search_filter_apply": "Filter toepassen", "search_filter_apply": "Filter toepassen",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Gedeeld album maken", "sharing_silver_appbar_create_shared_album": "Gedeeld album maken",
"sharing_silver_appbar_shared_links": "Gedeelde links", "sharing_silver_appbar_shared_links": "Gedeelde links",
"sharing_silver_appbar_share_partner": "Delen met partner", "sharing_silver_appbar_share_partner": "Delen met partner",
"sync": "Synchroniseren",
"sync_albums": "Albums synchroniseren",
"sync_albums_manual_subtitle": "Synchroniseer alle geüploade videos en fotos naar de geselecteerde back-up albums",
"sync_upload_album_setting_subtitle": "Maak en upload je foto's en video's naar de geselecteerde albums op Immich",
"tab_controller_nav_library": "Bibliotheek", "tab_controller_nav_library": "Bibliotheek",
"tab_controller_nav_photos": "Foto's", "tab_controller_nav_photos": "Foto's",
"tab_controller_nav_search": "Zoeken", "tab_controller_nav_search": "Zoeken",

View File

@ -3,8 +3,8 @@
"action_common_cancel": "Anuluj", "action_common_cancel": "Anuluj",
"action_common_clear": "Wyrzuść", "action_common_clear": "Wyrzuść",
"action_common_confirm": "Potwierdzać", "action_common_confirm": "Potwierdzać",
"action_common_save": "Save", "action_common_save": "Zapisz",
"action_common_select": "Select", "action_common_select": "Wybierz",
"action_common_update": "Aktualizuj", "action_common_update": "Aktualizuj",
"add_to_album_bottom_sheet_added": "Dodano do {album}", "add_to_album_bottom_sheet_added": "Dodano do {album}",
"add_to_album_bottom_sheet_already_exists": "Już w {album}", "add_to_album_bottom_sheet_already_exists": "Już w {album}",
@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "Układ", "asset_list_layout_sub_title": "Układ",
"asset_list_settings_subtitle": "Ustawienia układu siatki zdjęć", "asset_list_settings_subtitle": "Ustawienia układu siatki zdjęć",
"asset_list_settings_title": "Siatka Zdjęć", "asset_list_settings_title": "Siatka Zdjęć",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Zasób został pomyślnie przywrócony",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} zasoby trwale usunięto",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": " {} zasoby zostały trwale usunięte z serwera Immich",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": " {} zasoby zostały trwale usunięte z Twojego urządzenia",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": " {} zasoby pomyślnie przywrócono",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} zasoby zostały usunięte",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} zasoby usunięte z serwera Immich",
"asset_viewer_settings_title": "Przeglądarka zasobów", "asset_viewer_settings_title": "Przeglądarka zasobów",
"backup_album_selection_page_albums_device": "Albumy na urządzeniu ({})", "backup_album_selection_page_albums_device": "Albumy na urządzeniu ({})",
"backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć", "backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć",
@ -151,7 +151,7 @@
"change_password_form_password_mismatch": "Hasła nie są zgodne", "change_password_form_password_mismatch": "Hasła nie są zgodne",
"change_password_form_reenter_new_password": "Wprowadź ponownie Nowe Hasło", "change_password_form_reenter_new_password": "Wprowadź ponownie Nowe Hasło",
"client_cert_dialog_msg_confirm": "OK", "client_cert_dialog_msg_confirm": "OK",
"client_cert_enter_password": "Enter Password", "client_cert_enter_password": "Wprowadź hasło",
"client_cert_import": "Import", "client_cert_import": "Import",
"client_cert_import_success_msg": "Client certificate is imported", "client_cert_import_success_msg": "Client certificate is imported",
"client_cert_invalid_msg": "Invalid certificate file or wrong password", "client_cert_invalid_msg": "Invalid certificate file or wrong password",
@ -164,7 +164,7 @@
"common_create_new_album": "Utwórz nowy album", "common_create_new_album": "Utwórz nowy album",
"common_server_error": "Sprawdź połączenie sieciowe, upewnij się, że serwer jest osiągalny i wersje aplikacji/serwera są kompatybilne.", "common_server_error": "Sprawdź połączenie sieciowe, upewnij się, że serwer jest osiągalny i wersje aplikacji/serwera są kompatybilne.",
"common_shared": "Udostępnione", "common_shared": "Udostępnione",
"contextual_search": "Sunrise on the beach", "contextual_search": "Wschód słońca na plaży",
"control_bottom_app_bar_add_to_album": "Dodaj do albumu", "control_bottom_app_bar_add_to_album": "Dodaj do albumu",
"control_bottom_app_bar_album_info": "{} pozycji", "control_bottom_app_bar_album_info": "{} pozycji",
"control_bottom_app_bar_album_info_shared": "{} pozycji · Udostępnionych", "control_bottom_app_bar_album_info_shared": "{} pozycji · Udostępnionych",
@ -173,7 +173,8 @@
"control_bottom_app_bar_delete": "Usuń", "control_bottom_app_bar_delete": "Usuń",
"control_bottom_app_bar_delete_from_immich": "Usuń z Immicha", "control_bottom_app_bar_delete_from_immich": "Usuń z Immicha",
"control_bottom_app_bar_delete_from_local": "Usuń z urządzenia", "control_bottom_app_bar_delete_from_local": "Usuń z urządzenia",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_download": "Pobierz",
"control_bottom_app_bar_edit": "Edytuj",
"control_bottom_app_bar_edit_location": "Edytuj lokalizację", "control_bottom_app_bar_edit_location": "Edytuj lokalizację",
"control_bottom_app_bar_edit_time": "Edytuj datę i godzinę", "control_bottom_app_bar_edit_time": "Edytuj datę i godzinę",
"control_bottom_app_bar_favorite": "Ulubione", "control_bottom_app_bar_favorite": "Ulubione",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Udostępnij", "create_shared_album_page_share": "Udostępnij",
"create_shared_album_page_share_add_assets": "DODAJ ZASOBY", "create_shared_album_page_share_add_assets": "DODAJ ZASOBY",
"create_shared_album_page_share_select_photos": "Zaznacz Zdjęcia", "create_shared_album_page_share_select_photos": "Zaznacz Zdjęcia",
"crop": "Crop",
"curated_location_page_title": "Miejsca", "curated_location_page_title": "Miejsca",
"curated_object_page_title": "Rzeczy", "curated_object_page_title": "Rzeczy",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Błąd aktualizacji opisu, sprawdź dziennik, aby uzyskać więcej szczegółów", "description_input_submit_error": "Błąd aktualizacji opisu, sprawdź dziennik, aby uzyskać więcej szczegółów",
"edit_date_time_dialog_date_time": "Data i godzina", "edit_date_time_dialog_date_time": "Data i godzina",
"edit_date_time_dialog_timezone": "Strefa czasowa", "edit_date_time_dialog_timezone": "Strefa czasowa",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Lokalizacja", "edit_location_dialog_title": "Lokalizacja",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Dodaj Opis...", "exif_bottom_sheet_description": "Dodaj Opis...",
"exif_bottom_sheet_details": "SZCZEGÓŁY", "exif_bottom_sheet_details": "SZCZEGÓŁY",
"exif_bottom_sheet_location": "LOKALIZACJA", "exif_bottom_sheet_location": "LOKALIZACJA",
@ -223,7 +227,7 @@
"experimental_settings_title": "Eksperymentalny", "experimental_settings_title": "Eksperymentalny",
"favorites_page_no_favorites": "Nie znaleziono ulubionych zasobów", "favorites_page_no_favorites": "Nie znaleziono ulubionych zasobów",
"favorites_page_title": "Ulubione", "favorites_page_title": "Ulubione",
"filename_search": "File name or extension", "filename_search": "Nazwa pliku lub rozszerzenie",
"haptic_feedback_switch": "Enable haptic feedback", "haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback", "haptic_feedback_title": "Haptic Feedback",
"header_settings_add_header_tip": "Dodaj nagłówek", "header_settings_add_header_tip": "Dodaj nagłówek",
@ -247,12 +251,13 @@
"home_page_first_time_notice": "Jeśli korzystasz z aplikacji po raz pierwszy, pamiętaj o wybraniu albumów zapasowych, aby oś czasu mogła zapełnić zdjęcia i filmy w albumach.", "home_page_first_time_notice": "Jeśli korzystasz z aplikacji po raz pierwszy, pamiętaj o wybraniu albumów zapasowych, aby oś czasu mogła zapełnić zdjęcia i filmy w albumach.",
"home_page_share_err_local": "Nie można udostępniać zasobów lokalnych za pośrednictwem linku, pomijajam", "home_page_share_err_local": "Nie można udostępniać zasobów lokalnych za pośrednictwem linku, pomijajam",
"home_page_upload_err_limit": "Można przesłać maksymalnie 30 zasobów jednocześnie, pomijanie", "home_page_upload_err_limit": "Można przesłać maksymalnie 30 zasobów jednocześnie, pomijanie",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Błąd pobierania", "image_viewer_page_state_provider_download_error": "Błąd pobierania",
"image_viewer_page_state_provider_download_started": "Pobieranie rozpoczęte", "image_viewer_page_state_provider_download_started": "Pobieranie rozpoczęte",
"image_viewer_page_state_provider_download_success": "Pobieranie zakończone", "image_viewer_page_state_provider_download_success": "Pobieranie zakończone",
"image_viewer_page_state_provider_share_error": "Udostępnij błąd", "image_viewer_page_state_provider_share_error": "Udostępnij błąd",
"invalid_date": "Invalid date", "invalid_date": "Nieprawidłowa data",
"invalid_date_format": "Invalid date format", "invalid_date_format": "Nieprawidłowy format daty",
"library_page_albums": "Albumy", "library_page_albums": "Albumy",
"library_page_archive": "Archiwum", "library_page_archive": "Archiwum",
"library_page_device_albums": "Albumy na Urządzeniu", "library_page_device_albums": "Albumy na Urządzeniu",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Wyloguj się", "profile_drawer_sign_out": "Wyloguj się",
"profile_drawer_trash": "Kosz", "profile_drawer_trash": "Kosz",
"recently_added_page_title": "Ostatnio Dodane", "recently_added_page_title": "Ostatnio Dodane",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Wystąpił błąd", "scaffold_body_error_occurred": "Wystąpił błąd",
"search_bar_hint": "Szukaj swoich zdjęć", "search_bar_hint": "Szukaj swoich zdjęć",
"search_filter_apply": "Zastosuj filtr", "search_filter_apply": "Zastosuj filtr",
@ -394,14 +400,14 @@
"search_filter_location_city": "Miasto", "search_filter_location_city": "Miasto",
"search_filter_location_country": "Kraj", "search_filter_location_country": "Kraj",
"search_filter_location_state": "State", "search_filter_location_state": "State",
"search_filter_location_title": "Select location", "search_filter_location_title": "Wybierz lokalizację",
"search_filter_media_type": "Media Type", "search_filter_media_type": "Typ multimediów",
"search_filter_media_type_all": "Wszystko", "search_filter_media_type_all": "Wszystko",
"search_filter_media_type_image": "Obrazy", "search_filter_media_type_image": "Obrazy",
"search_filter_media_type_title": "Select media type", "search_filter_media_type_title": "Wybierz typ multimediów",
"search_filter_media_type_video": "Filmy", "search_filter_media_type_video": "Filmy",
"search_filter_people": "People", "search_filter_people": "Osoby",
"search_filter_people_title": "Select people", "search_filter_people_title": "Wybierz osoby",
"search_page_categories": "Kategorie", "search_page_categories": "Kategorie",
"search_page_favorites": "Ulubione", "search_page_favorites": "Ulubione",
"search_page_motion_photos": "Zdjęcia ruchome", "search_page_motion_photos": "Zdjęcia ruchome",
@ -529,27 +535,31 @@
"sharing_silver_appbar_create_shared_album": "Utwórz współdzielony album", "sharing_silver_appbar_create_shared_album": "Utwórz współdzielony album",
"sharing_silver_appbar_shared_links": "Udostępnione linki", "sharing_silver_appbar_shared_links": "Udostępnione linki",
"sharing_silver_appbar_share_partner": "Udostępnij partnerce/partnerowi", "sharing_silver_appbar_share_partner": "Udostępnij partnerce/partnerowi",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Biblioteka", "tab_controller_nav_library": "Biblioteka",
"tab_controller_nav_photos": "Zdjęcia", "tab_controller_nav_photos": "Zdjęcia",
"tab_controller_nav_search": "Szukaj", "tab_controller_nav_search": "Szukaj",
"tab_controller_nav_sharing": "Udostępnianie", "tab_controller_nav_sharing": "Udostępnianie",
"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 ({})", "theme_setting_asset_list_tiles_per_row_title": "Liczba zasobów w wierszu ({})",
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", "theme_setting_colorful_interface_subtitle": "Zastosuj kolor podstawowy do powierzchni tła.",
"theme_setting_colorful_interface_title": "Colorful interface", "theme_setting_colorful_interface_title": "Kolorowy interfejs",
"theme_setting_dark_mode_switch": "Ciemny Motyw", "theme_setting_dark_mode_switch": "Ciemny Motyw",
"theme_setting_image_viewer_quality_subtitle": "Dostosuj jakość podglądu szczegółowości", "theme_setting_image_viewer_quality_subtitle": "Dostosuj jakość podglądu szczegółowości",
"theme_setting_image_viewer_quality_title": "Jakość przeglądania obrazów", "theme_setting_image_viewer_quality_title": "Jakość przeglądania obrazów",
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.", "theme_setting_primary_color_subtitle": "Wybierz kolor dla głównych działań i akcentów.",
"theme_setting_primary_color_title": "Primary color", "theme_setting_primary_color_title": "Kolor podstawowy",
"theme_setting_system_primary_color_title": "Use system color", "theme_setting_system_primary_color_title": "Użyj koloru systemowego",
"theme_setting_system_theme_switch": "Automatyczny (Postępuj zgodnie z ustawieniami systemu)", "theme_setting_system_theme_switch": "Automatyczny (Postępuj zgodnie z ustawieniami systemu)",
"theme_setting_theme_subtitle": "Wybierz ustawienia motywu aplikacji", "theme_setting_theme_subtitle": "Wybierz ustawienia motywu aplikacji",
"theme_setting_theme_title": "Motyw", "theme_setting_theme_title": "Motyw",
"theme_setting_three_stage_loading_subtitle": "Trójstopniowe ładowanie może zwiększyć wydajność ładowania, ale powoduje znacznie większe obciążenie sieci", "theme_setting_three_stage_loading_subtitle": "Trójstopniowe ładowanie może zwiększyć wydajność ładowania, ale powoduje znacznie większe obciążenie sieci",
"theme_setting_three_stage_loading_title": "Włączenie trójstopniowego ładowania", "theme_setting_three_stage_loading_title": "Włączenie trójstopniowego ładowania",
"translated_text_options": "Opcje", "translated_text_options": "Opcje",
"trash_emptied": "Emptied trash", "trash_emptied": "Opróżnione śmieci",
"trash_page_delete": "Usuń", "trash_page_delete": "Usuń",
"trash_page_delete_all": "Usuń wszystko", "trash_page_delete_all": "Usuń wszystko",
"trash_page_empty_trash_btn": "Opróżnij kosz", "trash_page_empty_trash_btn": "Opróżnij kosz",

View File

@ -1,104 +1,104 @@
{ {
"action_common_back": "Back", "action_common_back": "Voltar",
"action_common_cancel": "Cancelar", "action_common_cancel": "Cancelar",
"action_common_clear": "Clear", "action_common_clear": "Limpar",
"action_common_confirm": "Confirm", "action_common_confirm": "Confirmar",
"action_common_save": "Save", "action_common_save": "Salvar",
"action_common_select": "Select", "action_common_select": "Selecionar",
"action_common_update": "Atualizar", "action_common_update": "Atualizar",
"add_to_album_bottom_sheet_added": "Adicionar a {album}", "add_to_album_bottom_sheet_added": "Adicionado a {album}",
"add_to_album_bottom_sheet_already_exists": "Já pertence a {album}", "add_to_album_bottom_sheet_already_exists": "Já existe em {album}",
"advanced_settings_log_level_title": "Nível de log: {}", "advanced_settings_log_level_title": "Nível de log: {}",
"advanced_settings_prefer_remote_subtitle": "Alguns dispositivos são extremamente lentos a carregar miniaturas da memória. Ative esta opção para preferir imagens remotas.", "advanced_settings_prefer_remote_subtitle": "Alguns dispositivos são extremamente lentos para carregar miniaturas da memória. Ative esta opção para preferir imagens do servidor.",
"advanced_settings_prefer_remote_title": "Preferir imagens remotas", "advanced_settings_prefer_remote_title": "Preferir imagens do servidor",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_subtitle": "Defina os cabeçalhos do proxy que o Immich deve enviar em todas comunicações com a rede",
"advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_proxy_headers_title": "Cabeçalhos do Proxy",
"advanced_settings_self_signed_ssl_subtitle": "Salta a verificação do certificado SSL para o endereço do servidor. Necessário para certificados auto-assinados.", "advanced_settings_self_signed_ssl_subtitle": "Não validar o certificado SSL com o endereço do servidor. Isto é necessário para certificados auto-assinados.",
"advanced_settings_self_signed_ssl_title": "Permitir certificados SSL auto-assinados", "advanced_settings_self_signed_ssl_title": "Permitir certificados SSL auto-assinados",
"advanced_settings_tile_subtitle": "Definições avançadas do utilizador", "advanced_settings_tile_subtitle": "Configurações avançadas do usuário",
"advanced_settings_tile_title": "Avançado", "advanced_settings_tile_title": "Avançado",
"advanced_settings_troubleshooting_subtitle": "Ativar funcionalidades adicionais para a resolução de problemas", "advanced_settings_troubleshooting_subtitle": "Ativar funcionalidades adicionais para a resolução de problemas",
"advanced_settings_troubleshooting_title": "Resolução de problemas", "advanced_settings_troubleshooting_title": "Resolução de problemas",
"album_info_card_backup_album_excluded": "DELETADO", "album_info_card_backup_album_excluded": "EXCLUÍDO",
"album_info_card_backup_album_included": "INCLUÍDO", "album_info_card_backup_album_included": "INCLUÍDO",
"album_thumbnail_card_item": "1 item", "album_thumbnail_card_item": "1 arquivo",
"album_thumbnail_card_items": "{} itens", "album_thumbnail_card_items": "{} arquivos",
"album_thumbnail_card_shared": " · Partilhado", "album_thumbnail_card_shared": " · Compartilhado",
"album_thumbnail_owned": "Seu", "album_thumbnail_owned": "Seu",
"album_thumbnail_shared_by": "Partilhado por {}", "album_thumbnail_shared_by": "Compartilhado por {}",
"album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?", "album_viewer_appbar_delete_confirm": "Tem certeza que deseja excluir este álbum da sua conta?",
"album_viewer_appbar_share_delete": "Deletar álbum", "album_viewer_appbar_share_delete": "Excluir álbum",
"album_viewer_appbar_share_err_delete": "Falha ao deletar álbum", "album_viewer_appbar_share_err_delete": "Falha ao excluir álbum",
"album_viewer_appbar_share_err_leave": "Falha ao sair do álbum", "album_viewer_appbar_share_err_leave": "Falha ao sair do álbum",
"album_viewer_appbar_share_err_remove": "Houveram problemas ao remover itens do álbum", "album_viewer_appbar_share_err_remove": "Houveram problemas ao remover arquivos do álbum",
"album_viewer_appbar_share_err_title": "Falha ao alterar título do álbum", "album_viewer_appbar_share_err_title": "Falha ao alterar título do álbum",
"album_viewer_appbar_share_leave": "Deixar álbum", "album_viewer_appbar_share_leave": "Deixar álbum",
"album_viewer_appbar_share_remove": "Remover do álbum", "album_viewer_appbar_share_remove": "Remover do álbum",
"album_viewer_appbar_share_to": "Partilhar com", "album_viewer_appbar_share_to": "Compartilhar com",
"album_viewer_page_share_add_users": "Adicionar usuários", "album_viewer_page_share_add_users": "Adicionar usuários",
"all_people_page_title": "Pessoas", "all_people_page_title": "Pessoas",
"all_videos_page_title": "Vídeos", "all_videos_page_title": "Vídeos",
"app_bar_signout_dialog_content": "Tem a certeza que deseja sair?", "app_bar_signout_dialog_content": "Tem certeza que deseja sair?",
"app_bar_signout_dialog_ok": "Sim", "app_bar_signout_dialog_ok": "Sim",
"app_bar_signout_dialog_title": "Sair", "app_bar_signout_dialog_title": "Sair",
"archive_page_no_archived_assets": "Nenhum recurso arquivado encontrado", "archive_page_no_archived_assets": "Nenhum arquivo encontrado",
"archive_page_title": "Arquivo ({})", "archive_page_title": "Arquivado ({})",
"asset_action_delete_err_read_only": "Não é possível eliminar o(s) recurso(s) só de leitura, ignorando", "asset_action_delete_err_read_only": "Não é possível excluir arquivo só leitura, ignorando",
"asset_action_share_err_offline": "Não é possível obter recurso(s) offline, ignorando", "asset_action_share_err_offline": "Não foi possível obter os arquivos offline, ignorando",
"asset_list_group_by_sub_title": "Agrupar por", "asset_list_group_by_sub_title": "Agrupar por",
"asset_list_layout_settings_dynamic_layout_title": "Disposição dinâmica", "asset_list_layout_settings_dynamic_layout_title": "Layout dinâmico",
"asset_list_layout_settings_group_automatically": "Automático", "asset_list_layout_settings_group_automatically": "Automático",
"asset_list_layout_settings_group_by": "Agrupar recursos por", "asset_list_layout_settings_group_by": "Agrupar arquivos por",
"asset_list_layout_settings_group_by_month": "Mês", "asset_list_layout_settings_group_by_month": "Mês",
"asset_list_layout_settings_group_by_month_day": "Mês + dia", "asset_list_layout_settings_group_by_month_day": "Mês + dia",
"asset_list_layout_sub_title": "Disposição", "asset_list_layout_sub_title": "Disposição",
"asset_list_settings_subtitle": "Configurações de layout da grelha de fotos", "asset_list_settings_subtitle": "Configurações de disposição da grade de fotos",
"asset_list_settings_title": "Grelha de fotos", "asset_list_settings_title": "Grade de fotos",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Arquivo restaurado com sucesso",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} arquivo(s) excluído permanentemente",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} arquivo(s) excluídos permanentemente do servidor",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} arquivo(s) removidos permanentemente do seu dispositivo",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} arquivo(s) restaurados com sucesso",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} arquivo(s) enviados para a lixeira",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} arquivo(s) do servidor foram enviados para a lixeira",
"asset_viewer_settings_title": "Visualizador de recursos", "asset_viewer_settings_title": "Visualizador",
"backup_album_selection_page_albums_device": "Álbuns no dispositivo ({})", "backup_album_selection_page_albums_device": "Álbuns no dispositivo ({})",
"backup_album_selection_page_albums_tap": "Toque para incluir, duplo toque para exluir", "backup_album_selection_page_albums_tap": "Toque para incluir, duplo toque para excluir",
"backup_album_selection_page_assets_scatter": "Os itens podem estar espalhados por vários álbuns. Assim, os álbuns podem ser incluídos ou excluídos durante o processo de backup.", "backup_album_selection_page_assets_scatter": "Os arquivos podem estar espalhados em vários álbuns. Assim, os álbuns podem ser incluídos ou excluídos durante o processo de backup.",
"backup_album_selection_page_select_albums": "Selecione Álbuns", "backup_album_selection_page_select_albums": "Selecione Álbuns",
"backup_album_selection_page_selection_info": "Informações da Seleção", "backup_album_selection_page_selection_info": "Informações da Seleção",
"backup_album_selection_page_total_assets": "Total de itens únicos", "backup_album_selection_page_total_assets": "Total de arquivos únicos",
"backup_all": "Tudo", "backup_all": "Tudo",
"backup_background_service_backup_failed_message": "Falha ao fazer backup dos itens. Tentando novamente…", "backup_background_service_backup_failed_message": "Falha ao fazer backup dos arquivos. Tentando novamente…",
"backup_background_service_connection_failed_message": "Falha na conexão com o servidor. Tentando novamente...", "backup_background_service_connection_failed_message": "Falha na conexão com o servidor. Tentando novamente...",
"backup_background_service_current_upload_notification": "Carregando {}", "backup_background_service_current_upload_notification": "Enviando {}",
"backup_background_service_default_notification": "Verificando novos itens…", "backup_background_service_default_notification": "Verificando novos arquivos…",
"backup_background_service_error_title": "Erro de backup", "backup_background_service_error_title": "Erro de backup",
"backup_background_service_in_progress_notification": "Fazendo backup de seus itens…", "backup_background_service_in_progress_notification": "Fazendo backup dos arquivos…",
"backup_background_service_upload_failure_notification": "Falha ao carregar {}", "backup_background_service_upload_failure_notification": "Falha ao carregar {}",
"backup_controller_page_albums": "Backup Álbuns", "backup_controller_page_albums": "Backup Álbuns",
"backup_controller_page_background_app_refresh_disabled_content": "Active a atualização de aplicações em segundo plano em Definições > Geral > Atualização de aplicações em segundo plano para utilizar a cópia de segurança em segundo plano.", "backup_controller_page_background_app_refresh_disabled_content": "Para utilizar o backup em segundo plano, ative a atualização da aplicação em segundo plano em Configurações > Geral > Atualização do app em segundo plano ",
"backup_controller_page_background_app_refresh_disabled_title": "Atualização da app em segundo plano desativada", "backup_controller_page_background_app_refresh_disabled_title": "Atualização do app em segundo plano desativada",
"backup_controller_page_background_app_refresh_enable_button_text": "Ir para as definições", "backup_controller_page_background_app_refresh_enable_button_text": "Ir para as configurações",
"backup_controller_page_background_battery_info_link": "Mostre-me como", "backup_controller_page_background_battery_info_link": "Mostre-me como",
"backup_controller_page_background_battery_info_message": "Para obter a melhor experiência de backup em segundo plano, desative todas as otimizações de bateria que restrinjam a atividade em segundo plano do Immich.\n\nComo isso é específico do dispositivo, consulte as informações necessárias do fabricante do dispositivo.", "backup_controller_page_background_battery_info_message": "Para obter a melhor experiência de backup em segundo plano, desative todas as otimizações de bateria que restrinjam a atividade em segundo plano do Immich.\n\nComo isso é específico por dispositivo, consulte as informações de como fazer isso com o fabricante do dispositivo.",
"backup_controller_page_background_battery_info_ok": "OK", "backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Otimizações de bateria", "backup_controller_page_background_battery_info_title": "Otimizações de bateria",
"backup_controller_page_background_charging": "Somente durante o carregamento", "backup_controller_page_background_charging": "Apenas enquanto carrega a bateria",
"backup_controller_page_background_configure_error": "Falha ao configurar o serviço em segundo plano", "backup_controller_page_background_configure_error": "Falha ao configurar o serviço em segundo plano",
"backup_controller_page_background_delay": "Atrasar o backup de novos ativos: {}", "backup_controller_page_background_delay": "Atrasar o backup de novos arquivos: {}",
"backup_controller_page_background_description": "Ative o serviço em segundo plano para fazer backup automático de novos itens sem precisar abrir o aplicativo", "backup_controller_page_background_description": "Ative o serviço em segundo plano para fazer backup automático de novos arquivos sem precisar abrir o aplicativo",
"backup_controller_page_background_is_off": "O backup automático em segundo plano está desativado", "backup_controller_page_background_is_off": "O backup automático em segundo plano está desativado",
"backup_controller_page_background_is_on": "O backup automático em segundo plano está ativado", "backup_controller_page_background_is_on": "O backup automático em segundo plano está ativado",
"backup_controller_page_background_turn_off": "Desativar o serviço em segundo plano", "backup_controller_page_background_turn_off": "Desativar o serviço em segundo plano",
"backup_controller_page_background_turn_on": "Ativar o serviço em segundo plano", "backup_controller_page_background_turn_on": "Ativar o serviço em segundo plano",
"backup_controller_page_background_wifi": "Apenas Wi-Fi", "backup_controller_page_background_wifi": "Apenas no WiFi",
"backup_controller_page_backup": "Backup", "backup_controller_page_backup": "Backup",
"backup_controller_page_backup_selected": "Selecionado:", "backup_controller_page_backup_selected": "Selecionado:",
"backup_controller_page_backup_sub": "Fotos e vídeos salvos em backup", "backup_controller_page_backup_sub": "Fotos e vídeos salvos em backup",
"backup_controller_page_cancel": "Cancelar", "backup_controller_page_cancel": "Cancelar",
"backup_controller_page_created": "Criado em: {}", "backup_controller_page_created": "Criado em: {}",
"backup_controller_page_desc_backup": "Ligue o backup para fazer o upload automático de novos itens para o servidor. ", "backup_controller_page_desc_backup": "Ative o backup para enviar automáticamente novos arquivos para o servidor.",
"backup_controller_page_excluded": "Excluídos:", "backup_controller_page_excluded": "Excluídos:",
"backup_controller_page_failed": "Falhou ({})", "backup_controller_page_failed": "Falhou ({})",
"backup_controller_page_filename": "Nome do arquivo: {} [{}]", "backup_controller_page_filename": "Nome do arquivo: {} [{}]",
@ -106,160 +106,165 @@
"backup_controller_page_info": "Informações do backup", "backup_controller_page_info": "Informações do backup",
"backup_controller_page_none_selected": "Nenhum selecionado", "backup_controller_page_none_selected": "Nenhum selecionado",
"backup_controller_page_remainder": "Restante", "backup_controller_page_remainder": "Restante",
"backup_controller_page_remainder_sub": "Fotos e vídeos restantes para fazer backup da seleção", "backup_controller_page_remainder_sub": "Fotos e vídeos selecionados restantes para fazer backup",
"backup_controller_page_select": "Selecione", "backup_controller_page_select": "Selecione",
"backup_controller_page_server_storage": "Armazenamento no servidor", "backup_controller_page_server_storage": "Armazenamento no servidor",
"backup_controller_page_start_backup": "Iniciar Backup", "backup_controller_page_start_backup": "Iniciar Backup",
"backup_controller_page_status_off": "Backup está desligado", "backup_controller_page_status_off": "Backup automático desativado",
"backup_controller_page_status_on": "Backup está ligado", "backup_controller_page_status_on": "Backup automático ativado",
"backup_controller_page_storage_format": "{} de {} usados", "backup_controller_page_storage_format": "{} de {} usados",
"backup_controller_page_to_backup": "Álbuns para fazer backup", "backup_controller_page_to_backup": "Álbuns para fazer backup",
"backup_controller_page_total": "Total", "backup_controller_page_total": "Total",
"backup_controller_page_total_sub": "Todas as fotos e vídeos dos álbuns selecionados", "backup_controller_page_total_sub": "Todas as fotos e vídeos dos álbuns selecionados",
"backup_controller_page_turn_off": "Desligar backup", "backup_controller_page_turn_off": "Desativar backup",
"backup_controller_page_turn_on": "Ativar backup", "backup_controller_page_turn_on": "Ativar backup",
"backup_controller_page_uploading_file_info": "Carregando informações do arquivo", "backup_controller_page_uploading_file_info": "Carregando informações do arquivo",
"backup_err_only_album": "Não é possível remover apenas o álbum", "backup_err_only_album": "Não é possível remover apenas o álbum",
"backup_info_card_assets": "itens", "backup_info_card_assets": "arquivos",
"backup_manual_cancelled": "Cancelado", "backup_manual_cancelled": "Cancelado",
"backup_manual_failed": "Falhou", "backup_manual_failed": "Falhou",
"backup_manual_in_progress": "Carregamento em curso. Tente depois de algum tempo", "backup_manual_in_progress": "Envio já está em progresso. Tente novamente mais tarde",
"backup_manual_success": "Sucesso", "backup_manual_success": "Sucesso",
"backup_manual_title": "Estado do carregamento", "backup_manual_title": "Estado do envio",
"backup_options_page_title": "Backup options", "backup_options_page_title": "Opções de backup",
"cache_settings_album_thumbnails": "Miniaturas da página da biblioteca ({} itens)", "cache_settings_album_thumbnails": "Miniaturas da página da biblioteca ({} arquivos)",
"cache_settings_clear_cache_button": "Limpar cache", "cache_settings_clear_cache_button": "Limpar cache",
"cache_settings_clear_cache_button_title": "Limpa o cache do aplicativo. Isso afetará significativamente o desempenho do aplicativo até que o cache seja reconstruído.", "cache_settings_clear_cache_button_title": "Limpa o cache do aplicativo. Isso afetará significativamente o desempenho do aplicativo até que o cache seja reconstruído.",
"cache_settings_duplicated_assets_clear_button": "LIMPAR", "cache_settings_duplicated_assets_clear_button": "LIMPAR",
"cache_settings_duplicated_assets_subtitle": "Fotografias e vídeos que estão na lista negra da aplicação", "cache_settings_duplicated_assets_subtitle": "Fotos e vídeos que estão na lista negra da aplicação",
"cache_settings_duplicated_assets_title": "Recursos duplicados ({})", "cache_settings_duplicated_assets_title": "Arquivos duplicados ({})",
"cache_settings_image_cache_size": "Tamanho do cache de imagem ({} itens)", "cache_settings_image_cache_size": "Tamanho do cache de imagem ({} arquivos)",
"cache_settings_statistics_album": "Miniaturas da biblioteca", "cache_settings_statistics_album": "Miniaturas da biblioteca",
"cache_settings_statistics_assets": "{} itens ({})", "cache_settings_statistics_assets": "{} arquivos ({})",
"cache_settings_statistics_full": "Imagens completas", "cache_settings_statistics_full": "Imagens completas",
"cache_settings_statistics_shared": "Miniaturas de álbuns partilhados", "cache_settings_statistics_shared": "Miniaturas de álbuns compartilhados",
"cache_settings_statistics_thumbnail": "Miniaturas", "cache_settings_statistics_thumbnail": "Miniaturas",
"cache_settings_statistics_title": "Uso de cache", "cache_settings_statistics_title": "Uso de cache",
"cache_settings_subtitle": "Controle o comportamento de cache do aplicativo Immich", "cache_settings_subtitle": "Controle o comportamento de cache do aplicativo Immich",
"cache_settings_thumbnail_size": "Tamanho do cache de miniaturas ({} itens)", "cache_settings_thumbnail_size": "Tamanho do cache de miniaturas ({} arquivos)",
"cache_settings_tile_subtitle": "Controlar o comportamento do armazenamento local", "cache_settings_tile_subtitle": "Controlar o comportamento do armazenamento local",
"cache_settings_tile_title": "Armazenamento local", "cache_settings_tile_title": "Armazenamento local",
"cache_settings_title": "Configurações de cache", "cache_settings_title": "Configurações de cache",
"change_password_form_confirm_password": "Confirme a senha", "change_password_form_confirm_password": "Confirme a senha",
"change_password_form_description": "Olá {name},\n\nÉ a primeira vez que entra no sistema ou foi-lhe pedido que alterasse a sua palavra-passe. Introduza a nova palavra-passe abaixo.", "change_password_form_description": "Esta é a primeira vez que você está acessando o sistema ou foi feita uma solicitação para alterar sua senha. Por favor, insira a nova senha abaixo.",
"change_password_form_new_password": "Nova senha", "change_password_form_new_password": "Nova senha",
"change_password_form_password_mismatch": "As senhas não coincidem", "change_password_form_password_mismatch": "As senhas não estão iguais",
"change_password_form_reenter_new_password": "Re-introduza a nova senha", "change_password_form_reenter_new_password": "Confirme a nova senha",
"client_cert_dialog_msg_confirm": "OK", "client_cert_dialog_msg_confirm": "OK",
"client_cert_enter_password": "Enter Password", "client_cert_enter_password": "Digite a senha",
"client_cert_import": "Import", "client_cert_import": "Importar",
"client_cert_import_success_msg": "Client certificate is imported", "client_cert_import_success_msg": "Certificado do cliente foi importado",
"client_cert_invalid_msg": "Invalid certificate file or wrong password", "client_cert_invalid_msg": "Certificado inválido ou senha incorreta",
"client_cert_remove": "Remove", "client_cert_remove": "Remover",
"client_cert_remove_msg": "Client certificate is removed", "client_cert_remove_msg": "Certificado do cliente foi removido",
"client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login", "client_cert_subtitle": "Somente há suporte ao formato PKCS12 (.p12, .pfx). Importar/Remover certificados está disponivel somente durante o login",
"client_cert_title": "SSL Client Certificate", "client_cert_title": "Certificado de Cliente SSL",
"common_add_to_album": "Adicionar ao álbum", "common_add_to_album": "Adicionar ao álbum",
"common_change_password": "Mudar a senha", "common_change_password": "Mudar a senha",
"common_create_new_album": "Criar novo álbum", "common_create_new_album": "Criar novo álbum",
"common_server_error": "Verifique a sua ligação de rede, certifique-se de que o servidor está acessível e de que as versões da aplicação/servidor são compatíveis.", "common_server_error": "Verifique a sua conexão de rede, certifique-se de que o servidor está acessível e de que as versões da aplicação/servidor são compatíveis.",
"common_shared": "Partilhado", "common_shared": "Compartilhado",
"contextual_search": "Sunrise on the beach", "contextual_search": "Nascer do sol na praia",
"control_bottom_app_bar_add_to_album": "Adicionar ao álbum", "control_bottom_app_bar_add_to_album": "Adicionar ao álbum",
"control_bottom_app_bar_album_info": "{} itens", "control_bottom_app_bar_album_info": "{} arquivos",
"control_bottom_app_bar_album_info_shared": "{} itens · Partilhado", "control_bottom_app_bar_album_info_shared": "{} arquivos · Compartilhado",
"control_bottom_app_bar_archive": "Arquivo", "control_bottom_app_bar_archive": "Arquivar",
"control_bottom_app_bar_create_new_album": "Criar novo álbum", "control_bottom_app_bar_create_new_album": "Criar novo álbum",
"control_bottom_app_bar_delete": "Deletar", "control_bottom_app_bar_delete": "Excluir ",
"control_bottom_app_bar_delete_from_immich": "Apagar do Immich", "control_bottom_app_bar_delete_from_immich": "Excluir do Immich",
"control_bottom_app_bar_delete_from_local": "Apagar do dispositivo", "control_bottom_app_bar_delete_from_local": "Excluir do dispositivo",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_download": "Baixar",
"control_bottom_app_bar_edit": "Editar",
"control_bottom_app_bar_edit_location": "Editar Localização", "control_bottom_app_bar_edit_location": "Editar Localização",
"control_bottom_app_bar_edit_time": "Editar Data & Hora", "control_bottom_app_bar_edit_time": "Editar Data & Hora",
"control_bottom_app_bar_favorite": "Favorito", "control_bottom_app_bar_favorite": "Favorito",
"control_bottom_app_bar_share": "Partilhar", "control_bottom_app_bar_share": "Compartilhar",
"control_bottom_app_bar_share_to": "Partilhar com", "control_bottom_app_bar_share_to": "Compartilhar com",
"control_bottom_app_bar_stack": "Empilhar", "control_bottom_app_bar_stack": "Empilhar",
"control_bottom_app_bar_trash_from_immich": "Mover para o lixo", "control_bottom_app_bar_trash_from_immich": "Mover para a lixeira",
"control_bottom_app_bar_unarchive": "Desarquivar", "control_bottom_app_bar_unarchive": "Desarquivar",
"control_bottom_app_bar_unfavorite": "Remover favorito", "control_bottom_app_bar_unfavorite": "Remover favorito",
"control_bottom_app_bar_upload": "Carregar", "control_bottom_app_bar_upload": "Enviar",
"create_album_page_untitled": "Sem título", "create_album_page_untitled": "Sem título",
"create_shared_album_page_create": "Criar", "create_shared_album_page_create": "Criar",
"create_shared_album_page_share": "Partilhar", "create_shared_album_page_share": "Compartilhar",
"create_shared_album_page_share_add_assets": "ADICIONAR ITENS", "create_shared_album_page_share_add_assets": "ADICIONAR ARQUIVOS",
"create_shared_album_page_share_select_photos": "Selecionar Fotos", "create_shared_album_page_share_select_photos": "Selecionar Fotos",
"curated_location_page_title": "Sítios", "crop": "Crop",
"curated_location_page_title": "Locais",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy", "daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a", "date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Esses itens serão permanentemente deletados do Immich e do seu dispositivo", "delete_dialog_alert": "Esses arquivos serão permanentemente apagados do Immich e de seu dispositivo",
"delete_dialog_alert_local": "Estes itens serão removidos permanentemente do seu dispositivo, mas continuarão disponíveis no servidor Immich", "delete_dialog_alert_local": "Estes arquivos serão permanentemente excluídos do seu dispositivo, mas continuarão disponíveis no servidor Immich",
"delete_dialog_alert_local_non_backed_up": "Alguns dos itens não estão guardados no Immich e serão removidos permanentemente do seu dispositivo", "delete_dialog_alert_local_non_backed_up": "Não há backup de alguns dos arquivos no servidor e eles serão excluídos permanentemente do seu dispositivo",
"delete_dialog_alert_remote": "Estes itens serão permanentemente eliminados do servidor Immich", "delete_dialog_alert_remote": "Estes arquivos serão permanentemente excluídos do servidor Immich",
"delete_dialog_cancel": "Cancelar", "delete_dialog_cancel": "Cancelar",
"delete_dialog_ok": "Deletar", "delete_dialog_ok": "Excluir",
"delete_dialog_ok_force": "Apagar de qualquer forma", "delete_dialog_ok_force": "Excluir mesmo assim",
"delete_dialog_title": "Deletar Permanentemente", "delete_dialog_title": "Excluir Permanentemente",
"delete_local_dialog_ok_backed_up_only": "Eliminar apenas existentes na cópia de segurança", "delete_local_dialog_ok_backed_up_only": "Excluir apenas arquivos com backup",
"delete_local_dialog_ok_force": "Apagar de qualquer forma", "delete_local_dialog_ok_force": "Excluir mesmo assim",
"delete_shared_link_dialog_content": "Tem a certeza de que pretende apagar esta ligação partilhada?", "delete_shared_link_dialog_content": "Tem certeza que deseja excluir este link compartilhado?",
"delete_shared_link_dialog_title": "Apagar link de partilha", "delete_shared_link_dialog_title": "Excluir link compartilhado",
"description_input_hint_text": "Adicionar descrição...", "description_input_hint_text": "Adicionar descrição...",
"description_input_submit_error": "Erro ao atualizar a descrição, verifique o registo para obter mais detalhes", "description_input_submit_error": "Erro ao atualizar a descrição, verifique o registo para obter mais detalhes",
"edit_date_time_dialog_date_time": "Data e Hora", "edit_date_time_dialog_date_time": "Data e Hora",
"edit_date_time_dialog_timezone": "Fuso horário", "edit_date_time_dialog_timezone": "Fuso horário",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Localização", "edit_location_dialog_title": "Localização",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Adicionar Descrição...", "exif_bottom_sheet_description": "Adicionar Descrição...",
"exif_bottom_sheet_details": "DETALHES", "exif_bottom_sheet_details": "DETALHES",
"exif_bottom_sheet_location": "LOCALIZAÇÃO", "exif_bottom_sheet_location": "LOCALIZAÇÃO",
"exif_bottom_sheet_location_add": "Adicionar uma localização", "exif_bottom_sheet_location_add": "Adicionar uma localização",
"exif_bottom_sheet_people": "Pessoas", "exif_bottom_sheet_people": "PESSOAS",
"exif_bottom_sheet_person_add_person": "Adicionar nome", "exif_bottom_sheet_person_add_person": "Adicionar nome",
"experimental_settings_new_asset_list_subtitle": "Trabalho em andamento", "experimental_settings_new_asset_list_subtitle": "Trabalho em andamento",
"experimental_settings_new_asset_list_title": "Ativar visualização de grelha experimental", "experimental_settings_new_asset_list_title": "Ativar visualização de grade experimental",
"experimental_settings_subtitle": "Use por sua conta e risco!", "experimental_settings_subtitle": "Use por sua conta e risco!",
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "Nenhum recurso favorito encontrado", "favorites_page_no_favorites": "Nenhum favorito encontrado",
"favorites_page_title": "Favoritos", "favorites_page_title": "Favoritos",
"filename_search": "File name or extension", "filename_search": "Nome do arquivo ou extensão",
"haptic_feedback_switch": "Enable haptic feedback", "haptic_feedback_switch": "Habilitar vibração",
"haptic_feedback_title": "Haptic Feedback", "haptic_feedback_title": "Vibração",
"header_settings_add_header_tip": "Add Header", "header_settings_add_header_tip": "Adicionar cabeçalho",
"header_settings_field_validator_msg": "Value cannot be empty", "header_settings_field_validator_msg": "Campo deve ser preenchido",
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Nome do cabeçalho",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Valor do cabeçalho",
"header_settings_page_title": "Proxy Headers", "header_settings_page_title": "Cabeçalhos do Proxy",
"headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", "headers_settings_tile_subtitle": "Defina os cabeçalhos do proxy que o aplicativo deve enviar em todas comunicações com a rede",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Cabeçalhos do Proxy customizados",
"home_page_add_to_album_conflicts": "Ativos {added} adicionados ao álbum {album}. {failed} ativos já estão no álbum.", "home_page_add_to_album_conflicts": "Adicionado {added} arquivos ao álbum {album}. {failed} arquivos já estão no álbum.",
"home_page_add_to_album_err_local": "Ainda não é possível adicionar recursos locais aos álbuns, ignorando", "home_page_add_to_album_err_local": "Ainda não é possível adicionar recursos locais aos álbuns, ignorando",
"home_page_add_to_album_success": "Ativos {added} adicionados ao álbum {album}.", "home_page_add_to_album_success": "Adicionado {added} arquivos ao álbum {album}.",
"home_page_album_err_partner": "Ainda não é possível adicionar recursos do parceiro a um álbum, ignorando", "home_page_album_err_partner": "Ainda não é possível adicionar arquivos do parceiro a um álbum, ignorando",
"home_page_archive_err_local": "Ainda não é possível arquivar recursos locais, ignorando", "home_page_archive_err_local": "Ainda não é possível arquivar recursos locais, ignorando",
"home_page_archive_err_partner": "Não é possível arquivar recursos do parceiro, ignorando", "home_page_archive_err_partner": "Não é possível arquivar Fotos e Videos do parceiro, ignorando",
"home_page_building_timeline": "A construir a timeline", "home_page_building_timeline": "Construindo a linha do tempo",
"home_page_delete_err_partner": "Não é possível apagar recursos do parceiro, ignorando", "home_page_delete_err_partner": "Não é possível excluir arquivos do parceiro, ignorando",
"home_page_delete_remote_err_local": "Recursos locais na seleção remota de eliminação, ignorando", "home_page_delete_remote_err_local": "Foram selecionados arquivos locais para excluir remotamente, ignorando",
"home_page_favorite_err_local": "Ainda não é possível adicionar recursos locais favoritos, ignorando", "home_page_favorite_err_local": "Ainda não é possível adicionar recursos locais favoritos, ignorando",
"home_page_favorite_err_partner": "Ainda não é possível marcar como favoritos recursos do parceiro, ignorando", "home_page_favorite_err_partner": "Ainda não é possível marcar arquivos do parceiro como favoritos, ignorando",
"home_page_first_time_notice": "Se for a primeira vez que utiliza a aplicação, certifique-se de que escolhe um álbum ou álbuns de cópia de segurança, para que a linha cronológica possa preencher as fotografias e os vídeos no(s) álbum(s).", "home_page_first_time_notice": "Se é a primeira vez que utiliza o aplicativo, certifique-se de marcar um ou mais álbuns do dispositivo para backup, assim a linha do tempo será preenchida com as fotos e vídeos.",
"home_page_share_err_local": "Não é possível partilhar recursos locais via link, ignorando", "home_page_share_err_local": "Não é possível compartilhar arquivos locais com um link, ignorando",
"home_page_upload_err_limit": "Só é possível carregar 30 recursos de cada vez, a ignorar", "home_page_upload_err_limit": "Só é possível enviar 30 arquivos por vez, ignorando",
"image_viewer_page_state_provider_download_error": "Erro ao descarregar", "image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_error": "Erro ao baixar",
"image_viewer_page_state_provider_download_success": "Descarregado", "image_viewer_page_state_provider_download_started": "Baixando arquivo",
"image_viewer_page_state_provider_share_error": "Erro ao partilhar", "image_viewer_page_state_provider_download_success": "Baixado com sucesso",
"invalid_date": "Invalid date", "image_viewer_page_state_provider_share_error": "Erro ao compartilhar",
"invalid_date_format": "Invalid date format", "invalid_date": "Data inválida",
"invalid_date_format": "Formato de data inválido",
"library_page_albums": "Álbuns", "library_page_albums": "Álbuns",
"library_page_archive": "Arquivo", "library_page_archive": "Arquivado",
"library_page_device_albums": "Álbuns no dispositivo", "library_page_device_albums": "Álbuns no dispositivo",
"library_page_favorites": "Favoritos", "library_page_favorites": "Favoritos",
"library_page_new_album": "Novo álbum", "library_page_new_album": "Novo álbum",
"library_page_sharing": "Partilhar", "library_page_sharing": "Compartilhar",
"library_page_sort_asset_count": "Número de recursos", "library_page_sort_asset_count": "Quantidade de arquivos",
"library_page_sort_created": "Data de criação", "library_page_sort_created": "Data de criação",
"library_page_sort_last_modified": "Última modificação", "library_page_sort_last_modified": "Última modificação",
"library_page_sort_most_oldest_photo": "Foto mais antiga", "library_page_sort_most_oldest_photo": "Foto mais antiga",
@ -267,47 +272,47 @@
"library_page_sort_title": "Título do álbum", "library_page_sort_title": "Título do álbum",
"location_picker_choose_on_map": "Escolha no mapa", "location_picker_choose_on_map": "Escolha no mapa",
"location_picker_latitude": "Latitude", "location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Introduza uma latitude válida", "location_picker_latitude_error": "Digite uma latitude válida",
"location_picker_latitude_hint": "Introduza aqui a latitude", "location_picker_latitude_hint": "Digite a latitude",
"location_picker_longitude": "Longitude", "location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Introduza uma longitude válida", "location_picker_longitude_error": "Digite uma longitude válida",
"location_picker_longitude_hint": "Introduza aqui a longitude", "location_picker_longitude_hint": "Digite a longitude",
"login_disabled": "Login desativado", "login_disabled": "Login desativado",
"login_form_api_exception": "Excepção de API. Verifique o URL do servidor e tente novamente.", "login_form_api_exception": "Erro de API. Verifique a URL do servidor e tente novamente.",
"login_form_back_button_text": "Voltar", "login_form_back_button_text": "Voltar",
"login_form_button_text": "Login", "login_form_button_text": "Login",
"login_form_email_hint": "seuemail@email.com", "login_form_email_hint": "seuemail@email.com",
"login_form_endpoint_hint": "http://ip-do-seu-servidor:porta/api", "login_form_endpoint_hint": "http://ip-do-seu-servidor:porta/api",
"login_form_endpoint_url": "URL do endpoint do servidor", "login_form_endpoint_url": "URL do servidor",
"login_form_err_http": "Por favor especifique http:// ou https://", "login_form_err_http": "Por favor especifique http:// ou https://",
"login_form_err_invalid_email": "Email Inválido", "login_form_err_invalid_email": "Email Inválido",
"login_form_err_invalid_url": "URL inválida", "login_form_err_invalid_url": "URL inválida",
"login_form_err_leading_whitespace": "Espaço em branco no início", "login_form_err_leading_whitespace": "Espaço em branco no início",
"login_form_err_trailing_whitespace": "Espaço em branco no fim", "login_form_err_trailing_whitespace": "Espaço em branco no fim",
"login_form_failed_get_oauth_server_config": "Erro ao registrar usando OAuth, verifique o URL do servidor", "login_form_failed_get_oauth_server_config": "Erro de login com OAuth, verifique a URL do servidor",
"login_form_failed_get_oauth_server_disable": "O recurso OAuth não está disponível neste servidor", "login_form_failed_get_oauth_server_disable": "O recurso OAuth não está disponível neste servidor",
"login_form_failed_login": "Erro ao fazer login, verifique a url do servidor, email e senha", "login_form_failed_login": "Erro ao fazer login, verifique a URL do servidor, email e senha",
"login_form_handshake_exception": "Ocorreu um erro ao ligar ao servidor. Ative o suporte para certificados auto-assinados nas definições se estiver a utilizar um certificado auto-assinado.", "login_form_handshake_exception": "Erro ao conectar com o servidor. Ative o suporte para certificados auto-assinados nas configurações se estiver utilizando um certificado auto-assinado.",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Senha", "login_form_label_password": "Senha",
"login_form_next_button": "Avançar", "login_form_next_button": "Próximo",
"login_form_password_hint": "senha", "login_form_password_hint": "senha",
"login_form_save_login": "Permanecer logado", "login_form_save_login": "Lembrar login",
"login_form_server_empty": "Introduzir um URL de servidor.", "login_form_server_empty": "Digite a URL de servidor.",
"login_form_server_error": "Não foi possível ligar ao servidor.", "login_form_server_error": "Não foi possível conectar ao servidor.",
"login_password_changed_error": "Erro ao atualizar a sua password", "login_password_changed_error": "Erro ao atualizar a sua senha",
"login_password_changed_success": "Password atualizada com sucesso", "login_password_changed_success": "Senha atualizada com sucesso",
"map_assets_in_bound": "{} foto", "map_assets_in_bound": "{} foto",
"map_assets_in_bounds": "{} fotos", "map_assets_in_bounds": "{} fotos",
"map_cannot_get_user_location": "Impossível obter a sua localização", "map_cannot_get_user_location": "Impossível obter a sua localização",
"map_location_dialog_cancel": "Cancelar", "map_location_dialog_cancel": "Cancelar",
"map_location_dialog_yes": "Sim", "map_location_dialog_yes": "Sim",
"map_location_picker_page_use_location": "Utilizar esta localização", "map_location_picker_page_use_location": "Utilizar esta localização",
"map_location_service_disabled_content": "Serviço de localização precisa de estar ativado para mostrar recursos da localização atual. Pretende ativar agora?", "map_location_service_disabled_content": "Serviço de localização precisa de estar ativado para mostrar recursos da localização atual. Deseja ativar agora?",
"map_location_service_disabled_title": "Serviço de localização desativado", "map_location_service_disabled_title": "Serviço de localização desativado",
"map_no_assets_in_bounds": "Não há fotos nesta área", "map_no_assets_in_bounds": "Não há fotos nesta área",
"map_no_location_permission_content": "A permissão de localização é necessária para apresentar recursos da sua localização atual. Pretende autorizá-la agora?\n", "map_no_location_permission_content": "A permissão da localização é necessária para mostrar recursos da localização atual. Deseja conceder a permissão agora?",
"map_no_location_permission_title": "Permissão de localização negada", "map_no_location_permission_title": "Permissão de localização foi negada",
"map_settings_dark_mode": "Modo escuro", "map_settings_dark_mode": "Modo escuro",
"map_settings_date_range_option_all": "Tudo", "map_settings_date_range_option_all": "Tudo",
"map_settings_date_range_option_day": "Últimas 24 horas", "map_settings_date_range_option_day": "Últimas 24 horas",
@ -315,57 +320,57 @@
"map_settings_date_range_option_year": "Último ano", "map_settings_date_range_option_year": "Último ano",
"map_settings_date_range_option_years": "Últimos {} anos", "map_settings_date_range_option_years": "Últimos {} anos",
"map_settings_dialog_cancel": "Cancelar", "map_settings_dialog_cancel": "Cancelar",
"map_settings_dialog_save": "Guardar", "map_settings_dialog_save": "Salvar",
"map_settings_dialog_title": "Definições do mapa", "map_settings_dialog_title": "Configurações do mapa",
"map_settings_include_show_archived": "Incluir arquivados", "map_settings_include_show_archived": "Incluir arquivados",
"map_settings_include_show_partners": "Include Partners", "map_settings_include_show_partners": "Incluir parceiros",
"map_settings_only_relative_range": "Intervalo de datas", "map_settings_only_relative_range": "Intervalo de datas",
"map_settings_only_show_favorites": "Mostrar apenas favoritos", "map_settings_only_show_favorites": "Mostrar apenas favoritos",
"map_settings_theme_settings": "Tema do mapa", "map_settings_theme_settings": "Tema do mapa",
"map_zoom_to_see_photos": "Reduzir zoom para ver fotos", "map_zoom_to_see_photos": "Diminua o zoom para ver mais fotos",
"memories_all_caught_up": "All caught up", "memories_all_caught_up": "Finalizamos por hoje",
"memories_check_back_tomorrow": "Check back tomorrow for more memories", "memories_check_back_tomorrow": "Volte amanhã para ver mais lembranças ",
"memories_start_over": "Start Over", "memories_start_over": "Ver de novo",
"memories_swipe_to_close": "Swipe up to close", "memories_swipe_to_close": "Deslize para cima para fechar",
"memories_year_ago": "A year ago", "memories_year_ago": "Um ano atrás",
"memories_years_ago": "{} years ago", "memories_years_ago": "{} anos atrás",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Fotos com movimento", "motion_photos_page_title": "Fotos com movimento",
"multiselect_grid_edit_date_time_err_read_only": "Não é possível editar a data de recurso(s) só de leitura, ignorando", "multiselect_grid_edit_date_time_err_read_only": "Não é possível editar a data de arquivo só leitura, ignorando",
"multiselect_grid_edit_gps_err_read_only": "Não é possível editar a localização de recurso(s) só de leitura, ignorando", "multiselect_grid_edit_gps_err_read_only": "Não é possível editar a localização de arquivo só leitura, ignorando",
"no_assets_to_show": "No assets to show", "no_assets_to_show": "Não há arquivos para exibir",
"no_name": "No name", "no_name": "Sem nome",
"notification_permission_dialog_cancel": "Cancelar", "notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para ativar as notificações, vá a Definições e selecione permitir.", "notification_permission_dialog_content": "Para ativar as notificações, vá em Configurações e selecione permitir.",
"notification_permission_dialog_settings": "Definições", "notification_permission_dialog_settings": "Configurações",
"notification_permission_list_tile_content": "Dar permissões para ativar notificações", "notification_permission_list_tile_content": "Dar permissões para ativar notificações",
"notification_permission_list_tile_enable_button": "Ativar notificações", "notification_permission_list_tile_enable_button": "Ativar notificações",
"notification_permission_list_tile_title": "Permissão de notificações", "notification_permission_list_tile_title": "Permissão de notificações",
"partner_list_user_photos": "{user}'s photos", "partner_list_user_photos": "Fotos de {user}",
"partner_list_view_all": "View all", "partner_list_view_all": "Ver tudo",
"partner_page_add_partner": "Adicionar parceiro", "partner_page_add_partner": "Adicionar parceiro",
"partner_page_empty_message": "As suas fotografias ainda não foram partilhadas com nenhum parceiro.", "partner_page_empty_message": "As suas fotos ainda não foram compartilhadas com nenhum parceiro.",
"partner_page_no_more_users": "Não há mais utilizadores para adicionar", "partner_page_no_more_users": "Não há mais usuários para adicionar",
"partner_page_partner_add_failed": "Falha ao adicionar parceiro", "partner_page_partner_add_failed": "Falha ao adicionar parceiro",
"partner_page_select_partner": "Selecionar parceiro", "partner_page_select_partner": "Selecionar parceiro",
"partner_page_shared_to_title": "Partilhado com", "partner_page_shared_to_title": "Compartilhar com",
"partner_page_stop_sharing_content": "{} deixará de poder aceder às suas fotografias.", "partner_page_stop_sharing_content": "{} não poderá mais acessar as suas fotos.",
"partner_page_stop_sharing_title": "Parar de partilhar as suas fotos?", "partner_page_stop_sharing_title": "Parar de compartilhar as suas fotos?",
"partner_page_title": "Parceiro", "partner_page_title": "Parceiro",
"permission_onboarding_back": "Voltar", "permission_onboarding_back": "Voltar",
"permission_onboarding_continue_anyway": "Continuar de qualquer maneira", "permission_onboarding_continue_anyway": "Continuar mesmo assim",
"permission_onboarding_get_started": "Começar", "permission_onboarding_get_started": "Começar",
"permission_onboarding_go_to_settings": "Ir para as definições", "permission_onboarding_go_to_settings": "Ir para as configurações",
"permission_onboarding_grant_permission": "Dar permissão", "permission_onboarding_grant_permission": "Dar permissão",
"permission_onboarding_log_out": "Sair", "permission_onboarding_log_out": "Sair",
"permission_onboarding_permission_denied": "Permissão negada. Para utilizar o Immich, conceda permissões de fotografia e vídeo nas Definições.", "permission_onboarding_permission_denied": "Permissão negada. Para utilizar o Immich, conceda permissões de fotos e vídeo nas configurações.",
"permission_onboarding_permission_granted": "Autorização concedida! Está tudo pronto.", "permission_onboarding_permission_granted": "Permissão concedida! Está tudo pronto.",
"permission_onboarding_permission_limited": "Permissão limitada. Para permitir que o Immich faça cópias de segurança e gira toda a sua coleção de galerias, conceda permissões para fotografias e vídeos nas Definições.", "permission_onboarding_permission_limited": "Permissão limitada. Para permitir que o Immich faça backups e gerencie sua galeria, conceda permissões para fotos e vídeos nas configurações.",
"permission_onboarding_request": "O Immich requer autorização para ver as suas fotografias e vídeos.", "permission_onboarding_request": "O Immich requer autorização para ver as suas fotos e vídeos.",
"preferences_settings_title": "Preferências", "preferences_settings_title": "Preferências",
"profile_drawer_app_logs": "Logs", "profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "A aplicação móvel está desatualizada. Atualize para a versão principal mais recente.", "profile_drawer_client_out_of_date_major": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.",
"profile_drawer_client_out_of_date_minor": "A aplicação móvel está desatualizada. Por favor, atualize para a versão mais recente.", "profile_drawer_client_out_of_date_minor": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.",
"profile_drawer_client_server_up_to_date": "Cliente e Servidor atualizados", "profile_drawer_client_server_up_to_date": "Cliente e Servidor atualizados",
"profile_drawer_documentation": "Documentação", "profile_drawer_documentation": "Documentação",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
@ -373,138 +378,139 @@
"profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.", "profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.",
"profile_drawer_settings": "Configurações", "profile_drawer_settings": "Configurações",
"profile_drawer_sign_out": "Sair", "profile_drawer_sign_out": "Sair",
"profile_drawer_trash": "Lixo", "profile_drawer_trash": "Lixeira",
"recently_added_page_title": "Adicionado recentemente", "recently_added_page_title": "Adicionado recentemente",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Ocorreu um erro", "scaffold_body_error_occurred": "Ocorreu um erro",
"search_bar_hint": "Busque suas fotos", "search_bar_hint": "Pesquisar em suas fotos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Aplicar filtro",
"search_filter_camera": "Camera", "search_filter_camera": "Câmera",
"search_filter_camera_make": "Make", "search_filter_camera_make": "Fabricante",
"search_filter_camera_model": "Model", "search_filter_camera_model": "Modelo",
"search_filter_camera_title": "Select camera type", "search_filter_camera_title": "Selecione o tipo de câmera",
"search_filter_date": "Date", "search_filter_date": "Data",
"search_filter_date_interval": "{start} to {end}", "search_filter_date_interval": "{start} até {end}",
"search_filter_date_title": "Select a date range", "search_filter_date_title": "Selecione a data",
"search_filter_display_option_archive": "Archive", "search_filter_display_option_archive": "Arquivado",
"search_filter_display_option_favorite": "Favorite", "search_filter_display_option_favorite": "Favorito",
"search_filter_display_option_not_in_album": "Not in album", "search_filter_display_option_not_in_album": "Fora de álbum",
"search_filter_display_options": "Display Options", "search_filter_display_options": "Opções de exibição",
"search_filter_display_options_title": "Display options", "search_filter_display_options_title": "Opções de exibição",
"search_filter_location": "Location", "search_filter_location": "Localização",
"search_filter_location_city": "City", "search_filter_location_city": "Cidade",
"search_filter_location_country": "Country", "search_filter_location_country": "País",
"search_filter_location_state": "State", "search_filter_location_state": "Estado",
"search_filter_location_title": "Select location", "search_filter_location_title": "Selecione a localização",
"search_filter_media_type": "Media Type", "search_filter_media_type": "Tipo da mídia",
"search_filter_media_type_all": "All", "search_filter_media_type_all": "Tudo",
"search_filter_media_type_image": "Image", "search_filter_media_type_image": "Imagem",
"search_filter_media_type_title": "Select media type", "search_filter_media_type_title": "Selecione o tipo da mídia",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Vídeo",
"search_filter_people": "People", "search_filter_people": "Pessoas",
"search_filter_people_title": "Select people", "search_filter_people_title": "Selecionar pessoas",
"search_page_categories": "Categorias", "search_page_categories": "Categorias",
"search_page_favorites": "Favoritos", "search_page_favorites": "Favoritos",
"search_page_motion_photos": "Fotos com movimento", "search_page_motion_photos": "Fotos com movimento",
"search_page_no_objects": "Nenhuma informação de objeto disponível", "search_page_no_objects": "Nenhuma informação de objeto disponível",
"search_page_no_places": "Nenhuma informação de sítios disponível", "search_page_no_places": "Nenhuma informação de local disponível",
"search_page_people": "Pessoas", "search_page_people": "Pessoas",
"search_page_person_add_name_dialog_cancel": "Cancelar", "search_page_person_add_name_dialog_cancel": "Cancelar",
"search_page_person_add_name_dialog_hint": "Nome", "search_page_person_add_name_dialog_hint": "Nome",
"search_page_person_add_name_dialog_save": "Guardar", "search_page_person_add_name_dialog_save": "Salvar",
"search_page_person_add_name_dialog_title": "Adicionar um nome", "search_page_person_add_name_dialog_title": "Adicionar um nome",
"search_page_person_add_name_subtitle": "Encontre-os rapidamente pelo nome com a pesquisa", "search_page_person_add_name_subtitle": "Encontre na pesquisa pelo nome",
"search_page_person_add_name_title": "Adicionar um nome", "search_page_person_add_name_title": "Adicionar um nome",
"search_page_person_edit_name": "Editar nome", "search_page_person_edit_name": "Editar nome",
"search_page_places": "Sítios", "search_page_places": "Locais",
"search_page_recently_added": "Adicionado recentemente", "search_page_recently_added": "Adicionado recentemente",
"search_page_screenshots": "Capturas de ecrã", "search_page_screenshots": "Capturas de tela",
"search_page_selfies": "Selfies", "search_page_selfies": "Selfies",
"search_page_things": "Objetos", "search_page_things": "Objetos",
"search_page_videos": "Vídeos", "search_page_videos": "Vídeos",
"search_page_view_all_button": "Ver tudo", "search_page_view_all_button": "Ver tudo",
"search_page_your_activity": "A sua atividade", "search_page_your_activity": "A sua atividade",
"search_page_your_map": "O seu mapa", "search_page_your_map": "O seu mapa",
"search_result_page_new_search_hint": "Nova Busca", "search_result_page_new_search_hint": "Nova Pesquisa",
"search_suggestion_list_smart_search_hint_1": "A pesquisa inteligente está activada por predefinição. Para pesquisar metadados, utilize a sintaxe ", "search_suggestion_list_smart_search_hint_1": "A pesquisa inteligente está ativada por padrão. Para pesquisar metadados, utilize a sintaxe",
"search_suggestion_list_smart_search_hint_2": "m:a-sua-pesquisa", "search_suggestion_list_smart_search_hint_2": "m:a-sua-pesquisa",
"select_additional_user_for_sharing_page_suggestions": "Sugestões", "select_additional_user_for_sharing_page_suggestions": "Sugestões",
"select_user_for_sharing_page_err_album": "Falha ao criar o álbum", "select_user_for_sharing_page_err_album": "Falha ao criar o álbum",
"select_user_for_sharing_page_share_suggestions": "Sugestões", "select_user_for_sharing_page_share_suggestions": "Sugestões",
"server_info_box_app_version": "Versão da app", "server_info_box_app_version": "Versão do app",
"server_info_box_latest_release": "Última versão", "server_info_box_latest_release": "Versão mais recente",
"server_info_box_server_url": "URL do servidor", "server_info_box_server_url": "URL do servidor",
"server_info_box_server_version": "Versão do servidor", "server_info_box_server_version": "Versão do servidor",
"setting_image_viewer_help": "O visualizador de detalhes carrega primeiro a miniatura pequena, depois carrega a visualização de tamanho médio (se ativado) e, finalmente, carrega o original (se ativado).", "setting_image_viewer_help": "O visualizador carrega primeiro a miniatura pequena, depois carrega a visualização de tamanho médio (se ativado) e, finalmente, carrega o original (se ativado).",
"setting_image_viewer_original_subtitle": "Ative para carregar a imagem original em resolução total (grande!). Desative para reduzir o uso de dados (na rede e no cache do dispositivo).", "setting_image_viewer_original_subtitle": "Ative para carregar a imagem original em resolução total (grande!). Desative para reduzir o uso de dados (na rede e no cache do dispositivo).",
"setting_image_viewer_original_title": "Carregar imagem original", "setting_image_viewer_original_title": "Carregar imagem original",
"setting_image_viewer_preview_subtitle": "Ative para carregar uma imagem de resolução média. Desative para carregar diretamente o original ou usar apenas a miniatura.", "setting_image_viewer_preview_subtitle": "Ative para carregar uma imagem de resolução média. Desative para carregar diretamente o original ou usar apenas a miniatura.",
"setting_image_viewer_preview_title": "Carregar imagem de visualização", "setting_image_viewer_preview_title": "Carregar imagem de pré-visualização",
"setting_image_viewer_title": "Images", "setting_image_viewer_title": "Imagens",
"setting_languages_apply": "Apply", "setting_languages_apply": "Aplicar",
"setting_languages_title": "Languages", "setting_languages_title": "Idioma",
"setting_notifications_notify_failures_grace_period": "Notifique falhas de backup em segundo plano: {}", "setting_notifications_notify_failures_grace_period": "Notifique falhas de backup em segundo plano: {}",
"setting_notifications_notify_hours": "{} horas", "setting_notifications_notify_hours": "{} horas",
"setting_notifications_notify_immediately": "imediatamente", "setting_notifications_notify_immediately": "imediatamente",
"setting_notifications_notify_minutes": "{} minutos", "setting_notifications_notify_minutes": "{} minutos",
"setting_notifications_notify_never": "Nunca", "setting_notifications_notify_never": "Nunca",
"setting_notifications_notify_seconds": "{} segundos", "setting_notifications_notify_seconds": "{} segundos",
"setting_notifications_single_progress_subtitle": "Informações detalhadas sobre o progresso do upload por ativo", "setting_notifications_single_progress_subtitle": "Informações detalhadas sobre o progresso do envio por arquivo",
"setting_notifications_single_progress_title": "Mostrar progresso detalhado do backup em segundo plano", "setting_notifications_single_progress_title": "Mostrar progresso detalhado do backup em segundo plano",
"setting_notifications_subtitle": "Ajuste suas preferências de notificação", "setting_notifications_subtitle": "Ajuste as preferências de notificação",
"setting_notifications_title": "Notificações", "setting_notifications_title": "Notificações",
"setting_notifications_total_progress_subtitle": "Progresso geral do upload (ativos concluídos/total)", "setting_notifications_total_progress_subtitle": "Progresso do envio de arquivos (concluídos/total)",
"setting_notifications_total_progress_title": "Mostrar progresso total do backup em segundo plano", "setting_notifications_total_progress_title": "Mostrar progresso total do backup em segundo plano",
"setting_pages_app_bar_settings": "Configurações", "setting_pages_app_bar_settings": "Configurações",
"settings_require_restart": "Reinicie o Immich para aplicar essa configuração", "settings_require_restart": "Reinicie o Immich para aplicar essa configuração",
"setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.", "setting_video_viewer_looping_subtitle": "Ative para repetir o vídeo automaticamente.",
"setting_video_viewer_looping_title": "Looping", "setting_video_viewer_looping_title": "Repetir",
"setting_video_viewer_title": "Videos", "setting_video_viewer_title": "Vídeos",
"share_add": "Adicionar", "share_add": "Adicionar",
"share_add_photos": "Adicionar fotos", "share_add_photos": "Adicionar fotos",
"share_add_title": "Adicione um título", "share_add_title": "Adicione um título",
"share_assets_selected": "{} selected", "share_assets_selected": "{} selecionado",
"share_create_album": "Criar álbum", "share_create_album": "Criar álbum",
"shared_album_activities_input_disable": "Comentários desativados", "shared_album_activities_input_disable": "Comentários desativados",
"shared_album_activities_input_hint": "Dizer alguma coisa", "shared_album_activities_input_hint": "Dizer algo",
"shared_album_activity_remove_content": "Deseja eliminar esta atividade?", "shared_album_activity_remove_content": "Deseja apagar esta atividade?",
"shared_album_activity_remove_title": "Apagar atividade", "shared_album_activity_remove_title": "Apagar atividade",
"shared_album_activity_setting_subtitle": "Permitir a outros responder", "shared_album_activity_setting_subtitle": "Permitir que outros respondam",
"shared_album_activity_setting_title": "Comentários e gostos", "shared_album_activity_setting_title": "Comentários & curtidas",
"shared_album_section_people_action_error": "Erro ao sair/remover do álbum", "shared_album_section_people_action_error": "Erro ao sair/remover do álbum",
"shared_album_section_people_action_leave": "Remover utilizador do álbum", "shared_album_section_people_action_leave": "Sair do álbum",
"shared_album_section_people_action_remove_user": "Remover utilizador do álbum", "shared_album_section_people_action_remove_user": "Remover usuário do álbum",
"shared_album_section_people_owner_label": "Dono", "shared_album_section_people_owner_label": "Dono",
"shared_album_section_people_title": "PESSOAS", "shared_album_section_people_title": "PESSOAS",
"share_dialog_preparing": "Preparando...", "share_dialog_preparing": "Preparando...",
"shared_link_app_bar_title": "Links partilhados", "shared_link_app_bar_title": "Links compartilhados",
"shared_link_clipboard_copied_massage": "Copiado para a área de transferência", "shared_link_clipboard_copied_massage": "Copiado para a área de transferência",
"shared_link_clipboard_text": "Link: {}\nPassword: {}", "shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_create_app_bar_title": "Criar link para partilhar", "shared_link_create_app_bar_title": "Criar link compartilhado",
"shared_link_create_error": "Erro ao criar o link partilhado", "shared_link_create_error": "Erro ao criar o link compartilhado",
"shared_link_create_info": "Deixar qualquer pessoa com o link ver a(s) foto(s) selecionada(s)", "shared_link_create_info": "Permitir qualquer pessoa com o link ver as fotos selecionadas",
"shared_link_create_submit_button": "Criar link", "shared_link_create_submit_button": "Criar link",
"shared_link_edit_allow_download": "Permitir que um utilizador público descarregue", "shared_link_edit_allow_download": "Permitir que usuários públicos baixem os arquivos",
"shared_link_edit_allow_upload": "Permitir que um utilizador público carregue", "shared_link_edit_allow_upload": "Permitir que usuários públicos enviem novos arquivos",
"shared_link_edit_app_bar_title": "Editar link", "shared_link_edit_app_bar_title": "Editar link",
"shared_link_edit_change_expiry": "Alterar o prazo de validade", "shared_link_edit_change_expiry": "Prazo de validade",
"shared_link_edit_description": "Descrição", "shared_link_edit_description": "Descrição",
"shared_link_edit_description_hint": "Introduzir a descrição da partilha", "shared_link_edit_description_hint": "Digite a descrição do compartilhamento",
"shared_link_edit_expire_after": "Expira depois", "shared_link_edit_expire_after": "Expira após",
"shared_link_edit_expire_after_option_day": "1 dia", "shared_link_edit_expire_after_option_day": "1 dia",
"shared_link_edit_expire_after_option_days": "{} dias", "shared_link_edit_expire_after_option_days": "{} dias",
"shared_link_edit_expire_after_option_hour": "1 hora", "shared_link_edit_expire_after_option_hour": "1 hora",
"shared_link_edit_expire_after_option_hours": "{} horas", "shared_link_edit_expire_after_option_hours": "{} horas",
"shared_link_edit_expire_after_option_minute": "1 minuto", "shared_link_edit_expire_after_option_minute": "1 minuto",
"shared_link_edit_expire_after_option_minutes": "{} minutos", "shared_link_edit_expire_after_option_minutes": "{} minutos",
"shared_link_edit_expire_after_option_months": "{} months", "shared_link_edit_expire_after_option_months": "{} Mêses",
"shared_link_edit_expire_after_option_never": "Nunca", "shared_link_edit_expire_after_option_never": "Nunca",
"shared_link_edit_expire_after_option_year": "{} year", "shared_link_edit_expire_after_option_year": "{} ano",
"shared_link_edit_password": "Password", "shared_link_edit_password": "Senha",
"shared_link_edit_password_hint": "Introduza a password da partilha", "shared_link_edit_password_hint": "Digite uma senha para proteger este link",
"shared_link_edit_show_meta": "Mostrar metadados", "shared_link_edit_show_meta": "Mostrar metadados",
"shared_link_edit_submit_button": "Atualizar link", "shared_link_edit_submit_button": "Atualizar link",
"shared_link_empty": "Não tem links partilhados", "shared_link_empty": "Não há links compartilhados",
"shared_link_error_server_url_fetch": "Erro ao abrir o url do servidor", "shared_link_error_server_url_fetch": "Erro ao abrir a URL do servidor",
"shared_link_expired": "Expirou", "shared_link_expired": "Expirou",
"shared_link_expires_day": "Expira em {} dia", "shared_link_expires_day": "Expira em {} dia",
"shared_link_expires_days": "Expira em {} dias", "shared_link_expires_days": "Expira em {} dias",
@ -515,64 +521,68 @@
"shared_link_expires_never": "Expira ∞", "shared_link_expires_never": "Expira ∞",
"shared_link_expires_second": "Expira em {} segundo", "shared_link_expires_second": "Expira em {} segundo",
"shared_link_expires_seconds": "Expira em {} segundos", "shared_link_expires_seconds": "Expira em {} segundos",
"shared_link_individual_shared": "Individual shared", "shared_link_individual_shared": "Compartilhamento único",
"shared_link_info_chip_download": "Descarregar", "shared_link_info_chip_download": "Baixar",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Carregar", "shared_link_info_chip_upload": "Enviar",
"shared_link_manage_links": "Gerir links partilhados", "shared_link_manage_links": "Gerenciar links compartilhados",
"shared_link_public_album": "Public album", "shared_link_public_album": "Álbum público",
"share_done": "Feito", "share_done": "Feito",
"share_invite": "Convidar para álbum", "share_invite": "Convidar para o álbum",
"sharing_page_album": "Álbuns partilhados", "sharing_page_album": "Álbuns compartilhados",
"sharing_page_description": "Crie álbuns partilhados para partilhar fotografias e vídeos com pessoas da sua rede.", "sharing_page_description": "Crie álbuns compartilhados para compartilhar fotos e vídeos com pessoas da sua rede.",
"sharing_page_empty_list": "LISTA VAZIA", "sharing_page_empty_list": "LISTA VAZIA",
"sharing_silver_appbar_create_shared_album": "Criar álbum partilhado", "sharing_silver_appbar_create_shared_album": "Criar álbum partilhado",
"sharing_silver_appbar_shared_links": "Links partilhados", "sharing_silver_appbar_shared_links": "Links compartilhados",
"sharing_silver_appbar_share_partner": "Partilhar com parceiro", "sharing_silver_appbar_share_partner": "Partilhar com parceiro",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Biblioteca", "tab_controller_nav_library": "Biblioteca",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Procurar", "tab_controller_nav_search": "Pesquisar",
"tab_controller_nav_sharing": "Partilhar", "tab_controller_nav_sharing": "Compartilhar",
"theme_setting_asset_list_storage_indicator_title": "Mostrar indicador de armazenamento em blocos de ativos", "theme_setting_asset_list_storage_indicator_title": "Mostrar indicador de armazenamento na grade de fotos",
"theme_setting_asset_list_tiles_per_row_title": "Número de itens por linha ({})", "theme_setting_asset_list_tiles_per_row_title": "Quantidade de arquivos por linha ({})",
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", "theme_setting_colorful_interface_subtitle": "Aplica a cor primária ao fundo",
"theme_setting_colorful_interface_title": "Colorful interface", "theme_setting_colorful_interface_title": "Interface colorida",
"theme_setting_dark_mode_switch": "Modo escuro", "theme_setting_dark_mode_switch": "Modo escuro",
"theme_setting_image_viewer_quality_subtitle": "Ajuste a qualidade do visualizador de imagens detalhadas", "theme_setting_image_viewer_quality_subtitle": "Ajuste a qualidade do visualizador de imagens detalhadas",
"theme_setting_image_viewer_quality_title": "Qualidade do visualizador de imagens", "theme_setting_image_viewer_quality_title": "Qualidade do visualizador de imagens",
"theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.", "theme_setting_primary_color_subtitle": "Selecione a cor primária, usada nas ações principais e realces",
"theme_setting_primary_color_title": "Primary color", "theme_setting_primary_color_title": "Cor primária",
"theme_setting_system_primary_color_title": "Use system color", "theme_setting_system_primary_color_title": "Use a cor do sistema",
"theme_setting_system_theme_switch": "Automático (Siga a configuração do sistema)", "theme_setting_system_theme_switch": "Automático (Siga a configuração do sistema)",
"theme_setting_theme_subtitle": "Escolha a configuração do tema do aplicativo", "theme_setting_theme_subtitle": "Escolha a configuração do tema do aplicativo",
"theme_setting_theme_title": "Tema", "theme_setting_theme_title": "Tema",
"theme_setting_three_stage_loading_subtitle": "O carregamento em três estágios pode aumentar o desempenho do carregamento, mas causa uma carga de rede significativamente maior", "theme_setting_three_stage_loading_subtitle": "O carregamento em três estágios pode aumentar o desempenho do carregamento, mas causa uma carga de rede significativamente maior",
"theme_setting_three_stage_loading_title": "Habilitar carregamento em três estágios", "theme_setting_three_stage_loading_title": "Habilitar carregamento em três estágios",
"translated_text_options": "Opções", "translated_text_options": "Opções",
"trash_emptied": "Emptied trash", "trash_emptied": "Lixeira esvaziada",
"trash_page_delete": "Apagar", "trash_page_delete": "Excluir",
"trash_page_delete_all": "Apagar tudo", "trash_page_delete_all": "Excluir tudo",
"trash_page_empty_trash_btn": "Esvaziar lixo", "trash_page_empty_trash_btn": "Esvaziar lixeira",
"trash_page_empty_trash_dialog_content": "Deseja esvaziar os recursos no lixo? Estes recursos serão eliminados de forma permanente do Immich", "trash_page_empty_trash_dialog_content": "Deseja esvaziar a lixera? Estes arquivos serão apagados de forma permanente do Immich",
"trash_page_empty_trash_dialog_ok": "Ok", "trash_page_empty_trash_dialog_ok": "OK",
"trash_page_info": "Recursos no lixo são apagados de forma permanente depois de {} dias", "trash_page_info": "Arquivos na lixeira são excluídos de forma permanente após {} dias",
"trash_page_no_assets": "Não existem recursos no lixo", "trash_page_no_assets": "Lixeira vazia",
"trash_page_restore": "Restaurar", "trash_page_restore": "Restaurar",
"trash_page_restore_all": "Restaurar tudo", "trash_page_restore_all": "Restaurar tudo",
"trash_page_select_assets_btn": "Selecionar recursos", "trash_page_select_assets_btn": "Selecionar arquivos",
"trash_page_select_btn": "Selecionar", "trash_page_select_btn": "Selecionar",
"trash_page_title": "Lixo ({})", "trash_page_title": "Lixeira ({})",
"upload_dialog_cancel": "Cancelar", "upload_dialog_cancel": "Cancelar",
"upload_dialog_info": "Pretende efetuar a cópia de segurança do(s) recurso(s) selecionado(s) para o servidor?", "upload_dialog_info": "Deseja fazer o backup dos arquivos selecionados no servidor?",
"upload_dialog_ok": "Carregar", "upload_dialog_ok": "Enviar",
"upload_dialog_title": "Carregar recurso", "upload_dialog_title": "Enviar arquivo",
"version_announcement_overlay_ack": "Aceitar", "version_announcement_overlay_ack": "Entendi",
"version_announcement_overlay_release_notes": "notas de lançamento", "version_announcement_overlay_release_notes": "notas da versão",
"version_announcement_overlay_text_1": "Olá, há um novo lançamento de", "version_announcement_overlay_text_1": "Olá, há um novo lançamento de",
"version_announcement_overlay_text_2": "por favor, tome o seu tempo para visitar o", "version_announcement_overlay_text_2": "por favor, Verifique com calma as ",
"version_announcement_overlay_text_3": "e certifique-se de que a configuração do docker-compose e do .env estejam atualizadas para evitar configurações incorretas, especialmente se usar o WatchTower ou qualquer mecanismo que lide com a atualização automática do servidor.", "version_announcement_overlay_text_3": "e certifique-se de que a configuração do docker-compose e do arquivo .env estejam atualizadas para evitar configurações incorretas, especialmente se utiliza o WatchTower ou qualquer outro mecanismo que faça atualização automática do servidor.",
"version_announcement_overlay_title": "Nova versão do servidor disponível \uD83C\uDF89", "version_announcement_overlay_title": "Nova versão do servidor disponível \uD83C\uDF89",
"viewer_remove_from_stack": "Remover da pilha", "viewer_remove_from_stack": "Remover da pilha",
"viewer_stack_use_as_main_asset": "Usar como recurso principal", "viewer_stack_use_as_main_asset": "Usar como foto principal",
"viewer_unstack": "Desenpilhar" "viewer_unstack": "Desempilhar"
} }

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Șterge", "control_bottom_app_bar_delete": "Șterge",
"control_bottom_app_bar_delete_from_immich": "Șterge din Immich", "control_bottom_app_bar_delete_from_immich": "Șterge din Immich",
"control_bottom_app_bar_delete_from_local": "Șterge din dispozitiv", "control_bottom_app_bar_delete_from_local": "Șterge din dispozitiv",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Editează locație", "control_bottom_app_bar_edit_location": "Editează locație",
"control_bottom_app_bar_edit_time": "Editează Data și Ora", "control_bottom_app_bar_edit_time": "Editează Data și Ora",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Distribuie", "create_shared_album_page_share": "Distribuie",
"create_shared_album_page_share_add_assets": "ADAUGĂ RESURSE", "create_shared_album_page_share_add_assets": "ADAUGĂ RESURSE",
"create_shared_album_page_share_select_photos": "Selectează fotografii", "create_shared_album_page_share_select_photos": "Selectează fotografii",
"crop": "Crop",
"curated_location_page_title": "Locuri", "curated_location_page_title": "Locuri",
"curated_object_page_title": "Obiecte", "curated_object_page_title": "Obiecte",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Eroare actualizare descriere, verifică log-urile pentru mai multe detalii", "description_input_submit_error": "Eroare actualizare descriere, verifică log-urile pentru mai multe detalii",
"edit_date_time_dialog_date_time": "Dată și Oră", "edit_date_time_dialog_date_time": "Dată și Oră",
"edit_date_time_dialog_timezone": "Fus orar", "edit_date_time_dialog_timezone": "Fus orar",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Locație", "edit_location_dialog_title": "Locație",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Adaugă Descriere...", "exif_bottom_sheet_description": "Adaugă Descriere...",
"exif_bottom_sheet_details": "DETALII", "exif_bottom_sheet_details": "DETALII",
"exif_bottom_sheet_location": "LOCAȚIE", "exif_bottom_sheet_location": "LOCAȚIE",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Dacă este prima dată când utilizezi aplicația, te rugăm să te asiguri că alegi unul sau mai multe albume de backup, astfel încât cronologia să poată fi populată cu fotografiile și videoclipurile din aceste albume.", "home_page_first_time_notice": "Dacă este prima dată când utilizezi aplicația, te rugăm să te asiguri că alegi unul sau mai multe albume de backup, astfel încât cronologia să poată fi populată cu fotografiile și videoclipurile din aceste albume.",
"home_page_share_err_local": "Nu se pot distribui fișiere locale prin link, omitere", "home_page_share_err_local": "Nu se pot distribui fișiere locale prin link, omitere",
"home_page_upload_err_limit": "Se pot încărca maxim 30 de resurse odată, omitere", "home_page_upload_err_limit": "Se pot încărca maxim 30 de resurse odată, omitere",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Eroare descărcare", "image_viewer_page_state_provider_download_error": "Eroare descărcare",
"image_viewer_page_state_provider_download_started": "Download Started", "image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_success": "Descărcare cu succes", "image_viewer_page_state_provider_download_success": "Descărcare cu succes",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Deconectare", "profile_drawer_sign_out": "Deconectare",
"profile_drawer_trash": "Coș", "profile_drawer_trash": "Coș",
"recently_added_page_title": "Adăugate recent", "recently_added_page_title": "Adăugate recent",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "A apărut o eroare", "scaffold_body_error_occurred": "A apărut o eroare",
"search_bar_hint": "Căutare fotografii", "search_bar_hint": "Căutare fotografii",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Album nou distribuit", "sharing_silver_appbar_create_shared_album": "Album nou distribuit",
"sharing_silver_appbar_shared_links": "Link-uri distribuite", "sharing_silver_appbar_shared_links": "Link-uri distribuite",
"sharing_silver_appbar_share_partner": "Distribuie cu partenerul", "sharing_silver_appbar_share_partner": "Distribuie cu partenerul",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Librărie", "tab_controller_nav_library": "Librărie",
"tab_controller_nav_photos": "Fotografii", "tab_controller_nav_photos": "Fotografii",
"tab_controller_nav_search": "Caută", "tab_controller_nav_search": "Caută",

View File

@ -54,13 +54,13 @@
"asset_list_layout_sub_title": "Разметка", "asset_list_layout_sub_title": "Разметка",
"asset_list_settings_subtitle": "Настройка макета сетки фотографий", "asset_list_settings_subtitle": "Настройка макета сетки фотографий",
"asset_list_settings_title": "Сетка фотографий", "asset_list_settings_title": "Сетка фотографий",
"asset_restored_successfully": "Asset restored successfully", "asset_restored_successfully": "Объект успешно восстановлен",
"assets_deleted_permanently": "{} asset(s) deleted permanently", "assets_deleted_permanently": "{} объект(ы) удален(ы) навсегда",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", "assets_deleted_permanently_from_server": "{} объект(ы) удален(ы) навсегда с сервера Immich",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", "assets_removed_permanently_from_device": "{} объект(ы) удален(ы) навсегда с вашего устройства",
"assets_restored_successfully": "{} asset(s) restored successfully", "assets_restored_successfully": "{} объект(ы) успешно восстановлен(ы)",
"assets_trashed": "{} asset(s) trashed", "assets_trashed": "{} объект(ы) помещен(ы) в корзину",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server", "assets_trashed_from_server": "{} объект(ы) помещен(ы) в корзину на сервере Immich",
"asset_viewer_settings_title": "Просмотрщик изображений", "asset_viewer_settings_title": "Просмотрщик изображений",
"backup_album_selection_page_albums_device": "Альбомов на устройстве ({})", "backup_album_selection_page_albums_device": "Альбомов на устройстве ({})",
"backup_album_selection_page_albums_tap": "Нажмите, чтобы включить,\nнажмите дважды, чтобы исключить", "backup_album_selection_page_albums_tap": "Нажмите, чтобы включить,\nнажмите дважды, чтобы исключить",
@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Удалить", "control_bottom_app_bar_delete": "Удалить",
"control_bottom_app_bar_delete_from_immich": "Удалить из Immich\n", "control_bottom_app_bar_delete_from_immich": "Удалить из Immich\n",
"control_bottom_app_bar_delete_from_local": "Удалить с устройства", "control_bottom_app_bar_delete_from_local": "Удалить с устройства",
"control_bottom_app_bar_download": "Скачать",
"control_bottom_app_bar_edit": "Редактировать", "control_bottom_app_bar_edit": "Редактировать",
"control_bottom_app_bar_edit_location": "Редактировать местоположение", "control_bottom_app_bar_edit_location": "Редактировать местоположение",
"control_bottom_app_bar_edit_time": "Редактировать дату и время", "control_bottom_app_bar_edit_time": "Редактировать дату и время",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Поделиться", "create_shared_album_page_share": "Поделиться",
"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": "Выберите фотографии",
"crop": "Crop",
"curated_location_page_title": "Места", "curated_location_page_title": "Места",
"curated_object_page_title": "Предметы", "curated_object_page_title": "Предметы",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
@ -210,7 +212,9 @@
"description_input_submit_error": "Не удалось обновить описание, проверьте логи, чтобы узнать причину", "description_input_submit_error": "Не удалось обновить описание, проверьте логи, чтобы узнать причину",
"edit_date_time_dialog_date_time": "Дата и время", "edit_date_time_dialog_date_time": "Дата и время",
"edit_date_time_dialog_timezone": "Часовой пояс", "edit_date_time_dialog_timezone": "Часовой пояс",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Местоположение", "edit_location_dialog_title": "Местоположение",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Добавить описание...", "exif_bottom_sheet_description": "Добавить описание...",
"exif_bottom_sheet_details": "ПОДРОБНОСТИ", "exif_bottom_sheet_details": "ПОДРОБНОСТИ",
"exif_bottom_sheet_location": "Местоположение", "exif_bottom_sheet_location": "Местоположение",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Если вы используете приложение впервые, убедитесь, что вы выбрали резервный(е) альбом(ы), чтобы временная шкала могла заполнить фотографии и видео в альбоме(ах).", "home_page_first_time_notice": "Если вы используете приложение впервые, убедитесь, что вы выбрали резервный(е) альбом(ы), чтобы временная шкала могла заполнить фотографии и видео в альбоме(ах).",
"home_page_share_err_local": "Невозможно поделиться локальными данными по ссылке, пропуск...", "home_page_share_err_local": "Невозможно поделиться локальными данными по ссылке, пропуск...",
"home_page_upload_err_limit": "Вы можете выгрузить максимум 30 файлов за раз", "home_page_upload_err_limit": "Вы можете выгрузить максимум 30 файлов за раз",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Ошибка загрузки", "image_viewer_page_state_provider_download_error": "Ошибка загрузки",
"image_viewer_page_state_provider_download_started": "Загрузка началась", "image_viewer_page_state_provider_download_started": "Загрузка началась",
"image_viewer_page_state_provider_download_success": "Успешно загружено", "image_viewer_page_state_provider_download_success": "Успешно загружено",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Выйти", "profile_drawer_sign_out": "Выйти",
"profile_drawer_trash": "Корзина", "profile_drawer_trash": "Корзина",
"recently_added_page_title": "Недавно добавленные", "recently_added_page_title": "Недавно добавленные",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Возникла ошибка", "scaffold_body_error_occurred": "Возникла ошибка",
"search_bar_hint": "Поиск фотографий", "search_bar_hint": "Поиск фотографий",
"search_filter_apply": "Применить фильтр", "search_filter_apply": "Применить фильтр",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Создать общий альбом", "sharing_silver_appbar_create_shared_album": "Создать общий альбом",
"sharing_silver_appbar_shared_links": "Общие ссылки", "sharing_silver_appbar_shared_links": "Общие ссылки",
"sharing_silver_appbar_share_partner": "Поделиться с партнёром", "sharing_silver_appbar_share_partner": "Поделиться с партнёром",
"sync": "Синхронизировать",
"sync_albums": "Синхронизировать альбомы",
"sync_albums_manual_subtitle": "Синхронизировать все загруженные фото и видео в выбранные альбомы для резервного копирования",
"sync_upload_album_setting_subtitle": "Создавайте и загружайте свои фотографии и видео в выбранные альбомы на сервер Immich",
"tab_controller_nav_library": "Библиотека", "tab_controller_nav_library": "Библиотека",
"tab_controller_nav_photos": "Фото", "tab_controller_nav_photos": "Фото",
"tab_controller_nav_search": "Поиск", "tab_controller_nav_search": "Поиск",
@ -549,7 +559,7 @@
"theme_setting_three_stage_loading_subtitle": "Трехэтапная загрузка может повысить производительность загрузки, но вызывает значительно более высокую нагрузку на сеть", "theme_setting_three_stage_loading_subtitle": "Трехэтапная загрузка может повысить производительность загрузки, но вызывает значительно более высокую нагрузку на сеть",
"theme_setting_three_stage_loading_title": "Включить трехэтапную загрузку", "theme_setting_three_stage_loading_title": "Включить трехэтапную загрузку",
"translated_text_options": "Опции", "translated_text_options": "Опции",
"trash_emptied": "Emptied trash", "trash_emptied": "Корзина очищена",
"trash_page_delete": "Удалить", "trash_page_delete": "Удалить",
"trash_page_delete_all": "Удалить все", "trash_page_delete_all": "Удалить все",
"trash_page_empty_trash_btn": "Очистить корзину", "trash_page_empty_trash_btn": "Очистить корзину",
@ -563,7 +573,7 @@
"trash_page_select_btn": "Выбрать", "trash_page_select_btn": "Выбрать",
"trash_page_title": "Корзина ({})", "trash_page_title": "Корзина ({})",
"upload_dialog_cancel": "Отмена", "upload_dialog_cancel": "Отмена",
"upload_dialog_info": "Вы хотите загрузить выбранный объект(ы) на ваш сервер?", "upload_dialog_info": "Хотите создать резервную копию выбранных объектов на сервере?",
"upload_dialog_ok": "Загрузить", "upload_dialog_ok": "Загрузить",
"upload_dialog_title": "Загрузить объект", "upload_dialog_title": "Загрузить объект",
"version_announcement_overlay_ack": "Подтверждение", "version_announcement_overlay_ack": "Подтверждение",

View File

@ -173,6 +173,7 @@
"control_bottom_app_bar_delete": "Vymazať", "control_bottom_app_bar_delete": "Vymazať",
"control_bottom_app_bar_delete_from_immich": "Vymazať z Immichu", "control_bottom_app_bar_delete_from_immich": "Vymazať z Immichu",
"control_bottom_app_bar_delete_from_local": "Vymazať zo zariadenia", "control_bottom_app_bar_delete_from_local": "Vymazať zo zariadenia",
"control_bottom_app_bar_download": "Download",
"control_bottom_app_bar_edit": "Edit", "control_bottom_app_bar_edit": "Edit",
"control_bottom_app_bar_edit_location": "Upraviť polohu", "control_bottom_app_bar_edit_location": "Upraviť polohu",
"control_bottom_app_bar_edit_time": "Upraviť dátum a čas", "control_bottom_app_bar_edit_time": "Upraviť dátum a čas",
@ -189,6 +190,7 @@
"create_shared_album_page_share": "Zdieľať", "create_shared_album_page_share": "Zdieľať",
"create_shared_album_page_share_add_assets": "Pridať položky", "create_shared_album_page_share_add_assets": "Pridať položky",
"create_shared_album_page_share_select_photos": "Vybrať fotografie", "create_shared_album_page_share_select_photos": "Vybrať fotografie",
"crop": "Crop",
"curated_location_page_title": "Miesta", "curated_location_page_title": "Miesta",
"curated_object_page_title": "Veci", "curated_object_page_title": "Veci",
"daily_title_text_date": "EEEE, d. MMMM", "daily_title_text_date": "EEEE, d. MMMM",
@ -210,7 +212,9 @@
"description_input_submit_error": "Chyba pri aktualizovaní popisu, zobrazte log pre viac detailov", "description_input_submit_error": "Chyba pri aktualizovaní popisu, zobrazte log pre viac detailov",
"edit_date_time_dialog_date_time": "Dátum a čas", "edit_date_time_dialog_date_time": "Dátum a čas",
"edit_date_time_dialog_timezone": "Časové pásmo", "edit_date_time_dialog_timezone": "Časové pásmo",
"edit_image_title": "Edit",
"edit_location_dialog_title": "Poloha", "edit_location_dialog_title": "Poloha",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Pridať popis...", "exif_bottom_sheet_description": "Pridať popis...",
"exif_bottom_sheet_details": "PODROBNOSTI", "exif_bottom_sheet_details": "PODROBNOSTI",
"exif_bottom_sheet_location": "LOKALITA", "exif_bottom_sheet_location": "LOKALITA",
@ -247,6 +251,7 @@
"home_page_first_time_notice": "Ak aplikáciu používate prvý krát, nezabudnite si vybrať zálohované albumy, aby sa na časovej osi mohli nachádzať fotografie a videá z vybraných albumoch.", "home_page_first_time_notice": "Ak aplikáciu používate prvý krát, nezabudnite si vybrať zálohované albumy, aby sa na časovej osi mohli nachádzať fotografie a videá z vybraných albumoch.",
"home_page_share_err_local": "Nemožno zdieľať lokálne médiá pomocou odkazu", "home_page_share_err_local": "Nemožno zdieľať lokálne médiá pomocou odkazu",
"home_page_upload_err_limit": "Naraz môžete nahrať len 30 médií, preskakujem...", "home_page_upload_err_limit": "Naraz môžete nahrať len 30 médií, preskakujem...",
"image_saved_successfully": "Image saved",
"image_viewer_page_state_provider_download_error": "Chyba sťahovania", "image_viewer_page_state_provider_download_error": "Chyba sťahovania",
"image_viewer_page_state_provider_download_started": "Sťahovanie sa začalo", "image_viewer_page_state_provider_download_started": "Sťahovanie sa začalo",
"image_viewer_page_state_provider_download_success": "Sťahovanie bolo úspešné", "image_viewer_page_state_provider_download_success": "Sťahovanie bolo úspešné",
@ -375,6 +380,7 @@
"profile_drawer_sign_out": "Odhlásiť sa", "profile_drawer_sign_out": "Odhlásiť sa",
"profile_drawer_trash": "Kôš", "profile_drawer_trash": "Kôš",
"recently_added_page_title": "Nedávno pridané", "recently_added_page_title": "Nedávno pridané",
"save_to_gallery": "Save to gallery",
"scaffold_body_error_occurred": "Vyskytla sa chyba", "scaffold_body_error_occurred": "Vyskytla sa chyba",
"search_bar_hint": "Prehľadajte svoje obrázky", "search_bar_hint": "Prehľadajte svoje obrázky",
"search_filter_apply": "Použiť filter", "search_filter_apply": "Použiť filter",
@ -529,6 +535,10 @@
"sharing_silver_appbar_create_shared_album": "Vytvoriť zdieľaný album", "sharing_silver_appbar_create_shared_album": "Vytvoriť zdieľaný album",
"sharing_silver_appbar_shared_links": "Zdieľané odkazy", "sharing_silver_appbar_shared_links": "Zdieľané odkazy",
"sharing_silver_appbar_share_partner": "Zdieľať s partnerom", "sharing_silver_appbar_share_partner": "Zdieľať s partnerom",
"sync": "Sync",
"sync_albums": "Sync albums",
"sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"tab_controller_nav_library": "Knižnica", "tab_controller_nav_library": "Knižnica",
"tab_controller_nav_photos": "Fotografie", "tab_controller_nav_photos": "Fotografie",
"tab_controller_nav_search": "Vyhľadávanie", "tab_controller_nav_search": "Vyhľadávanie",

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