Compare commits

..

1 Commits

Author SHA1 Message Date
Alex ee7e20706b fix(mobile): fetch non-archive for partners 2024-05-06 11:21:25 -05:00
1277 changed files with 33117 additions and 12682 deletions
+1
View File
@@ -23,6 +23,7 @@ server/node_modules/
server/upload/ server/upload/
server/dist/ server/dist/
server/www/ server/www/
server/test/assets/
web/node_modules/ web/node_modules/
web/coverage/ web/coverage/
+2
View File
@@ -2,6 +2,8 @@ mobile/openapi/**/*.md -diff -merge
mobile/openapi/**/*.md linguist-generated=true mobile/openapi/**/*.md linguist-generated=true
mobile/openapi/**/*.dart -diff -merge mobile/openapi/**/*.dart -diff -merge
mobile/openapi/**/*.dart linguist-generated=true mobile/openapi/**/*.dart linguist-generated=true
mobile/openapi/.openapi-generator/FILES -diff -merge
mobile/openapi/.openapi-generator/FILES linguist-generated=true
mobile/lib/**/*.g.dart -diff -merge mobile/lib/**/*.g.dart -diff -merge
mobile/lib/**/*.g.dart linguist-generated=true mobile/lib/**/*.g.dart linguist-generated=true
+5
View File
@@ -0,0 +1,5 @@
# These are supported funding model platforms
github: immich-app
liberapay: alex.tran1502
custom: https://www.buymeacoffee.com/altran1502
+1 -1
View File
@@ -45,7 +45,7 @@ jobs:
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
channel: 'stable' channel: 'stable'
flutter-version: '3.22.0' flutter-version: '3.19.3'
cache: true cache: true
- name: Create the Keystore - name: Create the Keystore
@@ -1,15 +0,0 @@
name: PR Conventional Commit Validation
on:
pull_request:
types: [opened, synchronize, reopened, edited]
jobs:
validate-pr-title:
runs-on: ubuntu-latest
steps:
- name: PR Conventional Commit Validation
uses: ytanikin/PRConventionalCommits@1.1.0
with:
task_types: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]'
add_label: 'false'
+2 -2
View File
@@ -22,8 +22,8 @@ jobs:
- name: Setup Flutter SDK - name: Setup Flutter SDK
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
channel: 'stable' channel: "stable"
flutter-version: '3.22.0' flutter-version: "3.19.3"
- name: Install dependencies - name: Install dependencies
run: dart pub get run: dart pub get
+4 -4
View File
@@ -208,7 +208,7 @@ jobs:
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
channel: 'stable' channel: 'stable'
flutter-version: '3.22.0' flutter-version: '3.19.3'
- name: Run tests - name: Run tests
working-directory: ./mobile working-directory: ./mobile
run: flutter test -j 1 run: flutter test -j 1
@@ -264,7 +264,7 @@ jobs:
- name: Run API generation - name: Run API generation
run: make open-api run: make open-api
- name: Find file changes - name: Find file changes
uses: tj-actions/verify-changed-files@v20 uses: tj-actions/verify-changed-files@v19
id: verify-changed-files id: verify-changed-files
with: with:
files: | files: |
@@ -319,7 +319,7 @@ jobs:
run: npm run typeorm:migrations:generate ./src/migrations/TestMigration run: npm run typeorm:migrations:generate ./src/migrations/TestMigration
- name: Find file changes - name: Find file changes
uses: tj-actions/verify-changed-files@v20 uses: tj-actions/verify-changed-files@v19
id: verify-changed-files id: verify-changed-files
with: with:
files: | files: |
@@ -337,7 +337,7 @@ jobs:
DB_URL: postgres://postgres:postgres@localhost:5432/immich DB_URL: postgres://postgres:postgres@localhost:5432/immich
- name: Find file changes - name: Find file changes
uses: tj-actions/verify-changed-files@v20 uses: tj-actions/verify-changed-files@v19
id: verify-changed-sql-files id: verify-changed-sql-files
with: with:
files: | files: |
-3
View File
@@ -14,9 +14,6 @@ mobile/gradle.properties
mobile/openapi/pubspec.lock mobile/openapi/pubspec.lock
mobile/*.jks mobile/*.jks
mobile/libisar.dylib mobile/libisar.dylib
mobile/openapi/test
mobile/openapi/doc
mobile/openapi/.openapi-generator/FILES
open-api/typescript-sdk/build open-api/typescript-sdk/build
mobile/android/fastlane/report.xml mobile/android/fastlane/report.xml
+1 -1
View File
@@ -2,5 +2,5 @@
path = mobile/.isar path = mobile/.isar
url = https://github.com/isar/isar url = https://github.com/isar/isar
[submodule "server/test/assets"] [submodule "server/test/assets"]
path = e2e/test-assets path = server/test/assets
url = https://github.com/immich-app/test-assets url = https://github.com/immich-app/test-assets
+1 -11
View File
@@ -1,16 +1,6 @@
{ {
"editor.formatOnSave": true, "editor.formatOnSave": true,
"[javascript]": { "[javascript][typescript][css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode", "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.formatOnSave": true "editor.formatOnSave": true
-3
View File
@@ -18,7 +18,6 @@
</a> </a>
<br/> <br/>
<p align="center"> <p align="center">
<a href="readme_i18n/README_ca_ES.md">Català</a> <a href="readme_i18n/README_ca_ES.md">Català</a>
<a href="readme_i18n/README_es_ES.md">Español</a> <a href="readme_i18n/README_es_ES.md">Español</a>
<a href="readme_i18n/README_fr_FR.md">Français</a> <a href="readme_i18n/README_fr_FR.md">Français</a>
@@ -31,7 +30,6 @@
<a href="readme_i18n/README_zh_CN.md">中文</a> <a href="readme_i18n/README_zh_CN.md">中文</a>
<a href="readme_i18n/README_ru_RU.md">Русский</a> <a href="readme_i18n/README_ru_RU.md">Русский</a>
<a href="readme_i18n/README_pt_BR.md">Português Brasileiro</a> <a href="readme_i18n/README_pt_BR.md">Português Brasileiro</a>
<a href="readme_i18n/README_ar_JO.md">العربية</a>
</p> </p>
## Disclaimer ## Disclaimer
@@ -72,7 +70,6 @@ Spec: Free-tier Oracle VM - Amsterdam - 2.4Ghz quad-core ARM64 CPU, 24GB RAM
``` ```
## Activities ## Activities
![Activities](https://repobeats.axiom.co/api/embed/9e86d9dc3ddd137161f2f6d2e758d7863b1789cb.svg "Repobeats analytics image") ![Activities](https://repobeats.axiom.co/api/embed/9e86d9dc3ddd137161f2f6d2e758d7863b1789cb.svg "Repobeats analytics image")
## Features ## Features
+1 -1
View File
@@ -1 +1 @@
20.13 v20.12
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine3.19@sha256:291e84d956f1aff38454bbd3da38941461ad569a185c20aa289f71f37ea08e23 as core FROM node:20-alpine3.19@sha256:7a91aa397f2e2dfbfcdad2e2d72599f374e0b0172be1d86eeb73f1d33f36a4b2 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 ./
+147 -211
View File
@@ -31,7 +31,7 @@
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-unicorn": "^52.0.0",
"mock-fs": "^5.2.0", "mock-fs": "^5.2.0",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-organize-imports": "^3.2.4",
@@ -47,14 +47,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.105.1", "version": "1.103.1",
"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.3"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.12.12", "@types/node": "^20.11.0",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -174,9 +174,9 @@
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "7.24.5", "version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@@ -1113,6 +1113,12 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true "dev": true
}, },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true
},
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.17.0", "version": "4.17.0",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
@@ -1138,11 +1144,10 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.12", "version": "20.12.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
"integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@@ -1153,21 +1158,28 @@
"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
"dev": true "dev": true
}, },
"node_modules/@types/semver": {
"version": "7.5.8",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz",
"integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "7.9.0", "@typescript-eslint/scope-manager": "7.7.1",
"@typescript-eslint/type-utils": "7.9.0", "@typescript-eslint/type-utils": "7.7.1",
"@typescript-eslint/utils": "7.9.0", "@typescript-eslint/utils": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0", "@typescript-eslint/visitor-keys": "7.7.1",
"debug": "^4.3.4",
"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",
"semver": "^7.6.0",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
"engines": { "engines": {
@@ -1188,16 +1200,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz",
"integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==",
"dev": true, "dev": true,
"license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "7.9.0", "@typescript-eslint/scope-manager": "7.7.1",
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"@typescript-eslint/typescript-estree": "7.9.0", "@typescript-eslint/typescript-estree": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0", "@typescript-eslint/visitor-keys": "7.7.1",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1217,14 +1228,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz",
"integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0" "@typescript-eslint/visitor-keys": "7.7.1"
}, },
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
@@ -1235,14 +1245,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz",
"integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "7.9.0", "@typescript-eslint/typescript-estree": "7.7.1",
"@typescript-eslint/utils": "7.9.0", "@typescript-eslint/utils": "7.7.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@@ -1263,11 +1272,10 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz",
"integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
}, },
@@ -1277,14 +1285,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz",
"integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==",
"dev": true, "dev": true,
"license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0", "@typescript-eslint/visitor-keys": "7.7.1",
"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",
@@ -1306,16 +1313,18 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz",
"integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "7.9.0", "@types/json-schema": "^7.0.15",
"@typescript-eslint/types": "7.9.0", "@types/semver": "^7.5.8",
"@typescript-eslint/typescript-estree": "7.9.0" "@typescript-eslint/scope-manager": "7.7.1",
"@typescript-eslint/types": "7.7.1",
"@typescript-eslint/typescript-estree": "7.7.1",
"semver": "^7.6.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
@@ -1329,13 +1338,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz",
"integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@@ -1353,9 +1361,9 @@
"dev": true "dev": true
}, },
"node_modules/@vitest/coverage-v8": { "node_modules/@vitest/coverage-v8": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.5.2.tgz",
"integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "integrity": "sha512-QJqxRnbCwNtbbegK9E93rBmhN3dbfG1bC/o52Bqr0zGCYhQzwgwvrJBG7Q8vw3zilX6Ryy6oa/mkZku2lLJx1Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.1", "@ampproject/remapping": "^2.2.1",
@@ -1376,17 +1384,17 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
}, },
"peerDependencies": { "peerDependencies": {
"vitest": "1.6.0" "vitest": "1.5.2"
} }
}, },
"node_modules/@vitest/expect": { "node_modules/@vitest/expect": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz",
"integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/spy": "1.6.0", "@vitest/spy": "1.5.2",
"@vitest/utils": "1.6.0", "@vitest/utils": "1.5.2",
"chai": "^4.3.10" "chai": "^4.3.10"
}, },
"funding": { "funding": {
@@ -1394,12 +1402,12 @@
} }
}, },
"node_modules/@vitest/runner": { "node_modules/@vitest/runner": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz",
"integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/utils": "1.6.0", "@vitest/utils": "1.5.2",
"p-limit": "^5.0.0", "p-limit": "^5.0.0",
"pathe": "^1.1.1" "pathe": "^1.1.1"
}, },
@@ -1435,9 +1443,9 @@
} }
}, },
"node_modules/@vitest/snapshot": { "node_modules/@vitest/snapshot": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz",
"integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"magic-string": "^0.30.5", "magic-string": "^0.30.5",
@@ -1449,9 +1457,9 @@
} }
}, },
"node_modules/@vitest/spy": { "node_modules/@vitest/spy": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz",
"integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"tinyspy": "^2.2.0" "tinyspy": "^2.2.0"
@@ -1461,9 +1469,9 @@
} }
}, },
"node_modules/@vitest/utils": { "node_modules/@vitest/utils": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz",
"integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"diff-sequences": "^29.6.3", "diff-sequences": "^29.6.3",
@@ -1556,7 +1564,6 @@
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -1581,7 +1588,6 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
@@ -1816,12 +1822,12 @@
"dev": true "dev": true
}, },
"node_modules/core-js-compat": { "node_modules/core-js-compat": {
"version": "3.37.1", "version": "3.36.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz",
"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"browserslist": "^4.23.0" "browserslist": "^4.22.3"
}, },
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
@@ -1891,7 +1897,6 @@
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"path-type": "^4.0.0" "path-type": "^4.0.0"
}, },
@@ -2089,17 +2094,17 @@
} }
}, },
"node_modules/eslint-plugin-unicorn": { "node_modules/eslint-plugin-unicorn": {
"version": "53.0.0", "version": "52.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-52.0.0.tgz",
"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==", "integrity": "sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.24.5", "@babel/helper-validator-identifier": "^7.22.20",
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@eslint/eslintrc": "^3.0.2", "@eslint/eslintrc": "^2.1.4",
"ci-info": "^4.0.0", "ci-info": "^4.0.0",
"clean-regexp": "^1.0.0", "clean-regexp": "^1.0.0",
"core-js-compat": "^3.37.0", "core-js-compat": "^3.34.0",
"esquery": "^1.5.0", "esquery": "^1.5.0",
"indent-string": "^4.0.0", "indent-string": "^4.0.0",
"is-builtin-module": "^3.2.1", "is-builtin-module": "^3.2.1",
@@ -2108,11 +2113,11 @@
"read-pkg-up": "^7.0.1", "read-pkg-up": "^7.0.1",
"regexp-tree": "^0.1.27", "regexp-tree": "^0.1.27",
"regjsparser": "^0.10.0", "regjsparser": "^0.10.0",
"semver": "^7.6.1", "semver": "^7.5.4",
"strip-indent": "^3.0.0" "strip-indent": "^3.0.0"
}, },
"engines": { "engines": {
"node": ">=18.18" "node": ">=16"
}, },
"funding": { "funding": {
"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
@@ -2121,92 +2126,6 @@
"eslint": ">=8.56.0" "eslint": ">=8.56.0"
} }
}, },
"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz",
"integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^10.0.1",
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/espree": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
"dev": true,
"dependencies": {
"acorn": "^8.11.3",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^4.0.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/globals": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/eslint-scope": { "node_modules/eslint-scope": {
"version": "7.2.2", "version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -2547,7 +2466,6 @@
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"array-union": "^2.1.0", "array-union": "^2.1.0",
"dir-glob": "^3.0.1", "dir-glob": "^3.0.1",
@@ -3051,7 +2969,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
"dev": true, "dev": true,
"license": "ISC",
"dependencies": { "dependencies": {
"brace-expansion": "^2.0.1" "brace-expansion": "^2.0.1"
}, },
@@ -3315,7 +3232,6 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -3795,10 +3711,13 @@
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.6.2", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true, "dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
}, },
@@ -3806,6 +3725,18 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/semver/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -3850,7 +3781,6 @@
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -4280,9 +4210,9 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "5.2.11", "version": "5.2.10",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
"integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"esbuild": "^0.20.1", "esbuild": "^0.20.1",
@@ -4335,9 +4265,9 @@
} }
}, },
"node_modules/vite-node": { "node_modules/vite-node": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz",
"integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"cac": "^6.7.14", "cac": "^6.7.14",
@@ -4376,16 +4306,16 @@
} }
}, },
"node_modules/vitest": { "node_modules/vitest": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz",
"integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/expect": "1.6.0", "@vitest/expect": "1.5.2",
"@vitest/runner": "1.6.0", "@vitest/runner": "1.5.2",
"@vitest/snapshot": "1.6.0", "@vitest/snapshot": "1.5.2",
"@vitest/spy": "1.6.0", "@vitest/spy": "1.5.2",
"@vitest/utils": "1.6.0", "@vitest/utils": "1.5.2",
"acorn-walk": "^8.3.2", "acorn-walk": "^8.3.2",
"chai": "^4.3.10", "chai": "^4.3.10",
"debug": "^4.3.4", "debug": "^4.3.4",
@@ -4399,7 +4329,7 @@
"tinybench": "^2.5.1", "tinybench": "^2.5.1",
"tinypool": "^0.8.3", "tinypool": "^0.8.3",
"vite": "^5.0.0", "vite": "^5.0.0",
"vite-node": "1.6.0", "vite-node": "1.5.2",
"why-is-node-running": "^2.2.2" "why-is-node-running": "^2.2.2"
}, },
"bin": { "bin": {
@@ -4414,8 +4344,8 @@
"peerDependencies": { "peerDependencies": {
"@edge-runtime/vm": "*", "@edge-runtime/vm": "*",
"@types/node": "^18.0.0 || >=20.0.0", "@types/node": "^18.0.0 || >=20.0.0",
"@vitest/browser": "1.6.0", "@vitest/browser": "1.5.2",
"@vitest/ui": "1.6.0", "@vitest/ui": "1.5.2",
"happy-dom": "*", "happy-dom": "*",
"jsdom": "*" "jsdom": "*"
}, },
@@ -4477,10 +4407,16 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true "dev": true
}, },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/yaml": { "node_modules/yaml": {
"version": "2.4.2", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
"integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
"dev": true, "dev": true,
"bin": { "bin": {
"yaml": "bin.mjs" "yaml": "bin.mjs"
+2 -2
View File
@@ -28,7 +28,7 @@
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-unicorn": "^52.0.0",
"mock-fs": "^5.2.0", "mock-fs": "^5.2.0",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-organize-imports": "^3.2.4",
@@ -62,6 +62,6 @@
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"volta": { "volta": {
"node": "20.13.1" "node": "20.12.2"
} }
} }
+3 -2
View File
@@ -1,4 +1,4 @@
import { getMyUserInfo, init, isHttpError } from '@immich/sdk'; import { defaults, getMyUserInfo, isHttpError } from '@immich/sdk';
import { glob } from 'fast-glob'; import { glob } from 'fast-glob';
import { createHash } from 'node:crypto'; import { createHash } from 'node:crypto';
import { createReadStream } from 'node:fs'; import { createReadStream } from 'node:fs';
@@ -46,7 +46,8 @@ export const connect = async (url: string, key: string) => {
// noop // noop
} }
init({ baseUrl: url, apiKey: key }); defaults.baseUrl = url;
defaults.headers = { 'x-api-key': key };
const [error] = await withError(getMyUserInfo()); const [error] = await withError(getMyUserInfo());
if (isHttpError(error)) { if (isHttpError(error)) {
+37 -23
View File
@@ -4,29 +4,32 @@
name: immich-dev name: immich-dev
x-server-build: &server-common
image: immich-server-dev:latest
build:
context: ../
dockerfile: server/Dockerfile
target: dev
restart: always
volumes:
- ../server:/usr/src/app
- ../open-api:/usr/src/open-api
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload/upload
- /usr/src/app/node_modules
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ulimits:
nofile:
soft: 1048576
hard: 1048576
services: services:
immich-server: immich-server:
container_name: immich_server container_name: immich_server
command: ['/usr/src/app/bin/immich-dev'] command: ['/usr/src/app/bin/immich-dev', 'immich']
image: immich-server-dev:latest <<: *server-common
build:
context: ../
dockerfile: server/Dockerfile
target: dev
restart: always
volumes:
- ../server:/usr/src/app
- ../open-api:/usr/src/open-api
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/upload/upload
- /usr/src/app/node_modules
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ulimits:
nofile:
soft: 1048576
hard: 1048576
ports: ports:
- 3001:3001 - 3001:3001
- 9230:9230 - 9230:9230
@@ -34,6 +37,19 @@ services:
- redis - redis
- database - database
immich-microservices:
container_name: immich_microservices
command: ['/usr/src/app/bin/immich-dev', 'microservices']
<<: *server-common
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
ports:
- 9231:9230
depends_on:
- database
- immich-server
immich-web: immich-web:
container_name: immich_web container_name: immich_web
image: immich-web-dev:latest image: immich-web-dev:latest
@@ -81,7 +97,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: redis:6.2-alpine@sha256:c0634a08e74a4bb576d02d1ee993dc05dba10e8b7b9492dfa28a7af100d46c01 image: redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
database: database:
container_name: immich_postgres container_name: immich_postgres
@@ -92,12 +108,10 @@ services:
POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME} POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME} POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes: volumes:
- ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data - ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data
ports: ports:
- 5432:5432 - 5432:5432
command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
# set IMMICH_METRICS=true in .env to enable metrics # set IMMICH_METRICS=true in .env to enable metrics
# immich-prometheus: # immich-prometheus:
+29 -15
View File
@@ -1,24 +1,40 @@
name: immich-prod name: immich-prod
x-server-build: &server-common
image: immich-server:latest
build:
context: ../
dockerfile: server/Dockerfile
volumes:
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
restart: always
services: services:
immich-server: immich-server:
container_name: immich_server container_name: immich_server
image: immich-server:latest command: ['start.sh', 'immich']
build: <<: *server-common
context: ../
dockerfile: server/Dockerfile
volumes:
- ${UPLOAD_LOCATION}/photos:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
restart: always
ports: ports:
- 2283:3001 - 2283:3001
depends_on: depends_on:
- redis - redis
- database - database
immich-microservices:
container_name: immich_microservices
command: ['start.sh', 'microservices']
<<: *server-common
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
depends_on:
- redis
- database
- immich-server
immich-machine-learning: immich-machine-learning:
container_name: immich_machine_learning container_name: immich_machine_learning
image: immich-machine-learning:latest image: immich-machine-learning:latest
@@ -38,7 +54,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: redis:6.2-alpine@sha256:c0634a08e74a4bb576d02d1ee993dc05dba10e8b7b9492dfa28a7af100d46c01 image: redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
restart: always restart: always
database: database:
@@ -50,19 +66,17 @@ services:
POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME} POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME} POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes: volumes:
- ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data - ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data
ports: ports:
- 5432:5432 - 5432:5432
command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
# set IMMICH_METRICS=true in .env to enable metrics # set IMMICH_METRICS=true in .env to enable metrics
immich-prometheus: immich-prometheus:
container_name: immich_prometheus container_name: immich_prometheus
ports: ports:
- 9090:9090 - 9090:9090
image: prom/prometheus@sha256:5c435642ca4d8427ca26f4901c11114023004709037880cd7860d5b7176aa731 image: prom/prometheus@sha256:4f6c47e39a9064028766e8c95890ed15690c30f00c4ba14e7ce6ae1ded0295b1
volumes: volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus - prometheus-data:/prometheus
@@ -74,7 +88,7 @@ services:
command: ['./run.sh', '-disable-reporting'] command: ['./run.sh', '-disable-reporting']
ports: ports:
- 3000:3000 - 3000:3000
image: grafana/grafana:11.0.0-ubuntu@sha256:02e99d1ee0b52dc9d3000c7b5314e7a07e0dfd69cc49bb3f8ce323491ed3406b image: grafana/grafana:10.4.2-ubuntu@sha256:4f55071b556fb03f12b41423c98a185ed6695ed9ff2558e35805f0dd765fd958
volumes: volumes:
- grafana-data:/var/lib/grafana - grafana-data:/var/lib/grafana
+20 -4
View File
@@ -12,6 +12,7 @@ services:
immich-server: immich-server:
container_name: immich_server container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
command: ['start.sh', 'immich']
volumes: volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload - ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
@@ -24,6 +25,23 @@ services:
- database - database
restart: always restart: always
immich-microservices:
container_name: immich_microservices
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
command: ['start.sh', 'microservices']
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
depends_on:
- redis
- database
restart: always
immich-machine-learning: immich-machine-learning:
container_name: immich_machine_learning container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag. # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
@@ -40,21 +58,19 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/redis:6.2-alpine@sha256:c0634a08e74a4bb576d02d1ee993dc05dba10e8b7b9492dfa28a7af100d46c01 image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
restart: always restart: always
database: database:
container_name: immich_postgres container_name: immich_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 image: registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
environment: environment:
POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME} POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME} POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes: volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
restart: always restart: always
command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
volumes: volumes:
model-cache: model-cache:
+3 -1
View File
@@ -1,3 +1,5 @@
version: "3.8"
# Configurations for hardware-accelerated machine learning # Configurations for hardware-accelerated machine learning
# If using Unraid or another platform that doesn't allow multiple Compose files, # If using Unraid or another platform that doesn't allow multiple Compose files,
@@ -28,7 +30,7 @@ services:
openvino: openvino:
device_cgroup_rules: device_cgroup_rules:
- 'c 189:* rmw' - "c 189:* rmw"
devices: devices:
- /dev/dri:/dev/dri - /dev/dri:/dev/dri
volumes: volumes:
+2
View File
@@ -1,3 +1,5 @@
version: "3.8"
# Configurations for hardware-accelerated transcoding # Configurations for hardware-accelerated transcoding
# If using Unraid or another platform that doesn't allow multiple Compose files, # If using Unraid or another platform that doesn't allow multiple Compose files,
+1 -1
View File
@@ -1 +1 @@
20.13 v20.12
+5 -5
View File
@@ -5,13 +5,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
### Installation ### Installation
``` ```
$ npm install $ yarn
``` ```
### Local Development ### Local Development
``` ```
$ npm run start $ yarn start
``` ```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
@@ -19,7 +19,7 @@ This command starts a local development server and opens up a browser window. Mo
### Build ### Build
``` ```
$ npm run build $ yarn build
``` ```
This command generates static content into the `build` directory and can be served using any static contents hosting service. This command generates static content into the `build` directory and can be served using any static contents hosting service.
@@ -29,13 +29,13 @@ This command generates static content into the `build` directory and can be serv
Using SSH: Using SSH:
``` ```
$ USE_SSH=true npm run deploy $ USE_SSH=true yarn deploy
``` ```
Not using SSH: Not using SSH:
``` ```
$ GIT_USER=<Your GitHub username> npm run deploy $ GIT_USER=<Your GitHub username> yarn deploy
``` ```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
+2 -41
View File
@@ -399,47 +399,8 @@ If it mentions SIGILL (note the lack of a K) or error code 132, it most likely m
If your version of Immich is below 1.92.0 and the crash occurs after logs about tracing or exporting a model, consider either upgrading or disabling the Tag Objects job. If your version of Immich is below 1.92.0 and the crash occurs after logs about tracing or exporting a model, consider either upgrading or disabling the Tag Objects job.
## Database ### Why does Immich log migration errors on startup?
### Why am I getting database ownership errors? Sometimes Immich logs errors such as "duplicate key value violates unique constraint" or "column (...) of relation (...) already exists". Because of Immich's container structure, this error can be seen when both immich and immich-microservices start at the same time and attempt to migrate or create the database structure. Since the database migration is run sequentially and inside of transactions, this error message does not cause harm to your installation of Immich and can safely be ignored. If needed, you can manually restart Immich by running `docker restart immich immich-microservices`.
If you get database errors such as `FATAL: data directory "/var/lib/postgresql/data" has wrong ownership` upon database startup, this is likely due to an issue with your filesystem.
NTFS and ex/FAT/32 filesystems are not supported. See [here](/docs/install/environment-variables#supported-filesystems) for more details.
### How can I verify the integrity of my database?
If you installed Immich using v1.104.0 or later, you likely have database checksums enabled by default. You can check this by running the following command.
A result of `on` means that checksums are enabled.
<details>
<summary>Check if checksums are enabled</summary>
```bash
docker exec -it immich_postgres psql --dbname=immich --username=<DB_USERNAME> --command="show data_checksums"
data_checksums
----------------
on
(1 row)
```
</details>
If checksums are enabled, you can check the status of the database with the following command. A normal result is all zeroes.
<details>
<summary>Check for database corruption</summary>
```bash
docker exec -it immich_postgres psql --dbname=immich --username=<DB_USERNAME> --command="SELECT datname, checksum_failures, checksum_last_failure FROM pg_stat_database WHERE datname IS NOT NULL"
datname | checksum_failures | checksum_last_failure
-----------+-------------------+-----------------------
postgres | 0 |
immich | 0 |
template1 | 0 |
template0 | 0 |
(4 rows)
```
</details>
[huggingface]: https://huggingface.co/immich-app [huggingface]: https://huggingface.co/immich-app
@@ -17,10 +17,6 @@ Refer to the official [postgres documentation](https://www.postgresql.org/docs/c
The recommended way to backup and restore the Immich database is to use the `pg_dumpall` command. When restoring, you need to delete the `DB_DATA_LOCATION` folder (if it exists) to reset the database. The recommended way to backup and restore the Immich database is to use the `pg_dumpall` command. When restoring, you need to delete the `DB_DATA_LOCATION` folder (if it exists) to reset the database.
:::caution
It is not recommended to directly backup the `DB_DATA_LOCATION` folder. Doing so while the database is running can lead to a corrupted backup that cannot be restored.
:::
<Tabs> <Tabs>
<TabItem value="Linux system" label="Linux system" default> <TabItem value="Linux system" label="Linux system" default>
@@ -55,7 +51,7 @@ docker compose pull # Update to latest version of Immich (if desired)
docker compose create # Create Docker containers for Immich apps without running them. docker compose create # Create Docker containers for Immich apps without running them.
docker start immich_postgres # Start Postgres server docker start immich_postgres # Start Postgres server
sleep 10 # Wait for Postgres server to start up sleep 10 # Wait for Postgres server to start up
gc "C:\path\to\backup\dump.sql" | docker exec -i immich_postgres psql --username=postgres # Restore Backup gc "C:\path\to\backup\dump.sql" | docker exec -i immich_postgres psql --username=postgres # Restore Backup
docker compose up -d # Start remainder of Immich apps docker compose up -d # Start remainder of Immich apps
``` ```
@@ -5,7 +5,7 @@ While not officially recommended, it is possible to run Immich using a pre-exist
By default, Immich expects superuser permission on the Postgres database and requires certain extensions to be installed. This guide outlines the steps required to prepare a pre-existing Postgres server to be used by Immich. By default, Immich expects superuser permission on the Postgres database and requires certain extensions to be installed. This guide outlines the steps required to prepare a pre-existing Postgres server to be used by Immich.
:::tip :::tip
Running with a pre-existing Postgres server can unlock powerful administrative features, including logical replication and streaming write-ahead log backups using programs like pgBackRest or Barman. Running with a pre-existing Postgres server can unlock powerful administrative features, including logical replication, data page checksums, and streaming write-ahead log backups using programs like pgBackRest or Barman.
::: :::
## Prerequisites ## Prerequisites
+1 -1
View File
@@ -18,7 +18,7 @@ In any other situation, there are 3 different options that can appear:
- MATCHES - These files are matched by their checksums. - MATCHES - These files are matched by their checksums.
- OFFLINE PATHS - These files are the result of manually deleting files from immich or a failed file move in the past (losing track of a file). - OFFLINE PATHS - These files are the result of manually deleting files in the upload library or a failed file move in the past (losing track of a file).
- UNTRACKED FILES - These files are not tracked by the application. They can be the result of failed moves, interrupted uploads, or left behind due to a bug. - UNTRACKED FILES - These files are not tracked by the application. They can be the result of failed moves, interrupted uploads, or left behind due to a bug.
-5
View File
@@ -9,11 +9,6 @@ When contributing code through a pull request, please check the following:
- [ ] `npm run check:svelte` (Type checking via SvelteKit) - [ ] `npm run check:svelte` (Type checking via SvelteKit)
- [ ] `npm test` (unit tests) - [ ] `npm test` (unit tests)
## Documentation
- [ ] `npm run format` (formatting via Prettier)
- [ ] Update the `_redirects` file if you have renamed a page or removed it from the documentation.
:::tip AIO :::tip AIO
Run all web checks with `npm run check:all` Run all web checks with `npm run check:all`
::: :::
+3 -5
View File
@@ -22,8 +22,7 @@ You do not need to redo any transcoding jobs after enabling hardware acceleratio
- WSL2 does not support Quick Sync. - WSL2 does not support Quick Sync.
- Raspberry Pi is currently not supported. - Raspberry Pi is currently not supported.
- Two-pass mode is only supported for NVENC. Other APIs will ignore this setting. - Two-pass mode is only supported for NVENC. Other APIs will ignore this setting.
- By default, only encoding is currently hardware accelerated. This means the CPU is still used for software decoding and tone-mapping. - Only encoding is currently hardware accelerated, so the CPU is still used for software decoding and tone-mapping.
- NVENC and RKMPP can be fully accelerated by enabling hardware decoding in the video transcoding settings.
- Hardware dependent - Hardware dependent
- Codec support varies, but H.264 and HEVC are usually supported. - Codec support varies, but H.264 and HEVC are usually supported.
- Notably, NVIDIA and AMD GPUs do not support VP9 encoding. - Notably, NVIDIA and AMD GPUs do not support VP9 encoding.
@@ -34,7 +33,7 @@ You do not need to redo any transcoding jobs after enabling hardware acceleratio
#### NVENC #### NVENC
- You must have the official NVIDIA driver installed on the server. - You must have the official NVIDIA driver installed on the server.
- On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed. - On Linux (except for WSL2), you also need to have [NVIDIA Container Runtime][nvcr] installed.
#### QSV #### QSV
@@ -66,7 +65,6 @@ For RKMPP to work:
3. Redeploy the `immich-microservices` container with these updated settings. 3. Redeploy the `immich-microservices` container with these updated settings.
4. In the Admin page under `Video transcoding settings`, change the hardware acceleration setting to the appropriate option and save. 4. In the Admin page under `Video transcoding settings`, change the hardware acceleration setting to the appropriate option and save.
5. (Optional) If using a compatible backend, you may enable hardware decoding for optimal performance.
#### Single Compose File #### Single Compose File
@@ -124,7 +122,7 @@ Once this is done, you can continue to step 3 of "Basic Setup".
- While you can use VAAPI with NVIDIA and Intel devices, prefer the more specific APIs since they're more optimized for their respective devices - While you can use VAAPI with NVIDIA and Intel devices, prefer the more specific APIs since they're more optimized for their respective devices
[hw-file]: https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml [hw-file]: https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml
[nvct]: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html [nvcr]: https://github.com/NVIDIA/nvidia-container-runtime/
[jellyfin-lp]: https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#configure-and-verify-lp-mode-on-linux [jellyfin-lp]: https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#configure-and-verify-lp-mode-on-linux
[jellyfin-kernel-bug]: https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#known-issues-and-limitations [jellyfin-kernel-bug]: https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#known-issues-and-limitations
[libmali-rockchip]: https://github.com/tsukumijima/libmali-rockchip/releases [libmali-rockchip]: https://github.com/tsukumijima/libmali-rockchip/releases
+5 -1
View File
@@ -4,9 +4,13 @@
Immich supports the creation of libraries which is a top-level asset container. Currently, there are two types of libraries: traditional upload libraries that can sync with a mobile device, and external libraries, that keeps up to date with files on disk. Libraries are different from albums in that an asset can belong to multiple albums but only one library, and deleting a library deletes all assets contained within. As of August 2023, this is a new feature and libraries have a lot of potential for future development beyond what is documented here. This document attempts to describe the current state of libraries. Immich supports the creation of libraries which is a top-level asset container. Currently, there are two types of libraries: traditional upload libraries that can sync with a mobile device, and external libraries, that keeps up to date with files on disk. Libraries are different from albums in that an asset can belong to multiple albums but only one library, and deleting a library deletes all assets contained within. As of August 2023, this is a new feature and libraries have a lot of potential for future development beyond what is documented here. This document attempts to describe the current state of libraries.
## The Upload Library
Immich comes preconfigured with an upload library for each user. All assets uploaded to Immich are added to this library. This library can be renamed, but not deleted. The upload library is the only library that can be synced with a mobile device. No items in an upload library is allowed to have the same sha1 hash as another item in the same library in order to prevent duplicates.
## External Libraries ## External Libraries
External libraries tracks assets stored outside of Immich, i.e. in the file system. When the external library is scanned, Immich will read the metadata from the file and create an asset in the library for each image or video file. These items will then be shown in the main timeline, and they will look and behave like any other asset, including viewing on the map, adding to albums, etc. External libraries tracks assets stored outside of immich, i.e. in the file system. Immich will only read data from the files, and will not modify them in any way. Therefore, the delete button is disabled for external assets. When the external library is scanned, immich will read the metadata from the file and create an asset in the library for each image or video file. These items will then be shown in the main timeline, and they will look and behave like any other asset, including viewing on the map, adding to albums, etc.
If a file is modified outside of Immich, the changes will not be reflected in immich until the library is scanned again. There are different ways to scan a library depending on the use case: If a file is modified outside of Immich, the changes will not be reflected in immich until the library is scanned again. There are different ways to scan a library depending on the use case:
@@ -38,7 +38,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele
- The GPU must have compute capability 5.2 or greater. - The GPU must have compute capability 5.2 or greater.
- The server must have the official NVIDIA driver installed. - The server must have the official NVIDIA driver installed.
- The installed driver must be >= 535 (it must support CUDA 12.2). - The installed driver must be >= 535 (it must support CUDA 12.2).
- On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed. - On Linux (except for WSL2), you also need to have [NVIDIA Container Runtime][nvcr] installed.
#### OpenVINO #### OpenVINO
@@ -95,11 +95,11 @@ immich-machine-learning:
Once this is done, you can redeploy the `immich-machine-learning` container. Once this is done, you can redeploy the `immich-machine-learning` container.
:::info :::info
You can confirm the device is being recognized and used by checking its utilization (via `nvtop` for CUDA, `intel_gpu_top` for OpenVINO, etc.). You can also enable debug logging by setting `IMMICH_LOG_LEVEL=debug` in the `.env` file and restarting the `immich-machine-learning` container. When a Smart Search or Face Detection job begins, you should see a log for `Available ORT providers` containing the relevant provider. In the case of ARM NN, the absence of a `Could not load ANN shared libraries` log entry means it loaded successfully. You can confirm the device is being recognized and used by checking its utilization (via `nvtop` for CUDA, `intel_gpu_top` for OpenVINO, etc.). You can also enable debug logging by setting `LOG_LEVEL=debug` in the `.env` file and restarting the `immich-machine-learning` container. When a Smart Search or Face Detection job begins, you should see a log for `Available ORT providers` containing the relevant provider. In the case of ARM NN, the absence of a `Could not load ANN shared libraries` log entry means it loaded successfully.
::: :::
[hw-file]: https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml [hw-file]: https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
[nvct]: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html [nvcr]: https://github.com/NVIDIA/nvidia-container-runtime/
## Tips ## Tips
-16
View File
@@ -1,16 +0,0 @@
# Create Custom Map Styles for Immich Using Maptiler
You may decide that you'd like to modify the style document which is used to draw the maps in Immich. This can be done easily using Maptiler, if you do not want to write an entire JSON document by hand.
## Steps
1. Create a free account at https://cloud.maptiler.com
2. Once logged in, you can either create a brand new map by clicking on **New Map**, selecting a starter map, and then clicking **Customize**, OR by selecting a **Standard Map** and customizing it from there.
3. The **editor** interface is self-explanatory. You can change colors, remove visible layers, or add optional layers (e.g., administrative, topo, hydro, etc.) in the composer.
4. Once you have your map composed, click on **Save** at the top right. Give it a unique name to save it to your account.
5. Next, **Publish** your style using the **Publish** button at the top right. This will deploy it to production, which means it is able to be exposed over the Internet. Maptiler will present an interactive side-by-side map with the original and your changes prior to publication.<br/>![Maptiler Publication Settings](img/immich_map_styles_publish.png)
6. Maptiler will warn you that changing the map will change it across all apps using the map. Since no apps are using the map yet, this is okay.
7. Clicking on the name of your new map at the top left will bring you to the item's **details** page. From here, copy the link to the JSON style under **Use vector style**. This link will automatically contain your personal API key to Maptiler.
8. In **Immich**, navigate to **Administration --> Settings --> Map & GPS Settings** and expand the **Map Settings** subsection.
9. Paste the link to your JSON style in either the **Light Style** or **Dark Style**. (You can add different styles which will help make the map style more appropriate depending on whether you set **Immich** to Light or Dark mode.
10. Save your selections. Reload the map, and enjoy your custom map style!
+34 -38
View File
@@ -2,52 +2,48 @@
A short guide on connecting [pgAdmin](https://www.pgadmin.org/) to Immich. A short guide on connecting [pgAdmin](https://www.pgadmin.org/) to Immich.
:::note
In order to connect to the database the immich_postgres container **must be running**.
The passwords and usernames used below match the ones specified in the example `.env` file. If changed, please use actual values instead.
**Optional:** To connect to the database **outside** of your Docker's network:
- Expose port 5432 in your `docker-compose.yml` file.
- Edit the PostgreSQL [`pg_hba.conf`](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) file.
- Make sure your firewall does not block access to port 5432.
Note that exposing the database port increases the risk of getting attacked by hackers.
Make sure to remove the binding port after finishing the database's tasks.
:::
## 1. Install pgAdmin ## 1. Install pgAdmin
Add a file `docker-compose-pgadmin.yml` next to your `docker-compose.yml` with the following content: Download and install [pgAdmin](https://www.pgadmin.org/download/) following the official documentation.
```
name: immich
services:
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin4_container
restart: always
ports:
- "8888:80"
environment:
PGADMIN_DEFAULT_EMAIL: user-name@domain-name.com
PGADMIN_DEFAULT_PASSWORD: strong-password
volumes:
- pgadmin-data:/var/lib/pgadmin
volumes:
pgadmin-data:
```
Change the values of `PGADMIN_DEFAULT_EMAIL` and `PGADMIN_DEFAULT_PASSWORD` in this file.
Run `docker compose -f docker-compose.yml -f docker-compose-pgadmin.yml up` to start immich along with `pgAdmin`.
## 2. Add a Server ## 2. Add a Server
Open [localhost:8888](http://localhost:8888) and login with the default credentials from above. Open pgAdmin and click "Add New Server".
Right click on `Servers` and click on `Register >> Server..` then enter the values below in the `Connection` tab. <img src={require('./img/add-new-server-option.png').default} width="50%" title="new server option" />
<img src={require('./img/pgadmin-add-new-server.png').default} width="50%" title="new server option" /> ## 3. Enter Connection Details
:::note | Name | Value |
The parameters used here match those specified in the example `.env` file. If you have changed your `.env` file, you'll need to adjust accordingly. | -------------------- | ----------- |
::: | Host name/address | `localhost` |
| Port | `5432` |
| Maintenance database | `immich` |
| Username | `postgres` |
| Password | `postgres` |
| Name | Value | <img src={require('./img/Connection-Pgadmin.png').default} width="75%" title="Connection" />
| -------------------- | ----------------- |
| Host name/address | `immich_postgres` | ## 4. Save Connection
| Port | `5432` |
| Maintenance database | `immich` |
| Username | `postgres` |
| Password | `postgres` |
Click on "Save" to connect to the Immich database. Click on "Save" to connect to the Immich database.
:::tip
View [Database Queries](/docs/guides/database-queries/) for common database queries.
:::
+1 -1
View File
@@ -96,7 +96,7 @@ SELECT * FROM "users";
## System Config ## System Config
```sql title="Custom settings" ```sql title="Custom settings"
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config'; SELECT "key", "value" FROM "system_config";
``` ```
(Only used when not using the [config file](/docs/install/config-file)) (Only used when not using the [config file](/docs/install/config-file))
+5 -9
View File
@@ -6,19 +6,15 @@ in a directory on the same machine.
# Mount the directory into the containers. # Mount the directory into the containers.
Edit `docker-compose.yml` to add two new mount points in the sections `immich-server:` and `immich-microservices:` under `volumes:` Edit `docker-compose.yml` to add two new mount points under `volumes:`
```diff ```
immich-server: immich-server:
volumes: volumes:
+ - ${EXTERNAL_PATH}:/usr/src/app/external - ${EXTERNAL_PATH}:/usr/src/app/external
immich-microservices:
volumes:
+ - ${EXTERNAL_PATH}:/usr/src/app/external
``` ```
Be sure to add exactly the same path to both services. Be sure to add exactly the same line to both `immich-server:` and `immich-microservices:`.
Edit `.env` to define `EXTERNAL_PATH`, substituting in the correct path for your computer: Edit `.env` to define `EXTERNAL_PATH`, substituting in the correct path for your computer:
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

-4
View File
@@ -77,10 +77,6 @@ The default configuration looks like this:
"enabled": true, "enabled": true,
"modelName": "ViT-B-32__openai" "modelName": "ViT-B-32__openai"
}, },
"duplicateDetection": {
"enabled": false,
"maxDistance": 0.03
},
"facialRecognition": { "facialRecognition": {
"enabled": true, "enabled": true,
"modelName": "buffalo_l", "modelName": "buffalo_l",
+11 -15
View File
@@ -24,25 +24,18 @@ If this should not work, try running `docker compose up -d --force-recreate`.
| `DB_DATA_LOCATION` | Host Path for Postgres database | | database | | `DB_DATA_LOCATION` | Host Path for Postgres database | | database |
:::tip :::tip
These environment variables are used by the `docker-compose.yml` file and do **NOT** affect the containers directly. These environment variables are used by the `docker-compose.yml` file and do **NOT** affect the containers directly.
::: :::
### Supported filesystems
The Immich Postgres database (`DB_DATA_LOCATION`) must be located on a filesystem that supports user/group
ownership and permissions (EXT2/3/4, ZFS, APFS, BTRFS, XFS, etc.). It will not work on any filesystem formatted in NTFS or ex/FAT/32.
It will not work in WSL (Windows Subsystem for Linux) when using a mounted host directory (commonly under `/mnt`).
If this is an issue, you can change the bind mount to a Docker volume instead.
Regardless of filesystem, it is not recommended to use a network share for your database location due to performance and possible data loss issues.
## General ## General
| Variable | Description | Default | Services | | Variable | Description | Default | Services |
| :------------------------------ | :------------------------------------------- | :----------------------: | :-------------------------------------- | | :------------------------------ | :------------------------------------------- | :----------------------: | :-------------------------------------- |
| `TZ` | Timezone | | microservices | | `TZ` | Timezone | | microservices |
| `IMMICH_ENV` | Environment (production, development) | `production` | server, microservices, machine learning | | `NODE_ENV` | Environment (production, development) | `production` | server, microservices, machine learning |
| `IMMICH_LOG_LEVEL` | Log Level (verbose, debug, log, warn, error) | `log` | server, microservices, machine learning | | `LOG_LEVEL` | Log Level (verbose, debug, log, warn, error) | `log` | server, microservices, machine learning |
| `IMMICH_MEDIA_LOCATION` | Media Location | `./upload`<sup>\*1</sup> | server, microservices | | `IMMICH_MEDIA_LOCATION` | Media Location | `./upload`<sup>\*1</sup> | server, microservices |
| `IMMICH_CONFIG_FILE` | Path to config file | | server, microservices | | `IMMICH_CONFIG_FILE` | Path to config file | | server, microservices |
| `IMMICH_WEB_ROOT` | Path of root index.html | `/usr/src/app/www` | server | | `IMMICH_WEB_ROOT` | Path of root index.html | `/usr/src/app/www` | server |
@@ -59,10 +52,13 @@ It only need to be set if the Immich deployment method is changing.
## Ports ## Ports
| Variable | Description | Default | | Variable | Description | Default | Services |
| :------------ | :------------- | :------------------------------------: | | :---------------------- | :-------------------- | :-------: | :-------------------- |
| `IMMICH_HOST` | Listening host | `0.0.0.0` | | `HOST` | Host | `0.0.0.0` | server, microservices |
| `IMMICH_PORT` | Listening port | 3001 (server), 3003 (machine learning) | | `SERVER_PORT` | Server Port | `3001` | server |
| `MICROSERVICES_PORT` | Microservices Port | `3002` | microservices |
| `MACHINE_LEARNING_HOST` | Machine Learning Host | `0.0.0.0` | machine learning |
| `MACHINE_LEARNING_PORT` | Machine Learning Port | `3003` | machine learning |
## Database ## Database
+3 -4
View File
@@ -8,7 +8,7 @@ Install Immich using Portainer's Stack feature.
1. Go to "**Stacks**" in the left sidebar. 1. Go to "**Stacks**" in the left sidebar.
2. Click on "**Add stack**". 2. Click on "**Add stack**".
3. Give the stack a name (i.e. immich), and select "**Web Editor**" as the build method. 3. Give the stack a name (i.e. Immich), and select "**Web Editor**" as the build method.
4. Copy the content of the `docker-compose.yml` file from the [GitHub repository](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml). 4. Copy the content of the `docker-compose.yml` file from the [GitHub repository](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml).
5. Replace `.env` with `stack.env` for all containers that need to use environment variables in the web editor. 5. Replace `.env` with `stack.env` for all containers that need to use environment variables in the web editor.
@@ -38,9 +38,8 @@ style={{border: '1px solid #ddd'}}
alt="Dot Env Example" alt="Dot Env Example"
/> />
- Change the default `DB_PASSWORD`, and add custom database connection information if necessary. - Populate custom database information if necessary.
- Change `DB_DATA_LOCATION` to a folder where the database will be saved to disk. - Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets.
- Change `UPLOAD_LOCATION` to a folder where media (uploaded and generated) will be stored.
11. Click on "**Deploy the stack**". 11. Click on "**Deploy the stack**".
+7 -10
View File
@@ -15,15 +15,12 @@ Hardware and software requirements for Immich
Immich requires the command `docker compose` - the similarly named `docker-compose` is [deprecated](https://docs.docker.com/compose/migrate/) and is no longer compatible with Immich. Immich requires the command `docker compose` - the similarly named `docker-compose` is [deprecated](https://docs.docker.com/compose/migrate/) and is no longer compatible with Immich.
::: :::
:::info Podman
You can also use Podman to run the application. However, additional configuration might be required.
:::
## Hardware ## Hardware
- **OS**: Recommended Linux operating system (Ubuntu, Debian, etc). - **OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS, etc). Windows works too, with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
- Windows is supported with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/) or [WSL 2](https://docs.docker.com/desktop/wsl/). - **RAM**: At least 4GB, preferred 6GB.
- macOS is supported with [Docker Desktop on Mac](https://docs.docker.com/desktop/install/mac-install/). - **CPU**: At least 2 cores, preferred 4 cores.
- **RAM**: Minimum 4GB, recommended 6GB.
- **CPU**: Minimum 2 cores, recommended 4 cores.
- **Storage**: Recommended Unix-compatible filesystem (EXT4, ZFS, APFS, etc.) with support for user/group ownership and permissions.
- This can present an issue for Windows users. See [here](/docs/install/environment-variables#supported-filesystems)
for more details and alternatives.
- The generation of thumbnails and transcoded video can increase the size of the photo library by 10-20% on average.
- Network shares are supported for the storage of image and video assets only.
+7 -8
View File
@@ -77,9 +77,13 @@ const config = {
}, },
announcementBar: { announcementBar: {
id: 'site_announcement_immich', id: 'site_announcement_immich',
content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use it as <strong>the only way</strong> to store your photos and videos!`, content:
backgroundColor: '#593f00', 'Immich joins Futo! Read about the announcement <a href="/blog/2024/immich-core-team-goes-fulltime">here</a>.',
textColor: '#ffefc9', backgroundColor: '#4250af',
textColor: 'white',
// content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use it as <strong>the only way</strong> to store your photos and videos!`,
// backgroundColor: '#593f00',
// textColor: '#ffefc9',
isCloseable: false, isCloseable: false,
}, },
docs: { docs: {
@@ -119,11 +123,6 @@ const config = {
label: 'GitHub', label: 'GitHub',
position: 'right', position: 'right',
}, },
{
href: 'https://discord.gg/D8JsnBEuKb',
label: 'Discord',
position: 'right',
},
], ],
}, },
footer: { footer: {
+680 -599
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -56,6 +56,6 @@
"node": ">=20" "node": ">=20"
}, },
"volta": { "volta": {
"node": "20.13.1" "node": "20.12.2"
} }
} }
+4 -9
View File
@@ -10,17 +10,17 @@ interface CommunityGuidesProps {
const guides: CommunityGuidesProps[] = [ const guides: CommunityGuidesProps[] = [
{ {
title: 'Cloudflare Tunnels with SSO/OAuth', title: 'Cloudflare Tunnels with SSO/OAuth',
description: `Setting up Cloudflare Tunnels and a SaaS App for Immich.`, description: `Setting up Cloudflare Tunnels and a SaaS App for immich.`,
url: 'https://github.com/immich-app/immich/discussions/8299', url: 'https://github.com/immich-app/immich/discussions/8299',
}, },
{ {
title: 'Database backup in TrueNAS', title: 'Database backup in Truenas',
description: `Create a database backup with pgAdmin in TrueNAS.`, description: `Create a database backup with pgAdmin in Truenas.`,
url: 'https://github.com/immich-app/immich/discussions/8809', url: 'https://github.com/immich-app/immich/discussions/8809',
}, },
{ {
title: 'Unraid backup scripts', title: 'Unraid backup scripts',
description: `Back up your assets in Unraid with a pre-prepared script.`, description: `Back up your assets in Unarid with a pre-prepared script.`,
url: 'https://github.com/immich-app/immich/discussions/8416', url: 'https://github.com/immich-app/immich/discussions/8416',
}, },
{ {
@@ -33,11 +33,6 @@ const guides: CommunityGuidesProps[] = [
description: 'Documentation for simple podman setup using quadlets.', description: 'Documentation for simple podman setup using quadlets.',
url: 'https://github.com/tbelway/immich-podman-quadlets/blob/main/docs/install/podman-quadlet.md', url: 'https://github.com/tbelway/immich-podman-quadlets/blob/main/docs/install/podman-quadlet.md',
}, },
{
title: 'Google Photos import + albums',
description: 'Import your Google Photos files into Immich and add your albums',
url: 'https://github.com/immich-app/immich/discussions/1340',
},
]; ];
function CommunityGuide({ title, description, url }: CommunityGuidesProps): JSX.Element { function CommunityGuide({ title, description, url }: CommunityGuidesProps): JSX.Element {
+1 -6
View File
@@ -10,7 +10,7 @@ interface CommunityProjectProps {
const projects: CommunityProjectProps[] = [ const projects: CommunityProjectProps[] = [
{ {
title: 'immich-go', title: 'immich-go',
description: `An alternative to the immich-CLI that doesn't depend on nodejs. It specializes in importing Google Photos Takeout archives.`, description: `An alternative to the immich-CLI command that doesn't depend on nodejs installation. It tries its best for importing google photos takeout archives.`,
url: 'https://github.com/simulot/immich-go', url: 'https://github.com/simulot/immich-go',
}, },
{ {
@@ -33,11 +33,6 @@ const projects: CommunityProjectProps[] = [
description: 'A Python script to create albums based on the folder structure of an external library.', 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', url: 'https://github.com/Salvoxia/immich-folder-album-creator',
}, },
{
title: 'Immich-Tools',
description: 'Provides scripts for handling problems on the repair page.',
url: 'https://github.com/clumsyCoder00/Immich-Tools',
},
{ {
title: 'Lightroom Publisher: mi.Immich.Publisher', title: 'Lightroom Publisher: mi.Immich.Publisher',
description: 'Lightroom plugin to publish photos from Lightroom collections to Immich albums.', description: 'Lightroom plugin to publish photos from Lightroom collections to Immich albums.',
-7
View File
@@ -33,13 +33,6 @@ function HomepageHeader() {
> >
Demo portal Demo portal
</Link> </Link>
<Link
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-dark-primary dark:bg-immich-primary rounded-full hover:no-underline text-immich-primary dark:text-immich-dark-bg font-bold uppercase"
to="https://discord.gg/D8JsnBEuKb"
>
Discord
</Link>
</div> </div>
<img src="/img/immich-screenshots.png" alt="screenshots" width={'70%'} /> <img src="/img/immich-screenshots.png" alt="screenshots" width={'70%'} />
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-4 gap-1"> <div className="flex flex-col sm:flex-row place-items-center place-content-center mt-4 gap-1">
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

+1 -1
View File
@@ -1 +1 @@
20.13 v20.12
+27 -19
View File
@@ -2,32 +2,40 @@ version: '3.8'
name: immich-e2e name: immich-e2e
x-server-build: &server-common
image: immich-server:latest
build:
context: ../
dockerfile: server/Dockerfile
environment:
- DB_HOSTNAME=database
- DB_USERNAME=postgres
- DB_PASSWORD=postgres
- DB_DATABASE_NAME=immich
- IMMICH_MACHINE_LEARNING_ENABLED=false
- IMMICH_METRICS=true
volumes:
- upload:/usr/src/app/upload
- ../server/test/assets:/data/assets
depends_on:
- redis
- database
services: services:
immich-server: immich-server:
container_name: immich-e2e-server container_name: immich-e2e-server
command: ['./start.sh'] command: ['./start.sh', 'immich']
image: immich-server:latest <<: *server-common
build:
context: ../
dockerfile: server/Dockerfile
environment:
- DB_HOSTNAME=database
- DB_USERNAME=postgres
- DB_PASSWORD=postgres
- DB_DATABASE_NAME=immich
- IMMICH_MACHINE_LEARNING_ENABLED=false
- IMMICH_METRICS=true
volumes:
- upload:/usr/src/app/upload
- ./test-assets:/test-assets
depends_on:
- redis
- database
ports: ports:
- 2283:3001 - 2283:3001
immich-microservices:
container_name: immich-e2e-microservices
command: ['./start.sh', 'microservices']
<<: *server-common
redis: redis:
image: redis:6.2-alpine@sha256:c0634a08e74a4bb576d02d1ee993dc05dba10e8b7b9492dfa28a7af100d46c01 image: redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
database: database:
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
+174 -231
View File
@@ -1,12 +1,12 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.105.1", "version": "1.103.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.105.1", "version": "1.103.1",
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"devDependencies": { "devDependencies": {
"@immich/cli": "file:../cli", "@immich/cli": "file:../cli",
@@ -23,8 +23,8 @@
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-unicorn": "^52.0.0",
"exiftool-vendored": "^26.0.0", "exiftool-vendored": "^24.5.0",
"luxon": "^3.4.4", "luxon": "^3.4.4",
"pg": "^8.11.3", "pg": "^8.11.3",
"pngjs": "^7.0.0", "pngjs": "^7.0.0",
@@ -65,7 +65,7 @@
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-unicorn": "^52.0.0",
"mock-fs": "^5.2.0", "mock-fs": "^5.2.0",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-organize-imports": "^3.2.4",
@@ -81,14 +81,14 @@
}, },
"../open-api/typescript-sdk": { "../open-api/typescript-sdk": {
"name": "@immich/sdk", "name": "@immich/sdk",
"version": "1.105.1", "version": "1.103.1",
"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.3"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.12.12", "@types/node": "^20.11.0",
"typescript": "^5.3.3" "typescript": "^5.3.3"
} }
}, },
@@ -208,9 +208,9 @@
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "7.24.5", "version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@@ -953,9 +953,9 @@
} }
}, },
"node_modules/@photostructure/tz-lookup": { "node_modules/@photostructure/tz-lookup": {
"version": "10.0.0", "version": "9.0.2",
"resolved": "https://registry.npmjs.org/@photostructure/tz-lookup/-/tz-lookup-10.0.0.tgz", "resolved": "https://registry.npmjs.org/@photostructure/tz-lookup/-/tz-lookup-9.0.2.tgz",
"integrity": "sha512-8ZAjoj/irCuvUlyEinQ/HB6A8hP3bD1dgTOZvfl1b9nAwqniutFDHOQRcGM6Crea68bOwPj010f0Z4KkmuLHEA==", "integrity": "sha512-H8+tTt7ilJNkFyb+QgPnLEGUjQzGwiMb9n7lwRZNBgSKL3VZs9AkjI1E//FcwPjNafwAH932U92+xTqJiF3Bbw==",
"dev": true "dev": true
}, },
"node_modules/@pkgr/core": { "node_modules/@pkgr/core": {
@@ -971,12 +971,12 @@
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
"version": "1.44.0", "version": "1.43.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.0.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz",
"integrity": "sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==", "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"playwright": "1.44.0" "playwright": "1.43.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@@ -1217,6 +1217,12 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true "dev": true
}, },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true
},
"node_modules/@types/luxon": { "node_modules/@types/luxon": {
"version": "3.4.2", "version": "3.4.2",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
@@ -1230,11 +1236,10 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.12", "version": "20.12.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
"integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@@ -1246,9 +1251,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/pg": { "node_modules/@types/pg": {
"version": "8.11.6", "version": "8.11.5",
"resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.5.tgz",
"integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", "integrity": "sha512-2xMjVviMxneZHDHX5p5S6tsRRs7TpDHeeK7kTTMe/kAC/mRRNjWHjZg0rkiY+e17jXSZV3zJYDxXV8Cy72/Vuw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "*", "@types/node": "*",
@@ -1314,14 +1319,20 @@
} }
}, },
"node_modules/@types/pngjs": { "node_modules/@types/pngjs": {
"version": "6.0.5", "version": "6.0.4",
"resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.4.tgz",
"integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", "integrity": "sha512-atAK9xLKOnxiuArxcHovmnOUUGBZOQ3f0vCf43FnoKs6XnqiambT1kkJWmdo71IR+BoXSh+CueeFR0GfH3dTlQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/semver": {
"version": "7.5.8",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
"dev": true
},
"node_modules/@types/superagent": { "node_modules/@types/superagent": {
"version": "8.1.3", "version": "8.1.3",
"resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.3.tgz", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.3.tgz",
@@ -1344,20 +1355,21 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz",
"integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "7.9.0", "@typescript-eslint/scope-manager": "7.7.1",
"@typescript-eslint/type-utils": "7.9.0", "@typescript-eslint/type-utils": "7.7.1",
"@typescript-eslint/utils": "7.9.0", "@typescript-eslint/utils": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0", "@typescript-eslint/visitor-keys": "7.7.1",
"debug": "^4.3.4",
"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",
"semver": "^7.6.0",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
"engines": { "engines": {
@@ -1378,16 +1390,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz",
"integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==",
"dev": true, "dev": true,
"license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "7.9.0", "@typescript-eslint/scope-manager": "7.7.1",
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"@typescript-eslint/typescript-estree": "7.9.0", "@typescript-eslint/typescript-estree": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0", "@typescript-eslint/visitor-keys": "7.7.1",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1407,14 +1418,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz",
"integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0" "@typescript-eslint/visitor-keys": "7.7.1"
}, },
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
@@ -1425,14 +1435,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz",
"integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "7.9.0", "@typescript-eslint/typescript-estree": "7.7.1",
"@typescript-eslint/utils": "7.9.0", "@typescript-eslint/utils": "7.7.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@@ -1453,11 +1462,10 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz",
"integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
}, },
@@ -1467,14 +1475,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz",
"integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==",
"dev": true, "dev": true,
"license": "BSD-2-Clause",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"@typescript-eslint/visitor-keys": "7.9.0", "@typescript-eslint/visitor-keys": "7.7.1",
"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",
@@ -1500,7 +1507,6 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
@@ -1510,7 +1516,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
"dev": true, "dev": true,
"license": "ISC",
"dependencies": { "dependencies": {
"brace-expansion": "^2.0.1" "brace-expansion": "^2.0.1"
}, },
@@ -1522,16 +1527,18 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz",
"integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "7.9.0", "@types/json-schema": "^7.0.15",
"@typescript-eslint/types": "7.9.0", "@types/semver": "^7.5.8",
"@typescript-eslint/typescript-estree": "7.9.0" "@typescript-eslint/scope-manager": "7.7.1",
"@typescript-eslint/types": "7.7.1",
"@typescript-eslint/typescript-estree": "7.7.1",
"semver": "^7.6.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
@@ -1545,13 +1552,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "7.9.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz",
"integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.9.0", "@typescript-eslint/types": "7.7.1",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@@ -1569,9 +1575,9 @@
"dev": true "dev": true
}, },
"node_modules/@vitest/coverage-v8": { "node_modules/@vitest/coverage-v8": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.5.2.tgz",
"integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "integrity": "sha512-QJqxRnbCwNtbbegK9E93rBmhN3dbfG1bC/o52Bqr0zGCYhQzwgwvrJBG7Q8vw3zilX6Ryy6oa/mkZku2lLJx1Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.1", "@ampproject/remapping": "^2.2.1",
@@ -1592,17 +1598,17 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
}, },
"peerDependencies": { "peerDependencies": {
"vitest": "1.6.0" "vitest": "1.5.2"
} }
}, },
"node_modules/@vitest/expect": { "node_modules/@vitest/expect": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz",
"integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/spy": "1.6.0", "@vitest/spy": "1.5.2",
"@vitest/utils": "1.6.0", "@vitest/utils": "1.5.2",
"chai": "^4.3.10" "chai": "^4.3.10"
}, },
"funding": { "funding": {
@@ -1610,12 +1616,12 @@
} }
}, },
"node_modules/@vitest/runner": { "node_modules/@vitest/runner": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz",
"integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/utils": "1.6.0", "@vitest/utils": "1.5.2",
"p-limit": "^5.0.0", "p-limit": "^5.0.0",
"pathe": "^1.1.1" "pathe": "^1.1.1"
}, },
@@ -1624,9 +1630,9 @@
} }
}, },
"node_modules/@vitest/snapshot": { "node_modules/@vitest/snapshot": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz",
"integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"magic-string": "^0.30.5", "magic-string": "^0.30.5",
@@ -1638,9 +1644,9 @@
} }
}, },
"node_modules/@vitest/spy": { "node_modules/@vitest/spy": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz",
"integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"tinyspy": "^2.2.0" "tinyspy": "^2.2.0"
@@ -1650,9 +1656,9 @@
} }
}, },
"node_modules/@vitest/utils": { "node_modules/@vitest/utils": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz",
"integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"diff-sequences": "^29.6.3", "diff-sequences": "^29.6.3",
@@ -1779,7 +1785,6 @@
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -1835,7 +1840,6 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"fill-range": "^7.0.1" "fill-range": "^7.0.1"
}, },
@@ -2117,12 +2121,12 @@
"dev": true "dev": true
}, },
"node_modules/core-js-compat": { "node_modules/core-js-compat": {
"version": "3.37.1", "version": "3.36.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz",
"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"browserslist": "^4.23.0" "browserslist": "^4.22.3"
}, },
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
@@ -2243,7 +2247,6 @@
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"path-type": "^4.0.0" "path-type": "^4.0.0"
}, },
@@ -2484,17 +2487,17 @@
} }
}, },
"node_modules/eslint-plugin-unicorn": { "node_modules/eslint-plugin-unicorn": {
"version": "53.0.0", "version": "52.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-52.0.0.tgz",
"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==", "integrity": "sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.24.5", "@babel/helper-validator-identifier": "^7.22.20",
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@eslint/eslintrc": "^3.0.2", "@eslint/eslintrc": "^2.1.4",
"ci-info": "^4.0.0", "ci-info": "^4.0.0",
"clean-regexp": "^1.0.0", "clean-regexp": "^1.0.0",
"core-js-compat": "^3.37.0", "core-js-compat": "^3.34.0",
"esquery": "^1.5.0", "esquery": "^1.5.0",
"indent-string": "^4.0.0", "indent-string": "^4.0.0",
"is-builtin-module": "^3.2.1", "is-builtin-module": "^3.2.1",
@@ -2503,11 +2506,11 @@
"read-pkg-up": "^7.0.1", "read-pkg-up": "^7.0.1",
"regexp-tree": "^0.1.27", "regexp-tree": "^0.1.27",
"regjsparser": "^0.10.0", "regjsparser": "^0.10.0",
"semver": "^7.6.1", "semver": "^7.5.4",
"strip-indent": "^3.0.0" "strip-indent": "^3.0.0"
}, },
"engines": { "engines": {
"node": ">=18.18" "node": ">=16"
}, },
"funding": { "funding": {
"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
@@ -2516,70 +2519,6 @@
"eslint": ">=8.56.0" "eslint": ">=8.56.0"
} }
}, },
"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz",
"integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^10.0.1",
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/espree": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
"dev": true,
"dependencies": {
"acorn": "^8.11.3",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^4.0.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/globals": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-scope": { "node_modules/eslint-scope": {
"version": "7.2.2", "version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -2700,26 +2639,26 @@
} }
}, },
"node_modules/exiftool-vendored": { "node_modules/exiftool-vendored": {
"version": "26.0.0", "version": "24.6.0",
"resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-26.0.0.tgz", "resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-24.6.0.tgz",
"integrity": "sha512-2TRxx21ovD95VvdSzHb/sTYYcwhiizQIhhVAbrgua9KoL902QRieREGvaUtfBZNjsptdjonuyku2kUBJCPqsgw==", "integrity": "sha512-jGjsoeYmR9VUrlZn0j1wcxMVi5y8C7A4FAa4vm3/l7ThT8d0f+jRcBqtdjaf+P5Ds/F4OgUq+ee/fRVhLy2DrA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@photostructure/tz-lookup": "^10.0.0", "@photostructure/tz-lookup": "^9.0.2",
"@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.4.4"
}, },
"optionalDependencies": { "optionalDependencies": {
"exiftool-vendored.exe": "12.84.0", "exiftool-vendored.exe": "12.78.0",
"exiftool-vendored.pl": "12.84.0" "exiftool-vendored.pl": "12.78.0"
} }
}, },
"node_modules/exiftool-vendored.exe": { "node_modules/exiftool-vendored.exe": {
"version": "12.84.0", "version": "12.78.0",
"resolved": "https://registry.npmjs.org/exiftool-vendored.exe/-/exiftool-vendored.exe-12.84.0.tgz", "resolved": "https://registry.npmjs.org/exiftool-vendored.exe/-/exiftool-vendored.exe-12.78.0.tgz",
"integrity": "sha512-9ocqJb0Pr9k0TownEMd75payF/XOQLF/swr/l0Ep49D+m609uIZsW09CtowhXmk1KrIFobS3+SkdXK04CSyUwQ==", "integrity": "sha512-eMN7L67sb89xi8sN7INPg19uwa1KibG2oOyGcfOvB47h+1hzmGgivVu/SZIMeOToVIbLRwUl+AFwLYSTNXsJEg==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"os": [ "os": [
@@ -2727,9 +2666,9 @@
] ]
}, },
"node_modules/exiftool-vendored.pl": { "node_modules/exiftool-vendored.pl": {
"version": "12.84.0", "version": "12.78.0",
"resolved": "https://registry.npmjs.org/exiftool-vendored.pl/-/exiftool-vendored.pl-12.84.0.tgz", "resolved": "https://registry.npmjs.org/exiftool-vendored.pl/-/exiftool-vendored.pl-12.78.0.tgz",
"integrity": "sha512-TxvMRaVYtd24Vupn48zy24LOYItIIWEu4dgt/VlqLwxQItTpvJTV9YH04iZRvaNh9ZdPRgVKWMuuUDBBHv+lAg==", "integrity": "sha512-K8j9NgxRpTFskFuXEl0AGsc692yYyThe4i3SXgx7xc0fu/vwD2c7tRGljkEtvaweYnMmfrF4DhCpuTu0aux6sg==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"os": [ "os": [
@@ -2753,7 +2692,6 @@
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
"integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3", "@nodelib/fs.walk": "^1.2.3",
@@ -2770,7 +2708,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true, "dev": true,
"license": "ISC",
"dependencies": { "dependencies": {
"is-glob": "^4.0.1" "is-glob": "^4.0.1"
}, },
@@ -2822,7 +2759,6 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
}, },
@@ -3065,7 +3001,6 @@
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"array-union": "^2.1.0", "array-union": "^2.1.0",
"dir-glob": "^3.0.1", "dir-glob": "^3.0.1",
@@ -3341,7 +3276,6 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=0.12.0" "node": ">=0.12.0"
} }
@@ -3557,6 +3491,18 @@
"get-func-name": "^2.0.1" "get-func-name": "^2.0.1"
} }
}, },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/luxon": { "node_modules/luxon": {
"version": "3.4.4", "version": "3.4.4",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
@@ -3615,7 +3561,6 @@
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">= 8" "node": ">= 8"
} }
@@ -3634,7 +3579,6 @@
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"braces": "^3.0.2", "braces": "^3.0.2",
"picomatch": "^2.3.1" "picomatch": "^2.3.1"
@@ -4103,7 +4047,6 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -4232,7 +4175,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8.6" "node": ">=8.6"
}, },
@@ -4252,12 +4194,12 @@
} }
}, },
"node_modules/playwright": { "node_modules/playwright": {
"version": "1.44.0", "version": "1.43.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.0.tgz", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz",
"integrity": "sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==", "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"playwright-core": "1.44.0" "playwright-core": "1.43.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@@ -4270,9 +4212,9 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.44.0", "version": "1.43.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.0.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz",
"integrity": "sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==", "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==",
"dev": true, "dev": true,
"bin": { "bin": {
"playwright-core": "cli.js" "playwright-core": "cli.js"
@@ -4768,10 +4710,13 @@
] ]
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.6.2", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true, "dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
}, },
@@ -4864,7 +4809,6 @@
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -5191,7 +5135,6 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"is-number": "^7.0.0" "is-number": "^7.0.0"
}, },
@@ -5351,9 +5294,9 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "5.2.11", "version": "5.2.10",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
"integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"esbuild": "^0.20.1", "esbuild": "^0.20.1",
@@ -5406,9 +5349,9 @@
} }
}, },
"node_modules/vite-node": { "node_modules/vite-node": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz",
"integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"cac": "^6.7.14", "cac": "^6.7.14",
@@ -5442,16 +5385,16 @@
} }
}, },
"node_modules/vitest": { "node_modules/vitest": {
"version": "1.6.0", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz",
"integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/expect": "1.6.0", "@vitest/expect": "1.5.2",
"@vitest/runner": "1.6.0", "@vitest/runner": "1.5.2",
"@vitest/snapshot": "1.6.0", "@vitest/snapshot": "1.5.2",
"@vitest/spy": "1.6.0", "@vitest/spy": "1.5.2",
"@vitest/utils": "1.6.0", "@vitest/utils": "1.5.2",
"acorn-walk": "^8.3.2", "acorn-walk": "^8.3.2",
"chai": "^4.3.10", "chai": "^4.3.10",
"debug": "^4.3.4", "debug": "^4.3.4",
@@ -5465,7 +5408,7 @@
"tinybench": "^2.5.1", "tinybench": "^2.5.1",
"tinypool": "^0.8.3", "tinypool": "^0.8.3",
"vite": "^5.0.0", "vite": "^5.0.0",
"vite-node": "1.6.0", "vite-node": "1.5.2",
"why-is-node-running": "^2.2.2" "why-is-node-running": "^2.2.2"
}, },
"bin": { "bin": {
@@ -5480,8 +5423,8 @@
"peerDependencies": { "peerDependencies": {
"@edge-runtime/vm": "*", "@edge-runtime/vm": "*",
"@types/node": "^18.0.0 || >=20.0.0", "@types/node": "^18.0.0 || >=20.0.0",
"@vitest/browser": "1.6.0", "@vitest/browser": "1.5.2",
"@vitest/ui": "1.6.0", "@vitest/ui": "1.5.2",
"happy-dom": "*", "happy-dom": "*",
"jsdom": "*" "jsdom": "*"
}, },
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.105.1", "version": "1.103.1",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -33,8 +33,8 @@
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^53.0.0", "eslint-plugin-unicorn": "^52.0.0",
"exiftool-vendored": "^26.0.0", "exiftool-vendored": "^24.5.0",
"luxon": "^3.4.4", "luxon": "^3.4.4",
"pg": "^8.11.3", "pg": "^8.11.3",
"pngjs": "^7.0.0", "pngjs": "^7.0.0",
@@ -47,6 +47,6 @@
"vitest": "^1.3.0" "vitest": "^1.3.0"
}, },
"volta": { "volta": {
"node": "20.13.1" "node": "20.12.2"
} }
} }
+1 -2
View File
@@ -1,7 +1,6 @@
import { import {
ActivityCreateDto, ActivityCreateDto,
AlbumResponseDto, AlbumResponseDto,
AlbumUserRole,
AssetFileUploadResponseDto, AssetFileUploadResponseDto,
LoginResponseDto, LoginResponseDto,
ReactionType, ReactionType,
@@ -34,7 +33,7 @@ describe('/activity', () => {
createAlbumDto: { createAlbumDto: {
albumName: 'Album 1', albumName: 'Album 1',
assetIds: [asset.id], assetIds: [asset.id],
albumUsers: [{ userId: nonOwner.userId, role: AlbumUserRole.Editor }], sharedWithUserIds: [nonOwner.userId],
}, },
}, },
{ headers: asBearerAuth(admin.accessToken) }, { headers: asBearerAuth(admin.accessToken) },
+44 -53
View File
@@ -49,50 +49,72 @@ describe('/album', () => {
utils.createAsset(user1.accessToken), utils.createAsset(user1.accessToken),
]); ]);
user1Albums = await Promise.all([ const albums = await Promise.all([
// user 1
/* 0 */
utils.createAlbum(user1.accessToken, { utils.createAlbum(user1.accessToken, {
albumName: user1SharedEditorUser, albumName: user1SharedEditorUser,
albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Editor }], sharedWithUserIds: [user2.userId],
assetIds: [user1Asset1.id], assetIds: [user1Asset1.id],
}), }),
/* 1 */
utils.createAlbum(user1.accessToken, { utils.createAlbum(user1.accessToken, {
albumName: user1SharedLink, albumName: user1SharedLink,
assetIds: [user1Asset1.id], assetIds: [user1Asset1.id],
}), }),
/* 2 */
utils.createAlbum(user1.accessToken, { utils.createAlbum(user1.accessToken, {
albumName: user1NotShared, albumName: user1NotShared,
assetIds: [user1Asset1.id, user1Asset2.id], assetIds: [user1Asset1.id, user1Asset2.id],
}), }),
// user 2
/* 3 */
utils.createAlbum(user2.accessToken, {
albumName: user2SharedUser,
sharedWithUserIds: [user1.userId, user3.userId],
}),
/* 4 */
utils.createAlbum(user2.accessToken, { albumName: user2SharedLink }),
/* 5 */
utils.createAlbum(user2.accessToken, { albumName: user2NotShared }),
// user 3
/* 6 */
utils.createAlbum(user3.accessToken, {
albumName: 'Deleted',
sharedWithUserIds: [user1.userId],
}),
// user1 shared with an editor
/* 7 */
utils.createAlbum(user1.accessToken, { utils.createAlbum(user1.accessToken, {
albumName: user1SharedViewerUser, albumName: user1SharedViewerUser,
albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Viewer }], sharedWithUserIds: [user2.userId],
assetIds: [user1Asset1.id], assetIds: [user1Asset1.id],
}), }),
]); ]);
user2Albums = await Promise.all([ // Make viewer
utils.createAlbum(user2.accessToken, { await utils.updateAlbumUser(user1.accessToken, {
albumName: user2SharedUser, id: albums[7].id,
albumUsers: [ userId: user2.userId,
{ userId: user1.userId, role: AlbumUserRole.Editor }, updateAlbumUserDto: { role: AlbumUserRole.Viewer },
{ userId: user3.userId, role: AlbumUserRole.Editor },
],
}),
utils.createAlbum(user2.accessToken, { albumName: user2SharedLink }),
utils.createAlbum(user2.accessToken, { albumName: user2NotShared }),
]);
await utils.createAlbum(user3.accessToken, {
albumName: 'Deleted',
albumUsers: [{ userId: user1.userId, role: AlbumUserRole.Editor }],
}); });
albums[0].albumUsers[0].role = AlbumUserRole.Editor;
albums[3].albumUsers[0].role = AlbumUserRole.Editor;
albums[6].albumUsers[0].role = AlbumUserRole.Editor;
await addAssetsToAlbum( await addAssetsToAlbum(
{ id: user2Albums[0].id, bulkIdsDto: { ids: [user1Asset1.id] } }, { id: albums[3].id, bulkIdsDto: { ids: [user1Asset1.id] } },
{ headers: asBearerAuth(user1.accessToken) }, { headers: asBearerAuth(user1.accessToken) },
); );
user2Albums[0] = await getAlbumInfo({ id: user2Albums[0].id }, { headers: asBearerAuth(user2.accessToken) }); albums[3] = await getAlbumInfo({ id: albums[3].id }, { headers: asBearerAuth(user2.accessToken) });
user1Albums = [...albums.slice(0, 3), albums[7]];
user2Albums = albums.slice(3, 6);
await Promise.all([ await Promise.all([
// add shared link to user1SharedLink album // add shared link to user1SharedLink album
@@ -434,20 +456,6 @@ describe('/album', () => {
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Not found or no album.addAsset access')); expect(body).toEqual(errorDto.badRequest('Not found or no album.addAsset access'));
}); });
it('should add duplicate assets only once', async () => {
const asset = await utils.createAsset(user1.accessToken);
const { status, body } = await request(app)
.put(`/album/${user1Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [asset.id, asset.id] });
expect(status).toBe(200);
expect(body).toEqual([
expect.objectContaining({ id: asset.id, success: true }),
expect.objectContaining({ id: asset.id, success: false, error: 'duplicate' }),
]);
});
}); });
describe('PATCH /album/:id', () => { describe('PATCH /album/:id', () => {
@@ -571,19 +579,6 @@ describe('/album', () => {
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Not found or no album.removeAsset access')); expect(body).toEqual(errorDto.badRequest('Not found or no album.removeAsset access'));
}); });
it('should remove duplicate assets only once', async () => {
const { status, body } = await request(app)
.delete(`/album/${user1Albums[1].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [user1Asset1.id, user1Asset1.id] });
expect(status).toBe(200);
expect(body).toEqual([
expect.objectContaining({ id: user1Asset1.id, success: true }),
expect.objectContaining({ id: user1Asset1.id, success: false, error: 'not_found' }),
]);
});
}); });
describe('PUT :id/users', () => { describe('PUT :id/users', () => {
@@ -646,11 +641,9 @@ describe('/album', () => {
it('should allow the album owner to change the role of a shared user', async () => { it('should allow the album owner to change the role of a shared user', async () => {
const album = await utils.createAlbum(user1.accessToken, { const album = await utils.createAlbum(user1.accessToken, {
albumName: 'testAlbum', albumName: 'testAlbum',
albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Viewer }], sharedWithUserIds: [user2.userId],
}); });
expect(album.albumUsers[0].role).toEqual(AlbumUserRole.Viewer);
const { status } = await request(app) const { status } = await request(app)
.put(`/album/${album.id}/user/${user2.userId}`) .put(`/album/${album.id}/user/${user2.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`) .set('Authorization', `Bearer ${user1.accessToken}`)
@@ -670,11 +663,9 @@ describe('/album', () => {
it('should not allow a shared user to change the role of another shared user', async () => { it('should not allow a shared user to change the role of another shared user', async () => {
const album = await utils.createAlbum(user1.accessToken, { const album = await utils.createAlbum(user1.accessToken, {
albumName: 'testAlbum', albumName: 'testAlbum',
albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Viewer }], sharedWithUserIds: [user2.userId],
}); });
expect(album.albumUsers[0].role).toEqual(AlbumUserRole.Viewer);
const { status, body } = await request(app) const { status, body } = await request(app)
.put(`/album/${album.id}/user/${user2.userId}`) .put(`/album/${album.id}/user/${user2.userId}`)
.set('Authorization', `Bearer ${user2.accessToken}`) .set('Authorization', `Bearer ${user2.accessToken}`)
+21
View File
@@ -2,8 +2,10 @@ import {
AssetFileUploadResponseDto, AssetFileUploadResponseDto,
AssetResponseDto, AssetResponseDto,
AssetTypeEnum, AssetTypeEnum,
LibraryResponseDto,
LoginResponseDto, LoginResponseDto,
SharedLinkType, SharedLinkType,
getAllLibraries,
getAssetInfo, getAssetInfo,
updateAssets, updateAssets,
} from '@immich/sdk'; } from '@immich/sdk';
@@ -817,6 +819,25 @@ describe('/asset', () => {
expect(duplicate).toBe(true); expect(duplicate).toBe(true);
}); });
it("should not upload to another user's library", async () => {
const libraries = await getAllLibraries({}, { headers: asBearerAuth(admin.accessToken) });
const library = libraries.find((library) => library.ownerId === user1.userId) as LibraryResponseDto;
const { body, status } = await request(app)
.post('/asset/upload')
.set('Authorization', `Bearer ${admin.accessToken}`)
.field('libraryId', library.id)
.field('deviceAssetId', 'example-image')
.field('deviceId', 'e2e')
.field('fileCreatedAt', new Date().toISOString())
.field('fileModifiedAt', new Date().toISOString())
.field('duration', '0:00:00.000000')
.attach('assetData', makeRandomImage(), 'example.png');
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Not found or no asset.upload access'));
});
it('should update the used quota', async () => { it('should update the used quota', async () => {
const { body, status } = await request(app) const { body, status } = await request(app)
.post('/asset/upload') .post('/asset/upload')
+150 -8
View File
@@ -1,4 +1,11 @@
import { LibraryResponseDto, LoginResponseDto, ScanLibraryDto, getAllLibraries, scanLibrary } from '@immich/sdk'; import {
LibraryResponseDto,
LibraryType,
LoginResponseDto,
ScanLibraryDto,
getAllLibraries,
scanLibrary,
} from '@immich/sdk';
import { cpSync, existsSync } from 'node:fs'; import { cpSync, existsSync } from 'node:fs';
import { Socket } from 'socket.io-client'; import { Socket } from 'socket.io-client';
import { userDto, uuidDto } from 'src/fixtures'; import { userDto, uuidDto } from 'src/fixtures';
@@ -22,7 +29,7 @@ describe('/library', () => {
admin = await utils.adminSetup(); admin = await utils.adminSetup();
await utils.resetAdminConfig(admin.accessToken); await utils.resetAdminConfig(admin.accessToken);
user = await utils.userSetup(admin.accessToken, userDto.user1); user = await utils.userSetup(admin.accessToken, userDto.user1);
library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId }); library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId, type: LibraryType.External });
websocket = await utils.connectWebsocket(admin.accessToken); websocket = await utils.connectWebsocket(admin.accessToken);
utils.createImageFile(`${testAssetDir}/temp/directoryA/assetA.png`); utils.createImageFile(`${testAssetDir}/temp/directoryA/assetA.png`);
utils.createImageFile(`${testAssetDir}/temp/directoryB/assetB.png`); utils.createImageFile(`${testAssetDir}/temp/directoryB/assetB.png`);
@@ -43,6 +50,24 @@ describe('/library', () => {
expect(status).toBe(401); expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized); expect(body).toEqual(errorDto.unauthorized);
}); });
it('should start with a default upload library', async () => {
const { status, body } = await request(app).get('/library').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual(
expect.arrayContaining([
expect.objectContaining({
ownerId: admin.userId,
type: LibraryType.Upload,
name: 'Default Library',
refreshedAt: null,
assetCount: 0,
importPaths: [],
exclusionPatterns: [],
}),
]),
);
});
}); });
describe('POST /library', () => { describe('POST /library', () => {
@@ -56,7 +81,7 @@ describe('/library', () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.post('/library') .post('/library')
.set('Authorization', `Bearer ${user.accessToken}`) .set('Authorization', `Bearer ${user.accessToken}`)
.send({ ownerId: admin.userId }); .send({ ownerId: admin.userId, type: LibraryType.External });
expect(status).toBe(403); expect(status).toBe(403);
expect(body).toEqual(errorDto.forbidden); expect(body).toEqual(errorDto.forbidden);
@@ -66,12 +91,13 @@ describe('/library', () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.post('/library') .post('/library')
.set('Authorization', `Bearer ${admin.accessToken}`) .set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ownerId: admin.userId }); .send({ ownerId: admin.userId, type: LibraryType.External });
expect(status).toBe(201); expect(status).toBe(201);
expect(body).toEqual( expect(body).toEqual(
expect.objectContaining({ expect.objectContaining({
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
name: 'New External Library', name: 'New External Library',
refreshedAt: null, refreshedAt: null,
assetCount: 0, assetCount: 0,
@@ -87,6 +113,7 @@ describe('/library', () => {
.set('Authorization', `Bearer ${admin.accessToken}`) .set('Authorization', `Bearer ${admin.accessToken}`)
.send({ .send({
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
name: 'My Awesome Library', name: 'My Awesome Library',
importPaths: ['/path/to/import'], importPaths: ['/path/to/import'],
exclusionPatterns: ['**/Raw/**'], exclusionPatterns: ['**/Raw/**'],
@@ -107,6 +134,7 @@ describe('/library', () => {
.set('Authorization', `Bearer ${admin.accessToken}`) .set('Authorization', `Bearer ${admin.accessToken}`)
.send({ .send({
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
name: 'My Awesome Library', name: 'My Awesome Library',
importPaths: ['/path', '/path'], importPaths: ['/path', '/path'],
exclusionPatterns: ['**/Raw/**'], exclusionPatterns: ['**/Raw/**'],
@@ -122,6 +150,7 @@ describe('/library', () => {
.set('Authorization', `Bearer ${admin.accessToken}`) .set('Authorization', `Bearer ${admin.accessToken}`)
.send({ .send({
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
name: 'My Awesome Library', name: 'My Awesome Library',
importPaths: ['/path/to/import'], importPaths: ['/path/to/import'],
exclusionPatterns: ['**/Raw/**', '**/Raw/**'], exclusionPatterns: ['**/Raw/**', '**/Raw/**'],
@@ -130,6 +159,60 @@ describe('/library', () => {
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(["All exclusionPatterns's elements must be unique"])); expect(body).toEqual(errorDto.badRequest(["All exclusionPatterns's elements must be unique"]));
}); });
it('should create an upload library with defaults', async () => {
const { status, body } = await request(app)
.post('/library')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ownerId: admin.userId, type: LibraryType.Upload });
expect(status).toBe(201);
expect(body).toEqual(
expect.objectContaining({
ownerId: admin.userId,
type: LibraryType.Upload,
name: 'New Upload Library',
refreshedAt: null,
assetCount: 0,
importPaths: [],
exclusionPatterns: [],
}),
);
});
it('should create an upload library with options', async () => {
const { status, body } = await request(app)
.post('/library')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ownerId: admin.userId, type: LibraryType.Upload, name: 'My Awesome Library' });
expect(status).toBe(201);
expect(body).toEqual(
expect.objectContaining({
name: 'My Awesome Library',
}),
);
});
it('should not allow upload libraries to have import paths', async () => {
const { status, body } = await request(app)
.post('/library')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ownerId: admin.userId, type: LibraryType.Upload, importPaths: ['/path/to/import'] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Upload libraries cannot have import paths'));
});
it('should not allow upload libraries to have exclusion patterns', async () => {
const { status, body } = await request(app)
.post('/library')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ownerId: admin.userId, type: LibraryType.Upload, exclusionPatterns: ['**/Raw/**'] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Upload libraries cannot have exclusion patterns'));
});
}); });
describe('PUT /library/:id', () => { describe('PUT /library/:id', () => {
@@ -249,7 +332,10 @@ describe('/library', () => {
}); });
it('should get library by id', async () => { it('should get library by id', async () => {
const library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId }); const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
type: LibraryType.External,
});
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/library/${library.id}`) .get(`/library/${library.id}`)
@@ -259,6 +345,7 @@ describe('/library', () => {
expect(body).toEqual( expect(body).toEqual(
expect.objectContaining({ expect.objectContaining({
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
name: 'New External Library', name: 'New External Library',
refreshedAt: null, refreshedAt: null,
assetCount: 0, assetCount: 0,
@@ -286,9 +373,24 @@ describe('/library', () => {
expect(body).toEqual(errorDto.unauthorized); expect(body).toEqual(errorDto.unauthorized);
}); });
it('should not scan an upload library', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
type: LibraryType.Upload,
});
const { status, body } = await request(app)
.post(`/library/${library.id}/scan`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Can only refresh external libraries'));
});
it('should scan external library', async () => { it('should scan external library', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp/directoryA`], importPaths: [`${testAssetDirInternal}/temp/directoryA`],
}); });
@@ -304,6 +406,7 @@ describe('/library', () => {
it('should scan external library with exclusion pattern', async () => { it('should scan external library with exclusion pattern', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
exclusionPatterns: ['**/directoryA'], exclusionPatterns: ['**/directoryA'],
}); });
@@ -320,6 +423,7 @@ describe('/library', () => {
it('should scan multiple import paths', async () => { it('should scan multiple import paths', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp/directoryA`, `${testAssetDirInternal}/temp/directoryB`], importPaths: [`${testAssetDirInternal}/temp/directoryA`, `${testAssetDirInternal}/temp/directoryB`],
}); });
@@ -336,6 +440,7 @@ describe('/library', () => {
it('should pick up new files', async () => { it('should pick up new files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -361,6 +466,7 @@ describe('/library', () => {
utils.createImageFile(`${testAssetDir}/temp/directoryA/assetB.png`); utils.createImageFile(`${testAssetDir}/temp/directoryA/assetB.png`);
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -387,6 +493,7 @@ describe('/library', () => {
it('should scan new files', async () => { it('should scan new files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -414,6 +521,7 @@ describe('/library', () => {
it('should reimport modified files', async () => { it('should reimport modified files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -441,6 +549,7 @@ describe('/library', () => {
it('should not reimport unmodified files', async () => { it('should not reimport unmodified files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -470,6 +579,7 @@ describe('/library', () => {
it('should reimport all files', async () => { it('should reimport all files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -507,6 +617,7 @@ describe('/library', () => {
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,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -547,6 +658,7 @@ describe('/library', () => {
it('should not remove online files', async () => { it('should not remove online files', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -625,8 +737,37 @@ describe('/library', () => {
expect(body).toEqual(errorDto.unauthorized); expect(body).toEqual(errorDto.unauthorized);
}); });
it('should not delete the last upload library', async () => {
const libraries = await getAllLibraries(
{ $type: LibraryType.Upload },
{ headers: asBearerAuth(admin.accessToken) },
);
const adminLibraries = libraries.filter((library) => library.ownerId === admin.userId);
expect(adminLibraries.length).toBeGreaterThanOrEqual(1);
const lastLibrary = adminLibraries.pop() as LibraryResponseDto;
// delete all but the last upload library
for (const library of adminLibraries) {
const { status } = await request(app)
.delete(`/library/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204);
}
const { status, body } = await request(app)
.delete(`/library/${lastLibrary.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual(errorDto.noDeleteUploadLibrary);
expect(status).toBe(400);
});
it('should delete an external library', async () => { it('should delete an external library', async () => {
const library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId }); const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
type: LibraryType.External,
});
const { status, body } = await request(app) const { status, body } = await request(app)
.delete(`/library/${library.id}`) .delete(`/library/${library.id}`)
@@ -635,7 +776,7 @@ describe('/library', () => {
expect(status).toBe(204); expect(status).toBe(204);
expect(body).toEqual({}); expect(body).toEqual({});
const libraries = await getAllLibraries({ headers: asBearerAuth(admin.accessToken) }); const libraries = await getAllLibraries({}, { headers: asBearerAuth(admin.accessToken) });
expect(libraries).not.toEqual( expect(libraries).not.toEqual(
expect.arrayContaining([ expect.arrayContaining([
expect.objectContaining({ expect.objectContaining({
@@ -648,6 +789,7 @@ describe('/library', () => {
it('should delete an external library with assets', async () => { it('should delete an external library with assets', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
type: LibraryType.External,
importPaths: [`${testAssetDirInternal}/temp`], importPaths: [`${testAssetDirInternal}/temp`],
}); });
@@ -661,7 +803,7 @@ describe('/library', () => {
expect(status).toBe(204); expect(status).toBe(204);
expect(body).toEqual({}); expect(body).toEqual({});
const libraries = await getAllLibraries({ headers: asBearerAuth(admin.accessToken) }); const libraries = await getAllLibraries({}, { headers: asBearerAuth(admin.accessToken) });
expect(libraries).not.toEqual( expect(libraries).not.toEqual(
expect.arrayContaining([ expect.arrayContaining([
expect.objectContaining({ expect.objectContaining({
@@ -66,7 +66,6 @@ describe('/server-info', () => {
expect(body).toEqual({ expect(body).toEqual({
smartSearch: false, smartSearch: false,
configFile: false, configFile: false,
duplicateDetection: false,
facialRecognition: false, facialRecognition: false,
map: true, map: true,
reverseGeocoding: true, reverseGeocoding: true,
@@ -86,26 +86,6 @@ describe('/system-config', () => {
expect(body).toEqual(errorDto.unauthorized); expect(body).toEqual(errorDto.unauthorized);
}); });
it('should always return the new config', async () => {
const config = await getSystemConfig(admin.accessToken);
const response1 = await request(app)
.put('/system-config')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ...config, newVersionCheck: { enabled: false } });
expect(response1.status).toBe(200);
expect(response1.body).toEqual({ ...config, newVersionCheck: { enabled: false } });
const response2 = await request(app)
.put('/system-config')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ...config, newVersionCheck: { enabled: true } });
expect(response2.status).toBe(200);
expect(response2.body).toEqual({ ...config, newVersionCheck: { enabled: true } });
});
it('should reject an invalid config entry', async () => { it('should reject an invalid config entry', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.put('/system-config') .put('/system-config')
+6 -5
View File
@@ -32,7 +32,8 @@ describe('/trash', () => {
await utils.deleteAssets(admin.accessToken, [assetId]); await utils.deleteAssets(admin.accessToken, [assetId]);
const before = await getAllAssets({}, { headers: asBearerAuth(admin.accessToken) }); const before = await getAllAssets({}, { headers: asBearerAuth(admin.accessToken) });
expect(before).toStrictEqual([expect.objectContaining({ id: assetId, isTrashed: true })]);
expect(before.length).toBeGreaterThanOrEqual(1);
const { status } = await request(app).post('/trash/empty').set('Authorization', `Bearer ${admin.accessToken}`); const { status } = await request(app).post('/trash/empty').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204); expect(status).toBe(204);
@@ -56,14 +57,14 @@ describe('/trash', () => {
const { id: assetId } = await utils.createAsset(admin.accessToken); const { id: assetId } = await utils.createAsset(admin.accessToken);
await utils.deleteAssets(admin.accessToken, [assetId]); await utils.deleteAssets(admin.accessToken, [assetId]);
const before = await getAllAssets({}, { headers: asBearerAuth(admin.accessToken) }); const before = await utils.getAssetInfo(admin.accessToken, assetId);
expect(before).toStrictEqual([expect.objectContaining({ id: assetId, isTrashed: true })]); expect(before.isTrashed).toBe(true);
const { status } = await request(app).post('/trash/restore').set('Authorization', `Bearer ${admin.accessToken}`); const { status } = await request(app).post('/trash/restore').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204); expect(status).toBe(204);
const after = await getAllAssets({}, { headers: asBearerAuth(admin.accessToken) }); const after = await utils.getAssetInfo(admin.accessToken, assetId);
expect(after).toStrictEqual([expect.objectContaining({ id: assetId, isTrashed: false })]); expect(after.isTrashed).toBe(false);
}); });
}); });
+5
View File
@@ -51,6 +51,11 @@ export const errorDto = {
statusCode: 400, statusCode: 400,
message: 'The server already has an admin', message: 'The server already has an admin',
}, },
noDeleteUploadLibrary: {
error: 'Bad Request',
statusCode: 400,
message: 'Cannot delete the last upload library',
},
}; };
export const signupResponseDto = { export const signupResponseDto = {
+1 -1
View File
@@ -17,7 +17,7 @@ const setup = async () => {
child.stdout.on('data', (data) => { child.stdout.on('data', (data) => {
const input = data.toString(); const input = data.toString();
console.log(input); console.log(input);
if (input.includes('Immich Microservices is running')) { if (input.includes('Immich Microservices is listening')) {
_resolve(); _resolve();
} }
}); });
+7 -6
View File
@@ -16,6 +16,7 @@ import {
createPerson, createPerson,
createSharedLink, createSharedLink,
createUser, createUser,
defaults,
deleteAssets, deleteAssets,
getAllAssets, getAllAssets,
getAllJobsStatus, getAllJobsStatus,
@@ -23,7 +24,6 @@ import {
getConfigDefaults, getConfigDefaults,
login, login,
searchMetadata, searchMetadata,
setBaseUrl,
signUpAdmin, signUpAdmin,
updateAdminOnboarding, updateAdminOnboarding,
updateAlbumUser, updateAlbumUser,
@@ -56,8 +56,8 @@ const baseUrl = 'http://127.0.0.1:2283';
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
export const testAssetDir = path.resolve('./test-assets'); export const testAssetDir = path.resolve(`./../server/test/assets/`);
export const testAssetDirInternal = '/test-assets'; export const testAssetDirInternal = '/data/assets';
export const tempDir = tmpdir(); export const tempDir = tmpdir();
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` }); export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
export const asKeyAuth = (key: string) => ({ 'x-api-key': key }); export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
@@ -145,6 +145,7 @@ export const utils = {
'sessions', 'sessions',
'users', 'users',
'system_metadata', 'system_metadata',
'system_config',
]; ];
const sql: string[] = []; const sql: string[] = [];
@@ -255,8 +256,8 @@ export const utils = {
}); });
}, },
initSdk: () => { setApiEndpoint: () => {
setBaseUrl(app); defaults.baseUrl = app;
}, },
adminSetup: async (options?: AdminSetupOptions) => { adminSetup: async (options?: AdminSetupOptions) => {
@@ -462,7 +463,7 @@ export const utils = {
}, },
}; };
utils.initSdk(); utils.setApiEndpoint();
if (!existsSync(`${testAssetDir}/albums`)) { if (!existsSync(`${testAssetDir}/albums`)) {
throw new Error( throw new Error(
+1 -1
View File
@@ -3,7 +3,7 @@ import { utils } from 'src/utils';
test.describe('Registration', () => { test.describe('Registration', () => {
test.beforeAll(() => { test.beforeAll(() => {
utils.initSdk(); utils.setApiEndpoint();
}); });
test.beforeEach(async () => { test.beforeEach(async () => {
+1 -1
View File
@@ -17,7 +17,7 @@ test.describe('Shared Links', () => {
let sharedLinkPassword: SharedLinkResponseDto; let sharedLinkPassword: SharedLinkResponseDto;
test.beforeAll(async () => { test.beforeAll(async () => {
utils.initSdk(); utils.setApiEndpoint();
await utils.resetDatabase(); await utils.resetDatabase();
admin = await utils.adminSetup(); admin = await utils.adminSetup();
asset = await utils.createAsset(admin.accessToken); asset = await utils.createAsset(admin.accessToken);
+8 -33
View File
@@ -2,15 +2,14 @@
set -o nounset set -o nounset
set -o pipefail set -o pipefail
create_immich_directory() { create_immich_directory() { local -r Tgt='./immich-app'
local -r Tgt='./immich-app'
echo "Creating Immich directory..." echo "Creating Immich directory..."
if [[ -e $Tgt ]]; then if [[ -e $Tgt ]]; then
echo "Found existing directory $Tgt, will overwrite YAML files" echo "Found existing directory $Tgt, will overwrite YAML files"
else else
mkdir "$Tgt" || return mkdir "$Tgt" || return
fi fi
cd "$Tgt" || return 1 cd "$Tgt" || return
} }
download_docker_compose_file() { download_docker_compose_file() {
@@ -23,16 +22,6 @@ download_dot_env_file() {
"${Curl[@]}" "$RepoUrl"/example.env -o ./.env "${Curl[@]}" "$RepoUrl"/example.env -o ./.env
} }
generate_random_password() {
echo "Generate random password for .env file..."
rand_pass=$(echo "$RANDOM$(date)$RANDOM" | sha256sum | base64 | head -c10)
if [ -z "$rand_pass" ]; then
sed -i -e "s/DB_PASSWORD=postgres/DB_PASSWORD=postgres${RANDOM}${RANDOM}/" ./.env
else
sed -i -e "s/DB_PASSWORD=postgres/DB_PASSWORD=${rand_pass}/" ./.env
fi
}
start_docker_compose() { start_docker_compose() {
echo "Starting Immich's docker containers" echo "Starting Immich's docker containers"
@@ -51,7 +40,7 @@ start_docker_compose() {
show_friendly_message() { show_friendly_message() {
local ip_address local ip_address
ip_address=$(hostname -I | awk '{print $1}') ip_address=$(hostname -I | awk '{print $1}')
cat <<EOF cat << EOF
Successfully deployed Immich! Successfully deployed Immich!
You can access the website at http://$ip_address:2283 and the server URL for the mobile app is http://$ip_address:2283/api You can access the website at http://$ip_address:2283 and the server URL for the mobile app is http://$ip_address:2283/api
--------------------------------------------------- ---------------------------------------------------
@@ -77,25 +66,11 @@ main() {
return 14 return 14
fi fi
create_immich_directory || { create_immich_directory || { echo 'error creating Immich directory'; return 10; }
echo 'error creating Immich directory' download_docker_compose_file || { echo 'error downloading Docker Compose file'; return 11; }
return 10 download_dot_env_file || { echo 'error downloading .env'; return 12; }
} start_docker_compose || { echo 'error starting Docker'; return 13; }
download_docker_compose_file || { return 0; }
echo 'error downloading Docker Compose file'
return 11
}
download_dot_env_file || {
echo 'error downloading .env'
return 12
}
generate_random_password
start_docker_compose || {
echo 'error starting Docker'
return 13
}
return 0
}
main main
Exit=$? Exit=$?
-2
View File
@@ -30,8 +30,6 @@ download:
locale_code: pl-PL locale_code: pl-PL
- file: mobile/assets/i18n/fi-FI.json - file: mobile/assets/i18n/fi-FI.json
locale_code: fi-FI locale_code: fi-FI
- file: mobile/assets/i18n/pt-BR.json
locale_code: pt-BR
- file: mobile/assets/i18n/pt-PT.json - file: mobile/assets/i18n/pt-PT.json
locale_code: pt-PT locale_code: pt-PT
- file: mobile/assets/i18n/pt-BR.json - file: mobile/assets/i18n/pt-BR.json
+4 -6
View File
@@ -1,6 +1,6 @@
ARG DEVICE=cpu ARG DEVICE=cpu
FROM python:3.11-bookworm@sha256:96de1ea4821d73fd2c1853d1fdc3cf794ccfe2fae4c3f08579e846de51760a61 as builder-cpu FROM python:3.11-bookworm@sha256:adc02660aaaa7e7b482a2689237c5fa88d5b2218aebfa003f6af8fa7c8113378 as builder-cpu
FROM openvino/ubuntu22_runtime:2023.3.0@sha256:176646df619032ea6c10faf842867119c393e7497b7f88b5e307e932a0fd5aa8 as builder-openvino FROM openvino/ubuntu22_runtime:2023.3.0@sha256:176646df619032ea6c10faf842867119c393e7497b7f88b5e307e932a0fd5aa8 as builder-openvino
USER root USER root
@@ -36,13 +36,10 @@ 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:fc39d2e68b554c3f0a5cb8a776280c0b3d73b4c04b83dbade835e2a171ca27ef as prod-cpu FROM python:3.11-slim-bookworm@sha256:6d2502238109c929569ae99355e28890c438cb11bc88ef02cd189c173b3db07c as prod-cpu
FROM openvino/ubuntu22_runtime:2023.3.0@sha256:176646df619032ea6c10faf842867119c393e7497b7f88b5e307e932a0fd5aa8 as prod-openvino FROM openvino/ubuntu22_runtime:2023.3.0@sha256:176646df619032ea6c10faf842867119c393e7497b7f88b5e307e932a0fd5aa8 as prod-openvino
USER root USER root
# TODO: remove this once the image has the fix for https://github.com/intel/compute-runtime/issues/710
ENV NEOReadDebugKeys=1 \
OverrideGpuAddressSpace=48
FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04@sha256:2d913b09e6be8387e1a10976933642c73c840c0b735f0bf3c28d97fc9bc422e0 as prod-cuda FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04@sha256:2d913b09e6be8387e1a10976933642c73c840c0b735f0bf3c28d97fc9bc422e0 as prod-cuda
@@ -77,7 +74,8 @@ RUN apt-get update && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src/app WORKDIR /usr/src/app
ENV TRANSFORMERS_CACHE=/cache \ ENV NODE_ENV=production \
TRANSFORMERS_CACHE=/cache \
PYTHONDONTWRITEBYTECODE=1 \ PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \ PYTHONUNBUFFERED=1 \
PATH="/opt/venv/bin:$PATH" \ PATH="/opt/venv/bin:$PATH" \
+2 -2
View File
@@ -41,7 +41,7 @@ class Settings(BaseSettings):
class LogSettings(BaseSettings): class LogSettings(BaseSettings):
immich_log_level: str = "info" log_level: str = "info"
no_color: bool = False no_color: bool = False
class Config: class Config:
@@ -77,7 +77,7 @@ LOG_LEVELS: dict[str, int] = {
settings = Settings() settings = Settings()
log_settings = LogSettings() log_settings = LogSettings()
LOG_LEVEL = LOG_LEVELS.get(log_settings.immich_log_level.lower(), logging.INFO) LOG_LEVEL = LOG_LEVELS.get(log_settings.log_level.lower(), logging.INFO)
class CustomRichHandler(RichHandler): class CustomRichHandler(RichHandler):
+3 -2
View File
@@ -1,6 +1,7 @@
FROM mambaorg/micromamba:bookworm-slim@sha256:d5b82811074b396275ef69aadbf31098257dd8836e231371e9cdb393128e571c as builder FROM mambaorg/micromamba:bookworm-slim@sha256:f4c5c3c7c1d58556b32cdc09d1d8e721d8ee42cdbdf1d963ddafca1db9a0a57e as builder
ENV TRANSFORMERS_CACHE=/cache \ ENV NODE_ENV=production \
TRANSFORMERS_CACHE=/cache \
PYTHONDONTWRITEBYTECODE=1 \ PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \ PYTHONUNBUFFERED=1 \
PATH="/opt/venv/bin:$PATH" \ PATH="/opt/venv/bin:$PATH" \
+116 -101
View File
@@ -679,14 +679,14 @@ files = [
test = ["pytest (>=6)"] test = ["pytest (>=6)"]
[[package]] [[package]]
name = "fastapi-slim" name = "fastapi"
version = "0.111.0" version = "0.110.3"
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.111.0-py3-none-any.whl", hash = "sha256:6e4b04a555496e5a2590031fcae3ef8e364ad4901b340033e2e1d8136471aca2"}, {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"},
{file = "fastapi_slim-0.111.0.tar.gz", hash = "sha256:100720e4362ec4de97dee83a579b970e79fb5bf48073b37c9ce9b0e63dda4bec"}, {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"},
] ]
[package.dependencies] [package.dependencies]
@@ -695,8 +695,7 @@ starlette = ">=0.37.2,<0.38.0"
typing-extensions = ">=4.8.0" typing-extensions = ">=4.8.0"
[package.extras] [package.extras]
all = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
standard = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.7)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
[[package]] [[package]]
name = "filelock" name = "filelock"
@@ -738,13 +737,13 @@ dotenv = ["python-dotenv"]
[[package]] [[package]]
name = "flask-cors" name = "flask-cors"
version = "4.0.1" version = "4.0.0"
description = "A Flask extension adding a decorator for CORS support" description = "A Flask extension adding a decorator for CORS support"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "Flask_Cors-4.0.1-py2.py3-none-any.whl", hash = "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677"}, {file = "Flask-Cors-4.0.0.tar.gz", hash = "sha256:f268522fcb2f73e2ecdde1ef45e2fd5c71cc48fe03cffb4b441c6d1b40684eb0"},
{file = "flask_cors-4.0.1.tar.gz", hash = "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4"}, {file = "Flask_Cors-4.0.0-py2.py3-none-any.whl", hash = "sha256:bc3492bfd6368d27cfe79c7821df5a8a319e1a6d5eab277a3794be19bdc51783"},
] ]
[package.dependencies] [package.dependencies]
@@ -1236,13 +1235,13 @@ socks = ["socksio (==1.*)"]
[[package]] [[package]]
name = "huggingface-hub" name = "huggingface-hub"
version = "0.23.0" version = "0.22.2"
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.23.0-py3-none-any.whl", hash = "sha256:075c30d48ee7db2bba779190dc526d2c11d422aed6f9044c5e2fdc2c432fdb91"}, {file = "huggingface_hub-0.22.2-py3-none-any.whl", hash = "sha256:3429e25f38ccb834d310804a3b711e7e4953db5a9e420cc147a5e194ca90fd17"},
{file = "huggingface_hub-0.23.0.tar.gz", hash = "sha256:7126dedd10a4c6fac796ced4d87a8cf004efc722a5125c2c09299017fa366fa9"}, {file = "huggingface_hub-0.22.2.tar.gz", hash = "sha256:32e9a9a6843c92f253ff9ca16b9985def4d80a93fb357af5353f770ef74a81be"},
] ]
[package.dependencies] [package.dependencies]
@@ -1255,16 +1254,16 @@ tqdm = ">=4.42.1"
typing-extensions = ">=3.7.4.3" typing-extensions = ">=3.7.4.3"
[package.extras] [package.extras]
all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
cli = ["InquirerPy (==0.3.4)"] cli = ["InquirerPy (==0.3.4)"]
dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
hf-transfer = ["hf-transfer (>=0.1.4)"] hf-transfer = ["hf-transfer (>=0.1.4)"]
inference = ["aiohttp", "minijinja (>=1.0)"] inference = ["aiohttp", "minijinja (>=1.0)"]
quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"]
tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow = ["graphviz", "pydot", "tensorflow"]
tensorflow-testing = ["keras (<3.0)", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"]
testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
torch = ["safetensors", "torch"] torch = ["safetensors", "torch"]
typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
@@ -1374,13 +1373,13 @@ files = [
[[package]] [[package]]
name = "jinja2" name = "jinja2"
version = "3.1.4" version = "3.1.3"
description = "A very fast and expressive template engine." description = "A very fast and expressive template engine."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"},
{file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"},
] ]
[package.dependencies] [package.dependencies]
@@ -1530,13 +1529,13 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"]
[[package]] [[package]]
name = "locust" name = "locust"
version = "2.27.0" version = "2.26.0"
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.27.0-py3-none-any.whl", hash = "sha256:c4db5747eb9a3851216deae8147143d335db41978a9291ac32e113fa9ec8ad39"}, {file = "locust-2.26.0-py3-none-any.whl", hash = "sha256:7957d8346e5830ba35e3a7a9c1eebe0fb73b0be117e54213c61ef3bc658a1ae6"},
{file = "locust-2.27.0.tar.gz", hash = "sha256:0c6d3d2523976dafe734012c41b2f7d9ad7120cbcea76d47d80cec5d6d139905"}, {file = "locust-2.26.0.tar.gz", hash = "sha256:a5cb4c96b8fa1ae5c20876ab8ca9d1e980d56148ed3c187df610cc2546705bff"},
] ]
[package.dependencies] [package.dependencies]
@@ -1551,6 +1550,7 @@ psutil = ">=5.9.1"
pywin32 = {version = "*", markers = "platform_system == \"Windows\""} pywin32 = {version = "*", markers = "platform_system == \"Windows\""}
pyzmq = ">=25.0.0" pyzmq = ">=25.0.0"
requests = ">=2.26.0" requests = ">=2.26.0"
roundrobin = ">=0.0.2"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
Werkzeug = ">=2.0.0" Werkzeug = ">=2.0.0"
@@ -2077,57 +2077,62 @@ numpy = [
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.10.3" version = "3.10.1"
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.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, {file = "orjson-3.10.1-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8ec2fc456d53ea4a47768f622bb709be68acd455b0c6be57e91462259741c4f3"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e900863691d327758be14e2a491931605bd0aded3a21beb6ce133889830b659"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab6ecbd6fe57785ebc86ee49e183f37d45f91b46fc601380c67c5c5e9c0014a2"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af7c68b01b876335cccfb4eee0beef2b5b6eae1945d46a09a7c24c9faac7a77"},
{file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:915abfb2e528677b488a06eba173e9d7706a20fdfe9cdb15890b74ef9791b85e"},
{file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, {file = "orjson-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe3fd4a36eff9c63d25503b439531d21828da9def0059c4f472e3845a081aa0b"},
{file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, {file = "orjson-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d229564e72cfc062e6481a91977a5165c5a0fdce11ddc19ced8471847a67c517"},
{file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, {file = "orjson-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9e00495b18304173ac843b5c5fbea7b6f7968564d0d49bef06bfaeca4b656f4e"},
{file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, {file = "orjson-3.10.1-cp310-none-win32.whl", hash = "sha256:fd78ec55179545c108174ba19c1795ced548d6cac4d80d014163033c047ca4ea"},
{file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, {file = "orjson-3.10.1-cp310-none-win_amd64.whl", hash = "sha256:50ca42b40d5a442a9e22eece8cf42ba3d7cd4cd0f2f20184b4d7682894f05eec"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, {file = "orjson-3.10.1-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b345a3d6953628df2f42502297f6c1e1b475cfbf6268013c94c5ac80e8abc04c"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caa7395ef51af4190d2c70a364e2f42138e0e5fcb4bc08bc9b76997659b27dab"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b01d701decd75ae092e5f36f7b88a1e7a1d3bb7c9b9d7694de850fb155578d5a"},
{file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5028981ba393f443d8fed9049211b979cadc9d0afecf162832f5a5b152c6297"},
{file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31ff6a222ea362b87bf21ff619598a4dc1106aaafaea32b1c4876d692891ec27"},
{file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, {file = "orjson-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e852a83d7803d3406135fb7a57cf0c1e4a3e73bac80ec621bd32f01c653849c5"},
{file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, {file = "orjson-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2567bc928ed3c3fcd90998009e8835de7c7dc59aabcf764b8374d36044864f3b"},
{file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, {file = "orjson-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4ce98cac60b7bb56457bdd2ed7f0d5d7f242d291fdc0ca566c83fa721b52e92d"},
{file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, {file = "orjson-3.10.1-cp311-none-win32.whl", hash = "sha256:813905e111318acb356bb8029014c77b4c647f8b03f314e7b475bd9ce6d1a8ce"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, {file = "orjson-3.10.1-cp311-none-win_amd64.whl", hash = "sha256:03a3ca0b3ed52bed1a869163a4284e8a7b0be6a0359d521e467cdef7e8e8a3ee"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, {file = "orjson-3.10.1-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f02c06cee680b1b3a8727ec26c36f4b3c0c9e2b26339d64471034d16f74f4ef5"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1aa2f127ac546e123283e437cc90b5ecce754a22306c7700b11035dad4ccf85"},
{file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2cf29b4b74f585225196944dffdebd549ad2af6da9e80db7115984103fb18a96"},
{file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1b130c20b116f413caf6059c651ad32215c28500dce9cd029a334a2d84aa66f"},
{file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d31f9a709e6114492136e87c7c6da5e21dfedebefa03af85f3ad72656c493ae9"},
{file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, {file = "orjson-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d1d169461726f271ab31633cf0e7e7353417e16fb69256a4f8ecb3246a78d6e"},
{file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, {file = "orjson-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57c294d73825c6b7f30d11c9e5900cfec9a814893af7f14efbe06b8d0f25fba9"},
{file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, {file = "orjson-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7f11dbacfa9265ec76b4019efffabaabba7a7ebf14078f6b4df9b51c3c9a8ea"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, {file = "orjson-3.10.1-cp312-none-win32.whl", hash = "sha256:d89e5ed68593226c31c76ab4de3e0d35c760bfd3fbf0a74c4b2be1383a1bf123"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, {file = "orjson-3.10.1-cp312-none-win_amd64.whl", hash = "sha256:aa76c4fe147fd162107ce1692c39f7189180cfd3a27cfbc2ab5643422812da8e"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, {file = "orjson-3.10.1-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a2c6a85c92d0e494c1ae117befc93cf8e7bca2075f7fe52e32698da650b2c6d1"},
{file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9813f43da955197d36a7365eb99bed42b83680801729ab2487fef305b9ced866"},
{file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec917b768e2b34b7084cb6c68941f6de5812cc26c6f1a9fecb728e36a3deb9e8"},
{file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5252146b3172d75c8a6d27ebca59c9ee066ffc5a277050ccec24821e68742fdf"},
{file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:536429bb02791a199d976118b95014ad66f74c58b7644d21061c54ad284e00f4"},
{file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, {file = "orjson-3.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dfed3c3e9b9199fb9c3355b9c7e4649b65f639e50ddf50efdf86b45c6de04b5"},
{file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, {file = "orjson-3.10.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2b230ec35f188f003f5b543644ae486b2998f6afa74ee3a98fc8ed2e45960afc"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, {file = "orjson-3.10.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:01234249ba19c6ab1eb0b8be89f13ea21218b2d72d496ef085cfd37e1bae9dd8"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, {file = "orjson-3.10.1-cp38-none-win32.whl", hash = "sha256:8a884fbf81a3cc22d264ba780920d4885442144e6acaa1411921260416ac9a54"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, {file = "orjson-3.10.1-cp38-none-win_amd64.whl", hash = "sha256:dab5f802d52b182163f307d2b1f727d30b1762e1923c64c9c56dd853f9671a49"},
{file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, {file = "orjson-3.10.1-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a51fd55d4486bc5293b7a400f9acd55a2dc3b5fc8420d5ffe9b1d6bb1a056a5e"},
{file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53521542a6db1411b3bfa1b24ddce18605a3abdc95a28a67b33f9145f26aa8f2"},
{file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:27d610df96ac18ace4931411d489637d20ab3b8f63562b0531bba16011998db0"},
{file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79244b1456e5846d44e9846534bd9e3206712936d026ea8e6a55a7374d2c0694"},
{file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d751efaa8a49ae15cbebdda747a62a9ae521126e396fda8143858419f3b03610"},
{file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, {file = "orjson-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27ff69c620a4fff33267df70cfd21e0097c2a14216e72943bd5414943e376d77"},
{file = "orjson-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ebc58693464146506fde0c4eb1216ff6d4e40213e61f7d40e2f0dde9b2f21650"},
{file = "orjson-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5be608c3972ed902e0143a5b8776d81ac1059436915d42defe5c6ae97b3137a4"},
{file = "orjson-3.10.1-cp39-none-win32.whl", hash = "sha256:4ae10753e7511d359405aadcbf96556c86e9dbf3a948d26c2c9f9a150c52b091"},
{file = "orjson-3.10.1-cp39-none-win_amd64.whl", hash = "sha256:fb5bc4caa2c192077fdb02dce4e5ef8639e7f20bec4e3a834346693907362932"},
{file = "orjson-3.10.1.tar.gz", hash = "sha256:a883b28d73370df23ed995c466b4f6c708c1f7a9bdc400fe89165c96c7603204"},
] ]
[[package]] [[package]]
@@ -2255,13 +2260,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co
[[package]] [[package]]
name = "pluggy" name = "pluggy"
version = "1.5.0" version = "1.4.0"
description = "plugin and hook calling mechanisms for python" description = "plugin and hook calling mechanisms for python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"},
{file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"},
] ]
[package.extras] [package.extras]
@@ -2438,13 +2443,13 @@ files = [
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "8.2.0" version = "8.1.1"
description = "pytest: simple powerful testing with Python" description = "pytest: simple powerful testing with Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"},
{file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"},
] ]
[package.dependencies] [package.dependencies]
@@ -2452,11 +2457,11 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""}
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*" iniconfig = "*"
packaging = "*" packaging = "*"
pluggy = ">=1.5,<2.0" pluggy = ">=1.4,<2.0"
tomli = {version = ">=1", markers = "python_version < \"3.11\""} tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras] [package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
@@ -2797,30 +2802,40 @@ pygments = ">=2.13.0,<3.0.0"
[package.extras] [package.extras]
jupyter = ["ipywidgets (>=7.5.1,<9)"] jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]]
name = "roundrobin"
version = "0.0.4"
description = "Collection of roundrobin utilities"
optional = false
python-versions = "*"
files = [
{file = "roundrobin-0.0.4.tar.gz", hash = "sha256:7e9d19a5bd6123d99993fb935fa86d25c88bb2096e493885f61737ed0f5e9abd"},
]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.4.4" version = "0.4.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.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"},
{file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"},
{file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"},
{file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"},
{file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"},
{file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"},
{file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"},
{file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"},
{file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"},
{file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"},
{file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"},
] ]
[[package]] [[package]]
@@ -3187,13 +3202,13 @@ files = [
[[package]] [[package]]
name = "tqdm" name = "tqdm"
version = "4.66.3" version = "4.66.1"
description = "Fast, Extensible Progress Meter" description = "Fast, Extensible Progress Meter"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "tqdm-4.66.3-py3-none-any.whl", hash = "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53"}, {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"},
{file = "tqdm-4.66.3.tar.gz", hash = "sha256:23097a41eba115ba99ecae40d06444c15d1c0c698d527a01c6c8bd1c5d0647e5"}, {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"},
] ]
[package.dependencies] [package.dependencies]
@@ -3483,13 +3498,13 @@ files = [
[[package]] [[package]]
name = "werkzeug" name = "werkzeug"
version = "3.0.3" version = "3.0.1"
description = "The comprehensive WSGI web application library." description = "The comprehensive WSGI web application library."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"},
{file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"},
] ]
[package.dependencies] [package.dependencies]
@@ -3572,4 +3587,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.10,<3.12" python-versions = ">=3.10,<3.12"
content-hash = "db51ad1e631b569e106927683a13124252bd80974def1f2edbe23ac87d89c461" content-hash = "1b014276ec94f9389459a70d31f0d96d1dd5a138bcc988900865e5f07a72bc62"
+2 -2
View File
@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "machine-learning" name = "machine-learning"
version = "1.105.1" version = "1.103.1"
description = "" description = ""
authors = ["Hau Tran <alex.tran1502@gmail.com>"] authors = ["Hau Tran <alex.tran1502@gmail.com>"]
readme = "README.md" readme = "README.md"
@@ -11,7 +11,7 @@ python = ">=3.10,<3.12"
insightface = ">=0.7.3,<1.0" insightface = ">=0.7.3,<1.0"
opencv-python-headless = ">=4.7.0.72,<5.0" opencv-python-headless = ">=4.7.0.72,<5.0"
pillow = ">=9.5.0,<11.0" pillow = ">=9.5.0,<11.0"
fastapi-slim = ">=0.95.2,<1.0" fastapi = ">=0.95.2,<1.0"
uvicorn = {extras = ["standard"], version = ">=0.22.0,<1.0"} uvicorn = {extras = ["standard"], version = ">=0.22.0,<1.0"}
pydantic = "^1.10.8" pydantic = "^1.10.8"
aiocache = ">=0.12.1,<1.0" aiocache = ">=0.12.1,<1.0"
+3 -3
View File
@@ -7,15 +7,15 @@ if ! [ "$DEVICE" = "openvino" ]; then
export LD_BIND_NOW=1 export LD_BIND_NOW=1
fi fi
: "${IMMICH_HOST:=[::]}" : "${MACHINE_LEARNING_HOST:=[::]}"
: "${IMMICH_PORT:=3003}" : "${MACHINE_LEARNING_PORT:=3003}"
: "${MACHINE_LEARNING_WORKERS:=1}" : "${MACHINE_LEARNING_WORKERS:=1}"
: "${MACHINE_LEARNING_WORKER_TIMEOUT:=120}" : "${MACHINE_LEARNING_WORKER_TIMEOUT:=120}"
gunicorn app.main:app \ gunicorn app.main:app \
-k app.config.CustomUvicornWorker \ -k app.config.CustomUvicornWorker \
-b "$IMMICH_HOST":"$IMMICH_PORT" \
-w "$MACHINE_LEARNING_WORKERS" \ -w "$MACHINE_LEARNING_WORKERS" \
-b "$MACHINE_LEARNING_HOST":"$MACHINE_LEARNING_PORT" \
-t "$MACHINE_LEARNING_WORKER_TIMEOUT" \ -t "$MACHINE_LEARNING_WORKER_TIMEOUT" \
--log-config-json log_conf.json \ --log-config-json log_conf.json \
--graceful-timeout 0 --graceful-timeout 0
+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"flutter": "3.22.0" "flutter": "3.19.3"
} }
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"dart.flutterSdkPath": ".fvm/versions/3.22.0", "dart.flutterSdkPath": ".fvm/versions/3.19.3",
"search.exclude": { "search.exclude": {
"**/.fvm": true "**/.fvm": true
}, },
+69 -69
View File
@@ -1,45 +1,43 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
CFPropertyList (3.0.7) CFPropertyList (3.0.5)
base64
nkf
rexml rexml
addressable (2.8.6) addressable (2.8.0)
public_suffix (>= 2.0.2, < 6.0) public_suffix (>= 2.0.2, < 5.0)
artifactory (3.0.17) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.3.0) aws-eventstream (1.2.0)
aws-partitions (1.931.0) aws-partitions (1.566.0)
aws-sdk-core (3.196.1) aws-sdk-core (3.130.0)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.81.0)
aws-sdk-core (~> 3, >= 3.193.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.151.0) jmespath (~> 1.0)
aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-kms (1.55.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.113.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.4)
aws-sigv4 (1.8.0) aws-sigv4 (1.4.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4) babosa (1.0.4)
base64 (0.2.0)
claide (1.1.0) claide (1.1.0)
colored (1.2) colored (1.2)
colored2 (3.1.2) colored2 (3.1.2)
commander (4.6.0) commander (4.6.0)
highline (~> 2.0.0) highline (~> 2.0.0)
declarative (0.0.20) declarative (0.0.20)
digest-crc (0.6.5) digest-crc (0.6.4)
rake (>= 12.0.0, < 14.0.0) rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107) domain_name (0.5.20190701)
dotenv (2.8.1) unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.110.0) excon (0.92.0)
faraday (1.10.3) faraday (1.10.0)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1) faraday-excon (~> 1.1)
@@ -58,8 +56,8 @@ GEM
faraday-em_synchrony (1.0.0) faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0) faraday-excon (1.1.0)
faraday-httpclient (1.0.1) faraday-httpclient (1.0.1)
faraday-multipart (1.0.4) faraday-multipart (1.0.3)
multipart-post (~> 2) multipart-post (>= 1.2, < 3)
faraday-net_http (1.0.1) faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0) faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0) faraday-patron (1.0.0)
@@ -67,8 +65,8 @@ GEM
faraday-retry (1.0.3) faraday-retry (1.0.3)
faraday_middleware (1.2.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.3.1) fastimage (2.2.6)
fastlane (2.214.0) fastlane (2.204.3)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -92,7 +90,7 @@ GEM
json (< 3.0.0) json (< 3.0.0)
jwt (>= 2.1.0, < 3) jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0) mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0) multipart-post (~> 2.0.0)
naturally (~> 2.2) naturally (~> 2.2)
optparse (~> 0.1.1) optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0) plist (>= 3.1.0, < 4.0.0)
@@ -108,9 +106,9 @@ GEM
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0) google-apis-androidpublisher_v3 (0.16.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.11.3) google-apis-core (0.4.2)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -118,84 +116,87 @@ GEM
representable (~> 3.0) representable (~> 3.0)
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
google-apis-iamcredentials_v1 (0.17.0) webrick
google-apis-core (>= 0.11.0, < 2.a) google-apis-iamcredentials_v1 (0.10.0)
google-apis-playcustomapp_v1 (0.13.0) google-apis-core (>= 0.4, < 2.a)
google-apis-core (>= 0.11.0, < 2.a) google-apis-playcustomapp_v1 (0.7.0)
google-apis-storage_v1 (0.31.0) google-apis-core (>= 0.4, < 2.a)
google-apis-core (>= 0.11.0, < 2.a) google-apis-storage_v1 (0.11.0)
google-cloud-core (1.7.0) google-apis-core (>= 0.4, < 2.a)
google-cloud-env (>= 1.0, < 3.a) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0) google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 3.0) faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.4.0) google-cloud-errors (1.2.0)
google-cloud-storage (1.47.0) google-cloud-storage (1.36.1)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1) google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.31.0) google-apis-storage_v1 (~> 0.1)
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (1.8.1) googleauth (1.1.2)
faraday (>= 0.17.3, < 3.a) faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
multi_json (~> 1.11) multi_json (~> 1.11)
os (>= 0.9, < 2.0) os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a) signet (>= 0.16, < 2.a)
highline (2.0.3) highline (2.0.3)
http-cookie (1.0.5) http-cookie (1.0.4)
domain_name (~> 0.5) domain_name (~> 0.5)
httpclient (2.8.3) httpclient (2.8.3)
jmespath (1.6.2) jmespath (1.6.1)
json (2.7.2) json (2.6.1)
jwt (2.8.1) jwt (2.3.0)
base64 memoist (0.16.2)
mini_magick (4.12.0) mini_magick (4.11.0)
mini_mime (1.1.5) mini_mime (1.1.2)
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.4.1) multipart-post (2.0.0)
nanaimo (0.3.0) nanaimo (0.3.0)
naturally (2.2.1) naturally (2.2.1)
nkf (0.2.0)
optparse (0.1.1) optparse (0.1.1)
os (1.1.4) os (1.1.4)
plist (3.7.1) plist (3.6.0)
public_suffix (4.0.7) public_suffix (4.0.6)
rake (13.2.1) rake (13.0.6)
representable (3.2.0) representable (3.1.1)
declarative (< 0.1.0) declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0) trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0) uber (< 0.2.0)
retriable (3.1.2) retriable (3.1.2)
rexml (3.2.8) rexml (3.2.5)
strscan (>= 3.0.9)
rouge (2.0.7) rouge (2.0.7)
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyzip (2.3.2) rubyzip (2.3.2)
security (0.1.3) security (0.1.3)
signet (0.19.0) signet (0.16.1)
addressable (~> 2.8) addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a) faraday (>= 0.17.5, < 3.0)
jwt (>= 1.5, < 3.0) jwt (>= 1.5, < 3.0)
multi_json (~> 1.10) multi_json (~> 1.10)
simctl (1.6.10) simctl (1.6.8)
CFPropertyList CFPropertyList
naturally naturally
strscan (3.1.0)
terminal-notifier (2.0.0) terminal-notifier (2.0.0)
terminal-table (1.8.0) terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (~> 1.1, >= 1.1.1)
trailblazer-option (0.1.2) trailblazer-option (0.1.2)
tty-cursor (0.7.1) tty-cursor (0.7.1)
tty-screen (0.8.2) tty-screen (0.8.1)
tty-spinner (0.9.3) tty-spinner (0.9.3)
tty-cursor (~> 0.7) tty-cursor (~> 0.7)
uber (0.1.0) uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.1)
unicode-display_width (1.8.0) unicode-display_width (1.8.0)
webrick (1.7.0)
word_wrap (1.0.0) word_wrap (1.0.0)
xcodeproj (1.24.0) xcodeproj (1.21.0)
CFPropertyList (>= 2.3.3, < 4.0) CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3) atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0) claide (>= 1.0.2, < 2.0)
@@ -209,7 +210,6 @@ GEM
PLATFORMS PLATFORMS
x86_64-darwin-21 x86_64-darwin-21
x86_64-linux
DEPENDENCIES DEPENDENCIES
fastlane fastlane
+3 -3
View File
@@ -81,11 +81,11 @@ flutter {
} }
dependencies { dependencies {
def kotlin_version = '1.9.24' def kotlin_version = '1.9.23'
def kotlin_coroutines_version = '1.8.1' def kotlin_coroutines_version = '1.8.0'
def work_version = '2.9.0' def work_version = '2.9.0'
def concurrent_version = '1.1.0' def concurrent_version = '1.1.0'
def guava_version = '33.2.0-android' def guava_version = '33.1.0-android'
def glide_version = '4.16.0' def glide_version = '4.16.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
@@ -52,6 +52,7 @@ class BackgroundServicePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
.putBoolean(ContentObserverWorker.SHARED_PREF_SERVICE_ENABLED, true) .putBoolean(ContentObserverWorker.SHARED_PREF_SERVICE_ENABLED, true)
.putLong(BackupWorker.SHARED_PREF_CALLBACK_KEY, args.get(0) as Long) .putLong(BackupWorker.SHARED_PREF_CALLBACK_KEY, args.get(0) as Long)
.putString(BackupWorker.SHARED_PREF_NOTIFICATION_TITLE, args.get(1) as String) .putString(BackupWorker.SHARED_PREF_NOTIFICATION_TITLE, args.get(1) as String)
.putString(BackupWorker.SHARED_PREF_SERVER_URL, args.get(3) as String)
.apply() .apply()
ContentObserverWorker.enable(ctx, immediate = args.get(2) as Boolean) ContentObserverWorker.enable(ctx, immediate = args.get(2) as Boolean)
result.success(true) result.success(true)
@@ -11,8 +11,8 @@ import android.os.PowerManager
import android.os.SystemClock import android.os.SystemClock
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.concurrent.futures.CallbackToFutureAdapter
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.concurrent.futures.ResolvableFuture
import androidx.work.BackoffPolicy import androidx.work.BackoffPolicy
import androidx.work.Constraints import androidx.work.Constraints
import androidx.work.ForegroundInfo import androidx.work.ForegroundInfo
@@ -30,6 +30,16 @@ import io.flutter.embedding.engine.loader.FlutterLoader
import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel
import io.flutter.view.FlutterCallbackInformation import io.flutter.view.FlutterCallbackInformation
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeoutOrNull
import java.io.IOException
import java.net.HttpURLConnection
import java.net.InetAddress
import java.net.URL
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
/** /**
@@ -42,7 +52,6 @@ import java.util.concurrent.TimeUnit
*/ */
class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ctx, params), MethodChannel.MethodCallHandler { class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ctx, params), MethodChannel.MethodCallHandler {
private val resolvableFuture = ResolvableFuture.create<Result>()
private var engine: FlutterEngine? = null private var engine: FlutterEngine? = null
private lateinit var backgroundChannel: MethodChannel private lateinit var backgroundChannel: MethodChannel
private val notificationManager = ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager private val notificationManager = ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
@@ -52,37 +61,82 @@ class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ct
private var notificationDetailBuilder: NotificationCompat.Builder? = null private var notificationDetailBuilder: NotificationCompat.Builder? = null
private var fgFuture: ListenableFuture<Void>? = null private var fgFuture: ListenableFuture<Void>? = null
override fun startWork(): ListenableFuture<ListenableWorker.Result> { private val job = Job()
private lateinit var completer: CallbackToFutureAdapter.Completer<Result>
private val resolvableFuture = CallbackToFutureAdapter.getFuture { completer ->
this.completer = completer
null
}
init {
resolvableFuture.addListener(
Runnable {
if (resolvableFuture.isCancelled) {
job.cancel()
}
},
taskExecutor.serialTaskExecutor
)
}
override fun startWork(): ListenableFuture<ListenableWorker.Result> {
Log.d(TAG, "startWork") Log.d(TAG, "startWork")
val ctx = applicationContext val ctx = applicationContext
val prefs = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
if (!flutterLoader.initialized()) { prefs.getString(SHARED_PREF_SERVER_URL, null)
flutterLoader.startInitialization(ctx) ?.takeIf { it.isNotEmpty() }
} ?.let { serverUrl -> doCoroutineWork(serverUrl) }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { ?: doWork()
// Create a Notification channel if necessary
createChannel()
}
if (isIgnoringBatteryOptimizations) {
// normal background services can only up to 10 minutes
// foreground services are allowed to run indefinitely
// requires battery optimizations to be disabled (either manually by the user
// or by the system learning that immich is important to the user)
val title = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
.getString(SHARED_PREF_NOTIFICATION_TITLE, NOTIFICATION_DEFAULT_TITLE)!!
showInfo(getInfoBuilder(title, indeterminate=true).build())
}
engine = FlutterEngine(ctx)
flutterLoader.ensureInitializationCompleteAsync(ctx, null, Handler(Looper.getMainLooper())) {
runDart()
}
return resolvableFuture return resolvableFuture
} }
/**
* This function is used to check if server URL is reachable before starting the backup work.
* Check must be done in a background to avoid blocking the main thread.
*/
private fun doCoroutineWork(serverUrl : String) {
CoroutineScope(Dispatchers.Default + job).launch {
val isReachable = isUrlReachableHttp(serverUrl)
withContext(Dispatchers.Main) {
if (isReachable) {
doWork()
} else {
// Fail when the URL is not reachable
completer.set(Result.failure())
}
}
}
}
private fun doWork() {
Log.d(TAG, "doWork")
val ctx = applicationContext
if (!flutterLoader.initialized()) {
flutterLoader.startInitialization(ctx)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create a Notification channel if necessary
createChannel()
}
if (isIgnoringBatteryOptimizations) {
// normal background services can only up to 10 minutes
// foreground services are allowed to run indefinitely
// requires battery optimizations to be disabled (either manually by the user
// or by the system learning that immich is important to the user)
val title = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
.getString(SHARED_PREF_NOTIFICATION_TITLE, NOTIFICATION_DEFAULT_TITLE)!!
showInfo(getInfoBuilder(title, indeterminate=true).build())
}
engine = FlutterEngine(ctx)
flutterLoader.ensureInitializationCompleteAsync(ctx, null, Handler(Looper.getMainLooper())) {
runDart()
}
}
/** /**
* Starts the Dart runtime/engine and calls `_nativeEntry` function in * Starts the Dart runtime/engine and calls `_nativeEntry` function in
* `background.service.dart` to run the actual backup logic. * `background.service.dart` to run the actual backup logic.
@@ -139,7 +193,7 @@ class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ct
engine = null engine = null
if (result != null) { if (result != null) {
Log.d(TAG, "stopEngine result=${result}") Log.d(TAG, "stopEngine result=${result}")
resolvableFuture.set(result) this.completer.set(result)
} }
waitOnSetForegroundAsync() waitOnSetForegroundAsync()
} }
@@ -270,6 +324,7 @@ class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ct
const val SHARED_PREF_CALLBACK_KEY = "callbackDispatcherHandle" const val SHARED_PREF_CALLBACK_KEY = "callbackDispatcherHandle"
const val SHARED_PREF_NOTIFICATION_TITLE = "notificationTitle" const val SHARED_PREF_NOTIFICATION_TITLE = "notificationTitle"
const val SHARED_PREF_LAST_CHANGE = "lastChange" const val SHARED_PREF_LAST_CHANGE = "lastChange"
const val SHARED_PREF_SERVER_URL = "serverUrl"
private const val TASK_NAME_BACKUP = "immich/BackupWorker" private const val TASK_NAME_BACKUP = "immich/BackupWorker"
private const val NOTIFICATION_CHANNEL_ID = "immich/backgroundService" private const val NOTIFICATION_CHANNEL_ID = "immich/backgroundService"
@@ -360,3 +415,26 @@ class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ct
} }
private const val TAG = "BackupWorker" private const val TAG = "BackupWorker"
/**
* Check if the given URL is reachable via HTTP
*/
suspend fun isUrlReachableHttp(url: String, timeoutMillis: Long = 5000L): Boolean {
return withTimeoutOrNull(timeoutMillis) {
var httpURLConnection: HttpURLConnection? = null
try {
httpURLConnection = (URL(url).openConnection() as HttpURLConnection).apply {
requestMethod = "HEAD"
connectTimeout = timeoutMillis.toInt()
readTimeout = timeoutMillis.toInt()
}
httpURLConnection.connect()
httpURLConnection.responseCode == HttpURLConnection.HTTP_OK
} catch (e: Exception) {
Log.e(TAG, "Failed to reach server URL: $e")
false
} finally {
httpURLConnection?.disconnect()
}
} == true
}
-2
View File
@@ -1,6 +1,4 @@
allprojects { allprojects {
ext.kotlin_version = '1.9.24'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
+2 -2
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" => 140, "android.injected.version.code" => 137,
"android.injected.version.name" => "1.105.1", "android.injected.version.name" => "1.103.1",
} }
) )
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')
+3 -3
View File
@@ -5,17 +5,17 @@
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000374"> <testcase classname="fastlane.lanes" name="0: default_platform" time="0.000261">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="1: bundleRelease" time="84.292464"> <testcase classname="fastlane.lanes" name="1: bundleRelease" time="32.48099">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="33.336934"> <testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="30.236974">
</testcase> </testcase>
Binary file not shown.
+2 -2
View File
@@ -19,8 +19,8 @@ pluginManagement {
plugins { plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.4.2" apply false id "com.android.application" version "7.4.2" apply false
id "org.jetbrains.kotlin.android" version "1.9.24" apply false id "org.jetbrains.kotlin.android" version "1.9.23" apply false
id "org.jetbrains.kotlin.kapt" version "1.9.24" apply false id "org.jetbrains.kotlin.kapt" version "1.9.23" apply false
} }
include ":app" include ":app"
+475 -481
View File
@@ -1,347 +1,344 @@
{ {
"action_common_back": "Back", "action_common_back": "Back",
"action_common_cancel": "يلغي", "action_common_cancel": "Cancel",
"action_common_clear": "Clear", "action_common_clear": "Clear",
"action_common_confirm": "Confirm", "action_common_confirm": "Confirm",
"action_common_update": "تحديث", "action_common_update": "Update",
"add_to_album_bottom_sheet_added": "تمت الاضافة{album}", "add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "موجودة مسبقا {album}", "add_to_album_bottom_sheet_already_exists": "Already in {album}",
"advanced_settings_log_level_title": "تسجيل مستوى: {}", "advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "تكون بعض الأجهزة بطيئة للغاية في تحميل الصور المصغرة من الأصول الموجودة على الجهاز. قم بتنشيط هذا الإعداد لتحميل الصور البعيدة بدلاً من ذلك.", "advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "تفضل الصور البعيدة", "advanced_settings_prefer_remote_title": "Prefer remote images",
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.", "advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
"advanced_settings_self_signed_ssl_title": "السماح بشهادات SSL الموقعة ذاتيًا", "advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
"advanced_settings_tile_subtitle": "إعدادات المستخدم المتقدمة", "advanced_settings_tile_subtitle": "Advanced user's settings",
"advanced_settings_tile_title": "متقدم", "advanced_settings_tile_title": "Advanced",
"advanced_settings_troubleshooting_subtitle": "تمكين الميزات الإضافية لاستكشاف الأخطاء وإصلاحها", "advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
"advanced_settings_troubleshooting_title": "استكشاف الأخطاء وإصلاحها", "advanced_settings_troubleshooting_title": "Troubleshooting",
"album_info_card_backup_album_excluded": "مستبعد", "album_info_card_backup_album_excluded": "EXCLUDED",
"album_info_card_backup_album_included": "متضمنة", "album_info_card_backup_album_included": "INCLUDED",
"album_thumbnail_card_item": "عنصر واحد", "album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} عناصر", "album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · . مشترك", "album_thumbnail_card_shared": " · Shared",
"album_thumbnail_owned": "مملوكة", "album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "مشترك مع", "album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?", "album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
"album_viewer_appbar_share_delete": "حذف الألبوم", "album_viewer_appbar_share_delete": "Delete album",
"album_viewer_appbar_share_err_delete": "فشل في حذف الألبوم", "album_viewer_appbar_share_err_delete": "Failed to delete album",
"album_viewer_appbar_share_err_leave": "فشل في ترك الألبوم", "album_viewer_appbar_share_err_leave": "Failed to leave album",
"album_viewer_appbar_share_err_remove": "هناك مشاكل في إزالة الأصول من الألبوم", "album_viewer_appbar_share_err_remove": "There are problems in removing assets from album",
"album_viewer_appbar_share_err_title": "فشل في تغيير عنوان الألبوم", "album_viewer_appbar_share_err_title": "Failed to change album title",
"album_viewer_appbar_share_leave": "ترك الألبوم", "album_viewer_appbar_share_leave": "Leave album",
"album_viewer_appbar_share_remove": "إزالة من الألبوم", "album_viewer_appbar_share_remove": "Remove from album",
"album_viewer_appbar_share_to": "حصة ل", "album_viewer_appbar_share_to": "Share To",
"album_viewer_page_share_add_users": "اضافة مستخدمين", "album_viewer_page_share_add_users": "Add users",
"all_people_page_title": "الناس", "all_people_page_title": "People",
"all_videos_page_title": "أشرطة فيديو", "all_videos_page_title": "Videos",
"app_bar_signout_dialog_content": "هل أنت متأكد أنك تريد الخروج", "app_bar_signout_dialog_content": "Are you sure you want to sign out?",
"app_bar_signout_dialog_ok": "نعم", "app_bar_signout_dialog_ok": "Yes",
"app_bar_signout_dialog_title": "خروج", "app_bar_signout_dialog_title": "Sign out",
"archive_page_no_archived_assets": "لم يتم العثور على الأصول المؤرشفة", "archive_page_no_archived_assets": "No archived assets found",
"archive_page_title": "أرشيف ({})", "archive_page_title": "Archive ({})",
"asset_action_delete_err_read_only": "لا يمكن حذف الأصول ذات للقراءة فقط، وسوف يتم التخطي", "asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "لا يمكن جلب الأصول غير المتصلة بالإنترنت، وسوف يتم التخطي", "asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_group_by_sub_title": "Group by", "asset_list_group_by_sub_title": "Group by",
"asset_list_layout_settings_dynamic_layout_title": "تخطيط ديناميكي", "asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_automatically": "تلقائي", "asset_list_layout_settings_group_automatically": "Automatic",
"asset_list_layout_settings_group_by": "مجموعة الأصول حسب", "asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "شهر", "asset_list_layout_settings_group_by_month": "Month",
"asset_list_layout_settings_group_by_month_day": "شهر + يوم", "asset_list_layout_settings_group_by_month_day": "Month + day",
"asset_list_layout_sub_title": "Layout", "asset_list_layout_sub_title": "Layout",
"asset_list_settings_subtitle": "إعدادات تخطيط شبكة الصور", "asset_list_settings_subtitle": "Photo grid layout settings",
"asset_list_settings_title": "شبكة الصور", "asset_list_settings_title": "Photo Grid",
"asset_viewer_settings_title": "Asset Viewer", "asset_viewer_settings_title": "Asset Viewer",
"backup_album_selection_page_albums_device": "الألبومات الموجودة على الجهاز ({})", "backup_album_selection_page_albums_device": "Albums on device ({})",
"backup_album_selection_page_albums_tap": "انقر للتضمين، وانقر نقرًا مزدوجًا للاستثناء", "backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
"backup_album_selection_page_assets_scatter": "يمكن أن تنتشر الأصول عبر ألبومات متعددة. وبالتالي، يمكن تضمين الألبومات أو استبعادها أثناء عملية النسخ الاحتياطي.", "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_select_albums": "حدد الألبومات", "backup_album_selection_page_select_albums": "Select albums",
"backup_album_selection_page_selection_info": "معلومات الاختيار", "backup_album_selection_page_selection_info": "Selection Info",
"backup_album_selection_page_total_assets": "إجمالي الأصول الفريدة", "backup_album_selection_page_total_assets": "Total unique assets",
"backup_all": "الجميع", "backup_all": "All",
"backup_background_service_backup_failed_message": "فشل في النسخ الاحتياطي للأصول. جارٍ إعادة المحاولة...", "backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
"backup_background_service_connection_failed_message": "فشل في الاتصال بالخادم. جارٍ إعادة المحاولة...", "backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
"backup_background_service_current_upload_notification": "تحميل {}", "backup_background_service_current_upload_notification": "Uploading {}",
"backup_background_service_default_notification": "التحقق من الأصول الجديدة ...", "backup_background_service_default_notification": "Checking for new assets…",
"backup_background_service_error_title": "خطأ في النسخ الاحتياطي", "backup_background_service_error_title": "Backup error",
"backup_background_service_in_progress_notification": "النسخ الاحتياطي للأصول الخاصة بك...", "backup_background_service_in_progress_notification": "Backing up your assets…",
"backup_background_service_upload_failure_notification": "فشل التحميل {}", "backup_background_service_upload_failure_notification": "Failed to upload {}",
"backup_controller_page_albums": "ألبومات احتياطية", "backup_controller_page_albums": "Backup Albums",
"backup_controller_page_background_app_refresh_disabled_content": "قم بتمكين تحديث تطبيق الخلفية في الإعدادات > عام > تحديث تطبيق الخلفية لاستخدام النسخ الاحتياطي في الخلفية.", "backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "تم تعطيل تحديث التطبيق في الخلفية", "backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_background_app_refresh_enable_button_text": "اذهب للاعدادات", "backup_controller_page_background_app_refresh_enable_button_text": "Go to settings",
"backup_controller_page_background_battery_info_link": "أرني كيف", "backup_controller_page_background_battery_info_link": "Show me how",
"backup_controller_page_background_battery_info_message": "للحصول على أفضل تجربة نسخ احتياطي في الخلفية، يرجى تعطيل أي تحسينات للبطارية تقيد نشاط الخلفية لـ Immich.\n\nنظرًا لأن هذا خاص بالجهاز، يرجى البحث عن المعلومات المطلوبة للشركة المصنعة لجهازك.", "backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
"backup_controller_page_background_battery_info_ok": "نعم", "backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "تحسين البطارية", "backup_controller_page_background_battery_info_title": "Battery optimizations",
"backup_controller_page_background_charging": "فقط أثناء الشحن", "backup_controller_page_background_charging": "Only while charging",
"backup_controller_page_background_configure_error": "فشل في تكوين خدمة الخلفية", "backup_controller_page_background_configure_error": "Failed to configure the background service",
"backup_controller_page_background_delay": "تأخير النسخ الاحتياطي للأصول الجديدة: {}", "backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "قم بتشغيل خدمة الخلفية لإجراء نسخ احتياطي لأي أصول جديدة تلقائيًا دون الحاجة إلى فتح التطبيق", "backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
"backup_controller_page_background_is_off": "تم إيقاف النسخ الاحتياطي التلقائي للخلفية", "backup_controller_page_background_is_off": "Automatic background backup is off",
"backup_controller_page_background_is_on": "النسخ الاحتياطي التلقائي للخلفية قيد التشغيل", "backup_controller_page_background_is_on": "Automatic background backup is on",
"backup_controller_page_background_turn_off": "قم بإيقاف تشغيل خدمة الخلفية", "backup_controller_page_background_turn_off": "Turn off background service",
"backup_controller_page_background_turn_on": "قم بتشغيل خدمة الخلفية", "backup_controller_page_background_turn_on": "Turn on background service",
"backup_controller_page_background_wifi": "فقط على واي فاي", "backup_controller_page_background_wifi": "Only on WiFi",
"backup_controller_page_backup": "دعم", "backup_controller_page_backup": "Backup",
"backup_controller_page_backup_selected": "المحدد: ", "backup_controller_page_backup_selected": "Selected: ",
"backup_controller_page_backup_sub": "النسخ الاحتياطي للصور ومقاطع الفيديو", "backup_controller_page_backup_sub": "Backed up photos and videos",
"backup_controller_page_cancel": "يلغي", "backup_controller_page_cancel": "Cancel",
"backup_controller_page_created": "تم إنشاؤها على: {}", "backup_controller_page_created": "Created on: {}",
"backup_controller_page_desc_backup": "قم بتشغيل النسخ الاحتياطي الأمامي لتحميل الأصول الجديدة تلقائيًا إلى الخادم عند فتح التطبيق.", "backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.",
"backup_controller_page_excluded": "مستبعد: ", "backup_controller_page_excluded": "Excluded: ",
"backup_controller_page_failed": "فشل ({})", "backup_controller_page_failed": "Failed ({})",
"backup_controller_page_filename": "اسم الملف: {} [{}]", "backup_controller_page_filename": "File name: {} [{}]",
"backup_controller_page_id": "رقم البطاقة: {}", "backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "معلومات النسخ الاحتياطي", "backup_controller_page_info": "Backup Information",
"backup_controller_page_none_selected": "لم يتم التحديد", "backup_controller_page_none_selected": "None selected",
"backup_controller_page_remainder": "بقية", "backup_controller_page_remainder": "Remainder",
"backup_controller_page_remainder_sub": "الصور ومقاطع الفيديو المتبقية للنسخ الاحتياطي من التحديد", "backup_controller_page_remainder_sub": "Remaining photos and videos to back up from selection",
"backup_controller_page_select": "يختار", "backup_controller_page_select": "Select",
"backup_controller_page_server_storage": "ذاكرة الجهاز", "backup_controller_page_server_storage": "Server Storage",
"backup_controller_page_start_backup": "بدء النسخ الاحتياطي", "backup_controller_page_start_backup": "Start Backup",
"backup_controller_page_status_off": "النسخة الاحتياطية التلقائية غير فعالة", "backup_controller_page_status_off": "Automatic foreground backup is off",
"backup_controller_page_status_on": "النسخة الاحتياطية التلقائية فعالة", "backup_controller_page_status_on": "Automatic foreground backup is on",
"backup_controller_page_storage_format": "{} من {} المستخدم", "backup_controller_page_storage_format": "{} of {} used",
"backup_controller_page_to_backup": "الألبومات الاحتياطية", "backup_controller_page_to_backup": "Albums to be backup",
"backup_controller_page_total": "المجموع", "backup_controller_page_total": "Total",
"backup_controller_page_total_sub": "جميع الصور ومقاطع الفيديو الفريدة من ألبومات مختارة", "backup_controller_page_total_sub": "All unique photos and videos from selected albums",
"backup_controller_page_turn_off": "قم بإيقاف تشغيل النسخ الاحتياطي المقدمة", "backup_controller_page_turn_off": "Turn off foreground backup",
"backup_controller_page_turn_on": "قم بتشغيل النسخ الاحتياطي المقدمة", "backup_controller_page_turn_on": "Turn on foreground backup",
"backup_controller_page_uploading_file_info": "تحميل معلومات الملف", "backup_controller_page_uploading_file_info": "Uploading file info",
"backup_err_only_album": "لا يمكن إزالة الألبوم الوحيد", "backup_err_only_album": "Cannot remove the only album",
"backup_info_card_assets": "أصول", "backup_info_card_assets": "assets",
"backup_manual_cancelled": "ملغي", "backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "فشل", "backup_manual_failed": "Failed",
"backup_manual_in_progress": "قيد التحميل حاول مره اخرى", "backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "نجاح", "backup_manual_success": "Success",
"backup_manual_title": "حالة التحميل", "backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options", "backup_options_page_title": "Backup options",
"cache_settings_album_thumbnails": "صور صفحة المكتبة ({} الأصول)", "cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
"cache_settings_clear_cache_button": "مسح ذاكرة التخزين المؤقت", "cache_settings_clear_cache_button": "Clear cache",
"cache_settings_clear_cache_button_title": "يقوم بمسح ذاكرة التخزين المؤقت للتطبيق.سيؤثر هذا بشكل كبير على أداء التطبيق حتى إعادة بناء ذاكرة التخزين المؤقت.", "cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
"cache_settings_duplicated_assets_clear_button": "واضح", "cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "الصور ومقاطع الفيديو اللتي تم تجاهلها المدرجة في التطبيق", "cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "الأصول المكررة ({})", "cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_image_cache_size": "حجم ذاكرة التخزين المؤقت للصور ({} الأصول)", "cache_settings_image_cache_size": "Image cache size ({} assets)",
"cache_settings_statistics_album": "مكتبه الصور المصغره", "cache_settings_statistics_album": "Library thumbnails",
"cache_settings_statistics_assets": " ({})أصول ", "cache_settings_statistics_assets": "{} assets ({})",
"cache_settings_statistics_full": "صور كاملة", "cache_settings_statistics_full": "Full images",
"cache_settings_statistics_shared": "صورة ألبوم مشتركة", "cache_settings_statistics_shared": "Shared album thumbnails",
"cache_settings_statistics_thumbnail": "الصورة المصغرة", "cache_settings_statistics_thumbnail": "Thumbnails",
"cache_settings_statistics_title": "استخدام ذاكرة التخزين المؤقت", "cache_settings_statistics_title": "Cache usage",
"cache_settings_subtitle": "تحكم في سلوك التخزين المؤقت لتطبيق الجوال Imich", "cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
"cache_settings_thumbnail_size": "حجم ذاكرة التخزين المؤقت Thumbnail ({} الأصول)", "cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
"cache_settings_tile_subtitle": "التحكم في سلوك التخزين المحلي", "cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "التخزين المحلي", "cache_settings_tile_title": "Local Storage",
"cache_settings_title": "إعدادات التخزين المؤقت", "cache_settings_title": "Caching Settings",
"change_password_form_confirm_password": "تأكيد كلمة المرور", "change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "مرحبًا ،هذه هي المرة الأولى التي تقوم فيها بالتسجيل في النظام أو تم تقديم طلب لتغيير كلمة المرور الخاصة بك.الرجاء إدخال كلمة المرور الجديدة أدناه", "change_password_form_description": "Hi {name},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "كلمة المرور الجديدة", "change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "كلمة المرور غير مطابقة", "change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "أعد إدخال كلمة مرور جديدة", "change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "أضف إلى الألبوم", "common_add_to_album": "Add to album",
"common_change_password": "تغيير كلمة المرور", "common_change_password": "Change Password",
"common_create_new_album": "إنشاء ألبوم جديد", "common_create_new_album": "Create new album",
"common_server_error": "يرجى التحقق من اتصال الشبكة الخاص بك ، والتأكد من أن الجهاز قابل للوصول وإصدارات التطبيق/الجهاز متوافقة.", "common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "مشترك", "common_shared": "Shared",
"control_bottom_app_bar_add_to_album": "أضف إلى الألبوم", "control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} أغراض", "control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} العناصر المشتركة", "control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_archive": "أرشيف", "control_bottom_app_bar_archive": "Archive",
"control_bottom_app_bar_create_new_album": "إنشاء ألبوم جديد", "control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "يمسح", "control_bottom_app_bar_delete": "Delete",
"control_bottom_app_bar_delete_from_immich": " Immich حذف منال تطبيق", "control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "حذف من الجهاز", "control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "تحديد الوجهة", "control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "تحرير التاريخ والوقت", "control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_favorite": "مفضل", "control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_share": "يشارك", "control_bottom_app_bar_share": "Share",
"control_bottom_app_bar_share_to": "مشاركة إلى", "control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_stack": "تجميع", "control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "حذفه ونقله في سله المهملات", "control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_unarchive": "غير محفوظ في الارشيف", "control_bottom_app_bar_unarchive": "Unarchive",
"control_bottom_app_bar_unfavorite": "غير مفضل", "control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "رفع وتحميل", "control_bottom_app_bar_upload": "Upload",
"create_album_page_untitled": "بدون اسم", "create_album_page_untitled": "Untitled",
"create_shared_album_page_create": "انشاء", "create_shared_album_page_create": "Create",
"create_shared_album_page_share": "يشارك", "create_shared_album_page_share": "Share",
"create_shared_album_page_share_add_assets": "إضافة الأصول", "create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "حدد الصور", "create_shared_album_page_share_select_photos": "Select Photos",
"curated_location_page_title": "أماكن", "curated_location_page_title": "Places",
"curated_object_page_title": "أشياء", "curated_object_page_title": "Things",
"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": " Immich هذه العناصر سيتم حذفها بشكل دائم من جهازك ومن تطبيق", "delete_dialog_alert": "These items will be permanently deleted from Immich and from your device",
"delete_dialog_alert_local": " Immich العناصر التي تم حذفها من جهازك ولكنها موجوده في تطبيق", "delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Immich بعض العناصر التي سيتم حذفها بشكل دائم ولا يوجد لها نسخه احتياطيه في تطبيق ", "delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "Immich العناصر التي سيتم حذفها بشكل دائم من تطبيق", "delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_cancel": "يلغي", "delete_dialog_cancel": "Cancel",
"delete_dialog_ok": "يمسح", "delete_dialog_ok": "Delete",
"delete_dialog_ok_force": "احذف على أي حال", "delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_title": "الحذف بشكل نهائي", "delete_dialog_title": "Delete Permanently",
"delete_local_dialog_ok_backed_up_only": "حذف النسخة الاحتياطية فقط", "delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "احذف على أي حال", "delete_local_dialog_ok_force": "Delete Anyway",
"delete_shared_link_dialog_content": "هل أنت متأكد من أنك تريد حذف هذا الرابط المشترك؟", "delete_shared_link_dialog_content": "Are you sure you want to delete this shared link?",
"delete_shared_link_dialog_title": "حذف الرابط المشترك", "delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "اضف وصفا...", "description_input_hint_text": "Add description...",
"description_input_submit_error": "خطأ تحديث الوصف ، تحقق من السجل لمزيد من التفاصيل", "description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "التاريخ و الوقت", "edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "وحدة زمنية", "edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "موقع", "edit_location_dialog_title": "Location",
"exif_bottom_sheet_description": "اضف وصفا...", "exif_bottom_sheet_description": "Add Description...",
"exif_bottom_sheet_details": "تفاصيل", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "موقع", "exif_bottom_sheet_location": "LOCATION",
"exif_bottom_sheet_location_add": "إضافة موقع", "exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "الناس", "exif_bottom_sheet_people": "PEOPLE",
"exif_bottom_sheet_person_add_person": "Add name", "exif_bottom_sheet_person_add_person": "Add name",
"experimental_settings_new_asset_list_subtitle": "أعمال جارية", "experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "تمكين شبكة الصور التجريبية", "experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "استخدام على مسؤوليتك الخاصة!", "experimental_settings_subtitle": "Use at your own risk!",
"experimental_settings_title": "تجريبي", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "لم يتم العثور على الأصول المفضلة", "favorites_page_no_favorites": "No favorite assets found",
"favorites_page_title": "المفضلة", "favorites_page_title": "Favorites",
"haptic_feedback_switch": "Enable haptic feedback", "home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"haptic_feedback_title": "Haptic Feedback", "home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_conflicts": "تمت إضافة {تمت إضافة} الأصول إلى الألبوم {الألبوم}.{فشل} الأصول موجودة بالفعل في الألبوم.", "home_page_add_to_album_success": "Added {added} assets to album {album}.",
"home_page_add_to_album_err_local": "لا يمكن إضافة الأصول المحلية إلى الألبومات حتى الآن ، سوف يتخطى", "home_page_album_err_partner": "Can not add partner assets to an album yet, skipping",
"home_page_add_to_album_success": "تمت إضافة {تمت إضافة} الأصول إلى الألبوم {الألبوم}.", "home_page_archive_err_local": "Can not archive local assets yet, skipping",
"home_page_album_err_partner": "لا يمكن إضافة أصول شريكة إلى ألبوم حتى الآن ، سوف يتخطى", "home_page_archive_err_partner": "Can not archive partner assets, skipping",
"home_page_archive_err_local": "لا يمكن أرشفة الأصول المحلية حتى الآن ، سوف يتخطى", "home_page_building_timeline": "Building the timeline",
"home_page_archive_err_partner": "لا يمكن أرشفة الأصول الشريكة ، سوف يتخطى", "home_page_delete_err_partner": "Can not delete partner assets, skipping",
"home_page_building_timeline": "بناء الجدول الزمني", "home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_err_partner": "لا يمكن حذف الأصول الشريكة ,سوف يتخطى", "home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_delete_remote_err_local": "الأصول المحلية في التحديد البعيد المحذوف، سوف يتخطى", "home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_favorite_err_local": "لا يمكن تفضيل الأصول المحلية بعد، سوف يتخطى", "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_favorite_err_partner": "لا يمكن الأصول الشريكة المفضلة بعد ، سوف يتخطى", "home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_first_time_notice": "إذا كانت هذه هي المرة الأولى التي تستخدم فيها التطبيق، فيرجى التأكد من اختيار ألبوم (ألبومات) احتياطية حتى يتمكن المخطط الزمني من ملء الصور ومقاطع الفيديو في الألبوم (الألبومات).", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"home_page_share_err_local": "لا يمكن مشاركة الأصول المحلية عبر الرابط ، سوف يتخطى", "image_viewer_page_state_provider_download_error": "Download Error",
"home_page_upload_err_limit": "لا يمكن إلا تحميل 30 أحد الأصول في وقت واحد ، سوف يتخطى",
"image_viewer_page_state_provider_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": "تم التنزيل بنجاح", "image_viewer_page_state_provider_download_success": "Download Success",
"image_viewer_page_state_provider_share_error": "خطأ في المشاركة", "image_viewer_page_state_provider_share_error": "Share Error",
"library_page_albums": "ألبومات", "library_page_albums": "Albums",
"library_page_archive": "أرشيف", "library_page_archive": "Archive",
"library_page_device_albums": "ألبومات على الجهاز", "library_page_device_albums": "Albums on Device",
"library_page_favorites": "المفضلة", "library_page_favorites": "Favorites",
"library_page_new_album": "البوم جديد", "library_page_new_album": "New album",
"library_page_sharing": "مشاركة", "library_page_sharing": "Sharing",
"library_page_sort_asset_count": "عدد الأصول", "library_page_sort_asset_count": "Number of assets",
"library_page_sort_created": "تاريخ الإنشاء", "library_page_sort_created": "Created date",
"library_page_sort_last_modified": "آخر تعديل", "library_page_sort_last_modified": "Last modified",
"library_page_sort_most_oldest_photo": "أقدم صورة", "library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_recent_photo": "أحدث الصور", "library_page_sort_most_recent_photo": "Most recent photo",
"library_page_sort_title": "عنوان الألبوم", "library_page_sort_title": "Album title",
"location_picker_choose_on_map": "اختر على الخريطة", "location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "خط العرض", "location_picker_latitude": "Latitude",
"location_picker_latitude_error": "أدخل خط عرض صالح", "location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "أدخل خط العرض الخاص بك هنا", "location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "خط الطول", "location_picker_longitude": "Longitude",
"location_picker_longitude_error": "أدخل خط الطول الصحيح", "location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "أدخل خط الطول هنا", "location_picker_longitude_hint": "Enter your longitude here",
"login_disabled": "تم تعطيل تسجيل الدخول", "login_disabled": "Login has been disabled",
"login_form_api_exception": " استثناء برمجة التطبيقات. يرجى التحقق من عنوان الخادم والمحاولة مرة أخرى ", "login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_back_button_text": "الرجوع للخلف", "login_form_back_button_text": "Back",
"login_form_button_text": "تسجيل الدخول", "login_form_button_text": "Login",
"login_form_email_hint": "yoursemail@email.com", "login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "http: // your-server-ip: port/api", "login_form_endpoint_hint": "http://your-server-ip:port/api",
"login_form_endpoint_url": "url نقطة نهاية الخادم", "login_form_endpoint_url": "Server Endpoint URL",
"login_form_err_http": "يرجى تحديد http: // أو https: //", "login_form_err_http": "Please specify http:// or https://",
"login_form_err_invalid_email": "بريد إلكتروني خاطئ", "login_form_err_invalid_email": "Invalid Email",
"login_form_err_invalid_url": "URL غير صالح", "login_form_err_invalid_url": "Invalid URL",
"login_form_err_leading_whitespace": "قيادة المساحة البيضاء", "login_form_err_leading_whitespace": "Leading whitespace",
"login_form_err_trailing_whitespace": "زائدة بيضاء", "login_form_err_trailing_whitespace": "Trailing whitespace",
"login_form_failed_get_oauth_server_config": "تسجيل الخطأ باستخدام OAUTH ، تحقق من عنوان URL لخادم", "login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "ميزة OAuth غير متوفرة على هذا الخادم", "login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "خطأ في تسجيل الدخول ، تحقق من عنوان URL للخادم والبريد الإلكتروني وكلمة المرور", "login_form_failed_login": "Error logging you in, check server URL, email and password",
"login_form_handshake_exception": "كان هناك استثناء مصافحة مع الخادم.تمكين دعم الشهادة الموقعة ذاتيا في الإعدادات إذا كنت تستخدم شهادة موقعة ذاتيا.", "login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
"login_form_label_email": "بريد إلكتروني", "login_form_label_email": "Email",
"login_form_label_password": "كلمة المرور", "login_form_label_password": "Password",
"login_form_next_button": "التالي", "login_form_next_button": "Next",
"login_form_password_hint": "كلمة المرور", "login_form_password_hint": "password",
"login_form_save_login": "ابق متصلا", "login_form_save_login": "Stay logged in",
"login_form_server_empty": "أدخل عنوان URL الخادم.", "login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "لا يمكن الاتصال بالخادم.", "login_form_server_error": "Could not connect to server.",
"login_password_changed_error": "كان هناك خطأ في تحديث كلمة المرور الخاصة بك", "login_password_changed_error": "There was an error updating your password",
"login_password_changed_success": "تم تحديث كلمة السر بنجاح", "login_password_changed_success": "Password updated successfully",
"map_assets_in_bound": "{} صورة", "map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} الصور", "map_assets_in_bounds": "{} photos",
"map_cannot_get_user_location": "لا يمكن الحصول على موقع المستخدم", "map_cannot_get_user_location": "Cannot get user's location",
"map_location_dialog_cancel": "يلغي", "map_location_dialog_cancel": "Cancel",
"map_location_dialog_yes": "نعم", "map_location_dialog_yes": "Yes",
"map_location_picker_page_use_location": "استخدم هذا الموقع", "map_location_picker_page_use_location": "Use this location",
"map_location_service_disabled_content": "يجب تمكين خدمة الموقع لعرض الأصول من موقعك الحالي.هل تريد تمكينه الآن؟", "map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
"map_location_service_disabled_title": "خدمة الموقع معطل", "map_location_service_disabled_title": "Location Service disabled",
"map_no_assets_in_bounds": "لا توجد صور في هذا المجال", "map_no_assets_in_bounds": "No photos in this area",
"map_no_location_permission_content": "هناك حاجة إلى إذن الموقع لعرض الأصول من موقعك الحالي.هل تريد السماح به الآن؟", "map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
"map_no_location_permission_title": "تم رفض إذن الموقع", "map_no_location_permission_title": "Location Permission denied",
"map_settings_dark_mode": "الوضع المظلم", "map_settings_dark_mode": "Dark mode",
"map_settings_date_range_option_all": "الجميع", "map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "24 ساعة الماضية", "map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "الأيام الماضية {}", "map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "السنة الفائتة", "map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "السنوات الماضية {}", "map_settings_date_range_option_years": "Past {} years",
"map_settings_dialog_cancel": "يلغي", "map_settings_dialog_cancel": "Cancel",
"map_settings_dialog_save": "يحفظ", "map_settings_dialog_save": "Save",
"map_settings_dialog_title": "إعدادات الخريطة", "map_settings_dialog_title": "Map Settings",
"map_settings_include_show_archived": "تشمل الأرشفة", "map_settings_include_show_archived": "Include Archived",
"map_settings_include_show_partners": "Include Partners", "map_settings_include_show_partners": "Include Partners",
"map_settings_only_relative_range": "نطاق الموعد", "map_settings_only_relative_range": "Date range",
"map_settings_only_show_favorites": "اظهار المفضلة فقط", "map_settings_only_show_favorites": "Show Favorite Only",
"map_settings_theme_settings": "مظهر الخريطة", "map_settings_theme_settings": "Map Theme",
"map_zoom_to_see_photos": "قم بتصغيرها لرؤية الصور", "map_zoom_to_see_photos": "Zoom out to see photos",
"memories_all_caught_up": "All caught up", "memories_all_caught_up": "All caught up",
"memories_check_back_tomorrow": "Check back tomorrow for more memories", "memories_check_back_tomorrow": "Check back tomorrow for more memories",
"memories_start_over": "Start Over", "memories_start_over": "Start Over",
"memories_swipe_to_close": "Swipe up to close", "memories_swipe_to_close": "Swipe up to close",
"monthly_title_text_date_format": "ط ط ط", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "الصور المتحركة", "motion_photos_page_title": "Motion Photos",
"multiselect_grid_edit_date_time_err_read_only": "لا يمكن تعديل تاريخ الأصول (المواد) للقراءة فقط، سوف يتخطى", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "لا يمكن تعديل موقع الأصول (المواد) للقراءة فقط، سوف يتخطى", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show", "notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_cancel": "يلغي", "notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_content": "لتمكين الإخطارات ، انتقل إلى الإعدادات و اختار السماح.", "notification_permission_dialog_settings": "Settings",
"notification_permission_dialog_settings": "إعدادات", "notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_content": "منح إذن لتمكين الإخطارات.", "notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_enable_button": "تمكين الإخطارات", "notification_permission_list_tile_title": "Notification Permission",
"notification_permission_list_tile_title": "إذن الإخطار",
"partner_list_user_photos": "{user}'s photos", "partner_list_user_photos": "{user}'s photos",
"partner_list_view_all": "View all", "partner_list_view_all": "View all",
"partner_page_add_partner": "أضف شريكًا", "partner_page_add_partner": "Add partner",
"partner_page_empty_message": "لم يتم مشاركة صورك بعد مع أي شريك.", "partner_page_empty_message": "Your photos are not yet shared with any partner.",
"partner_page_no_more_users": "لا مزيد من المستخدمين لإضافة", "partner_page_no_more_users": "No more users to add",
"partner_page_partner_add_failed": "فشل في إضافة شريك", "partner_page_partner_add_failed": "Failed to add partner",
"partner_page_select_partner": "حدد شريكًا", "partner_page_select_partner": "Select partner",
"partner_page_shared_to_title": "مشترك ل", "partner_page_shared_to_title": "Shared to",
"partner_page_stop_sharing_content": "{} لن يكون قادرًا على الوصول إلى صورك.", "partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
"partner_page_stop_sharing_title": "توقف عن مشاركة صورك؟", "partner_page_stop_sharing_title": "Stop sharing your photos?",
"partner_page_title": "شريك", "partner_page_title": "Partner",
"permission_onboarding_back": "خلف", "permission_onboarding_back": "Back",
"permission_onboarding_continue_anyway": "تواصل على أي حال", "permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "البدء", "permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "اذهب للاعدادات", "permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "يعطي الأذن", "permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "تسجيل خروج", "permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "تم رفض الإذن. لاستخدام التطبيق، قم بمنح أذونات الصور والفيديو في الإعدادات ", "permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "تم تأمين التصريح! وضعك تمام.", "permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "إذن محدود. للسماح بالنسخ الاحتياطي للتطبيق وإدارة مجموعة المعرض بالكامل، امنح أذونات الصور والفيديو في الإعدادات.", "permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "يتطلب التطبيق إذنًا لعرض الصور ومقاطع الفيديو الخاصة بك", "permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"preferences_settings_title": "Preferences", "preferences_settings_title": "Preferences",
"profile_drawer_app_logs": "السجلات", "profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "تطبيق الهاتف المحمول قديم.يرجى التحديث إلى أحدث إصدار رئيسي.", "profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "تطبيق الهاتف المحمول قديم.يرجى التحديث إلى أحدث إصدار صغير.", "profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
"profile_drawer_client_server_up_to_date": "العميل والخادم محدثان", "profile_drawer_client_server_up_to_date": "Client and Server are up-to-date",
"profile_drawer_documentation": "توثيق", "profile_drawer_documentation": "Documentation",
"profile_drawer_github": "Github", "profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "الخادم قديم.يرجى التحديث إلى أحدث إصدار رئيسي.", "profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
"profile_drawer_server_out_of_date_minor": "الخادم قديم.يرجى التحديث إلى أحدث إصدار صغير.", "profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
"profile_drawer_settings": "إعدادات", "profile_drawer_settings": "Settings",
"profile_drawer_sign_out": "خروج", "profile_drawer_sign_out": "Sign Out",
"profile_drawer_trash": "نفايات", "profile_drawer_trash": "Trash",
"recently_added_page_title": "أضيف مؤخرا", "recently_added_page_title": "Recently Added",
"scaffold_body_error_occurred": "حدث خطأ", "scaffold_body_error_occurred": "Error occurred",
"search_bar_hint": "ابحث عن صورك", "search_bar_hint": "Search your photos",
"search_filter_apply": "Apply filter", "search_filter_apply": "Apply filter",
"search_filter_camera_make": "Make", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Model", "search_filter_camera_model": "Model",
@@ -354,167 +351,164 @@
"search_filter_media_type_all": "All", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Image", "search_filter_media_type_image": "Image",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_page_categories": "فئات", "search_page_categories": "Categories",
"search_page_favorites": "المفضلة", "search_page_favorites": "Favorites",
"search_page_motion_photos": "الصور المتحركه", "search_page_motion_photos": "Motion Photos",
"search_page_no_objects": "لا توجد معلومات عن أشياء متاحة", "search_page_no_objects": "No Objects Info Available",
"search_page_no_places": "لا توجد معلومات متوفرة للأماكن", "search_page_no_places": "No Places Info Available",
"search_page_people": "الناس", "search_page_people": "People",
"search_page_person_add_name_dialog_cancel": "يلغي", "search_page_person_add_name_dialog_cancel": "Cancel",
"search_page_person_add_name_dialog_hint": "اسم", "search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "يحفظ", "search_page_person_add_name_dialog_save": "Save",
"search_page_person_add_name_dialog_title": "أضف اسمًا", "search_page_person_add_name_dialog_title": "Add a name",
"search_page_person_add_name_subtitle": "ابحث عنهم سريعًا بالاسم مع البحث", "search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "أضف اسمًا", "search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "تعديل الاسم", "search_page_person_edit_name": "Edit name",
"search_page_places": "أماكن", "search_page_places": "Places",
"search_page_recently_added": "أضيف مؤخرا", "search_page_recently_added": "Recently added",
"search_page_screenshots": "لقطات الشاشة", "search_page_screenshots": "Screenshots",
"search_page_selfies": " صور ذاتيه", "search_page_selfies": "Selfies",
"search_page_things": "أشياء", "search_page_things": "Things",
"search_page_videos": "أشرطة فيديو", "search_page_videos": "Videos",
"search_page_view_all_button": "عرض الكل", "search_page_view_all_button": "View all",
"search_page_your_activity": "نشاطك", "search_page_your_activity": "Your activity",
"search_page_your_map": "خريطتك", "search_page_your_map": "Your Map",
"search_result_page_new_search_hint": "بحث جديد", "search_result_page_new_search_hint": "New Search",
"search_suggestion_list_smart_search_hint_1": "يتم تمكين البحث الذكي افتراضيًا ، للبحث عن البيانات الوصفية ، استخدم بناء الجملة", "search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "م: البحث الخاص بك", "search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "اقتراحات", "select_additional_user_for_sharing_page_suggestions": "Suggestions",
"select_user_for_sharing_page_err_album": "فشل في إنشاء ألبوم", "select_user_for_sharing_page_err_album": "Failed to create album",
"select_user_for_sharing_page_share_suggestions": "اقتراحات", "select_user_for_sharing_page_share_suggestions": "Suggestions",
"server_info_box_app_version": "نسخة التطبيق", "server_info_box_app_version": "App Version",
"server_info_box_latest_release": "احدث اصدار", "server_info_box_latest_release": "Latest Version",
"server_info_box_server_url": "عنوان URL الخادم", "server_info_box_server_url": "Server URL",
"server_info_box_server_version": "إصدار الخادم", "server_info_box_server_version": "Server Version",
"setting_image_viewer_help": "يقوم عارض التفاصيل بتحميل الصورة المصغرة الصغيرة أولاً ، ثم يقوم بتحميل المعاينة متوسطة الحجم (إذا تم تمكينها) ، ويقوم أخيرًا بتحميل الأصل (إذا تم تمكينه).", "setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "تمكين تحميل الصورة الكاملة الدقة الأصلية (كبيرة!).تعطيل لتقليل استخدام البيانات (كل من الشبكة وعلى ذاكرة التخزين المؤقت للجهاز).", "setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "تحميل الصورة الأصلية", "setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "تمكين تحميل صورة متوسطة الدقة.تعطيل إما لتحميل مباشرة أو استخدام الصورة المصغرة مباشرة.", "setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "تحميل صورة معاينة", "setting_image_viewer_preview_title": "Load preview image",
"setting_languages_apply": "Apply", "setting_languages_apply": "Apply",
"setting_languages_title": "Languages", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "أخطر فشل النسخ الاحتياطي في الخلفية: {}", "setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_hours": "{} ساعات", "setting_notifications_notify_hours": "{} hours",
"setting_notifications_notify_immediately": "في الحال", "setting_notifications_notify_immediately": "immediately",
"setting_notifications_notify_minutes": "{} دقائق", "setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_never": "أبداً", "setting_notifications_notify_never": "never",
"setting_notifications_notify_seconds": "{} ثانية", "setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "معلومات التقدم التفصيلية تحميل لكل أصل", "setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
"setting_notifications_single_progress_title": "إظهار تقدم التفاصيل الاحتياطية الخلفية", "setting_notifications_single_progress_title": "Show background backup detail progress",
"setting_notifications_subtitle": "اضبط تفضيلات الإخطار", "setting_notifications_subtitle": "Adjust your notification preferences",
"setting_notifications_title": "إشعارات", "setting_notifications_title": "Notifications",
"setting_notifications_total_progress_subtitle": "التقدم التحميل العام (تم القيام به/إجمالي الأصول)", "setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_total_progress_title": "إظهار النسخ الاحتياطي الخلفية التقدم المحرز", "setting_notifications_total_progress_title": "Show background backup total progress",
"setting_pages_app_bar_settings": "إعدادات", "setting_pages_app_bar_settings": "Settings",
"settings_require_restart": "يرجى إعادة تشغيل Imich لتطبيق هذا الإعداد", "settings_require_restart": "Please restart Immich to apply this setting",
"share_add": "يضيف", "share_add": "Add",
"share_add_photos": "إضافة الصور", "share_add_photos": "Add photos",
"share_add_title": "إضافة عنوان", "share_add_title": "Add a title",
"share_assets_selected": "{} selected", "share_create_album": "Create album",
"share_create_album": "إنشاء ألبوم", "shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_disable": "التعليق معطل", "shared_album_activities_input_hint": "Say something",
"shared_album_activities_input_hint": "قل شيئا", "shared_album_activity_remove_content": "Do you want to delete this activity?",
"shared_album_activity_remove_content": "هل تريد حذف هذا النشاط؟", "shared_album_activity_remove_title": "Delete Activity",
"shared_album_activity_remove_title": "حذف النشاط", "shared_album_activity_setting_subtitle": "Let others respond",
"shared_album_activity_setting_subtitle": "دع الآخرين يستجيبون", "shared_album_activity_setting_title": "Comments & likes",
"shared_album_activity_setting_title": "التعليقات والأحب", "shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_error": "خطأ ترك/إزالة من الألبوم", "shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_leave": "إزالة المستخدم من الألبوم", "shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_action_remove_user": "إزالة المستخدم من الألبوم", "shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_owner_label": "مالك", "shared_album_section_people_title": "PEOPLE",
"shared_album_section_people_title": "الناس", "share_dialog_preparing": "Preparing...",
"share_dialog_preparing": "تحضير...", "shared_link_app_bar_title": "Shared Links",
"shared_link_app_bar_title": "روابط مشتركة", "shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_copied_massage": "نسخ إلى الحافظة", "shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_clipboard_text": "وصلة: {}كلمة المرور: {}", "shared_link_create_app_bar_title": "Create link to share",
"shared_link_create_app_bar_title": "إنشاء رابط للمشاركة", "shared_link_create_error": "Error while creating shared link",
"shared_link_create_error": "خطأ أثناء إنشاء رابط مشترك", "shared_link_create_info": "Let anyone with the link see the selected photo(s)",
"shared_link_create_info": "دع أي شخص لديه الرابط يرى الصور المحددة)", "shared_link_create_submit_button": "Create link",
"shared_link_create_submit_button": "إنشاء رابط", "shared_link_edit_allow_download": "Allow public user to download",
"shared_link_edit_allow_download": "السماح للمستخدم العام بالتنزيل", "shared_link_edit_allow_upload": "Allow public user to upload",
"shared_link_edit_allow_upload": "السماح للمستخدم العام بالتحميل", "shared_link_edit_app_bar_title": "Edit link",
"shared_link_edit_app_bar_title": "تغيير الرابط", "shared_link_edit_change_expiry": "Change expiration time",
"shared_link_edit_change_expiry": "تغيير وقت انتهاء الصلاحية", "shared_link_edit_description": "Description",
"shared_link_edit_description": "وصف", "shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_description_hint": "أدخل وصف المشاركة", "shared_link_edit_expire_after": "Expire after",
"shared_link_edit_expire_after": "تنتهي بعد", "shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_day": "يوم 1", "shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_days": "{} أيام", "shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hour": "1 ساعة", "shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_hours": "{} ساعات", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minute": "1 دقيقة", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_minutes": "{} دقائق", "shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_months": "{} months", "shared_link_edit_password": "Password",
"shared_link_edit_expire_after_option_never": "أبداً", "shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_expire_after_option_year": "{} year", "shared_link_edit_show_meta": "Show metadata",
"shared_link_edit_password": "كلمة المرور", "shared_link_edit_submit_button": "Update link",
"shared_link_edit_password_hint": "أدخل كلمة مرور المشاركة", "shared_link_empty": "You don't have any shared links",
"shared_link_edit_show_meta": "عرض البيانات الوصفية", "shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_edit_submit_button": "تحديث الرابط", "shared_link_expired": "Expired",
"shared_link_empty": "ليس لديك أي روابط مشتركة", "shared_link_expires_day": "Expires in {} day",
"shared_link_error_server_url_fetch": "لا يمكن جلب عنوان الخادم", "shared_link_expires_days": "Expires in {} days",
"shared_link_expired": "منتهي الصلاحية", "shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_day": "تنتهي في اليوم {}", "shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_days": "تنتهي في {} أيام", "shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_hour": "تنتهي في الساعة {}", "shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_hours": "تنتهي في {} ساعات", "shared_link_expires_never": "Expires ∞",
"shared_link_expires_minute": "تنتهي في {} دقيقة", "shared_link_expires_second": "Expires in {} second",
"shared_link_expires_minutes": "تنتهي في الدقائق {}", "shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_expires_never": "تنتهي ∞",
"shared_link_expires_second": "تنتهي في {} الثاني",
"shared_link_expires_seconds": "تنتهي في ثواني {}",
"shared_link_individual_shared": "Individual shared", "shared_link_individual_shared": "Individual shared",
"shared_link_info_chip_download": "تحميل", "shared_link_info_chip_download": "Download",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "رفع", "shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "إدارة الروابط المشتركة", "shared_link_manage_links": "Manage Shared links",
"shared_link_public_album": "Public album", "shared_link_public_album": "Public album",
"share_done": "منتهي", "share_done": "Done",
"share_invite": "دعوة إلى الألبوم", "share_invite": "Invite to album",
"sharing_page_album": "ألبومات مشتركة", "sharing_page_album": "Shared albums",
"sharing_page_description": "قم بإنشاء ألبومات مشتركة لمشاركة الصور ومقاطع الفيديو مع أشخاص في شبكتك.", "sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
"sharing_page_empty_list": "قائمة فارغة", "sharing_page_empty_list": "EMPTY LIST",
"sharing_silver_appbar_create_shared_album": "ألبوم مشترك جديد", "sharing_silver_appbar_create_shared_album": "New shared album",
"sharing_silver_appbar_shared_links": "روابط مشتركة", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "شارك مع الشريك", "sharing_silver_appbar_share_partner": "Share with partner",
"tab_controller_nav_library": "مكتبة", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "الصور", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "يبحث", "tab_controller_nav_search": "Search",
"tab_controller_nav_sharing": "مشاركة", "tab_controller_nav_sharing": "Sharing",
"theme_setting_asset_list_storage_indicator_title": "عرض مؤشر التخزين على بلاط الأصول", "theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
"theme_setting_asset_list_tiles_per_row_title": "عدد الأصول لكل صف ({})", "theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
"theme_setting_dark_mode_switch": "الوضع المظلم", "theme_setting_dark_mode_switch": "Dark mode",
"theme_setting_image_viewer_quality_subtitle": "اضبط جودة عارض الصورة التفصيلية", "theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
"theme_setting_image_viewer_quality_title": "جودة عارض الصورة", "theme_setting_image_viewer_quality_title": "Image viewer quality",
"theme_setting_system_theme_switch": "تلقائي (اتبع إعداد النظام)", "theme_setting_system_theme_switch": "Automatic (Follow system setting)",
"theme_setting_theme_subtitle": "اختر إعدادات مظهر التطبيق", "theme_setting_theme_subtitle": "Choose the app's theme setting",
"theme_setting_theme_title": "مظهر", "theme_setting_theme_title": "Theme",
"theme_setting_three_stage_loading_subtitle": "قد يزيد التحميل من ثلاث مراحل من أداء التحميل ولكنه يسبب تحميل شبكة أعلى بكثير", "theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load",
"theme_setting_three_stage_loading_title": "تمكين تحميل ثلاث مراحل", "theme_setting_three_stage_loading_title": "Enable three-stage loading",
"translated_text_options": "خيارات", "translated_text_options": "Options",
"trash_page_delete": "مسح", "trash_page_delete": "Delete",
"trash_page_delete_all": "حذف الكل", "trash_page_delete_all": "Delete All",
"trash_page_empty_trash_btn": "افرغ سله المهملات ", "trash_page_empty_trash_btn": "Empty trash",
"trash_page_empty_trash_dialog_content": "هل تريد تفريغ أصولك المهملة؟ ستتم إزالة هذه العناصر نهائيًا من التطبيق", "trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_empty_trash_dialog_ok": "نعم", "trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "سيتم حذف العناصر المحذوفة بشكل دائم بعد {} أيام", "trash_page_info": "Trashed items will be permanently deleted after {} days",
"trash_page_no_assets": "لا توجد اصول في سله المهملات", "trash_page_no_assets": "No trashed assets",
"trash_page_restore": "الترجيع من سله المهملات", "trash_page_restore": "Restore",
"trash_page_restore_all": "استعادة الكل", "trash_page_restore_all": "Restore All",
"trash_page_select_assets_btn": "اختر الأصول ", "trash_page_select_assets_btn": "Select assets",
"trash_page_select_btn": "يختار", "trash_page_select_btn": "Select",
"trash_page_title": "نفايات ({})", "trash_page_title": "Trash ({})",
"upload_dialog_cancel": "يلغي", "upload_dialog_cancel": "Cancel",
"upload_dialog_info": "هل تريد النسخ الاحتياطي للأصول (الأصول) المحددة إلى الخادم؟", "upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
"upload_dialog_ok": "رفع", "upload_dialog_ok": "Upload",
"upload_dialog_title": "تحميل الأصول", "upload_dialog_title": "Upload Asset",
"version_announcement_overlay_ack": "يُقرّ", "version_announcement_overlay_ack": "Acknowledge",
"version_announcement_overlay_release_notes": "ملاحظات الإصدار", "version_announcement_overlay_release_notes": "release notes",
"version_announcement_overlay_text_1": "مرحبًا يا صديقي ، هناك إصدار جديد", "version_announcement_overlay_text_1": "Hi friend, there is a new release of",
"version_announcement_overlay_text_2": "من فضلك خذ وقتك لزيارة", "version_announcement_overlay_text_2": "please take your time to visit the ",
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.", "version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
"version_announcement_overlay_title": "نسخه جديده متاحه للخادم ", "version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89",
"viewer_remove_from_stack": "حذف من الكومه أو المجموعة", "viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "استخدم كأصل رئيسي", "viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "فك الكومه" "viewer_unstack": "Un-Stack"
} }
@@ -1,22 +1,22 @@
{ {
"action_common_cancel": "Cancel·la", "action_common_cancel": "Cancel",
"action_common_update": "Actualitza", "action_common_update": "Update",
"add_to_album_bottom_sheet_added": "S'ha afegit a {album}", "add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Ja es troba en {album}", "add_to_album_bottom_sheet_already_exists": "Already in {album}",
"advanced_settings_log_level_title": "Log level: {}", "advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.", "advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "Prefereix imatges remotes", "advanced_settings_prefer_remote_title": "Prefereix imatges remotes",
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.", "advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates", "advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
"advanced_settings_tile_subtitle": "Configuració avançada", "advanced_settings_tile_subtitle": "Advanced user's settings",
"advanced_settings_tile_title": "Avançat", "advanced_settings_tile_title": "Avançat",
"advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting", "advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
"advanced_settings_troubleshooting_title": "Resolució de problemes", "advanced_settings_troubleshooting_title": "Resolució de problemes",
"album_info_card_backup_album_excluded": "Exclosos", "album_info_card_backup_album_excluded": "Exclosos",
"album_info_card_backup_album_included": "Inclosos", "album_info_card_backup_album_included": "Inclosos",
"album_thumbnail_card_item": "1 element", "album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} elements", "album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · Compartit", "album_thumbnail_card_shared": " · Shared",
"album_thumbnail_owned": "Owned", "album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Compartit per {}", "album_thumbnail_shared_by": "Compartit per {}",
"album_viewer_appbar_share_delete": "Esborra l'àlbum", "album_viewer_appbar_share_delete": "Esborra l'àlbum",
@@ -435,46 +435,46 @@
"shared_link_expires_never": "Expires ∞", "shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second", "shared_link_expires_second": "Expires in {} second",
"shared_link_expires_seconds": "Expires in {} seconds", "shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Baixa", "shared_link_info_chip_download": "Download",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Puja", "shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Manage Shared links", "shared_link_manage_links": "Manage Shared links",
"share_done": "Fet", "share_done": "Done",
"share_invite": "Convida a l'àlbum", "share_invite": "Convida a l'àlbum",
"sharing_page_album": "Àlbums compartits", "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": "Crea àlbum compartit", "sharing_silver_appbar_create_shared_album": "Crea àlbum compartit",
"sharing_silver_appbar_shared_links": "Shared links", "sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Comparteix amb un company", "sharing_silver_appbar_share_partner": "Comparteix amb un company",
"tab_controller_nav_library": "Bibilioteca", "tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotografies",
"tab_controller_nav_search": "Cerca", "tab_controller_nav_search": "Cerca",
"tab_controller_nav_sharing": "Compartint", "tab_controller_nav_sharing": "Compartint",
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles", "theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})", "theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
"theme_setting_dark_mode_switch": "Modes fosc", "theme_setting_dark_mode_switch": "Dark mode",
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer", "theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
"theme_setting_image_viewer_quality_title": "Image viewer quality", "theme_setting_image_viewer_quality_title": "Image viewer quality",
"theme_setting_system_theme_switch": "Automatic (Follow system setting)", "theme_setting_system_theme_switch": "Automatic (Follow system setting)",
"theme_setting_theme_subtitle": "Choose the app's theme setting", "theme_setting_theme_subtitle": "Choose the app's theme setting",
"theme_setting_theme_title": "Tema", "theme_setting_theme_title": "Theme",
"theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load", "theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load",
"theme_setting_three_stage_loading_title": "Enable three-stage loading", "theme_setting_three_stage_loading_title": "Enable three-stage loading",
"translated_text_options": "Options", "translated_text_options": "Options",
"trash_page_delete": "Elimina", "trash_page_delete": "Delete",
"trash_page_delete_all": "Elimina-ho tot", "trash_page_delete_all": "Delete All",
"trash_page_empty_trash_btn": "Buida la paperera", "trash_page_empty_trash_btn": "Empty trash",
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich", "trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_empty_trash_dialog_ok": "Ok", "trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Trashed items will be permanently deleted after {} days", "trash_page_info": "Trashed items will be permanently deleted after {} days",
"trash_page_no_assets": "No trashed assets", "trash_page_no_assets": "No trashed assets",
"trash_page_restore": "Recupera", "trash_page_restore": "Restore",
"trash_page_restore_all": "Recupera-ho tot", "trash_page_restore_all": "Restore All",
"trash_page_select_assets_btn": "Select assets", "trash_page_select_assets_btn": "Select assets",
"trash_page_select_btn": "Select", "trash_page_select_btn": "Select",
"trash_page_title": "Trash ({})", "trash_page_title": "Trash ({})",
"upload_dialog_cancel": "Cancel·la", "upload_dialog_cancel": "Cancel",
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?", "upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
"upload_dialog_ok": "Upload", "upload_dialog_ok": "Upload",
"upload_dialog_title": "Upload Asset", "upload_dialog_title": "Upload Asset",
+22 -28
View File
@@ -1,8 +1,8 @@
{ {
"action_common_back": "Zpět", "action_common_back": "Back",
"action_common_cancel": "Zrušit", "action_common_cancel": "Zrušit",
"action_common_clear": "Vyčistit", "action_common_clear": "Clear",
"action_common_confirm": "Potvrdit", "action_common_confirm": "Confirm",
"action_common_update": "Aktualizovat", "action_common_update": "Aktualizovat",
"add_to_album_bottom_sheet_added": "Přidáno do {album}", "add_to_album_bottom_sheet_added": "Přidáno do {album}",
"add_to_album_bottom_sheet_already_exists": "Je již v {album}", "add_to_album_bottom_sheet_already_exists": "Je již v {album}",
@@ -22,7 +22,7 @@
"album_thumbnail_card_shared": " · Sdíleno", "album_thumbnail_card_shared": " · Sdíleno",
"album_thumbnail_owned": "Vlastní", "album_thumbnail_owned": "Vlastní",
"album_thumbnail_shared_by": "Sdílel(a) {}", "album_thumbnail_shared_by": "Sdílel(a) {}",
"album_viewer_appbar_delete_confirm": "Opravdu chcete toto album odstranit ze svého účtu?", "album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
"album_viewer_appbar_share_delete": "Smazat album", "album_viewer_appbar_share_delete": "Smazat album",
"album_viewer_appbar_share_err_delete": "Nepodařilo se smazat album", "album_viewer_appbar_share_err_delete": "Nepodařilo se smazat album",
"album_viewer_appbar_share_err_leave": "Nepodařilo se opustit album", "album_viewer_appbar_share_err_leave": "Nepodařilo se opustit album",
@@ -115,7 +115,7 @@
"backup_manual_in_progress": "Nahrávání již probíhá. Zkuste to znovu později", "backup_manual_in_progress": "Nahrávání již probíhá. Zkuste to znovu později",
"backup_manual_success": "Úspěch", "backup_manual_success": "Úspěch",
"backup_manual_title": "Stav nahrávání", "backup_manual_title": "Stav nahrávání",
"backup_options_page_title": "Nastavení záloh", "backup_options_page_title": "Backup options",
"cache_settings_album_thumbnails": "Náhledy stránek knihovny (položek {})", "cache_settings_album_thumbnails": "Náhledy stránek knihovny (položek {})",
"cache_settings_clear_cache_button": "Vymazat vyrovnávací paměť", "cache_settings_clear_cache_button": "Vymazat vyrovnávací paměť",
"cache_settings_clear_cache_button_title": "Vymaže vyrovnávací paměť aplikace. To výrazně ovlivní výkon aplikace, dokud se vyrovnávací paměť neobnoví.", "cache_settings_clear_cache_button_title": "Vymaže vyrovnávací paměť aplikace. To výrazně ovlivní výkon aplikace, dokud se vyrovnávací paměť neobnoví.",
@@ -201,8 +201,6 @@
"experimental_settings_title": "Experimentální", "experimental_settings_title": "Experimentální",
"favorites_page_no_favorites": "Nebyla nalezena žádná oblíbená média", "favorites_page_no_favorites": "Nebyla nalezena žádná oblíbená média",
"favorites_page_title": "Oblíbené", "favorites_page_title": "Oblíbené",
"haptic_feedback_switch": "Povolit dotykovou zpětnou vazbu",
"haptic_feedback_title": "Dotyková zpětná vazba",
"home_page_add_to_album_conflicts": "Přidáno {added} položek do alba {album}. {failed} položek je již v albu.", "home_page_add_to_album_conflicts": "Přidáno {added} položek do alba {album}. {failed} položek je již v albu.",
"home_page_add_to_album_err_local": "Zatím není možné přidat lokální média do alb, přeskakuji", "home_page_add_to_album_err_local": "Zatím není možné přidat lokální média do alb, přeskakuji",
"home_page_add_to_album_success": "Přidáno {added} položek do alba {album}.", "home_page_add_to_album_success": "Přidáno {added} položek do alba {album}.",
@@ -286,7 +284,7 @@
"map_settings_dialog_save": "Uložit", "map_settings_dialog_save": "Uložit",
"map_settings_dialog_title": "Nastavení map", "map_settings_dialog_title": "Nastavení map",
"map_settings_include_show_archived": "Zahrnout archivované", "map_settings_include_show_archived": "Zahrnout archivované",
"map_settings_include_show_partners": "Včetně partnerů", "map_settings_include_show_partners": "Include Partners",
"map_settings_only_relative_range": "Rozsah data", "map_settings_only_relative_range": "Rozsah data",
"map_settings_only_show_favorites": "Zobrazit pouze oblíbené", "map_settings_only_show_favorites": "Zobrazit pouze oblíbené",
"map_settings_theme_settings": "Motiv mapy", "map_settings_theme_settings": "Motiv mapy",
@@ -299,15 +297,14 @@
"motion_photos_page_title": "Pohyblivé fotky", "motion_photos_page_title": "Pohyblivé fotky",
"multiselect_grid_edit_date_time_err_read_only": "Nelze upravit datum položek pouze pro čtení, přeskakuji", "multiselect_grid_edit_date_time_err_read_only": "Nelze upravit datum položek pouze pro čtení, přeskakuji",
"multiselect_grid_edit_gps_err_read_only": "Nelze upravit polohu položek pouze pro čtení, přeskakuji", "multiselect_grid_edit_gps_err_read_only": "Nelze upravit polohu položek pouze pro čtení, přeskakuji",
"no_assets_to_show": "Žádné položky k zobrazení",
"notification_permission_dialog_cancel": "Zrušit", "notification_permission_dialog_cancel": "Zrušit",
"notification_permission_dialog_content": "Chcete-li povolit oznámení, přejděte do nastavení a vyberte možnost povolit.", "notification_permission_dialog_content": "Chcete-li povolit oznámení, přejděte do nastavení a vyberte možnost povolit.",
"notification_permission_dialog_settings": "Nastavení", "notification_permission_dialog_settings": "Nastavení",
"notification_permission_list_tile_content": "Udělte oprávnění k aktivaci oznámení.", "notification_permission_list_tile_content": "Udělte oprávnění k aktivaci oznámení.",
"notification_permission_list_tile_enable_button": "Povolit oznámení", "notification_permission_list_tile_enable_button": "Povolit oznámení",
"notification_permission_list_tile_title": "Povolení oznámení", "notification_permission_list_tile_title": "Povolení oznámení",
"partner_list_user_photos": "Fotografie uživatele {user}", "partner_list_user_photos": "{user}'s photos",
"partner_list_view_all": "Zobrazit všechny", "partner_list_view_all": "View all",
"partner_page_add_partner": "Přidat partnera", "partner_page_add_partner": "Přidat partnera",
"partner_page_empty_message": "Vaše fotografie zatím nejsou sdíleny s žádným partnerem.", "partner_page_empty_message": "Vaše fotografie zatím nejsou sdíleny s žádným partnerem.",
"partner_page_no_more_users": "Žádní další uživatelé k přidání", "partner_page_no_more_users": "Žádní další uživatelé k přidání",
@@ -342,17 +339,17 @@
"recently_added_page_title": "Nedávno přidané", "recently_added_page_title": "Nedávno přidané",
"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": "Apply filter",
"search_filter_camera_make": "Výrobce", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Model", "search_filter_camera_model": "Model",
"search_filter_display_option_archive": "Archiv", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Oblíbené", "search_filter_display_option_favorite": "Favorite",
"search_filter_display_option_not_in_album": "Není v albu", "search_filter_display_option_not_in_album": "Not in album",
"search_filter_location_city": "Město", "search_filter_location_city": "City",
"search_filter_location_country": "Země", "search_filter_location_country": "Country",
"search_filter_location_state": "Stát", "search_filter_location_state": "State",
"search_filter_media_type_all": "Všechny", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Obrázek", "search_filter_media_type_image": "Image",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_page_categories": "Kategorie", "search_page_categories": "Kategorie",
"search_page_favorites": "Oblíbené", "search_page_favorites": "Oblíbené",
@@ -391,8 +388,8 @@
"setting_image_viewer_original_title": "Načíst původní obrázek", "setting_image_viewer_original_title": "Načíst původní obrázek",
"setting_image_viewer_preview_subtitle": "Umožňuje načíst obrázek se středním rozlišením. Zakažte, pokud chcete přímo načíst originál nebo použít pouze miniaturu.", "setting_image_viewer_preview_subtitle": "Umožňuje načíst obrázek se středním rozlišením. Zakažte, pokud chcete přímo načíst originál nebo použít pouze miniaturu.",
"setting_image_viewer_preview_title": "Načíst náhled obrázku", "setting_image_viewer_preview_title": "Načíst náhled obrázku",
"setting_languages_apply": "Použít", "setting_languages_apply": "Apply",
"setting_languages_title": "Jazyk", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "Oznámení o selhání zálohování na pozadí: {}", "setting_notifications_notify_failures_grace_period": "Oznámení o selhání zálohování na pozadí: {}",
"setting_notifications_notify_hours": "{} hodin", "setting_notifications_notify_hours": "{} hodin",
"setting_notifications_notify_immediately": "okamžitě", "setting_notifications_notify_immediately": "okamžitě",
@@ -410,7 +407,6 @@
"share_add": "Přidat", "share_add": "Přidat",
"share_add_photos": "Přidat fotografie", "share_add_photos": "Přidat fotografie",
"share_add_title": "Přidat název", "share_add_title": "Přidat název",
"share_assets_selected": "{} vybráno",
"share_create_album": "Vytvořit album", "share_create_album": "Vytvořit album",
"shared_album_activities_input_disable": "Komentář je vypnutý", "shared_album_activities_input_disable": "Komentář je vypnutý",
"shared_album_activities_input_hint": "Řekněte něco", "shared_album_activities_input_hint": "Řekněte něco",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} hodin", "shared_link_edit_expire_after_option_hours": "{} hodin",
"shared_link_edit_expire_after_option_minute": "1 minuta", "shared_link_edit_expire_after_option_minute": "1 minuta",
"shared_link_edit_expire_after_option_minutes": "{} minut", "shared_link_edit_expire_after_option_minutes": "{} minut",
"shared_link_edit_expire_after_option_months": "{} měsíce",
"shared_link_edit_expire_after_option_never": "Nikdy", "shared_link_edit_expire_after_option_never": "Nikdy",
"shared_link_edit_expire_after_option_year": "{} rok",
"shared_link_edit_password": "Heslo", "shared_link_edit_password": "Heslo",
"shared_link_edit_password_hint": "Zadejte heslo pro sdílení", "shared_link_edit_password_hint": "Zadejte heslo pro sdílení",
"shared_link_edit_show_meta": "Zobrazit metadata", "shared_link_edit_show_meta": "Zobrazit metadata",
@@ -463,12 +457,12 @@
"shared_link_expires_never": "Platnost ∞", "shared_link_expires_never": "Platnost ∞",
"shared_link_expires_second": "Vyprší za {} sekundu", "shared_link_expires_second": "Vyprší za {} sekundu",
"shared_link_expires_seconds": "Vyprší za {} sekund", "shared_link_expires_seconds": "Vyprší za {} sekund",
"shared_link_individual_shared": "Individuální sdílení", "shared_link_individual_shared": "Individual shared",
"shared_link_info_chip_download": "Stáhnout", "shared_link_info_chip_download": "Stáhnout",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Nahrát", "shared_link_info_chip_upload": "Nahrát",
"shared_link_manage_links": "Spravovat sdílené odkazy", "shared_link_manage_links": "Spravovat sdílené odkazy",
"shared_link_public_album": "Veřejné album", "shared_link_public_album": "Public album",
"share_done": "Hotovo", "share_done": "Hotovo",
"share_invite": "Pozvat do alba", "share_invite": "Pozvat do alba",
"sharing_page_album": "Sdílená alba", "sharing_page_album": "Sdílená alba",
+32 -38
View File
@@ -1,8 +1,8 @@
{ {
"action_common_back": "Tilbage", "action_common_back": "Back",
"action_common_cancel": "Annuller", "action_common_cancel": "Annuller",
"action_common_clear": "Ryd", "action_common_clear": "Clear",
"action_common_confirm": "Bekræft", "action_common_confirm": "Confirm",
"action_common_update": "Opdater", "action_common_update": "Opdater",
"add_to_album_bottom_sheet_added": "Tilføjet til {album}", "add_to_album_bottom_sheet_added": "Tilføjet til {album}",
"add_to_album_bottom_sheet_already_exists": "Allerede i {album}", "add_to_album_bottom_sheet_already_exists": "Allerede i {album}",
@@ -22,7 +22,7 @@
"album_thumbnail_card_shared": ". Delt", "album_thumbnail_card_shared": ". Delt",
"album_thumbnail_owned": "Ejet", "album_thumbnail_owned": "Ejet",
"album_thumbnail_shared_by": "Delt af {}", "album_thumbnail_shared_by": "Delt af {}",
"album_viewer_appbar_delete_confirm": "Er du sikker på, du vil slette dette album fra din bruger?", "album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
"album_viewer_appbar_share_delete": "Slet album", "album_viewer_appbar_share_delete": "Slet album",
"album_viewer_appbar_share_err_delete": "Fejlede sletning af album", "album_viewer_appbar_share_err_delete": "Fejlede sletning af album",
"album_viewer_appbar_share_err_leave": "Fejlede i at forlade album", "album_viewer_appbar_share_err_leave": "Fejlede i at forlade album",
@@ -41,7 +41,7 @@
"archive_page_title": "Arkivér ({})", "archive_page_title": "Arkivér ({})",
"asset_action_delete_err_read_only": "Kan ikke slette kun læselige elementer. Springer over", "asset_action_delete_err_read_only": "Kan ikke slette kun læselige elementer. Springer over",
"asset_action_share_err_offline": "Kan ikke hente offline element(er). Springer over", "asset_action_share_err_offline": "Kan ikke hente offline element(er). Springer over",
"asset_list_group_by_sub_title": "Gruppér efter", "asset_list_group_by_sub_title": "Group by",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout", "asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout",
"asset_list_layout_settings_group_automatically": "Automatisk", "asset_list_layout_settings_group_automatically": "Automatisk",
"asset_list_layout_settings_group_by": "Gruppér elementer pr. ", "asset_list_layout_settings_group_by": "Gruppér elementer pr. ",
@@ -50,7 +50,7 @@
"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_viewer_settings_title": "Billedviser", "asset_viewer_settings_title": "Asset Viewer",
"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",
"backup_album_selection_page_assets_scatter": "Elementer kan være spredt på tværs af flere albummer. Albummer kan således inkluderes eller udelukkes under sikkerhedskopieringsprocessen.", "backup_album_selection_page_assets_scatter": "Elementer kan være spredt på tværs af flere albummer. Albummer kan således inkluderes eller udelukkes under sikkerhedskopieringsprocessen.",
@@ -115,7 +115,7 @@
"backup_manual_in_progress": "Upload er allerede undervejs. Prøv igen efter noget tid", "backup_manual_in_progress": "Upload er allerede undervejs. Prøv igen efter noget tid",
"backup_manual_success": "Succes", "backup_manual_success": "Succes",
"backup_manual_title": "Uploadstatus", "backup_manual_title": "Uploadstatus",
"backup_options_page_title": "Backupindstillinger", "backup_options_page_title": "Backup options",
"cache_settings_album_thumbnails": "Biblioteksminiaturebilleder ({} elementer)", "cache_settings_album_thumbnails": "Biblioteksminiaturebilleder ({} elementer)",
"cache_settings_clear_cache_button": "Fjern cache", "cache_settings_clear_cache_button": "Fjern cache",
"cache_settings_clear_cache_button_title": "Fjern appens cache. Dette vil i stor grad påvirke appens ydeevne indtil cachen er genopbygget.", "cache_settings_clear_cache_button_title": "Fjern appens cache. Dette vil i stor grad påvirke appens ydeevne indtil cachen er genopbygget.",
@@ -194,15 +194,13 @@
"exif_bottom_sheet_location": "LOKATION", "exif_bottom_sheet_location": "LOKATION",
"exif_bottom_sheet_location_add": "Tilføj en placering", "exif_bottom_sheet_location_add": "Tilføj en placering",
"exif_bottom_sheet_people": "PERSONER", "exif_bottom_sheet_people": "PERSONER",
"exif_bottom_sheet_person_add_person": "Tilføj navn", "exif_bottom_sheet_person_add_person": "Add name",
"experimental_settings_new_asset_list_subtitle": "Under udarbejdelse", "experimental_settings_new_asset_list_subtitle": "Under udarbejdelse",
"experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter", "experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter",
"experimental_settings_subtitle": "Brug på eget ansvar!", "experimental_settings_subtitle": "Brug på eget ansvar!",
"experimental_settings_title": "Eksperimentelle", "experimental_settings_title": "Eksperimentelle",
"favorites_page_no_favorites": "Ingen favoritter blev fundet", "favorites_page_no_favorites": "Ingen favoritter blev fundet",
"favorites_page_title": "Favoritter", "favorites_page_title": "Favoritter",
"haptic_feedback_switch": "Slå haptisk feedback til",
"haptic_feedback_title": "Haptisk feedback",
"home_page_add_to_album_conflicts": "Tilføjede {added} elementer til album {album}. {failed} elementer er allerede i albummet.", "home_page_add_to_album_conflicts": "Tilføjede {added} elementer til album {album}. {failed} elementer er allerede i albummet.",
"home_page_add_to_album_err_local": "Kan endnu ikke tilføje lokale elementer til album. Springer over..", "home_page_add_to_album_err_local": "Kan endnu ikke tilføje lokale elementer til album. Springer over..",
"home_page_add_to_album_success": "Tilføjede {added} elementer til album {album}.", "home_page_add_to_album_success": "Tilføjede {added} elementer til album {album}.",
@@ -218,7 +216,7 @@
"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_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 startede",
"image_viewer_page_state_provider_download_success": "Download succesfuld", "image_viewer_page_state_provider_download_success": "Download succesfuld",
"image_viewer_page_state_provider_share_error": "Delingsfejl", "image_viewer_page_state_provider_share_error": "Delingsfejl",
"library_page_albums": "Albummer", "library_page_albums": "Albummer",
@@ -286,28 +284,27 @@
"map_settings_dialog_save": "Gem", "map_settings_dialog_save": "Gem",
"map_settings_dialog_title": "Kortindstillinger", "map_settings_dialog_title": "Kortindstillinger",
"map_settings_include_show_archived": "Inkluder arkiveret", "map_settings_include_show_archived": "Inkluder arkiveret",
"map_settings_include_show_partners": "Inkluder partnere", "map_settings_include_show_partners": "Include Partners",
"map_settings_only_relative_range": "Datointerval", "map_settings_only_relative_range": "Datointerval",
"map_settings_only_show_favorites": "Vis kun favoritter", "map_settings_only_show_favorites": "Vis kun favoritter",
"map_settings_theme_settings": "Korttema", "map_settings_theme_settings": "Korttema",
"map_zoom_to_see_photos": "Zoom ud for at vise billeder", "map_zoom_to_see_photos": "Zoom ud for at vise billeder",
"memories_all_caught_up": "Ajour", "memories_all_caught_up": "All caught up",
"memories_check_back_tomorrow": "Kom tilbage i morgen for at se nye minder", "memories_check_back_tomorrow": "Check back tomorrow for more memories",
"memories_start_over": "Start forfra", "memories_start_over": "Start Over",
"memories_swipe_to_close": "Stryg op for at lukke", "memories_swipe_to_close": "Swipe up to close",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Bevægelsesbilleder", "motion_photos_page_title": "Bevægelsesbilleder",
"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",
"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",
"notification_permission_list_tile_content": "Tillad at bruge notifikationer.", "notification_permission_list_tile_content": "Tillad at bruge notifikationer.",
"notification_permission_list_tile_enable_button": "Slå notifikationer til", "notification_permission_list_tile_enable_button": "Slå notifikationer til",
"notification_permission_list_tile_title": "Notifikationstilladelser", "notification_permission_list_tile_title": "Notifikationstilladelser",
"partner_list_user_photos": "{user}s billeder", "partner_list_user_photos": "{user}'s photos",
"partner_list_view_all": "Se alle", "partner_list_view_all": "View all",
"partner_page_add_partner": "Tilføj partner", "partner_page_add_partner": "Tilføj partner",
"partner_page_empty_message": "Dine billeder er endnu ikke delt med en partner.", "partner_page_empty_message": "Dine billeder er endnu ikke delt med en partner.",
"partner_page_no_more_users": "Der er ikke flere brugere at tilføje", "partner_page_no_more_users": "Der er ikke flere brugere at tilføje",
@@ -327,7 +324,7 @@
"permission_onboarding_permission_granted": "Tilladelse givet! Du er nu klar.", "permission_onboarding_permission_granted": "Tilladelse givet! Du er nu klar.",
"permission_onboarding_permission_limited": "Tilladelse begrænset. For at lade Immich lave sikkerhedskopi og styre hele dit galleri, skal der gives tilladelse til billeder og videoer i indstillinger.", "permission_onboarding_permission_limited": "Tilladelse begrænset. For at lade Immich lave sikkerhedskopi og styre hele dit galleri, skal der gives tilladelse til billeder og videoer i indstillinger.",
"permission_onboarding_request": "Immich kræver tilliadelse til at se dine billeder og videoer.", "permission_onboarding_request": "Immich kræver tilliadelse til at se dine billeder og videoer.",
"preferences_settings_title": "Præferencer", "preferences_settings_title": "Preferences",
"profile_drawer_app_logs": "Log", "profile_drawer_app_logs": "Log",
"profile_drawer_client_out_of_date_major": "Mobilapp er forældet. Opdater venligst til den nyeste større version", "profile_drawer_client_out_of_date_major": "Mobilapp er forældet. Opdater venligst til den nyeste større version",
"profile_drawer_client_out_of_date_minor": "Mobilapp er forældet. Opdater venligst til den nyeste mindre version", "profile_drawer_client_out_of_date_minor": "Mobilapp er forældet. Opdater venligst til den nyeste mindre version",
@@ -342,17 +339,17 @@
"recently_added_page_title": "Nyligt tilføjet", "recently_added_page_title": "Nyligt tilføjet",
"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": "Apply filter",
"search_filter_camera_make": "Producent", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Model", "search_filter_camera_model": "Model",
"search_filter_display_option_archive": "Arkiv", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Favorit", "search_filter_display_option_favorite": "Favorite",
"search_filter_display_option_not_in_album": "Ikke i album", "search_filter_display_option_not_in_album": "Not in album",
"search_filter_location_city": "By", "search_filter_location_city": "City",
"search_filter_location_country": "Land", "search_filter_location_country": "Country",
"search_filter_location_state": "Stat", "search_filter_location_state": "State",
"search_filter_media_type_all": "Alle", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Billede", "search_filter_media_type_image": "Image",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_page_categories": "Kategorier", "search_page_categories": "Kategorier",
"search_page_favorites": "Favoritter", "search_page_favorites": "Favoritter",
@@ -391,8 +388,8 @@
"setting_image_viewer_original_title": "Indlæs originalbillede", "setting_image_viewer_original_title": "Indlæs originalbillede",
"setting_image_viewer_preview_subtitle": "Slå indlæsning af et mediumstørrelse billede til. Slå fra for enten direkte at indlæse originalen eller kun at bruge miniaturebilledet.", "setting_image_viewer_preview_subtitle": "Slå indlæsning af et mediumstørrelse billede til. Slå fra for enten direkte at indlæse originalen eller kun at bruge miniaturebilledet.",
"setting_image_viewer_preview_title": "Indlæs forhåndsvisning af billedet", "setting_image_viewer_preview_title": "Indlæs forhåndsvisning af billedet",
"setting_languages_apply": "Anvend", "setting_languages_apply": "Apply",
"setting_languages_title": "Sprog", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "Giv besked om fejl med sikkerhedskopiering i baggrunden: {}", "setting_notifications_notify_failures_grace_period": "Giv besked om fejl med sikkerhedskopiering i baggrunden: {}",
"setting_notifications_notify_hours": "{} timer", "setting_notifications_notify_hours": "{} timer",
"setting_notifications_notify_immediately": "med det samme", "setting_notifications_notify_immediately": "med det samme",
@@ -410,7 +407,6 @@
"share_add": "Tilføj", "share_add": "Tilføj",
"share_add_photos": "Tilføj billeder", "share_add_photos": "Tilføj billeder",
"share_add_title": "Tilføj en titel", "share_add_title": "Tilføj en titel",
"share_assets_selected": "{} valgt",
"share_create_album": "Opret album", "share_create_album": "Opret album",
"shared_album_activities_input_disable": "Kommentarer er deaktiveret", "shared_album_activities_input_disable": "Kommentarer er deaktiveret",
"shared_album_activities_input_hint": "Skriv noget", "shared_album_activities_input_hint": "Skriv noget",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} timer", "shared_link_edit_expire_after_option_hours": "{} timer",
"shared_link_edit_expire_after_option_minute": "1 minut", "shared_link_edit_expire_after_option_minute": "1 minut",
"shared_link_edit_expire_after_option_minutes": "{} minutter", "shared_link_edit_expire_after_option_minutes": "{} minutter",
"shared_link_edit_expire_after_option_months": "{} måneder",
"shared_link_edit_expire_after_option_never": "Aldrig", "shared_link_edit_expire_after_option_never": "Aldrig",
"shared_link_edit_expire_after_option_year": "{} år",
"shared_link_edit_password": "Kodeord", "shared_link_edit_password": "Kodeord",
"shared_link_edit_password_hint": "Indtast kodeordet", "shared_link_edit_password_hint": "Indtast kodeordet",
"shared_link_edit_show_meta": "Vis metadata", "shared_link_edit_show_meta": "Vis metadata",
@@ -460,15 +454,15 @@
"shared_link_expires_hours": "Udløber om {} timer", "shared_link_expires_hours": "Udløber om {} timer",
"shared_link_expires_minute": "Udløber om {} minut", "shared_link_expires_minute": "Udløber om {} minut",
"shared_link_expires_minutes": "Udløber om {} minutter", "shared_link_expires_minutes": "Udløber om {} minutter",
"shared_link_expires_never": "Udløber aldrig", "shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Udløber om {} sekund", "shared_link_expires_second": "Udløber om {} sekund",
"shared_link_expires_seconds": "Udløber om {} sekunder", "shared_link_expires_seconds": "Udløber om {} sekunder",
"shared_link_individual_shared": "Individuelt delt", "shared_link_individual_shared": "Individual shared",
"shared_link_info_chip_download": "Hent", "shared_link_info_chip_download": "Hent",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload", "shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Håndter delte links", "shared_link_manage_links": "Håndter delte links",
"shared_link_public_album": "Offentligt album", "shared_link_public_album": "Public album",
"share_done": "Færdig", "share_done": "Færdig",
"share_invite": "Inviter til album", "share_invite": "Inviter til album",
"sharing_page_album": "Delt albums", "sharing_page_album": "Delt albums",
+84 -94
View File
@@ -1,19 +1,19 @@
{ {
"action_common_back": "Zurück", "action_common_back": "Back",
"action_common_cancel": "Abbrechen", "action_common_cancel": "Abbrechen",
"action_common_clear": "Leeren", "action_common_clear": "Clear",
"action_common_confirm": "Bestätigen", "action_common_confirm": "Confirm",
"action_common_update": "Aktualisieren", "action_common_update": "Aktualisieren",
"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": "Manche Endgeräte laden Vorschaubilder lokaler Bilder sehr langsam. Durch diese Einstellung werden diese stattdessen direkt vom Server geladen.",
"advanced_settings_prefer_remote_title": "Server-Bilder bevorzugen", "advanced_settings_prefer_remote_title": "Server-Bilder bevorzugen",
"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": "Sonstige",
"advanced_settings_troubleshooting_subtitle": "Erweiterte Funktionen zur Fehlersuche aktivieren", "advanced_settings_troubleshooting_subtitle": "Aktiviere erweiterte Funktionen zur Fehlersuche",
"advanced_settings_troubleshooting_title": "Fehlersuche", "advanced_settings_troubleshooting_title": "Fehlersuche",
"album_info_card_backup_album_excluded": "AUSGESCHLOSSEN", "album_info_card_backup_album_excluded": "AUSGESCHLOSSEN",
"album_info_card_backup_album_included": "EINGESCHLOSSEN", "album_info_card_backup_album_included": "EINGESCHLOSSEN",
@@ -22,7 +22,7 @@
"album_thumbnail_card_shared": " · Geteilt", "album_thumbnail_card_shared": " · Geteilt",
"album_thumbnail_owned": "Eigene", "album_thumbnail_owned": "Eigene",
"album_thumbnail_shared_by": "Geteilt von {}", "album_thumbnail_shared_by": "Geteilt von {}",
"album_viewer_appbar_delete_confirm": "Bist du sicher, dass du dieses Album aus deinem Konto löschen möchtest?", "album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
"album_viewer_appbar_share_delete": "Album löschen", "album_viewer_appbar_share_delete": "Album löschen",
"album_viewer_appbar_share_err_delete": "Album konnte nicht gelöscht werden", "album_viewer_appbar_share_err_delete": "Album konnte nicht gelöscht werden",
"album_viewer_appbar_share_err_leave": "Album konnte nicht verlassen werden", "album_viewer_appbar_share_err_leave": "Album konnte nicht verlassen werden",
@@ -34,14 +34,14 @@
"album_viewer_page_share_add_users": "Nutzer hinzufügen", "album_viewer_page_share_add_users": "Nutzer hinzufügen",
"all_people_page_title": "Personen", "all_people_page_title": "Personen",
"all_videos_page_title": "Videos", "all_videos_page_title": "Videos",
"app_bar_signout_dialog_content": "Bist du dir sicher, dass du dich abmelden möchtest?", "app_bar_signout_dialog_content": "Bist du sicher, dass du dich abmelden möchtest?",
"app_bar_signout_dialog_ok": "Ja", "app_bar_signout_dialog_ok": "Ja",
"app_bar_signout_dialog_title": "Abmelden", "app_bar_signout_dialog_title": "Abmelden",
"archive_page_no_archived_assets": "Keine archivierten Inhalte gefunden", "archive_page_no_archived_assets": "Keine archivierten Inhalte gefunden",
"archive_page_title": "Archiv ({})", "archive_page_title": "Archiv ({})",
"asset_action_delete_err_read_only": "Schreibgeschützte Inhalte können nicht gelöscht werden, überspringen...", "asset_action_delete_err_read_only": "Schreibgeschützten Inhalte können nicht gelöscht werden, überspringe",
"asset_action_share_err_offline": "Die Offline-Inhalte konnten nicht gelesen werden, überspringen...", "asset_action_share_err_offline": "Offline-Inhalte konnten nicht gelesen werden, überspringe",
"asset_list_group_by_sub_title": "Gruppieren nach", "asset_list_group_by_sub_title": "Group by",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisches Layout", "asset_list_layout_settings_dynamic_layout_title": "Dynamisches Layout",
"asset_list_layout_settings_group_automatically": "Automatisch", "asset_list_layout_settings_group_automatically": "Automatisch",
"asset_list_layout_settings_group_by": "Gruppiere Elemente nach", "asset_list_layout_settings_group_by": "Gruppiere Elemente nach",
@@ -50,16 +50,16 @@
"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_viewer_settings_title": "Fotoanzeige", "asset_viewer_settings_title": "Asset Viewer",
"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 tippen um einzuschließen, doppelt tippen um zu entfernen", "backup_album_selection_page_albums_tap": "Tippen um einzuschließen, doppelt tippen um zu entfernen",
"backup_album_selection_page_assets_scatter": "Elemente können sich über mehrere Alben verteilen. Daher können diese vor der Sicherung eingeschlossen oder ausgeschlossen werden", "backup_album_selection_page_assets_scatter": "Elemente können sich über mehrere Alben verteilen. Daher können diese vor der Sicherung eingeschlossen oder ausgeschlossen werden",
"backup_album_selection_page_select_albums": "Alben auswählen", "backup_album_selection_page_select_albums": "Alben auswählen",
"backup_album_selection_page_selection_info": "Auswahl", "backup_album_selection_page_selection_info": "Auswahl",
"backup_album_selection_page_total_assets": "Elemente", "backup_album_selection_page_total_assets": "Elemente",
"backup_all": "Alle", "backup_all": "Alle",
"backup_background_service_backup_failed_message": "Fehler beim Sichern von Elementen. Probiere erneut...", "backup_background_service_backup_failed_message": "Fehler beim Sichern von Elementen. Probiere erneut...",
"backup_background_service_connection_failed_message": "Es konnte keine Verbindung zum Server herstellen. Neuer Versuch...", "backup_background_service_connection_failed_message": "Konnte keine Verbindung zum Server herstellen. Neuer Versuch...",
"backup_background_service_current_upload_notification": "Lädt {} hoch", "backup_background_service_current_upload_notification": "Lädt {} hoch",
"backup_background_service_default_notification": "Suche nach neuen Elementen…", "backup_background_service_default_notification": "Suche nach neuen Elementen…",
"backup_background_service_error_title": "Fehler bei der Sicherung", "backup_background_service_error_title": "Fehler bei der Sicherung",
@@ -97,7 +97,7 @@
"backup_controller_page_remainder": "Verbleibend", "backup_controller_page_remainder": "Verbleibend",
"backup_controller_page_remainder_sub": "Noch zu sichernde Fotos und Videos", "backup_controller_page_remainder_sub": "Noch zu sichernde Fotos und Videos",
"backup_controller_page_select": "Auswählen", "backup_controller_page_select": "Auswählen",
"backup_controller_page_server_storage": "Server-Speicher", "backup_controller_page_server_storage": "Server Speicher",
"backup_controller_page_start_backup": "Sicherung starten", "backup_controller_page_start_backup": "Sicherung starten",
"backup_controller_page_status_off": "Sicherung im Vordergrund ist inaktiv", "backup_controller_page_status_off": "Sicherung im Vordergrund ist inaktiv",
"backup_controller_page_status_on": "Sicherung im Vordergrund ist aktiv", "backup_controller_page_status_on": "Sicherung im Vordergrund ist aktiv",
@@ -112,10 +112,10 @@
"backup_info_card_assets": "Elemente", "backup_info_card_assets": "Elemente",
"backup_manual_cancelled": "Abgebrochen", "backup_manual_cancelled": "Abgebrochen",
"backup_manual_failed": "Fehlgeschlagen", "backup_manual_failed": "Fehlgeschlagen",
"backup_manual_in_progress": "Sicherung läuft bereits. Bitte versuche es später erneut.", "backup_manual_in_progress": "Sicherung läuft bereits. Bitte später erneut versuchen",
"backup_manual_success": "Erfolgreich", "backup_manual_success": "Erfolgreich",
"backup_manual_title": "Sicherungsstatus", "backup_manual_title": "Sicherungsstatus",
"backup_options_page_title": "Sicherungsoptionen", "backup_options_page_title": "Backup options",
"cache_settings_album_thumbnails": "Vorschaubilder der Bibliothek ({} Elemente)", "cache_settings_album_thumbnails": "Vorschaubilder der Bibliothek ({} Elemente)",
"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.",
@@ -128,14 +128,14 @@
"cache_settings_statistics_full": "Originalbilder", "cache_settings_statistics_full": "Originalbilder",
"cache_settings_statistics_shared": "Vorschaubilder geteilter Alben", "cache_settings_statistics_shared": "Vorschaubilder geteilter Alben",
"cache_settings_statistics_thumbnail": "Vorschaubilder", "cache_settings_statistics_thumbnail": "Vorschaubilder",
"cache_settings_statistics_title": "Zwischenspeicher-Nutzung", "cache_settings_statistics_title": "Zwischenspeicher Nutzung",
"cache_settings_subtitle": "Kontrollieren, wie Immich den Zwischenspeicher nutzt", "cache_settings_subtitle": "Kontrolliere wie Immich den Zwischenspeicher nutzen soll",
"cache_settings_thumbnail_size": "{} Vorschaubilder im Zwischenspeicher", "cache_settings_thumbnail_size": "{} Vorschaubilder im Zwischenspeicher",
"cache_settings_tile_subtitle": "Lokalen Speicher verwalten", "cache_settings_tile_subtitle": "Lokalen Speicher verwalten",
"cache_settings_tile_title": "Lokaler Speicher", "cache_settings_tile_title": "Lokaler Speicher",
"cache_settings_title": "Zwischenspeicher Einstellungen", "cache_settings_title": "Zwischenspeicher Einstellungen",
"change_password_form_confirm_password": "Passwort bestätigen", "change_password_form_confirm_password": "Passwort bestätigen",
"change_password_form_description": "Hallo {name}\n\nDas ist entweder das erste Mal dass du dich einloggst oder es wurde eine Anfrage zur Änderung deines Passwortes gestellt. Bitte gib das neue Passwort ein.", "change_password_form_description": "Hallo {name}\n\nDas ist entweder das erste Mal dass du dich einloggst oder eine Anfrage zur Änderung deines Passwortes wurde gestellt. Bitte gebe das neue Passwort ein.",
"change_password_form_new_password": "Neues Passwort", "change_password_form_new_password": "Neues Passwort",
"change_password_form_password_mismatch": "Passwörter stimmen nicht überein", "change_password_form_password_mismatch": "Passwörter stimmen nicht überein",
"change_password_form_reenter_new_password": "Passwort erneut eingeben", "change_password_form_reenter_new_password": "Passwort erneut eingeben",
@@ -150,7 +150,7 @@
"control_bottom_app_bar_archive": "Archiv", "control_bottom_app_bar_archive": "Archiv",
"control_bottom_app_bar_create_new_album": "Neues Album erstellen", "control_bottom_app_bar_create_new_album": "Neues Album erstellen",
"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": "Von 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_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",
@@ -158,7 +158,7 @@
"control_bottom_app_bar_share": "Teilen", "control_bottom_app_bar_share": "Teilen",
"control_bottom_app_bar_share_to": "Teilen mit", "control_bottom_app_bar_share_to": "Teilen mit",
"control_bottom_app_bar_stack": "Stapeln", "control_bottom_app_bar_stack": "Stapeln",
"control_bottom_app_bar_trash_from_immich": "in den Papierkorb schieben", "control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_unarchive": "Dearchivieren", "control_bottom_app_bar_unarchive": "Dearchivieren",
"control_bottom_app_bar_unfavorite": "Aus Favoriten entfernen", "control_bottom_app_bar_unfavorite": "Aus Favoriten entfernen",
"control_bottom_app_bar_upload": "Hochladen", "control_bottom_app_bar_upload": "Hochladen",
@@ -173,9 +173,9 @@
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E d. LLL y • hh:mm", "date_format": "E d. LLL y • hh:mm",
"delete_dialog_alert": "Diese Elemente werden unwiderruflich von Immich und dem Gerät entfernt", "delete_dialog_alert": "Diese Elemente werden unwiderruflich von Immich und dem Gerät entfernt",
"delete_dialog_alert_local": "Diese Inhalte werden vom Gerät gelöscht, bleiben aber auf dem Immich-Server.", "delete_dialog_alert_local": "Diese Inhalte werden vom Gerät gelöscht, bleiben aber auf dem Immich-Server",
"delete_dialog_alert_local_non_backed_up": "Einige Inhalte sind nicht in Immich gesichert und werden dauerhaft vom Gerät gelöscht.", "delete_dialog_alert_local_non_backed_up": "Einige Inhalte wurden nicht zu Immich gesichert und werden dauerhaft vom Gerät gelöscht",
"delete_dialog_alert_remote": "Diese Inhalte werden dauerhaft vom Immich-Server gelöscht.", "delete_dialog_alert_remote": "Diese Inhalte werden dauerhaft vom Immich-Server gelöscht",
"delete_dialog_cancel": "Abbrechen", "delete_dialog_cancel": "Abbrechen",
"delete_dialog_ok": "Löschen", "delete_dialog_ok": "Löschen",
"delete_dialog_ok_force": "Trotzdem löschen", "delete_dialog_ok_force": "Trotzdem löschen",
@@ -193,32 +193,30 @@
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "STANDORT", "exif_bottom_sheet_location": "STANDORT",
"exif_bottom_sheet_location_add": "Aufnahmeort hinzufügen", "exif_bottom_sheet_location_add": "Aufnahmeort hinzufügen",
"exif_bottom_sheet_people": "PERSONEN", "exif_bottom_sheet_people": "PEOPLE",
"exif_bottom_sheet_person_add_person": "Namen hinzufügen", "exif_bottom_sheet_person_add_person": "Add name",
"experimental_settings_new_asset_list_subtitle": "In Arbeit", "experimental_settings_new_asset_list_subtitle": "In Arbeit",
"experimental_settings_new_asset_list_title": "Experimentelles Fotogitter aktivieren", "experimental_settings_new_asset_list_title": "Experimentelles Fotogitter aktivieren",
"experimental_settings_subtitle": "Benutzung auf eigene Gefahr!", "experimental_settings_subtitle": "Benutzung auf eigene Gefahr!",
"experimental_settings_title": "Experimentell", "experimental_settings_title": "Experimentell",
"favorites_page_no_favorites": "Keine favorisierten Inhalte gefunden", "favorites_page_no_favorites": "Keine favorisierten Inhalte gefunden",
"favorites_page_title": "Favoriten", "favorites_page_title": "Favoriten",
"haptic_feedback_switch": "Haptisches Feedback aktivieren",
"haptic_feedback_title": "Haptisches Feedback",
"home_page_add_to_album_conflicts": "{added} Elemente zu {album} hinzugefügt. {failed} Elemente sind bereits vorhanden.", "home_page_add_to_album_conflicts": "{added} Elemente zu {album} hinzugefügt. {failed} Elemente sind bereits vorhanden.",
"home_page_add_to_album_err_local": "Es können lokale Elemente noch nicht zu Alben hinzugefügt werden, überspringen...", "home_page_add_to_album_err_local": "Kann lokale Elemente noch nicht zu Alben hinzufügen, überspringe",
"home_page_add_to_album_success": "{added} Elemente zu {album} hinzugefügt.", "home_page_add_to_album_success": "{added} Elemente zu {album} hinzugefügt.",
"home_page_album_err_partner": "Inhalte von Partnern können derzeit nicht zu Alben hinzugefügt werden!", "home_page_album_err_partner": "Inhalte von Partnern können derzeit nicht zu Alben hinzugefügt werden",
"home_page_archive_err_local": "Kann lokale Elemente nicht archvieren, überspringen...", "home_page_archive_err_local": "Kann lokale Elemente nicht archvieren, überspringe",
"home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden!", "home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden",
"home_page_building_timeline": "Zeitachse wird erstellt.", "home_page_building_timeline": "Zeitachse wird erstellt.",
"home_page_delete_err_partner": "Inhalte von Partnern können nicht gelöscht werden!", "home_page_delete_err_partner": "Inhalte von Partnern können nicht gelöscht werden",
"home_page_delete_remote_err_local": "Lokale Inhalte in der Auswahl, überspringen...", "home_page_delete_remote_err_local": "Lokale Inhalte in der Auswahl, überspringe",
"home_page_favorite_err_local": "Kann lokale Elemente noch nicht favorisieren, überspringen...", "home_page_favorite_err_local": "Kann lokale Elemente noch nicht favorisieren, überspringe",
"home_page_favorite_err_partner": "Inhalte von Partnern können nicht favorisiert werden!", "home_page_favorite_err_partner": "Inhalte von Partnern können nicht favorisiert werden",
"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": "Max. 30 Elemente können gleichzeitig hochgeladen werden, überspringe",
"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": "Gestartet heruntergeladen",
"image_viewer_page_state_provider_download_success": "Erfolgreich heruntergeladen", "image_viewer_page_state_provider_download_success": "Erfolgreich heruntergeladen",
"image_viewer_page_state_provider_share_error": "Fehler beim Teilen", "image_viewer_page_state_provider_share_error": "Fehler beim Teilen",
"library_page_albums": "Alben", "library_page_albums": "Alben",
@@ -252,30 +250,30 @@
"login_form_err_invalid_url": "Ungültige URL", "login_form_err_invalid_url": "Ungültige URL",
"login_form_err_leading_whitespace": "Leerzeichen am Anfang", "login_form_err_leading_whitespace": "Leerzeichen am Anfang",
"login_form_err_trailing_whitespace": "Leerzeichen am Ende", "login_form_err_trailing_whitespace": "Leerzeichen am Ende",
"login_form_failed_get_oauth_server_config": "Fehler beim Login per OAuth, bitte Server-URL überprüfen", "login_form_failed_get_oauth_server_config": "Fehler beim Login per OAuth, Server-URL überprüfen",
"login_form_failed_get_oauth_server_disable": "Die OAuth-Funktion ist auf diesem Server nicht verfügbar.", "login_form_failed_get_oauth_server_disable": "OAuth-Funktion nicht verfügbar auf diesem Server.",
"login_form_failed_login": "Fehler beim Login, bitte überprüfe die Server-URL, deine E-Mail oder das Passwort", "login_form_failed_login": "Fehler beim Login, prüfe Server-URL, E-Mail und Passwort",
"login_form_handshake_exception": "Fehler beim Verbindungsaufbau mit dem Server. Falls du ein selbstsigniertes Zertifikat verwendest, aktiviere die Unterstützung dafür in den Einstellungen.", "login_form_handshake_exception": "Fehler beim Verbindungsaufbau mit dem Server. Falls du ein selbstsigniertes Zertifikat verwendest, aktiviere die Unterstützung in den Einstellungen.",
"login_form_label_email": "E-Mail", "login_form_label_email": "E-Mail",
"login_form_label_password": "Passwort", "login_form_label_password": "Passwort",
"login_form_next_button": "Weiter", "login_form_next_button": "Weiter",
"login_form_password_hint": "Passwort", "login_form_password_hint": "password",
"login_form_save_login": "Angemeldet bleiben", "login_form_save_login": "Angemeldet bleiben",
"login_form_server_empty": "Serveradresse eingeben.", "login_form_server_empty": "Serveradresse eingeben.",
"login_form_server_error": "Es Konnte sich nicht mit dem Server verbunden werden.", "login_form_server_error": "Konnte nicht mit Server verbinden.",
"login_password_changed_error": "Fehler beim Passwort ändern!", "login_password_changed_error": "Fehler beim Passwort ändern",
"login_password_changed_success": "Passwort erfolgreich geändert.", "login_password_changed_success": "Passwort erfolgreich geändert",
"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": "Standort konnte nicht ermittelt werden!", "map_cannot_get_user_location": "Standort konnte nicht ermittelt werden",
"map_location_dialog_cancel": "Abbrechen", "map_location_dialog_cancel": "Abbrechen",
"map_location_dialog_yes": "Ja", "map_location_dialog_yes": "Ja",
"map_location_picker_page_use_location": "Aufnahmeort verwenden", "map_location_picker_page_use_location": "Aufnahmeort verwenden",
"map_location_service_disabled_content": "Ortungsdienste müssen aktiviert sein, um Inhalte am aktuellen Standort anzuzeigen. Willst du die Ortungsdienste jetzt aktivieren?", "map_location_service_disabled_content": "Ortungsdienste müssen aktiviert sein, um Inhalte am aktuellen Standort anzuzeigen. Willst du die Ortungsdienste aktivieren?",
"map_location_service_disabled_title": "Ortungsdienste deaktiviert", "map_location_service_disabled_title": "Ortungsdienste deaktiviert",
"map_no_assets_in_bounds": "Keine Fotos in dieser Gegend", "map_no_assets_in_bounds": "Keine Fotos in dieser Gegend",
"map_no_location_permission_content": "Ortungsdienste müssen aktiviert sein, um Inhalte am aktuellen Standort anzuzeigen. Willst du die Ortungsdienste jetzt aktivieren?", "map_no_location_permission_content": "Ortungsdienste müssen aktiviert sein, um Inhalte am aktuellen Standort anzuzeigen. Willst du die Ortungsdienste aktivieren?",
"map_no_location_permission_title": "Kein Zugriff auf den Standort!", "map_no_location_permission_title": "Kein Zugriff auf den Standort",
"map_settings_dark_mode": "Dunkler Modus", "map_settings_dark_mode": "Dunkler Modus",
"map_settings_date_range_option_all": "Alle", "map_settings_date_range_option_all": "Alle",
"map_settings_date_range_option_day": "Letzte 24 Stunden", "map_settings_date_range_option_day": "Letzte 24 Stunden",
@@ -286,30 +284,29 @@
"map_settings_dialog_save": "Speichern", "map_settings_dialog_save": "Speichern",
"map_settings_dialog_title": "Karteneinstellungen", "map_settings_dialog_title": "Karteneinstellungen",
"map_settings_include_show_archived": "Archivierte anzeigen", "map_settings_include_show_archived": "Archivierte anzeigen",
"map_settings_include_show_partners": "Partner einbeziehen", "map_settings_include_show_partners": "Include Partners",
"map_settings_only_relative_range": "Datumsbereich", "map_settings_only_relative_range": "Datumsbereich",
"map_settings_only_show_favorites": "Nur Favoriten anzeigen", "map_settings_only_show_favorites": "Nur Favoriten anzeigen",
"map_settings_theme_settings": "Karten Design", "map_settings_theme_settings": "Karten-Theme",
"map_zoom_to_see_photos": "Ansicht verkleinern um Fotos zu sehen", "map_zoom_to_see_photos": "Ansicht verkleinern um Fotos zu sehen",
"memories_all_caught_up": "Alles aufgeholt", "memories_all_caught_up": "All caught up",
"memories_check_back_tomorrow": "Schau morgen wieder vorbei für weitere Erinnerungen!", "memories_check_back_tomorrow": "Check back tomorrow for more memories",
"memories_start_over": "Erneut beginnen", "memories_start_over": "Start Over",
"memories_swipe_to_close": "Nach oben Wischen zum schließen", "memories_swipe_to_close": "Swipe up to close",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Live-Fotos", "motion_photos_page_title": "Live-Fotos",
"multiselect_grid_edit_date_time_err_read_only": "Das Datum und die Uhrzeit von schreibgeschützten Inhalten kann nicht verändert werden, überspringen...", "multiselect_grid_edit_date_time_err_read_only": "Datum und Uhrzeit von schreibgeschützten Inhalten kann nicht geändert werden, überspringe",
"multiselect_grid_edit_gps_err_read_only": "Der Aufnahmeort von schreibgeschützten Inhalten kann nicht verändert werden, überspringen...", "multiselect_grid_edit_gps_err_read_only": "Der Aufnahmeort von schreibgeschützten Inhalten kann nicht geändert werden, überspringe",
"no_assets_to_show": "Keine Vorschau vorhanden",
"notification_permission_dialog_cancel": "Abbrechen", "notification_permission_dialog_cancel": "Abbrechen",
"notification_permission_dialog_content": "Um Benachrichtigungen zu aktivieren, navigiere zu Einstellungen und klicke \"Erlauben\"", "notification_permission_dialog_content": "Um Benachrichtigungen zu aktivieren, navigiere zu Einstellungen und klicke \"Erlauben\"",
"notification_permission_dialog_settings": "Einstellungen", "notification_permission_dialog_settings": "Einstellungen",
"notification_permission_list_tile_content": "Erlaube Berechtigung für Benachrichtigungen", "notification_permission_list_tile_content": "Erlaube Berechtigung für Benachrichtigungen",
"notification_permission_list_tile_enable_button": "Aktiviere Benachrichtigungen", "notification_permission_list_tile_enable_button": "Aktiviere Benachrichtigungen",
"notification_permission_list_tile_title": "Benachrichtigungs-Berechtigung", "notification_permission_list_tile_title": "Benachrichtigungs-Berechtigung",
"partner_list_user_photos": "{user}s Fotos", "partner_list_user_photos": "{user}'s photos",
"partner_list_view_all": "Alle anzeigen", "partner_list_view_all": "View all",
"partner_page_add_partner": "Partner hinzufügen", "partner_page_add_partner": "Partner hinzufügen",
"partner_page_empty_message": "Deine Fotos sind noch nicht mit einem Partner geteilt.", "partner_page_empty_message": "Deine Fotos sind noch nicht geteilt mit einem Partner",
"partner_page_no_more_users": "Keine weiteren Nutzer", "partner_page_no_more_users": "Keine weiteren Nutzer",
"partner_page_partner_add_failed": "Fehler beim Partner hinzufügen", "partner_page_partner_add_failed": "Fehler beim Partner hinzufügen",
"partner_page_select_partner": "Partner auswählen", "partner_page_select_partner": "Partner auswählen",
@@ -327,7 +324,7 @@
"permission_onboarding_permission_granted": "Berechtigung erteilt! Du bist startklar.", "permission_onboarding_permission_granted": "Berechtigung erteilt! Du bist startklar.",
"permission_onboarding_permission_limited": "Berechtigungen unzureichend. Um Immich das Sichern von ganzen Sammlungen zu ermöglichen, muss der Zugriff auf alle Fotos und Videos in den Einstellungen erlaubt werden.", "permission_onboarding_permission_limited": "Berechtigungen unzureichend. Um Immich das Sichern von ganzen Sammlungen zu ermöglichen, muss der Zugriff auf alle Fotos und Videos in den Einstellungen erlaubt werden.",
"permission_onboarding_request": "Immich benötigt Berechtigung um auf deine Fotos und Videos zuzugreifen.", "permission_onboarding_request": "Immich benötigt Berechtigung um auf deine Fotos und Videos zuzugreifen.",
"preferences_settings_title": "Voreinstellungen", "preferences_settings_title": "Preferences",
"profile_drawer_app_logs": "Logs", "profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Major-Version.", "profile_drawer_client_out_of_date_major": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Major-Version.",
"profile_drawer_client_out_of_date_minor": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.", "profile_drawer_client_out_of_date_minor": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.",
@@ -342,17 +339,17 @@
"recently_added_page_title": "Zuletzt hinzugefügt", "recently_added_page_title": "Zuletzt hinzugefügt",
"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": "Apply filter",
"search_filter_camera_make": "Marke", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Modell", "search_filter_camera_model": "Model",
"search_filter_display_option_archive": "Archiv", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Favorit", "search_filter_display_option_favorite": "Favorite",
"search_filter_display_option_not_in_album": "Nicht im Album", "search_filter_display_option_not_in_album": "Not in album",
"search_filter_location_city": "Stadt", "search_filter_location_city": "City",
"search_filter_location_country": "Land", "search_filter_location_country": "Country",
"search_filter_location_state": "Bundesland", "search_filter_location_state": "State",
"search_filter_media_type_all": "Alle", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Bild", "search_filter_media_type_image": "Image",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_page_categories": "Kategorien", "search_page_categories": "Kategorien",
"search_page_favorites": "Favoriten", "search_page_favorites": "Favoriten",
@@ -364,7 +361,7 @@
"search_page_person_add_name_dialog_hint": "Name", "search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "Speichern", "search_page_person_add_name_dialog_save": "Speichern",
"search_page_person_add_name_dialog_title": "Name hinzufügen", "search_page_person_add_name_dialog_title": "Name hinzufügen",
"search_page_person_add_name_subtitle": "Name für die Suche hinzufügen", "search_page_person_add_name_subtitle": "Name für die Suchfunktion hinzufügen",
"search_page_person_add_name_title": "Name hinzufügen", "search_page_person_add_name_title": "Name hinzufügen",
"search_page_person_edit_name": "Name bearbeiten", "search_page_person_edit_name": "Name bearbeiten",
"search_page_places": "Orte", "search_page_places": "Orte",
@@ -391,9 +388,8 @@
"setting_image_viewer_original_title": "Original laden", "setting_image_viewer_original_title": "Original laden",
"setting_image_viewer_preview_subtitle": "Aktivieren, um ein Bild mit mittlerer Auflösung zu laden. Deaktivieren, um entweder das Original direkt zu laden oder nur die Miniaturansicht zu verwenden.", "setting_image_viewer_preview_subtitle": "Aktivieren, um ein Bild mit mittlerer Auflösung zu laden. Deaktivieren, um entweder das Original direkt zu laden oder nur die Miniaturansicht zu verwenden.",
"setting_image_viewer_preview_title": "Vorschaubild laden", "setting_image_viewer_preview_title": "Vorschaubild laden",
"setting_image_viewer_title": "Bilder", "setting_languages_apply": "Apply",
"setting_languages_apply": "Anwenden", "setting_languages_title": "Languages",
"setting_languages_title": "Sprachen",
"setting_notifications_notify_failures_grace_period": "Benachrichtigung über Fehler bei der Hintergrundsicherung: {}", "setting_notifications_notify_failures_grace_period": "Benachrichtigung über Fehler bei der Hintergrundsicherung: {}",
"setting_notifications_notify_hours": "{} Stunden", "setting_notifications_notify_hours": "{} Stunden",
"setting_notifications_notify_immediately": "sofort", "setting_notifications_notify_immediately": "sofort",
@@ -407,14 +403,10 @@
"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 Gesamtfortschritt bei der Hintergrundsicherung",
"setting_pages_app_bar_settings": "Einstellungen", "setting_pages_app_bar_settings": "Einstellungen",
"setting_video_viewer_looping_subtitle": "Aktivieren, damit sich ein Video in der Detailansicht automatisch wiederholt.",
"setting_video_viewer_looping_title": "Wiederholen",
"setting_video_viewer_title": "Videos",
"settings_require_restart": "Bitte starte Immich neu, um diese Einstellung anzuwenden.", "settings_require_restart": "Bitte starte Immich neu, um diese Einstellung anzuwenden.",
"share_add": "Hinzufügen", "share_add": "Hinzufügen",
"share_add_photos": "Fotos hinzufügen", "share_add_photos": "Fotos hinzufügen",
"share_add_title": "Titel hinzufügen", "share_add_title": "Titel hinzufügen",
"share_assets_selected": "{} ausgewählt",
"share_create_album": "Album erstellen", "share_create_album": "Album erstellen",
"shared_album_activities_input_disable": "Kommentare sind deaktiviert.", "shared_album_activities_input_disable": "Kommentare sind deaktiviert.",
"shared_album_activities_input_hint": "Sag etwas", "shared_album_activities_input_hint": "Sag etwas",
@@ -433,7 +425,7 @@
"shared_link_clipboard_text": "Link: {}\nPasswort: {}", "shared_link_clipboard_text": "Link: {}\nPasswort: {}",
"shared_link_create_app_bar_title": "Link zum Teilen erstellen", "shared_link_create_app_bar_title": "Link zum Teilen erstellen",
"shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe", "shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe",
"shared_link_create_info": "Alle, die über diesen Link verfügen, können die Fotos sehen.", "shared_link_create_info": "Alle, die über den Link verfügen, können die Fotos sehen",
"shared_link_create_submit_button": "Link erstellen", "shared_link_create_submit_button": "Link erstellen",
"shared_link_edit_allow_download": "Jeder darf herunterladen", "shared_link_edit_allow_download": "Jeder darf herunterladen",
"shared_link_edit_allow_upload": "Jeder darf hochladen", "shared_link_edit_allow_upload": "Jeder darf hochladen",
@@ -448,31 +440,29 @@
"shared_link_edit_expire_after_option_hours": "{} Stunden", "shared_link_edit_expire_after_option_hours": "{} Stunden",
"shared_link_edit_expire_after_option_minute": "1 Minute", "shared_link_edit_expire_after_option_minute": "1 Minute",
"shared_link_edit_expire_after_option_minutes": "{} Minuten", "shared_link_edit_expire_after_option_minutes": "{} Minuten",
"shared_link_edit_expire_after_option_months": "{} Monat/en",
"shared_link_edit_expire_after_option_never": "Nie", "shared_link_edit_expire_after_option_never": "Nie",
"shared_link_edit_expire_after_option_year": "{} Jahr/en",
"shared_link_edit_password": "Passwort", "shared_link_edit_password": "Passwort",
"shared_link_edit_password_hint": "Passwort eingeben", "shared_link_edit_password_hint": "Passwort eingeben",
"shared_link_edit_show_meta": "Metadaten anzeigen", "shared_link_edit_show_meta": "Metadaten anzeigen",
"shared_link_edit_submit_button": "Link aktualisieren", "shared_link_edit_submit_button": "Link aktualisieren",
"shared_link_empty": "Du hast keine geteilten Links.", "shared_link_empty": "Du hast keine geteilten Links",
"shared_link_error_server_url_fetch": "Fehler beim Ermitteln der Server-URL", "shared_link_error_server_url_fetch": "Fehler beim Ermitteln der Server-URL",
"shared_link_expired": "Abgelaufen", "shared_link_expired": "Abgelaufen",
"shared_link_expires_day": "Verfällt in {} Tag", "shared_link_expires_day": "Verfällt in {} Tag",
"shared_link_expires_days": "Verfällt in {} Tag/en", "shared_link_expires_days": "Verfällt in {} Tagen",
"shared_link_expires_hour": "Verfällt in {} Stunde", "shared_link_expires_hour": "Verfällt in {} Stunde",
"shared_link_expires_hours": "Verfällt in {} Stunde/n", "shared_link_expires_hours": "Verfällt in {} Stunden",
"shared_link_expires_minute": "Verfällt in {} Minute", "shared_link_expires_minute": "Verfällt in {} Minute",
"shared_link_expires_minutes": "Verfällt in {} Minute/n", "shared_link_expires_minutes": "Verfällt in {} Minuten",
"shared_link_expires_never": "Läuft nie ab", "shared_link_expires_never": "Läuft nie ab",
"shared_link_expires_second": "Verfällt in {} Sekunde", "shared_link_expires_second": "Verfällt in {} Sekunde",
"shared_link_expires_seconds": "Verfällt in {} Sekunde/n", "shared_link_expires_seconds": "Verfällt in {} Sekunden",
"shared_link_individual_shared": "Individuell geteilt", "shared_link_individual_shared": "Individual shared",
"shared_link_info_chip_download": "Herunterladen", "shared_link_info_chip_download": "Herunterladen",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Hochladen", "shared_link_info_chip_upload": "Hochladen",
"shared_link_manage_links": "Geteilte Links verwalten", "shared_link_manage_links": "Geteilte Links verwalten",
"shared_link_public_album": "Öffentliches Album", "shared_link_public_album": "Public album",
"share_done": "Fertig", "share_done": "Fertig",
"share_invite": "Zum Album einladen", "share_invite": "Zum Album einladen",
"sharing_page_album": "Geteilte Alben", "sharing_page_album": "Geteilte Alben",
@@ -499,9 +489,9 @@
"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",
"trash_page_empty_trash_dialog_content": "Elemente im Papierkorb löschen? Diese Elemente werden dauerhaft aus Immich entfernt", "trash_page_empty_trash_dialog_content": "Elemente im Papierkorb löschen? Diese Elemente werden dauerhaft von Immich entfernt",
"trash_page_empty_trash_dialog_ok": "Ok", "trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Elemente im Papierkorb werden nach {} Tagen endgültig gelöscht.", "trash_page_info": "Elemente im Papierkorb werden nach {} Tagen endgültig gelöscht",
"trash_page_no_assets": "Keine Elemente im Papierkorb", "trash_page_no_assets": "Keine Elemente im Papierkorb",
"trash_page_restore": "Wiederherstellen", "trash_page_restore": "Wiederherstellen",
"trash_page_restore_all": "Alle wiederherstellen", "trash_page_restore_all": "Alle wiederherstellen",
-6
View File
@@ -201,8 +201,6 @@
"experimental_settings_title": "Πειραματικό", "experimental_settings_title": "Πειραματικό",
"favorites_page_no_favorites": "Δεν βρέθηκαν αγαπημένα στοιχεία", "favorites_page_no_favorites": "Δεν βρέθηκαν αγαπημένα στοιχεία",
"favorites_page_title": "Αγαπημένα", "favorites_page_title": "Αγαπημένα",
"haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback",
"home_page_add_to_album_conflicts": "Προστέθηκαν {added} στοιχεία στο άλμπουμ {album}. {failed} στοιχεία υπάρχουν ήδη στο άλμπουμ.", "home_page_add_to_album_conflicts": "Προστέθηκαν {added} στοιχεία στο άλμπουμ {album}. {failed} στοιχεία υπάρχουν ήδη στο άλμπουμ.",
"home_page_add_to_album_err_local": "Δεν είναι ακόμη δυνατή η προσθήκη τοπικών στοιχείων σε άλμπουμ, παράβλεψη", "home_page_add_to_album_err_local": "Δεν είναι ακόμη δυνατή η προσθήκη τοπικών στοιχείων σε άλμπουμ, παράβλεψη",
"home_page_add_to_album_success": "Προστέθηκαν {added} στοιχεία στο άλμπουμ {album}.", "home_page_add_to_album_success": "Προστέθηκαν {added} στοιχεία στο άλμπουμ {album}.",
@@ -299,7 +297,6 @@
"motion_photos_page_title": "Motion Photos", "motion_photos_page_title": "Motion Photos",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show",
"notification_permission_dialog_cancel": "Cancel", "notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.", "notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Settings", "notification_permission_dialog_settings": "Settings",
@@ -410,7 +407,6 @@
"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_create_album": "Create album", "share_create_album": "Create album",
"shared_album_activities_input_disable": "Το σχόλιο είναι απενεργοποιημένο", "shared_album_activities_input_disable": "Το σχόλιο είναι απενεργοποιημένο",
"shared_album_activities_input_hint": "Say something", "shared_album_activities_input_hint": "Say something",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} hours", "shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Never", "shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_password": "Password", "shared_link_edit_password": "Password",
"shared_link_edit_password_hint": "Enter the share password", "shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_show_meta": "Show metadata", "shared_link_edit_show_meta": "Show metadata",
+4 -9
View File
@@ -201,8 +201,6 @@
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No favorite assets found", "favorites_page_no_favorites": "No favorite assets found",
"favorites_page_title": "Favorites", "favorites_page_title": "Favorites",
"haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.", "home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping", "home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_success": "Added {added} assets to album {album}.", "home_page_add_to_album_success": "Added {added} assets to album {album}.",
@@ -391,7 +389,6 @@
"setting_image_viewer_original_title": "Load original image", "setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.", "setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image", "setting_image_viewer_preview_title": "Load preview image",
"setting_image_viewer_title": "Images",
"setting_languages_apply": "Apply", "setting_languages_apply": "Apply",
"setting_languages_title": "Languages", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}", "setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
@@ -407,14 +404,10 @@
"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",
"setting_video_viewer_looping_subtitle": "Enable to automatically loop a video in the detail viewer.",
"setting_video_viewer_looping_title": "Looping",
"setting_video_viewer_title": "Videos",
"settings_require_restart": "Please restart Immich to apply this setting", "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_create_album": "Create album", "share_create_album": "Create 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",
@@ -449,8 +442,8 @@
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months", "shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "{} year", "shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_password": "Password", "shared_link_edit_password": "Password",
"shared_link_edit_password_hint": "Enter the share password", "shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_show_meta": "Show metadata", "shared_link_edit_show_meta": "Show metadata",
@@ -520,5 +513,7 @@
"version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89", "version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89",
"viewer_remove_from_stack": "Remove from Stack", "viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset", "viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack" "viewer_unstack": "Un-Stack",
"haptic_feedback_title": "Haptic Feedback",
"haptic_feedback_switch": "Enable haptic feedback"
} }
+81 -87
View File
@@ -1,13 +1,13 @@
{ {
"action_common_back": "Atrás", "action_common_back": "Back",
"action_common_cancel": "Cancelar", "action_common_cancel": "Cancelar",
"action_common_clear": "Limpiar", "action_common_clear": "Clear",
"action_common_confirm": "Confirmar", "action_common_confirm": "Confirm",
"action_common_update": "Actualizar", "action_common_update": "Actualizar",
"add_to_album_bottom_sheet_added": "Agregado a {album}", "add_to_album_bottom_sheet_added": "Agregado a {album}",
"add_to_album_bottom_sheet_already_exists": "Ya se encuentra en {album}", "add_to_album_bottom_sheet_already_exists": "Ya se encuentra en {album}",
"advanced_settings_log_level_title": "Nivel de registro: {}", "advanced_settings_log_level_title": "Nivel de log: {}",
"advanced_settings_prefer_remote_subtitle": "Algunos dispositivos tardan mucho en cargar las miniaturas de los elementos encontrados en el dispositivo. Activa esta opción para cargar imágenes remotas en su lugar.", "advanced_settings_prefer_remote_subtitle": "Algunos dispositivos tardan mucho en cargar las miniaturas de recursos encontrados el dispositivo. Activa esta opción para cargar imágenes remotas en su lugar.",
"advanced_settings_prefer_remote_title": "Preferir imágenes remotas", "advanced_settings_prefer_remote_title": "Preferir imágenes remotas",
"advanced_settings_self_signed_ssl_subtitle": "Omitir verificación del certificado SSL del servidor. Requerido para certificados autofirmados", "advanced_settings_self_signed_ssl_subtitle": "Omitir verificación del certificado SSL del servidor. Requerido para certificados autofirmados",
"advanced_settings_self_signed_ssl_title": "Permitir certificados autofirmados", "advanced_settings_self_signed_ssl_title": "Permitir certificados autofirmados",
@@ -22,48 +22,48 @@
"album_thumbnail_card_shared": "Compartido", "album_thumbnail_card_shared": "Compartido",
"album_thumbnail_owned": "Propio", "album_thumbnail_owned": "Propio",
"album_thumbnail_shared_by": "Compartido por {}", "album_thumbnail_shared_by": "Compartido por {}",
"album_viewer_appbar_delete_confirm": "¿Estás seguro/a que quieres borrar este álbum de tu cuenta?", "album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
"album_viewer_appbar_share_delete": "Eliminar álbum ", "album_viewer_appbar_share_delete": "Eliminar álbum ",
"album_viewer_appbar_share_err_delete": "No ha podido eliminar el álbum", "album_viewer_appbar_share_err_delete": "No ha podido eliminar el álbum",
"album_viewer_appbar_share_err_leave": "No se ha podido abandonar el álbum", "album_viewer_appbar_share_err_leave": "No se ha podido abandonar el álbum",
"album_viewer_appbar_share_err_remove": "Hay problemas para eliminar los elementos del álbum", "album_viewer_appbar_share_err_remove": "Hay problemas para eliminar los archivos del álbum",
"album_viewer_appbar_share_err_title": "Error al cambiar el título del álbum ", "album_viewer_appbar_share_err_title": "Error al cambiar el título del álbum ",
"album_viewer_appbar_share_leave": "Abandonar álbum ", "album_viewer_appbar_share_leave": "Abandonar álbum ",
"album_viewer_appbar_share_remove": "Eliminar del álbum ", "album_viewer_appbar_share_remove": "Eliminar del álbum ",
"album_viewer_appbar_share_to": "Compartir Con", "album_viewer_appbar_share_to": "Compartir A",
"album_viewer_page_share_add_users": "Agregar usuarios", "album_viewer_page_share_add_users": "Agregar usuarios",
"all_people_page_title": "Personas", "all_people_page_title": "Personas",
"all_videos_page_title": "Videos", "all_videos_page_title": "Videos",
"app_bar_signout_dialog_content": "¿Estás seguro que quieres cerrar sesión?", "app_bar_signout_dialog_content": "¿Estás seguro que quieres cerrar sesión?",
"app_bar_signout_dialog_ok": "Sí", "app_bar_signout_dialog_ok": "Sí",
"app_bar_signout_dialog_title": "Cerrar sesión", "app_bar_signout_dialog_title": "Cerrar sesión",
"archive_page_no_archived_assets": "No se encontraron elementos archivados", "archive_page_no_archived_assets": "No se encontraron recursos archivados",
"archive_page_title": "Archivo ({})", "archive_page_title": "Archivo ({})",
"asset_action_delete_err_read_only": "No se pueden borrar el archivo(s) de solo lectura, omitiendo", "asset_action_delete_err_read_only": "No se pueden borrar los archivos de solo lectura. Saltando.",
"asset_action_share_err_offline": "No se pudo obtener el archivo(s) sin conexión, omitiendo", "asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_group_by_sub_title": "Agrupar por", "asset_list_group_by_sub_title": "Group by",
"asset_list_layout_settings_dynamic_layout_title": "Diseño dinámico", "asset_list_layout_settings_dynamic_layout_title": "Diseño dinámico",
"asset_list_layout_settings_group_automatically": "Automatico", "asset_list_layout_settings_group_automatically": "Automatico",
"asset_list_layout_settings_group_by": "Agrupar elementos por", "asset_list_layout_settings_group_by": "Agrupar recursos por",
"asset_list_layout_settings_group_by_month": "Mes", "asset_list_layout_settings_group_by_month": "Mes",
"asset_list_layout_settings_group_by_month_day": "Mes + día", "asset_list_layout_settings_group_by_month_day": "Mes + día",
"asset_list_layout_sub_title": "Disposición", "asset_list_layout_sub_title": "Layout",
"asset_list_settings_subtitle": "Configuraciones del diseño de la cuadrícula de fotos", "asset_list_settings_subtitle": "Configuraciones del diseño de la cuadrícula de fotos",
"asset_list_settings_title": "Cuadrícula de fotos", "asset_list_settings_title": "Cuadrícula de fotos",
"asset_viewer_settings_title": "Visor de Archivos", "asset_viewer_settings_title": "Asset Viewer",
"backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({})", "backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({})",
"backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir", "backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir",
"backup_album_selection_page_assets_scatter": "Los elementos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.", "backup_album_selection_page_assets_scatter": "Los archivos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.",
"backup_album_selection_page_select_albums": "Seleccionar Álbumes", "backup_album_selection_page_select_albums": "Seleccionar Álbumes",
"backup_album_selection_page_selection_info": "Información sobre la Selección", "backup_album_selection_page_selection_info": "Información sobre la Selección",
"backup_album_selection_page_total_assets": "Total de elementos únicos", "backup_album_selection_page_total_assets": "Total de archivos únicos",
"backup_all": "Todos", "backup_all": "Todos",
"backup_background_service_backup_failed_message": "Error al copiar elementos. Reintentando...", "backup_background_service_backup_failed_message": "Error al copiar archivos. Reintentando...",
"backup_background_service_connection_failed_message": "Error al conectar con el servidor. Reintentando...", "backup_background_service_connection_failed_message": "Error al conectar con el servidor. Reintentando...",
"backup_background_service_current_upload_notification": "Cargando {}", "backup_background_service_current_upload_notification": "Cargando {}",
"backup_background_service_default_notification": "Verificando si hay nuevos elementos", "backup_background_service_default_notification": "Verificando si hay nuevos archivos",
"backup_background_service_error_title": "Error de copia de seguridad", "backup_background_service_error_title": "Error de copia de seguridad",
"backup_background_service_in_progress_notification": "Creando copia de seguridad de tus elementos...", "backup_background_service_in_progress_notification": "Creando copia de seguridad de tus archivos...",
"backup_background_service_upload_failure_notification": "Error al cargar {}", "backup_background_service_upload_failure_notification": "Error al cargar {}",
"backup_controller_page_albums": "Álbumes de copia de seguridad", "backup_controller_page_albums": "Álbumes de copia de seguridad",
"backup_controller_page_background_app_refresh_disabled_content": "Activa la actualización en segundo plano de la aplicación en Configuración > General > Actualización en segundo plano para usar la copia de seguridad en segundo plano.", "backup_controller_page_background_app_refresh_disabled_content": "Activa la actualización en segundo plano de la aplicación en Configuración > General > Actualización en segundo plano para usar la copia de seguridad en segundo plano.",
@@ -76,7 +76,7 @@
"backup_controller_page_background_charging": "Solo mientras se carga", "backup_controller_page_background_charging": "Solo mientras se carga",
"backup_controller_page_background_configure_error": "Error al configurar el servicio en segundo plano", "backup_controller_page_background_configure_error": "Error al configurar el servicio en segundo plano",
"backup_controller_page_background_delay": "Retraso en la copia de seguridad de nuevos elementos: {}", "backup_controller_page_background_delay": "Retraso en la copia de seguridad de nuevos elementos: {}",
"backup_controller_page_background_description": "Activa el servicio en segundo plano para copiar automáticamente cualquier nuevos elementos sin necesidad de abrir la aplicación.", "backup_controller_page_background_description": "Activa el servicio en segundo plano para copiar automáticamente cualquier nuevos archivos sin necesidad de abrir la aplicación.",
"backup_controller_page_background_is_off": "La copia de seguridad en segundo plano automática está desactivada", "backup_controller_page_background_is_off": "La copia de seguridad en segundo plano automática está desactivada",
"backup_controller_page_background_is_on": "La copia de seguridad en segundo plano automática está activada", "backup_controller_page_background_is_on": "La copia de seguridad en segundo plano automática está activada",
"backup_controller_page_background_turn_off": "Desactivar el servicio en segundo plano", "backup_controller_page_background_turn_off": "Desactivar el servicio en segundo plano",
@@ -109,28 +109,28 @@
"backup_controller_page_turn_on": "Activar la copia de seguridad", "backup_controller_page_turn_on": "Activar la copia de seguridad",
"backup_controller_page_uploading_file_info": "Cargando información del archivo", "backup_controller_page_uploading_file_info": "Cargando información del archivo",
"backup_err_only_album": "No se puede eliminar el único álbum", "backup_err_only_album": "No se puede eliminar el único álbum",
"backup_info_card_assets": "elementos", "backup_info_card_assets": "archivos",
"backup_manual_cancelled": "Cancelado", "backup_manual_cancelled": "Cancelado",
"backup_manual_failed": "Fallido", "backup_manual_failed": "Fallido",
"backup_manual_in_progress": "Subida en progreso. Espere", "backup_manual_in_progress": "Subida en progreso. Espere",
"backup_manual_success": "Éxito", "backup_manual_success": "Éxito",
"backup_manual_title": "Estado de la subida", "backup_manual_title": "Estado de la subida",
"backup_options_page_title": "Opciones de Copia de Seguridad", "backup_options_page_title": "Backup options",
"cache_settings_album_thumbnails": "Miniaturas de la página de la biblioteca ({} elementos)", "cache_settings_album_thumbnails": "Miniaturas de la página de la biblioteca ({} archivos)",
"cache_settings_clear_cache_button": "Borrar caché", "cache_settings_clear_cache_button": "Borrar caché",
"cache_settings_clear_cache_button_title": "Borra la caché de la aplicación. Esto afectará significativamente el rendimiento de la aplicación hasta que se reconstruya la caché.", "cache_settings_clear_cache_button_title": "Borra la caché de la aplicación. Esto afectará significativamente el rendimiento de la aplicación hasta que se reconstruya la caché.",
"cache_settings_duplicated_assets_clear_button": "LIMPIAR", "cache_settings_duplicated_assets_clear_button": "LIMPIAR",
"cache_settings_duplicated_assets_subtitle": "Fotos y vídeos en la lista negra de la app", "cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Elementos duplicados ({})", "cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_image_cache_size": "Tamaño de la caché de imágenes ({} elementos)", "cache_settings_image_cache_size": "Tamaño de la caché de imágenes ({} archivos)",
"cache_settings_statistics_album": "Miniaturas de la biblioteca", "cache_settings_statistics_album": "Miniaturas de la biblioteca",
"cache_settings_statistics_assets": "{} elementos ({})", "cache_settings_statistics_assets": "{} archivos ({})",
"cache_settings_statistics_full": "Imágenes completas", "cache_settings_statistics_full": "Imágenes completas",
"cache_settings_statistics_shared": "Miniaturas de álbumes compartidos", "cache_settings_statistics_shared": "Miniaturas de álbumes compartidos",
"cache_settings_statistics_thumbnail": "Miniaturas", "cache_settings_statistics_thumbnail": "Miniaturas",
"cache_settings_statistics_title": "Uso de caché", "cache_settings_statistics_title": "Uso de caché",
"cache_settings_subtitle": "Controla el comportamiento del almacenamiento en caché de la aplicación móvil Immich", "cache_settings_subtitle": "Controla el comportamiento del almacenamiento en caché de la aplicación móvil Immich",
"cache_settings_thumbnail_size": "Tamaño de la caché de miniaturas ({} elementos)", "cache_settings_thumbnail_size": "Tamaño de la caché de miniaturas ({} archivos)",
"cache_settings_tile_subtitle": "Controla el comportamiento del almacenamiento local", "cache_settings_tile_subtitle": "Controla el comportamiento del almacenamiento local",
"cache_settings_tile_title": "Almacenamiento local", "cache_settings_tile_title": "Almacenamiento local",
"cache_settings_title": "Configuración de la caché", "cache_settings_title": "Configuración de la caché",
@@ -160,12 +160,12 @@
"control_bottom_app_bar_stack": "Apilar", "control_bottom_app_bar_stack": "Apilar",
"control_bottom_app_bar_trash_from_immich": "Mover a la papelera", "control_bottom_app_bar_trash_from_immich": "Mover a la papelera",
"control_bottom_app_bar_unarchive": "Desarchivar", "control_bottom_app_bar_unarchive": "Desarchivar",
"control_bottom_app_bar_unfavorite": "Retirar favorito", "control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Subir", "control_bottom_app_bar_upload": "Subir",
"create_album_page_untitled": "Sin título", "create_album_page_untitled": "Sin título",
"create_shared_album_page_create": "Crear", "create_shared_album_page_create": "Crear",
"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 ARCHIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos", "create_shared_album_page_share_select_photos": "Seleccionar Fotos",
"curated_location_page_title": "Lugares", "curated_location_page_title": "Lugares",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
@@ -178,10 +178,10 @@
"delete_dialog_alert_remote": "Estas imágenes van a ser borradas de forma permanente del servidor Immich", "delete_dialog_alert_remote": "Estas imágenes van a ser borradas de forma permanente del servidor Immich",
"delete_dialog_cancel": "Cancelar", "delete_dialog_cancel": "Cancelar",
"delete_dialog_ok": "Eliminar", "delete_dialog_ok": "Eliminar",
"delete_dialog_ok_force": "Borrar de todos modos", "delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_title": "Eliminar Permanentemente", "delete_dialog_title": "Eliminar Permanentemente",
"delete_local_dialog_ok_backed_up_only": "Borrar solo las que tengan copia de seguridad", "delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Borrar de todos modos", "delete_local_dialog_ok_force": "Delete Anyway",
"delete_shared_link_dialog_content": "Estás seguro que quieres eliminar este enlace compartido", "delete_shared_link_dialog_content": "Estás seguro que quieres eliminar este enlace compartido",
"delete_shared_link_dialog_title": "Eliminar enlace compartido", "delete_shared_link_dialog_title": "Eliminar enlace compartido",
"description_input_hint_text": "Agregar descripción...", "description_input_hint_text": "Agregar descripción...",
@@ -193,32 +193,30 @@
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN", "exif_bottom_sheet_location": "UBICACIÓN",
"exif_bottom_sheet_location_add": "Añadir ubicación", "exif_bottom_sheet_location_add": "Añadir ubicación",
"exif_bottom_sheet_people": "PERSONAS", "exif_bottom_sheet_people": "PEOPLE",
"exif_bottom_sheet_person_add_person": "Añadir nombre", "exif_bottom_sheet_person_add_person": "Add name",
"experimental_settings_new_asset_list_subtitle": "Trabajo en progreso", "experimental_settings_new_asset_list_subtitle": "Trabajo en progreso",
"experimental_settings_new_asset_list_title": "Habilitar cuadrícula fotográfica experimental", "experimental_settings_new_asset_list_title": "Habilitar cuadrícula fotográfica experimental",
"experimental_settings_subtitle": "Úsalo bajo tu responsabilidad", "experimental_settings_subtitle": "Úsalo bajo tu responsabilidad",
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No se encontraron elementos marcados como favoritos", "favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos",
"favorites_page_title": "Favoritos", "favorites_page_title": "Favoritos",
"haptic_feedback_switch": "Activar respuesta háptica",
"haptic_feedback_title": "Respuesta Háptica",
"home_page_add_to_album_conflicts": "{added} elementos agregados al álbum {album}.{failed} elementos ya existen en el álbum.", "home_page_add_to_album_conflicts": "{added} elementos agregados al álbum {album}.{failed} elementos ya existen en el álbum.",
"home_page_add_to_album_err_local": "Aún no se pueden agregar elementos locales a álbumes, omitiendo", "home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo",
"home_page_add_to_album_success": "{added} elementos agregados al álbum {album}. ", "home_page_add_to_album_success": "{added} elementos agregados al álbum {album}. ",
"home_page_album_err_partner": "Aún no se pueden agregar elementos a un álbum de un compañero, omitiendo", "home_page_album_err_partner": "Aún no se pueden agregar activos a un album de un compañero, omitiendo",
"home_page_archive_err_local": "Los elementos locales no pueden ser archivados, omitiendo", "home_page_archive_err_local": "Los recursos locales no pueden ser archivados, omitiendo",
"home_page_archive_err_partner": "No se pueden archivar elementos de un compañero, omitiendo", "home_page_archive_err_partner": "No se pueden archivar activos de un compañero, omitiendo",
"home_page_building_timeline": "Construyendo la línea de tiempo", "home_page_building_timeline": "Construyendo la línea de tiempo",
"home_page_delete_err_partner": "No se pueden eliminar elementos de un compañero, omitiendo", "home_page_delete_err_partner": "No se pueden eliminar activos de un compañero, omitiendo",
"home_page_delete_remote_err_local": "Elementos locales en la selección de eliminación remota, omitiendo", "home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_favorite_err_local": "Aún no se pueden archivar elementos locales, omitiendo", "home_page_favorite_err_local": "Aún no se pueden archivar recursos locales, omitiendo",
"home_page_favorite_err_partner": "Aún no se pueden marcar elementos de compañeros como favoritos, omitiendo", "home_page_favorite_err_partner": "Aún no se pueden marcar recursos de compañeros como favoritos, omitiendo",
"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 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_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",
"image_viewer_page_state_provider_share_error": "Error al compartir", "image_viewer_page_state_provider_share_error": "Error al compartir",
"library_page_albums": "Álbumes", "library_page_albums": "Álbumes",
@@ -227,7 +225,7 @@
"library_page_favorites": "Favoritos", "library_page_favorites": "Favoritos",
"library_page_new_album": "Nuevo álbum", "library_page_new_album": "Nuevo álbum",
"library_page_sharing": "Compartiendo", "library_page_sharing": "Compartiendo",
"library_page_sort_asset_count": "Número de elementos", "library_page_sort_asset_count": "Número de archivos",
"library_page_sort_created": "Creado más recientemente", "library_page_sort_created": "Creado más recientemente",
"library_page_sort_last_modified": "Última modificación", "library_page_sort_last_modified": "Última modificación",
"library_page_sort_most_oldest_photo": "Foto más antigua", "library_page_sort_most_oldest_photo": "Foto más antigua",
@@ -286,28 +284,27 @@
"map_settings_dialog_save": "Guardar", "map_settings_dialog_save": "Guardar",
"map_settings_dialog_title": "Ajustes mapa", "map_settings_dialog_title": "Ajustes mapa",
"map_settings_include_show_archived": "Incluir archivados", "map_settings_include_show_archived": "Incluir archivados",
"map_settings_include_show_partners": "Incluir Parejas", "map_settings_include_show_partners": "Include Partners",
"map_settings_only_relative_range": "Rango de fechas", "map_settings_only_relative_range": "Rango de fechas",
"map_settings_only_show_favorites": "Mostrar solo favoritas", "map_settings_only_show_favorites": "Mostrar solo favoritas",
"map_settings_theme_settings": "Apariencia del Mapa", "map_settings_theme_settings": "Apariencia del Mapa",
"map_zoom_to_see_photos": "Alejar para ver fotos", "map_zoom_to_see_photos": "Alejar para ver fotos",
"memories_all_caught_up": "Puesto al día", "memories_all_caught_up": "All caught up",
"memories_check_back_tomorrow": "Vuelve mañana para más recuerdos", "memories_check_back_tomorrow": "Check back tomorrow for more memories",
"memories_start_over": "Empezar de nuevo", "memories_start_over": "Start Over",
"memories_swipe_to_close": "Desliza para cerrar", "memories_swipe_to_close": "Swipe up to close",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Foto en Movimiento", "motion_photos_page_title": "Foto en Movimiento",
"multiselect_grid_edit_date_time_err_read_only": "No se puede cambiar la fecha del archivo(s) de solo lectura, omitiendo", "multiselect_grid_edit_date_time_err_read_only": "No se puede cambiar la fecha de archivos de solo lectura. Saltando.",
"multiselect_grid_edit_gps_err_read_only": "No se puede cambiar la localización de archivos de solo lectura. Saltando.", "multiselect_grid_edit_gps_err_read_only": "No se puede cambiar la localización de archivos de solo lectura. Saltando.",
"no_assets_to_show": "No hay elementos a mostrar",
"notification_permission_dialog_cancel": "Cancelar", "notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.", "notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.",
"notification_permission_dialog_settings": "Ajustes", "notification_permission_dialog_settings": "Ajustes",
"notification_permission_list_tile_content": "Concede permiso para habilitar las notificaciones.", "notification_permission_list_tile_content": "Concede permiso para habilitar las notificaciones.",
"notification_permission_list_tile_enable_button": "Permitir notificaciones", "notification_permission_list_tile_enable_button": "Permitir notificaciones",
"notification_permission_list_tile_title": "Permisos de Notificacion", "notification_permission_list_tile_title": "Permisos de Notificacion",
"partner_list_user_photos": "Fotos de {user}", "partner_list_user_photos": "{user}'s photos",
"partner_list_view_all": "Ver todas", "partner_list_view_all": "View all",
"partner_page_add_partner": "Agregar compañero", "partner_page_add_partner": "Agregar compañero",
"partner_page_empty_message": "Tus fotos aún no se han compartido con ningún compañero.", "partner_page_empty_message": "Tus fotos aún no se han compartido con ningún compañero.",
"partner_page_no_more_users": "No hay más usuarios para agregar", "partner_page_no_more_users": "No hay más usuarios para agregar",
@@ -327,33 +324,33 @@
"permission_onboarding_permission_granted": "¡Permiso concedido! Todo listo.", "permission_onboarding_permission_granted": "¡Permiso concedido! Todo listo.",
"permission_onboarding_permission_limited": "Permiso limitado. Para permitir que Immich haga copia de seguridad y gestione toda tu colección de galería, concede permisos de fotos y videos en Configuración.", "permission_onboarding_permission_limited": "Permiso limitado. Para permitir que Immich haga copia de seguridad y gestione toda tu colección de galería, concede permisos de fotos y videos en Configuración.",
"permission_onboarding_request": "Immich requiere permiso para ver tus fotos y videos.", "permission_onboarding_request": "Immich requiere permiso para ver tus fotos y videos.",
"preferences_settings_title": "Preferencias", "preferences_settings_title": "Preferences",
"profile_drawer_app_logs": "Registros", "profile_drawer_app_logs": "Registros",
"profile_drawer_client_out_of_date_major": "La app está desactualizada. Por favor actualiza a la última versión principal.", "profile_drawer_client_out_of_date_major": "La app de móvil está desactualizada. Por favor actualiza a la última versión principal",
"profile_drawer_client_out_of_date_minor": "La app está desactualizada. Por favor actualiza a la última versión menor.", "profile_drawer_client_out_of_date_minor": "La app de móvil está desactualizada. Por favor actualiza a la última versión menor",
"profile_drawer_client_server_up_to_date": "El Cliente y el Servidor están actualizados", "profile_drawer_client_server_up_to_date": "El Cliente y el Servidor están actualizados",
"profile_drawer_documentation": "Documentación", "profile_drawer_documentation": "Documentación",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "El servidor está desactualizado. Por favor actualiza a la última versión principal.", "profile_drawer_server_out_of_date_major": "El servidor está desactualizado. Por favor actualiza a la última versión principal",
"profile_drawer_server_out_of_date_minor": "El servidor está desactualizado. Por favor actualiza a la última versión menor.", "profile_drawer_server_out_of_date_minor": "El servidor está desactualizado. Por favor actualiza a la última versión menor",
"profile_drawer_settings": "Configuración", "profile_drawer_settings": "Configuración",
"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",
"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": "Apply filter",
"search_filter_camera_make": "Marca", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Modelo", "search_filter_camera_model": "Model",
"search_filter_display_option_archive": "Archivado", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Favorito", "search_filter_display_option_favorite": "Favorite",
"search_filter_display_option_not_in_album": "No en álbum", "search_filter_display_option_not_in_album": "Not in album",
"search_filter_location_city": "Ciudad", "search_filter_location_city": "City",
"search_filter_location_country": "País", "search_filter_location_country": "Country",
"search_filter_location_state": "Estado", "search_filter_location_state": "State",
"search_filter_media_type_all": "Todos", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Imagen", "search_filter_media_type_image": "Image",
"search_filter_media_type_video": "Vídeo", "search_filter_media_type_video": "Video",
"search_page_categories": "Categorías", "search_page_categories": "Categorías",
"search_page_favorites": "Favoritos", "search_page_favorites": "Favoritos",
"search_page_motion_photos": "Foto en Movimiento", "search_page_motion_photos": "Foto en Movimiento",
@@ -391,8 +388,8 @@
"setting_image_viewer_original_title": "Cargar imagen original", "setting_image_viewer_original_title": "Cargar imagen original",
"setting_image_viewer_preview_subtitle": "Activar para cargar una imagen de resolución media. Deshabilitar para cargar directamente la imagen original o usar una miniatura.", "setting_image_viewer_preview_subtitle": "Activar para cargar una imagen de resolución media. Deshabilitar para cargar directamente la imagen original o usar una miniatura.",
"setting_image_viewer_preview_title": "Cargar imagen de previsualización", "setting_image_viewer_preview_title": "Cargar imagen de previsualización",
"setting_languages_apply": "Aplicar", "setting_languages_apply": "Apply",
"setting_languages_title": "Idiomas", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "Notificar fallos de copia de seguridad en segundo plano: {}", "setting_notifications_notify_failures_grace_period": "Notificar fallos de copia de seguridad en segundo plano: {}",
"setting_notifications_notify_hours": "{} horas", "setting_notifications_notify_hours": "{} horas",
"setting_notifications_notify_immediately": "inmediatamente", "setting_notifications_notify_immediately": "inmediatamente",
@@ -403,14 +400,13 @@
"setting_notifications_single_progress_title": "Mostrar progreso detallado de copia de seguridad en segundo plano", "setting_notifications_single_progress_title": "Mostrar progreso detallado de copia de seguridad en segundo plano",
"setting_notifications_subtitle": "Ajusta tus preferencias de notificación", "setting_notifications_subtitle": "Ajusta tus preferencias de notificación",
"setting_notifications_title": "Notificaciones", "setting_notifications_title": "Notificaciones",
"setting_notifications_total_progress_subtitle": "Progreso general de subida (elementos completados/total)", "setting_notifications_total_progress_subtitle": "Progreso general de subida (archivos completados/total)",
"setting_notifications_total_progress_title": "Mostrar progreso total de copia de seguridad en segundo plano", "setting_notifications_total_progress_title": "Mostrar progreso total de copia de seguridad en segundo plano",
"setting_pages_app_bar_settings": "Ajustes", "setting_pages_app_bar_settings": "Ajustes",
"settings_require_restart": "Por favor, reinicia Immich para aplicar este ajuste", "settings_require_restart": "Por favor, reinicia Immich para aplicar este ajuste",
"share_add": "Agregar", "share_add": "Agregar",
"share_add_photos": "Agregar fotos", "share_add_photos": "Agregar fotos",
"share_add_title": "Agregar un título", "share_add_title": "Agregar un título",
"share_assets_selected": "{} selected",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"shared_album_activities_input_disable": "Los comentarios están deshabilitados", "shared_album_activities_input_disable": "Los comentarios están deshabilitados",
"shared_album_activities_input_hint": "Comenta algo", "shared_album_activities_input_hint": "Comenta algo",
@@ -418,11 +414,11 @@
"shared_album_activity_remove_title": "Eliminar Actividad", "shared_album_activity_remove_title": "Eliminar Actividad",
"shared_album_activity_setting_subtitle": "Permitir que otros respondan", "shared_album_activity_setting_subtitle": "Permitir que otros respondan",
"shared_album_activity_setting_title": "Comentarios y me gusta", "shared_album_activity_setting_title": "Comentarios y me gusta",
"shared_album_section_people_action_error": "Error retirando/eliminando del album", "shared_album_section_people_action_error": "Error dejando/eliminando del album",
"shared_album_section_people_action_leave": "Eliminar usuario del album", "shared_album_section_people_action_leave": "Eliminar usuario del album",
"shared_album_section_people_action_remove_user": "Eliminar usuario del album", "shared_album_section_people_action_remove_user": "Eliminar usuario del album",
"shared_album_section_people_owner_label": "Propietario", "shared_album_section_people_owner_label": "Propietario",
"shared_album_section_people_title": "PERSONAS", "shared_album_section_people_title": "GENTE",
"share_dialog_preparing": "Preparando...", "share_dialog_preparing": "Preparando...",
"shared_link_app_bar_title": "Enlaces compartidos", "shared_link_app_bar_title": "Enlaces compartidos",
"shared_link_clipboard_copied_massage": "Copiado al portapapeles", "shared_link_clipboard_copied_massage": "Copiado al portapapeles",
@@ -444,9 +440,7 @@
"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": "{} meses",
"shared_link_edit_expire_after_option_never": "Nunca", "shared_link_edit_expire_after_option_never": "Nunca",
"shared_link_edit_expire_after_option_year": "{} año",
"shared_link_edit_password": "Contraseña", "shared_link_edit_password": "Contraseña",
"shared_link_edit_password_hint": "Introduce la contraseña del enlace", "shared_link_edit_password_hint": "Introduce la contraseña del enlace",
"shared_link_edit_show_meta": "Mostrar metadatos", "shared_link_edit_show_meta": "Mostrar metadatos",
@@ -463,12 +457,12 @@
"shared_link_expires_never": "Caduca ∞", "shared_link_expires_never": "Caduca ∞",
"shared_link_expires_second": "Caduca en {} segundo", "shared_link_expires_second": "Caduca en {} segundo",
"shared_link_expires_seconds": "Caduca en {} segundos", "shared_link_expires_seconds": "Caduca en {} segundos",
"shared_link_individual_shared": "Compartido individualmente", "shared_link_individual_shared": "Individual shared",
"shared_link_info_chip_download": "Descargar", "shared_link_info_chip_download": "Descargar",
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Subir", "shared_link_info_chip_upload": "Subir",
"shared_link_manage_links": "Administrar enlaces compartidos", "shared_link_manage_links": "Administrar enlaces compartidos",
"shared_link_public_album": "Álbum público ", "shared_link_public_album": "Public album",
"share_done": "Hecho", "share_done": "Hecho",
"share_invite": "Invitar al álbum", "share_invite": "Invitar al álbum",
"sharing_page_album": "Álbumes compartidos", "sharing_page_album": "Álbumes compartidos",
@@ -495,7 +489,7 @@
"trash_page_delete": "Eliminar", "trash_page_delete": "Eliminar",
"trash_page_delete_all": "Eliminar todos", "trash_page_delete_all": "Eliminar todos",
"trash_page_empty_trash_btn": "Vaciar papelera", "trash_page_empty_trash_btn": "Vaciar papelera",
"trash_page_empty_trash_dialog_content": "¿Está seguro que quiere eliminar los elementos? Estos elementos serán eliminados de Immich permanentemente", "trash_page_empty_trash_dialog_content": "Estás seguro que quieres eliminar los elementos? Estos elementos serán eliminados de Immich permanentemente",
"trash_page_empty_trash_dialog_ok": "Sí", "trash_page_empty_trash_dialog_ok": "Sí",
"trash_page_info": "Los archivos en la papelera serán eliminados automáticamente después de {} días", "trash_page_info": "Los archivos en la papelera serán eliminados automáticamente después de {} días",
"trash_page_no_assets": "No hay elementos en la papelera", "trash_page_no_assets": "No hay elementos en la papelera",
+1 -7
View File
@@ -201,8 +201,6 @@
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos", "favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos",
"favorites_page_title": "Favoritos", "favorites_page_title": "Favoritos",
"haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback",
"home_page_add_to_album_conflicts": "{added} elementos agregados al álbum {album}.\n{failed} elementos ya existen en el álbum.", "home_page_add_to_album_conflicts": "{added} elementos agregados al álbum {album}.\n{failed} elementos ya existen en el álbum.",
"home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo", "home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo",
"home_page_add_to_album_success": "{added} elementos agregados al álbum {album}. ", "home_page_add_to_album_success": "{added} elementos agregados al álbum {album}. ",
@@ -218,7 +216,7 @@
"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_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": "Descarga iniciada",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
"image_viewer_page_state_provider_share_error": "Error al compartir", "image_viewer_page_state_provider_share_error": "Error al compartir",
"library_page_albums": "Álbumes", "library_page_albums": "Álbumes",
@@ -299,7 +297,6 @@
"motion_photos_page_title": "Foto en Movimiento", "motion_photos_page_title": "Foto en Movimiento",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show",
"notification_permission_dialog_cancel": "Cancelar", "notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.", "notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.",
"notification_permission_dialog_settings": "Ajustes", "notification_permission_dialog_settings": "Ajustes",
@@ -410,7 +407,6 @@
"share_add": "Agregar", "share_add": "Agregar",
"share_add_photos": "Agregar fotos", "share_add_photos": "Agregar fotos",
"share_add_title": "Agregar un título", "share_add_title": "Agregar un título",
"share_assets_selected": "{} selected",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"shared_album_activities_input_disable": "Los comentarios están deshabilitados", "shared_album_activities_input_disable": "Los comentarios están deshabilitados",
"shared_album_activities_input_hint": "Say something", "shared_album_activities_input_hint": "Say something",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} hours", "shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Never", "shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_password": "Contraseña", "shared_link_edit_password": "Contraseña",
"shared_link_edit_password_hint": "Introduce la contraseña del enlace", "shared_link_edit_password_hint": "Introduce la contraseña del enlace",
"shared_link_edit_show_meta": "Mostrar metadatos", "shared_link_edit_show_meta": "Mostrar metadatos",
+1 -7
View File
@@ -201,8 +201,6 @@
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos", "favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos",
"favorites_page_title": "Favoritos", "favorites_page_title": "Favoritos",
"haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback",
"home_page_add_to_album_conflicts": "{added} elementos agregados al álbum {album}.\n{failed} elementos ya existen en el álbum.", "home_page_add_to_album_conflicts": "{added} elementos agregados al álbum {album}.\n{failed} elementos ya existen en el álbum.",
"home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo", "home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo",
"home_page_add_to_album_success": "{added} elementos agregados al álbum {album}. ", "home_page_add_to_album_success": "{added} elementos agregados al álbum {album}. ",
@@ -218,7 +216,7 @@
"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_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": "Descarga iniciada",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
"image_viewer_page_state_provider_share_error": "Error al compartir", "image_viewer_page_state_provider_share_error": "Error al compartir",
"library_page_albums": "Álbumes", "library_page_albums": "Álbumes",
@@ -299,7 +297,6 @@
"motion_photos_page_title": "Foto en Movimiento", "motion_photos_page_title": "Foto en Movimiento",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show",
"notification_permission_dialog_cancel": "Cancelar", "notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.", "notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.",
"notification_permission_dialog_settings": "Ajustes", "notification_permission_dialog_settings": "Ajustes",
@@ -410,7 +407,6 @@
"share_add": "Agregar", "share_add": "Agregar",
"share_add_photos": "Agregar fotos", "share_add_photos": "Agregar fotos",
"share_add_title": "Agregar un título", "share_add_title": "Agregar un título",
"share_assets_selected": "{} selected",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"shared_album_activities_input_disable": "Los comentarios están deshabilitados", "shared_album_activities_input_disable": "Los comentarios están deshabilitados",
"shared_album_activities_input_hint": "Comenta algo", "shared_album_activities_input_hint": "Comenta algo",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} hours", "shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Never", "shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_password": "Contraseña", "shared_link_edit_password": "Contraseña",
"shared_link_edit_password_hint": "Introduce la contraseña del enlace", "shared_link_edit_password_hint": "Introduce la contraseña del enlace",
"shared_link_edit_show_meta": "Mostrar metadatos", "shared_link_edit_show_meta": "Mostrar metadatos",
+1 -7
View File
@@ -201,8 +201,6 @@
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos", "favorites_page_no_favorites": "No se encontraron recursos marcados como favoritos",
"favorites_page_title": "Favoritos", "favorites_page_title": "Favoritos",
"haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback",
"home_page_add_to_album_conflicts": "{added} recursos agregados al álbum {album}.\n{failed} recursos ya existen en el álbum.", "home_page_add_to_album_conflicts": "{added} recursos agregados al álbum {album}.\n{failed} recursos ya existen en el álbum.",
"home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo", "home_page_add_to_album_err_local": "Aún no se pueden agregar recursos locales a álbumes, omitiendo",
"home_page_add_to_album_success": "{added} recursos agregados al álbum {album}.", "home_page_add_to_album_success": "{added} recursos agregados al álbum {album}.",
@@ -218,7 +216,7 @@
"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_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": "Descarga iniciada",
"image_viewer_page_state_provider_download_success": "Descarga exitosa", "image_viewer_page_state_provider_download_success": "Descarga exitosa",
"image_viewer_page_state_provider_share_error": "Error al compartir", "image_viewer_page_state_provider_share_error": "Error al compartir",
"library_page_albums": "Álbumes", "library_page_albums": "Álbumes",
@@ -299,7 +297,6 @@
"motion_photos_page_title": "Fotos en movimiento", "motion_photos_page_title": "Fotos en movimiento",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show",
"notification_permission_dialog_cancel": "Cancelar", "notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.", "notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.",
"notification_permission_dialog_settings": "Configuración", "notification_permission_dialog_settings": "Configuración",
@@ -410,7 +407,6 @@
"share_add": "Agregar", "share_add": "Agregar",
"share_add_photos": "Agregar fotos", "share_add_photos": "Agregar fotos",
"share_add_title": "Agregar un título", "share_add_title": "Agregar un título",
"share_assets_selected": "{} selected",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"shared_album_activities_input_disable": "Los comentarios están deshabilitados", "shared_album_activities_input_disable": "Los comentarios están deshabilitados",
"shared_album_activities_input_hint": "Di algo", "shared_album_activities_input_hint": "Di algo",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} hours", "shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Never", "shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_password": "Contraseña", "shared_link_edit_password": "Contraseña",
"shared_link_edit_password_hint": "Introduce la contraseña del enlace", "shared_link_edit_password_hint": "Introduce la contraseña del enlace",
"shared_link_edit_show_meta": "Mostrar metadatos", "shared_link_edit_show_meta": "Mostrar metadatos",
+32 -38
View File
@@ -1,8 +1,8 @@
{ {
"action_common_back": "Takaisin", "action_common_back": "Back",
"action_common_cancel": "Peruuta", "action_common_cancel": "Peruuta",
"action_common_clear": "Tyhjennä", "action_common_clear": "Clear",
"action_common_confirm": "Vahvista", "action_common_confirm": "Confirm",
"action_common_update": "Päivitä", "action_common_update": "Päivitä",
"add_to_album_bottom_sheet_added": "Lisätty albumiin {album}", "add_to_album_bottom_sheet_added": "Lisätty albumiin {album}",
"add_to_album_bottom_sheet_already_exists": "Kohde on jo albumissa {album}", "add_to_album_bottom_sheet_already_exists": "Kohde on jo albumissa {album}",
@@ -13,7 +13,7 @@
"advanced_settings_self_signed_ssl_title": "Salli self-signed SSL -sertifikaatit", "advanced_settings_self_signed_ssl_title": "Salli self-signed SSL -sertifikaatit",
"advanced_settings_tile_subtitle": "Edistyneen käyttäjän asetukset", "advanced_settings_tile_subtitle": "Edistyneen käyttäjän asetukset",
"advanced_settings_tile_title": "Edistyneet", "advanced_settings_tile_title": "Edistyneet",
"advanced_settings_troubleshooting_subtitle": "Ota vianetsinnän lisäominaisuudet käyttöön", "advanced_settings_troubleshooting_subtitle": "Kytke vianetsinnän lisäominaisuudet päälle",
"advanced_settings_troubleshooting_title": "Vianetsintä", "advanced_settings_troubleshooting_title": "Vianetsintä",
"album_info_card_backup_album_excluded": "JÄTETTY POIS", "album_info_card_backup_album_excluded": "JÄTETTY POIS",
"album_info_card_backup_album_included": "SISÄLLYTETTY", "album_info_card_backup_album_included": "SISÄLLYTETTY",
@@ -22,7 +22,7 @@
"album_thumbnail_card_shared": "Jaettu", "album_thumbnail_card_shared": "Jaettu",
"album_thumbnail_owned": "Omistettu", "album_thumbnail_owned": "Omistettu",
"album_thumbnail_shared_by": "Jakanut {}", "album_thumbnail_shared_by": "Jakanut {}",
"album_viewer_appbar_delete_confirm": "Haluatko varmast poistaa tämän albumin tililtäsi?", "album_viewer_appbar_delete_confirm": "Are you sure you want to delete this album from your account?",
"album_viewer_appbar_share_delete": "Poista albumi", "album_viewer_appbar_share_delete": "Poista albumi",
"album_viewer_appbar_share_err_delete": "Albumin poistaminen epäonnistui", "album_viewer_appbar_share_err_delete": "Albumin poistaminen epäonnistui",
"album_viewer_appbar_share_err_leave": "Albumista poistuminen epäonnistui", "album_viewer_appbar_share_err_leave": "Albumista poistuminen epäonnistui",
@@ -82,7 +82,7 @@
"backup_controller_page_background_turn_off": "Kytke taustapalvelu pois päältä", "backup_controller_page_background_turn_off": "Kytke taustapalvelu pois päältä",
"backup_controller_page_background_turn_on": "Kytke taustapalvelu päälle", "backup_controller_page_background_turn_on": "Kytke taustapalvelu päälle",
"backup_controller_page_background_wifi": "Vain WiFi-verkossa", "backup_controller_page_background_wifi": "Vain WiFi-verkossa",
"backup_controller_page_backup": "Varmuuskopiointi", "backup_controller_page_backup": "Varmuuskopioitu",
"backup_controller_page_backup_selected": "Valittu:", "backup_controller_page_backup_selected": "Valittu:",
"backup_controller_page_backup_sub": "Varmuuskopioidut kuvat ja videot", "backup_controller_page_backup_sub": "Varmuuskopioidut kuvat ja videot",
"backup_controller_page_cancel": "Peruuta", "backup_controller_page_cancel": "Peruuta",
@@ -115,7 +115,7 @@
"backup_manual_in_progress": "Lähetys palvelimelle on jo käynnissä. Kokeile uudelleen hetken kuluttua.", "backup_manual_in_progress": "Lähetys palvelimelle on jo käynnissä. Kokeile uudelleen hetken kuluttua.",
"backup_manual_success": "Onnistui", "backup_manual_success": "Onnistui",
"backup_manual_title": "Lähetyksen tila", "backup_manual_title": "Lähetyksen tila",
"backup_options_page_title": "Varmuuskopioinnin asetukset", "backup_options_page_title": "Backup options",
"cache_settings_album_thumbnails": "Kirjastosivun esikatselukuvat ({} kohdetta)", "cache_settings_album_thumbnails": "Kirjastosivun esikatselukuvat ({} kohdetta)",
"cache_settings_clear_cache_button": "Tyhjennä välimuisti", "cache_settings_clear_cache_button": "Tyhjennä välimuisti",
"cache_settings_clear_cache_button_title": "Tyhjennä sovelluksen välimuisti. Tämä vaikuttaa merkittävästi sovelluksen suorituskykyyn, kunnes välimuisti on rakennettu uudelleen.", "cache_settings_clear_cache_button_title": "Tyhjennä sovelluksen välimuisti. Tämä vaikuttaa merkittävästi sovelluksen suorituskykyyn, kunnes välimuisti on rakennettu uudelleen.",
@@ -194,15 +194,13 @@
"exif_bottom_sheet_location": "SIJAINTI", "exif_bottom_sheet_location": "SIJAINTI",
"exif_bottom_sheet_location_add": "Lisää sijainti", "exif_bottom_sheet_location_add": "Lisää sijainti",
"exif_bottom_sheet_people": "IHMISET", "exif_bottom_sheet_people": "IHMISET",
"exif_bottom_sheet_person_add_person": "Lisää nimi", "exif_bottom_sheet_person_add_person": "Add name",
"experimental_settings_new_asset_list_subtitle": "Työn alla", "experimental_settings_new_asset_list_subtitle": "Työn alla",
"experimental_settings_new_asset_list_title": "Ota käyttöön kokeellinen kuvaruudukko", "experimental_settings_new_asset_list_title": "Ota käyttöön kokeellinen kuvaruudukko",
"experimental_settings_subtitle": "Käyttö omalla vastuulla!", "experimental_settings_subtitle": "Käyttö omalla vastuulla!",
"experimental_settings_title": "Kokeellinen", "experimental_settings_title": "Kokeellinen",
"favorites_page_no_favorites": "Suosikkikohteita ei löytynyt", "favorites_page_no_favorites": "Suosikkikohteita ei löytynyt",
"favorites_page_title": "Suosikit", "favorites_page_title": "Suosikit",
"haptic_feedback_switch": "Ota haptinen palaute käyttöön",
"haptic_feedback_title": "Haptinen palaute",
"home_page_add_to_album_conflicts": "Lisätty {added} kohdetta albumiin {album}. {failed} kohdetta on jo albumissa.", "home_page_add_to_album_conflicts": "Lisätty {added} kohdetta albumiin {album}. {failed} kohdetta on jo albumissa.",
"home_page_add_to_album_err_local": "Paikallisten kohteiden lisääminen albumeihin ei ole mahdollista, ohitetaan", "home_page_add_to_album_err_local": "Paikallisten kohteiden lisääminen albumeihin ei ole mahdollista, ohitetaan",
"home_page_add_to_album_success": "Lisätty {added} kohdetta albumiin {album}.", "home_page_add_to_album_success": "Lisätty {added} kohdetta albumiin {album}.",
@@ -218,7 +216,7 @@
"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_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": "Download Started", "image_viewer_page_state_provider_download_started": "Lataus aloitettu",
"image_viewer_page_state_provider_download_success": "Lataus onnistui", "image_viewer_page_state_provider_download_success": "Lataus onnistui",
"image_viewer_page_state_provider_share_error": "Jakovirhe", "image_viewer_page_state_provider_share_error": "Jakovirhe",
"library_page_albums": "Albumit", "library_page_albums": "Albumit",
@@ -271,7 +269,7 @@
"map_location_dialog_cancel": "Peruuta", "map_location_dialog_cancel": "Peruuta",
"map_location_dialog_yes": "Kyllä", "map_location_dialog_yes": "Kyllä",
"map_location_picker_page_use_location": "Käytä tätä sijaintia", "map_location_picker_page_use_location": "Käytä tätä sijaintia",
"map_location_service_disabled_content": "Paikannuspalvelun pitää olla kytkettynä päälle, jotta nykyisen sijaintisi kohteita voidaan näyttää. Haluatko kytkeä sen päälle nyt?", "map_location_service_disabled_content": "Paikannuspalvelun pitää olla päälle kytkettynä, jotta nykyisen sijaintisi kohteita voidaan näyttää. Haluatko kytkeä sen päälle?",
"map_location_service_disabled_title": "Paikannuspalvelu pois päältä", "map_location_service_disabled_title": "Paikannuspalvelu pois päältä",
"map_no_assets_in_bounds": "Ei kuvia tällä alueella", "map_no_assets_in_bounds": "Ei kuvia tällä alueella",
"map_no_location_permission_content": "Paikannuslupa tarvitaan, jotta nykyisen sijainnin kohteita voidaan näyttää. Haluatko sallia pääsyn sijaintiin?", "map_no_location_permission_content": "Paikannuslupa tarvitaan, jotta nykyisen sijainnin kohteita voidaan näyttää. Haluatko sallia pääsyn sijaintiin?",
@@ -286,28 +284,27 @@
"map_settings_dialog_save": "Tallenna", "map_settings_dialog_save": "Tallenna",
"map_settings_dialog_title": "Kartta-asetukset", "map_settings_dialog_title": "Kartta-asetukset",
"map_settings_include_show_archived": "Sisällytä arkistoidut", "map_settings_include_show_archived": "Sisällytä arkistoidut",
"map_settings_include_show_partners": "Sisällytä kumppanit", "map_settings_include_show_partners": "Include Partners",
"map_settings_only_relative_range": "Päivämäärän rajaus", "map_settings_only_relative_range": "Päivämäärän rajaus",
"map_settings_only_show_favorites": "Näytä vain suosikit", "map_settings_only_show_favorites": "Näytä vain suosikit",
"map_settings_theme_settings": "Kartan teema", "map_settings_theme_settings": "Kartan teema",
"map_zoom_to_see_photos": "Tarkenna nähdäksesi kuvat", "map_zoom_to_see_photos": "Tarkenna nähdäksesi kuvat",
"memories_all_caught_up": "Kaikki ajan tasalla", "memories_all_caught_up": "All caught up",
"memories_check_back_tomorrow": "Palaa huomenna nähdäskesi lisää muistoja", "memories_check_back_tomorrow": "Check back tomorrow for more memories",
"memories_start_over": "Aloita alusta", "memories_start_over": "Start Over",
"memories_swipe_to_close": "Pyyhkäise ylös sulkeaksesi", "memories_swipe_to_close": "Swipe up to close",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Liikekuvat", "motion_photos_page_title": "Liikekuvat",
"multiselect_grid_edit_date_time_err_read_only": "Vain luku -tilassa olevien kohteiden päivämäärää ei voitu muokata, ohitetaan", "multiselect_grid_edit_date_time_err_read_only": "Vain luku -tilassa olevien kohteiden päivämäärää ei voitu muokata, ohitetaan",
"multiselect_grid_edit_gps_err_read_only": "Vain luku-tilassa olevien kohteiden sijantitietoja ei voitu muokata, ohitetaan", "multiselect_grid_edit_gps_err_read_only": "Vain luku-tilassa olevien kohteiden sijantitietoja ei voitu muokata, ohitetaan",
"no_assets_to_show": "Ei näytettäviä kohteita",
"notification_permission_dialog_cancel": "Peruuta", "notification_permission_dialog_cancel": "Peruuta",
"notification_permission_dialog_content": "Ottaaksesi ilmoitukset käyttöön, siirry asetuksiin ja valitse 'salli'.", "notification_permission_dialog_content": "Ottaaksesi ilmoitukset käyttöön, siirry asetuksiin ja valitse 'salli'.",
"notification_permission_dialog_settings": "Asetukset", "notification_permission_dialog_settings": "Asetukset",
"notification_permission_list_tile_content": "Myönnä käyttöoikeus ottaaksesi ilmoitukset käyttöön.", "notification_permission_list_tile_content": "Myönnä käyttöoikeus ottaaksesi ilmoitukset käyttöön.",
"notification_permission_list_tile_enable_button": "Ota ilmoitukset käyttöön", "notification_permission_list_tile_enable_button": "Ota ilmoitukset käyttöön",
"notification_permission_list_tile_title": "Ilmoitusten käyttöoikeus", "notification_permission_list_tile_title": "Ilmoitusten käyttöoikeus",
"partner_list_user_photos": "Käyttäjän {user} kuvat", "partner_list_user_photos": "{user}'s photos",
"partner_list_view_all": "Näytä kaikki", "partner_list_view_all": "View all",
"partner_page_add_partner": "Lisää kumppani", "partner_page_add_partner": "Lisää kumppani",
"partner_page_empty_message": "Kuviasi ei ole vielä jaettu kenenkään kumppanin kanssa.", "partner_page_empty_message": "Kuviasi ei ole vielä jaettu kenenkään kumppanin kanssa.",
"partner_page_no_more_users": "Ei enempää käyttäjiä lisättäväksi", "partner_page_no_more_users": "Ei enempää käyttäjiä lisättäväksi",
@@ -342,17 +339,17 @@
"recently_added_page_title": "Viimeksi lisätyt", "recently_added_page_title": "Viimeksi lisätyt",
"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": "Apply filter",
"search_filter_camera_make": "Valmistaja", "search_filter_camera_make": "Make",
"search_filter_camera_model": "Malli", "search_filter_camera_model": "Model",
"search_filter_display_option_archive": "Arkisto", "search_filter_display_option_archive": "Archive",
"search_filter_display_option_favorite": "Suosikki", "search_filter_display_option_favorite": "Favorite",
"search_filter_display_option_not_in_album": "Ei kuulu albumiin", "search_filter_display_option_not_in_album": "Not in album",
"search_filter_location_city": "Kaupunki", "search_filter_location_city": "City",
"search_filter_location_country": "Maa", "search_filter_location_country": "Country",
"search_filter_location_state": "Maakunta/osavaltio", "search_filter_location_state": "State",
"search_filter_media_type_all": "Kaikki", "search_filter_media_type_all": "All",
"search_filter_media_type_image": "Kuva", "search_filter_media_type_image": "Image",
"search_filter_media_type_video": "Video", "search_filter_media_type_video": "Video",
"search_page_categories": "Kategoriat", "search_page_categories": "Kategoriat",
"search_page_favorites": "Suosikit", "search_page_favorites": "Suosikit",
@@ -391,8 +388,8 @@
"setting_image_viewer_original_title": "Lataa alkuperäinen kuva", "setting_image_viewer_original_title": "Lataa alkuperäinen kuva",
"setting_image_viewer_preview_subtitle": "Ota käyttöön ladataksesi keskitarkkuuksinen kuva. Poista käytöstä ladataksesi alkuperäinen kuva tai käyttääksesi vain esikatselukuvaa.", "setting_image_viewer_preview_subtitle": "Ota käyttöön ladataksesi keskitarkkuuksinen kuva. Poista käytöstä ladataksesi alkuperäinen kuva tai käyttääksesi vain esikatselukuvaa.",
"setting_image_viewer_preview_title": "Lataa esikatselukuva", "setting_image_viewer_preview_title": "Lataa esikatselukuva",
"setting_languages_apply": "Käytä", "setting_languages_apply": "Apply",
"setting_languages_title": "Kieli", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "Ilmoita taustavarmuuskopioinnin epäonnistumisista: {}", "setting_notifications_notify_failures_grace_period": "Ilmoita taustavarmuuskopioinnin epäonnistumisista: {}",
"setting_notifications_notify_hours": "{} tunnin välein", "setting_notifications_notify_hours": "{} tunnin välein",
"setting_notifications_notify_immediately": "heti", "setting_notifications_notify_immediately": "heti",
@@ -410,7 +407,6 @@
"share_add": "Lisää", "share_add": "Lisää",
"share_add_photos": "Lisää kuvia", "share_add_photos": "Lisää kuvia",
"share_add_title": "Lisää nimi", "share_add_title": "Lisää nimi",
"share_assets_selected": "{} selected",
"share_create_album": "Luo albumi", "share_create_album": "Luo albumi",
"shared_album_activities_input_disable": "Kommentointi on kytketty pois päältä", "shared_album_activities_input_disable": "Kommentointi on kytketty pois päältä",
"shared_album_activities_input_hint": "Sano jotain", "shared_album_activities_input_hint": "Sano jotain",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} tuntia", "shared_link_edit_expire_after_option_hours": "{} tuntia",
"shared_link_edit_expire_after_option_minute": "1 minuutti", "shared_link_edit_expire_after_option_minute": "1 minuutti",
"shared_link_edit_expire_after_option_minutes": "{} minuuttia", "shared_link_edit_expire_after_option_minutes": "{} minuuttia",
"shared_link_edit_expire_after_option_months": "{} kuukautta",
"shared_link_edit_expire_after_option_never": "Ei koskaan", "shared_link_edit_expire_after_option_never": "Ei koskaan",
"shared_link_edit_expire_after_option_year": "{} vuosi",
"shared_link_edit_password": "Salasana", "shared_link_edit_password": "Salasana",
"shared_link_edit_password_hint": "Syötä jaon salasana", "shared_link_edit_password_hint": "Syötä jaon salasana",
"shared_link_edit_show_meta": "Näytä metadata", "shared_link_edit_show_meta": "Näytä metadata",
@@ -468,7 +462,7 @@
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Lähetä", "shared_link_info_chip_upload": "Lähetä",
"shared_link_manage_links": "Hallitse jaettuja linkkejä", "shared_link_manage_links": "Hallitse jaettuja linkkejä",
"shared_link_public_album": "Julkinen albumi", "shared_link_public_album": "Public album",
"share_done": "Valmis", "share_done": "Valmis",
"share_invite": "Kutsu albumiin", "share_invite": "Kutsu albumiin",
"sharing_page_album": "Jaetut albumit", "sharing_page_album": "Jaetut albumit",
@@ -481,7 +475,7 @@
"tab_controller_nav_photos": "Kuvat", "tab_controller_nav_photos": "Kuvat",
"tab_controller_nav_search": "Haku", "tab_controller_nav_search": "Haku",
"tab_controller_nav_sharing": "Jakaminen", "tab_controller_nav_sharing": "Jakaminen",
"theme_setting_asset_list_storage_indicator_title": "Näytä tallennustilan ilmaisin kohteiden kuvakkeissa", "theme_setting_asset_list_storage_indicator_title": "Näytä tallennustilainidikaattori kohteiden kuvakkeissa",
"theme_setting_asset_list_tiles_per_row_title": "Kohteiden määrä rivillä ({})", "theme_setting_asset_list_tiles_per_row_title": "Kohteiden määrä rivillä ({})",
"theme_setting_dark_mode_switch": "Tumma teema", "theme_setting_dark_mode_switch": "Tumma teema",
"theme_setting_image_viewer_quality_subtitle": "Säädä kuvien katselun laatua", "theme_setting_image_viewer_quality_subtitle": "Säädä kuvien katselun laatua",
+1 -7
View File
@@ -201,8 +201,6 @@
"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",
"haptic_feedback_switch": "Enable haptic feedback",
"haptic_feedback_title": "Haptic Feedback",
"home_page_add_to_album_conflicts": "{added} éléments ajoutés à l'album {album}. Les éléments {failed} sont déjà dans l'album.", "home_page_add_to_album_conflicts": "{added} éléments ajoutés à l'album {album}. Les éléments {failed} sont déjà dans l'album.",
"home_page_add_to_album_err_local": "Impossible d'ajouter des éléments locaux aux albums pour le moment, étape ignorée", "home_page_add_to_album_err_local": "Impossible d'ajouter des éléments locaux aux albums pour le moment, étape ignorée",
"home_page_add_to_album_success": "{added} éléments ajoutés à l'album {album}.", "home_page_add_to_album_success": "{added} éléments ajoutés à l'album {album}.",
@@ -218,7 +216,7 @@
"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_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": "Téléchargement commencé",
"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",
"library_page_albums": "Albums", "library_page_albums": "Albums",
@@ -299,7 +297,6 @@
"motion_photos_page_title": "Photos avec mouvement", "motion_photos_page_title": "Photos avec mouvement",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping", "multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"no_assets_to_show": "No assets to show",
"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",
@@ -410,7 +407,6 @@
"share_add": "Ajouter", "share_add": "Ajouter",
"share_add_photos": "Ajouter des photos", "share_add_photos": "Ajouter des photos",
"share_add_title": "Ajouter un titre", "share_add_title": "Ajouter un titre",
"share_assets_selected": "{} selected",
"share_create_album": "Créer un album", "share_create_album": "Créer un album",
"shared_album_activities_input_disable": "Les commentaires sont désactivés", "shared_album_activities_input_disable": "Les commentaires sont désactivés",
"shared_album_activities_input_hint": "Dire quelque chose", "shared_album_activities_input_hint": "Dire quelque chose",
@@ -444,9 +440,7 @@
"shared_link_edit_expire_after_option_hours": "{} hours", "shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Never", "shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_password": "Mot de passe", "shared_link_edit_password": "Mot de passe",
"shared_link_edit_password_hint": "Saisir le mot de passe de partage", "shared_link_edit_password_hint": "Saisir le mot de passe de partage",
"shared_link_edit_show_meta": "Afficher les métadonnées", "shared_link_edit_show_meta": "Afficher les métadonnées",
+4 -7
View File
@@ -201,8 +201,6 @@
"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",
"haptic_feedback_switch": "Activer le retour haptique",
"haptic_feedback_title": "Retour haptique",
"home_page_add_to_album_conflicts": "{added} éléments ajoutés à l'album {album}. Les éléments {failed} sont déjà dans l'album.", "home_page_add_to_album_conflicts": "{added} éléments ajoutés à l'album {album}. Les éléments {failed} sont déjà dans l'album.",
"home_page_add_to_album_err_local": "Impossible d'ajouter des éléments locaux aux albums pour le moment, étape ignorée", "home_page_add_to_album_err_local": "Impossible d'ajouter des éléments locaux aux albums pour le moment, étape ignorée",
"home_page_add_to_album_success": "{added} éléments ajoutés à l'album {album}.", "home_page_add_to_album_success": "{added} éléments ajoutés à l'album {album}.",
@@ -218,7 +216,7 @@
"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_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": "Téléchargement commencé",
"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",
"library_page_albums": "Albums", "library_page_albums": "Albums",
@@ -410,7 +408,6 @@
"share_add": "Ajouter", "share_add": "Ajouter",
"share_add_photos": "Ajouter des photos", "share_add_photos": "Ajouter des photos",
"share_add_title": "Ajouter un titre", "share_add_title": "Ajouter un titre",
"share_assets_selected": "{} selected",
"share_create_album": "Créer un album", "share_create_album": "Créer un album",
"shared_album_activities_input_disable": "Les commentaires sont désactivés", "shared_album_activities_input_disable": "Les commentaires sont désactivés",
"shared_album_activities_input_hint": "Dire quelque chose", "shared_album_activities_input_hint": "Dire quelque chose",
@@ -444,9 +441,7 @@
"shared_link_edit_expire_after_option_hours": "{} heures", "shared_link_edit_expire_after_option_hours": "{} heures",
"shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_never": "Jamais", "shared_link_edit_expire_after_option_never": "Jamais",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_password": "Mot de passe", "shared_link_edit_password": "Mot de passe",
"shared_link_edit_password_hint": "Saisir le mot de passe de partage", "shared_link_edit_password_hint": "Saisir le mot de passe de partage",
"shared_link_edit_show_meta": "Afficher les métadonnées", "shared_link_edit_show_meta": "Afficher les métadonnées",
@@ -516,5 +511,7 @@
"version_announcement_overlay_title": "Nouvelle version serveur disponible \uD83C\uDF89", "version_announcement_overlay_title": "Nouvelle version serveur disponible \uD83C\uDF89",
"viewer_remove_from_stack": "Retirer de la pile", "viewer_remove_from_stack": "Retirer de la pile",
"viewer_stack_use_as_main_asset": "Utiliser comme élément principal", "viewer_stack_use_as_main_asset": "Utiliser comme élément principal",
"viewer_unstack": "Désempiler" "viewer_unstack": "Désempiler",
"haptic_feedback_title": "Retour haptique",
"haptic_feedback_switch": "Activer le retour haptique"
} }
+14 -20
View File
@@ -7,7 +7,7 @@
"add_to_album_bottom_sheet_added": "נוסף ל {album}", "add_to_album_bottom_sheet_added": "נוסף ל {album}",
"add_to_album_bottom_sheet_already_exists": "כבר ב {album}", "add_to_album_bottom_sheet_already_exists": "כבר ב {album}",
"advanced_settings_log_level_title": "רמת תיעוד אירועים: {}", "advanced_settings_log_level_title": "רמת תיעוד אירועים: {}",
"advanced_settings_prefer_remote_subtitle": "חלק מהמכשירים הם אייטים מאד לטעון תמונות ממוזערות מנכסים שבמכשיר. הפעל הגדרה זו כדי לטעון תמונות מרוחקות במקום.", "advanced_settings_prefer_remote_subtitle": "חלק מהמכשירים הם איטיים עד כאב לטעון תמונות ממוזערות מנכסים שעל המכשיר. הפעל הגדרה זו כדי לטעון תמונות מרוחקות במקום",
"advanced_settings_prefer_remote_title": "העדף תמונות מרוחקות", "advanced_settings_prefer_remote_title": "העדף תמונות מרוחקות",
"advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור נקודת הקצה של השרת. דרוש עבור תעודות בחתימה עצמית.", "advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור נקודת הקצה של השרת. דרוש עבור תעודות בחתימה עצמית.",
"advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית", "advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית",
@@ -20,7 +20,7 @@
"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": " · משותף",
"album_thumbnail_owned": "בבעלותך", "album_thumbnail_owned": "בבעלות",
"album_thumbnail_shared_by": "משותף על ידי {}", "album_thumbnail_shared_by": "משותף על ידי {}",
"album_viewer_appbar_delete_confirm": "האם אתה בטוח שברצונך למחוק את האלבום מהחשבון שלך?", "album_viewer_appbar_delete_confirm": "האם אתה בטוח שברצונך למחוק את האלבום מהחשבון שלך?",
"album_viewer_appbar_share_delete": "מחק אלבום", "album_viewer_appbar_share_delete": "מחק אלבום",
@@ -38,7 +38,7 @@
"app_bar_signout_dialog_ok": "כן", "app_bar_signout_dialog_ok": "כן",
"app_bar_signout_dialog_title": "התנתק", "app_bar_signout_dialog_title": "התנתק",
"archive_page_no_archived_assets": "לא נמצאו נכסים בארכיון", "archive_page_no_archived_assets": "לא נמצאו נכסים בארכיון",
"archive_page_title": "בארכיון ({})", "archive_page_title": "העבר לארכיון ({})",
"asset_action_delete_err_read_only": "לא ניתן למחוק נכס(ים) לקריאה בלבד, מדלג", "asset_action_delete_err_read_only": "לא ניתן למחוק נכס(ים) לקריאה בלבד, מדלג",
"asset_action_share_err_offline": "לא ניתן להשיג נכס(ים) לא מקוונ(ים), מדלג ", "asset_action_share_err_offline": "לא ניתן להשיג נכס(ים) לא מקוונ(ים), מדלג ",
"asset_list_group_by_sub_title": "קבץ לפי", "asset_list_group_by_sub_title": "קבץ לפי",
@@ -50,7 +50,7 @@
"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_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": "נכסים יכולים להתפזר על פני אלבומים מרובים. לפיכך, ניתן לכלול או להחריג אלבומים במהלך תהליך הגיבוי.",
@@ -81,7 +81,7 @@
"backup_controller_page_background_is_on": "גיבוי אוטומטי ברקע מופעל", "backup_controller_page_background_is_on": "גיבוי אוטומטי ברקע מופעל",
"backup_controller_page_background_turn_off": "כבה שירות ברקע", "backup_controller_page_background_turn_off": "כבה שירות ברקע",
"backup_controller_page_background_turn_on": "הפעל שירות ברקע", "backup_controller_page_background_turn_on": "הפעל שירות ברקע",
"backup_controller_page_background_wifi": "רק ברשת אלחוטית", "backup_controller_page_background_wifi": "רק ב Wi-Fi",
"backup_controller_page_backup": "גיבוי", "backup_controller_page_backup": "גיבוי",
"backup_controller_page_backup_selected": "נבחרו:", "backup_controller_page_backup_selected": "נבחרו:",
"backup_controller_page_backup_sub": "תמונות וסרטונים מגובים", "backup_controller_page_backup_sub": "תמונות וסרטונים מגובים",
@@ -201,8 +201,6 @@
"experimental_settings_title": "נסיוני", "experimental_settings_title": "נסיוני",
"favorites_page_no_favorites": "לא נמצאו נכסים מועדפים", "favorites_page_no_favorites": "לא נמצאו נכסים מועדפים",
"favorites_page_title": "מועדפים", "favorites_page_title": "מועדפים",
"haptic_feedback_switch": "הפעל משוב ברטט",
"haptic_feedback_title": "משוב ברטט",
"home_page_add_to_album_conflicts": "{added} נכסים נוספו לאלבום {album}. {failed} נכסים כבר נמצאים באלבום.", "home_page_add_to_album_conflicts": "{added} נכסים נוספו לאלבום {album}. {failed} נכסים כבר נמצאים באלבום.",
"home_page_add_to_album_err_local": "לא ניתן להוסיף נכסים מקומיים לאלבום עדיין, מדלג", "home_page_add_to_album_err_local": "לא ניתן להוסיף נכסים מקומיים לאלבום עדיין, מדלג",
"home_page_add_to_album_success": "{added} נכסים נוספו לאלבום {album}.", "home_page_add_to_album_success": "{added} נכסים נוספו לאלבום {album}.",
@@ -222,7 +220,7 @@
"image_viewer_page_state_provider_download_success": "הצלחת הורדה", "image_viewer_page_state_provider_download_success": "הצלחת הורדה",
"image_viewer_page_state_provider_share_error": "שיתוף שגיאה", "image_viewer_page_state_provider_share_error": "שיתוף שגיאה",
"library_page_albums": "אלבומים", "library_page_albums": "אלבומים",
"library_page_archive": "בארכיון", "library_page_archive": "העבר לארכיון",
"library_page_device_albums": "אלבומים במכשיר", "library_page_device_albums": "אלבומים במכשיר",
"library_page_favorites": "מועדפים", "library_page_favorites": "מועדפים",
"library_page_new_album": "אלבום חדש", "library_page_new_album": "אלבום חדש",
@@ -246,22 +244,22 @@
"login_form_button_text": "התחברות", "login_form_button_text": "התחברות",
"login_form_email_hint": "yourmail@email.com", "login_form_email_hint": "yourmail@email.com",
"login_form_endpoint_hint": "http://your-server-ip:port/API", "login_form_endpoint_hint": "http://your-server-ip:port/API",
"login_form_endpoint_url": "כתובת נקודת קצה השרת", "login_form_endpoint_url": "כתובת URL של נקודת קצה השרת",
"login_form_err_http": "נא לציין //:htttp או //:https", "login_form_err_http": "נא לציין //:htttp או //:https",
"login_form_err_invalid_email": "דוא\"ל שגוי", "login_form_err_invalid_email": "דוא\"ל שגוי",
"login_form_err_invalid_url": "כתובת לא חוקית", "login_form_err_invalid_url": "כתובת URL לא חוקית",
"login_form_err_leading_whitespace": "רווח לבן מוביל", "login_form_err_leading_whitespace": "רווח לבן מוביל",
"login_form_err_trailing_whitespace": "רווח לבן נגרר", "login_form_err_trailing_whitespace": "רווח לבן נגרר",
"login_form_failed_get_oauth_server_config": "שגיאה בהתחברות באמצעות OAuth, בדוק את כתובת URL של השרת", "login_form_failed_get_oauth_server_config": "שגיאה בהתחברות באמצעות OAuth, בדוק את כתובת URL של השרת",
"login_form_failed_get_oauth_server_disable": "תכונת OAuth לא זמינה בשרת זה", "login_form_failed_get_oauth_server_disable": "תכונת OAuth לא זמינה בשרת זה",
"login_form_failed_login": "שגיאה בהכנסתך למערכת, בדוק את כתובת השרת, דוא\"ל וסיסמה", "login_form_failed_login": "שגיאה בהכנסתך למערכת, בדוק את כתובת הURL של השרת, דוא\"ל וסיסמה",
"login_form_handshake_exception": "ארעה חריגת לחיצת יד עם השרת. אפשר תמיכה בתעודה בחתימה עצמית בהגדרות אם את/ה משתמש/ת בתעודה בחתימה עצמית.", "login_form_handshake_exception": "ארעה חריגת לחיצת יד עם השרת. אפשר תמיכה בתעודה בחתימה עצמית בהגדרות אם את/ה משתמש/ת בתעודה בחתימה עצמית.",
"login_form_label_email": "דוא\"ל", "login_form_label_email": "דוא\"ל",
"login_form_label_password": "סיסמה", "login_form_label_password": "סיסמה",
"login_form_next_button": "הבא", "login_form_next_button": "הבא",
"login_form_password_hint": "סיסמה", "login_form_password_hint": "סיסמה",
"login_form_save_login": "הישאר/י מחובר/ת", "login_form_save_login": "הישאר/י מחובר/ת",
"login_form_server_empty": "הכנס כתובת שרת.", "login_form_server_empty": "הכנס כתובת URL של שרת.",
"login_form_server_error": "לא היה ניתן להתחבר לשרת.", "login_form_server_error": "לא היה ניתן להתחבר לשרת.",
"login_password_changed_error": "הייתה שגיאה בעדכון הסיסמה שלך", "login_password_changed_error": "הייתה שגיאה בעדכון הסיסמה שלך",
"login_password_changed_success": "סיסמה עודכנה בהצלחה", "login_password_changed_success": "סיסמה עודכנה בהצלחה",
@@ -299,7 +297,6 @@
"motion_photos_page_title": "תמונות עם תנועה", "motion_photos_page_title": "תמונות עם תנועה",
"multiselect_grid_edit_date_time_err_read_only": "לא ניתן לערוך תאריך של נכס(ים) לקריאה בלבד, מדלג", "multiselect_grid_edit_date_time_err_read_only": "לא ניתן לערוך תאריך של נכס(ים) לקריאה בלבד, מדלג",
"multiselect_grid_edit_gps_err_read_only": "לא ניתן לערוך מיקום של נכס(ים) לקריאה בלבד, מדלג", "multiselect_grid_edit_gps_err_read_only": "לא ניתן לערוך מיקום של נכס(ים) לקריאה בלבד, מדלג",
"no_assets_to_show": "אין תמונות להצגה",
"notification_permission_dialog_cancel": "ביטול", "notification_permission_dialog_cancel": "ביטול",
"notification_permission_dialog_content": "כדי לאפשר התראות, לך להגדרות ובחר התר", "notification_permission_dialog_content": "כדי לאפשר התראות, לך להגדרות ובחר התר",
"notification_permission_dialog_settings": "הגדרות", "notification_permission_dialog_settings": "הגדרות",
@@ -331,7 +328,7 @@
"profile_drawer_app_logs": "יומנים", "profile_drawer_app_logs": "יומנים",
"profile_drawer_client_out_of_date_major": "האפליקציה לנייד אינה עדכנית. נא לעדכן לגרסה האחרונה.", "profile_drawer_client_out_of_date_major": "האפליקציה לנייד אינה עדכנית. נא לעדכן לגרסה האחרונה.",
"profile_drawer_client_out_of_date_minor": "האפליקציה לנייד אינה עדכנית. נא לעדכן לגרסה האחרונה.", "profile_drawer_client_out_of_date_minor": "האפליקציה לנייד אינה עדכנית. נא לעדכן לגרסה האחרונה.",
"profile_drawer_client_server_up_to_date": "גרסת הלקוח והשרת מעודכנים", "profile_drawer_client_server_up_to_date": "לקוח ושרת הם עדכניים",
"profile_drawer_documentation": "תיעוד", "profile_drawer_documentation": "תיעוד",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "השרת אינו עדכני. נא לעדכן לגרסה האחרונה.", "profile_drawer_server_out_of_date_major": "השרת אינו עדכני. נא לעדכן לגרסה האחרונה.",
@@ -391,8 +388,8 @@
"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": "טען תמונת תצוגה מקדימה",
"setting_languages_apply": "החל", "setting_languages_apply": "Apply",
"setting_languages_title": "שפות", "setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "להודיע על כשלים בגיבוי ברקע: {}", "setting_notifications_notify_failures_grace_period": "להודיע על כשלים בגיבוי ברקע: {}",
"setting_notifications_notify_hours": "{} שעות", "setting_notifications_notify_hours": "{} שעות",
"setting_notifications_notify_immediately": "באופן מיידי", "setting_notifications_notify_immediately": "באופן מיידי",
@@ -410,7 +407,6 @@
"share_add": "הוסף", "share_add": "הוסף",
"share_add_photos": "הוסף תמונות", "share_add_photos": "הוסף תמונות",
"share_add_title": "הוסף כותרת", "share_add_title": "הוסף כותרת",
"share_assets_selected": "{} selected",
"share_create_album": "צור אלבום", "share_create_album": "צור אלבום",
"shared_album_activities_input_disable": "התגובה מושבתת", "shared_album_activities_input_disable": "התגובה מושבתת",
"shared_album_activities_input_hint": "הגב/י משהו", "shared_album_activities_input_hint": "הגב/י משהו",
@@ -444,15 +440,13 @@
"shared_link_edit_expire_after_option_hours": "{} שעות", "shared_link_edit_expire_after_option_hours": "{} שעות",
"shared_link_edit_expire_after_option_minute": "1 דקה", "shared_link_edit_expire_after_option_minute": "1 דקה",
"shared_link_edit_expire_after_option_minutes": "{} דקות", "shared_link_edit_expire_after_option_minutes": "{} דקות",
"shared_link_edit_expire_after_option_months": "{} חודשים",
"shared_link_edit_expire_after_option_never": "אף פעם", "shared_link_edit_expire_after_option_never": "אף פעם",
"shared_link_edit_expire_after_option_year": "{} שנה",
"shared_link_edit_password": "סיסמה", "shared_link_edit_password": "סיסמה",
"shared_link_edit_password_hint": "הכנס את סיסמת השיתוף", "shared_link_edit_password_hint": "הכנס את סיסמת השיתוף",
"shared_link_edit_show_meta": "הצג מטא-נתונים", "shared_link_edit_show_meta": "הצג מטא-נתונים",
"shared_link_edit_submit_button": "עדכן קישור", "shared_link_edit_submit_button": "עדכן קישור",
"shared_link_empty": "אין לך קישורים משותפים", "shared_link_empty": "אין לך קישורים משותפים",
"shared_link_error_server_url_fetch": "לא ניתן להשיג את כתובת האינטרנט של השרת", "shared_link_error_server_url_fetch": "לא ניתן להשיג את כתובת הURL של השרת",
"shared_link_expired": "פג תוקף", "shared_link_expired": "פג תוקף",
"shared_link_expires_day": "יפוג בעוד {} יום", "shared_link_expires_day": "יפוג בעוד {} יום",
"shared_link_expires_days": "יפוג בעוד {} ימים", "shared_link_expires_days": "יפוג בעוד {} ימים",

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